From 7380175ba090f0d46cf44a10fd8f0f7d867de5f1 Mon Sep 17 00:00:00 2001 From: rune Date: Thu, 23 Mar 2023 17:42:15 +0100 Subject: [PATCH] Added some more logging. Small fixes --- ddns.py | 51 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/ddns.py b/ddns.py index 978ae97..f116815 100755 --- a/ddns.py +++ b/ddns.py @@ -19,7 +19,7 @@ filepath = homefilepath.joinpath('.config/ddns') database = filepath.joinpath('ddns.db') logfile = filepath.joinpath('ddns.log') logging.basicConfig(filename=logfile,level=logging.INFO) -app_version = '0.4' +app_version = '0.4.1' def get_ip(): @@ -35,6 +35,7 @@ def get_ip(): return current_ip except Exception as e: error = str(e) + logging.error(time.strftime("%Y-%m-%d %H:%M") + ' - Error : ' + str(e)) return error else: return None @@ -47,7 +48,7 @@ def connect_database(): try: conn = sqlite3.connect(database) except Error as e: - logging.error(time.strftime("%Y-%m-%d %H:%M")+' - Error : ' + str(e)) + logging.error(time.strftime("%Y-%m-%d %H:%M") + ' - Error : ' + str(e)) print(e) finally: if conn: @@ -90,9 +91,11 @@ def api(api_value): count = cursor.fetchone()[0] if count == 0: cursor.execute('INSERT INTO apikey values(?,?)', (1, api_value)) + logging.info(time.strftime("%Y-%m-%d %H:%M") + ' - Info : API key added') print('Your API key has been added.') else: cursor.execute('UPDATE apikey SET api = ? WHERE id = 1',(api_value,)) + logging.info(time.strftime("%Y-%m-%d %H:%M") + ' - Info : API key updated') print('Your API key has been updated.') conn.commit() @@ -115,6 +118,7 @@ def add_domian(domain): else: cursor.execute('INSERT INTO domains values(?,?)', (None, domain,)) print('The domain [b]%s[/b] has been added to the DB' % (domain)) + logging.info(time.strftime("%Y-%m-%d %H:%M") + ' - Info : Domain %s added' %(domain)) conn.commit() @@ -159,6 +163,7 @@ def add_subdomain(domain): cursor.execute('INSERT INTO subdomains values(?,?,?,?,?)',(domainid,topdomain_id,sub,ip,None,)) conn.commit() print('The domain %s has been added.' % (domain)) + logging.info(time.strftime("%Y-%m-%d %H:%M") + ' - Info : subdomain %s added'%(domain)) else: return '[red]Error: %s [/red]' % (str(response)) @@ -191,6 +196,7 @@ def remove_subdomain(domain): response = requests.delete('https://api.digitalocean.com/v2/domains/'+top+'/records/' + subdomain_id, headers=headers) if str(response) == '': cursor.execute('DELETE from subdomains where id=?',(subdomain_id,)) + logging.info(time.strftime("%Y-%m-%d %H:%M") + ' - Info : Subdomain %s removed' %(domain)) conn.commit() else: print('[red]Error: [/red]An error occurred! Please try again later!') @@ -318,7 +324,7 @@ def show_current_info(): subdomains = cursor.fetchone()[0] - print('[b]ddns[/b] - a DigitalOcean dynamic DNS solution.') + print('\n[b]ddns[/b] - a DigitalOcean dynamic DNS solution.') print('===================================================') print('API key : [b]%s[/b]' % (API)) print('IP v4 resolver : [b]%s[/b]' % (ipserver)) @@ -344,6 +350,7 @@ def ip_server(ipserver, ip_type): else: cursor.execute('UPDATE ipservers SET ip4_server = ? WHERE id = 1',(ipserver,)) print('IP resolver (%s) for ipv%s updated.' % (ipserver, ip_type)) + logging.info(time.strftime("%Y-%m-%d %H:%M")+' - Info : IP resolver (%s) for ipv%s updated.' % (ipserver, ip_type)) conn.commit() elif ip_type == '6': cursor.execute('SELECT COUNT(ip6_server) FROM ipservers') @@ -355,6 +362,7 @@ def ip_server(ipserver, ip_type): else: cursor.execute('UPDATE ipservers SET ip6_server = ? WHERE id = 1',(ipserver,)) print('IP resolver (%s) for ipv%s updated. \n\r This IP version is not supported.' % (ipserver, ip_type)) + logging.info(time.strftime("%Y-%m-%d %H:%M") + ' - Info : IP resolver (%s) for ipv%s updated.' % (ipserver, ip_type)) conn.commit() @@ -365,7 +373,8 @@ def updateip(force): cursor = conn.cursor() cursor.execute('SELECT COUNT(*) FROM subdomains') count = cursor.fetchone()[0] - now = datetime.now() + now = datetime.now().strftime("%Y-%m-%d %H:%M") + updated = None if count == 0: print('[red]Error: [/red]There are no dynamic domains active.'\ ' Start by adding a new domain with [i]ddns -s test.example.com[/i]') @@ -385,6 +394,7 @@ def updateip(force): remoteData = json.loads(remote) remoteIP4 = remoteData['domain_record']['data'] if remoteIP4 != current_ip or force == True: + updated = True data = {'type': 'A', 'data': current_ip} headers = {'Authorization': 'Bearer ' + apikey, "Content-Type": "application/json"} response = requests.patch('https://api.digitalocean.com/v2/domains/'+domain_name+'/records/' + subdomain_id, data=json.dumps(data), headers=headers) @@ -392,13 +402,18 @@ def updateip(force): logging.error(time.strftime("%Y-%m-%d %H:%M")+' - Error : ' + str(response.json)) else: cursor.execute('UPDATE subdomains SET current_ip4=? WHERE id = ?',(current_ip,subdomain_id,)) - cursor.execute('UPDATE subdomains SET last_updated=? WHERE id = ?',(now.strftime("%d/%m/%Y %H:%M:%S"),subdomain_id,)) + cursor.execute('UPDATE subdomains SET last_updated=? WHERE id = ?',(now,subdomain_id,)) + cursor.execute('UPDATE subdomains SET last_checked=? WHERE id = ?',(now,subdomain_id,)) conn.commit() else: - cursor.execute('UPDATE subdomains SET last_checked=? WHERE id = ?',(now.strftime("%d/%m/%Y %H:%M:%S"),subdomain_id,)) + cursor.execute('UPDATE subdomains SET last_checked=? WHERE id = ?',(now,subdomain_id,)) conn.commit() - - + + if updated == None: + logging.info(time.strftime("%Y-%m-%d %H:%M") + ' - Info : No updated necessary') + else: + logging.info(time.strftime("%Y-%m-%d %H:%M") + ' - Info : Updates done. Use ddns -l domain.com to check domain') + def local_add_subdomain(domain,domainid): @@ -445,23 +460,27 @@ def updatedb(): add_column = "ALTER TABLE subdomains ADD COLUMN last_updated text default 'N/A'" conn.execute(add_column) conn.commit() + logging.info(time.strftime("%Y-%m-%d %H:%M")+' - Info : Database updated') new_table = 'last_checked' info = conn.execute("PRAGMA table_info('subdomains')").fetchall() if not any(new_table in word for word in info): add_column = "ALTER TABLE subdomains ADD COLUMN last_checked text default 'N/A'" conn.execute(add_column) - conn.commit() + conn.commit() + logging.info(time.strftime("%Y-%m-%d %H:%M") + ' - Info : Database updated') # Commandline arguments conn = connect_database() updatedb() + parser = argparse.ArgumentParser(prog='ddns', description='Application to use domains from DigitalOcean account as dynamic '\ 'DNS domain(s).\nThe app only supports IP4. IPv6 is planned for a later release!'\ - '\nYou\'ll always find the latest version on https://gitlab.pm/rune/ddns', + '\nYou\'ll always find the latest version on https://gitlab.pm/rune/ddns\n\n'\ + 'For bugs, suggestions, pull requests visit https://gitlab.pm/rune/ddns/issues', formatter_class=RawTextHelpFormatter, epilog='Making Selfhosting easier...') @@ -498,7 +517,7 @@ parser.add_argument('-r', '--remove', help='Remove a subdomain from your Digital parser.add_argument('-v', '--version', help='Show current version and config info', required=False, action='store_true') -parser.add_argument('-p', '--ipserver', help='Set IP server lookup to use. Indicate 4 or 6 for IP type.', +parser.add_argument('-p', '--ipserver', help='Sets or updates IP server lookup to use. Indicate 4 or 6 for IP type.', required=False, nargs=2, metavar=('ip4.iurl.no', '4'), action="append") args = vars(parser.parse_args()) @@ -528,13 +547,3 @@ elif args['local']: local_add_subdomain(args['local'][0][0],args['local'][0][1]) else: updateip(None) - - - - - - - - - -