Init
This commit is contained in:
commit
b08a181cf3
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.vscode
|
||||||
|
.DS_Store
|
||||||
|
settings.conf
|
||||||
|
test.py
|
||||||
19
README.md
Normal file
19
README.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# Namesilo updater
|
||||||
|
|
||||||
|
## Prerequisite
|
||||||
|
|
||||||
|
`NAMESILO_API` in environment variable
|
||||||
|
|
||||||
|
`settings.conf` in the same directory
|
||||||
|
|
||||||
|
[default]
|
||||||
|
domain=example.com
|
||||||
|
subdomain=dynamic
|
||||||
|
|
||||||
|
### Python3 library
|
||||||
|
|
||||||
|
You probably don't need anything extra from python3. Tested on python 3.5.2 and 3.6.4
|
||||||
|
|
||||||
|
## What to make this works?
|
||||||
|
|
||||||
|
Adding `python3 update.py` to crontab should do the trick. Once a day should be enough IMHO.
|
||||||
88
update.py
Normal file
88
update.py
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
import configparser
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
from requests import get
|
||||||
|
|
||||||
|
BASE_URL = 'https://www.namesilo.com/api/dnsUpdateRecord?version=1&type=xml&'
|
||||||
|
UPDATE_URL = '{base}key={key}&domain={domain}&rrid={rrid}&' \
|
||||||
|
'rrhost={host}&rrvalue={new_value}&rrttl=7207'
|
||||||
|
LIST_URL = '{base}key={key}&domain={domain}'
|
||||||
|
|
||||||
|
EVERYDAY_IP_SERVICE = 'https://tool.everyday.in.th/ip?format=text'
|
||||||
|
|
||||||
|
'''Updater procedure
|
||||||
|
1. Getch a new public IP
|
||||||
|
2. Get a namesilo's DNS
|
||||||
|
3. check if 1 & 2 are different, then Update
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
def get_public_ip():
|
||||||
|
'''Get current public IP
|
||||||
|
|
||||||
|
return IP or None
|
||||||
|
'''
|
||||||
|
res = get(EVERYDAY_IP_SERVICE)
|
||||||
|
if res.status_code != 200:
|
||||||
|
return None
|
||||||
|
return res.text.strip()
|
||||||
|
|
||||||
|
def get_namesilo_dns(key, domain, target_host):
|
||||||
|
res = get(LIST_URL.format(base=BASE_URL, key=key, domain=domain))
|
||||||
|
if res.status_code != 200:
|
||||||
|
return None
|
||||||
|
tree = ET.fromstring(res.text.strip())
|
||||||
|
for i in tree.iter('resource_record'):
|
||||||
|
host = i.find('./host').text
|
||||||
|
if host == target_host:
|
||||||
|
return {
|
||||||
|
'rrid': i.find('./host').text,
|
||||||
|
'value': i.find('./value').text,
|
||||||
|
'host': host,
|
||||||
|
}
|
||||||
|
break
|
||||||
|
return {}
|
||||||
|
|
||||||
|
|
||||||
|
def update_namesilo_data(key, domain, rrid, subdomain, new_value):
|
||||||
|
res = get(UPDATE_URL.format(base=BASE_URL, key=key, domain=domainม
|
||||||
|
rrid=rrid, host=host, new_value=new_value))
|
||||||
|
if res.status_code != 200:
|
||||||
|
return None
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
api_key = os.environ['NAMESILO_API']
|
||||||
|
if not api_key:
|
||||||
|
print('NAMESILO_API in env is not found.')
|
||||||
|
sys.exit()
|
||||||
|
print('KEY: {}...'.format(api_key[:3]))
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read('settings.conf')
|
||||||
|
domain = config['default']['domain']
|
||||||
|
subdomain = config['default']['subdomain']
|
||||||
|
target = '{}.{}'.format(subdomain, domain)
|
||||||
|
print('TARGET: {}'.format(target))
|
||||||
|
public_ip = get_public_ip()
|
||||||
|
print('PUBLIC IP: {}..'.format(public_ip[:-5]))
|
||||||
|
namesilo_data = get_namesilo_dns(api_key, domain, target)
|
||||||
|
if not namesilo_data:
|
||||||
|
print('NAMESILO API service is down or target not found')
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
if namesilo_data['value'] == public_ip:
|
||||||
|
print('Current value is okay. No need to do anything')
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
rrid = namesilo_data['rrid']
|
||||||
|
result = update_namesilo_data(api_key, domain, rrid, subdomain, public_ip)
|
||||||
|
if not result:
|
||||||
|
print('Updating process failed.')
|
||||||
|
sys.exit()
|
||||||
|
print('Updated to a new IP: {}'.format(public_ip))
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
Loading…
x
Reference in New Issue
Block a user