From 216e216dee0985cbeb74e7d6c08a66f0dd5ec174 Mon Sep 17 00:00:00 2001 From: YuruC3 Date: Wed, 25 Feb 2026 23:16:46 +0100 Subject: [PATCH] Big init --- HBX2LV4aMAAstst.png | Bin 0 -> 19001 bytes README | 5 ++ cont/code/classes.py | 75 ++++++++++++++++++ cont/code/funct.py | 123 ++++++++++++++++++++++++++++++ cont/code/main.py | 68 +++++++++++++++++ cont/conf/Dockerfile | 40 ++++++++++ cont/conf/build.sh | 3 + cont/conf/docker-compose.dev.yaml | 16 ++++ cont/conf/entrypoint.sh | 25 ++++++ cont/conf/requirements.txt | 12 +++ 10 files changed, 367 insertions(+) create mode 100644 HBX2LV4aMAAstst.png create mode 100644 README create mode 100644 cont/code/classes.py create mode 100644 cont/code/funct.py create mode 100644 cont/code/main.py create mode 100644 cont/conf/Dockerfile create mode 100755 cont/conf/build.sh create mode 100644 cont/conf/docker-compose.dev.yaml create mode 100644 cont/conf/entrypoint.sh create mode 100644 cont/conf/requirements.txt diff --git a/HBX2LV4aMAAstst.png b/HBX2LV4aMAAstst.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5e4d43f03867be35396177622dab2972f56ca9 GIT binary patch literal 19001 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 literal 0 HcmV?d00001 diff --git a/README b/README new file mode 100644 index 0000000..64d4197 --- /dev/null +++ b/README @@ -0,0 +1,5 @@ +Hi + +

+ +

diff --git a/cont/code/classes.py b/cont/code/classes.py new file mode 100644 index 0000000..4b7990f --- /dev/null +++ b/cont/code/classes.py @@ -0,0 +1,75 @@ +from pydantic import BaseModel +from sqlalchemy import Column, Date, Float, Integer, String, text +from datetime import datetime, timezone, timedelta +from typing import Optional, Annotated +from sqlalchemy.dialects.mysql import MEDIUMINT, TINYINT, TEXT, TIMESTAMP, FLOAT +from sqlalchemy.ext.declarative import declarative_base + +# ----------- + +AlchemyBase = declarative_base() + +# DATABASE "CLASSESS"-------------------------------------------- +def sensorsqldata(table_name: Annotated[str, "Name of the table"]): + + class SensorSQLDataClass(AlchemyBase): + __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, + ) + TEMP = Column(TINYINT) + TEMP = Column(TEXT) + TEMP = Column(Float) + TEMP = Column(Float) + TEMP = Column(Float, nullable=True) + TEMP = Column(Float, nullable=True) + TEMP = Column(Float, nullable=True) + + return SensorSQLDataClass + + +# 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, + lasttime: Annotated[float, "Last time since sending data\nSince Epoch"] = time.time(), + 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. + self.__lastSentTime = lasttime # The time since the Epoch of the last sent data* + + + def ___str__(): + return self.__lastValue + + def __changeLastSentValue(slef): + self.__lastValue = self.__nextValue + 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"]): + + ... \ No newline at end of file diff --git a/cont/code/funct.py b/cont/code/funct.py new file mode 100644 index 0000000..4215099 --- /dev/null +++ b/cont/code/funct.py @@ -0,0 +1,123 @@ +import influxdb_client, sqlalchemy, random, os +# from sqlmodel import Field, Session, SQLModel, create_engine, select +from sqlalchemy import create_engine, exc # , Column, Integer, String, Numeric +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker + +from typing import Annotated, Final +from classes import * + +from influxdb_client import InfluxDBClient, Point, WritePrecision +from influxdb_client.client.write_api import SYNCHRONOUS, ASYNCHRONOUS, WriteOptions +# import pymysql + +# FluxQL ENV---------------------------------------- +USEINFLUX: Final[bool] = os.getenv("USEINFLUX", True) +if USEINFLUX: + INFLXDBTOKEN: Final[str] = os.getenv("INFLXDBTOKEN", "123" ) + INFLUXBCKT: Final[str] = os.getenv("INFLUXBCKT", "SNMPyth") + INFLUXORG: Final[str] = os.getenv("INFLUXORG", "staging") + INFLXDBURL: Final[str] = os.getenv("INFLXDBURL", "http://localhost:8086") + INFXLUXDB_MEASUEREMENT: Final[str] = os.getenv("INFXLUXDB_MEASUEREMENT", "SNMPyth-containrr") + INFLX_SEPARATE_POINTS: Final[float] = float(os.getenv("INFLX_SEPARATE_POINTS", 0.1)) +# SQL ENV------------------------------------------- +USESQL: Final[bool] = os.getenv("USESQL", False) +if USESQL: + DBENGINE: Final[str] = os.getenv("DBENGINE", "mysql+pymysql") + DBADDR: Final[str] = os.getenv("DBADDR", "127.0.0.1") + DBUSR: Final[str] = os.getenv("DBUSR", "root") + DBPWD: Final[str] = os.getenv("DBPWD", "6767") + DBNAME: Final[str] = os.getenv("DBNAME", "TEMP_SENSR") + + +# DBprepare------------------------------------------- +# INFLUX +if USEINFLUX: + fluxdb_client = influxdb_client.InfluxDBClient(url=INFLXDBURL, token=INFLXDBTOKEN, org=INFLUXORG) + write_fluxdb_api = fluxdb_client.write_api(write_options=SYNCHRONOUS) + query_fluxdb_api = fluxdb_client.query_api() +# SQL +if USESQL: + engine = create_engine( + f"{DBENGINE}://{DBUSR}:{DBPWD}@{DBADDR}/{DBNAME}", + pool_pre_ping=True, # Check connection liveness before using and if needed, recconect + pool_recycle=3600 # recycle connections older than N (3600 in this case) seconds + ) + Session = sessionmaker(bind=engine) + + + +def tempsnsrIntoSQLDB( + tableInp: Annotated[int, "Name of the table"], + insertData: Annotated[str, "Data to insert"] + ) -> int: + f""" + Insert {DBNAME} data into MariaDB + :tableInp: Name of the table + :return: 0 if succesfull, 1 if rolled back on error, 2 if SQL is not enabled 3 if no such table + """ + + if not USESQL: + return 2 + + # Check if table exists + if not sqlalchemy.inspect(engine).has_table(tableInp): + return 3 + + with Session() as session: + + try: + + data = sensorsqldata(tableInp) + # print("2") + + if inpayload: + # print("3") + session.add(data( + data = insertData, + )) + # print("4") + + session.commit() #Attempt to commit all the records + # print("good") + return 0 + except Exception as e: + print(f"Error {e} when sending to mariadb") + session.rollback() #Rollback the changes on error + return 1 + + +def tempsnsrIntoFluxQLDB( + inpayload: Annotated[SensorPayload, "Payload"] + ) -> int: + + """ + Insert temperature data into InfluxDB + :inpayload: Payload + :return: 0 if succesfull, 1 if general error, 2 if Influx is not enabled + """ + if not USEINFLUX: + return 2 + # Prep InfluxDB data + inflxdb_Data_To_Send = ( + influxdb_client.Point(f"{INFXLUXDB_MEASUEREMENT}") + .tag("PLACE", inpayload.name) + .tag("TEMP", sensorIDinp) + .tag("TEMP", whatTheSensor) + .field("TEMP", inpayload.temp) + .field("TEMP", inpayload.humid) + .field("TEMP", inpayload.hicc) + .field("TEMP", inpayload.presss) + .field("TEMP", inpayload.alttd) + ) + + # print(write_fluxdb_api.write(bucket=INFLUXBCKT, org=INFLUXORG, record=inflxdb_Data_To_Send)) + # if write_fluxdb_api.write(bucket=INFLUXBCKT, org=INFLUXORG, record=inflxdb_Data_To_Send) == None: + + if write_fluxdb_api.write(bucket=INFLUXBCKT, org=INFLUXORG, record=inflxdb_Data_To_Send): + # return {"STATUS": "succesfully inserted to InfluxDB"} + print("0") + return 0 + else: + print("1") + return 1 diff --git a/cont/code/main.py b/cont/code/main.py new file mode 100644 index 0000000..f495234 --- /dev/null +++ b/cont/code/main.py @@ -0,0 +1,68 @@ +# import pysnmp, sqlalchemy, ipaddress, os, influxdb_client, re, time +# # SQL +# from sqlalchemy import create_engine, exc # , Column, Integer, String, Numeric +# from sqlalchemy.ext.declarative import declarative_base +# from sqlalchemy.orm import sessionmaker +# # InfluxDB +# from influxdb_client import InfluxDBClient, Point, WritePrecision +# from influxdb_client.client.write_api import SYNCHRONOUS, ASYNCHRONOUS, WriteOptions +import pysnmp, ipaddress, os, re, time +#SNMP +from easysnmp import Session +# QoL +from typing import Annotated + + +# Program ENV--------------------------------------- +HOST_LIST: Final[list] = os.getenv("HOST_LIST") +try: + RESOLV_ADDR: Final[str] = ipaddress(os.getenv("RESOLV_ADDR", "1.1.1.1")) +except ValueError: + raise Exception("Malformed DNS IP address.\nExiting...") + + +# Flightchecks------------------------------------------- +# Helper functions +def check_host_string(input_text: Annotated[str, "Text to check"]): + pattern = re.compile(r"^[A-Za-z].*$", re.IGNORECASE) + return pattern.match(input_text) + + +# Check if some neccesary ENVs are passed +if not USEINFLUX and not USESQL: + raise Exception("No database selected to store the data") + +# if HOST_LIST empty, raise Exception No hosts passed +if not HOST_LIST: + raise Exception("No hosts passed\nExiting...") + +# for host in HOST_LIST check if valid IP and create a list with strings +HOST_LIST_STR = [] +for host in HOST_LIST: + try: + if not check_host_string(host): + ip = str(ipaddress.IPv4Address(host)) + HOST_LIST_STR.append(ip) + except ValueError: + raise Exception("Malformed IP address.\nExiting...") + +# Checking if DNS IP is a valid one +# Done under "Program ENV" on line ~18 + + + + + + +# Code------------------------------------------- + +# Create connections for MySQL and InfluxDB + +# functions for inserting data into two DBs + + +# DNS lookup if the user passed a hostname +# if not given a specific IP for DNS server, fallback to 1.1.1.1 + +# maybe a class? +# store last value and check if it wasn't sent already to the database diff --git a/cont/conf/Dockerfile b/cont/conf/Dockerfile new file mode 100644 index 0000000..1d135ba --- /dev/null +++ b/cont/conf/Dockerfile @@ -0,0 +1,40 @@ +FROM alpine:latest + +# https://docs.docker.com/reference/dockerfile/#environment-replacement +# ENV PUID=1600 +# ENV USER=itsme + +# VOLUME [""] + +RUN apk update && \ + apk add python3 py3-pip su-exec curl && \ + mkdir -p /app/snmpython/ + +WORKDIR /app/snmpython/ + +COPY ../code/someMain.py /app/snmpython/ + +# COPY ./entrypoint.sh /entrypoint.sh +# RUN chmod +x /entrypoint.sh + +# Add user to run under +# RUN adduser --disabled-password -u "${PUID}" "${USER}" +# RUN chown -R "${USER}" /app/snmpython + + +COPY ./requirements.txt /app/snmpython/ + +RUN python3 -m venv venv && \ + venv/bin/python3 -m pip install --upgrade pip && \ + venv/bin/pip3 install -r requirements.txt + # venv/bin/pip3 install -r requirements.txt + +# Set user. No need for root past this point +# USER "${USER}" + +# ENTRYPOINT ["/entrypoint.sh"] + +# HEALTHCHECK --interval=3s --timeout=3s --retries=3 \ +# CMD curl --fail http://127.0.0.1:8181/health || exit 1 + +CMD ["/app/snmpython/someMain.py"] diff --git a/cont/conf/build.sh b/cont/conf/build.sh new file mode 100755 index 0000000..d94c6b3 --- /dev/null +++ b/cont/conf/build.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +docker buildx build --platform linux/amd64 --tag tea.shupogaki.org/yuruc3/snmpython:v0 --debug --push . diff --git a/cont/conf/docker-compose.dev.yaml b/cont/conf/docker-compose.dev.yaml new file mode 100644 index 0000000..a3e1192 --- /dev/null +++ b/cont/conf/docker-compose.dev.yaml @@ -0,0 +1,16 @@ +--- + +services: + mdfanchanger: + container_name: snmpython-dev + user: 1600:1600 + image: shupotea/yuruc3/snmpython:dev + build: + dockerfile: ./Dockerfile + environment: + - INFLUXTOKEN: "12345678" + - INFLUXHOST: "" + + + - HOST_LIST: ["192.168.0.1", "192.168.0.1", "192.168.0.1", "192.168.0.1"] + restart: unless-stopped diff --git a/cont/conf/entrypoint.sh b/cont/conf/entrypoint.sh new file mode 100644 index 0000000..0b54751 --- /dev/null +++ b/cont/conf/entrypoint.sh @@ -0,0 +1,25 @@ +#!/bin/sh +set -e + +# Default to 1600 if not provided +PUID="${PUID:-1000}" +PGID="${PGID:-1000}" +USER="${USER:-pythusr}" +GROUP="${USER:-pythusr}" +CHOWNPATH="/app/snmpython" + +# Create group if missing +if ! getent group "$GROUP" >/dev/null 2>&1; then + addgroup -g "$PGID" "$GROUP" +fi + +# Create user if missing +if ! id -u "$USER" >/dev/null 2>&1; then + adduser -D -u "$PUID" -G "$GROUP" "$USER" +fi + +# Fix permissions (only do this on /app/API) +chown -R "$PUID:$PGID" "$CHOWNPATH" + +# Drop privileges & run command +exec su-exec "$PUID:$PGID" "$@" diff --git a/cont/conf/requirements.txt b/cont/conf/requirements.txt new file mode 100644 index 0000000..c538c79 --- /dev/null +++ b/cont/conf/requirements.txt @@ -0,0 +1,12 @@ +# mysql-connector-python==9.2.0 +PyMySQL==1.1.1 +sqlmodel==0.0.24 +pydantic==2.10.6 +pydantic_core==2.27.2 +annotated-types==0.7.0 +typing==3.7.4.3 +pysnmp==7.1.22 + +# requests==2.32.3 +influxdb-client==1.49.0 +# influxdb3-python==0.18.0 \ No newline at end of file