diff options
author | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2016-09-14 14:10:54 +0200 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2016-09-14 14:12:30 +0200 |
commit | ca3bc5e49f2965ed365aa17cf8c8adb55fdaa828 (patch) | |
tree | f25471db93024725929ddda0165066307f16e33e /tccalib/__init__.py | |
parent | 254c1b80cda0e79083c3107288dd5a17e156a1ad (diff) | |
download | remote-logon-config-agent-ca3bc5e49f2965ed365aa17cf8c8adb55fdaa828.tar.gz remote-logon-config-agent-ca3bc5e49f2965ed365aa17cf8c8adb55fdaa828.tar.bz2 remote-logon-config-agent-ca3bc5e49f2965ed365aa17cf8c8adb55fdaa828.zip |
Rename module tccalib to rscalib.
Diffstat (limited to 'tccalib/__init__.py')
-rw-r--r-- | tccalib/__init__.py | 224 |
1 files changed, 0 insertions, 224 deletions
diff --git a/tccalib/__init__.py b/tccalib/__init__.py deleted file mode 100644 index 9c61844..0000000 --- a/tccalib/__init__.py +++ /dev/null @@ -1,224 +0,0 @@ -# Copyright 2012 Canonical Ltd. This software is licensed under the GNU -# General Public License version 3 (see the file LICENSE). - -__metaclass__ = type - - -import errno -from http.client import parse_headers -import socket -from io import BytesIO, StringIO -from urllib.parse import quote -import urllib.request, urllib.error -import base64 - -import pycurl - - -class UserError(Exception): - """An error message that should be presented to the user.""" - - def __init__(self, msg=None): - if msg is None: - msg = self.__doc__ - super(UserError, self).__init__(msg) - - -class Unauthorized(UserError): - """Invalid username or password""" - - status = 2 - - -class CouldNotConnect(UserError): - """Could not connect""" - - status = 3 - - -class CertificateVerificationFailed(UserError): - """Certificate verification failed""" - - status = 4 - - -class URLLibGetter: - """Get data from URLs using URLib.""" - - @staticmethod - def get_response_body(request, verify_ssl): - """Return the body of the response to the supplied request. - - :param request: A urllib2.Request - :param verify_ssl: Unused - :raises CouldNotConnect: if there is a connection error. - """ - try: - return urllib.request.urlopen(request).read() - except urllib.error.URLError as e: - if not isinstance(e.args[0], socket.error): - raise - if e.args[0].errno == errno.ECONNREFUSED: - raise CouldNotConnect - raise - - -class PycURLGetter: - """Get data from URLs using PycURL.""" - - def __init__(self, _curl=None): - if _curl is None: - _curl = pycurl.Curl() - self.curl = _curl - self.result = BytesIO() - self.response_header = BytesIO() - self.curl.setopt(pycurl.HEADERFUNCTION, self.response_header.write) - self.curl.setopt(pycurl.WRITEFUNCTION, self.result.write) - self.verify_ssl = True - - def prepare_curl(self, request): - """Prepare the curl object for the supplied request. - - :param request: a urllib2.Request instance. - """ - self.curl.setopt(pycurl.URL, request.get_full_url()) - request_headers = ['%s: %s' % item for - item in list(request.headers.items())] - self.curl.setopt(pycurl.HTTPHEADER, request_headers) - self.curl.setopt(pycurl.SSL_VERIFYPEER, self.verify_ssl) - - @classmethod - def get_response_body(cls, request, verify_ssl=True, _curl=None): - """Return the body of the response to the supplied request. - - :param request: A urllib2.Request instance. - :param verify_ssl: If true, verify SSL certificates. - :param _curl: The pycurl.Curl object to use (for testing). - :raises CouldNotConnect: if there is a connection error. - :raises CertificateVerificationFailed: if the SSL certificate could - not be verified. - :raises HTTPError: if the response status is not 200. - """ - instance = cls(_curl) - instance.verify_ssl = verify_ssl - instance.prepare_curl(request) - return instance.handle_response() - - def handle_response(self): - """Perform the curl operation and handle the response. - - :return: The body of the response on success. - :raises CouldNotConnect: if there is a connection error. - :raises CertificateVerificationFailed: if the SSL certificate could - not be verified. - :raises HTTPError: if the response status is not 200. - """ - try: - self.curl.perform() - except pycurl.error as e: - if e.args[0] in (pycurl.E_COULDNT_CONNECT, - pycurl.E_COULDNT_RESOLVE_HOST): - raise CouldNotConnect - elif e.args[0] == pycurl.E_SSL_CACERT: - raise CertificateVerificationFailed - else: - raise - status = self.curl.getinfo(pycurl.HTTP_CODE) - if status == 200: - return self.result.getvalue().decode('utf-8') - else: - lines = self.response_header.getvalue().decode('utf-8').splitlines(True) - header_ = ''.join(lines[1:]) - headers = parse_headers(BytesIO(header_.encode('ascii'))) - raise urllib.error.HTTPError( - self.curl.getinfo(pycurl.EFFECTIVE_URL), status, - self.result.getvalue(), headers, None) - - -class GetMazaData: - """Base class for retrieving data from MAZA server.""" - - @classmethod - def run(cls, username, password, server_root=None, verify_ssl=True): - """Return the requested data. - - :param username: The username of the user. - :param password: The user's password. - :param server_root: The root URL to make queries to. - :param verify_ssl: If true, verify SSL certificates. - """ - return cls(username, password, server_root).get_data(verify_ssl) - - def __init__(self, username, password, server_root=None): - self.username = username - self.password = password - if server_root is not None: - self.server_root = server_root - else: - self.server_root = 'https://uccs.landscape.canonical.com' - self.getter = PycURLGetter - - def get_api_url(self): - """Return the URL for an API version.""" - return '%s/api/%s/' % (self.server_root, self.api_version) - - def get_data(self, verify_ssl=True): - """Return the data for this version of the API.""" - try: - return self.getter.get_response_body(self.make_request(), - verify_ssl) - except urllib.error.HTTPError as e: - if e.getcode() == 401: - raise Unauthorized - else: - raise - - -class GetMazaDataAPI1(GetMazaData): - """Get the maza data for a given email and password via API v1.""" - - api_version = 1 - - def make_request(self): - path = '%s/%s' % (quote(self.username), quote(self.password)) - return urllib.request.Request(self.get_api_url() + path) - - -class GetMazaDataAPI4(GetMazaData): - """Get the maza data for a given email and password via API v4.""" - api_version = 4 - - def get_url(self): - return self.get_api_url() - - def make_request(self): - request = urllib.request.Request(self.get_url()) - credentials = '%s:%s' % (self.username, self.password) - credentials64 = base64.encodebytes(credentials.encode('ascii')) - authorization = 'Basic %s' % credentials64.decode('ascii') - request.add_header('Authorization', authorization) - return request - - -class GetMazaDataAPI3(GetMazaDataAPI4): - """Get the maza data for a given email and password via API v3.""" - - api_version = 3 - - def get_url(self): - return self.get_api_url() + quote(self.username) - - -class GetMazaDataAPI2(GetMazaDataAPI3): - """Get the maza data for a given email and password via API v2.""" - - api_version = 2 - - -api_versions = { - '1': GetMazaDataAPI1, - '2': GetMazaDataAPI2, - '3': GetMazaDataAPI3, - '4': GetMazaDataAPI4, - 'default': GetMazaDataAPI4, -} |