Sun, 04 Feb 2018 01:27:38 +0000
Part 2 of handling macOS sleep/wake signal brokenness.
a) Added Time.horizon(), which indicates how far the Time event is from the
epoch, in monotonic time. For DreamTime, if the system is sleeping, this
returns ∞. b) The DreamTime monitor also signals sleep to callbacks, so
that the Scheduler can re-sort the events. The sorting is now done by
the horizon, so DreamTime events will be moved last and not activated when
the system is sleeping or "sleeping", but other events will be executed
normally if the system is merely "sleeping".
#!/usr/local/bin/python3 # # Borgend by Tuomo Valkonen, 2018 # # Common modules import os import sys import argparse import platform import logging # Own modules needed at this stage import borgend.branding as branding import borgend.locations as locations # # Argument processing # epilog_format=""" Configuration file location: %s Log directory: %s/ """ parser=argparse.ArgumentParser( description=branding.appname_stylised + ": BorgBackup scheduler, queue, and tray icon.", epilog=epilog_format % (locations.cfgfile, locations.logs_dir), formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument( '--no-tray', dest='notray', action='store_true', help='Do not show the tray icon') parser.add_argument( '--debug', dest='debug', action='store_true', help='Set logging level to debug') args=parser.parse_args() # # Done parsing args, import our own modules, and launch everything # import borgend.config as config import borgend.dreamtime as dreamtime import borgend.loggers as loggers from borgend.scheduler import Scheduler from borgend.repository import Repository from borgend.backup import Backup logger=loggers.mainlogger if args.debug: logger.setLevel(logging.DEBUG) tray = None repos=[] backups=[] try: dreamtime.start_monitoring() scheduler = Scheduler() scheduler.start() repoconfigs=config.settings['repositories'] logger.info('Initialising repositories') for i in range(len(repoconfigs)): r=Repository(i, repoconfigs[i]) repos.append(r) backupconfigs=config.settings['backups'] logger.info('Initialising backups') for i in range(len(backupconfigs)): b=Backup(i, backupconfigs[i], scheduler) backups.append(b) if args.notray or platform.system()!='Darwin': # Wait for scheduler to finish run=scheduler.join else: # This is needed for Ctrl+C to work. # TODO: proper exit handler, which seems to require # ditching/forking/extending rumps to extend the NSApp class from PyObjCTools.AppHelper import installMachInterrupt installMachInterrupt() # Start UI, and let it handle exit control from borgend.ui import BorgendTray tray=BorgendTray(backups); run=tray.run for r in repos: r.start() for b in backups: b.start() run() except Exception as err: # TODO: Should write errors here to stderr; # perhaps add an extra stderr logger for error level messages logger.exception("Exception fell through: exiting") finally: logger.debug("Exiting") for b in backups: b.terminate() for r in repos: r.terminate() if tray: tray.quit() else: logging.shutdown()