| 5 import json |
5 import json |
| 6 import logging |
6 import logging |
| 7 import os |
7 import os |
| 8 from subprocess import Popen, PIPE |
8 from subprocess import Popen, PIPE |
| 9 from config import settings, arglistify |
9 from config import settings, arglistify |
| |
10 |
| |
11 logger=logging.getLogger(__name__) |
| 10 |
12 |
| 11 necessary_opts=['--log-json', '--progress'] |
13 necessary_opts=['--log-json', '--progress'] |
| 12 |
14 |
| 13 necessary_opts_for={ |
15 necessary_opts_for={ |
| 14 'create': ['--json'], |
16 'create': ['--json'], |
| 37 return cmd+arglistify(self.args)+[self.archive_or_repository]+self.argsl |
39 return cmd+arglistify(self.args)+[self.archive_or_repository]+self.argsl |
| 38 |
40 |
| 39 def launch(self, passphrase=None): |
41 def launch(self, passphrase=None): |
| 40 cmd=self.construct_cmdline() |
42 cmd=self.construct_cmdline() |
| 41 |
43 |
| 42 logging.info('Launching ' + str(cmd)) |
44 logger.info('Launching ' + str(cmd)) |
| 43 |
45 |
| 44 env=os.environ.copy() |
46 env=os.environ.copy() |
| 45 if passphrase: |
47 if passphrase: |
| 46 env['BORG_PASSPHRASE']=passphrase |
48 env['BORG_PASSPHRASE']=passphrase |
| 47 |
49 |
| 62 |
64 |
| 63 def read_result(self): |
65 def read_result(self): |
| 64 stream=self.proc.stdout |
66 stream=self.proc.stdout |
| 65 line=stream.read(-1) |
67 line=stream.read(-1) |
| 66 if line==b'': |
68 if line==b'': |
| 67 logging.debug('Borg stdout pipe EOF?') |
69 logger.debug('Borg stdout pipe EOF?') |
| 68 return None |
70 return None |
| 69 |
71 |
| 70 try: |
72 try: |
| 71 return json.loads(line) |
73 return json.loads(line) |
| 72 except: |
74 except: |
| 73 logging.warning('JSON parse failed on: "%s"' % line) |
75 logger.warning('JSON parse failed on: "%s"' % line) |
| 74 return None |
76 return None |
| 75 |
77 |
| 76 def read_log(self): |
78 def read_log(self): |
| 77 stream=self.proc.stderr |
79 stream=self.proc.stderr |
| 78 try: |
80 try: |
| 79 line=stream.readline() |
81 line=stream.readline() |
| 80 except err: |
82 except err: |
| 81 logging.debug('Pipe read failed: %s' % str(err)) |
83 logger.debug('Pipe read failed: %s' % str(err)) |
| 82 |
84 |
| 83 return {'type': 'log_message', |
85 return {'type': 'log_message', |
| 84 'levelname': 'CRITICAL', |
86 'levelname': 'CRITICAL', |
| 85 'name': 'borgend.instance.BorgInstance', |
87 'name': 'borgend.instance.BorgInstance', |
| 86 'msgid': 'Borgend.Exception', |
88 'msgid': 'Borgend.Exception', |
| 87 'message': err} |
89 'message': err} |
| 88 |
90 |
| 89 if line==b'': |
91 if line==b'': |
| 90 |
92 |
| 91 logging.debug('Borg stderr pipe EOF?') |
93 logger.debug('Borg stderr pipe EOF?') |
| 92 |
94 |
| 93 return None |
95 return None |
| 94 |
96 |
| 95 try: |
97 try: |
| 96 res=json.loads(line) |
98 res=json.loads(line) |
| 97 if 'type' not in res: |
99 if 'type' not in res: |
| 98 res['type']='UNKNOWN' |
100 res['type']='UNKNOWN' |
| 99 return res |
101 return res |
| 100 except: |
102 except: |
| 101 logging.debug('JSON parse failed on: "%s"' % str(line)) |
103 logger.debug('JSON parse failed on: "%s"' % str(line)) |
| 102 |
104 |
| 103 errmsg=line |
105 errmsg=line |
| 104 for line in iter(stream.readline, b''): |
106 for line in iter(stream.readline, b''): |
| 105 errmsg=errmsg+line |
107 errmsg=errmsg+line |
| 106 |
108 |