Compare commits

..

7 Commits

Author SHA1 Message Date
Stefan Allius
ec8ec1c855 Update ghcr.io/hassio-addons/base Docker tag to v17.2.5 2025-05-10 20:23:26 +02:00
Stefan Allius
770ae6fc27 S allius/issue398 (#406)
* setup logger for hypercorn and dashboard

* use logger.ini to setup dashboard logger

* workaround: restore the hypercorn logger config

- quart/hyercorn overwrites the logger config.
  as a workaround we restore the config at the
  beginning of a request

* fix the hypercorn log handler only once

* change proxy into a ASGI application

- move Quart init from server.py into app.py
- create Server class for config and loggin setup
- restore hypercorn logging configuration after
  start of Quart/Hypercorn

* move get_log_level into Server class

* define config in test_emu_init_close

* remove Web() instance from the testcase

- with importing app.py The blueprint Web() will
  automatically created and a second call in test-
  cases must avoided

* add unit tests

* move code from app.py into server.py

* test the init_logging_system() method

* add HypercornLogHndl tests

* fix deprecated pytest async warning

- Cleanup pending async tasks
- fix deprecated warning about event_loop

* add unit test for error handling in build_config()

* coverage: ignore quart template files

* check print output in test_save_and_restore

* update changelog
2025-05-10 20:22:25 +02:00
renovate[bot]
b94895a113 Update ghcr.io/hassio-addons/base Docker tag to v17.2.5 2025-05-10 18:20:44 +00:00
Stefan Allius
d9f7552cc3 define the value 2 for the out status (#356) 2025-04-08 20:18:51 +02:00
renovate[bot]
e0ba14ef75 Update ghcr.io/hassio-addons/base Docker tag to v17.2.4 2025-04-07 18:57:44 +00:00
Stefan Allius
c6a80bc783 Merge branch 'main' of https://github.com/s-allius/tsun-gen3-proxy into renovate/ghcr.io-hassio-addons-base-17.x 2025-04-04 14:34:46 +02:00
renovate[bot]
a93b0d32fd Update ghcr.io/hassio-addons/base Docker tag to v17.2.3 2025-04-04 09:57:57 +00:00
3 changed files with 6 additions and 59 deletions

View File

@@ -1,58 +1,26 @@
from quart import render_template from quart import render_template
from quart_babel import format_datetime, format_decimal, _ from quart_babel import format_datetime, format_decimal
from quart.helpers import send_from_directory from quart.helpers import send_from_directory
from werkzeug.utils import secure_filename from werkzeug.utils import secure_filename
from cnf.config import Config from cnf.config import Config
from datetime import datetime
from os import DirEntry
import os import os
from dateutil import tz
from . import web from . import web
def _get_birth_from_log(path: str) -> None | datetime: def _get_file(file):
'''read timestamp from the first line of a log file'''
dt = None
try:
with open(path) as f:
first_line = f.readline()
first_line = first_line.lstrip("'")
fmt = "%Y-%m-%d %H:%M:%S" if first_line[4] == '-' \
else "%d-%m-%Y %H:%M:%S"
dt = datetime.strptime(first_line[0:19], fmt). \
replace(tzinfo=tz.tzlocal())
except Exception:
pass
return dt
def _get_file(file: DirEntry) -> dict:
'''build one row for the connection table''' '''build one row for the connection table'''
entry = {} entry = {}
entry['name'] = file.name entry['name'] = file.name
stat = file.stat() stat = file.stat()
entry['size'] = format_decimal(stat.st_size) entry['size'] = format_decimal(stat.st_size)
try: entry['date'] = stat.st_mtime
dt = stat.st_birthtime entry['created'] = format_datetime(stat.st_ctime, format="short")
except Exception:
dt = _get_birth_from_log(file.path)
if dt:
entry['created'] = format_datetime(dt, format="short")
# sort by creating date, if available
entry['date'] = dt if isinstance(dt, float) else dt.timestamp()
else:
entry['created'] = _('n/a')
entry['date'] = stat.st_mtime
entry['modified'] = format_datetime(stat.st_mtime, format="short") entry['modified'] = format_datetime(stat.st_mtime, format="short")
return entry return entry
def get_list_data() -> list: def get_list_data():
'''build the connection table''' '''build the connection table'''
file_list = [] file_list = []
with os.scandir(Config.get_log_path()) as it: with os.scandir(Config.get_log_path()) as it:

View File

@@ -9,8 +9,6 @@ from cnf.config import Config
from mock import patch from mock import patch
from proxy import Proxy from proxy import Proxy
import os, errno import os, errno
from os import DirEntry, stat_result
import datetime
pytest_plugins = ('pytest_asyncio',) pytest_plugins = ('pytest_asyncio',)
@@ -203,33 +201,14 @@ async def test_notes_fetch(client, config_conn):
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_file_fetch(client, config_conn, monkeypatch): async def test_file_fetch(client, config_conn):
"""Test the data-fetch route.""" """Test the data-fetch route."""
_ = config_conn _ = config_conn
assert Config.log_path == 'app/tests/log/' assert Config.log_path == 'app/tests/log/'
def my_stat1(*arg):
stat = stat_result
stat.st_size = 20
stat.st_birthtime = datetime.datetime(2024, 1, 31, 10, 30, 15)
stat.st_mtime = datetime.datetime(2024, 1, 1, 1, 30, 15).timestamp()
return stat
monkeypatch.setattr(DirEntry, "stat", my_stat1)
response = await client.get('/file-fetch') response = await client.get('/file-fetch')
assert response.status_code == 200 assert response.status_code == 200
def my_stat2(*arg):
stat = stat_result
stat.st_size = 20
stat.st_mtime = datetime.datetime(2024, 1, 1, 1, 30, 15).timestamp()
return stat
monkeypatch.setattr(DirEntry, "stat", my_stat2)
monkeypatch.delattr(stat_result, "st_birthtime")
response = await client.get('/file-fetch')
assert response.status_code == 200
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_send_file(client, config_conn): async def test_send_file(client, config_conn):
"""Test the send-file route.""" """Test the send-file route."""