2026-03-02 21:46:51 +01:00
|
|
|
import ipaddress, os, re, time, asyncio
|
2026-02-26 19:49:10 +01:00
|
|
|
# SNMP
|
|
|
|
|
from pysnmp.hlapi.v3arch.asyncio import *
|
2026-02-25 23:16:46 +01:00
|
|
|
# QoL
|
2026-02-26 17:09:56 +01:00
|
|
|
from typing import Annotated, Final
|
2026-02-26 19:49:10 +01:00
|
|
|
# functions
|
2026-03-02 21:46:51 +01:00
|
|
|
from db.collectiveWriter import ALLdbIDRACWriter
|
|
|
|
|
# idrac SNMP
|
|
|
|
|
from idrac import idrac78, idrac9
|
|
|
|
|
# Cisco hosts
|
2026-03-17 19:38:27 +01:00
|
|
|
from cisco import lob, nyater
|
|
|
|
|
|
|
|
|
|
# SNMP ENV-------------------------------------------
|
|
|
|
|
ROUND_PREC: Final[int] = int(os.getenv("ROUND_PREC", 2))
|
|
|
|
|
|
|
|
|
|
SNMPUSER: Final[str] = os.getenv("SNMPUSER", None)
|
|
|
|
|
SNMPPRIVKEY: Final[str] = os.getenv("SNMPPRIVKEY", None)
|
|
|
|
|
SNMPAUTHKEY: Final[str] = os.getenv("SNMPAUTHKEY", None)
|
|
|
|
|
# Right now I'll only use SHA
|
|
|
|
|
# SNMPAUTHPROTO: Final[str] = os.getenv("SNMPAUTHPROTO", "SHA")
|
|
|
|
|
# SNMPPRIVPROTO: Final[str] = os.getenv("SNMPPRIVPROTO", "SHA")
|
|
|
|
|
SNMPORT: Final[int] = int(os.getenv("SNMPORT", 161))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Check if SNMP ENV are empty
|
|
|
|
|
if not SNMPUSER or not SNMPPRIVKEY or not SNMPAUTHKEY:
|
|
|
|
|
raise Exception("No SNMP user or/and PrivAuth passed")
|
2026-02-25 23:16:46 +01:00
|
|
|
|
|
|
|
|
# Program ENV---------------------------------------
|
2026-02-28 22:57:11 +01:00
|
|
|
try:
|
2026-03-17 19:38:27 +01:00
|
|
|
IDRAC78_HOST_LIST: Final[list] = os.getenv("IDRAC78_HOST_LIST", []).split(";")
|
|
|
|
|
IDRAC9_HOST_LIST: Final[list] = os.getenv("IDRAC9_HOST_LIST", []).split(";")
|
2026-02-28 22:57:11 +01:00
|
|
|
except:
|
|
|
|
|
raise Exception("No IDRAC hosts variable")
|
2026-03-17 19:38:27 +01:00
|
|
|
try:
|
|
|
|
|
CISCO_3750_HOST_LIST: Final[list] = os.getenv("CISCO_3750_HOST_LIST", []).split(";")
|
|
|
|
|
except:
|
|
|
|
|
print("No 3750-X devices passed.\nContinuing with what is available.\n")
|
|
|
|
|
CISCO_3750_HOST_LIST = []
|
|
|
|
|
try:
|
|
|
|
|
CISCO_NEXUS_HOST_LIST: Final[list] = os.getenv("CISCO_NEXUS_HOST_LIST", []).split(";")
|
|
|
|
|
except:
|
|
|
|
|
print("No Nexus devices passed.\nContinuing with what is available.\n")
|
|
|
|
|
CISCO_NEXUS_HOST_LIST = []
|
2026-02-25 23:16:46 +01:00
|
|
|
|
2026-03-07 22:02:37 +01:00
|
|
|
GET_INTERVAL: Final[int] = int(os.getenv("GET_INTERVAL", 60))
|
2026-02-26 17:09:56 +01:00
|
|
|
|
2026-02-25 23:16:46 +01:00
|
|
|
|
|
|
|
|
# Flightchecks-------------------------------------------
|
|
|
|
|
# if HOST_LIST empty, raise Exception No hosts passed
|
2026-03-17 19:38:27 +01:00
|
|
|
# if not IDRAC78_HOST_LIST and not IDRAC9_HOST_LIST:
|
|
|
|
|
# raise Exception("No IDRAC hosts passed\nExiting...")
|
2026-02-25 23:16:46 +01:00
|
|
|
# for host in HOST_LIST check if valid IP and create a list with strings
|
2026-03-17 19:38:27 +01:00
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
for idrac78Host in IDRAC78_HOST_LIST:
|
|
|
|
|
try:
|
|
|
|
|
ip = str(ipaddress.IPv4Address(idrac78Host))
|
|
|
|
|
except ValueError:
|
|
|
|
|
raise Exception(f" IP {ip} for IDRAC7/8 devices is invalid.\nExiting...")
|
|
|
|
|
except:
|
|
|
|
|
IDRAC78_HOST_LIST = []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for cisco3750Host in CISCO_3750_HOST_LIST:
|
2026-02-26 19:49:10 +01:00
|
|
|
try:
|
2026-03-17 19:38:27 +01:00
|
|
|
ip = str(ipaddress.IPv4Address(cisco3750Host))
|
2026-02-26 19:49:10 +01:00
|
|
|
except ValueError:
|
|
|
|
|
raise Exception(f" IP {ip} for Cisco devices is invalid.\nExiting...")
|
2026-03-17 19:38:27 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
for ciscoNexusHost in CISCO_NEXUS_HOST_LIST:
|
2026-03-01 21:29:28 +01:00
|
|
|
try:
|
2026-03-17 19:38:27 +01:00
|
|
|
ip = str(ipaddress.IPv4Address(ciscoNexusHost))
|
2026-03-01 21:29:28 +01:00
|
|
|
except ValueError:
|
2026-03-17 19:38:27 +01:00
|
|
|
raise Exception(f" IP {ip} for Cisco devices is invalid.\nExiting...")
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
for idrac9Host in IDRAC9_HOST_LIST:
|
|
|
|
|
try:
|
|
|
|
|
ip = str(ipaddress.IPv4Address(idrac9Host))
|
|
|
|
|
except ValueError:
|
|
|
|
|
raise Exception(f" IP {ip} for IDRAC9 devices is invalid.\nExiting...")
|
|
|
|
|
except:
|
|
|
|
|
IDRAC9_HOST_LIST = []
|
2026-02-25 23:16:46 +01:00
|
|
|
|
|
|
|
|
# Done under "Program ENV" on line ~18
|
|
|
|
|
|
|
|
|
|
|
2026-02-26 17:09:56 +01:00
|
|
|
# Code-------------------------------------------
|
|
|
|
|
|
2026-02-28 17:48:01 +01:00
|
|
|
async def main():
|
2026-02-26 19:49:10 +01:00
|
|
|
|
2026-02-28 22:57:11 +01:00
|
|
|
mainQueue = asyncio.Queue(maxsize=225)
|
|
|
|
|
|
2026-03-02 21:46:51 +01:00
|
|
|
asyncio.create_task(ALLdbIDRACWriter(mainQueue))
|
2026-02-26 19:49:10 +01:00
|
|
|
|
2026-03-17 19:38:27 +01:00
|
|
|
print("Starting tasks")
|
|
|
|
|
|
2026-02-28 17:48:01 +01:00
|
|
|
while True:
|
2026-02-28 22:57:11 +01:00
|
|
|
|
2026-02-28 17:48:01 +01:00
|
|
|
# IDRAC part
|
|
|
|
|
async with asyncio.TaskGroup() as tg:
|
2026-03-01 21:29:28 +01:00
|
|
|
for Idrac78IP in IDRAC78_HOST_LIST:
|
2026-03-17 19:38:27 +01:00
|
|
|
tg.create_task(idrac78.idrac7_8PoolRemote_v3(
|
|
|
|
|
Idrac78IP, mainQueue,
|
|
|
|
|
SNMPUSER, SNMPAUTHKEY, SNMPPRIVKEY, ROUND_PREC, SNMPORT))
|
|
|
|
|
|
2026-03-01 21:29:28 +01:00
|
|
|
for Idrac9IP in IDRAC9_HOST_LIST:
|
2026-03-17 19:38:27 +01:00
|
|
|
tg.create_task(idrac9.idrac9PoolRemote_v3(
|
|
|
|
|
Idrac9IP, mainQueue,
|
|
|
|
|
SNMPUSER, SNMPAUTHKEY, SNMPPRIVKEY, ROUND_PREC, SNMPORT))
|
2026-02-28 22:57:11 +01:00
|
|
|
# FANS
|
2026-03-17 19:38:27 +01:00
|
|
|
# tg.create_task(idracPoolRemoteFAN_v3(IdracIP, mainQueue))
|
2026-02-28 22:57:11 +01:00
|
|
|
|
|
|
|
|
# CISCO devices
|
2026-03-17 19:38:27 +01:00
|
|
|
for cisco3750Xdev in CISCO_3750_HOST_LIST:
|
|
|
|
|
tg.create_task(lob.lobGetRemote(
|
|
|
|
|
cisco3750Xdev, mainQueue,
|
|
|
|
|
SNMPUSER, SNMPAUTHKEY, SNMPPRIVKEY, ROUND_PREC, SNMPORT))
|
2026-02-26 17:09:56 +01:00
|
|
|
|
2026-03-17 19:38:27 +01:00
|
|
|
# for ciscoNexusDev in CISCO_NEXUS_HOST_LIST:
|
|
|
|
|
# tg.create_task(nyater(
|
|
|
|
|
# ciscoNexusDev, mainQueue,
|
|
|
|
|
# SNMPUSER, SNMPAUTHKEY, SNMPPRIVKEY, ROUND_PREC, SNMPORT))
|
2026-02-28 17:48:01 +01:00
|
|
|
|
2026-03-17 19:38:27 +01:00
|
|
|
await asyncio.sleep(GET_INTERVAL)
|
2026-02-28 17:48:01 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2026-02-28 22:57:11 +01:00
|
|
|
# qu = asyncio.Queue()
|
|
|
|
|
# asyncio.run(idracPoolRemote_v3("192.168.20.7", qu))
|
2026-03-02 21:46:51 +01:00
|
|
|
print("Starting")
|
2026-02-28 22:57:11 +01:00
|
|
|
asyncio.run(main())
|
|
|
|
|
|
|
|
|
|
# loop = asyncio.get_event_loop()
|
|
|
|
|
# task = loop.create_task(main())
|
2026-02-25 23:16:46 +01:00
|
|
|
|