黑群晖网络配置折腾记

from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkalidns.request.v20150109.DescribeSubDomainRecordsRequest import DescribeSubDomainRecordsRequest from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest from aliyunsdkalidns.request.v20150109.DeleteSubDomainRecordsRequest import DeleteSubDomainRecordsRequest from aliyunsdkalidns.request.v20150109.AddDomainRecordRequest import AddDomainRecordRequest from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest import requests from urllib.request import urlopen import json import subprocess import ssl import certifi import os import argparse import ipaddress import time import re import sys def getip(ipapi): context = ssl._create_unverified_context() ip = urlopen(ipapi,context=context).read() return str(ip, encoding='utf-8').strip() def update(RecordId, RR, Type, Value): # 修改域名解析记录 request = UpdateDomainRecordRequest() request.set_accept_format('json') request.set_RecordId(RecordId) request.set_RR(RR) request.set_Type(Type) request.set_Value(Value) response = client.do_action_with_exception(request) #print(response,flush=True) def add(DomainName, RR, Type, Value): # 添加新的域名解析记录 request = AddDomainRecordRequest() request.set_accept_format('json') request.set_DomainName(DomainName) request.set_RR(RR) request.set_Type(Type) request.set_Value(Value) response = client.do_action_with_exception(request) #print(response,flush=True) def updateRecord(subdomain,recordtype,ip): request = DescribeSubDomainRecordsRequest() request.set_accept_format('json') request.set_DomainName(domain) request.set_SubDomain(subdomain+ '.' + domain) request.set_Type(recordtype) try: response = client.do_action_with_exception(request) # 获取域名解析记录列表 #print(response,flush=True) except Exception as e: print("ERROR:",str(e),flush=True) return domain_list = json.loads(response) # 将返回的JSON数据转化为Python能识别的 #print(domain_list) #return if domain_list['TotalCount'] == 0: try: add(domain, subdomain,recordtype, ip) print("新建域名解析成功",flush=True) except Exception as e: print("ERROR:",str(e),flush=True) elif domain_list['TotalCount'] == 1: if domain_list['DomainRecords']['Record'][0]['Value'].strip() != ip.strip(): try: update(domain_list['DomainRecords']['Record'][0]['RecordId'], subdomain,recordtype, ip) print("修改域名解析成功",flush=True) except Exception as e: print("ERROR:",str(e),flush=True) else: print("IP地址没变",flush=True) elif domain_list['TotalCount'] > 1: request = DeleteSubDomainRecordsRequest() request.set_accept_format('json') request.set_DomainName(domain) request.set_RR(subdomain) request.set_Type(recordtype) try: response = client.do_action_with_exception(request) #print(response,flush=True) add(domain,subdomain, recordtype,ip) print("修改域名解析成功",flush=True) except Exception as e: print("ERROR:",str(e),flush=True) if __name__=='__main__': ap = argparse.ArgumentParser(description='Aliyun DDNS toll args.') ap.add_argument('--acid', type=str,required=True, help='aliyun accessKeyId') ap.add_argument('--acsec', type=str,required=True, help='aliyun accessSecret') ap.add_argument('--domain', type=str,required=True, help='domain name, exp. example.com') ap.add_argument('--subnames', type=str,nargs="*",default=['www','@'], help="sub domain name list , default ['www','@']") ap.add_argument('--iface', type=str,default='eth0', help='net card interface, which can be controlled by ifconfig, must run container use --privileged=true and --net=host args') ap.add_argument('--redo', type=int,default=300, help='rechek after redo second, default 300') ap.add_argument('--ipurl', type=str,default='https://api-ipv6.ip.sb/ip', help='url from where can get ip address as plain text') args = ap.parse_args() accessKeyId = args.acid # 将accessKeyId改成自己的accessKeyId accessSecret = args.acsec # 将accessSecret改成自己的accessSecret domain =args.domain # 你的主域名 names = args.subnames # 要进行ddns解析的子域名 iface = args.iface redo = args.redo ipurl = args.ipurl global client client = AcsClient(accessKeyId, accessSecret, 'cn-hangzhou') def getRecordType(ip): if re.compile("^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$").match(ip) : recordtype= "A" elif re.compile("^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}$").match(ip): recordtype= "AAAA" else: raise Exception("获取IP地址不正确,需检查并重新设置 ipurl") return recordtype def proc(): # 查看本机网卡是否可以被访问,可能因为域名解析服务不通畅造成网卡不断重启 if subprocess.call(['ping', '-c', '1', domain])!=0: cmd_pre = 'sudo ' if userid!='0' else '' userid = str(os.popen("id -u").readlines()[0]).strip() print('服务器不可访问,可能是上级路由停电等原因,可能需要手动重启网关或者路由,本机现尝试重启网卡...',flush=True) try: my_cmd = cmd_pre + ' ifdown ' +iface +' && '+cmd_pre + ' ifup ' + iface print(os.popen(my_cmd).readlines(),flush=True) except Exception as e: print('网卡重启失败,可能是iface设置不正确或者没有使用特权运行容器,现忽略错误继续运行,但可能无法成功修改解析记录,仍需人工干预',flush=True) try: ip=getip(ipurl) except Exception as e: print('未获取到本机IP地址',str(e),flush=True) return try : recordtype=getRecordType(ip) except Exception as e: print(str(e),flush=True) return print("获取到IP地址:{}".format(ip),flush=True) for subdom in names: print("subdomain:"+subdom,flush=True) updateRecord(subdom,recordtype,ip) while True: proc() time.sleep(redo) 

原文链接:https://www.cnblogs.com/bu-wu-zheng-ye/p/16580419.html

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享