-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
143 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,15 @@ | ||
# AliDDNS | ||
|
||
DDNS Plugin with Aliyun | ||
DDNS Plugin with Aliyun | ||
|
||
## Installation | ||
|
||
Install all requirments with follow command: | ||
|
||
`pip install -r requirements.txt` | ||
|
||
## Running | ||
|
||
1. Configure class in `main.py`, write down your credential and domain. | ||
2. Keep this script running on your machine, like running through `systemctl`. | ||
3. Enjoy :) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
import time | ||
import threading | ||
import json | ||
|
||
import requests | ||
|
||
from aliyunsdkcore.client import AcsClient | ||
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest | ||
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest | ||
|
||
class AliDDNS(object): | ||
def __init__(self, | ||
domain, record, | ||
id, secret, | ||
sleep = 600, | ||
ipv4 = True, ipv6 = True, | ||
v4api = "https://ipv4.gh.ink", | ||
v6api = "https://ipv6.gh.ink"): | ||
|
||
assert domain.count(".") == 1 and \ | ||
not domain.startswith(".") and \ | ||
not domain.endswith(".") | ||
|
||
self.domain = domain | ||
self.record = record | ||
self.sleep = sleep | ||
self.ipv4 = ipv4 | ||
self.ipv6 = ipv6 | ||
self.v4api = v4api | ||
self.v6api = v6api | ||
|
||
self.__client = AcsClient(id, secret, 'cn-hangzhou') | ||
|
||
daemon = threading.Thread(target=self.__daemon, name="Daemon Thread") | ||
daemon.daemon = True | ||
daemon.start() | ||
|
||
def __daemon(self): | ||
while True: | ||
self.refresh() | ||
time.sleep(self.sleep) | ||
|
||
def refresh(self): | ||
# Get local public ipv4 address | ||
if self.ipv4: | ||
try: | ||
self.__v4 = requests.get(self.v4api).text | ||
except Exception as e: | ||
print("Failed to get local public ipv4 address,", e) | ||
else: | ||
print("Your ipv4 address is:", self.__v4) | ||
|
||
describe_v4 = DescribeDomainRecordsRequest() | ||
describe_v4.set_accept_format('json') | ||
|
||
describe_v4.set_DomainName(self.domain) | ||
describe_v4.set_RRKeyWord(self.record) | ||
describe_v4.set_TypeKeyWord("A") | ||
|
||
describeback_v4 = self.__client.do_action_with_exception(describe_v4) | ||
|
||
recordlist_v4 = json.loads(describeback_v4) | ||
recordid_v4 = recordlist_v4['DomainRecords']['Record'][0]['RecordId'] | ||
value_v4 = recordlist_v4['DomainRecords']['Record'][0]['Value'] | ||
|
||
if value_v4 != self.__v4: | ||
print('Your ipv4 address has been changed, update now.') | ||
update_v4 = UpdateDomainRecordRequest() | ||
update_v4.set_accept_format('json') | ||
|
||
update_v4.set_RecordId(recordid_v4) | ||
update_v4.set_Value(self.__v4) | ||
update_v4.set_Type("A") | ||
update_v4.set_RR(self.record) | ||
|
||
self.__client.do_action_with_exception(update_v4) | ||
print('Your ipv4 record has been updated successfully.') | ||
|
||
|
||
# Get local public ipv6 address | ||
if self.ipv6: | ||
try: | ||
self.__v6 = requests.get(self.v6api).text | ||
except Exception as e: | ||
print("Failed to get local public ipv4 address,", e) | ||
else: | ||
print("Your ipv6 address is:", self.__v6) | ||
|
||
describe_v6 = DescribeDomainRecordsRequest() | ||
describe_v6.set_accept_format('json') | ||
|
||
describe_v6.set_DomainName(self.domain) | ||
describe_v6.set_RRKeyWord(self.record) | ||
describe_v6.set_TypeKeyWord("AAAA") | ||
|
||
describeback_v6 = self.__client.do_action_with_exception(describe_v6) | ||
|
||
recordlist_v6 = json.loads(describeback_v6) | ||
recordid_v6 = recordlist_v6['DomainRecords']['Record'][0]['RecordId'] | ||
value_v6 = recordlist_v6['DomainRecords']['Record'][0]['Value'] | ||
|
||
if value_v6 != self.__v6: | ||
print('Your ipv6 address has been changed, update now.') | ||
update_v6 = UpdateDomainRecordRequest() | ||
update_v6.set_accept_format('json') | ||
|
||
update_v6.set_RecordId(recordid_v6) | ||
update_v6.set_Value(self.__v6) | ||
update_v6.set_Type("AAAA") | ||
update_v6.set_RR(self.record) | ||
|
||
self.__client.do_action_with_exception(update_v6) | ||
print('Your ipv6 record has been updated successfully.') | ||
|
||
if __name__ == "__main__": | ||
dns = AliDDNS("MainDomain.com", "SubDomain", "AccessKey ID", "AccessKey Secret") | ||
|
||
while True: | ||
cmd = input() | ||
if cmd == "exit": | ||
break | ||
elif cmd == "refresh": | ||
dns.refresh() | ||
else: | ||
print("Unknown command.") | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
requests==2.26.0 | ||
aliyun-python-sdk-core==2.13.36 | ||
aliyun-python-sdk-alidns==3.0.1 |