#!/usr/bin/env python3 import sqlite3 from subprocess import check_output, CalledProcessError from time import time from re import findall from sys import argv from pprint import pprint path = "/home/kevin/homeChecker/home.db" def getOnlineClients(): try: arpOutput = check_output("sudo arp-scan -l", shell=True) arpOutput = arpOutput.decode() macAdr = findall('(([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2}))', arpOutput) return [i[0] for i in macAdr] except CalledProcessError: print("Not able to run 'arp-scan -l' on this machine.") exit(0) def getAddr(c): c.execute('SELECT adr FROM clients') return [i[0] for i in c.fetchall()] def getTimes(): conn = sqlite3.connect(path) c = conn.cursor() c.execute('SELECT c.name, l.timesince FROM lastonline AS l JOIN clients AS c WHERE l.clientadr=c.adr') returnList = [] for name, time in c.fetchall(): returnList.append({"name": name, "time": convertTime(time)}) conn.close() return returnList def convertTime(seconds): if not isinstance(seconds, (int, float)): return 'Null' delta = int(time() - seconds) if delta >= 86400: return str(delta//86400) + ' days' elif delta >= 3600: if delta//3600 < 10: parent = str(delta//3600) child = str((delta - (3600 * (delta//3600)))//60) if len(child) == 1: child = '0' + child return parent + ':' + child + ' hours' else: return str(delta//3600) + ' hours' elif delta >= 60: return str(delta//60) + ' minutes' else: return str(delta) + ' seconds' def updateTimes(): curTime = time() conn = sqlite3.connect(path) c = conn.cursor() online = list(set(getOnlineClients()) & set(getAddr(c))) for adr in online: c.execute('UPDATE lastonline SET timesince='+ "%0.2f" % curTime +' WHERE clientadr="'+ adr + '"') conn.commit() conn.close() return (online) if __name__ == '__main__': if argv[-1] == 'get': pprint(getTimes()) else: print("Updated following clients:", updateTimes())