Files
homeChecker/macLookup.py

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())