Afficher la pageAnciennes révisionsLiens de retourHaut de page Cette page est en lecture seule. Vous pouvez afficher le texte source, mais ne pourrez pas le modifier. Contactez votre administrateur si vous pensez qu'il s'agit d'une erreur. Permet d'organiser une base de données brutes de fonctionnement du relais <code python | svxlogreport.py> #!/usr/bin/python """" " SVXLINK ANALYSING OF SVXLINK LOGFILES " SVXLink Card on http://svxcard.f5uii.net " " This Python software generate a SQLite database, in which the statitics of activities of SVXlink is recorded " 04.04.2016 (b)- Christian, F5UII " version 0.2 - Under Creative Commons licence [by-nc-sa] http://creativecommons.org/licenses/by-nc-sa/4.0/ " """ import ConfigParser, os import time,datetime # used by follow function import sys import sqlite3 svxlogfile="/var/log/svxlink" # Real time log which is analysed by this software #svxlogfile="/home/pi/test/svxlink" # Real time log which is analysed by this software #svxlogfile="/home/pi/svxlink.log" # Real time log which is analysed by this software #svxlogfile="/home/pi/svxlink-log-old" svxconfigfile="/etc/svxlink/svxlink.conf" # Configuration File of SVXLink svxstatusfile="/home/pi/svx_log.conf" # Generated file by this software sensorids = ["10-0008010955c3"] # Here the serial number of the 18b20 : ls /sys/bus/w1/devices/ db='/home/pi/svxreport.sqlite' #LOGICS NAMES StrSimplex = "SimplexLogic" # Identification of a Simplex Logic in Svxlink, by default = "SimplexLogic" StrRepeater = "RepeaterLogic" # Identification of a Repeater Logic in Svxlink, by default = "RepeaterLogic" #MODULES NAMES StrHelp = "Help" # Identification of a Help Module in Svxlink, by default = "Help" StrParrot = "Parrot" # Identification of a Parrot Module in Svxlink, by default = "Parrot" StrEcholink = "EchoLink" # Identification of a Echolink Module in Svxlink, by default = "EchoLink" StrVoicemail = "TclVoiceMail" # Identification of a Voicemail Module in Svxlink, by default = "TclVoiceMail" StrMetarinfo = "MetarInfo" # Identification of a Metar informations Module in Svxlink, by default = "MetarInfo" StrDtmfrepeater = "DtmfRepeater" # Identification of a DTMF Repeater Module in Svxlink, by default = "DtmfRepeater" StrSelcallenc = "SelCallEnc" # Identification of a Selective Call Encoder Module in Svxlink, by default = "SelCallEnc" StrPropagation = "PropagationMonitor" # Identification of a Propagation information Module in Svxlink, by default = "PropagationMonitor" # Variables initialisation tx=0 rx=0 tone=0 svxrun=0 longbeacon=0 shortbeacon=0 module_echolink=0 echolinkstat_count=0 process = 0 rep_mod_help=0 rep_mod_parrot=0 rep_mod_echolink=0 rep_mod_metar=0 rep_mod_voicemail=0 rep_mod_dtmf=0 rep_mod_selcall=0 rep_mod_propag=0 rep_recoder=0 #QSO recorder , by default be activated by DTMF = 81#, desactivated by DTMF = 80# sim_mod_help=0 sim_mod_parrot=0 sim_mod_echolink=0 sim_mod_metar=0 sim_mod_voicemail=0 sim_mod_dtmf=0 sim_mod_selcall=0 sim_mod_propag=0 sim_recoder=0 #QSO recorder , by default be activated by DTMF = 81#, desactivated by DTMF = 80# Last_Echolink_station = "" #Callsign of the last Echolink station Echok_Station_conn = 0 # 1 = Echolink Station connected on repeater def file_len(fname): with open(fname) as f: for i, l in enumerate(f): pass return i + 1 nblines = file_len(svxlogfile) # Writing the file of current status def writeconf(): fo = open(svxstatusfile, "w") lin = fo.writelines( "\n### SVXLINK LOG STATS ###\n\n\n" ) lin = fo.writelines( "[STAT] \n\n") lin = fo.writelines( "STATION_INFO="+ svxconfigfile +"\n") fo.close() def follow(thefile): #thefile.seek(0,2) # Go to the end of the file while True: line = thefile.readline() if not line: print 'o'+'\r' time.sleep(0.1) # Sleep briefly print '-'+'\r' continue yield line # Checking of the log files config = ConfigParser.ConfigParser() config.read(svxconfigfile) log_format = "" log_format = config.get('GLOBAL', 'TIMESTAMP_FORMAT')[1:-1] Sim_modules = "" Rep_modules = "" Sim_callsign = "" Rep_callsign = "" timer_module = {} timer_transmit = {} timer_squelch = {} timer_echolink = {} Station_info="" Freq="" Ant_h="" Ant_gain="" try: Freq = config.get('LocationInfo', 'FREQUENCY') except ConfigParser.NoOptionError, err: print "Info : "+str(err) try: Power = config.get('LocationInfo', 'TX_POWER') except ConfigParser.NoOptionError, err: print "Info : "+str(err) try: Ant_gain = config.get('LocationInfo', 'ANTENNA_GAIN') except ConfigParser.NoOptionError, err: print ("Info : "+str(err)) try: Ant_h = config.get('LocationInfo', 'ANTENNA_HEIGHT') except ConfigParser.NoOptionError, err: print "Info : "+str(err) if Freq : Station_info = "Frequency is set to " + Freq + ". " if Ant_h : Station_info = Station_info + "The antenna is installed on "+ Ant_h + " height. " if Ant_gain : Station_info = Station_info + "Antenna gain is " + Ant_gain +". " print Station_info #writeconf() # Write the status file on disk #Checking the real time status with Log file i=0 conn = sqlite3.connect(db) cursor = conn.cursor() def create_table (table): cursor.execute(""" CREATE TABLE IF NOT EXISTS """+table+"""( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, date DATETIME NOT NULL, duration REAL, channel VARCHAR)""") conn.commit() create_table ('squelch') create_table ('tone') create_table ('transmit') create_table ('echolink_activity') cursor.execute(""" CREATE TABLE IF NOT EXISTS modules ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, date DATETIME NOT NULL, duration REAL, module VARCHAR, channel VARCHAR)""") conn.commit() cursor.execute(""" CREATE TABLE IF NOT EXISTS identification ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, date DATETIME NOT NULL, duration REAL, module VARCHAR, channel VARCHAR)""") conn.commit() cursor.execute(""" CREATE TABLE IF NOT EXISTS dtmfcmd ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, date DATETIME NOT NULL, module VARCHAR, code VARCHAR)""") conn.commit() def insert_ifnotexist(table, dater, dur, c): sql = "insert into "+ table +" (date, duration, channel) select ?, ?,? where not exists (select 1 from "+ table +" WHERE date = ? AND duration = ? AND channel = ?)" cursor.execute(sql,( dater, dur, c, dater, dur, c)) conn.commit() ''' ''' def insert_ifnotexist4(table, dater, dur, m, c): sql2 = "insert into "+ table +" (date, duration, module,channel) select ?, ?, ?,? where not exists (select 1 from "+ table +" WHERE date = ? AND duration = ? AND module = ? AND channel = ?)" cursor.execute(sql2,( dater, dur, m, c, dater, dur,m, c)) conn.commit() def insert_ifnotexist_dtmf(table, dater, m, c): sql3 = "insert into "+ table +" (date, module, code) select ?, ?,? where not exists (select 1 from "+ table +" WHERE date = ? AND module = ? AND code = ?)" cursor.execute(sql3,( dater, m, c, dater, m, c)) conn.commit() def det_channel(line_string, position_timestamp): comment = line_string[position_timestamp+2:] #extract of the channel (exemple "Rx1") comment_parts = comment.split(':') return comment_parts[0].strip(' ').replace('.', '').replace('\n', '') l= len (time.strftime( "%c", time.localtime() )) # length of timestamp in log line print "Log format extract from "+svxconfigfile+" : "+ log_format logfile = open(svxlogfile) loglines = follow(logfile) #with open(svxlogfile): # as loglines: #loglines = follow(logfile) # go to the end of the file n=0 for line in loglines: n=n+1 #print line #line = line[3:] #specific for a multiple %M %c - to comment in the general case %c print "{:3.2f}%".format(n/float(nblines)*100)+'\r', try: t1 = datetime.datetime.strptime(line[:l], "%c") except Exception, e: print e print line #print "returned tuple: %s " % struct_time ''' elif "Shutting down application" in line: print "SHUTTING DOWN SVX" svxrun = 0 ''' if "The squelch is OPEN" in line: #print "SQUELCH OPEN" squelch_open_time = t1 channel_squelch_open = det_channel(line, l) timer_squelch [channel_squelch_open] = t1 rx = 1 elif "The squelch is CLOSED" in line: ############# ATTENTION TRAITER LES MULTI SQUEL / channel #print "SQUELCH CLOSED" try: channel_squelch_close = det_channel(line, l) squelch_duration = t1 - timer_squelch [channel_squelch_open] squelch_duration_s = squelch_duration.total_seconds() insert_ifnotexist('squelch',squelch_open_time, squelch_duration_s, channel_squelch_close) except NameError: print "No t1" rx = 0 elif "tone call detected" in line: #print "TONE DETECTED" channel = det_channel(line, l) insert_ifnotexist('tone',t1, 1, channel) tone = 1 elif "Activating module" in line: #print "ACTIVATED MODULE" channel = det_channel(line, l) #print channel pos=line.find("Activating module")+len("Activating module") module= line[pos:] module= module.strip(' ') module = module.replace('.', '') timer_module[module] = t1 elif "Deactivating module" in line: #print "DEACTIVATED MODULE" channel = det_channel(line, l) #print channel pos=line.find("Deactivating module")+len("Deactivating module") module= line[pos:] module= module.strip(' ') module = module.replace('.', '') #print timer_module[module] module_duration = t1 - timer_module[module] duree= module_duration.total_seconds() insert_ifnotexist4('modules',t1,duree, module, channel) elif "DTMF command received in module" in line: channel ='' #print "DTMF command received in module" pos=line.find("DTMF command received in module")+len("DTMF command received in module") dtmfcmd= line[pos:] p=dtmfcmd.split(':') module= p[0].strip(' ').replace('.', '').replace('\n', '') dtmf= p[1].strip(' ').replace('.', '').replace('\n', '') if dtmf=='' : dtmf="#" insert_ifnotexist_dtmf('dtmfcmd', t1, module, dtmf) elif " Turning the transmitter ON" in line: channel = det_channel(line, l) #timer_module.update({channel: t1}) timer_transmit[channel] = t1 elif " Turning the transmitter OFF" in line: try : channel = det_channel(line, l) transmit_duration= t1 - timer_transmit[channel] insert_ifnotexist('transmit',t1,transmit_duration.total_seconds(),channel) except Exception, e: print "No transmit On timestamp " elif "Sending long identification" in line: #print "LONG BEACON" channel = det_channel(line, l) insert_ifnotexist4('identification',t1,1,'long',channel) longbeacon = 1 elif "Sending short identification." in line: #print "SHORT BEACON" channel = det_channel(line, l) insert_ifnotexist4('identification',t1,1,'short',channel) shortbeacon=1 elif "EchoLink QSO state changed to CONNECTED" in line: callsign = det_channel(line, l) timer_echolink[callsign] = t1 elif "EchoLink QSO state changed to DISCONNECTED" in line: try: callsign = det_channel(line, l) echol_duration= t1 - timer_echolink[callsign] insert_ifnotexist('echolink_activity',t1,echol_duration.total_seconds(),callsign) del timer_echolink[callsign] except Exception, e: #print "No echolink up / timestamp " True=True ''' elif StrRepeater+": Activating module " + StrParrot in line: print StrParrot+ " module activated on "+StrRepeater rep_mod_parrot = 1 elif StrRepeater+": Deactivating module " + StrParrot in line: print StrParrot+" module desactivated on "+StrRepeater rep_mod_parrot = 0 elif StrRepeater+": Activating module " + StrHelp in line: print StrHelp+" module activated on "+StrRepeater rep_mod_help = 1 elif StrRepeater+": Deactivating module " + StrHelp in line: print StrHelp+" module desactivated on "+StrRepeater rep_mod_help = 0 elif StrRepeater+": Activating module " + StrEcholink in line: print StrEcholink+" module activated on "+StrRepeater rep_mod_echolink = 1 elif StrRepeater+": Deactivating module " + StrEcholink in line: print StrEcholink+" module desactivated on "+StrRepeater rep_mod_echolink = 0 elif StrRepeater+": Activating module " + StrMetarinfo in line: print StrMetarinfo+" module activated on "+StrRepeater rep_mod_metar = 1 elif StrRepeater+": Deactivating module " + StrMetarinfo in line: print StrMetarinfo+" module desactivated on "+StrRepeater rep_mod_metar = 0 elif StrRepeater+": Activating module " + StrVoicemail in line: print StrVoicemail+" module activated on "+StrRepeater rep_mod_voicemail = 1 elif StrRepeater+": Deactivating module " + StrVoicemail in line: print StrVoicemail+" module desactivated on "+StrRepeater rep_mod_voicemail = 0 elif StrRepeater+": Activating module " + StrDtmfrepeater in line: print StrDtmfrepeater+" module activated on "+StrRepeater rep_mod_dtmf = 1 elif StrRepeater+": Deactivating module " + StrDtmfrepeater in line: print StrDtmfrepeater+" module desactivated on "+StrRepeater rep_mod_dtmf = 0 elif StrRepeater+": Activating module " + StrSelcallenc in line: print StrSelcallenc+" module activated on "+StrRepeater rep_mod_selcall= 1 elif StrRepeater+": Deactivating module " + StrSelcallenc in line: print StrSelcallenc+" module desactivated on "+StrRepeater rep_mod_selcall = 0 elif StrRepeater+": Activating module " + StrPropagation in line: print StrPropagation+" module activated on "+StrRepeater rep_mod_propag= 1 elif StrRepeater+": Deactivating module " + StrPropagation in line: print StrPropagation+" module desactivated on "+StrRepeater rep_recoder = 0 elif StrRepeater+": Activating QSO recorder" in line: print "QSO recorder activated on "+StrRepeater rep_recoder= 1 elif StrRepeater+": Deactivating QSO recorder" in line: print "QSO recorder module desactivated on "+StrRepeater rep_mod_propag = 0 elif StrSimplex+": Activating module " + StrParrot in line: print StrParrot+ " module activated on "+StrSimplex sim_mod_parrot = 1 elif StrSimplex+": Deactivating module " + StrParrot in line: print StrParrot+" module desactivated on "+StrSimplex sim_mod_parrot = 0 elif StrSimplex+": Activating module " + StrHelp in line: print StrHelp+" module activated on "+StrSimplex sim_mod_help = 1 elif StrSimplex+": Deactivating module " + StrHelp in line: print StrHelp+" module desactivated on "+StrSimplex sim_mod_help = 0 elif StrSimplex+": Activating module " + StrEcholink in line: print StrEcholink+" module activated on "+StrSimplex sim_mod_echolink = 1 elif StrSimplex+": Deactivating module " + StrEcholink in line: print StrEcholink+" module desactivated on "+StrSimplex sim_mod_echolink = 0 elif StrSimplex+": Activating module " + StrMetarinfo in line: print StrMetarinfo+" module activated on "+StrSimplex sim_mod_metar = 1 elif StrSimplex+": Deactivating module " + StrMetarinfo in line: print StrMetarinfo+" module desactivated on "+StrSimplex sim_mod_metar = 0 elif StrSimplex+": Activating module " + StrVoicemail in line: print StrVoicemail+" module activated on "+StrSimplex sim_mod_voicemail = 1 elif StrSimplex+": Deactivating module " + StrVoicemail in line: print StrVoicemail+" module desactivated on "+StrSimplex sim_mod_voicemail = 0 elif StrSimplex+": Activating module " + StrDtmfrepeater in line: print StrDtmfrepeater+" module activated on "+StrSimplex sim_mod_dtmf = 1 elif StrSimplex+": Deactivating module " + StrDtmfrepeater in line: print StrDtmfrepeater+" module desactivated on "+StrSimplex sim_mod_dtmf = 0 elif StrSimplex+": Activating module " + StrSelcallenc in line: print StrSelcallenc+" module activated on "+StrSimplex sim_mod_selcall= 1 elif StrSimplex+": Deactivating module " + StrSelcallenc in line: print StrSelcallenc+" module desactivated on "+StrSimplex sim_mod_selcall = 0 elif StrSimplex+": Activating module " + StrPropagation in line: print StrPropagation+" module activated on "+StrSimplex sim_mod_propag= 1 elif StrSimplex+": Deactivating module " + StrPropagation in line: print StrPropagation+" module desactivated on "+StrSimplex sim_mod_propag = 0 elif StrSimplex+": Activating QSO recorder" in line: print "QSO recorder activated on "+StrSimplex sim_recoder= 1 elif StrSimplex+": Deactivating QSO recorder" in line: print "QSO recorder module desactivated on "+StrSimplex sim_recoder = 0 elif "EchoLink QSO state changed to CONNECTED" in line: ch = line.split(':') Last_Echolink_station = ch[0] Echok_Station_conn = 1 print "ECHOLINK STATION CONNECTED" elif "EchoLink QSO state changed to BYE_RECEIVED" in line: Echok_Station_conn = 0 print "ECHOLINK STATION DISCONNECTED" writeconf() # Write the status file on disk ''' conn.commit() conn = sqlite3.connect(db) print "fin" print sqllist </code> fr/report.txt Dernière modification : 2020/07/05 17:12de 127.0.0.1