| 34 if self.operation in necessary_opts_for: |
34 if self.operation in necessary_opts_for: |
| 35 cmd=cmd+necessary_opts_for[self.operation] |
35 cmd=cmd+necessary_opts_for[self.operation] |
| 36 |
36 |
| 37 return cmd+arglistify(self.args)+[self.archive_or_repository]+self.argsl |
37 return cmd+arglistify(self.args)+[self.archive_or_repository]+self.argsl |
| 38 |
38 |
| 39 def launch(self, password=None): |
39 def launch(self, passphrase=None): |
| 40 cmd=self.construct_cmdline() |
40 cmd=self.construct_cmdline() |
| 41 |
41 |
| 42 logging.info('Launching ' + str(cmd)) |
42 logging.info('Launching ' + str(cmd)) |
| 43 |
43 |
| 44 env=None |
44 env=None |
| 45 if password: |
45 if passphrase: |
| 46 env=os.environ.copy() |
46 env=os.environ.copy() |
| 47 env['BORG_PASSPHRASE']=password |
47 env['BORG_PASSPHRASE']=passphrase |
| 48 |
48 |
| 49 self.proc=Popen(cmd, env=env, stdout=PIPE, stderr=PIPE, stdin=PIPE) |
49 self.proc=Popen(cmd, env=env, stdout=PIPE, stderr=PIPE, stdin=PIPE) |
| 50 |
50 |
| 51 # We don't do password input etc. |
51 # We don't do passphrase input etc. |
| 52 self.proc.stdin.close() |
52 self.proc.stdin.close() |
| 53 |
53 |
| 54 def read_result(self): |
54 def read_result(self): |
| 55 stream=self.proc.stdout |
55 stream=self.proc.stdout |
| 56 line=stream.read(-1) |
56 line=stream.read(-1) |
| 69 try: |
69 try: |
| 70 line=stream.readline() |
70 line=stream.readline() |
| 71 except err: |
71 except err: |
| 72 logging.debug('Pipe read failed: %s' % str(err)) |
72 logging.debug('Pipe read failed: %s' % str(err)) |
| 73 |
73 |
| 74 return {'type': 'exception', 'exception': err} |
74 return {'type': 'log_message', |
| |
75 'levelname': 'CRITICAL', |
| |
76 'name': 'borgend.instance.BorgInstance', |
| |
77 'msgid': 'Borgend.Exception', |
| |
78 'message': err} |
| 75 |
79 |
| 76 if line==b'': |
80 if line==b'': |
| 77 |
81 |
| 78 logging.debug('Borg stderr pipe EOF?') |
82 logging.debug('Borg stderr pipe EOF?') |
| 79 |
83 |
| 89 |
93 |
| 90 errmsg=line |
94 errmsg=line |
| 91 for line in iter(stream.readline, b''): |
95 for line in iter(stream.readline, b''): |
| 92 errmsg=errmsg+line |
96 errmsg=errmsg+line |
| 93 |
97 |
| 94 return {'type': 'unparsed_error', 'message': str(errmsg)} |
98 return {'type': 'log_message', |
| |
99 'levelname': 'ERROR', |
| |
100 'name': 'borgend.instance.BorgInstance', |
| |
101 'msgid': 'Borgend.JSONFail', |
| |
102 'message': str(errmsg)} |
| 95 |
103 |
| 96 def terminate(self): |
104 def terminate(self): |
| 97 self.proc.terminate() |
105 self.proc.terminate() |
| 98 |
106 |
| 99 def wait(self): |
107 def wait(self): |