summaryrefslogtreecommitdiffstats
path: root/linhes/linhes-system/lh_myth_status.py
diff options
context:
space:
mode:
Diffstat (limited to 'linhes/linhes-system/lh_myth_status.py')
-rwxr-xr-xlinhes/linhes-system/lh_myth_status.py271
1 files changed, 271 insertions, 0 deletions
diff --git a/linhes/linhes-system/lh_myth_status.py b/linhes/linhes-system/lh_myth_status.py
new file mode 100755
index 0000000..c682d1c
--- /dev/null
+++ b/linhes/linhes-system/lh_myth_status.py
@@ -0,0 +1,271 @@
+#!/usr/bin/python
+#This program is called on login to display the status of mythtv tuners & recording status
+#Also will display alerts generated by xymon. If the location of xymon changes, this script needs to be updated.
+
+from MythTV import MythBE,MythDB,MythLog
+import datetime,pytz,re,socket,subprocess,sys,time
+from dateutil.parser import parse
+from tzlocal import get_localzone
+
+import os,glob
+from socket import gethostname;
+
+def formatTD(td):
+ days = td.days
+ hours = td.seconds // 3600
+ minutes = (td.seconds % 3600) // 60
+ seconds = td.seconds % 60
+
+ if days == 0:
+ day_string = ""
+ elif days > 1:
+ day_string = "%s days, " %days
+ else:
+ day_string = "%s day, " %days
+
+ if hours > 1:
+ hour_string = "%s hours, " %hours
+ else:
+ hour_string = "%s hour, " %hours
+
+ if minutes > 1:
+ minute_string = "%s minutes, " %minutes
+ else:
+ minute_string = "%s minute, " %minutes
+
+ if seconds > 1:
+ second_string = "%s seconds" %seconds
+ else:
+ second_string = "%s second" %seconds
+
+ return_string = '%s%s%s%s' % (day_string, hour_string, minute_string, second_string)
+ return return_string
+
+def print_alerts():
+ dir_name = "/home/xymon/var/login_alerts"
+ out_alert=""
+ try:
+ os.chdir(dir_name)
+ except:
+ pass
+ #print " myth_status: Couldn't change dir to %s" %dir_name
+
+ file_list=glob.glob("*")
+
+ if len(file_list) == 0:
+ #print " myth_status: no alert files found"
+ pass
+ else:
+ for alert_file in file_list:
+ out_line=''
+ datahost = ''
+ dataservice = ''
+ datacolor = ''
+ datadown = ''
+ try:
+ #print " myth_staus: reading in %s" %alert_file
+ f=open(alert_file,'r')
+ lines=f.readlines()
+ f.close()
+ except:
+ #print " myth_status: Couldn't open %s for reading" %alert_file
+ continue
+
+ for line in lines:
+ try:
+ data,value=line.split(":")
+ except:
+ continue #exception occured try the next line
+
+ if data == 'HOST':
+ datahost = value.strip()
+ elif data == 'SERVICE':
+ dataservice = value.strip()
+ elif data == 'COLOR':
+ datacolor = value.strip()
+ elif data == 'DOWN':
+ datadown = value.strip()
+ sec=int(datadown)
+ td_sec = datetime.timedelta(seconds=sec)
+ td_sec_formated = formatTD(td_sec)
+
+ out_line =" %s on %s %s for %s \n" %(dataservice,
+ datahost,datacolor.upper(),
+ td_sec_formated)
+ out_alert += out_line
+
+ print("System Alerts:")
+ print("--------------")
+ if len(out_alert) > 0:
+ print(out_alert)
+ print(" Go to http://%s and click Health & Maintenance for more information." %gethostname())
+ else:
+ print(" All systems OK")
+
+ return
+
+
+#-------------------------------------------
+
+
+class tuner_recording_status:
+ def __init__ (self,num_upcoming):
+
+ self.now = datetime.datetime.now(pytz.utc)
+ self.currTZ = get_localzone()
+ self.farout=99999999
+ self.next_start_diff=datetime.timedelta(self.farout)
+ self.num_upcoming=num_upcoming
+ self.tuner_status_list=[]
+ self.conflict_list=[]
+ self.upcoming_list=[]
+ self.ur=0
+ self.db_connection_status = self.check_database_connection()
+ if self.db_connection_status == 0:
+ self.tuner_status()
+ self.conflicts()
+ self.upcoming_recordings()
+
+ def get_db_check_status(self):
+ return self.db_connection_status
+
+ def check_database_connection(self):
+ rc=0
+ try:
+ self.be = MythBE()
+ self.db = MythDB()
+ self.cursor = self.db.cursor()
+ except:
+ print("\nCouldn't connect to MythTV service for status")
+ rc=1
+ return rc
+#-----
+ def tuner_status(self):
+ a=self.be.getRecorderList()
+ for i in a:
+ outline=''
+ cmd="select cardtype,hostname,displayname from capturecard where cardid=%s;" %i
+ self.cursor.execute(cmd)
+ results=self.cursor.fetchall()
+ type = results[0][0]
+ hostname = results[0][1]
+ displayname = results[0][2]
+ id = i
+ try:
+ c=self.be.getCurrentRecording(i)
+ if c.title == None:
+ current_recording = "Idle"
+ else:
+ current_recording = "Recording %s" %c.title
+ outline = " Tuner %s - %s (%s) on %s : %s " %(id, displayname, type, hostname, current_recording)
+ self.tuner_status_list.append(outline)
+ except:
+ outline = " Tuner %s - %s (%s) on %s : %s " %(id, displayname, type, hostname, "Tuner Error")
+ self.tuner_status_list.append(outline)
+
+ def get_tuner_status(self):
+ return self.tuner_status
+
+ def print_tuner_status(self):
+ print("Tuner Status:")
+ print("-------------")
+ if len(self.tuner_status_list) > 0 :
+ for line in self.tuner_status_list:
+ print(line)
+ else:
+ print(" No tuners found")
+#--------
+ def upcoming_recordings(self):
+
+ a=self.be.getUpcomingRecordings()
+ r=0
+ for i in a:
+ r += 1
+ if r > self.num_upcoming:
+ break
+ title_chan="%s (%s)" %(i.title, i.channame)
+ # convert timezone to local timezone
+ start_time=parse(str(i.starttime))
+ start_time=start_time.astimezone(self.currTZ)
+ start_time_out=start_time.strftime("%a %b %d %I:%M%p")
+ self.upcoming_list.append([start_time_out,i.hostname, title_chan])
+
+ diff = start_time - self.now
+ if diff < self.next_start_diff :
+ self.next_start_diff = diff
+
+ if self.next_start_diff == datetime.timedelta(self.farout):
+ self.ur="No recordings are scheduled"
+ else:
+ self.ur=formatTD(self.next_start_diff)
+
+ def get_upcoming_recordings(self):
+ return self.upcoming_list
+
+ def print_upcoming_recordings(self):
+ #print self.get_upcoming_recordings()
+ print("")
+ print("Upcoming Recordings (Next %s Scheduled):" %(self.num_upcoming))
+ print("----------------------------------------")
+ if len(self.get_upcoming_recordings()) > 0:
+ for i in self.get_upcoming_recordings():
+ #print " %s - %s - %s" %(start_time_out,i.hostname, title_chan)
+ print(" %s - %s - %s" %(i[0],i[1],i[2]))
+ else:
+ print(" No upcoming recordings")
+ pass
+
+ def get_next_start_time(self):
+ return self.ur
+
+ def print_next_start_time(self):
+ print("")
+ print("The next recording starts in:")
+ print("-----------------------------")
+ print(" %s" %(self.get_next_start_time()))
+ print("")
+
+#-----
+
+ def conflicts(self):
+ a=self.be.getConflictedRecordings()
+ for i in a:
+ out_line=''
+ title_chan="%s (%s)" %(i.title, i.channame)
+ # convert timezone to local timezone
+ start_time=parse(str(i.starttime))
+ start_time=start_time.astimezone(self.currTZ)
+ start_time_out=start_time.strftime("%a %b %d %I:%M%p")
+ out_line=(start_time_out,i.hostname,title_chan)
+ self.conflict_list.append(out_line)
+
+ def get_conflict_list(self):
+ return self.conflict_list
+
+ def print_conflict_list(self):
+ print("")
+ print("Recording Conflicts:")
+ print("--------------------")
+ if len(self.get_conflict_list()) > 0:
+ for i in self.get_conflict_list():
+ print(" %s - %s - %s" %(i[0],i[1],i[2]))
+ else:
+ print(" No conflicts")
+
+#header="#"*60
+
+
+def go():
+ welcomeFile=open("/etc/LinHES-release", "r")
+ print("Welcome to %s on %s\n" %(welcomeFile.readline().rstrip(), socket.gethostname()))
+ tuner = tuner_recording_status(12)
+ if tuner.get_db_check_status() == 0:
+ tuner.print_tuner_status()
+ tuner.print_upcoming_recordings()
+ tuner.print_conflict_list()
+ tuner.print_next_start_time()
+ #print_alerts()
+
+
+if __name__ == "__main__":
+ go()