Skip to content

Commit

Permalink
Merge pull request #2 from Technik-Tueftler/202203_implement_db_conne…
Browse files Browse the repository at this point in the history
…ctor

202203 implement db connector
  • Loading branch information
Technik-Tueftler authored Mar 17, 2022
2 parents 0be12ef + 85494b8 commit ea51dca
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 7 deletions.
10 changes: 7 additions & 3 deletions dockerfile
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
FROM arm64v8/python:3.10.2-alpine3.15
WORKDIR /user/app
FROM arm64v8/python:3.10.2-buster

ENV WORKING_DIR /user/app
WORKDIR $WORKING_DIR

COPY requirements.txt ./Speedtest/

RUN pip install -r ./Speedtest/requirements.txt
RUN pip install mariadb SQLAlchemy
RUN pip install sqlalchemy-utils

COPY files/ ./Speedtest/files/
COPY source/ ./Speedtest/source/
# COPY requirements.txt .

RUN echo "Wir sind die geilsten Hühner im Stall"

Expand Down
Binary file modified requirements.txt
Binary file not shown.
77 changes: 77 additions & 0 deletions source/db.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy_utils import database_exists, create_database
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
import os
from datetime import datetime

Base = declarative_base()
session = None

if os.getenv("WORKING_DIR") is None:
sql_db_path = "sqlite:///../files/measurements.sqlite3"
else:
sql_db_path = "sqlite:///./Speedtest/files/measurements.sqlite3"


class Measurements(Base):
__tablename__ = 'measurements'
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
timestamp = sqlalchemy.Column(sqlalchemy.TIMESTAMP(timezone=False), nullable=False)
max_download_fritzbox = sqlalchemy.Column(sqlalchemy.Integer)
max_upload_fritzbox = sqlalchemy.Column(sqlalchemy.Integer)
avg_download_speedtest = sqlalchemy.Column(sqlalchemy.Integer)
avg_upload_speedtest = sqlalchemy.Column(sqlalchemy.Integer)
ping_speedtest = sqlalchemy.Column(sqlalchemy.Integer)


def commit(function):
def wrapper(*args, **kwargs):
return_function = function(*args, **kwargs)
session.commit()
return return_function
return wrapper


@commit
def add_measurement(data: dict) -> None:
session.add(Measurements(timestamp=datetime.now(),
max_download_fritzbox=data["max_download_fritzbox"],
max_upload_fritzbox=data["max_upload_fritzbox"],
avg_download_speedtest=data["avg_download_speedtest"],
avg_upload_speedtest=data["avg_upload_speedtest"],
ping_speedtest=data["ping_speedtest"]))


def check_and_verify_database_connection() -> None:
global Base
global session
connector = os.getenv("DB_CONNECTOR", sql_db_path)
try:
engine = create_engine(connector)
if not database_exists(engine.url):
create_database(engine.url)
Base.metadata.create_all(engine)
session_make = sessionmaker(bind=engine)
session = session_make()

except sqlalchemy.exc.OperationalError as _:
print(f"ERROR: No connection to the database is possible. Please check DB_CONNECTOR. The measurements will be "
f"stored in a SQLite anyway.")
engine = create_engine(sql_db_path)
Base.metadata.create_all(engine)
session_make = sessionmaker(bind=engine)
session = session_make()
except sqlalchemy.exc.ProgrammingError as _:
print(f"ERROR: Unknown")


def main() -> None:
pass


if __name__ == "__main__":
main()
9 changes: 5 additions & 4 deletions source/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import speedtest
from fritzconnection.lib.fritzstatus import FritzStatus
from datetime import datetime, timedelta
import db


@dataclass
Expand Down Expand Up @@ -106,8 +107,6 @@ def receive_network_load_from_fritzbox(communication_interface: dict) -> None:
total_downstream_raw.append(round(downstream_raw * 8))
total_upstream_raw.append(round(upstream_raw * 8))
time.sleep(0.3)
print(total_downstream_raw)
print(total_upstream_raw)
communication_interface["max_download_fritzbox"] = max(total_downstream_raw)
communication_interface["max_upload_fritzbox"] = max(total_upstream_raw)
communication_interface["last_run_datetime"] = datetime.now(). \
Expand Down Expand Up @@ -173,6 +172,7 @@ def main(env_data: dict) -> None:
communication["avg_download_speedtest"],
communication["avg_upload_speedtest"])
communication["timer_runtime"] = communication["TEST_REPETITION_TIME"]
db.add_measurement(communication)
print("End Speedtest measurement")


Expand All @@ -195,7 +195,7 @@ def check_and_verify_env_variables() -> dict:
if os.getenv("IP_FRITZBOX") is None:
print(f"ERROR: No address was given. Therefore the default value {ip_addr_fritzbox} "
f"was set. However, no connection could be established. Please enter a "
f"valid PI address.")
f"valid IP address.")
else:
print(f"ERROR: Can't connect to fritzbox! Please check the given IP address: "
f"{ip_addr_fritzbox}.")
Expand Down Expand Up @@ -245,13 +245,14 @@ def check_and_verify_env_variables() -> dict:
print(f"ERROR: The value for the variable TEST_REPEAT_TIME "
f"is not an integer")

db.check_and_verify_database_connection()

return environment_data


if __name__ == "__main__":
print("Start program")
verified_env_data = check_and_verify_env_variables()
if verified_env_data["all_verified"] is not False:
# verified_env_data["timer_runtime"] = verified_env_data["TEST_REPETITION_TIME"]
verified_env_data["timer_runtime"] = 1
main(verified_env_data)

0 comments on commit ea51dca

Please sign in to comment.