From b599fbae97097753ac8103459b35ebbb93fb26d7 Mon Sep 17 00:00:00 2001 From: ed Date: Thu, 5 Sep 2024 19:31:33 +0000 Subject: [PATCH] use local timezone in log messages; closes #96 timezone can be changed with `export TZ=Europe/Oslo` before launch using naive timestamps like this appears to be safe as of 3.13-rc1, no deprecation warnings, just a tiny bit slower than assuming UTC --- copyparty/__main__.py | 1 + copyparty/svchub.py | 61 ++++++++++++++---------------------- scripts/docker/Dockerfile.ac | 2 +- scripts/docker/Dockerfile.dj | 2 +- scripts/docker/Dockerfile.im | 2 +- scripts/docker/Dockerfile.iv | 2 +- 6 files changed, 28 insertions(+), 42 deletions(-) diff --git a/copyparty/__main__.py b/copyparty/__main__.py index 2f97fe04..c20ca4b9 100644 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -1285,6 +1285,7 @@ def add_logging(ap): ap2.add_argument("--ansi", action="store_true", help="force colors; overrides environment-variable NO_COLOR") ap2.add_argument("--no-logflush", action="store_true", help="don't flush the logfile after each write; tiny bit faster") ap2.add_argument("--no-voldump", action="store_true", help="do not list volumes and permissions on startup") + ap2.add_argument("--log-utc", action="store_true", help="do not use local timezone; assume the TZ env-var is UTC (tiny bit faster)") ap2.add_argument("--log-tdec", metavar="N", type=int, default=3, help="timestamp resolution / number of timestamp decimals") ap2.add_argument("--log-badpwd", metavar="N", type=int, default=1, help="log failed login attempt passwords: 0=terse, 1=plaintext, 2=hashed") ap2.add_argument("--log-conn", action="store_true", help="debug: print tcp-server msgs") diff --git a/copyparty/svchub.py b/copyparty/svchub.py index 3bd05489..71bcb34b 100644 --- a/copyparty/svchub.py +++ b/copyparty/svchub.py @@ -3,7 +3,6 @@ from __future__ import print_function, unicode_literals import argparse import base64 -import calendar import errno import gzip import logging @@ -16,7 +15,7 @@ import string import sys import threading import time -from datetime import datetime, timedelta +from datetime import datetime # from inspect import currentframe # print(currentframe().f_lineno) @@ -104,6 +103,7 @@ class SvcHub(object): self.argv = argv self.E: EnvParams = args.E self.no_ansi = args.no_ansi + self.tz = UTC if args.log_utc else None self.logf: Optional[typing.TextIO] = None self.logf_base_fn = "" self.is_dut = False # running in unittest; always False @@ -118,7 +118,8 @@ class SvcHub(object): self.httpsrv_up = 0 self.log_mutex = threading.Lock() - self.next_day = 0 + self.cday = 0 + self.cmon = 0 self.tstack = 0.0 self.iphash = HMaccas(os.path.join(self.E.cfg, "iphash"), 8) @@ -791,7 +792,7 @@ class SvcHub(object): self.args.nc = min(self.args.nc, soft // 2) def _logname(self) -> str: - dt = datetime.now(UTC) + dt = datetime.now(self.tz) fn = str(self.args.lo) for fs in "YmdHMS": fs = "%" + fs @@ -1064,12 +1065,12 @@ class SvcHub(object): return with self.log_mutex: - zd = datetime.now(UTC) + dt = datetime.now(self.tz) ts = self.log_dfmt % ( - zd.year, - zd.month * 100 + zd.day, - (zd.hour * 100 + zd.minute) * 100 + zd.second, - zd.microsecond // self.log_div, + dt.year, + dt.month * 100 + dt.day, + (dt.hour * 100 + dt.minute) * 100 + dt.second, + dt.microsecond // self.log_div, ) if c and not self.args.no_ansi: @@ -1090,41 +1091,26 @@ class SvcHub(object): if not self.args.no_logflush: self.logf.flush() - now = time.time() - if int(now) >= self.next_day: - self._set_next_day() + if dt.day != self.cday or dt.month != self.cmon: + self._set_next_day(dt) - def _set_next_day(self) -> None: - if self.next_day and self.logf and self.logf_base_fn != self._logname(): + def _set_next_day(self, dt: datetime) -> None: + if self.cday and self.logf and self.logf_base_fn != self._logname(): self.logf.close() self._setup_logfile("") - dt = datetime.now(UTC) - - # unix timestamp of next 00:00:00 (leap-seconds safe) - day_now = dt.day - while dt.day == day_now: - dt += timedelta(hours=12) - - dt = dt.replace(hour=0, minute=0, second=0) - try: - tt = dt.utctimetuple() - except: - # still makes me hella uncomfortable - tt = dt.timetuple() - - self.next_day = calendar.timegm(tt) + self.cday = dt.day + self.cmon = dt.month def _log_enabled(self, src: str, msg: str, c: Union[int, str] = 0) -> None: """handles logging from all components""" with self.log_mutex: - now = time.time() - if int(now) >= self.next_day: - dt = datetime.fromtimestamp(now, UTC) + dt = datetime.now(self.tz) + if dt.day != self.cday or dt.month != self.cmon: zs = "{}\n" if self.no_ansi else "\033[36m{}\033[0m\n" zs = zs.format(dt.strftime("%Y-%m-%d")) print(zs, end="") - self._set_next_day() + self._set_next_day(dt) if self.logf: self.logf.write(zs) @@ -1143,12 +1129,11 @@ class SvcHub(object): else: msg = "%s%s\033[0m" % (c, msg) - zd = datetime.fromtimestamp(now, UTC) ts = self.log_efmt % ( - zd.hour, - zd.minute, - zd.second, - zd.microsecond // self.log_div, + dt.hour, + dt.minute, + dt.second, + dt.microsecond // self.log_div, ) msg = fmt % (ts, src, msg) try: diff --git a/scripts/docker/Dockerfile.ac b/scripts/docker/Dockerfile.ac index 4cd3c69c..ba5fbbc4 100644 --- a/scripts/docker/Dockerfile.ac +++ b/scripts/docker/Dockerfile.ac @@ -8,7 +8,7 @@ LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \ ENV XDG_CONFIG_HOME=/cfg RUN apk --no-cache add !pyc \ - wget \ + tzdata wget \ py3-jinja2 py3-argon2-cffi py3-pillow \ ffmpeg diff --git a/scripts/docker/Dockerfile.dj b/scripts/docker/Dockerfile.dj index 0b9ed376..9addcdf1 100644 --- a/scripts/docker/Dockerfile.dj +++ b/scripts/docker/Dockerfile.dj @@ -11,7 +11,7 @@ COPY i/bin/mtag/install-deps.sh ./ COPY i/bin/mtag/audio-bpm.py /mtag/ COPY i/bin/mtag/audio-key.py /mtag/ RUN apk add -U !pyc \ - wget \ + tzdata wget \ py3-jinja2 py3-argon2-cffi py3-pillow py3-pip py3-cffi \ ffmpeg \ vips-jxl vips-heif vips-poppler vips-magick \ diff --git a/scripts/docker/Dockerfile.im b/scripts/docker/Dockerfile.im index f86a06f0..276865bf 100644 --- a/scripts/docker/Dockerfile.im +++ b/scripts/docker/Dockerfile.im @@ -8,7 +8,7 @@ LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \ ENV XDG_CONFIG_HOME=/cfg RUN apk --no-cache add !pyc \ - wget \ + tzdata wget \ py3-jinja2 py3-argon2-cffi py3-pillow py3-mutagen COPY i/dist/copyparty-sfx.py innvikler.sh ./ diff --git a/scripts/docker/Dockerfile.iv b/scripts/docker/Dockerfile.iv index 8ffda654..6c8fdb2e 100644 --- a/scripts/docker/Dockerfile.iv +++ b/scripts/docker/Dockerfile.iv @@ -8,7 +8,7 @@ LABEL org.opencontainers.image.url="https://github.com/9001/copyparty" \ ENV XDG_CONFIG_HOME=/cfg RUN apk add -U !pyc \ - wget \ + tzdata wget \ py3-jinja2 py3-argon2-cffi py3-pillow py3-pip py3-cffi \ ffmpeg \ vips-jxl vips-heif vips-poppler vips-magick \