Skip to content

Fix mikrotik worker v1.6.x #85

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 27 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
6d95388
whois/worker.py: fix worker to use DeviceRepository
EduKav1813 Jan 18, 2025
dd92e12
whois/worker.py: clean unused imports (date, datetime)
EduKav1813 Jan 18, 2025
0088c6a
db/database.py: clean unused imports
EduKav1813 Jan 18, 2025
3972f3d
db/database.py: improve database logs
EduKav1813 Jan 18, 2025
4fe5c5c
whois/worker.py: fix outdated settings
EduKav1813 Jan 18, 2025
938190b
db/mapper/device_mapper.py: fix device.username -> device.hostname
EduKav1813 Jan 18, 2025
6bbb322
worker.py: fix missing params for device object
EduKav1813 Jan 18, 2025
fe60fe8
whois/app.py: fix passing owner id's instead of entities
EduKav1813 Jan 18, 2025
0cb4edc
device_repository.py: fix map for get_by_mac_address
EduKav1813 Jan 18, 2025
a003d50
entity/device.py: implement is_hidden for Device
EduKav1813 Jan 18, 2025
99673a8
device_mapper.py: fix passing non-python value to sqlite db
EduKav1813 Jan 18, 2025
2899372
Revert "device_mapper.py: fix passing non-python value to sqlite db"
EduKav1813 Jan 18, 2025
4312e87
device_repository.py: fix passing non-python datetime on update()
EduKav1813 Jan 18, 2025
cd6f0cf
Merge pull request #87 from hspsh/fix-mikrotik-production-settings
EduKav1813 Jan 27, 2025
88141fb
Merge pull request #86 from hspsh/improve-logging
EduKav1813 Jan 27, 2025
5629342
Refine logging
EduKav1813 Feb 3, 2025
a21f3fa
Format code
EduKav1813 Feb 3, 2025
c5ebf62
fix log in login()
EduKav1813 Feb 3, 2025
8e93d97
logger.py: make logging to files optional
EduKav1813 Mar 1, 2025
ebb8528
whois/: format imports
EduKav1813 Mar 1, 2025
fa4796d
Dockerfile: add /logs directory
EduKav1813 Mar 1, 2025
97dfe98
whois/helpers.py: Add return value hints for functions
EduKav1813 Mar 1, 2025
7dbe2f2
whois/app.py: fix filtering with helper functions
EduKav1813 Mar 1, 2025
6a95f01
whois/app.py: remove redundant filter_anon_users call for now_at_space
EduKav1813 Mar 2, 2025
060d5f1
device_repository.py: remove .python_value for last_seen in update()
EduKav1813 Mar 2, 2025
ca1e810
Remove IsoDateTimeField type in favor of datetime
EduKav1813 Mar 2, 2025
7646533
whois/worker.py: fix last_seen parameter
EduKav1813 Mar 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -107,4 +107,7 @@ venv.bak/
*.db

# Logs
*.log
*.log

# Database files
*.sqlite
2 changes: 2 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ RUN poetry install --only main
COPY . .

RUN mkdir /data && chown nobody /data
RUN mkdir /logs && chown nobody /logs
VOLUME ["/data"]
VOLUME ["/logs"]

USER nobody
EXPOSE 8000
Expand Down
1 change: 1 addition & 0 deletions env.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export APP_DB_URL="postgresql://whohacks:S3cret@localhost:5432/whohacks"
export OAUTH_OPENID="http://sso.hsp.sh/auth/realms/hsp/.well-known/openid-configuration"
export OAUTH_CLIENT_ID="fake-development-client-id"
export LOGLEVEL="DEBUG" # DEBUG | INFO | WARNING | ERROR
env | grep APP_ > .env
env | grep OUATH_ > .env
76 changes: 76 additions & 0 deletions helpers/logger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import logging
import os

loggers = {}

logging_dir = str(os.environ.get("LOG_DIR", "logs"))
is_log_to_file = bool(os.environ.get("LOG_TO_FILE", "false").lower() == "true")

is_logging_to_file_configured = False


def configure_logging_to_file():
config_value = os.environ.get("LOG_TO_FILE")
if is_log_to_file:
print(f"Logging to file is enabled" f"(LOG_TO_FILE is set to '{config_value}')")
if logging_dir:
print(f"Logging files directory: '{logging_dir}'")
if not os.path.exists(logging_dir):
os.makedirs(logging_dir, exist_ok=True)
else:
print(f"Logging to file is disabled" f"(LOG_TO_FILE is set to '{config_value}')")



def get_loglevel(loglevel: str):
match loglevel:
case "DEBUG":
loglevel = logging.DEBUG
case "INFO":
loglevel = logging.INFO
case "WARNING":
loglevel = logging.WARNING
case "ERROR":
loglevel = logging.ERROR
case "CRITICAL":
loglevel = logging.CRITICAL
case _:
loglevel = logging.INFO

return loglevel


def init_logger(name: str) -> logging.Logger:
global is_logging_to_file_configured
if not is_logging_to_file_configured:
configure_logging_to_file()
is_logging_to_file_configured = True

if loggers.get(name):
return loggers[name]

logger = logging.getLogger(name)
loglevel = get_loglevel(os.environ.get("LOGLEVEL"))

formatter = logging.Formatter(
fmt=f"({name}) %(asctime)s %(module)s %(levelname)s: %(message)s",
datefmt="%m/%d/%Y %I:%M:%S %p",
)

for handler in logger.handlers:
logger.removeHandler(handler)

stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)

if is_log_to_file:
file_handler = logging.FileHandler(f"{logging_dir}/{name}.log")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

logger.setLevel(loglevel)

loggers[name] = logger

return logger
36 changes: 36 additions & 0 deletions tests/test_db.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import logging
from copy import copy
from datetime import datetime, timedelta
from unittest import TestCase

from helpers.logger import init_logger
from whois.data.db.database import Database
from whois.data.repository.device_repository import DeviceRepository
from whois.entity.device import Device


class TestMikrotik(TestCase):

def setUp(self):
self.logger = init_logger(__name__)
self.logger.addHandler(logging.FileHandler(f"{__name__}.log"))

self.db = Database("sqlite:///whohacks.test.sqlite")
self.db.drop()
self.db.create_db()
self.device_repository = DeviceRepository(self.db)

def test_create_device(self):
device = Device("mock_mac", "device_host", datetime.now(), owner=0, flags=0)
self.device_repository.insert(device)

def test_update_device(self):
device1 = Device("mac1", "device1", datetime.now(), owner=0, flags=0)
self.device_repository.insert(device1)
device2 = copy(device1)
new_last_seen = datetime.now() - timedelta(days=1)
device2.last_seen = new_last_seen
self.device_repository.update(device2)

result_device = self.device_repository.get_by_mac_address("mac1")
assert result_device == device2
2 changes: 1 addition & 1 deletion tests/test_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def test_iterable(self):
All functions should return iterable
:return:
"""
assert hasattr(helpers.filter_anon_names(users), "__len__")
assert hasattr(helpers.filter_anon_users(users), "__len__")
assert hasattr(helpers.filter_hidden(users), "__len__")
assert hasattr(helpers.owners_from_devices(devices), "__len__")
assert hasattr(helpers.unclaimed_devices(devices), "__len__")
Expand Down
11 changes: 3 additions & 8 deletions tests/test_integration.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import logging
from unittest import TestCase

from helpers.logger import init_logger
from whois.app import WhohacksApp
from whois.data.db.database import Database
from whois.settings.testing import app_settings, mikrotik_settings
Expand All @@ -9,19 +10,13 @@
class ApiTestCase(TestCase):

def setUp(self):
self.logger = logging.getLogger(__name__)
logging.basicConfig(
format="%(asctime)s %(module)s %(levelname)s: %(message)s",
datefmt="%m/%d/%Y %I:%M:%S %p",
level=logging.DEBUG,
force=True,
)
self.logger = init_logger(__name__)
self.logger.addHandler(logging.FileHandler(f"{__name__}.log"))

self.db = Database("sqlite:///whohacks.test.sqlite")
self.db.drop()
self.db.create_db()
self.whois = WhohacksApp(app_settings, mikrotik_settings, self.db, self.logger)
self.whois = WhohacksApp(app_settings, mikrotik_settings, self.db)
self.app = self.whois.app.test_client()
self.app.testing = True

Expand Down
Loading
Loading