]> arthur.barton.de Git - bup.git/blobdiff - cmd/daemon-cmd.py
test-restore-map-owner: accommodate python 3 and test there
[bup.git] / cmd / daemon-cmd.py
index d61e35d782e7f72d927bef0cac589820b05c8f3b..ba4b86a50f8917bf697e2a45864cfecb8ddb97ba 100755 (executable)
@@ -1,18 +1,23 @@
-#!/usr/bin/env python
-import sys, getopt, socket, subprocess
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/bup-python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import
+import sys, getopt, socket, subprocess, fcntl
 from bup import options, path
 from bup.helpers import *
 
 optspec = """
-bup daemon [options...]
+bup daemon [options...] -- [bup-server options...]
 --
 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
@@ -21,27 +26,30 @@ import socket
 import sys
 
 socks = []
+e = None
 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:
+    except socket.error as e:
         continue
     try:
         if af == socket.AF_INET6:
             log("bup daemon: listening on [%s]:%s\n" % sa[:2])
         else:
             log("bup daemon: listening on %s:%s\n" % sa[:2])
+        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
         s.bind(sa)
         s.listen(1)
-    except socket.error, msg:
+        fcntl.fcntl(s.fileno(), fcntl.F_SETFD, fcntl.FD_CLOEXEC)
+    except socket.error as e:
         s.close()
         continue
     socks.append(s)
 
 if not socks:
-    log('bup daemon: could not open socket\n')
+    log('bup daemon: listen socket: %s\n' % e.args[1])
     sys.exit(1)
 
 try:
@@ -49,10 +57,17 @@ try:
         [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()
+            try:
+                log("Socket accepted connection from %s\n" % (src,))
+                fd1 = os.dup(s.fileno())
+                fd2 = os.dup(s.fileno())
+                s.close()
+                sp = subprocess.Popen([path.exe(), 'mux', '--',
+                                       path.exe(), 'server']
+                                      + extra, stdin=fd1, stdout=fd2)
+            finally:
+                os.close(fd1)
+                os.close(fd2)
 finally:
     for l in socks:
         l.shutdown(socket.SHUT_RDWR)