| 3 # |
3 # |
| 4 |
4 |
| 5 import json |
5 import json |
| 6 from subprocess import Popen, PIPE |
6 from subprocess import Popen, PIPE |
| 7 from config import settings, arglistify |
7 from config import settings, arglistify |
| 8 from queue import Queue |
|
| 9 from threading import Thread |
|
| 10 |
|
| 11 def linereader(stream, instance, queue): |
|
| 12 # What to do on error? |
|
| 13 for line in iter(stream.readline, b''): |
|
| 14 status=json.loads(line) |
|
| 15 queue.put({'identifier': instance.identifier, |
|
| 16 'operation': instance.operation, |
|
| 17 'status': status}) |
|
| 18 out.close() |
|
| 19 |
8 |
| 20 class BorgInstance: |
9 class BorgInstance: |
| 21 |
10 |
| 22 def __init__(self, identifier, operation, args, archive, argsl): |
11 def __init__(self, operation, archive_or_repository, args, argsl): |
| 23 self.identifier=identifier; |
|
| 24 self.operation=operation; |
12 self.operation=operation; |
| 25 self.args=args; |
13 self.args=args; |
| 26 self.archive=archive; |
14 self.archive_or_repository=archive_or_repository; |
| 27 self.argsl=argsl; |
15 self.argsl=argsl; |
| 28 |
16 |
| 29 def construct_cmdline(self): |
17 def construct_cmdline(self): |
| 30 cmd=([settings['borg']['executable'], '--log-json']+ |
18 cmd=([settings['borg']['executable'], '--log-json']+ |
| 31 arglistify(settings['borg']['common_parameters'])+ |
19 arglistify(settings['borg']['common_parameters'])+ |
| 32 [self.operation]) |
20 [self.operation]) |
| 33 tmp1=self.operation+'_parameters' |
21 tmp1=self.operation+'_parameters' |
| 34 if tmp1 in settings['borg']: |
22 if tmp1 in settings['borg']: |
| 35 cmd=cmd+arglistify(settings['borg'][tmp1]) |
23 cmd=cmd+arglistify(settings['borg'][tmp1]) |
| 36 return cmd+arglistify(self.args)+[self.archive]+self.argsl |
24 cmd=cmd+arglistify(self.args)+[self.archive_or_repository]+self.argsl |
| |
25 print(cmd) |
| |
26 return cmd |
| 37 |
27 |
| 38 def launch(self, queue): |
28 def launch(self): |
| 39 # What to do with stderr? Is it needed? |
29 # What to do with stderr? Is it needed? |
| 40 self.proc=Popen(self.construct_cmdline(), stdout=PIPE, stderr=PIPE) |
30 self.proc=Popen(self.construct_cmdline(), stdout=PIPE, stderr=PIPE) |
| 41 linereaderargs=(self.proc.stdout, self, queue) |
|
| 42 self.t=Thread(target=linereader, args=linereaderargs) |
|
| 43 t.daemon=True |
|
| 44 t.start() |
|
| 45 |
31 |
| 46 def read_output(): |
32 def read(self): |
| 47 try: |
33 line=self.proc.stdout.readline() |
| 48 obj=self.queue.get_nowait() |
34 if line==b'': |
| 49 except Empty: |
35 line=self.proc.stderr.readline() |
| 50 obj=Empty |
36 if line==b'': |
| 51 return obj |
37 return None |
| |
38 print('EEE'+str(line)) |
| |
39 return 'error' |
| |
40 else: |
| |
41 print('###' + str(line)) |
| |
42 # # What to do on error? stderr? |
| |
43 status=json.loads(line) |
| |
44 return status |
| |
45 |
| |
46 # for line in iter(stream.readline, b''): |
| |
47 # status=json.loads(line) |
| |
48 # queue.put({'identifier': instance.identifier, |
| |
49 # 'operation': instance.operation, |
| |
50 # 'status': status}) |
| |
51 # out.close() |
| |
52 |
| |
53 # def read_output(): |
| |
54 # try: |
| |
55 # obj=self.queue.get_nowait() |
| |
56 # except Empty: |
| |
57 # obj=Empty |
| |
58 # return obj |
| 52 |
59 |
| 53 |
60 |
| 54 |
61 |
| 55 |
62 |