Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
bigsk05 committed Feb 17, 2023
1 parent faa18c9 commit 74dcfb5
Show file tree
Hide file tree
Showing 4 changed files with 143 additions and 2 deletions.
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) <year> <copyright holders>
Copyright (c) <2023> <Ghink Universe Technology Inc.>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

Expand Down
14 changes: 13 additions & 1 deletion README.md
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 :)
126 changes: 126 additions & 0 deletions main.py
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.")

3 changes: 3 additions & 0 deletions requirements.txt
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

0 comments on commit 74dcfb5

Please sign in to comment.