| 4 |
4 |
| 5 import config |
5 import config |
| 6 import logging |
6 import logging |
| 7 import time |
7 import time |
| 8 import keyring |
8 import keyring |
| |
9 import borgend |
| 9 from instance import BorgInstance |
10 from instance import BorgInstance |
| 10 from queue import Queue |
11 from queue import Queue |
| 11 from threading import Thread, Lock, Timer |
12 from threading import Thread, Lock, Timer |
| 12 |
13 |
| 13 logger=logging.getLogger(__name__) |
14 logger=borgend.logger.getChild(__name__) |
| 14 |
15 |
| 15 loglevel_translation={ |
16 loglevel_translation={ |
| 16 'CRITICAL': logging.CRITICAL, |
17 'CRITICAL': logging.CRITICAL, |
| 17 'ERROR': logging.ERROR, |
18 'ERROR': logging.ERROR, |
| 18 'WARNING': logging.WARNING, |
19 'WARNING': logging.WARNING, |
| 289 self.common_parameters + |
290 self.common_parameters + |
| 290 self.prune_parameters)) |
291 self.prune_parameters)) |
| 291 else: |
292 else: |
| 292 raise NotImplementedError("Invalid operation '%s'" % op['operation']) |
293 raise NotImplementedError("Invalid operation '%s'" % op['operation']) |
| 293 except Exception as err: |
294 except Exception as err: |
| 294 logging.debug('Rescheduling after failure') |
295 logger.debug('Rescheduling after failure') |
| 295 self.lastrun_when=time.monotonic() |
296 self.lastrun_when=time.monotonic() |
| 296 self.lastrun_success=False |
297 self.lastrun_success=False |
| 297 self.__schedule_unlocked() |
298 self.__schedule_unlocked() |
| 298 raise err |
299 raise err |
| 299 |
300 |
| 346 op=self.scheduled_operation |
347 op=self.scheduled_operation |
| 347 self.scheduled_operation=None |
348 self.scheduled_operation=None |
| 348 self.timer=None |
349 self.timer=None |
| 349 |
350 |
| 350 if self.__is_running_unlocked(): |
351 if self.__is_running_unlocked(): |
| 351 logging.info('Aborted queue operation, as an operation is already running') |
352 logger.info('Aborted queue operation, as an operation is already running') |
| 352 else: |
353 else: |
| 353 # TODO: Queue on 'repository' and online status for SSH, etc. |
354 # TODO: Queue on 'repository' and online status for SSH, etc. |
| 354 |
355 |
| 355 # TODO: UI comms. queue? |
356 # TODO: UI comms. queue? |
| 356 self.__launch(op, None) |
357 self.__launch(op, None) |
| 390 op=self.__next_operation_unlocked() |
391 op=self.__next_operation_unlocked() |
| 391 |
392 |
| 392 if op: |
393 if op: |
| 393 now=time.monotonic() |
394 now=time.monotonic() |
| 394 delay=max(0, op['when_monotonic']-now) |
395 delay=max(0, op['when_monotonic']-now) |
| 395 logging.info("Scheduling '%s' (detail: %s) of '%s' in %d seconds" % |
396 logger.info("Scheduling '%s' (detail: %s) of '%s' in %d seconds" % |
| 396 (op['operation'], op['detail'], self.name, delay)) |
397 (op['operation'], op['detail'], self.name, delay)) |
| 397 tmr=Timer(delay, self.__queue_timed_operation) |
398 tmr=Timer(delay, self.__queue_timed_operation) |
| 398 self.scheduled_operation=op |
399 self.scheduled_operation=op |
| 399 self.timer=tmr |
400 self.timer=tmr |
| 400 tmr.start() |
401 tmr.start() |
| 401 |
402 |