]> arthur.barton.de Git - bup.git/commitdiff
Add `bup daemon` command for simple socket server
authorBrandon Low <lostlogic@lostlogicx.com>
Thu, 27 Jan 2011 02:30:21 +0000 (18:30 -0800)
committerAvery Pennarun <apenwarr@gmail.com>
Tue, 1 Feb 2011 05:35:19 +0000 (21:35 -0800)
Nothing special here, just listens on a host:port combination and spawns
`bup mux server` instances.

Signed-off-by: Brandon Low <lostlogic@lostlogicx.com>
Documentation/bup-daemon.md [new file with mode: 0644]
cmd/daemon-cmd.py [new file with mode: 0755]

diff --git a/Documentation/bup-daemon.md b/Documentation/bup-daemon.md
new file mode 100644 (file)
index 0000000..87ab495
--- /dev/null
@@ -0,0 +1,20 @@
+% bup-daemon(1) Bup %BUP_VERSION%
+% Brandon Low <lostlogic@lostlogicx.com>
+% %BUP_DATE%
+
+# NAME
+
+bup-daemon - listens for connections and runs `bup server`
+
+# SYNOPSIS
+
+bup daemon
+
+# DESCRIPTION
+
+`bup daemon` is a simple bup server which listens on a
+socket and forks connections to `bup mux server` children.
+
+# BUP
+
+Part of the `bup`(1) suite.
diff --git a/cmd/daemon-cmd.py b/cmd/daemon-cmd.py
new file mode 100755 (executable)
index 0000000..3507549
--- /dev/null
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+import sys, getopt, socket, subprocess
+from bup import options, path
+from bup.helpers import *
+
+optspec = """
+bup daemon [-l address] [-p port]
+--
+l,listen  ip address to listen on, defaults to *
+p,port    port to listen on, defaults to 1982
+"""
+o = options.Options(optspec, optfunc=getopt.getopt)
+(opt, flags, extra) = o.parse(sys.argv[1:])
+if extra:
+    o.fatal('no arguments expected')
+
+host = opt.listen
+port = opt.port and int(opt.port) or 1982
+
+import socket
+import sys
+
+socks = []
+for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC,
+                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
+    af, socktype, proto, canonname, sa = res
+    try:
+        s = socket.socket(af, socktype, proto)
+    except socket.error, msg:
+        continue
+    try:
+        if af == socket.AF_INET6:
+            debug1("bup daemon: listening on [%s]:%s\n" % sa[:2])
+        else:
+            debug1("bup daemon: listening on %s:%s\n" % sa[:2])
+        s.bind(sa)
+        s.listen(1)
+    except socket.error, msg:
+        s.close()
+        continue
+    socks.append(s)
+
+if not socks:
+    log('bup daemon: could not open socket\n')
+    sys.exit(1)
+
+try:
+    while True:
+        [rl,wl,xl] = select.select(socks, [], [], 60)
+        for l in rl:
+            s, src = l.accept()
+            log("Socket accepted connection from %s\n" % (src,))
+            sp = subprocess.Popen([path.exe(), 'mux', 'server'],
+                                  stdin=os.dup(s.fileno()), stdout=os.dup(s.fileno()))
+            s.close()
+finally:
+    for l in socks:
+        l.shutdown(socket.SHUT_RDWR)
+        l.close()
+
+debug1("bup daemon: done")