#!/usr/bin/env python3 # -*- coding: UTF-8 -*- # Ein Python3-Script zur Generierung der HTML-Status-Seite des RasPi-Trackers. # Detlev Ahlgrimm 06./07.2016 # # v1.0 26.06.2016 erste Version # v1.1 29.06.2016 Bestätigungs-Seite zugefügt + Kommunikation mit Tracker # v1.2 03.07.2016 "warn" zugefügt + weitere Attribute anzeigen # v1.2a 04.07.2016 disable von "Stop Tracker", wenn GPS_tracker.py nicht läuft # v1.3 12.07.2016 Überwachung und Stop von kismet_server zugefügt import cgi import os import sys import subprocess import time import socket MOUNTPOINT_USB_STICK="/home/dede/usbstick" TRACK_DIR="/home/dede/usbstick/recordings" # ###################################################################### # Schreibt "strg" ins syslog. def writeLog(strg): subprocess.call(["logger", "status.py3: %s"%(strg,)]) # ###################################################################### # Fragt bei GPS_tracker.py mit der Meldung "req_str" an und liefert # die zurückgemeldeten Daten als String oder None bei Fehler. def getViaSocket(req_str, hostport=("127.0.0.1", 42424)): s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) good=True try: s.connect(hostport) except socket.error as msg: s.close() good=False if good==True: s.send(bytes(req_str, "UTF-8")) lns=s.recv(1024) s.close() return(lns.decode()) return(None) # ###################################################################### # Liefert die GPS-Daten von GPS_tracker.py als Liste aus 6 Strings. def getGPSdata(): lns=getViaSocket("GET DATA") if lns is None: return(["?", "?", "?", "?", "?", "?"]) return(lns.split(";")) # ###################################################################### # Schickt die Meldung "STOP TRACKER" an GPS_tracker.py. def stopTracker(): getViaSocket("STOP TRACKER") # ###################################################################### # Schickt die Meldung "STOP KISMET" an GPS_tracker.py. def stopKismet(): getViaSocket("STOP KISMET") # ###################################################################### # Führt die Kommandos gemäß der Liste "cmds" aus und liefert dessen # Rückgabe als String. def execute(cmds): process=subprocess.Popen(cmds, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL) rc=process.communicate()[0] return(rc.decode()) # ###################################################################### # Liefert zu einem Interface-Namen dessen IPv4-Adresse. # Die IPv4-Adress-Zeile wird in folgendem Format erwartet: # inet Adresse:192.168.178.26 Bcast:192.168.178.255 Maske:255.255.255.0 def get_ip_address(ifname): rc=execute(["/sbin/ifconfig", ifname]) for ln in rc.split('\n'): # zeilenweise über den Rückgabestring lns=ln.strip() # Zeile ohne führende Leerzeichen if lns.startswith("inet "): # wenn Zeile mit "inet " beginnt p1=lns.find(':') # ":" suchen p2=lns.find(' ', p1+1) # " " suchen if p1>0 and p2>0: # wenn ":" und " " gefunden wurde return(lns[p1+1:p2]) # dann liegt die IP-Adresse zwischen ":" und " " return("") # ###################################################################### # Liefert ein leeres Dictionary für collectAllData(), bei dem alle # Elemente existieren. def initDataDict(): data= { "time" : "", "uptime" : "", "USB-stick found" : "", "GPS-stick found" : "", "GPS-service up" : "", "GPS-tracker up" : "", "Latitude" : "", # 0 @ getGPSdata() "Longitude" : "", # 1 @ getGPSdata() "Satellite count" : "", # 2 @ getGPSdata() "Tracks written" : "", # 3 @ getGPSdata() "server IP" : "", "warning" : "", "Tracker running" : "", # 4 @ getGPSdata() "Speed" : "0.0", # 5 @ getGPSdata() "kismet running" : "", } return(data) # ###################################################################### # Sammelt die Werte der anzuzeigenden Attribute und gibt diese als # Dictionary zurück. def collectAllData(): data=initDataDict() data.update({"time":time.strftime("%d.%m.%Y %H:%M:%S")}) rc=execute(["uptime", "-p"]) data.update({"uptime":rc}) warn=False rc=execute(["df", "-hT"]) if rc.find(MOUNTPOINT_USB_STICK)>=0: data.update({"USB-stick found":True}) else: data.update({"USB-stick found":False}) warn=True if os.path.exists("/dev/gps0"): data.update({"GPS-stick found":True}) else: data.update({"GPS-stick found":False}) warn=True rc=execute(["ps", "aux"]) if rc.find("/usr/sbin/gpsd")>=0: data.update({"GPS-service up":True}) else: data.update({"GPS-service up":False}) warn=True if rc.find("GPS_tracker.py")>=0: data.update({"GPS-tracker up":True}) else: data.update({"GPS-tracker up":False}) warn=True if rc.find("kismet_server")>=0: data.update({"kismet running":True}) else: data.update({"kismet running":False}) warn=True try: gpsdata=getGPSdata() data.update({"Latitude":gpsdata[0]}) data.update({"Longitude":gpsdata[1]}) data.update({"Satellite count":gpsdata[2]}) data.update({"Tracks written":gpsdata[3]}) data.update({"Tracker running":gpsdata[4]}) data.update({"Speed":gpsdata[5]}) except: pass if data["Tracker running"]=="0": warn=True try: if int(data["Satellite count"])<3: warn=True except: warn=True data.update({"warning":warn}) return(data) # ###################################################################### # Stellt eine Tabellen-Zeile gemäß "attr", "icon" und "value" dar. ICON_G= { "OK" :'', "WARN":'', "ERR" :'', "" :'' } def printTableRow(attr="", icon="", value=""): print('
'*8)
print('
') print('
') print('') # ###################################################################### # Stellt eine Bestätigungs-Seite dar. # Die Seite wird verlassen mit # action=OK... "action_name" oder # action=Abbrechen # ...worauf dann entsprechend reagiert werden kann. def printHTML_confirm(action_name): print("Content-type: text/html\n") print('') #print('') #print('') print('Bitte bestätigen :') print('