#!/usr/bin/env python3 # # Copyright (C) 2018-2020 VyOS maintainers and contributors # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 or later as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import os import argparse import jinja2 import sys import time from vyos.config import Config from vyos.util import call cache_file = r'/run/ddclient/ddclient.cache' OUT_TMPL_SRC = """ {% for entry in hosts %} ip address : {{ entry.ip }} host-name : {{ entry.host }} last update : {{ entry.time }} update-status: {{ entry.status }} {% endfor %} """ def show_status(): # A ddclient status file must not always exist if not os.path.exists(cache_file): sys.exit(0) data = { 'hosts': [] } with open(cache_file, 'r') as f: for line in f: if line.startswith('#'): continue outp = { 'host': '', 'ip': '', 'time': '' } if 'host=' in line: host = line.split('host=')[1] if host: outp['host'] = host.split(',')[0] if 'ip=' in line: ip = line.split('ip=')[1] if ip: outp['ip'] = ip.split(',')[0] if 'mtime=' in line: mtime = line.split('mtime=')[1] if mtime: outp['time'] = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(int(mtime.split(',')[0], base=10))) if 'status=' in line: status = line.split('status=')[1] if status: outp['status'] = status.split(',')[0] data['hosts'].append(outp) tmpl = jinja2.Template(OUT_TMPL_SRC) print(tmpl.render(data)) def update_ddns(): call('systemctl stop ddclient.service') if os.path.exists(cache_file): os.remove(cache_file) call('systemctl start ddclient.service') if __name__ == '__main__': parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group() group.add_argument("--status", help="Show DDNS status", action="store_true") group.add_argument("--update", help="Update DDNS on a given interface", action="store_true") args = parser.parse_args() # Do nothing if service is not configured c = Config() if not c.exists_effective('service dns dynamic'): print("Dynamic DNS not configured") sys.exit(1) if args.status: show_status() elif args.update: update_ddns()