From 499491334fa4ee3277cb46b1343e1aa3b478d5e6 Mon Sep 17 00:00:00 2001 From: April Date: Sat, 8 Oct 2022 14:51:20 -0700 Subject: [PATCH] Floppa's i2 scripts --- Alerts.py | 347 +++++++++++++++++++++++++++++++++++++++++++ lo8s.py | 120 +++++++++++++++ py2Lib/bit.py | 260 ++++++++++++++++++++++++++++++++ py2Lib/command.py | 309 ++++++++++++++++++++++++++++++++++++++ py2Lib/starbundle.py | 45 ++++++ 5 files changed, 1081 insertions(+) create mode 100644 Alerts.py create mode 100644 lo8s.py create mode 100644 py2Lib/bit.py create mode 100644 py2Lib/command.py create mode 100644 py2Lib/starbundle.py 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