diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..0a8642f --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Zeppelin ignored files +/ZeppelinRemoteNotebooks/ diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml new file mode 100644 index 0000000..3b036cf --- /dev/null +++ b/.idea/checkstyle-idea.xml @@ -0,0 +1,15 @@ + + + + 10.12.2 + JavaOnly + + + \ No newline at end of file diff --git a/.idea/markdown.xml b/.idea/markdown.xml new file mode 100644 index 0000000..4e28a22 --- /dev/null +++ b/.idea/markdown.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..639900d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..bb83e26 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/scripts.iml b/.idea/scripts.iml new file mode 100644 index 0000000..f1316ad --- /dev/null +++ b/.idea/scripts.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/index.pb b/.idea/sonarlint/issuestore/index.pb new file mode 100644 index 0000000..e69de29 diff --git a/.idea/sonarlint/securityhotspotstore/index.pb b/.idea/sonarlint/securityhotspotstore/index.pb new file mode 100644 index 0000000..e69de29 diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ipv4_aliyun.py b/ipv4_aliyun.py new file mode 100644 index 0000000..d405f3b --- /dev/null +++ b/ipv4_aliyun.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" + @Time : 2023/08/23 + @Author : LXW + @Site : + @File : ipv4.py + @Software: PyCharm + @Description: + - 版本 + -- python==3.8 + -- alibabacloud_alidns20150109==3.0.7 + -- aliyun-python-sdk-domain==3.14.9 + - 依赖安装 + -- pip3 install alibabacloud_alidns20150109==3.0.7 + -- pip3 install aliyun-python-sdk-domain==3.14.9 +""" + +import json + +import requests +from alibabacloud_alidns20150109 import models as alidns_20150109_models +from alibabacloud_alidns20150109.client import Client as Alidns20150109Client +from alibabacloud_tea_openapi import models as open_api_models +from alibabacloud_tea_util import models as util_models +from alibabacloud_tea_util.client import Client as UtilClient + + +class RemoteIp: + def __init__(self, url, username, passwd): + self.url = url + self.username = username + self.passwd = passwd + + def __get_token(self): + _url = self.url + "/emby/Users/authenticatebyname?X-Emby-Client=Emby%20Web&X-Emby-Device-Name=Chrome%20macOS&X-Emby-Device-Id=fa6b7733-23fc-4cb7-bae3-d7f0536b485e&X-Emby-Client-Version=4.7.13.0&X-Emby-Language=zh-cn" + content = requests.post(_url, False, {"Username": self.username, "Pw": self.passwd}).text + return json.loads(content)["AccessToken"] + + def get_remote_addr(self): + token = self.__get_token() + full_url = self.url + "/emby/System/Info?X-Emby-Token=" + token + content = requests.get(full_url, False).text + addr = list(json.loads(content)["RemoteAddresses"]) + remote_add = str(addr[0]).split(":")[1].replace("/", "") + return remote_add + + +def request_params(request, value): + request.value = value + + +class AliyunOperation: + def __init__(self, access_key_id, access_secret): + """ + 初始化 + :param access_key_id: 阿里云AccessKey的ID + :param access_secret: 阿里云AccessKey的密码 + """ + config = open_api_models.Config( + # 必填,您的 AccessKey ID, + access_key_id=access_key_id, + # 必填,您的 AccessKey Secret, + access_key_secret=access_secret + ) + # Endpoint 请参考 https://api.aliyun.com/product/Alidns + config.endpoint = f'alidns.cn-hangzhou.aliyuncs.com' + self.client = Alidns20150109Client(config) + + def describe_subdomain_records(self, subdomain, domain_name): + """ + 子域名解析记录查询 https://api.aliyun.com/api/Alidns/2015-01-09/DescribeSubDomainRecords + 这个函数会返回一大堆东西,但是目前我们需要使用的就两个,一个是解析记录的数量,一个就是RecordId,RecordId修改域名解析时需要用到 + :param domain_name: + :param subdomain: + :return: + """ + describe_sub_domain_records_request = alidns_20150109_models.DescribeSubDomainRecordsRequest( + sub_domain=subdomain, + domain_name=domain_name + ) + runtime = util_models.RuntimeOptions() + try: + response = self.client.describe_sub_domain_records_with_options(describe_sub_domain_records_request, + runtime) + if 200 == response.status_code: + return response.body + except Exception as error: + # 如有需要,请打印 error + UtilClient.assert_as_string(error.message) + + def add_record(self, domain_name, rr, domain_type, value): + """ + 新增域名解析记录 https://api.aliyun.com/api/Alidns/2015-01-09/AddDomainRecord + 如果域名解析记录不存在时,就需要新增域名解析记录,新增域名解析记录比较简单,直接填写参数即可 + :param domain_name: 域名名称 baidu.com + :param rr: 主机记录。如果要解析@.exmaple.com,主机记录要填写”@”,而不是空。 + :param domain_type: 解析记录类型。https://help.aliyun.com/document_detail/29805.html?spm=api-workbench.api_explorer.0.0.6b1a134bcODqcI + :param value: 记录值。String + :return: + """ + add_domain_record_request = alidns_20150109_models.AddDomainRecordRequest( + domain_name=domain_name, + rr=rr, + type=domain_type, + value=value + ) + runtime = util_models.RuntimeOptions() + try: + response = self.client.add_domain_record_with_options(add_domain_record_request, runtime) + if 200 == response.status_code: + return response.body + except Exception as error: + # 如有需要,请打印 error + UtilClient.assert_as_string(error.message) + + def update_record(self, domain_type, value, rr, record_id): + """ + 更新域名解析记录 + 如果域名解析记录已存在,则不能使用新增,而是更新域名解析记录。更新的时候需要用到RecordId,这个一般查询的时候就会有返回,直接使用即可 + :param domain_type: 解析记录类型。https://help.aliyun.com/document_detail/29805.html?spm=api-workbench.api_explorer.0.0.6b1a134bcODqcI + :param value: 记录值。String + :param rr: 主机记录。如果要解析@.exmaple.com,主机记录要填写”@”,而不是空。 + :param record_id: 解析记录的ID + :return: + """ + update_domain_record_request = alidns_20150109_models.UpdateDomainRecordRequest( + record_id=record_id, + rr=rr, + type=domain_type, + value=value + ) + runtime = util_models.RuntimeOptions() + try: + # 复制代码运行请自行打印 API 的返回值 + self.client.update_domain_record_with_options(update_domain_record_request, runtime) + except Exception as error: + # 如有需要,请打印 error + UtilClient.assert_as_string(error.message) + + +def __execute(): + # 获取动态 IPV4 地址(如果是IPV6也可以用相同方式获取) + __remote_addr = __get_from_urls() + if "None" == __remote_addr: + __remote_addr = RemoteIp(url=__url, username=__username, passwd=__passwd).get_remote_addr() + print("current ipv4: " + __remote_addr) + __aliyun_client = AliyunOperation(access_key_id=__accessKeyId, access_secret=__accessSecret) + # 查询 example.com 主机下 test.example.com 域名的解析列表 + content = __aliyun_client.describe_subdomain_records("redirect.cnkj.site", "cnkj.site") + print("current desc domain content: " + str(content)) + if 0 == content.total_count: + # 新增一条 test.example.com 的IPV4域名解析记录(如果是IPV6地址,修改参数 domain_type 为 AAAA) + __aliyun_client.add_record("cnkj.site", "redirect", "A", __remote_addr) + elif 1 == content.total_count: + # 如果 test.example.com 域名解析已经存在,则进行更新操作 + source = content.domain_records.record[0] + record_id = source.record_id + if __remote_addr != source.value: + __aliyun_client.update_record("A", __remote_addr, "redirect", record_id) + # else: + # # 不推荐使用该方式进行域名解析更新,容易错误更新 + # sources = content.domain_records.record + # for source in sources: + # # 因为是更新IP,所以只考虑 A 或者 AAAA + # domain_type = source.type + # if "A" == domain_type or "AAAA" == domain_type: + # record_id = source.record_id + # rr = source.rr + # __aliyun_client.update_record(domain_type, __remote_addr, rr, record_id) + + +def __get_from_urls(): + """ + 通过url获取本地IP地址 + "https://myip4.ipip.net", + "https://ddns.oray.com/checkip", + "https://ip.3322.net", + "https://4.ipw.cn" + :return: ip + """ + ipw = "https://4.ipw.cn" + response = requests.get(ipw) + if 200 == response.status_code: + content = response.text + return content.strip() + ip = "https://ip.3322.net" + response = requests.get(ip) + if 200 == response.status_code: + content = response.text + return content.strip() + myip4 = "https://myip4.ipip.net" + response = requests.get(myip4) + if 200 == response.status_code: + content = response.text.split(":")[1] + content = content.replace("来自于", "") + return content.strip() + ddns = "https://ddns.oray.com/checkip" + response = requests.get(ddns) + if 200 == response.status_code: + content = response.text.split(":")[1] + return content.strip() + return "None" + + +if __name__ == '__main__': + __url = "http://127.0.0.1:8096" + __username = "emby" + __passwd = "emby_passwd" + __accessKeyId = "access_key_id" + __accessSecret = "access_key_secret" + __execute() diff --git a/ipv6_aliyun.sh b/ipv6_aliyun.sh new file mode 100644 index 0000000..aaa716a --- /dev/null +++ b/ipv6_aliyun.sh @@ -0,0 +1,111 @@ +# !/bin/bash + + +aliddnsipv6_ak="换成你阿里去AccessKdy的ID" #换成你阿里去AccessKdy的ID +aliddnsipv6_sk="换成你阿里云AccessKey的密码" #换成你阿里云AccessKey的密码 +aliddnsipv6_name1='test' #换成你的二级域名(随便填,自已记住就行) +aliddnsipv6_domain='domain.com' #换成你在阿里云注册的域名 +aliddnsipv6_ttl="600" + +if [ "$aliddnsipv6_name1" = "@" ] +then + aliddnsipv6_name=$aliddnsipv6_domain +else + aliddnsipv6_name=$aliddnsipv6_name1.$aliddnsipv6_domain +fi + +now=`date` + +die () { + echo $1 +} + +ipv6s=`ip addr show ovs_eth0 | grep "inet6.*global" | awk '{print $2}' | awk -F"/" '{print $1}'` || die "$ipv6" + +for ipv6 in $ipv6s +do + #ipv6 = $ipv6 + break +done + +echo $ipv6 + +current_ipv6=`nslookup -query=AAAA $aliddnsipv6_name 2>&1` +#echo $current_ipv6 + +current_ipv6=`echo "$current_ipv6" | grep 'Address: ' | tail -n1 | awk '{print $NF}'` +echo $current_ipv6 + +if [ "$?" -eq "0" ] +then + current_ipv6=`echo "$current_ipv6" | grep 'Address: ' | tail -n1 | awk '{print $NF}'` + echo $current_ipv6 + + if [ "$ipv6" = "$current_ipv6" ] + then + echo "skipping" + fi +# fix when A record removed by manual dns is always update error +else + unset aliddnsipv6_record_id +fi + + +timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"` + + +urlencode() { + # urlencode + out="" + while read -n1 c + do + case $c in + [a-zA-Z0-9._-]) out="$out$c" ;; + *) out="$out`printf '%%%02X' "'$c"`" ;; + esac + done + echo -n $out +} + +enc() { + echo -n "$1" | urlencode +} + +send_request() { + local args="AccessKeyId=$aliddnsipv6_ak&Action=$1&Format=json&$2&Version=2015-01-09" + local hash=$(echo -n "GET&%2F&$(enc "$args")" | openssl dgst -sha1 -hmac "$aliddnsipv6_sk&" -binary | openssl base64) + curl -s "http://alidns.aliyuncs.com/?$args&Signature=$(enc "$hash")" +} + +get_recordid() { + grep -Eo '"RecordId":"[0-9]+"' | cut -d':' -f2 | tr -d '"' +} + +query_recordid() { + send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$aliddnsipv6_name&Timestamp=$timestamp&Type=AAAA" +} + +update_record() { + send_request "UpdateDomainRecord" "RR=$aliddnsipv6_name1&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$aliddnsipv6_ttl&Timestamp=$timestamp&Type=AAAA&Value=$(enc $ipv6)" +} + +add_record() { + send_request "AddDomainRecord&DomainName=$aliddnsipv6_domain" "RR=$aliddnsipv6_name1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$aliddnsipv6_ttl&Timestamp=$timestamp&Type=AAAA&Value=$(enc $ipv6)" +} + +#add support */%2A and @/%40 record + + +if [ "$aliddnsipv6_record_id" = "" ] +then + aliddnsipv6_record_id=`query_recordid | get_recordid` + #echo '-----------------' $aliddnsipv6_record_id +fi +if [ "$aliddnsipv6_record_id" = "" ] +then + aliddnsipv6_record_id=`add_record | get_recordid` + echo "added record $aliddnsipv6_record_id" +else + update_record $aliddnsipv6_record_id + echo "updated record $aliddnsipv6_record_id" +fi \ No newline at end of file