borgend/__main__.py

Sun, 05 Dec 2021 21:20:09 +0200

author
Tuomo Valkonen <tuomov@iki.fi>
date
Sun, 05 Dec 2021 21:20:09 +0200
changeset 142
ad1d4a29ec75
parent 135
45c1a38f8709
child 145
2e8b9a3caa56
permissions
-rwxr-xr-x

Update main module imports to relative form

#!/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
from . import branding
from . import 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')

def main():
    args=parser.parse_args()

    # Done parsing args, import our own modules, and launch everything
    from . import config
    from . import dreamtime
    from . import loggers
    from .scheduler import Scheduler
    from .repository import Repository
    from .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()

if __name__ == "__main__":
    sys.exit(main())

mercurial