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 |