diff options
Diffstat (limited to 'pkdnull.py')
| -rw-r--r-- | pkdnull.py | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/pkdnull.py b/pkdnull.py new file mode 100644 index 0000000..b5df4f1 --- /dev/null +++ b/pkdnull.py @@ -0,0 +1,62 @@ +import os, socket, sys, signal + +if len(sys.argv) < 4: + print('Bad arguments; exit.') + sys.exit(1) +elif len(sys.argv) > 4: + print('Extra args:', sys.argv[4:]) + +SOCKET_FILE = sys.argv[1] +PID_FILE = sys.argv[2] +LOG_FILE = sys.argv[3] + +if os.path.exists(PID_FILE): + print('Already running; exit.') + sys.exit(1) + +if os.fork() != 0: + sys.exit(0) + +def cleanup(): + global cs, sock + try: + cs.close() + except: + pass + sock.close() + os.remove(PID_FILE) + os.remove(SOCKET_FILE) + os.close(sys.stdout.fileno()) + os.close(sys.stderr.fileno()) + + +def stopsig(*args): + cleanup() + sys.exit(0) + +signal.signal(signal.SIGTERM, stopsig) +logfd = os.open(LOG_FILE, os.O_WRONLY | os.O_APPEND | os.O_CREAT, mode=0o644) +os.close(sys.stdin.fileno()) +os.dup2(logfd, sys.stdout.fileno()) +os.dup2(logfd, sys.stderr.fileno()) +os.close(logfd) + +pidf = open(PID_FILE, 'w') +pidf.write('%d' % os.getpid()) +pidf.close() + +sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) +sock.bind(SOCKET_FILE) +sock.listen(5) + +try: + cs, ca = sock.accept() + while True: + cs.send(b'$ ') + data = cs.recv(1024) + if data == b'\xde\xad': + break + print('got some data: %s' % str(data, 'utf-8')) + cs.send(data+b'\n') +finally: + cleanup() |
