]> gitweb.michael.orlitzky.com - untangle-https-backup.git/blobdiff - bin/untangle-https-backup
bin/untangle-https-backup: expect and report socket timeouts.
[untangle-https-backup.git] / bin / untangle-https-backup
index c01c419849f3cb157158146dc464417a523e045d..25fbf9d2364a7b94242a3f9b540b8589f658c3f6 100755 (executable)
@@ -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,52 @@ args = parser.parse_args()
 # Default to success, change it if anything fails.
 status = EXIT_OK
 
+# Parse the configuration file...
 config = configparser.ConfigParser()
 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