]> arthur.barton.de Git - bup.git/blob - cmd/daemon-cmd.py
Add `bup daemon` command for simple socket server
[bup.git] / cmd / daemon-cmd.py
1 #!/usr/bin/env python
2 import sys, getopt, socket, subprocess
3 from bup import options, path
4 from bup.helpers import *
5
6 optspec = """
7 bup daemon [-l address] [-p port]
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 if extra:
15     o.fatal('no arguments expected')
16
17 host = opt.listen
18 port = opt.port and int(opt.port) or 1982
19
20 import socket
21 import sys
22
23 socks = []
24 for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC,
25                               socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
26     af, socktype, proto, canonname, sa = res
27     try:
28         s = socket.socket(af, socktype, proto)
29     except socket.error, msg:
30         continue
31     try:
32         if af == socket.AF_INET6:
33             debug1("bup daemon: listening on [%s]:%s\n" % sa[:2])
34         else:
35             debug1("bup daemon: listening on %s:%s\n" % sa[:2])
36         s.bind(sa)
37         s.listen(1)
38     except socket.error, msg:
39         s.close()
40         continue
41     socks.append(s)
42
43 if not socks:
44     log('bup daemon: could not open socket\n')
45     sys.exit(1)
46
47 try:
48     while True:
49         [rl,wl,xl] = select.select(socks, [], [], 60)
50         for l in rl:
51             s, src = l.accept()
52             log("Socket accepted connection from %s\n" % (src,))
53             sp = subprocess.Popen([path.exe(), 'mux', 'server'],
54                                   stdin=os.dup(s.fileno()), stdout=os.dup(s.fileno()))
55             s.close()
56 finally:
57     for l in socks:
58         l.shutdown(socket.SHUT_RDWR)
59         l.close()
60
61 debug1("bup daemon: done")