Exemplo n.º 1
0
    def __request(self, method, path, payload={}):
        url = 'https://%s%s?%s' % (self.__endpoint,
                                   self.__parse_path(path)[:-1],
                                   self.__parse_query_string(path))
        data = json.dumps(payload).encode('utf8')
        sdk_date = self.__build_sdk_date()

        Logger.info('Request URL: ' + url)
        Logger.info('Request Data: ' + str(data))

        request = urllib2.Request(url=url, data=data)
        request.get_method = lambda: method
        request.add_header('Content-Type', 'application/json')
        request.add_header('Host', self.__endpoint)
        request.add_header('X-sdk-date', sdk_date)
        request.add_header('Authorization',
                           self.__build_authorization(request))
        Logger.info('Request headers: ' + str(request.headers))

        try:
            f = urllib2.urlopen(request, timeout=45)
            response = f.read().decode('utf-8')
            Logger.info(response)
            return response
        except urllib2.HTTPError as e:
            Logger.error('huaweicloud#__request raise urllib2.HTTPError: ' +
                         str(e))
            raise SystemExit(e)
Exemplo n.º 2
0
def auth(dns_type='aliyun', aliased_domain=None):
    try:
        if 'CERTBOT_DOMAIN' not in os.environ:
            raise Exception('Environment variable CERTBOT_DOMAIN is empty.')
        if 'CERTBOT_VALIDATION' not in os.environ:
            raise Exception(
                'Environment variable CERTBOT_VALIDATION is empty.')

        certbot_domain = aliased_domain or os.environ['CERTBOT_DOMAIN']
        certbot_validation = os.environ['CERTBOT_VALIDATION']

        Logger.info('manual#auth: Start to setting dns')
        Logger.info('manual#auth certbot_domain: ' + certbot_domain)
        Logger.info('manual#auth certbot_validation: ' + certbot_validation)

        maindomain, acme_challenge = __extract_maindomain_and_challenge(
            certbot_domain)

        client = __get_dns_client(dns_type)
        client.add_domain_record(maindomain, acme_challenge,
                                 certbot_validation)

        Logger.info('manual#auth: sleep %(time)i seconds' %
                    {'time': __get_wait_time()})
        time.sleep(__get_wait_time())

        Logger.info('manual#auth: Success.')
    except Exception as e:
        Logger.error('manual#auth raise Exception:' + str(e))
        sys.exit()
Exemplo n.º 3
0
 def get_domain_zone_id(self, domain):
     try:
         record = self.get_domain(domain)
         return record['id'] if record else None
     except Exception as e:
         Logger.error('huaweicloud#get_domain_zone_id raise: ' + str(e))
         return None
Exemplo n.º 4
0
def test(domain, dns_type='aliyun'):
    try:
        print('start to test ' + domain + ' in DNS ' + dns_type + ' API')

        client = __get_dns_client(dns_type)
        maindomain, acme_challenge = __extract_maindomain_and_challenge(domain)
        validation = ''.join(
            random.sample(string.ascii_letters + string.digits, 16))

        print('add TXT record(domain=' + maindomain + ', rr=' +
              acme_challenge + ', value=' + validation + ') to ' + dns_type +
              ' DNS')
        client.add_domain_record(maindomain, acme_challenge, validation)
        print('added TXT record')

        print('waiting %(time)i seconds...' % {'time': __get_wait_time()})
        time.sleep(__get_wait_time())

        print('remove above TXT record')
        client.delete_domain_record(maindomain, acme_challenge)
        print('removed TXT record')

        print('tested ' + domain + ' in DNS ' + dns_type + ' API')
    except Exception as e:
        Logger.error('test raise Exception:' + str(e))
        sys.exit()
Exemplo n.º 5
0
    def __compute_signature(self, params):
        sorted_params = sorted(params.items(), key=lambda params: params[0])

        query_string = ''
        for (k, v) in sorted_params:
            query_string += '&' + self.__percent_encode(
                k) + '=' + self.__percent_encode(str(v))

        string_to_sign = 'GET&%2F&' + self.__percent_encode(query_string[1:])
        try:
            if sys.version_info < (3, 0):
                digest = hmac.new(str(self.access_key_secret + "&"),
                                  str(string_to_sign), hashlib.sha1).digest()
            else:
                digest = hmac.new(
                    (self.access_key_secret + "&").encode(encoding="utf-8"),
                    string_to_sign.encode(encoding="utf-8"),
                    hashlib.sha1).digest()
        except Exception as e:
            Logger.error(e)

        if sys.version_info < (3, 1):
            signature = base64.encodestring(digest).strip()
        else:
            signature = base64.encodebytes(digest).strip()

        return signature
Exemplo n.º 6
0
    def __request(self, method, path, payload={}):
        url = 'https://%s%s%s' % (self.__host, self.__path, path)
        data = json.dumps(payload).encode('utf-8')
        Logger.info('Request URL: ' + url)
        Logger.info('Request Data: ' + str(data))

        request = urllib2.Request(url=url, data=data)
        request.add_header('Content-Type', 'application/json')
        request.add_header('Accept', 'application/json')

        if self.api_token:
            request.add_header('Authorization', 'Bearer %s' % (self.api_token))
        elif self.email and self.api_key:
            request.add_header('X-Auth-Email', self.email)
            request.add_header('X-Auth-Key', self.api_key)

        request.get_method = lambda: method

        try:
            f = urllib2.urlopen(request, timeout=45)
            response = f.read().decode('utf-8')
            Logger.info(response)
            return response
        except urllib2.HTTPError as e:
            Logger.error('cloudflare#__request raise urllib2.HTTPError: ' +
                         str(e))
            if e.code != 403:
                raise SystemExit(e)
Exemplo n.º 7
0
 def get_domain_recordset_id(self, domain, rr, _type='TXT'):
     try:
         record = self.get_domain_record(domain, rr, _type)
         return record['id'] if record else None
     except Exception as e:
         Logger.error('huaweicloud#get_domain_recordset_id raise: ' +
                      str(e))
         return None
Exemplo n.º 8
0
 def delete_domain_record(self, domain, rr, value, _type='TXT'):
     records = self.get_domain_records(domain, rr, _type)
     if records:
         for record in records:
             try:
                 self.__request(
                     'DELETE', '/%s/dns_records/%s' %
                     (record['zone_id'], record['id']))
             except Exception as e:
                 Logger.error(e)
     return
Exemplo n.º 9
0
 def get_domain(self, domain):
     try:
         response = self.__request(
             'GET', '/v2/zones?type=public&name=%s' % (domain))
         content = json.loads(response)
         return list(
             filter(lambda item: item['name'][:-1] == domain,
                    content['zones']))[0]
     except Exception as e:
         Logger.error('huaweicloud#get_domain raise: ' + str(e))
         return None
Exemplo n.º 10
0
 def __request(self, params):
     url = self.__compose_url(params)
     Logger.info('Request URL: ' + url)
     request = urllib2.Request(url)
     try:
         f = urllib2.urlopen(request, timeout=45)
         response = f.read().decode('utf-8')
         Logger.info(response)
         return response
     except urllib2.HTTPError as e:
         Logger.error('aliyun#__request raise urllib2.HTTPError: ' + str(e))
         raise SystemExit(e)
Exemplo n.º 11
0
 def get_domain_record(self, domain, rr, _type='TXT'):
     try:
         full_domain = '.'.join([rr, domain])
         response = self.__request(
             'GET', '/v2/recordsets?type=%s&name=%s' % (_type, full_domain))
         content = json.loads(response)
         return list(
             filter(
                 lambda record: record['name'][:-1] == full_domain and
                 record['type'] == _type, content['recordsets']))[0]
     except Exception as e:
         Logger.error('huaweicloud#get_domain_record raise: ' + str(e))
         return None
Exemplo n.º 12
0
 def get_domain_records(self, domain, rr, _type='TXT', per_page=100):
     zone_id = self.get_domain_zone_id(domain)
     if zone_id:
         try:
             path = '/%s/dns_records?match=all&type=%s&name=%s.%s&per_page=%s' % (
                 zone_id, _type, rr, domain, per_page)
             response = self.__request('GET', path)
             content = json.loads(response)
             if content['success'] and content['result']:
                 return content['result']
         except Exception as e:
             Logger.error(e)
     return
Exemplo n.º 13
0
    def get_domain_zone_id(self, domain):
        guesses_zone_names = Utils.guess_domain_names(domain)

        for zone_name in guesses_zone_names:
            try:
                path = '?per_page=1&match=all&name=%s' % (zone_name)
                response = self.__request('GET', path)
                content = json.loads(response)
                if content['success'] and content['result'] and content[
                        'result'][0]:
                    return content['result'][0]['id']
            except Exception as e:
                Logger.error(e)
        return
Exemplo n.º 14
0
 def add_domain_record(self, domain, rr, value, _type='TXT'):
     zone_id = self.get_domain_zone_id(domain)
     if zone_id:
         try:
             path = '/%s/dns_records' % (zone_id)
             payload = {
                 'name': '%s.%s' % (rr, domain),
                 'type': _type,
                 'content': value,
                 'ttl': 120,
                 'proxied': False
             }
             return self.__request('POST', path, payload)
         except Exception as e:
             Logger.error(e)
     return
Exemplo n.º 15
0
def __get_dns_client(dns_type='aliyun'):
    try:
        data = Config['dns'][dns_type]

        if 'aliyun' == dns_type:
            return dns.Aliyun(data['access_key_id'], data['access_key_secret'])
        elif 'qcloud' == dns_type:
            return dns.Qcloud(data['secret_id'], data['secret_key'])
        elif 'godaddy' == dns_type:
            return dns.GoDaddy(data['api_key'], data['api_secret'])
        elif 'huaweicloud' == dns_type:
            return dns.HuaweiCloud(data['access_key_id'],
                                   data['secret_access_key'])
        raise KeyError(dns_type)
    except KeyError as e:
        print('The ' + dns_type + ' DNS API is not be supported at persent')
        Logger.error('manual#get_dns raise KeyError: ' + str(e))
        sys.exit()
Exemplo n.º 16
0
def run():
    try:
        Logger.info('deploy#run deploy')

        if 'RENEWED_LINEAGE' not in os.environ:
            raise Exception('Environment variable RENEWED_LINEAGE is empty.')
        if 'RENEWED_DOMAINS' not in os.environ:
            raise Exception('Environment variable RENEWED_DOMAINS is empty.')

        Logger.info('deploy#run start to deploy cert: ' +
                    os.environ['RENEWED_LINEAGE'])
        Logger.info('deploy#run deploy domains: ' +
                    os.environ['RENEWED_DOMAINS'])

        deploy()

        Logger.info('deploy#run deployed cert')
    except Exception as e:
        Logger.error('deploy#run raise Exception:' + str(e))
Exemplo n.º 17
0
def deploy():
    try:
        servers = Config['deploy'].get('servers', None)

        if not (servers and len(servers) > 0):
            print('deploy servers is empty in config file')
            return

        for server in servers:
            if not server:
                continue
            if server.get('enable', False):
                script = build_script(server)
                os.system(script)
                time.sleep(1)
            else:
                print('server host: ' + server.get('host', 'Undefined') +
                      ' has been disable for deployment in config.json')
    except Exception as e:
        Logger.error('deploy#deploy raise Exception:' + str(e))
Exemplo n.º 18
0
def cleanup(dns_type='aliyun', aliased_domain=None):
    try:
        if 'CERTBOT_DOMAIN' not in os.environ:
            raise Exception('Environment variable CERTBOT_DOMAIN is empty.')

        certbot_domain = aliased_domain or os.environ['CERTBOT_DOMAIN']

        Logger.info('manual#cleanup: Start to cleanup dns')
        Logger.info('manual#cleanup: ' + certbot_domain)

        maindomain, acme_challenge = __extract_maindomain_and_challenge(
            certbot_domain)

        client = __get_dns_client(dns_type)
        client.delete_domain_record(maindomain, acme_challenge)

        Logger.info('manual#cleanup: Success.')
    except Exception as e:
        Logger.error('manual#cleanup raise Exception:' + str(e))
        sys.exit()
Exemplo n.º 19
0
    def __request(self, method, path, payload={}):
        url = 'https://%s%s%s' % (self.__host, self.__path, path)
        data = json.dumps(payload).encode('utf-8')
        Logger.info('Request URL: ' + url)
        Logger.info('Request Data: ' + str(data))

        request = urllib2.Request(url=url, data=data)
        request.add_header('Content-Type', 'application/json')
        request.add_header('Accept', 'application/json')
        request.add_header('Authorization',
                           'sso-key %s:%s' % (self.api_key, self.api_secret))
        request.get_method = lambda: method

        try:
            f = urllib2.urlopen(request, timeout=45)
            response = f.read().decode('utf-8')
            Logger.info(response)
            return response
        except urllib2.HTTPError as e:
            Logger.error('godaddy#__request raise urllib2.HTTPError: ' +
                         str(e))
            raise SystemExit(e)
Exemplo n.º 20
0
    humidity_img = Image.open(os.path.join(pic_dir, 'HUMIDITY.bmp'))
    today_date.paste(humidity_img, (150, 200))
    draw_date.text((180, 200), h + '%', font=font24, fill=0)

    logger.info("获取未来24小时气温")
    # 获取24小时气温数据
    weather_trend_draw()
    epd.display(epd.getbuffer(today_date), epd.getbuffer(today_weather))

except IndexError as e:
    epd = EPD()
    image = Image.new('1', (epd.width, epd.height), 255)
    draw = ImageDraw.Draw(image)
    fetcher_errors(image, draw)
    epd.display(epd.getbuffer(image), epd.getbuffer(image))
    logger.error(e)

except TypeError as e:
    epd = EPD()
    image = Image.new('1', (epd.width, epd.height), 255)
    draw = ImageDraw.Draw(image)
    fetcher_errors(image, draw)
    epd.display(epd.getbuffer(image), epd.getbuffer(image))
    logger.error(e)

except FileNotFoundError as e:
    epd = EPD()
    image = Image.new('1', (epd.width, epd.height), 255)
    draw = ImageDraw.Draw(image)
    fetcher_errors(image, draw)
    epd.display(epd.getbuffer(image), epd.getbuffer(image))