mirror of
https://github.com/KevinMidboe/homeChecker.git
synced 2025-10-29 01:20:27 +00:00
89 lines
2.2 KiB
Python
Executable File
89 lines
2.2 KiB
Python
Executable File
#!/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())
|
|
|
|
|
|
|
|
|