summaryrefslogtreecommitdiff
path: root/pkdnull.py
diff options
context:
space:
mode:
Diffstat (limited to 'pkdnull.py')
-rw-r--r--pkdnull.py62
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()