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