From c3996c83e488c033f83d68f0a2b80a27ca9ea309 Mon Sep 17 00:00:00 2001 From: Alexander Malzkuhn Date: Mon, 2 Jun 2025 14:11:58 +0200 Subject: [PATCH] =?UTF-8?q?Dockercheck=20eingef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 3 ++- docker-compose.yml | 5 +++-- lib/admin.py | 19 ++++++++++++++----- lib/definitions.py | 11 +++++++---- lib/users.py | 9 +++------ lib/web_ui.py | 6 +++++- zeiterfassung.py => main.py | 5 +++++ settings.json_local => settings.json | 0 8 files changed, 39 insertions(+), 19 deletions(-) rename zeiterfassung.py => main.py (97%) rename settings.json_local => settings.json (100%) diff --git a/Dockerfile b/Dockerfile index 59e4c5a..f97154d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,6 +4,7 @@ RUN apt install python3 python3-pip python3.11-venv locales -y RUN mkdir /app RUN mkdir /.venv RUN mkdir /backup +RUN mkdir /settings RUN python3 -m venv /.venv RUN /.venv/bin/pip install nicegui RUN /.venv/bin/pip install segno @@ -19,5 +20,5 @@ COPY main.py /app/main.py COPY favicon.svg /app/favicon.svg COPY lib /app/lib/ EXPOSE 8090 -ENTRYPOINT ["/.venv/bin/python", "/app/main.py", "--docker"] +ENTRYPOINT ["/.venv/bin/python", "/app/main.py"] #ENTRYPOINT exec /app/.venv/bin/python /app/main.py --docker \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 56a3f5c..1bb6566 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,6 +5,7 @@ services: ports: - 8090:8090 volumes: - - /home/alexander/Dokumente/Python/Zeiterfassung:/app + #- /home/alexander/Dokumente/Python/Zeiterfassung:/app - /home/alexander/Dokumente/Python/Zeiterfassung/users-docker:/users - - /home/alexander/Dokumente/Python/Zeiterfassung/backup:/backup \ No newline at end of file + - /home/alexander/Dokumente/Python/Zeiterfassung/backup:/backup + - /home/alexander/Dokumente/Python/Zeiterfassung/settings:/settings \ No newline at end of file diff --git a/lib/admin.py b/lib/admin.py index 6b3c32e..7b1ed32 100644 --- a/lib/admin.py +++ b/lib/admin.py @@ -44,8 +44,13 @@ def page_admin(): updates_available = ValueBinder() updates_available.value = False - is_docker = ValueBinder - print(docker) + enabled_because_not_docker = ValueBinder + if is_docker(): + enabled_because_not_docker.value = False + scriptpath = "/app" + backupfolder = "/backup" + else: + enabled_because_not_docker.value = True with ui.tabs() as tabs: @@ -762,7 +767,9 @@ Dies kann nicht rückgängig gemacht werden!''') ui.markdown("Port:") port = ui.input(validation={"Nur ganzzahlige Portnummern erlaubt": lambda value: check_is_number(value), - "Portnummer zu klein": lambda value: len(value)>=2}).tooltip("Geben Sie hier die Portnummer ein, unter der die Zeiterfassung erreichbar ist.").props('size=5') + "Portnummer zu klein": lambda value: len(value)>=2}).tooltip("Geben Sie hier die Portnummer ein, unter der die Zeiterfassung erreichbar ist.").props('size=5').bind_enabled_from(enabled_because_not_docker, 'value') + if is_docker(): + port.tooltip("Diese Einstellung ist beim Einsatz von Docker deaktiviert.") old_port = data["port"] port.value = old_port @@ -1398,7 +1405,7 @@ Dies kann nicht rückgängig gemacht werden!''') ui.label("Backupeinstellungen").classes('font-bold') with ui.grid(columns='auto auto auto'): ui.markdown("Backupordner:") - backupfolder_input = ui.input(value=backupfolder).props(f"size={len(backupfolder)}") + backupfolder_input = ui.input(value=backupfolder).props(f"size={len(backupfolder)}").bind_enabled_from(enabled_because_not_docker, 'value') def save_new_folder_name(): if os.path.exists(backupfolder_input.value): write_adminsetting("backup_folder", backupfolder_input.value) @@ -1410,7 +1417,9 @@ Dies kann nicht rückgängig gemacht werden!''') ui.label("exisitiert nicht und kann daher nicht verwendet werden.") ui.button("OK", on_click=dialog.close) dialog.open() - ui.button("Speichern", on_click=save_new_folder_name).tooltip("Hiermit können Sie das Backupverzeichnis ändeern") + save_backup_folder_button = ui.button("Speichern", on_click=save_new_folder_name).tooltip("Hiermit können Sie das Backupverzeichnis ändeern").bind_enabled_from(enabled_because_not_docker, 'value') + if is_docker(): + save_backup_folder_button.tooltip("Diese Einstellung ist beim Einsatz von Docker deaktiviert.") ui.markdown("API-Schlüssel:") backup_api_key_input = ui.input(value=api_key).tooltip("Hier den API-Schlüssel eintragen, der für Backuperzeugung mittels API-Aufruf verwendet werden soll.") diff --git a/lib/definitions.py b/lib/definitions.py index ebef833..318d9c0 100644 --- a/lib/definitions.py +++ b/lib/definitions.py @@ -3,18 +3,21 @@ import os from pathlib import Path +from lib.web_ui import is_docker import hashlib app_title = "Zeiterfassung" app_version = "0.0.0" -docker = False - # Standardpfade -scriptpath = str(Path(os.path.dirname(os.path.abspath(__file__))).parent.absolute()) +if is_docker(): + scriptpath = "/settings" + backupfolder = "/backup" +else: + scriptpath = str(Path(os.path.dirname(os.path.abspath(__file__))).parent.absolute()) + backupfolder = str(os.path.join(scriptpath, "backup")) userfolder = "users" -backupfolder = str(os.path.join(scriptpath, "backup")) # Dateinamen diff --git a/lib/users.py b/lib/users.py index 4a05b8d..d6acfd0 100644 --- a/lib/users.py +++ b/lib/users.py @@ -14,14 +14,15 @@ import shutil import re from lib.definitions import userfolder, scriptpath, usersettingsfilename, photofilename, status_in, status_out, \ - standard_adminsettings, standard_usersettings, va_file, docker + standard_adminsettings, standard_usersettings, va_file +from web_ui import is_docker # Benutzerklasse class user: def __init__(self, name): - if not scriptpath == "/app": + if not is_docker(): self.userfolder = os.path.join(scriptpath, userfolder, name) else: self.userfolder = os.path.join("/users", name) @@ -32,7 +33,6 @@ class user: #try: with open(self.settingsfile) as json_file: data = json.load(json_file) - print(data) #except: # print("Fehler beim Erstellen des Datenarrays.") # #TODO Hier muss noch Fehlerbehandlungcode hin @@ -304,10 +304,8 @@ class user: return { } def write_notes(self, year, month, day, note_dict): - print(os.path.join(self.userfolder, f"{int(year)}-{int(month)}.json")) with open(os.path.join(self.userfolder, f"{int(year)}-{int(month)}.json"), "r") as json_file: json_data = json.load(json_file) - print(json_data) if len(note_dict) == 1: user_info = list(note_dict)[0] json_data["notes"][str(day)] = { } @@ -537,7 +535,6 @@ def new_user(username: str): def load_adminsettings(): # Settingsdatei einlesen settings_filename = os.path.join(scriptpath, usersettingsfilename) - print(settings_filename) if not os.path.exists(settings_filename): print("Keine Einstellungsdatei gefunden. Lege Standarddatei an.") with open(settings_filename, 'w') as json_file: diff --git a/lib/web_ui.py b/lib/web_ui.py index f7f6ace..1050cc4 100644 --- a/lib/web_ui.py +++ b/lib/web_ui.py @@ -118,4 +118,8 @@ def login_is_valid(user = -1): else: return False except: - return False \ No newline at end of file + return False + +def is_docker(): + cgroup = Path('/proc/self/cgroup') + return Path('/.dockerenv').is_file() or (cgroup.is_file() and 'docker' in cgroup.read_text()) \ No newline at end of file diff --git a/zeiterfassung.py b/main.py similarity index 97% rename from zeiterfassung.py rename to main.py index 06752bc..c37808d 100644 --- a/zeiterfassung.py +++ b/main.py @@ -59,6 +59,11 @@ if __name__ in ("__main__", "__mp_main__"): parser = argparse.ArgumentParser(description=f'{app_title} {app_version}') parser.add_argument('--admin-access', help='Zugangsdaten für Administrator einstellen', action="store_true") args = parser.parse_args() + + if is_docker(): + scriptpath = "/app" + backupfolder = "/backup" + if args.admin_access: Commandline_Header() print("Lade Administrationseinstellungen") diff --git a/settings.json_local b/settings.json similarity index 100% rename from settings.json_local rename to settings.json