Files
SNMP-Influx-collector/cont/classes.py

153 lines
5.3 KiB
Python
Raw Normal View History

2026-02-25 23:16:46 +01:00
from pydantic import BaseModel
from sqlalchemy import Column, Date, Float, Integer, String, text
from datetime import datetime, timezone, timedelta
2026-02-26 20:17:26 +01:00
from typing import Optional, Annotated, Dict
2026-02-25 23:16:46 +01:00
from sqlalchemy.dialects.mysql import MEDIUMINT, TINYINT, TEXT, TIMESTAMP, FLOAT
from sqlalchemy.ext.declarative import declarative_base
2026-02-26 17:09:56 +01:00
from dataclasses import dataclass
2026-02-25 23:16:46 +01:00
# -----------
AlchemyBase = declarative_base()
# DATABASE "CLASSESS"--------------------------------------------
2026-02-28 17:48:01 +01:00
# class idracSQLTable(AlchemyBase):
# def __init__(self, inputData: snmpPyIDRACData):
# __table_args__ = {'extend_existing': True}
# __tablename__ = table_name
# id = Column(MEDIUMINT(unsigned=True), primary_key=True, autoincrement=True)
# time_stamp = Column(
# TIMESTAMP,
# server_default=text("CURRENT_TIMESTAMP"),
# server_onupdate=text("CURRENT_TIMESTAMP"),
# nullable=False,
# )
# inputData.hostname = Column(TEXT)
# inputData.powerDrawPSU1 = Column(Float)
# inputData.powerDrawPSU2 = Column(Float, nullable=True)
# inputData.voltagePSU1 = Column(Float)
# inputData.voltagePSU2 = Column(Float, nullable=True)
# inputData.inletTemp = Column(Float)
# inputData.exhaustTemp = Column(Float)
# inputData.cpu1Temp = Column(Float)
# inputData.cpu2Temp = Column(Float, nullable=True)
# inputData.uptimeH = Column(Float)
# inputData.uptimeD = Column(Float, nullable=True)
2026-02-25 23:16:46 +01:00
# Custom--------------------------------------------
class snmpValueToHost():
def __init__(self,
lastV: Annotated[str, "Last value\nNone when initializing"] = None,
remote: Annotated[str, "Needs to be a valid IP address"] = None,
nextV: Annotated[str, "Value to insert next\nNone when initializing"] = None,
2026-02-26 17:09:56 +01:00
lasttime: Annotated[float, "Last time since sending data\nSince Epoch, so time.time()"] = None,
2026-02-25 23:16:46 +01:00
lastStatus: Annotated[bool, "True if value newest value was inserted\nFalse if data is pending to be sent"] = False
):
self.__lastValue = lastV # Save last sent value
self.__remote = remote # Remote IP address of the SNMP client
self.__nextValue = nextV # Next value to send. Maybe will be used
self.__lastSentStatus = lastStatus # If previously sent new data, set to True.
2026-02-26 17:09:56 +01:00
self.__lastSentTime = lasttime if lasttime else time.time() # The time since the Epoch of the last sent data*
2026-02-25 23:16:46 +01:00
2026-02-26 17:09:56 +01:00
def ___str__(self):
2026-02-25 23:16:46 +01:00
return self.__lastValue
2026-02-26 17:09:56 +01:00
def __changeLastSentValue(self, newValue: int) -> bool:
self.__nextValue == newValue
2026-02-25 23:16:46 +01:00
self.__lastValue = self.__nextValue
2026-02-26 17:09:56 +01:00
self.__nextValue == None
2026-02-25 23:16:46 +01:00
return True
def __updateLastSentTime(self):
self.__lastSentTime = time.time()
return True
def __updateSentStatus(self):
if self.__lastSentStatus:
self.__lastSentStatus = False
return False
else:
self.__lastSentStatus = True
return True
def updateStats(self, nextV: Annotated[int, "Value that will be set as the new one"]):
2026-02-26 17:09:56 +01:00
__changeLastSentValue(nextV)
__updateLastSentTime()
...
# Dataclasses--------------------------------------------
@dataclass
2026-02-26 19:48:56 +01:00
class snmpPyIDRACData():
2026-02-26 17:09:56 +01:00
"""Dataclass for snmp data"""
hostname: str
powerDrawPSU1: int
voltagePSU1: int
inletTemp: float
exhaustTemp: float
2026-02-26 19:48:56 +01:00
cpu1Temp: float
uptimeH: float
# optional fields
uptimeD: float | None = None
cpu2Temp: float | None = None
powerDrawPSU2: int | None = None
voltagePSU2: int | None = None
def __str__(self):
return (
f"{self.hostname}\n"
2026-02-26 20:17:26 +01:00
f"PSU1 {self.powerDrawPSU1} Watts\n"
f"PSU2 {self.powerDrawPSU2} Watts\n"
f"PSU1 {self.voltagePSU1} Volts\n"
f"PSU2 {self.voltagePSU2} Volts\n"
f"Inlet {self.inletTemp} C\n"
f"Exhaust {self.exhaustTemp} C\n"
f"CPU1 {self.cpu1Temp} C\n"
f"CPU2 {self.cpu2Temp} C\n"
f"Uptime {self.uptimeH} Hours\n"
f"Uptime {self.uptimeD} Days"
)
@dataclass
2026-02-28 17:48:01 +01:00
class snmpPyCiscoData():
"""Dataclass for snmp data"""
hostname: str
powerDrawPSU1: int
voltagePSU1: int
inletTemp: float
exhaustTemp: float
cpu1Temp: float
uptimeH: float
# optional fields
uptimeD: float | None = None
cpu2Temp: float | None = None
powerDrawPSU2: int | None = None
voltagePSU2: int | None = None
def __str__(self):
return (
f"{self.hostname}\n"
f"PSU1 {self.powerDrawPSU1} Watts\n"
f"PSU2 {self.powerDrawPSU2} Watts\n"
f"PSU1 {self.voltagePSU1} Volts\n"
f"PSU2 {self.voltagePSU2} Volts\n"
f"Inlet {self.inletTemp} C\n"
f"Exhaust {self.exhaustTemp} C\n"
f"CPU1 {self.cpu1Temp} C\n"
f"CPU2 {self.cpu2Temp} C\n"
f"Uptime {self.uptimeH} Hours\n"
f"Uptime {self.uptimeD} Days"
)
# @dataclass
# class idracFanStatus:
# fans: Dict[str, int] | None = Dict[None, None] # name/index -> rpm