]> arthur.barton.de Git - bup.git/blob - helpers.py
344d001a53ece358f1b845b53a9a4eaad8fe9be6
[bup.git] / helpers.py
1 import sys, os, pwd, subprocess, errno
2
3
4 def log(s):
5     sys.stderr.write(s)
6
7
8 def mkdirp(d):
9     try:
10         os.makedirs(d)
11     except OSError, e:
12         if e.errno == errno.EEXIST:
13             pass
14         else:
15             raise
16
17
18 def readpipe(argv):
19     p = subprocess.Popen(argv, stdout=subprocess.PIPE)
20     r = p.stdout.read()
21     p.wait()
22     return r
23
24
25 _username = None
26 def username():
27     global _username
28     if not _username:
29         uid = os.getuid()
30         try:
31             _username = pwd.getpwuid(uid)[0]
32         except KeyError:
33             _username = 'user%d' % uid
34     return _username
35
36
37 _userfullname = None
38 def userfullname():
39     global _userfullname
40     if not _userfullname:
41         uid = os.getuid()
42         try:
43             _userfullname = pwd.getpwuid(uid)[4].split(',')[0]
44         except KeyError:
45             _userfullname = 'user%d' % uid
46     return _userfullname
47
48
49 _hostname = None
50 def hostname():
51     global _hostname
52     if not _hostname:
53         try:
54             if sys.platform == 'cygwin':
55                 hostcmd = ['hostname']
56             else:
57                 hostcmd = ['hostname', '-f']
58             _hostname = readpipe(hostcmd).strip()
59         except OSError:
60             pass
61     return _hostname or 'localhost'
62
63
64 class Conn:
65     def __init__(self, inp, outp):
66         self.inp = inp
67         self.outp = outp
68
69     def read(self, size):
70         self.outp.flush()
71         return self.inp.read(size)
72
73     def readline(self):
74         self.outp.flush()
75         return self.inp.readline()
76
77     def write(self, data):
78         #log('%d writing: %d bytes\n' % (os.getpid(), len(data)))
79         self.outp.write(data)
80
81     def ok(self):
82         self.write('\nok\n')
83
84     def check_ok(self):
85         self.outp.flush()
86         rl = ''
87         for rl in linereader(self.inp):
88             #log('%d got line: %r\n' % (os.getpid(), rl))
89             if not rl:  # empty line
90                 continue
91             elif rl == 'ok':
92                 return True
93             else:
94                 raise Exception('expected "ok", got %r' % rl)
95         raise Exception('server exited unexpectedly; see errors above')
96
97
98 def linereader(f):
99     while 1:
100         line = f.readline()
101         if not line:
102             break
103         yield line[:-1]
104
105
106 def chunkyreader(f, count = None):
107     if count != None:
108         while count > 0:
109             b = f.read(min(count, 65536))
110             if not b:
111                 raise IOError('EOF with %d bytes remaining' % count)
112             yield b
113             count -= len(b)
114     else:
115         while 1:
116             b = f.read(65536)
117             if not b: break
118             yield b
119
120
121 def slashappend(s):
122     if s and not s.endswith('/'):
123         return s + '/'
124     else:
125         return s
126