376 lines
11 KiB
Python
376 lines
11 KiB
Python
#!/bin/python3
|
|
'''
|
|
Created on Mar 31, 2014
|
|
|
|
@author: tpweis
|
|
'''
|
|
import os
|
|
import sys
|
|
import subprocess
|
|
import syslog
|
|
import pymongo
|
|
from datetime import datetime, date, time
|
|
from calendar import timegm
|
|
import iso8601
|
|
import time
|
|
import json
|
|
import re
|
|
|
|
def get_addrlist(start_addr=0, count=0, roll_over='yes'):
|
|
"function get_addrlist()"
|
|
|
|
argv = sys.argv[1:]
|
|
|
|
empty_list = []
|
|
# check for values
|
|
if start_addr == 0:
|
|
slscatlog('E','Missing IP address. Try again')
|
|
return empty_list
|
|
|
|
addr_count = 0
|
|
try:
|
|
addr_count = int(count)
|
|
except:
|
|
slscatlog('E',"Address count is bad: " + count)
|
|
|
|
if addr_count == 0:
|
|
slscatlog('E','Missing address count. Try again')
|
|
return empty_list
|
|
|
|
if roll_over not in ["no", "yes"]:
|
|
roll_over = "yes"
|
|
|
|
slscatlog('D',"args: " + start_addr + ", " + str(addr_count) + ", " + roll_over)
|
|
|
|
# First break apart the input address to its respective octets
|
|
|
|
octet_list = re.split(r'(\.)',start_addr)
|
|
# Do a little error checking.
|
|
# We must have at least 7 elements in the list, or it cannot be an IP4 address
|
|
if len(octet_list) < 7 :
|
|
slscatlog('E',"Octet list incomplete. Len = " + str(len(octet_list)))
|
|
return empty_list
|
|
|
|
# the IP address values are in the list, separated by '.' (dot)
|
|
first_octet = octet_list[0]
|
|
second_octet = octet_list[2]
|
|
third_octet = octet_list[4]
|
|
fourth_octet = octet_list[6]
|
|
|
|
# Ensure the starting address is valid
|
|
|
|
bad_address = False
|
|
if int(first_octet) not in range(0,255):
|
|
slscatlog('E',"first octet is bad: " + first_octet)
|
|
bad_address = True
|
|
|
|
if int(second_octet) not in range(0,255):
|
|
slscatlog('E',"second octet is bad: " + second_octet)
|
|
bad_address = True
|
|
|
|
if int(third_octet) not in range(0,255):
|
|
slscatlog('E',"third octet is bad: " + third_octet)
|
|
bad_address = True
|
|
|
|
if int(fourth_octet) not in range(0,255):
|
|
slscatlog('E',"fourth_octet is bad: " + fourth_octet)
|
|
bad_address = True
|
|
|
|
if bad_address:
|
|
return empty_list
|
|
|
|
slscatlog('D',"Input octet list: " + ', '.join(octet_list))
|
|
|
|
# Start constructing the new address list
|
|
ipcount = 0
|
|
a = int(first_octet)
|
|
b = int(second_octet)
|
|
c = int(third_octet)
|
|
d = int(fourth_octet)
|
|
addr_list = []
|
|
# Do this loop 'addr_count' times, unless we run out of numbers.
|
|
while ipcount < addr_count:
|
|
# Increment the counter
|
|
ipcount += 1
|
|
d +=1
|
|
# check for any octet overflow
|
|
if d > 254:
|
|
if roll_over == "yes":
|
|
d = 0
|
|
c += 1
|
|
slscatlog('D',"rollover: d = 0, c = " + str(c))
|
|
else:
|
|
# Note that we only need to check this in one place
|
|
# because we cannot increment the following octets without
|
|
# rolling over the last octet. If we can't roll over, but haven't
|
|
# satisfied the addr_count, this is an error and produces an empty list
|
|
slscatlog('I',"Roll over set to no, ran out of available addresses at: " + '.'.join([str(a),str(b),str(c),str(d)]))
|
|
return empty_list
|
|
|
|
if c > 254:
|
|
c = 0
|
|
b += 1
|
|
|
|
if b > 254:
|
|
b = 0
|
|
a += 1
|
|
|
|
if a > 254:
|
|
# We ran out of numbers. Error out
|
|
slscatlog('E'," Ran out of available addresses: " + '.'.join([str(a),str(b),str(c),str(d)]))
|
|
return empty_list
|
|
# Compose the new address
|
|
new_addr = '.'.join([str(a),str(b),str(c),str(d)])
|
|
slscatlog('I',"New address: " + new_addr)
|
|
addr_list.append(new_addr)
|
|
|
|
return addr_list
|
|
|
|
def slscatfunction( cmd, ipaddr, user, urn, mongo ):
|
|
"function slscatfunction"
|
|
|
|
q1=subprocess.Popen(["echo", cmd, user, urn, mongo], stdout=subprocess.PIPE)
|
|
q2=subprocess.Popen(["nc", "-n", ipaddr, str(52525)], stdin=q1.stdout, stdout=subprocess.PIPE)
|
|
qdata=q2.communicate()[0]
|
|
qdata=qdata.decode()
|
|
qdata=qdata.rstrip()
|
|
|
|
slscatlog('D',"run: " + cmd + ", result is " + qdata)
|
|
return qdata
|
|
|
|
def slscatlog(level, message):
|
|
"function slscatlog()"
|
|
try:
|
|
from scatconf import scat_loglevel
|
|
except ImportError:
|
|
scat_loglevel = 7
|
|
msgpri4 = 6 | syslog.LOG_LOCAL4
|
|
# msgpri5 = 6 | syslog.LOG_LOCAL5
|
|
syslog.syslog(msgpri4,"INFO: No scat logging config in place")
|
|
# syslog.syslog(msgpri5,"INFO: No scat logging config in place")
|
|
|
|
syslog.openlog(ident='scat', facility=syslog.LOG_LOCAL4)
|
|
# syslog.openlog(ident='scattest', facility=syslog.LOG_LOCAL5)
|
|
# logmask = syslog.LOG_UPTO(scat_loglevel)
|
|
# syslog.setlogmask(logmask)
|
|
|
|
if level=='D':
|
|
outmsg = "DEBUG: " + message
|
|
outlevel = 7
|
|
elif level=='I':
|
|
outmsg = "INFO: " + message
|
|
outlevel = 6
|
|
elif level=='W':
|
|
outmsg = "WARN: " + message
|
|
outlevel = 4
|
|
elif level=='E':
|
|
outmsg = "ERROR: " + message
|
|
outlevel = 3
|
|
else:
|
|
outmsg = "BAD LOG ENTRY: " + message
|
|
outlevel = 2
|
|
msgpri4 = outlevel | syslog.LOG_LOCAL4
|
|
# msgpri5 = outlevel | syslog.LOG_LOCAL5
|
|
syslog.syslog(msgpri4,outmsg)
|
|
# syslog.syslog(msgpri5,outmsg)
|
|
return outmsg
|
|
|
|
def slscatargs( arglist):
|
|
"function slscatargs()"
|
|
if(len(arglist)< 1):
|
|
slscatlog('E','Missing IP address. Try again')
|
|
sys.exit(3)
|
|
else:
|
|
IPADDR = arglist[0]
|
|
|
|
if(len(arglist) < 2):
|
|
USER = 'NO_USER'
|
|
else:
|
|
USER = arglist[1]
|
|
|
|
if(len(arglist) < 3):
|
|
URN = 'NO_URN'
|
|
else:
|
|
URN = arglist[2]
|
|
|
|
if(len(arglist) < 4):
|
|
MONGO = 'NO_MONGO'
|
|
else:
|
|
MONGO = arglist[3]
|
|
|
|
slscatlog('D',"slscatargs: " + IPADDR + ", " + USER + ", " + URN + ", " + MONGO)
|
|
good_args = IPADDR, USER, URN, MONGO
|
|
return good_args
|
|
|
|
def slbinget():
|
|
"function slbinget"
|
|
return "/sl/bin/"
|
|
|
|
def slscatget():
|
|
"function slscatget"
|
|
return "/sl/scat/"
|
|
|
|
def slhomeget():
|
|
"function slhomeget()"
|
|
return "/sl/"
|
|
|
|
def sllogget():
|
|
"function sllogget()"
|
|
return "/sl/logs/"
|
|
|
|
def slrunget():
|
|
"function slrunget()"
|
|
return "/sl/run/"
|
|
|
|
def sltomcatbinget():
|
|
"function sltomcatbinget()"
|
|
return "/usr/local/tomcat/bin/"
|
|
|
|
def slsetvars():
|
|
"function slsetvars"
|
|
|
|
os.environ["SEQUENCE_LOGIC_ENV"] = "system"
|
|
os.environ["SEQUENCELOGICHOME"] = "/sl"
|
|
os.environ["PLATFORM"] = "lin64"
|
|
os.environ["SLSYNC"] = slhomeget() +"/SLSync"
|
|
os.environ["EYE_DIR"] = slbinget()
|
|
os.environ["CRYPTO_DIR"] = os.environ.get("EYE_DIR", "Not Set")
|
|
os.environ["K2C_DIR"] = os.environ.get("EYE_DIR", "Not Set")
|
|
os.environ["CPP_DIR"] = os.environ.get("EYE_DIR", "Not Set")
|
|
os.environ["JAR"] = os.environ.get("EYE_DIR", "Not Set") + "/robot-1.0.0.one-jar.jar"
|
|
os.environ["LD_LIBRARY_PATH"] = \
|
|
os.environ.get("K2C_DIR", "Not Set") + ":" + \
|
|
os.environ.get("CRYPTO_DIR", "Not Set") + ":" + \
|
|
os.environ.get("EYE_DIR", "Not Set") + ":" + \
|
|
os.environ.get("CPP_DIR", "Not Set") + ":" + \
|
|
"/usr/local/lib"
|
|
os.environ["java_library_path"] = \
|
|
os.environ.get("EYE_DIR", "Not Set") + ":" + \
|
|
os.environ.get("CRYPTO_DIR", "Not Set") + ":" + \
|
|
os.environ.get("K2C_DIR", "Not Set") + ":" + \
|
|
os.environ.get("CPP_DIR", "Not Set")
|
|
"""
|
|
subprocess.call(["echo", "PLATFORM=", os.environ.get("PLATFORM", "Not Set")])
|
|
subprocess.call(["echo", "SLSYNC=", os.environ.get("SLSYNC", "Not Set")])
|
|
subprocess.call(["echo", "EYE_DIR=", os.environ.get("EYE_DIR", "Not Set")])
|
|
subprocess.call(["echo", "CRYPTO_DIR=", os.environ.get("CRYPTO_DIR", "Not Set")])
|
|
subprocess.call(["echo", "K2C_DIR=", os.environ.get("K2C_DIR", "Not Set")])
|
|
subprocess.call(["echo", "CPP_DIR=", os.environ.get("CPP_DIR", "Not Set")])
|
|
subprocess.call(["echo", "JAR=", os.environ.get("JAR", "Not Set")])
|
|
subprocess.call(["echo", "LD_LIBRARY_PATH=", os.environ.get("LD_LIBRARY_PATH", "Not Set")])
|
|
subprocess.call(["echo", "java_library_path=", os.environ.get("java_library_path", "Not Set")])
|
|
"""
|
|
|
|
def utctimenow():
|
|
#############################################################
|
|
## return the current time in utc format (iso8601)
|
|
timenow=datetime.utcnow().isoformat()+"Z"
|
|
return(timenow)
|
|
|
|
|
|
###############################################################
|
|
def getutcfromtimestamp(timestamp):
|
|
#############################################################
|
|
## This routine converts from a timestamp to a utc string.
|
|
tstring=datetime.utcfromtimestamp(timestamp).isoformat()+"Z"
|
|
return(tstring)
|
|
|
|
###############################################################
|
|
def gettimestampfromutc(iso_string):
|
|
#############################################################
|
|
## This routine takes a date string that is formated as UTC
|
|
## and returns a unix timestamp (seconds since 1970-Jan-01)
|
|
m=0
|
|
iso_string=iso_string.rstrip('Z')
|
|
iso_string=iso_string.rstrip('T')
|
|
print("\n\n---ISO_STRING:",iso_string)
|
|
try:
|
|
### First, letst convert to datetime so we can collect u_sec
|
|
uu=datetime.strptime(iso_string,'%Y-%m-%dT%H:%M:%S.%f')
|
|
m=uu.microsecond
|
|
### Convert to a shorter datetime struct
|
|
uu=uu.strftime('%Y-%m-%dT%H:%M:%S')
|
|
du=datetime.strptime(uu,'%Y-%m-%dT%H:%M:%S')
|
|
### Convert to a time struct from shortened format
|
|
ru=time.strptime(uu,'%Y-%m-%dT%H:%M:%S')
|
|
uu=ru
|
|
except:
|
|
o=1
|
|
|
|
try:
|
|
## string without milliseconds
|
|
uu=time.strptime(iso_string,'%Y-%m-%dT%H:%M:%S')
|
|
except:
|
|
o=1
|
|
|
|
try:
|
|
## date without time
|
|
uu=time.strptime(iso_string,'%Y-%m-%d')
|
|
except:
|
|
o=1
|
|
|
|
|
|
ts = timegm( uu )
|
|
|
|
## if u_secs were saved off, add back on to the end of the string
|
|
if (m):
|
|
ts=ts + m/1000000
|
|
print("RETURN:", ts)
|
|
return(ts)
|
|
|
|
############ Write a Fact ##############
|
|
# Assumes a global of "factsdir" this should be fixed
|
|
def writeFact( string, filename, factsdir = "/etc/sleds/facts" ):
|
|
|
|
filename=factsdir+"/"+filename
|
|
f = open(filename,"w")
|
|
print("Writing to filename: "+filename)
|
|
f.write(string)
|
|
f.write("\n")
|
|
f.close()
|
|
|
|
############ go issue a sub command / shell ###########
|
|
def pipe (cmd):
|
|
proc = subprocess.Popen( cmd ,
|
|
stdin=subprocess.PIPE,
|
|
stdout=subprocess.PIPE,
|
|
)
|
|
|
|
data=proc.communicate()[0]
|
|
data=data.decode()
|
|
return(data)
|
|
|
|
def myipaddr():
|
|
### Second, lets collect our current IP address
|
|
cmd="facter ipaddress"
|
|
cmd=cmd.split()
|
|
|
|
data=pipe(cmd)
|
|
data=data.rstrip()
|
|
ip=data
|
|
return(ip)
|
|
|
|
def myregkey():
|
|
### lets collect our current Registration Key Value
|
|
cmd="facter sleds-regkey"
|
|
cmd=cmd.split()
|
|
|
|
data=pipe(cmd)
|
|
data=data.rstrip()
|
|
rkey=data
|
|
return(rkey)
|
|
|
|
|
|
###############################################################
|
|
|
|
|
|
|
|
def main():
|
|
"function main"
|
|
slsetvars()
|
|
|
|
# execute only if run as a script
|
|
if __name__ == "__main__":
|
|
# execute only if run as a script
|
|
main()
|