borgend/__main__.py

Mon, 07 Feb 2022 11:38:54 +0200

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 07 Feb 2022 11:38:54 +0200
changeset 145
2e8b9a3caa56
parent 142
ad1d4a29ec75
permissions
-rwxr-xr-x

py2app has problems with relative paths, so revert them

#!/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')

def main():
    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()

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

mercurial