X-Git-Url: http://gitweb.michael.orlitzky.com/?p=untangle-https-backup.git;a=blobdiff_plain;f=bin%2Funtangle-https-backup;h=3abb05f257741b96fd349c650b09c8c5db23932f;hp=c01c419849f3cb157158146dc464417a523e045d;hb=HEAD;hpb=1b7c4afc84bf55acef350fdc5479e7213c78eaa4 diff --git a/bin/untangle-https-backup b/bin/untangle-https-backup index c01c419..3abb05f 100755 --- a/bin/untangle-https-backup +++ b/bin/untangle-https-backup @@ -5,8 +5,10 @@ Back up Untangle configurations via the web admin UI. from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser import configparser +from http.client import HTTPException from os import chmod from urllib.error import HTTPError, URLError +from socket import timeout from sys import stderr from untangle.untangle import Untangle @@ -29,25 +31,54 @@ args = parser.parse_args() # Default to success, change it if anything fails. status = EXIT_OK -config = configparser.ConfigParser() +# Parse the configuration file. In this contect "interpolation" is +# something completely berserk, and it breaks passwords containing '%' +# characters. So, we turn it off. +config = configparser.ConfigParser(interpolation=None) config.read(args.config_file) +# And loop through each section. for section in config.sections(): + # For each section, we create an Untangle object based on that + # section's configuration. u = Untangle(config[section]) try: + # And then try to log in and retrieve a backup. u.login() backup = u.get_backup() + + # If that worked, we save the backup file and make it + # accessible only to its owner. filename = u.name + '.backup' with open(filename, 'wb') as f: f.write(backup) chmod(filename, 0o600) + # If it didn't work, but in a predictable way (some host is down), + # then we report that error and keep going. except URLError as e: - msg = u.name + ': ' + str(e.reason) + ' from ' + u.host + tpl = '{:s}: {:s} from {:s}' + msg = tpl.format(u.name, str(e.reason), u.host) print(msg, file=stderr) status = EXIT_BACKUPS_FAILED except HTTPError as e: - msg = u.name + ': ' + 'HTTP error ' + str(e.code) + ' from ' + u.host + tpl = '{:s}: HTTP error {:s} from {:s}' + msg = tpl.format(u.name, str(e.code), u.host) + print(msg, file=stderr) + status = EXIT_BACKUPS_FAILED + except HTTPException as e: + # At least one sort of HTTPException (BadStatusLine) is not + # translated by urllib into an HTTPError, so we catch + # HTTPExceptions too. + tpl = '{:s}: HTTP exception {:s} from {:s}' + msg = tpl.format(u.name, repr(e), u.host) + print(msg, file=stderr) + status = EXIT_BACKUPS_FAILED + except timeout as e: + # A socket.timeout exception occurs when something goes over + # the configured "timeout" limit. + tpl = '{:s}: socket timeout ({:s}) from {:s}' + msg = tpl.format(u.name, str(e), u.host) print(msg, file=stderr) status = EXIT_BACKUPS_FAILED