]> arthur.barton.de Git - bup.git/blob - cmd/daemon-cmd.py
Use absolute_import from the __future__ everywhere
[bup.git] / cmd / daemon-cmd.py
1 #!/bin/sh
2 """": # -*-python-*-
3 bup_python="$(dirname "$0")/bup-python" || exit $?
4 exec "$bup_python" "$0" ${1+"$@"}
5 """
6 # end of bup preamble
7
8 from __future__ import absolute_import
9 import sys, getopt, socket, subprocess, fcntl
10 from bup import options, path
11 from bup.helpers import *
12
13 optspec = """
14 bup daemon [options...] -- [bup-server options...]
15 --
16 l,listen  ip address to listen on, defaults to *
17 p,port    port to listen on, defaults to 1982
18 """
19 o = options.Options(optspec, optfunc=getopt.getopt)
20 (opt, flags, extra) = o.parse(sys.argv[1:])
21
22 host = opt.listen
23 port = opt.port and int(opt.port) or 1982
24
25 import socket
26 import sys
27
28 socks = []
29 e = None
30 for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC,
31                               socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
32     af, socktype, proto, canonname, sa = res
33     try:
34         s = socket.socket(af, socktype, proto)
35     except socket.error as e:
36         continue
37     try:
38         if af == socket.AF_INET6:
39             log("bup daemon: listening on [%s]:%s\n" % sa[:2])
40         else:
41             log("bup daemon: listening on %s:%s\n" % sa[:2])
42         s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
43         s.bind(sa)
44         s.listen(1)
45         fcntl.fcntl(s.fileno(), fcntl.F_SETFD, fcntl.FD_CLOEXEC)
46     except socket.error as e:
47         s.close()
48         continue
49     socks.append(s)
50
51 if not socks:
52     log('bup daemon: listen socket: %s\n' % e.args[1])
53     sys.exit(1)
54
55 try:
56     while True:
57         [rl,wl,xl] = select.select(socks, [], [], 60)
58         for l in rl:
59             s, src = l.accept()
60             try:
61                 log("Socket accepted connection from %s\n" % (src,))
62                 fd1 = os.dup(s.fileno())
63                 fd2 = os.dup(s.fileno())
64                 s.close()
65                 sp = subprocess.Popen([path.exe(), 'mux', '--',
66                                        path.exe(), 'server']
67                                       + extra, stdin=fd1, stdout=fd2)
68             finally:
69                 os.close(fd1)
70                 os.close(fd2)
71 finally:
72     for l in socks:
73         l.shutdown(socket.SHUT_RDWR)
74         l.close()
75
76 debug1("bup daemon: done")