| 1 # |
1 # |
| 2 # Borgend borg launcher / processor |
2 # Borgend borg launcher / processor |
| 3 # |
3 # |
| 4 |
4 |
| 5 import json |
5 import json |
| 6 import subprocess |
6 from subprocess import Popen, PIPE |
| 7 import config |
7 from config import settings, arglistify |
| 8 import Queue |
8 from queue import Queue |
| 9 import Thread |
9 from threading import Thread |
| 10 |
10 |
| 11 def linereader(stream, instance, queue) |
11 def linereader(stream, instance, queue): |
| 12 # What to do on error? |
12 # What to do on error? |
| 13 for line in iter(stream.readline, b''): |
13 for line in iter(stream.readline, b''): |
| 14 status=json.loads(line) |
14 status=json.loads(line) |
| 15 queue.put({'identifier': instance.identifier, |
15 queue.put({'identifier': instance.identifier, |
| 16 'operation': instance.operation, |
16 'operation': instance.operation, |
| 17 'status': status}) |
17 'status': status}) |
| 18 out.close() |
18 out.close() |
| 19 |
19 |
| 20 class BorgInstance: |
20 class BorgInstance: |
| 21 |
21 |
| 22 def __init__(self, identifier, operation, args): |
22 def __init__(self, identifier, operation, args, archive, argsl): |
| 23 self.identifier=identifier; |
23 self.identifier=identifier; |
| 24 self.operation=operation; |
24 self.operation=operation; |
| 25 self.args=args; |
25 self.args=args; |
| |
26 self.archive=archive; |
| |
27 self.argsl=argsl; |
| 26 |
28 |
| 27 def construct_cmdline(self): |
29 def construct_cmdline(self): |
| 28 ??? |
30 cmd=([settings['borg']['executable'], '--log-json']+ |
| |
31 arglistify(settings['borg']['common_parameters'])+ |
| |
32 [self.operation]) |
| |
33 tmp1=self.operation+'_parameters' |
| |
34 if tmp1 in settings['borg']: |
| |
35 cmd=cmd+arglistify(settings['borg'][tmp1]) |
| |
36 return cmd+arglistify(self.args)+[self.archive]+self.argsl |
| 29 |
37 |
| 30 def launch(self, queue): |
38 def launch(self, queue): |
| 31 # What to do with stderr? Is it needed? |
39 # What to do with stderr? Is it needed? |
| 32 self.proc=subprocess.Popen(self.construct_cmdline(), |
40 self.proc=Popen(self.construct_cmdline(), stdout=PIPE, stderr=PIPE) |
| 33 stdout=subprocess.PIPE, |
|
| 34 stderr=subprocess.PIPE) |
|
| 35 linereaderargs=(self.proc.stdout, self, queue) |
41 linereaderargs=(self.proc.stdout, self, queue) |
| 36 self.t=Thread(target=linereader, args=linereaderargs) |
42 self.t=Thread(target=linereader, args=linereaderargs) |
| 37 t.daemon=True |
43 t.daemon=True |
| 38 t.start() |
44 t.start() |
| 39 |
45 |