def get_program_stats(self, types="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24", fromdate="12/19/18", todate="12/20/18", fromtime="06:00:00 PM", totime="12:00:00 AM"): """ Get Stats - Pull statistics for specific time period, can do multiple reports of a duration Variables: types - KPI types fromDate - date to start todate - date to end fromtime - time to start totime - time to end reportDuration - duration to report on """ logger.debug("Entering get_program_stats") request = '''{{ "id":1, "jsonrpc":2.0, "method":"Report.GetProgramStatistics", "params":{{ "outputType":"json", "fromDate":"{0!s}", "fromTime":"{1!s}", "toDate":"{2!s}", "toTime":"{3!s}", "types":[{4!s}], "availabilityProduct":"sentry"}} }}'''.format(fromdate, fromtime, todate, totime, types) logger.debug(request) return self.request_program_stats(request=request)
def request_program_stats(self, request): '''need to make sure the request is good and check for an early request ''' logger.debug("Entering request_program_stats") while True: try: this_response = requests.post(self.requesturl, data=request) sentryUtils.log_response(this_response) stats_load = json.loads(this_response.text, parse_int = int, parse_float = int) if stats_load.has_key('result'): return stats_load['result'] elif stats_load.has_key('code'): if str(stats_load["code"]) == "-32000": #code -32000 is an early request print "Made a request too fast waiting a minute" logger.debug("code: {0!s}".format(stats_load["code"])) logger.debug("text: {0!s}".format(stats_load["message"])) sleep(STATS_SLEEP_TIME) else: raise Exception("Bad response from Sentry {0!s}".format(this_response.text)) else: print "error: {0!s}".format(this_response.text) except: print "Sentry did not respond. Will try again" logger.debug("Leaving request_program_stats") return stats_load
def getMPEGInput(self): """ {{ "jsonrpc":2.0, "method":"Input.GetMPEGInput", "params":{"outputType":"json","activeOnly":true,"inputType":"ETH", "vlanIds":[1069]}, "id":1 }}""" request = """{ "jsonrpc":2.0, "method":"Input.GetMPEGInput", "params":{"outputType":"json","inputType":"ETH","activeOnly":true}, "id":1 }""" logger.debug(request) sentryUtils.log_response(requests.post(self.requesturl, data=request))
def get_program_stats_span(self, types="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24", span="1 minute", availability_product="medius"): """ Get Stats - Pull statistics for specific time period, can do multiple reports of a duration Variables: types - KPI types span - length of report availabilityProduct - where to read avability from """ logger.debug("Entering get_program_stats_span") request = '''{{ "id":1, "jsonrpc":2.0, "method":"Report.GetProgramStatistics", "params":{{ "outputType":"json", "types":[{0!s}], "span":"{1!s}", "availabilityProduct":"sentry"}} }}'''.format(types, span, availability_product) logger.debug(request) stats_load = self.request_program_stats(request=request) logger.debug("Leaving get_program_stats_span") return stats_load
def DateRange(startDate, endDate, stepDuration): """ Iterate over date range Variables startDate - datetime to start endDate - datetime to stop stepDuration - Duration of the step in seconds """ logger.debug( "Entering dateRange: StartDate:{0} EndDate:{1} stepDuration:{2}". format(startDate, endDate, stepDuration)) if startDate <= endDate: for n in range(0, int((endDate - startDate).total_seconds()), stepDuration): yield startDate + timedelta(seconds=n) else: for n in range(0, int((startDate - endDate).total_seconds()), stepDuration): yield startDate - timedelta(seconds=n)
def test_login(self): """ Test logon this will return the response and headers from the Sentry This should get a 200 response and an error saying there is no real request """ logger.debug("Entering Sentry test login") this_response = requests.get(self.requesturl) print "StatusCode: " + str(this_response.status_code) print "Headers: " for header, value in this_response.headers.items(): print " %s : %s", header, value print "Encoding: " + this_response.encoding print "Text: " + this_response.text try: print "Json" + this_response.json() except ValueError: pass logger.debug("Leaving Sentry test login") return this_response.status_code
def get_sentry_info(self): """ return the Sentry info { "jsonrpc":2.0, "method":"Report.GetSentryInfo", "params":{"outputType":"json"}, "id":1 } """ logger.debug("Entering Get Sentry Info") request = """{ "jsonrpc":2.0, "method":"Report.GetSentryInfo", "params":{"outputType":"json"}, "id":1 }""" this_response = requests.post(self.requesturl, data=request) logger.debug("leaving Get Sentry Info") return this_response.text
def main(): ''' main function ''' logger.debug("Entering Read Dish Main") parser = argparse.ArgumentParser(description='Import new settings', add_help=True) parser.add_argument('--system', '-s', dest='system', help='URL of Sentry or Medius', required=True) parser.add_argument('--userName', '-u', dest='userName', help='userName for login', required=True) parser.add_argument('--password', '-p', dest='password', help='password for login', required=True) results = parser.parse_args() sentrys = [ '10.0.1.12', '10.0.1.13', '10.0.1.14', '10.126.2.37', '10.126.2.39' ] medius = sentryConnection.Sentry(tekip=(results.system.strip()), medius=True, user=results.userName.strip(), passwd=results.password.strip()) medius.getMPEGInput()
def UpdateMPEGInput(self, UpdateMPEG, BreakNumber = 20): ''' Function to talk to Input.UpdateMPEGInput to set the input settings. arguments: UpdateMPEG - List of dicts containing the MPEG input settings BreakNumber - how many port settings to send at a time ''' ''' example Input.UpdateMPEGInput request { "jsonrpc":2.0,"method":"Input.UpdateMPEGInput","params": {"inputType":"json","inputSettings":[{"sentryName":"Name or IP", "portnum":13,"sourceIp":"*","groupAddr":"225.215.1.5","destPort":8000, "name":"Port 13","desc":"My port 13","monitorBackup":false, "backupSourceIp":"*","backupGroupAddr":"225.215.2.1","backupDestPort":8001, "vlanId":1069,"mode":"Multicast"}]},"id":1} ''' ''' example responses from Input.UpdateMPEGInput {"ver":"1.0","jsonrpc":"2.0","code":-32602,"message":"sentryName is a required parameter.","data":null,"cnt":null} {"ver":"1.0","jsonrpc":"2.0","id":1,"result":[{"region":"PA","location":"Danville","display_name":"sentry3", "ip_addr":"10.0.1.14","unit_name":"sentry3","Error":"Port 1155, 1156, 1157, 1158, 1159 are out of the range.","System ID":4}]} {"ver":"1.0","jsonrpc":"2.0","id":1,"result":[{"region":"PA","location":"Danville","display_name":"sentry3", "ip_addr":"10.0.1.14","unit_name":"sentry3","response":{"resultCode":"200","resultMsg":"Success"},"System ID":4}]} {"ver":"1.0","jsonrpc":"2.0","id":1,"result":[{"region":"PA","location":"Danville","display_name":"sentry2","ip_addr":"10.0.1.13","unit_name":"sentry2", "Error":"The Source IP for port number 9 (172.31.27.22 ) is invalid.<br>The Source IP for port number 11 (172.31.27.22 ) is invalid. <br>The Source IP for port number 12 (172.31.27.22 ) is invalid.<br>The Source IP for port number 14 (172.31.27.22 ) is invalid. <br>The Source IP for port number 15 (172.31.27.22 ) is invalid.<br>The Source IP for port number 17 (172.31.27.22 ) is invalid. <br>The Source IP for port number 20 (172.31.27.22 ) is invalid.<br>The Source IP for port number 21 (172.31.27.22 ) is invalid.","System ID":3}] ''' logger.debug("Entering UpdateMPEGInput") InputSettings = '' for num, port in enumerate(UpdateMPEG, start=1): InputSettings += str(json.dumps(port)) if num % BreakNumber == 0 or num == len(UpdateMPEG): request = '''{{"jsonrpc":2.0, "method":"Input.UpdateMPEGInput", "params": {{"inputType":"json", "inputSettings": [{0!s}]}},"id":1}}'''.format(str(InputSettings)) logger.debug(request) this_response = requests.post(self.requesturl, data=request) sentryUtils.log_response(this_response) '''if stats_load.has_key('result'): return stats_load['result'] else: raise Exception("Bad response from Sentry {0!s}".format(this_response.text)) else: print "error: {0!s}".format(this_response.text)''' InputSettings = '' else: InputSettings += ',' logger.debug("Leaving UpdateMPEGInput")
def SetProgramMapping(self, ProgramMapping, BreakNumber=20): ''' Function to talk to "Program.SetProgramMapping to set the input settings. arguments: UpdateMPEG - List of dicts containing the MPEG input settings BreakNumber - how many port settings to send at a time ''' ''' example "Program.SetProgramMapping request { "jsonrpc":2.0, "method":"Program.SetProgramMapping", "params": {"inputType":"json","inputSettings":[{"sentryName":"Name or IP","portNumber":"1","programNumber":"1","providerName":"HBO"}, {"sentryName":"Name or IP","portNumber":"1","programNumber":"2","providerName":"5StarMAX"}, {"sentryName":"Name or IP","portNumber":"1","programNumber":"3","providerName":"MyProvider","userAdded":true}]}, "id":1 } ''' ''' example responses from "Program.SetProgramMapping" ''' logger.debug("Entering ProgramMapping") InputSettings = '' for num, port in enumerate(ProgramMapping, start=1): InputSettings += str(json.dumps(port)) if num % BreakNumber == 0 or num == len(ProgramMapping): request = '''{{ "jsonrpc":2.0, "method":"Program.SetProgramMapping", "params": {{"inputType":"json","inputSettings": [{0!s}]}},"id":1}}'''.format(str(InputSettings)) logger.debug(request) this_response = requests.post(self.requesturl, data=request) sentryUtils.log_response(this_response) '''if stats_load.has_key('result'): return stats_load['result'] else: raise Exception("Bad response from Sentry {0!s}".format(this_response.text)) else: print "error: {0!s}".format(this_response.text)''' InputSettings = '' else: InputSettings += ',' logger.debug("Leaving ProgramMapping")
def updatePrimaryAudio(self, programMapping): """ {{} "jsonrpc":2.0, "method":"Audio.UpdatePrimaryPID", "params":{"inputType":"json", "inputSettings":[ {{ "sentryName":"192.0.0.0", "portNumber":"0", "programNumber":"10", "pidOrder":"1", "codecType":"MPEG1", "language":"eng" }}} ]}}, "id":1 """ logger.debug("Entering updatePrimaryAudio") for program in programMapping: if (program['Audio_1'] != "0"): try: int(program['Audio_1']) audio_select = '"pidOrder":"{0!s}"'.format(program['Audio_1']) except ValueError: audio_select = '"codecType":"DOLBY {0!s}"'.format(program['Audio_1']) request = """{{ "jsonrpc":2.0, "method":"Audio.UpdatePrimaryPID", "params":{{"inputType":"json", "inputSettings":[ {{ "sentryName":"{0!s}", "portNumber":"{1!s}", "programNumber":"{2!s}", {3!s} }} ]}}, "id":1 }}""".format(program['sentryName'],program['portNumber'],program['programNumber'],audio_select) logger.debug(request) sentryUtils.log_response(requests.post(self.requesturl, data=request)) logger.debug("Leaving updatePrimaryAudio")
def __init__(self, tekip="", medius=True, user="", passwd=""): """ Initilize the connection to the Sentry This will build the request URL arguments: tekIP - Ip of Sentry/Medius medius - True if Medius user - Logon User name passwd - Password requestURL - Url for Request """ logger.debug("Entering Sentry Init") self.tekip = tekip self.medius = medius self.user = user self.passwd = passwd self.requesturl = "http://"+user+":"+passwd+"@"+tekip+"/vnm-api/index.php" logger.debug("Request URL: {0!s}".format(self.requesturl)) logger.debug("leaving Sentry Init")
def main(): ''' main function ''' logger.debug("Entering Get program stats Main") parser = argparse.ArgumentParser(description='Import new settings', add_help=True) parser.add_argument('--system', '-s', dest='system', help='URL of Sentry/s', required=True) parser.add_argument('--user', '-u', dest='userName', help='userName for login', required=True) parser.add_argument('--pass', '-p', dest='password', help='password for login', required=True) parser.add_argument('--duration', '-D', dest='duration', help='length of reports in seconds', required=True) results = parser.parse_args() sentrys = [] for item in results.system.split(','): sentrys.append( sentryConnection.Sentry(tekip=(item.strip()), medius=False, user=results.userName, passwd=results.password)) while True: end = datetime.datetime.now() - datetime.timedelta(hours=3) nextStartTime = datetime.datetime.now() + datetime.timedelta( seconds=STATS_SLEEP_TIME) start = end - datetime.timedelta(seconds=STATS_SLEEP_TIME) for Sentry in sentrys: print("Doing Sentry: {0!s} Start: {1!s} End:{2!s}".format( Sentry.tekip, start.isoformat(), end.isoformat())) # Get the stats, this will return JSON #try: stats_load = Sentry.get_program_stats( types= "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24", fromdate=start.date(), todate=end.date(), fromtime=start.strftime('%H:%M:00'), totime=end.strftime('%H:%M:00')) #stats_load = (Sentry.get_program_stats_span(span="1 minute")) #logger.debug(stats_load) #print stats_load process_json(stats_load, Sentry.tekip) #except: # print "Cannot connect to {0!s}".format(Sentry.tekip) #for key, value in stats_load[0].items(): # print key, value logger.debug("leaving Get program stats Main") '''print nextStartTime print datetime.datetime.now() print nextStartTime - datetime.datetime.now() if nextStartTime > datetime.datetime.now(): delta = nextStartTime - datetime.datetime.now()''' sleep(STATS_SLEEP_TIME)
#!/usr/bin/env python ''' Created on Aug 13 2018 @author: Patrick Rosini ''' import requests #request package will have to be installed, does HTTP requests import json from time import sleep #we can only do pregram stats requests once per minute from sentryLogging import logger import sentryUtils STATS_SLEEP_TIME = 60 # Time to wait between requests logger.debug("Entering Sentry Connection") class Sentry(object): """ Class to connect to Sentry """ def __init__(self, tekip="", medius=True, user="", passwd=""): """ Initilize the connection to the Sentry This will build the request URL arguments:
def log_response(this_response): """ write out all the info in the response from the Sentry/Medius """ logger.debug("Entering log response") logger.debug("StatusCode: " + str(this_response.status_code)) logger.debug("Headers: ") for header, value in this_response.headers.items(): logger.debug(" %s : %s", header, value) logger.debug("Encoding: " + this_response.encoding) logger.debug("Text: " + this_response.text) try: logger.debug(this_response.json()) except ValueError: pass logger.debug("Leaving log response")
#!/usr/bin/env python ''' Created on Aug 13 2018 @author: Patrick Rosini ''' from sentryLogging import logger from datetime import datetime, timedelta logger.debug("Entering Sentry Utils") def log_response(this_response): """ write out all the info in the response from the Sentry/Medius """ logger.debug("Entering log response") logger.debug("StatusCode: " + str(this_response.status_code)) logger.debug("Headers: ") for header, value in this_response.headers.items(): logger.debug(" %s : %s", header, value) logger.debug("Encoding: " + this_response.encoding) logger.debug("Text: " + this_response.text) try: logger.debug(this_response.json()) except ValueError: pass logger.debug("Leaving log response")
from datetime import datetime, timedelta import argparse import sys #from xml.sax.saxutils import escape import codecs from time import sleep #we can only do pregram stats requests once per minute import sqlite3 import csv import sentryConnection # Connection to Sentry and implement calls import sentryUtils # date transform and other things needed from sentryLogging import logger #Setup logging in a single file STATS_SLEEP_TIME = 60 # Time to wait between requests logger.debug("Entering audio report") def main(): sys.stdout = codecs.getwriter('utf8')(sys.stdout) logger.debug("Entering Main") one_day = timedelta(days=1) header = False parser = argparse.ArgumentParser( description='Generate reports from Sentry/Medius', add_help=True) parser.add_argument( '--startDate', '-d',
#!/usr/bin/env python ''' Created on Jan 3 2019 @author: Patrick Rosini ''' import argparse import logging import json import sentryConnection import pandas as pd from sentryLogging import logger from collections import OrderedDict logger.debug("Read Dish") """ In Use - enable EVERTZ - Launch Status EVERTZ - DMG1 EVERTZ - DMG2 EVERTZ - Encoder Backup Port portnum (backup) MULTICAST - groupAddr, desc EVERTZ - IRD1 EVERTZ - IRD2 Multicast DUPLICATE Primary Port - portnum (primary) PORT - destPort SSM1 - sourceIp (primary)
def main(): import argparse import sentryConnection import sentryUtils from datetime import datetime, timedelta import sys from xml.sax.saxutils import escape import codecs from time import sleep import json import csv sys.stdout = codecs.getwriter('utf8')(sys.stdout) logger.debug("Entering Main") one_day = timedelta(days=1) header = False parser = argparse.ArgumentParser( description='Genrate reports from Sentry/Medius', add_help=True) parser.add_argument( '--startDate', '-d', dest='startDate', help='date/time to start reporting period mm/dd/yy hh:mm:ss PM', required=True) parser.add_argument( '--endDate', '-e', dest='endDate', help='date/time to end reporting period mm/dd/yy hh:mm:ss PM', required=True) parser.add_argument('--duration', '-D', dest='duration', help='length of reports in seconds', required=True) parser.add_argument('--system', '-s', dest='system', help='URL of Sentry or Medius', required=True) parser.add_argument('--userName', '-u', dest='userName', help='userName for login', required=True) parser.add_argument('--password', '-p', dest='password', help='password for login', required=True) parser.add_argument( '--output', '-o', dest='outFile', help='file for output', default=(datetime.today() - one_day).strftime('%d%b%Y') + '.csv') results = parser.parse_args() Sentry = sentryConnection.Sentry(tekip=results.system, medius=False, user=results.userName, passwd=results.password) #print Sentry.get_sentry_info() # make real dates try: systemStartDate = sentryUtils.systemDateTime(results.startDate) systemEndDate = sentryUtils.systemDateTime(results.endDate) except Exception, e: print "invalid dates, they should be in for format mm/dd/yy hh:mm:ss PM, {0}".format( e) sys.exit(1)
def main(): sys.stdout = codecs.getwriter('utf8')(sys.stdout) logger.debug("Entering Main") one_day = timedelta(days=1) header = False parser = argparse.ArgumentParser( description='Generate reports from Sentry/Medius', add_help=True) parser.add_argument( '--startDate', '-d', dest='startDate', help='date/time to start reporting period mm/dd/yy hh:mm:ss PM', required=True) parser.add_argument( '--endDate', '-e', dest='endDate', help='date/time to end reporting period mm/dd/yy hh:mm:ss PM', required=True) parser.add_argument('--duration', '-D', dest='duration', help='length of reports in seconds', required=True) parser.add_argument('--system', '-s', dest='system', help='URL of Sentry or Medius', required=True) parser.add_argument('--userName', '-u', dest='userName', help='userName for login', required=True) parser.add_argument('--password', '-p', dest='password', help='password for login', required=True) parser.add_argument('--output', '-o', dest='outFile', help='file for output', default=(datetime.today() - one_day).strftime('%d%b%Y')) parser.add_argument('--endmin', '-m', dest='endMin', help='End minute to filter results on', default='20') results = parser.parse_args() sentrys = [] for item in results.system.split(','): sentrys.append( sentryConnection.Sentry(tekip=(item.strip()), medius=False, user=results.userName, passwd=results.password)) # make real dates try: system_start_date = sentryUtils.systemDateTime(results.startDate) system_end_date = sentryUtils.systemDateTime(results.endDate) except Exception, e: print "invalid dates, they should be in for format mm/dd/yy hh:mm:ss PM, {0}".format( e) sys.exit(1)
def deletePrimaryPIDSettings(self, sentryList): """ { "jsonrpc":2.0, "method":"Audio.GetPrimaryPIDSettings", "params":{ "outputType":"json", "sentryNames":"10.0.1.12,10.0.1.13,10.0.1.14" }, "id":1 } { "jsonrpc":2.0, "method":"Audio.DeletePrimaryPIDSettings", "params":{ "inputType":"json", "inputSettings":[{ "sentryName": "192.0.0.0", "portNumber":"1", "programNumber":"10" }, { "sentryName": "192.0.0.0", "portNumber":"2", "programNumber":"10" } ] }, "id":1 } """ logger.debug("Entering deletePrimaryPIDSettings") for sentry in sentryList: request = """{{ "jsonrpc":2.0, "method":"Audio.GetPrimaryPIDSettings", "params":{{ "outputType":"json", "sentryNames":"{0!s}" }}, "id":1 }}""".format(sentry.strip()) logger.debug(request) this_response = requests.post(self.requesturl, data=request) sentryUtils.log_response(this_response) audioSettings = json.loads(this_response.text, parse_int = int, parse_float = int) if audioSettings.has_key('result'): for audio in audioSettings['result']: if not audio.has_key('Error'): request = """{{ "jsonrpc":2.0, "method":"Audio.DeletePrimaryPIDSettings", "params":{{ "inputType":"json", "inputSettings":[{{ "sentryName": "{0!s}", "portNumber":"{1!s}", "programNumber":"{2!s}" }} ] }}, "id":1 }}""".format(sentry.strip(),audio['port_number'],audio['program_number']) logger.debug(request) this_response = requests.post(self.requesturl, data=request) sentryUtils.log_response(this_response) logger.debug("Leaving deletePrimaryPIDSettings")
def main(): ''' main function ''' logger.debug("Entering Read Dish Main") parser = argparse.ArgumentParser(description='Import new settings', add_help=True) parser.add_argument('--file','-f', dest='file', help='File to read', default="Sling.csv") parser.add_argument('--system' ,'-s', dest='system', help='URL of Sentry or Medius', required=True) parser.add_argument('--user' ,'-u', dest='userName', help='userName for login', required=True) parser.add_argument('--pass' ,'-p', dest='password', help='password for login', required=True) parser.add_argument('--sentrylist','-S', dest='sentrylist', help='list of Sentrys', default="sentrys.csv") parser.add_argument('--testing','-T', dest='testing', help='for testing, removes > 1000 and over Sentry 3', action='store_true') results = parser.parse_args() dt = pd.read_csv(results.file, keep_default_na=False) ProgramList = dt.to_dict('records') #sentrys=['10.0.1.12','10.0.1.13','10.0.1.14','10.126.2.37','10.126.2.39'] sentrylist = open(results.sentrylist.strip(),"r") sentrys = sentrylist.readlines() medius = sentryConnection.Sentry(tekip=(results.system.strip()), medius=True, user=results.userName.strip(), passwd=results.password.strip()) UpdateMPEGInput = [] for program in ProgramList: if logger.getEffectiveLevel() <= logging.DEBUG: logger.debug(program) if program['SLING CALL'] and (not results.testing or int(program['Sentry Number'].strip().replace("Sentry ","")) <= 3): # three to stay within my test system #primary monitoring ProgramDict = {'portnum':int((program['Primary Port']).replace("Port ",""))} ProgramDict['portNumber'] = int((program['Primary Port']).replace("Port ","")) ProgramDict['sourceIp'] = str(program['SSM1'].strip()) ProgramDict['groupAddr'] = str(program['MULTICAST'].strip()) ProgramDict['destPort'] = int(program['PORT']) ProgramDict['name'] = str(program['SLING CALL'].strip()) + str("-Pri") ProgramDict['desc'] = str(program['SSM1'].strip()) ProgramDict['sentryName'] = sentrys[int(str(program['Sentry Number'].strip()).replace("Sentry ","")) - 1].strip() ProgramDict['providerName'] = str(program['SLING CALL'].strip()) + str("-Pri") if str(program['In Use'].strip()) == 'Yes': ProgramDict['enabled'] = True else: ProgramDict['enabled'] = False ProgramDict['Audio_1'] = str(program['Audio_1'].strip()) ProgramDict['Audio_2'] = str(program['Audio_2'].strip()) ProgramDict['userAdded'] = 'true' ProgramDict['programNumber'] = int(-1) #write dict to list UpdateMPEGInput.append(ProgramDict) #Backup monitoring ProgramDict = {'sourceIp':str(program['SSM2'].strip())} if results.testing: # for testing fit the ports under 1000 ProgramDict['portnum'] = int((program['Backup Port']).replace("Port ","")) - 500 ProgramDict['portNumber'] = int((program['Backup Port']).replace("Port ","")) - 500 else: ProgramDict['portnum'] = int((program['Backup Port']).replace("Port ","")) ProgramDict['portNumber'] = int((program['Backup Port']).replace("Port ","")) ProgramDict['groupAddr'] = str(program['MULTICAST'].strip()) ProgramDict['destPort'] = int(program['PORT']) ProgramDict['name'] = str(program['SLING CALL'].strip()) + str("-Bu") ProgramDict['desc'] = str(program['SSM2'].strip()) ProgramDict['sentryName'] = sentrys[int(str(program['Sentry Number'].strip()).replace("Sentry ","")) - 1].strip() ProgramDict['providerName'] = str(program['SLING CALL'].strip()) + str("-Bu") if str(program['In Use'].strip()) == 'Yes': ProgramDict['enabled'] = True else: ProgramDict['enabled'] = False ProgramDict['Audio_1'] = str(program['Audio_1'].strip()) ProgramDict['Audio_2'] = str(program['Audio_2'].strip()) ProgramDict['userAdded'] = 'true' ProgramDict['programNumber'] = int(-1) #write dict to list UpdateMPEGInput.append(ProgramDict) #print UpdateMPEGInput if logger.getEffectiveLevel() <= logging.DEBUG: for program in UpdateMPEGInput: logger.debug(json.dumps(program)) medius.UpdateMPEGInput(UpdateMPEGInput, BreakNumber=40) medius.SetProgramMapping(UpdateMPEGInput, BreakNumber=40) medius.deletePrimaryPIDSettings(sentrys) medius.updatePrimaryAudio(UpdateMPEGInput)
#!/usr/bin/env python ''' Created on Aug 13 2018 @author: Patrick Rosini ''' from sentryLogging import logger from datetime import datetime, timedelta logger.debug("Entering Program stats") def main(): import argparse import sentryConnection import sentryUtils from datetime import datetime, timedelta import sys from xml.sax.saxutils import escape import codecs from time import sleep import json import csv sys.stdout = codecs.getwriter('utf8')(sys.stdout) logger.debug("Entering Main") one_day = timedelta(days=1) header = False