Server-Bibliothek
2026-07-23 548bab93e55f6e514557571d3c9da9b1c1d59c35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
"""
Fuehrt den automatischen Update-Check fuer alle dafuer markierten Tools aus -
unabhaengig davon, ob die Weboberffaeche (app.py) gerade laeuft.
 
Wird genutzt von:
- pruefe_updates.bat (manueller Lauf per Doppelklick)
- der Windows-Aufgabenplanung (taeglicher automatischer Lauf, siehe
  automatisierung_einrichten.bat)
 
Nutzt dieselbe Datenbank und dieselbe Update-Logik (updater.py) wie die
Weboberflaeche, damit beide Wege konsistent bleiben.
"""
 
import os
import sqlite3
from datetime import datetime, date
 
import updater
 
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DB_PATH = os.path.join(BASE_DIR, "data", "bibliothek.db")
 
 
def _verbindung():
    conn = sqlite3.connect(DB_PATH)
    conn.row_factory = sqlite3.Row
    conn.execute("PRAGMA foreign_keys = ON")
    return conn
 
 
def _heute_str():
    return date.today().isoformat()
 
 
def _protokolliere_und_speichere(conn, sw_row, ergebnis):
    conn.execute(
        """INSERT INTO update_log (software_id, zeitpunkt, alte_version, neue_version, erfolg, meldung)
           VALUES (?, ?, ?, ?, ?, ?)""",
        (
            sw_row["id"],
            datetime.now().isoformat(timespec="seconds"),
            ergebnis.alte_version,
            ergebnis.neue_version,
            1 if ergebnis.erfolg else 0,
            ergebnis.meldung,
        ),
    )
    if ergebnis.erfolg:
        neue_version = ergebnis.neue_version or sw_row["version"]
        conn.execute(
            "UPDATE software SET version = ?, letzte_pruefung = ? WHERE id = ?",
            (neue_version, _heute_str(), sw_row["id"]),
        )
    conn.commit()
 
 
def pruefe_alle_automatischen():
    """Prueft alle Tools mit aktivierter automatischer Aktualisierung.
    Gibt eine Liste von (name, UpdateResult) zurueck."""
    if not os.path.isfile(DB_PATH):
        raise SystemExit(
            f"Datenbank nicht gefunden unter {DB_PATH}. "
            "Bitte zuerst einmal start.bat ausfuehren, damit sie angelegt wird."
        )
 
    conn = _verbindung()
    tools = conn.execute(
        "SELECT * FROM software WHERE auto_update = 1 AND update_quelle IS NOT NULL AND update_quelle != ''"
    ).fetchall()
 
    ergebnisse = []
    for sw in tools:
        ergebnis = updater.pruefe_software(
            sw["name"], sw["update_quelle"], sw["update_wert"], sw["version"], sw["installer_pfad"]
        )
        _protokolliere_und_speichere(conn, sw, ergebnis)
        ergebnisse.append((sw["name"], ergebnis))
 
    conn.close()
    return ergebnisse
 
 
if __name__ == "__main__":
    print("=" * 60)
    print(f" Automatische Update-Pruefung - {datetime.now().strftime('%Y-%m-%d %H:%M')}")
    print("=" * 60)
 
    ergebnisse = pruefe_alle_automatischen()
 
    if not ergebnisse:
        print("Kein Tool hat die automatische Aktualisierung aktiviert.")
    else:
        for name, ergebnis in ergebnisse:
            status = "OK    " if ergebnis.erfolg else "FEHLER"
            print(f" [{status}] {name}: {ergebnis.meldung}")
 
    print("=" * 60)
    print(" Fertig. Details stehen auch im Update-Protokoll jedes Tools in der Weboberflaeche.")