X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cmd%2Fdaemon-cmd.py;h=ba4b86a50f8917bf697e2a45864cfecb8ddb97ba;hb=57368bb37dae3047d737892f7b4d1c6ac725bc53;hp=3507549ced8790793c8ff06b0c2d6b6864ccae8b;hpb=e529cf13b5660cd64e10aac1dd35fac9811b27af;p=bup.git diff --git a/cmd/daemon-cmd.py b/cmd/daemon-cmd.py index 3507549..ba4b86a 100755 --- a/cmd/daemon-cmd.py +++ b/cmd/daemon-cmd.py @@ -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 [-l address] [-p port] +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: - debug1("bup daemon: listening on [%s]:%s\n" % sa[:2]) + log("bup daemon: listening on [%s]:%s\n" % sa[:2]) else: - debug1("bup daemon: listening on %s:%s\n" % sa[:2]) + 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)