borgend.py

Tue, 06 Feb 2018 20:16:59 +0000

author
Tuomo Valkonen <tuomov@iki.fi>
date
Tue, 06 Feb 2018 20:16:59 +0000
changeset 111
c3bc27cf5ece
parent 92
a1d3721ef5fa
permissions
-rwxr-xr-x

Changed dreamtime calculation.
The monotonic clock (time.monotonic()) sometimes advances unreliably
in sleep, so isn't reliable for calculating sleeping time. We have to
use time.time(). But this may be changed by the user, so we only use
it to track sleep periods, and still use time.monotonic() to track
wake periods.

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

mercurial