X-Git-Url: http://gitweb.michael.orlitzky.com/?p=untangle-https-backup.git;a=blobdiff_plain;f=src%2Funtangle%2Funtangle.py;fp=src%2Funtangle%2Funtangle.py;h=09c5723c9c11a08a98dc250973716ec081ecdd3a;hp=0000000000000000000000000000000000000000;hb=1b7c4afc84bf55acef350fdc5479e7213c78eaa4;hpb=0ed3a4940f09f3586072a32887579cdf5692bae1 diff --git a/src/untangle/untangle.py b/src/untangle/untangle.py new file mode 100644 index 0000000..09c5723 --- /dev/null +++ b/src/untangle/untangle.py @@ -0,0 +1,90 @@ +import configparser +import http.cookiejar +import ssl +import urllib.parse +import urllib.request + +class Untangle: + + def __init__(self, s): + """ + Initialize this Untangle object with a ConfigParser section. + """ + self.name = s.name + self.host = s['host'] + self.username = s.get('username', 'admin') + self.password = s['password'] + self.version = int(s.get('version', '11')) + self.base_url = 'https://' + self.host + '/' # This never changes + + # Sanity check the numerical version. + if self.version not in [9, 11]: + msg = 'Invalid version "' + str(self.version) + '" ' + msg += 'in section "' + s.name + '"' + raise configparser.ParsingError(msg) + + # Sanity check the boolean verify_cert parameter. + vc = s.get('verify_cert', 'False') + if vc == 'True': + self.verify_cert = True + elif vc == 'False': + self.verify_cert = False + else: + msg = 'Invalid value "' + vc + '" for verify_cert ' + msg += 'in section "' + s.name + '"' + raise configparser.ParsingError(msg) + + # + # Finally, create a URL opener to make HTTPS requests. + # + # First, create a cookie jar that we'll attach to our URL + # opener thingy. + cj = http.cookiejar.CookieJar() + cookie_proc = urllib.request.HTTPCookieProcessor(cj) + + # SSL mumbo jumbo to make it ignore the certificate's hostname + # when verify_cert = False. + if self.verify_cert: + ssl_ctx = ssl.create_default_context() + else: + ssl_ctx = ssl._create_unverified_context() + + https_handler = urllib.request.HTTPSHandler(context=ssl_ctx) + + # Now Create a URL opener, and tell it to use our cookie jar + # and SSL context. We keep this around for future requests. + self.opener = urllib.request.build_opener(https_handler, cookie_proc) + + + def login(self): + login_path = 'auth/login?url=/setup/welcome.do&realm=Administrator' + url = self.base_url + login_path + post_vars = {'username': self.username, 'password': self.password } + post_data = urllib.parse.urlencode(post_vars).encode('ascii') + self.opener.open(url, post_data) + + + def get_backup(self): + if self.version == 9: + return self.get_backup_v9() + elif self.version == 11: + return self.get_backup_v11() + + + def get_backup_v9(self): + url = self.base_url + '/webui/backup' + post_vars = {'action': 'requestBackup'} + post_data = urllib.parse.urlencode(post_vars).encode('ascii') + self.opener.open(url, post_data) + + url = self.base_url + 'webui/backup?action=initiateDownload' + with self.opener.open(url) as response: + return response.read() + + + def get_backup_v11(self): + url = self.base_url + '/webui/download?type=backup' + post_vars = {'type': 'backup'} + post_data = urllib.parse.urlencode(post_vars).encode('ascii') + with self.opener.open(url, post_data) as response: + return response.read()