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)
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()
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
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()
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
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)
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
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
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
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)
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
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
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
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
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()
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))
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))
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()
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)
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))