The script it self can run forver now

* Add option for the script to repeat itself
  after N seconds

* Add a Dockerfile so that this could be run
  inside docker
This commit is contained in:
David Ervideira 2019-12-09 16:07:43 +00:00
parent d46419ef3d
commit b55e96d78c
3 changed files with 38 additions and 6 deletions

13
Dockerfile Normal file
View file

@ -0,0 +1,13 @@
FROM python:3.7-buster
LABEL maintainer=david@dme.ninja
LABEL version="0.1"
# Copy scripts and requirements.txt
COPY src/ /gandi-live-dns
COPY requirements.txt /requirements.txt
# Install script requirements.txt
RUN pip install -r /requirements.txt
CMD ["python", "/gandi-live-dns/gandi-live-dns.py", "-v", "-r", "3600"]

View file

@ -99,12 +99,14 @@ Status Code: 201 , DNS Record Created , IP updated for subdomain3
``` ```
root@dyndns:~/gandi-live-dns-master/src# ./gandi-live-dns.py -h root@dyndns:~/gandi-live-dns-master/src# ./gandi-live-dns.py -h
usage: gandi-live-dns.py [-h] [-f] usage: gandi-live-dns.py [-h] [-f] [-v] [-r]
optional arguments: optional arguments:
-h, --help show this help message and exit -h, --help show this help message and exit
-f, --force force an update/create -v, --verbose increase output verbosity
-f, --force force an update/create
-r REPEAT, --repeat REPEAT
keep running and repeat every N seconds
``` ```
The force option runs the script, even when no IP change has been detected. The force option runs the script, even when no IP change has been detected.
@ -135,6 +137,11 @@ Run the script every five minutes.
``` ```
*/5 * * * * /root/gandi-live-dns-master/src/gandi-live-dns.py >/dev/null 2>&1 */5 * * * * /root/gandi-live-dns-master/src/gandi-live-dns.py >/dev/null 2>&1
``` ```
### Run with Docker
Use the docker file to build the image. With docker, the script will run every 3600 seconds. (This value can be changed in the Dockerfile.
### Limitations ### Limitations
The XML-RPC API has a limit of 30 requests per 2 seconds, so i guess it's safe to update 25 subdomains at once with the REST API. The XML-RPC API has a limit of 30 requests per 2 seconds, so i guess it's safe to update 25 subdomains at once with the REST API.

View file

@ -4,10 +4,12 @@
Gandi v5 LiveDNS - DynDNS Update via REST API and CURL/requests Gandi v5 LiveDNS - DynDNS Update via REST API and CURL/requests
@author: cave @author: cave
@author: dvdme
License GPLv3 License GPLv3
https://www.gnu.org/licenses/gpl-3.0.html https://www.gnu.org/licenses/gpl-3.0.html
Created on 13 Aug 2017 Created on 13 Aug 2017
Forked on 08 Dec 2019
http://doc.livedns.gandi.net/ http://doc.livedns.gandi.net/
http://doc.livedns.gandi.net/#api-endpoint -> https://dns.gandi.net/api/v5/ http://doc.livedns.gandi.net/#api-endpoint -> https://dns.gandi.net/api/v5/
''' '''
@ -17,6 +19,7 @@ import requests
import ipaddress import ipaddress
import config import config
import argparse import argparse
import threading as th
from pprint import pprint from pprint import pprint
@ -111,7 +114,7 @@ def update_records(uuid, dynIP, subdomain, is_ipv6=False, verbose=False):
def main(force_update, verbosity): def main(force_update, verbosity, repeat):
if verbosity: if verbosity:
print('verbosity turned on') print('verbosity turned on')
@ -119,6 +122,9 @@ def main(force_update, verbosity):
else: else:
verbose =False verbose =False
if repeat and verbose:
print(f'repeat turned on, will repeat every {repeat} seconds')
#get zone ID from Account #get zone ID from Account
uuid = get_uuid() uuid = get_uuid()
@ -150,10 +156,16 @@ def main(force_update, verbosity):
print (f'IP Address Mismatch - going to update the DNS Records for the subdomains with new IP {dynIP}') print (f'IP Address Mismatch - going to update the DNS Records for the subdomains with new IP {dynIP}')
for sub in subdomains: for sub in subdomains:
update_records(uuid, dynIP, sub, is_ipv6, verbose) update_records(uuid, dynIP, sub, is_ipv6, verbose)
if repeat:
if verbosity:
print(f'Repeating in {repeat} seconds')
th.Timer(repeat, main, [force_update, verbosity, repeat]).start()
if __name__ == '__main__': if __name__ == '__main__':
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose', help='increase output verbosity', action='store_true') parser.add_argument('-v', '--verbose', help='increase output verbosity', action='store_true')
parser.add_argument('-f', '--force', help='force an update/create', action='store_true') parser.add_argument('-f', '--force', help='force an update/create', action='store_true')
parser.add_argument('-r', '--repeat', type=int, help='keep running and repeat every N seconds')
args = parser.parse_args() args = parser.parse_args()
main(args.force, args.verbose) main(args.force, args.verbose, args.repeat)