#!/usr/bin/env python # -*- coding: utf-8 -*- # Author : Steven Harper # License : GNU GENERAL PUBLIC LICENSE # TODO : Use 1 get on dmesg and access it multiple times import commands class USBAdslModemStatus: def __init__( self, modem_manager): self.debug = True self.modem_manager = modem_manager if self.debug:print("Status Started") self.actual_lastModemConnected = 0; self.wrong_firmware = False def extractLatestLineNum(self, output): lines = output.splitlines(False) if len(lines) > 0: line = lines[len(lines)-1] bits = line.split(":",1) if len(bits) > 1 : mayBeAnInt = bits[0] if mayBeAnInt.isdigit(): return int(mayBeAnInt) return 0; def extractConnectionDetail(self, output): # ADSL line is up (2272 kb/s down | 288 kb/s up) lines = output.splitlines(False) if len(lines) > 0: line = lines[len(lines)-1] bits = line.split("ADSL line is up ") if len(bits) > 1: return bits[len(bits)-1] return "" def updateStatus(self): if self.debug: print "----------STARTING DETECTION----------" self.status_noFirmware = False self.status_noFirmware_lastLine = 0 noFirmwareStr = commands.getoutput("dmesg | grep -n speedtch | grep \"no stage 1 firmware\"") if len(noFirmwareStr) > 0: self.status_noFirmware_lastLine = self.extractLatestLineNum(noFirmwareStr) if self.debug: print "DET : Firmware not Found in dmesg at line", self.status_noFirmware_lastLine self.status_noFirmware = True self.status_firmwareStage1 = False self.status_firmwareStage1_lastLine = 0 firmwareStage1Str = commands.getoutput("dmesg | grep -n \"found stage 1 firmware speedtch-1.bin\"") if len(firmwareStage1Str) > 0: self.status_firmwareStage1_lastLine = self.extractLatestLineNum(firmwareStage1Str) if self.debug:print "DET : Stage 1 Firmware Found in dmesg at line", self.status_firmwareStage1_lastLine self.status_firmwareStage1 = True self.status_firmwareStage2 = False self.status_firmwareStage2_lastLine = 0 firmwareStage2Str = commands.getoutput("dmesg | grep -n \"found stage 2 firmware speedtch-2.bin\"") if len(firmwareStage2Str) > 0: self.status_firmwareStage2_lastLine = self.extractLatestLineNum(firmwareStage2Str) if self.debug:print "DET : Stage 2 Firmware Found in dmesg at line", self.status_firmwareStage2_lastLine self.status_firmwareStage2 = True self.status_noModem = True self.status_modemId = "" self.status_modemName = "" self.status_modemIdAsInt = -1.0 #print (self.modem_manager.sudo_command+" \"lsusb -vvv\" | grep -A 1 4061 | tail -1 | awk '{print $2}'") noModemVersion = commands.getoutput(self.modem_manager.sudo_command+" \"lsusb -vvv\" | grep -A 1 4061 | tail -1 | awk '{print $2}'") if self.debug:print "DET : lsusb response is " + noModemVersion if len(noModemVersion) > 0: self.status_noModem = False self.status_modemId = noModemVersion self.status_modemName = "Speedtouch 330" self.status_modemIdAsInt = float( self.status_modemId); if self.debug:print "DET : Modem Found in lsusb -vvv : " + self.status_modemId else : if self.debug:print "DET : Modem Not Found in lsusb -vvv" self.status_synchronising = False self.status_synchronising_lastLine = 0 synchronising = commands.getoutput("dmesg | grep -n \"ADSL line is synchronising\"") if len(synchronising) > 0: self.status_synchronising_lastLine = self.extractLatestLineNum(synchronising) if self.debug:print "DET : synchronising found in dmesg at line",self.status_synchronising_lastLine self.status_synchronising = True self.status_lineUp = False self.status_lineUp_lastLine = 0 self.status_lineUp_details = commands.getoutput("dmesg | grep -n \"ADSL line is up\"") if len(self.status_lineUp_details) > 0: self.status_lineUp_lastLine = self.extractLatestLineNum(self.status_lineUp_details) self.status_lineUp_details = self.extractConnectionDetail(self.status_lineUp_details) if self.debug:print "DET : ADSL Line is up found in dmesg at line", self.status_lineUp_lastLine,"details:", self.status_lineUp_details self.status_lineUp = True self.status_lineDown = False self.status_lineDown_lastLine = 0 lineDown = commands.getoutput("dmesg | grep -n \"ADSL line is down\"") if len(lineDown) > 0: self.status_lineDown_lastLine = self.extractLatestLineNum(lineDown) if self.debug:print "DET : ADSL Line is down found in dmesg at line",self.status_lineDown_lastLine self.status_lineDown = True badFirmware = commands.getoutput("dmesg | grep -n \"read BLOCK2 from modem failed\"") self.wrong_firmware_lastLine = 0 if len(badFirmware) > 0: self.wrong_firmware = True; self.wrong_firmware_lastLine =self.extractLatestLineNum(badFirmware) if self.debug: print "Bad Firmware found in dmesg at",self.wrong_firmware_lastLine,"details:",badFirmware badFirmware = commands.getoutput("dmesg | grep -n \"firmware upload failed\"") if len(badFirmware) > 0: self.wrong_firmware_lastLine =self.extractLatestLineNum(badFirmware) if self.debug: print "Bad Firmware found in dmesg at",self.wrong_firmware_lastLine,"details:",badFirmware self.wrong_firmware = True; ipDetect = commands.getoutput("ifconfig ppp0 | awk '/inet addr:/ {print $2}'") if ipDetect.find("ppp0: error") > -1: self.connection_ip_detail = "" if self.debug: print "ifconfig returns error",ipDetect else : self.connection_ip_detail = ipDetect if self.debug: print "Found this from ifconfig",ipDetect return self.makeSenseOfStatus() def makeSenseOfStatus(self): self.actual_connected = False lastDisconnectOrConnect = 0; self.actual_modemConnected = False self.actual_syncronizing = False self.actual_firmwareOk = False #print self.status_firmwareStage2_lastLine #print self.wrong_firmware_lastLine #print self.status_noFirmware_lastLine if self.status_firmwareStage1 and self.status_firmwareStage2 and (self.status_firmwareStage2_lastLine > self.wrong_firmware_lastLine and self.status_firmwareStage2_lastLine > self.status_noFirmware_lastLine): self.actual_firmwareOk = True if self.wrong_firmware and not self.actual_firmwareOk: self.actual_firmwareOk = False if self.status_noFirmware and not self.actual_firmwareOk: self.actual_firmwareOk = False if self.status_noModem == False: self.actual_modemConnected = True self.actual_lastModemConnected = self.status_firmwareStage2_lastLine if self.status_lineUp: self.actual_connected = True lastDisconnectOrConnect = self.status_lineUp_lastLine if self.status_lineDown: if self.status_lineDown_lastLine > self.status_lineUp_lastLine: self.actual_connected = False lastDisconnectOrConnect = self.status_lineDown_lastLine if self.actual_lastModemConnected > self.status_lineUp_lastLine: self.actual_connected = False self.lastDisconnectOrConnect = self.actual_lastModemConnected if len(self.connection_ip_detail): # Ok We have an IP : This means that someone Else has started the ppp0 # Lets nick it self.actual_connected = True if self.actual_connected == False: if self.status_synchronising_lastLine > lastDisconnectOrConnect: self.actual_syncronizing = True if self.debug: print "----------GENERATED STATUS----------" print "noModem:",self.status_noModem print "actual_firmwareOk:",self.actual_firmwareOk print "actual_modemConnected:",self.actual_modemConnected print "actual_syncronizing:",self.actual_syncronizing print "self.status_lineUp:",self.status_lineUp,"line:",self.status_lineUp_lastLine print "self.status_lineDown:",self.status_lineDown,"line:",self.status_lineDown_lastLine print "actual_connected:",self.actual_connected print "connection_ip_detail:",self.connection_ip_detail return self.generateTooltip() def generateTooltip(self): # Now Make Use of it all toolTipMessage = "" modem_str = self.modem_manager.lang.get_string("TRAY_STATUS_PARTS_MODEM") line_status_str = self.modem_manager.lang.get_string("TRAY_STATUS_PARTS_LINE_STATUS") syncronizing_str = self.modem_manager.lang.get_string("TRAY_STATUS_PARTS_SYNCRONIZING") synchronized_str = self.modem_manager.lang.get_string("TRAY_STATUS_PARTS_SYNCRONIZED") not_synchronous_str = self.modem_manager.lang.get_string("TRAY_STATUS_PARTS_SYNCHRONOUS") detected_str = self.modem_manager.lang.get_string("TRAY_STATUS_PARTS_DETECTED") wrong_firmware_str = self.modem_manager.lang.get_string("TRAY_STATUS_PARTS_WRONG_FIRMWARE_LOADED") no_firmware_str = self.modem_manager.lang.get_string("TRAY_STATUS_PARTS_NO_FIRMWARE_LOADED") if self.actual_modemConnected: if self.actual_firmwareOk: if self.actual_syncronizing: toolTipMessage = modem_str+" " + self.status_modemName+" V" + self.status_modemId + "\n"+line_status_str+": "+syncronizing_str else: if self.actual_connected: toolTipMessage = modem_str+" " + self.status_modemName+" V" + self.status_modemId + "\n"+line_status_str+": "+synchronized_str+"\n" + self.status_lineUp_details if len(self.connection_ip_detail) > 0: toolTipMessage = toolTipMessage + "\n" + self.connection_ip_detail else: toolTipMessage = modem_str+" " + self.status_modemName+" V" + self.status_modemId + "\n"+line_status_str+": "+not_synchronous_str else : if self.wrong_firmware: toolTipMessage = modem_str+" " + self.status_modemName+" V" + self.status_modemId + " "+detected_str+"\n"+wrong_firmware_str else : toolTipMessage = modem_str+" " + self.status_modemName+" V" + self.status_modemId + " "+detected_str+"\n"+no_firmware_str else : if self.actual_firmwareOk: toolTipMessage = self.modem_manager.lang.get_string("TRAY_STATUS_PARTS_FIRMWARE_LOADED_NO_MODEM") else : toolTipMessage = self.modem_manager.lang.get_string("TRAY_STATUS_PARTS_FIRMWARE_NOT_LOADED_NO_MODEM") return toolTipMessage