diff --git a/Alerts.py b/Alerts.py
new file mode 100644
index 0000000..1ed36c4
--- /dev/null
+++ b/Alerts.py
@@ -0,0 +1,347 @@
+import requests
+import json
+import os
+from datetime import datetime,timedelta
+import time
+import pytz
+import xml.dom.minidom
+import shutil
+import gzip
+import py2Lib.bit as bit
+
+#Zones/Counties to fetch alerts for
+interestList = ['FLZ151', 'FLC057', 'FLZ149', 'FLZ249', 'FLC101']
+
+#You can safely edit the API key here. Make sure to include the ' before and after the key
+headlineApiKey = '21d8a80b3d6b444998a80b3d6b1449d3'
+detailsApiKey = '21d8a80b3d6b444998a80b3d6b1449d3'
+
+#Where does this script live? Put path below.
+#Sorry I'm too lazy to program this script figure it out itself.
+path = 'D:\\PythonScripts\\Alerts'
+
+k = 0
+def getAlerts(location):
+ global k
+ fetchUrl = 'https://api.weather.com/v3/alerts/headlines?areaId=' + location + ':US&format=json&language=en-US&apiKey=' + headlineApiKey
+ response = requests.get(fetchUrl)
+
+ theCode = response.status_code
+
+ #Our global variables
+
+
+ #Set the actions based on response code
+ if theCode == 204:
+ print('No alerts for area ' + location + '.\n')
+ return
+ elif theCode == 403:
+ print("Uh oh! Your API key may not be authorized for alerts. Tsk Tsk. Maybe you shouldn't pirate IBM data :)\n")
+ return
+ elif theCode == 401:
+ print("Uh oh! This request requires authentication. Maybe you shouldn't try to access resources for IBM employee's only :)\n")
+ return
+ elif theCode == 404:
+ print("Uh oh! The requested resource cannot be found. This means either the URL is wrong or IBM is having technical difficulties :(\n Or.... They deleted the API :O\n")
+ return
+ elif theCode == 405:
+ print("Uh oh! Got a 405! This means that somehow.... someway..... this script made an invalid request. So sad..... So terrible..... :(\n")
+ return
+ elif theCode == 406:
+ print("Uh oh! Got a 406! This means that IBM doesn't like us. :(\n")
+ return
+ elif theCode == 408:
+ print("Uh oh! We were too slow in providing IBM our alert request. Although I prefer to say we were Slowly Capable! :)\n")
+ return
+ elif theCode == 500:
+ print("Uh oh! Seems IBM's on call IT Tech spilled coffee on the server! Looks like no alerts for a while. Please check back later :)\n")
+ return
+ elif theCode == 502 or theCode == 503 or theCode == 504:
+ print("Uh oh! This is why you don't have interns messing with the server configuration. Please stand by while IBM's on call IT Tech resolves the issue :)\n")
+ return
+ elif theCode == 200:
+ pass
+
+ #Alright lets map our headline variables.
+ print('Found Alert for ' + location + '\n')
+ dataH = response.json()
+ alertsRoot = dataH['alerts']
+
+ for x in alertsRoot:
+ detailKey = x['detailKey']
+ #Lets get map our detail variables.
+ detailsUrl = 'https://api.weather.com/v3/alerts/detail?alertId=' + detailKey + '&format=json&language=en-US&apiKey=' + detailsApiKey
+ detailsResponse = requests.get(detailsUrl)
+ dataD = detailsResponse.json()
+ detailsRoot = dataD['alertDetail']
+ theDetailsText = detailsRoot['texts']
+ detailsText = theDetailsText[0]
+ descriptionRaw = detailsText['description']
+ language = detailsText['languageCode']
+ Identifier = location + '_' + x['phenomena'] + '_' + x['significance'] + '_' + str(x['processTimeUTC'])
+
+ #Is this for a NWS Zone or County?
+ last4 = location[2:]
+ locationType = None
+ if 'C' in last4:
+ locationType = 'C'
+ elif 'Z' in last4:
+ locationType = 'Z'
+
+ #theIdent = str(Identifier)
+ thecheck = open(path + '\\Output\\alertmanifest.txt', "r")
+ check = thecheck.read()
+
+ if check.find(Identifier) != -1:
+ print("Alert already sent...")
+ return
+ k += 1 #We have an alert to send!
+
+ #Lets Map Our Vocal Codes!
+ vocalCheck = x['phenomena'] + '_' + x['significance']
+ vocalCode = None
+
+ if vocalCheck == 'HU_W':
+ vocalCode = 'HE001'
+ elif vocalCheck == 'TY_W':
+ vocalCode = 'HE002'
+ elif vocalCheck == 'HI_W':
+ vocalCode = 'HE003'
+ elif vocalCheck == 'TO_A':
+ vocalCode = 'HE004'
+ elif vocalCheck == 'SV_A':
+ vocalCode = 'HE005'
+ elif vocalCheck == 'HU_A':
+ vocalCode = 'HE006'
+ elif vocalCheck == 'TY_A':
+ vocalCode = 'HE007'
+ elif vocalCheck == 'TR_W':
+ vocalCode = 'HE008'
+ elif vocalCheck == 'TR_A':
+ vocalCode = 'HE009'
+ elif vocalCheck == 'TI_W':
+ vocalCode = 'HE010'
+ elif vocalCheck == 'HI_A':
+ vocalCode = 'HE011'
+ elif vocalCheck == 'TI_A':
+ vocalCode = 'HE012'
+ elif vocalCheck == 'BZ_W':
+ vocalCode = 'HE013'
+ elif vocalCheck == 'IS_W':
+ vocalCode = 'HE014'
+ elif vocalCheck == 'WS_W':
+ vocalCode = 'HE015'
+ elif vocalCheck == 'HW_W':
+ vocalCode = 'HE016'
+ elif vocalCheck == 'LE_W':
+ vocalCode = 'HE017'
+ elif vocalCheck == 'ZR_Y':
+ vocalCode = 'HE018'
+ elif vocalCheck == 'CF_W':
+ vocalCode = 'HE019'
+ elif vocalCheck == 'LS_W':
+ vocalCode = 'HE020'
+ elif vocalCheck == 'WW_Y':
+ vocalCode = 'HE021'
+ elif vocalCheck == 'LB_Y':
+ vocalCode = 'HE022'
+ elif vocalCheck == 'LE_Y':
+ vocalCode = 'HE023'
+ elif vocalCheck == 'BZ_A':
+ vocalCode = 'HE024'
+ elif vocalCheck == 'WS_A':
+ vocalCode = 'HE025'
+ elif vocalCheck == 'FF_A':
+ vocalCode = 'HE026'
+ elif vocalCheck == 'FA_A':
+ vocalCode = 'HE027'
+ elif vocalCheck == 'FA_Y':
+ vocalCode = 'HE028'
+ elif vocalCheck == 'HW_A':
+ vocalCode = 'HE029'
+ elif vocalCheck == 'LE_A':
+ vocalCode = 'HE030'
+ elif vocalCheck == 'SU_W':
+ vocalCode = 'HE031'
+ elif vocalCheck == 'LS_Y':
+ vocalCode = 'HE032'
+ elif vocalCheck == 'CF_A':
+ vocalCode = 'HE033'
+ elif vocalCheck == 'ZF_Y':
+ vocalCode = 'HE034'
+ elif vocalCheck == 'FG_Y':
+ vocalCode = 'HE035'
+ elif vocalCheck == 'SM_Y':
+ vocalCode = 'HE036'
+ elif vocalCheck == 'EC_W':
+ vocalCode = 'HE037'
+ elif vocalCheck == 'EH_W':
+ vocalCode = 'HE038'
+ elif vocalCheck == 'HZ_W':
+ vocalCode = 'HE039'
+ elif vocalCheck == 'FZ_W':
+ vocalCode = 'HE040'
+ elif vocalCheck == 'HT_Y':
+ vocalCode = 'HE041'
+ elif vocalCheck == 'WC_Y':
+ vocalCode = 'HE042'
+ elif vocalCheck == 'FR_Y':
+ vocalCode = 'HE043'
+ elif vocalCheck == 'EC_A':
+ vocalCode = 'HE044'
+ elif vocalCheck == 'EH_A':
+ vocalCode = 'HE045'
+ elif vocalCheck == 'HZ_A':
+ vocalCode = 'HE046'
+ elif vocalCheck == 'DS_W':
+ vocalCode = 'HE047'
+ elif vocalCheck == 'WI_Y':
+ vocalCode = 'HE048'
+ elif vocalCheck == 'SU_Y':
+ vocalCode = 'HE049'
+ elif vocalCheck == 'AS_Y':
+ vocalCode = 'HE050'
+ elif vocalCheck == 'WC_W':
+ vocalCode = 'HE051'
+ elif vocalCheck == 'FZ_A':
+ vocalCode = 'HE052'
+ elif vocalCheck == 'WC_A':
+ vocalCode = 'HE053'
+ elif vocalCheck == 'AF_W':
+ vocalCode = 'HE054'
+ elif vocalCheck == 'AF_Y':
+ vocalCode = 'HE055'
+ elif vocalCheck == 'DU_Y':
+ vocalCode = 'HE056'
+ elif vocalCheck == 'LW_Y':
+ vocalCode = 'HE057'
+ elif vocalCheck == 'LS_A':
+ vocalCode = 'HE058'
+ elif vocalCheck == 'HF_W':
+ vocalCode = 'HE059'
+ elif vocalCheck == 'SR_W':
+ vocalCode = 'HE060'
+ elif vocalCheck == 'GL_W':
+ vocalCode = 'HE061'
+ elif vocalCheck == 'HF_A':
+ vocalCode = 'HE062'
+ elif vocalCheck == 'UP_W':
+ vocalCode = 'HE063'
+ elif vocalCheck == 'SE_W':
+ vocalCode = 'HE064'
+ elif vocalCheck == 'SR_A':
+ vocalCode = 'HE065'
+ elif vocalCheck == 'GL_A':
+ vocalCode = 'HE066'
+ elif vocalCheck == 'MF_Y':
+ vocalCode = 'HE067'
+ elif vocalCheck == 'MS_Y':
+ vocalCode = 'HE068'
+ elif vocalCheck == 'SC_Y':
+ vocalCode = 'HE069'
+ elif vocalCheck == 'UP_Y':
+ vocalCode = 'HE073'
+ elif vocalCheck == 'LO_Y':
+ vocalCode = 'HE074'
+ elif vocalCheck == 'AF_V':
+ vocalCode = 'HE075'
+ elif vocalCheck == 'UP_A':
+ vocalCode = 'HE076'
+ elif vocalCheck == 'TAV_W':
+ vocalCode = 'HE077'
+ elif vocalCheck == 'TAV_A':
+ vocalCode = 'HE078'
+ elif vocalCheck == 'TO_W':
+ vocalCode = 'HE110'
+ else:
+ vocalCode = ''
+
+ #Do some date/time conversions
+ EndTimeUTCEpoch = x['expireTimeUTC']
+ EndTimeUTC = datetime.utcfromtimestamp(EndTimeUTCEpoch).strftime('%Y%m%d%H%M')
+ #EndTimeUTC = EndTimeUTCString.astimezone(pytz.UTC)
+
+ expireTimeEpoch = x['expireTimeUTC']
+ expireTimeUTC = datetime.utcfromtimestamp(expireTimeEpoch).strftime('%Y%m%d%H%M')
+
+ #V3 Alert API doesn't give us issueTime in UTC. So we have to convert ourselves. Ughhh!!
+ iTLDTS = x['issueTimeLocal']
+ iTLDTO = datetime.strptime(iTLDTS, '%Y-%m-%dT%H:%M:%S%z')
+ issueTimeToUTC = iTLDTO.astimezone(pytz.UTC)
+ issueTimeUtc = issueTimeToUTC.strftime('%Y%m%d%H%M')
+
+ processTimeEpoch = x['processTimeUTC']
+ processTime = datetime.fromtimestamp(processTimeEpoch).strftime('%Y%m%d%H%M%S')
+
+ #What is the action of this alert?
+ Action = None
+ if x['messageType'] == 'Update':
+ Action = 'CON'
+ elif x['messageType'] == 'New':
+ Action = 'NEW'
+
+ #Fix description to replace new lines with space and add XML escape Chars. when needed
+
+ description = ' '.join(descriptionRaw.splitlines())
+ description = description.replace('&', '&')
+ description = description.replace('<', '<')
+ description = description.replace('>', '>')
+ description = description.replace('-', '')
+ description = description.replace(':', '')
+
+ #Is this alert urgent?
+ urgency ='piss'
+ if vocalCheck == 'TO_W' or vocalCheck == 'SV_W' or vocalCheck == 'FF_W':
+ urgency = 'BEUrgent'
+ else:
+ urgency = 'BERecord'
+
+ alertMsg = 'NOT_USED' + x['productIdentifier'] + 'NOT_USED' + Action + '' + x['officeCode'] + '' + x['phenomena'] + '' + x['significance'] + '' + x['eventTrackingNumber'] + '' + x['eventDescription'] + 'NOT_USED' + EndTimeUTC + '' + str(x['severityCode']) + 'NOT_USED' + expireTimeUTC + '' + location + '' + x['adminDistrictCode'] + 'NOT_USEDNOT_USEDNOT_USED' + x['identifier'] + '' + processTime + '' + issueTimeUtc + '' + x['headlineText'] + '' + vocalCode + 'NOT_USED' + description + 'NOT_USED' + location + '_' + x['phenomena'] + '_' + x['significance'] + '_' + x['eventTrackingNumber'] + '_' + x['officeCode'] + ''
+
+ #Append BERecord
+ with open(path + '\\Output\\BERecord.xml', "a") as b:
+ b.write(alertMsg)
+ b.close()
+
+ #Add our alert to the manifest so we don't keep sending in the same alert every 60 seconds unless an update is issued.
+ with open(path + '\\Output\\alertmanifest.txt', "a") as c:
+ c.write('\n' + location + '_' + x['phenomena'] + '_' + x['significance'] + '_' + str(x['processTimeUTC']))
+ c.close()
+
+
+n = 0
+while n==0:
+ #Start our XML File
+ with open(path + '\\Output\\BERecord.xml', "w") as e:
+ e.write('')
+ e.close()
+ for i in interestList:
+ getAlerts(i)
+ #Close our XML File
+ with open(path + '\\Output\\BERecord.xml', "a") as d:
+ d.write('')
+ d.close()
+ dom = xml.dom.minidom.parse(path + '\\Output\\BERecord.xml')
+ pretty_xml_as_string = dom.toprettyxml(indent = " ")
+
+ with open(path + '\\Output\\BERecord.i2m', "w") as h:
+ h.write(pretty_xml_as_string[23:])
+ h.close()
+ if k > 0:
+ with open(path + '\\Output\\BERecord.i2m', 'rb') as f_in:
+ with gzip.open(path + '\\Output\\BERecord.gz', 'wb') as f_out:
+ shutil.copyfileobj(f_in, f_out)
+
+ files = []
+ commands = []
+ gZipFile = path + '\\Output\\BERecord.gz'
+ files.append(gZipFile)
+ command = commands.append('')
+ bit.sendFile(files, commands, 1, 0)
+ os.remove(gZipFile)
+ k = 0
+ os.remove(path + '\\Output\\BERecord.xml')
+ #os.remove(path + '\\Output\\BERecord.i2m')
+
+ print('Will sleep for 60 seconds...\n')
+ time.sleep(60)
\ No newline at end of file
diff --git a/lo8s.py b/lo8s.py
new file mode 100644
index 0000000..abb2944
--- /dev/null
+++ b/lo8s.py
@@ -0,0 +1,120 @@
+import py2Lib.bit as bit
+import time
+from datetime import datetime,timedelta
+import random
+
+theNow = datetime.now()
+
+currentHour = theNow.strftime('%H')
+
+def runLo8s(flavor, duration, LDL, logo = None, LDLColor = None, EmergencyLFCancel = None):
+
+ Id = ''.join(random.choice('ABCDEF0123456789') for i in range(16))
+
+ nowUTC = datetime.utcnow()
+
+ now = datetime.now()
+
+ currentHour = nowUTC.strftime('%H')
+
+ friendlyRunTime = now + timedelta(seconds=30)
+
+ runTime = nowUTC + timedelta(seconds=30)
+
+ runTimeLDL = nowUTC + timedelta(seconds=30)
+
+ ldlCancelTime = runTimeLDL.strftime('%m/%d/%Y %H:%M:%S'+':02')
+
+ lo8sRunTime = runTime.strftime('%m/%d/%Y %H:%M:%S'+':00')
+
+ friendlyLo8sRunTime = friendlyRunTime.strftime('%m/%d/%Y %I:%M:%S %p')
+
+ if flavor == 'Z':
+ nextLDLRunTime = runTime + timedelta(seconds=91)
+ else:
+ nextLDLRunTime = runTime + timedelta(seconds=65)
+
+ nextLDLRun = nextLDLRunTime.strftime('%m/%d/%Y %H:%M:%S'+':02')
+
+ if duration == '60':
+ duration = '1800'
+ elif duration == '65':
+ duration = '1950'
+ elif duration == '90':
+ duration = '2700'
+ elif duration == '120':
+ duration = '3600'
+ else:
+ print('Invalid Duration specified. Please specifiy length of the local forecast in seconds. 60 for 1 minute, 65 for 1 minute 5 seconds, 90 for 1 minute 30 seconds, 120 for 2 minutes.\n\nScript will now terminate...')
+ exit()
+ nextLDLRun = nextLDLRunTime.strftime('%m/%d/%Y %H:%M:%S'+':02')
+
+ if EmergencyLFCancel == 1:
+ print('Emergency Local On The 8s Kill Switch is Activated. No Local On The 8s Will Air. Maybe b3atdropp3r Hacked An i2 Again???\n' + friendlyLo8sRunTime)
+ time.sleep(27)
+ elif logo != '':
+ print('Sending Load Command To All Stars. The Local On The 8s is expected to start at ' + friendlyLo8sRunTime + ' ...')
+ bit.sendCommand([''], 1)
+ time.sleep(27)
+ else:
+ print('Sending Load Command To All Stars. The Local On The 8s is expected to start at ' + friendlyLo8sRunTime + ' ...')
+ bit.sendCommand([''], 1)
+ time.sleep(27)
+ #Cancel LDL
+ print('\nCanceling LDL...')
+ bit.sendCommand([''], 1)
+ #time.sleep(1)
+
+ if EmergencyLFCancel == 1:
+ print('Not Airing Local On The 8s Due To Kill Switch Activated. Will Reload LDL After National DBS Forecast Finishes...')
+ time.sleep(53)
+ else:
+ #Run Local On The 8s
+ print('\nSending The Run Command. Stand By For Your Local Forecast...')
+ bit.sendCommand([''], 1)
+ time.sleep(53)
+
+ if EmergencyLFCancel == 1:
+ color = None
+ if LDLColor == 0:
+ color = 'E'
+ elif LDLColor == 1:
+ color = 'F'
+ else:
+ color = 'E'
+ print("\nGetting The LDL Ready So It'll Cue After The National DBS Local Forecast")
+ bit.sendCommand([''], 1)
+ time.sleep(10)
+ print("\nSending The Run Command For The LDL...")
+ bit.sendCommand([''], 1)
+ elif LDL == 1:
+ color = None
+ if LDLColor == 0:
+ color = 'E'
+ elif LDLColor == 1:
+ color = 'F'
+ else:
+ color = 'E'
+ #Load LDL
+ print("\nGetting The LDL Ready So It'll Cue After This Local Forecast...")
+ bit.sendCommand([''], 1)
+ time.sleep(10)
+ #Run LDL
+ print('''\nSending The Run Command For The LDL. As Dave Schwartz Would Say... "That's a Wrap!"''')
+ bit.sendCommand([''], 1)
+ else:
+ time.sleep(10)
+ print('''That's It Folks. As Dave Schwartz Would Say... "That's a Wrap!"''')
+
+BG = ['3094', '3095', '3103', '3115', '3093']
+
+#if currentHour == '22' or currentHour == '23' or currentHour == '00' or currentHour == '06' or currentHour == '07' or currentHour == '08' or currentHour == '09' or currentHour == '10' or currentHour == '11' or currentHour == '12' or currentHour == '13' or currentHour == '14' or currentHour == '15' or currentHour == '16' or currentHour == '17' or currentHour == '18' or currentHour == '19' or currentHour == '20' or currentHour == '21':
+branded = random.choice(BG)
+#else:
+ #branded = ''
+
+#Flavor, Duration, Air LDL After Forecast (1 For Yes or 0 For No), Logo(Optional), LDL Color Mode (Leave blank for normal or 1 for Severe Mode), Emergency Local On The 8s Kill Switch (1 For Kill or leave blank for normal)
+runLo8s('V2', '65', 1, branded, 1) #5053 Jonas
+#V for Normal Black Logo
+#V2 for Red Logo
+
diff --git a/py2Lib/bit.py b/py2Lib/bit.py
new file mode 100644
index 0000000..e4f0f90
--- /dev/null
+++ b/py2Lib/bit.py
@@ -0,0 +1,260 @@
+import socket
+import sys
+import os
+import struct
+import binascii
+import math
+import time
+
+MCAST_GRP = '224.1.1.77'
+MCAST_IF = '127.0.0.1'
+BUF_SIZE = 1396
+
+MULTICAST_TTL = 2
+
+conn = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
+conn.setsockopt(socket.SOL_IP,socket.IP_ADD_MEMBERSHIP,socket.inet_aton(MCAST_GRP)+socket.inet_aton(MCAST_IF))
+
+test = b"This is a test"
+
+def sendFile(files, commands, numSgmts, Pri):
+ if Pri == 0:
+ MCAST_PORT = 7787
+ elif Pri == 1:
+ MCAST_PORT = 7788
+ else:
+ print("Invalid Priority Flag. 0 = Routine Message 1 = High Priority Message\n\nScript will now terminate...")
+ exit()
+ #Get the next message ID
+ with open('C:\\Clips\\msgId.txt', "r") as f:
+ oMsgId = f.read()
+ msgNum = int(oMsgId)
+ f.close()
+
+ nMsgNum = msgNum + 1
+ h = open('C:\\Clips\\msgId.txt', "w")
+ h.write(str(nMsgNum))
+ h.close()
+ segnmNum = 0
+ if Pri == 0:
+ print("Sending Routine Msg-" + str(msgNum) + " on UDP " + MCAST_GRP + " " + str(MCAST_PORT) + "....")
+ elif Pri == 1:
+ print("Sending High Priority Msg-" + str(msgNum) + " on UDP " + MCAST_GRP + " " + str(MCAST_PORT) + "....")
+ startFlag = False
+
+ for x, y in zip(files, commands):
+ size = os.path.getsize(x)
+ check = size - BUF_SIZE
+ pToBeSent = size / 1405
+ packRounded = math.ceil(pToBeSent) + 1
+ numSegments = numSgmts + 3
+ total_sent = 0
+ payloadLength = 0
+ packet_count = 1
+ j = 0
+ pc = packet_count.to_bytes(1, byteorder='big')
+ i = 0
+ encode1 = bytes(y + 'I2MSG', 'UTF-8')
+ commandLength = len(y)
+ encode2 = commandLength.to_bytes(4, byteorder='little')
+ theCommand = b"".join([encode1, encode2])
+ char = ''
+ new_file = open(x, "ab")
+ new_file.write(theCommand) # Append command to end of the file
+ new_file.close()
+ new_size = os.path.getsize(x)
+
+ if startFlag == False:
+ #Our 34 byte beginning packet
+ p1 = struct.pack(">BHHHIIBBBBBBBIBIBBB", 18, 1, 0 , 16, msgNum, 0, segnmNum, 0, 0, 8, numSegments, 3, 0, 0, 8, packRounded, 0, 0, 0)
+ conn.sendto(p1, (MCAST_GRP, MCAST_PORT))
+ startFlag = True
+ with open(x,"rb") as message:
+ message.seek(0)
+ data = message.read(BUF_SIZE)
+ while data:
+ packetHeader = struct.pack(">BHHHIIBBB", 18, 1, 0, 1405, msgNum, packet_count, 0, 0, 0)
+ fec = struct.pack("BHHHIIBBBBBBBI", 18, 1, 1, 8, msgNum, 0, segnmNum, 0, 0, 8, 0, 0, 0, 67108864)
+ p4 = struct.pack(">BHHHIIBBB", 18, 1, 1, 14, msgNum, 1, segnmNum, 0, 0) + test
+ conn.sendto(p3, (MCAST_GRP, MCAST_PORT))
+ conn.sendto(p4, (MCAST_GRP, MCAST_PORT))
+ segnmNum += 1
+ w -= 1
+ #-------------------------------------------------------------------------------------------------------
+def sendCommand(command, Pri, msgNum = None):
+ if Pri == 0:
+ MCAST_PORT = 7787
+ elif Pri == 1:
+ MCAST_PORT = 7788
+ else:
+ print("Invalid Priority Flag. 0 = Routine Message 1 = High Priority Message\n\nScript will now terminate...")
+ exit()
+ #Get the next message ID
+ with open('C:\\Clips\\msgId.txt', "r") as f:
+ oMsgId = f.read()
+ msgNum = int(oMsgId)
+ f.close()
+
+ nMsgNum = msgNum + 1
+ h = open('C:\\Clips\\msgId.txt', "w")
+ h.write(str(nMsgNum))
+ h.close()
+ segnmNum = 0
+ if Pri == 0:
+ print("Sending Routine Msg-" + str(msgNum) + " on UDP " + MCAST_GRP + " " + str(MCAST_PORT) + "....")
+ elif Pri == 1:
+ print("Sending High Priority Msg-" + str(msgNum) + " on UDP " + MCAST_GRP + " " + str(MCAST_PORT) + "....")
+ startFlag = False
+
+ for x in command:
+ bx = bytes(x, 'utf-8')
+ with open('D:\\command', 'wb') as c:
+ c.write(bx)
+ c.close()
+ size = os.path.getsize('D:\\command')
+ encode1 = bytes('I2MSG', 'UTF-8')
+ commandLength = size
+ encode2 = commandLength.to_bytes(4, byteorder='little')
+ theCommand = b"".join([encode1, encode2])
+ with open('D:\\command', 'ab') as d:
+ d.write(theCommand)
+ d.close()
+ check = size - BUF_SIZE
+ pToBeSent = size / 1405
+ packRounded = math.ceil(pToBeSent) + 1
+ numSegments = 4
+ total_sent = 0
+ payloadLength = 0
+ packet_count = 1
+ j = 0
+ pc = packet_count.to_bytes(4, byteorder='little')
+ i = 0
+ char = ''
+ new_size = os.path.getsize('D:\\command')
+
+ if startFlag == False:
+ #Our 34 byte beginning packet
+ p1 = struct.pack(">BHHHIIBBBBBBBIBIBBB", 18, 1, 0 , 16, msgNum, 0, segnmNum, 0, 0, 8, numSegments, 3, 0, 0, 8, packRounded, 0, 0, 0)
+ conn.sendto(p1, (MCAST_GRP, MCAST_PORT))
+ startFlag = True
+ with open('D:\\Command',"rb") as message:
+ message.seek(0)
+ data = message.read(BUF_SIZE)
+ while data:
+ packetHeader = struct.pack(">BHHHIIBBB", 18, 1, 0, 1405, msgNum, packet_count, 0, 0, 0)
+ fec = struct.pack("BHHHIIBBBBBBBI", 18, 1, 1, 8, msgNum, 0, segnmNum, 0, 0, 8, 0, 0, 0, 67108864)
+ p4 = struct.pack(">BHHHIIBBB", 18, 1, 1, 14, msgNum, 1, segnmNum, 0, 0) + test
+ conn.sendto(p3, (MCAST_GRP, MCAST_PORT))
+ conn.sendto(p4, (MCAST_GRP, MCAST_PORT))
+ segnmNum += 1
+ w -= 1
+ #-------------------------------------------------------------------------------------------------------
+
+
+#Send Current Observations
+#sendFile("C:\\Clips\\CurrentObservations.i2m.gz", 'I2MSG', 0)
+#time.sleep(10)
+#Send Hourly Forecast
+#sendFile("C:\\Clips\\HourlyForecast.i2m.gz", 'I2MSG', 0)
+#time.sleep(10)
+#Send Daily Forecast
+#sendFile("C:\\Clips\\DailyForecast.i2m.gz", 'I2MSG', 0)
+
+#Send radar image
+#sendFile("C:\\Clips\\radar.i2m", 'I2MSG', 0)
+
+#Load Local On The 8s
+#sendCommand('I2MSG', 1)
+#time.sleep(25)
+#Cancel LDL
+#sendCommand('I2MSG', 1)
+#time.sleep(1)
+#Run Local On The 8s
+#sendCommand('I2MSG', 1)
+#time.sleep(35)
+#Load LDL
+#sendCommand('I2MSG', 1)
+#time.sleep(10)
+#Run LDL
+#sendCommand('I2MSG', 1)
+
+#Heartbeat Command
+#sendCommand('I2MSG', 1)
+
+#Misc commands
+#sendCommand('040500I2MSG', 1)
+
+#sendCommand('040500I2MSG', 1)
+#Restart Command
+#sendCommand('040500I2MSG', 1)
+
+#Set ANF Mode
+#sendFile("C:\\Clips\\ANFOn.i2m",'040500040449030025I2MSG', 1)
+
+#SendBundle
+#sendFile("C:\\Clips\\Bundles.zip",'I2MSG', 0)
+
+#Send Upgrade
+#sendFile("C:\\Clips\\Upgrades\\maintenance_1.0.0.50.zip",'I2MSG', 0)
+
+#Stage Upgrade
+#sendCommand('I2MSG', 0)
+
+#Change Passwords
+#sendFile("C:\\Clips\\passwords.i2m",'I2MSG', 0)
\ No newline at end of file
diff --git a/py2Lib/command.py b/py2Lib/command.py
new file mode 100644
index 0000000..48449b1
--- /dev/null
+++ b/py2Lib/command.py
@@ -0,0 +1,309 @@
+import bit
+import os
+import shutil
+import math
+import time
+from datetime import datetime
+
+def restartI2Service(headendIds):
+
+ HeadendList = ''
+
+ for x in headendIds:
+ HeadendList += ('' + x + '')
+ bit.sendCommand('' + HeadendList + 'I2MSG', 1)
+ #print('' + HeadendList + '')
+
+def rebootI2(headendIds):
+
+ HeadendList = ''
+
+ for x in headendIds:
+ HeadendList += ('' + x + '')
+
+ commands = []
+ command = '' + HeadendList + ''
+ commands.append(command)
+ bit.sendCommand(commands, 1)
+
+def clearStarBundle(headendIds, btype):
+
+ HeadendList = ''
+
+ for x in headendIds:
+ HeadendList += ('' + x + '')
+
+ commands = []
+ command = '' + HeadendList + ''
+ commands.append(command)
+ bit.sendCommand(commands, 1)
+
+def changePasswords(PasswordFile, headendIds):
+ HeadendList = ''
+ files = []
+ files.append(PasswordFile)
+ commands = []
+ numSegs = 1
+ if headendIds != None:
+ for x in headendIds:
+ HeadendList += ('' + x + '')
+ command = '' + HeadendList + ''
+ commands.append(command)
+ bit.sendFile(files, commands, numSegs, 0)
+ else:
+ command = ''
+ commands.append(command)
+ bit.sendFile(files, commands, numSegs, 0)
+ os.remove(PasswordFile)
+
+def sendMaintCommand(File, headendIds):
+ HeadendList = ''
+ files = []
+ files.append(File)
+ commands = []
+ numSegs = 1
+ if headendIds != None:
+ for x in headendIds:
+ HeadendList += ('' + x + '')
+ #command = '' + HeadendList + ''
+ #command = '' + HeadendList + ''
+ #command = '' + HeadendList + ''
+ #command = '' + HeadendList + ''
+ #command = '' + HeadendList + ''
+ #command = '' + HeadendList + ''
+ #command = '' + HeadendList + ''
+
+ #I2 HD
+ #command = '' + HeadendList + ''
+ commands.append(command)
+ bit.sendFile(files, commands, numSegs, 0)
+ else:
+ #command = ''
+ commands.append(command)
+ bit.sendFile(files, commands, numSegs, 0)
+ os.remove(File)
+
+def loadRunPres(headendIds, Flavor, Logo, Duration, Id):
+ HeadendList = ''
+
+ for x in headendIds:
+ HeadendList += ('' + x + '')
+
+ if Logo == '':
+ command = ['' + HeadendList + '']
+ bit.sendCommand(command, 1)
+ else:
+ command = ['' + HeadendList + '']
+ bit.sendCommand(command, 1)
+
+def sendStarBundle(File):
+
+ size = os.path.getsize(File)
+ if size >= 67550000:
+ CHUNK_SIZE = 67550000
+ file_number = 1
+ fPath = os.path.dirname(File)
+ fpToSplit = os.path.splitext(File)
+ splitFn = fpToSplit[0].split('\\')
+ newFn = splitFn[-1]
+ eCount = size / CHUNK_SIZE
+ estCount = math.ceil(eCount)
+
+ print("File size is greater than 64MB. Will need to split the files for transmission...\n")
+ time.sleep(1)
+
+
+ with open(File, "rb") as f:
+ chunk = f.read(CHUNK_SIZE)
+ while chunk:
+ if file_number < 10:
+ fileNum = '0' + str(file_number)
+ else:
+ fileNum = file_number
+ with open(fPath + '\\split\\' + newFn + '_' + str(fileNum), "wb") as chunk_file:
+ chunk_file.write(chunk)
+ print('Successfully split file ' + str(file_number) + ' out of ' + str(estCount) + '\n')
+ file_number += 1
+ chunk = f.read(CHUNK_SIZE)
+
+ count = file_number - 1
+ part = 1
+
+ with open('C:\\Clips\\msgId.txt', "r") as f:
+ oMsgId = f.read()
+ Id = int(oMsgId)
+ f.close()
+
+ for x in os.listdir(fPath + '\\split'):
+ path = fPath + '\\split\\'
+ y = path + x
+ if part != count:
+ print(x)
+ bit.sendFile([y],[''], 1, 0)
+ part += 1
+ time.sleep(30)
+ elif part == count:
+ print(x)
+ bit.sendFile([y],[''], 1, 0)
+ time.sleep(30)
+ bit.sendCommand([''], 0)
+ for f in os.listdir(path):
+ os.remove(os.path.join(path, f))
+ else:
+ bit.sendFile([File],[''], 1, 0)
+ os.remove(File)
+
+def sendUpgrade(File, RelName):
+
+ size = os.path.getsize(File)
+ if size >= 67550000:
+ CHUNK_SIZE = 67550000
+ file_number = 1
+ fPath = os.path.dirname(File)
+ fpToSplit = os.path.splitext(File)
+ splitFn = fpToSplit[0].split('\\')
+ newFn = splitFn[-1]
+ eCount = size / CHUNK_SIZE
+ estCount = math.ceil(eCount)
+
+ print("File size is greater than 64MB. Will need to split the files for transmission...\n")
+ time.sleep(1)
+
+
+ with open(File, "rb") as f:
+ chunk = f.read(CHUNK_SIZE)
+ while chunk:
+ if file_number < 10:
+ fileNum = '0' + str(file_number)
+ else:
+ fileNum = file_number
+ with open(fPath + '\\split\\' + newFn + '_' + str(fileNum), "wb") as chunk_file:
+ chunk_file.write(chunk)
+ print('Successfully split file ' + str(file_number) + ' out of ' + str(estCount) + '\n')
+ file_number += 1
+ chunk = f.read(CHUNK_SIZE)
+
+ count = file_number - 1
+ part = 1
+
+ with open('C:\\Clips\\msgId.txt', "r") as f:
+ oMsgId = f.read()
+ Id = int(oMsgId)
+ f.close()
+
+ for x in os.listdir(fPath + '\\split'):
+ path = fPath + '\\split\\'
+ y = path + x
+ if part != count:
+ print(x)
+ bit.sendFile([y],[''], 1, 0)
+ part += 1
+ time.sleep(10)
+ elif part == count:
+ print(x)
+ bit.sendFile([y],[''], 1, 0)
+ part += 1
+ time.sleep(15)
+ bit.sendCommand([''], 0)
+ for f in os.listdir(path):
+ os.remove(os.path.join(path, f))
+ else:
+ bit.sendFile([File],[''], 1, 0)
+ os.remove(File)
+
+def makeStarBundle(Directory, Type, flag, Version, date, sendAfter):
+ header = '\n ' + Version + '\n ' + date + '\n ' + Type + '\n \n'
+ with open('D:\\i2State\\SD\\ChangesetBundle\\MetaData\\manifest.xml', 'w') as ma:
+ ma.write(header)
+ ma.close()
+
+ for (root,dirs,files) in os.walk(Directory, topdown=True):
+ for name in files:
+ rootDir = root[24:]
+ bDest = os.path.join(rootDir,name)
+ fDest = os.path.join(root,name)
+ shutil.copy(fDest, 'D:\\i2State\\SD\\ChangesetBundle')
+ for name in files:
+ if flag == 'Domestic_Universe':
+ flag = 'flags="Domestic_Universe"'
+ elif flag == 'Domestic_SD_Universe':
+ flag = 'flags="Domestic_SD_Universe"'
+ else:
+ pass
+ with open('D:\\i2State\\SD\\ChangesetBundle\\MetaData\\manifest.xml', 'a') as mb:
+ mb.write(' \n')
+ mb.close()
+ closer = ' \n'
+ with open('D:\\i2State\\SD\\ChangesetBundle\\MetaData\\manifest.xml', 'a') as ma:
+ ma.write(closer)
+ ma.close()
+
+
+#restartI2Service(['006833'])
+
+#rebootI2(['006833'])
+
+#clearStarBundle(['006833'], 'Changeset')
+
+#bit.sendCommand([''], 1)
+
+#loadRunPres(['038488'], 'domestic/ldlE', '', '72000', 'LDL1')
+
+#changePasswords('C:\\Clips\\passwords2.gz', ['006833'])
+
+#sendMaintCommand('C:\\Clips\\maint\\temp\\passwords',['040500'])
+
+#sendStarBundle("C:\\Clips\\Bundle.zip")
+
+#sendUpgrade("C:\\Clips\\Upgrades\\wireshark_1.4.6.0.zip", "wireshark_1.4.6.0")
+
+#For splitting
+#sendUpgrade("C:\\Clips\\ChangesetHD.zip", "PipelineMaint_6.15.1.5714")
+
+#For no split upgrades
+#bit.sendFile('C:\\Clips\\Upgrades\\vizRequiredFilesForI2_1.2.0.0.zip', '040500I2MSG', 0)
+
+#For split upgrades
+#bit.sendFile('C:\\Clips\\split\\ChangesetHD_04', 'I2MSG', 0)
+
+#Command for split upgrades
+
+#commands = []
+#command = ''
+
+#commands.append(command)
+#bit.sendCommand(commands, 1, 0)
+
+#bit.sendFile(['C:\\Clips\\Alert.gz'], [''], 1, 0)
+'''
+bit.sendCommand([''], 0)
+bit.sendCommand([''], 0)
+bit.sendCommand([''], 0)
+bit.sendCommand([''], 0)
+bit.sendCommand([''], 0)
+bit.sendCommand([''], 0)
+bit.sendCommand([''], 0)
+bit.sendCommand([''], 0)
+bit.sendCommand([''], 0)
+bit.sendCommand([''], 0)
+bit.sendCommand([''], 0)
+bit.sendCommand([''], 0)
+bit.sendCommand([''], 0)
+bit.sendCommand([''], 0)
+'''
+#bit.sendCommand(['006833'], 1)
+#bit.sendCommand('C:\\Clips\\Upgrades\\split\\PipelineMaint_6.15.1.5714_03', 'I2MSG', 0)
+
+
+
+
+#bit.sendCommand([''], 0)
+
+#bit.sendCommand([''], 1)
+
+#bit.sendCommand([''], 1)
+
+#bit.sendCommand([''], 1)
+
+#makeStarBundle('D:\\i2State\\SD\\Changeset\\audio\\domesticSD\\vocalLocal\\Cantore', 'Changeset', 'Domestic_SD_Universe', '63702614401035937', '09/19/2022', 0)
+
diff --git a/py2Lib/starbundle.py b/py2Lib/starbundle.py
new file mode 100644
index 0000000..cafebac
--- /dev/null
+++ b/py2Lib/starbundle.py
@@ -0,0 +1,45 @@
+import os
+import shutil
+import random
+
+def makeStarBundle(Directory, Type, flag, Version, date, sendAfter):
+ header = '\n ' + Version + '\n ' + date + '\n ' + Type + '\n \n'
+ with open('C:\\Bundle\\MetaData\\manifest.xml', 'w') as ma:
+ ma.write(header)
+ ma.close()
+
+ for (root,dirs,files) in os.walk(Directory, topdown=True):
+ num = 0
+ for name in files:
+ rootDir = None
+ if Type == "Managed":
+ rootDir= root[22:]
+ else:
+ rootDir = root[24:]
+ bDest = os.path.join(rootDir,name)
+ fDest = os.path.join(root,name)
+ signature = ''.join(random.choice('abcdef0123456789') for i in range(32))
+ splitExt = os.path.splitext(name)
+ bName = splitExt[0] + '_' + signature
+ shutil.copy(fDest, 'C:\\Bundle\\' + bName)
+ if flag == 'Domestic_Universe':
+ flag = 'flags="Domestic_Universe"'
+ elif flag == 'Domestic_SD_Universe':
+ flag = 'flags="Domestic_SD_Universe"'
+ else:
+ pass
+ with open('C:\\Bundle\\MetaData\\manifest.xml', 'a') as mb:
+ mb.write(' \n')
+ mb.close()
+ num += 1
+ closer = ' \n'
+ with open('C:\\Bundle\\MetaData\\manifest.xml', 'a') as ma:
+ ma.write(closer)
+ ma.close()
+
+
+
+
+
+ #Directory which contains Files to be bundled Type Flags Version Date SendImmediately(Does not apply to this script)
+makeStarBundle('D:\\i2State\\SD\\Managed\\Events', 'Managed', 'Domestic_SD_Universe', '637898877227230030', '09/28/2022', 0)
\ No newline at end of file