From 048d1bcf52f9d255c93fd8bfe3f1702bc95bbd5e Mon Sep 17 00:00:00 2001 From: Brandon Low Date: Wed, 26 Jan 2011 18:30:21 -0800 Subject: [PATCH 1/1] Add `bup daemon` command for simple socket server Nothing special here, just listens on a host:port combination and spawns `bup mux server` instances. Signed-off-by: Brandon Low --- Documentation/bup-daemon.md | 20 ++++++++++++ cmd/daemon-cmd.py | 61 +++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 Documentation/bup-daemon.md create mode 100755 cmd/daemon-cmd.py diff --git a/Documentation/bup-daemon.md b/Documentation/bup-daemon.md new file mode 100644 index 0000000..87ab495 --- /dev/null +++ b/Documentation/bup-daemon.md @@ -0,0 +1,20 @@ +% bup-daemon(1) Bup %BUP_VERSION% +% Brandon Low +% %BUP_DATE% + +# NAME + +bup-daemon - listens for connections and runs `bup server` + +# SYNOPSIS + +bup daemon + +# DESCRIPTION + +`bup daemon` is a simple bup server which listens on a +socket and forks connections to `bup mux server` children. + +# BUP + +Part of the `bup`(1) suite. diff --git a/cmd/daemon-cmd.py b/cmd/daemon-cmd.py new file mode 100755 index 0000000..3507549 --- /dev/null +++ b/cmd/daemon-cmd.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +import sys, getopt, socket, subprocess +from bup import options, path +from bup.helpers import * + +optspec = """ +bup daemon [-l address] [-p port] +-- +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 + +import socket +import sys + +socks = [] +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: + continue + try: + if af == socket.AF_INET6: + debug1("bup daemon: listening on [%s]:%s\n" % sa[:2]) + else: + debug1("bup daemon: listening on %s:%s\n" % sa[:2]) + s.bind(sa) + s.listen(1) + except socket.error, msg: + s.close() + continue + socks.append(s) + +if not socks: + log('bup daemon: could not open socket\n') + sys.exit(1) + +try: + while True: + [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() +finally: + for l in socks: + l.shutdown(socket.SHUT_RDWR) + l.close() + +debug1("bup daemon: done") -- 2.39.2