#!/usr/bin/python
""""
" SVXLINK REALTIME STATUS OF SVXLINK
" SVXLink Card on http://svxcard.f5uii.net
"
" This Python software generate a status configuration file, in which the status of activities of SVXlink is detailed
" 12.08.2015 (b)- Christian, F5UII
" version 0.1 - Under Creative Commons licence [by-nc-sa] http://creativecommons.org/licenses/by-nc-sa/4.0/
"
"""
import ConfigParser, os
import time # used by follow function
svxlogfile="/var/log/svxlink" # Real time log which is analysed by this software
#svxlogfile="/home/pi/svxlink.log" # Real time log which is analysed by this software
svxconfigfile="/etc/svxlink/svxlink.conf" # Configuration File of SVXLink
svxstatusfile="/home/pi/svx_status.conf" # Generated file by this software
#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
# Return CPU temperature as a character string
def getCPUtemperature():
res = os.popen('vcgencmd measure_temp').readline()
return(res.replace("temp=","").replace("'C\n",""))
# Return RAM information (unit=kb) in a list
# Index 0: total RAM
# Index 1: used RAM
# Index 2: free RAM
def getRAMinfo():
p = os.popen('free')
i = 0
while 1:
i = i + 1
line = p.readline()
if i==2:
return(line.split()[1:4])
# Return % of CPU used by user as a character string
def getCPUuse():
return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip(\
)))
# Return information about disk space as a list (unit included)
# Index 0: total disk space
# Index 1: used disk space
# Index 2: remaining disk space
# Index 3: percentage of disk used
def getDiskSpace():
p = os.popen("df -h /")
i = 0
while 1:
i = i +1
line = p.readline()
if i==2:
return(line.split()[1:5])
def check_svxlink( *args ):
p=os.popen('pidof svxlink |wc -w' ).readline()
return int(p)
# Writing the file of current status
def writeconf():
fo = open(svxstatusfile, "w")
lin = fo.writelines( "\n### SVXLINK STATUS ###\n\n\n" )
lin = fo.writelines( "[CONFIG] # Section with static informations, provided by configuration files\n\n")
lin = fo.writelines( "STATION_INFO="+ Station_info +"\n")
lin = fo.writelines( "# Simplex Logic\n")
lin = fo.writelines( "SIM_CALLSIGN=" + Sim_callsign + "\n" )
lin = fo.writelines( "SIM_MODULES=" + Sim_modules + "\n" )
lin = fo.writelines( "\n# Repeater Logic\n")
lin = fo.writelines( "REP_CALLSIGN=" + Rep_callsign + "\n" )
lin = fo.writelines( "REP_MODULES=" + Rep_modules + "\n" )
lin = fo.writelines( "\n[STATUS] # Section with dynamic informations, provided by log files and shell commands\n\n")
lin = fo.writelines( "SVXLINK_RUN="+str(svxrun)+"\n")
lin = fo.writelines( "TX="+str(tx)+"\n")
lin = fo.writelines( "RX="+str(rx)+"\n")
lin = fo.writelines( "TONE="+str(tone)+"\n")
lin = fo.writelines( "LONGBEACON="+str(longbeacon)+"\n")
lin = fo.writelines( "SHORTBEACON="+str(shortbeacon)+"\n")
lin = fo.writelines( "REP_MOD_HELP="+str(rep_mod_help)+"\n")
lin = fo.writelines( "REP_MOD_PARROT="+str(rep_mod_parrot)+"\n")
lin = fo.writelines( "REP_MOD_ECHOLINK="+str(rep_mod_echolink)+"\n")
lin = fo.writelines( "REP_MOD_METAR="+str(rep_mod_metar)+"\n")
lin = fo.writelines( "REP_MOD_VOICEMAIL="+str(rep_mod_voicemail)+"\n")
lin = fo.writelines( "REP_MOD_DTMF="+str(rep_mod_dtmf)+"\n")
lin = fo.writelines( "REP_MOD_SELCALL="+str(rep_mod_selcall)+"\n")
lin = fo.writelines( "REP_MOD_PROPAGATION="+str(rep_mod_propag)+"\n")
lin = fo.writelines( "REP_RECORDER="+str(rep_recoder)+"\n")
lin = fo.writelines( "SIM_MOD_HELP="+str(sim_mod_help)+"\n")
lin = fo.writelines( "SIM_MOD_PARROT="+str(sim_mod_parrot)+"\n")
lin = fo.writelines( "SIM_MOD_ECHOLINK="+str(sim_mod_echolink)+"\n")
lin = fo.writelines( "SIM_MOD_METAR="+str(sim_mod_metar)+"\n")
lin = fo.writelines( "SIM_MOD_VOICEMAIL="+str(sim_mod_voicemail)+"\n")
lin = fo.writelines( "SIM_MOD_DTMF="+str(sim_mod_dtmf)+"\n")
lin = fo.writelines( "SIM_MOD_SELCALL="+str(sim_mod_selcall)+"\n")
lin = fo.writelines( "SIM_MOD_PROPAGATION="+str(sim_mod_propag)+"\n")
lin = fo.writelines( "SIM_RECORDER="+str(sim_recoder)+"\n")
lin = fo.writelines( "CPU_TEMP="+str(getCPUtemperature())+"\n")
lin = fo.writelines( "CPU_USE="+str(getCPUuse())+"\n")
lin = fo.writelines( "RAM_USE="+str(getRAMinfo())+"\n")
lin = fo.writelines( "DISK_USE="+str(getDiskSpace())+"\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:
time.sleep(0.1) # Sleep briefly
continue
yield line
# Checking of the configuration file
config = ConfigParser.ConfigParser()
config.read(svxconfigfile)
Logics = config.get('GLOBAL', 'LOGICS')
Sim_modules = ""
Rep_modules = ""
Sim_callsign = ""
Rep_callsign = ""
if StrRepeater in Logics :
Rep_callsign = config.get(StrRepeater, 'CALLSIGN')
print "Repeater logic detected in SvxConfig"
print "Repeater Callsign "+Rep_callsign;
Rep_modules = config.get(StrRepeater, 'MODULES')
if StrSimplex in Logics :
Sim_callsign = config.get(StrSimplex, 'CALLSIGN')
print "Simplex logic detected in SvxConfig"
print "Simplex Callsign "+Sim_callsign;
Sim_modules = config.get(StrSimplex, 'MODULES')
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
logfile = open(svxlogfile)
loglines = follow(logfile)
for line in loglines:
#print line
if "transmitter ON" in line:
print "TX ON"
tx = 1
elif "transmitter OFF" in line:
print "TX OFF"
tx = 0
tone=0
longbeacon=0
shortbeacon=0
elif "Shutting down application" in line:
print "SHUTTING DOWN SVX"
svxrun = 0
elif "tone call detected" in line:
print "TONE DETECTED"
tone = 1
elif "Sending long identification" in line:
print "LONG BEACON"
longbeacon = 1
elif "Sending short identification." in line:
print "SHORT BEACON"
shortbeacon=1
elif "The squelch is OPEN" in line:
print "SQUELCH OPEN"
rx = 1
elif "The squelch is CLOSED" in line:
print "SQUELCH CLOSED"
rx = 0
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"
# Check if process svxlink is running
if check_svxlink() == 1 :
svxrun = 1
else :
svxrun = 0
writeconf() # Write the status file on disk