]> arthur.barton.de Git - bup.git/blob - cmd/on-cmd.py
Add "/t/sampledata/var" to .gitignore
[bup.git] / cmd / on-cmd.py
1 #!/usr/bin/env python
2 import sys, os, struct, getopt, subprocess, signal
3 from subprocess import PIPE
4 from bup import options, ssh, path
5 from bup.helpers import *
6
7 optspec = """
8 bup on <hostname> index ...
9 bup on <hostname> save ...
10 bup on <hostname> split ...
11 """
12 o = options.Options(optspec, optfunc=getopt.getopt)
13 (opt, flags, extra) = o.parse(sys.argv[1:])
14 if len(extra) < 2:
15     o.fatal('arguments expected')
16
17 class SigException(Exception):
18     def __init__(self, signum):
19         self.signum = signum
20         Exception.__init__(self, 'signal %d received' % signum)
21 def handler(signum, frame):
22     raise SigException(signum)
23
24 signal.signal(signal.SIGTERM, handler)
25 signal.signal(signal.SIGINT, handler)
26
27 try:
28     sp = None
29     p = None
30     ret = 99
31
32     hp = extra[0].split(':')
33     if len(hp) == 1:
34         (hostname, port) = (hp[0], None)
35     else:
36         (hostname, port) = hp
37     argv = extra[1:]
38     p = ssh.connect(hostname, port, 'on--server', stderr=PIPE)
39
40     try:
41         argvs = '\0'.join(['bup'] + argv)
42         p.stdin.write(struct.pack('!I', len(argvs)) + argvs)
43         p.stdin.flush()
44         sp = subprocess.Popen([path.exe(), 'server'],
45                               stdin=p.stdout, stdout=p.stdin)
46         p.stdin.close()
47         p.stdout.close()
48         # Demultiplex remote client's stderr (back to stdout/stderr).
49         dmc = DemuxConn(p.stderr.fileno(), open(os.devnull, "w"))
50         for line in iter(dmc.readline, ""):
51             sys.stdout.write(line)
52     finally:
53         while 1:
54             # if we get a signal while waiting, we have to keep waiting, just
55             # in case our child doesn't die.
56             try:
57                 ret = p.wait()
58                 if sp:
59                     sp.wait()
60                 break
61             except SigException, e:
62                 log('\nbup on: %s\n' % e)
63                 os.kill(p.pid, e.signum)
64                 ret = 84
65 except SigException, e:
66     if ret == 0:
67         ret = 99
68     log('\nbup on: %s\n' % e)
69
70 sys.exit(ret)