"""Zugangsdaten aus config.ini. Passwoerter standen frueher im Quelltext - in solarManager.py, zeit.py, gatherWaterData.py und wecker.py jeweils noch einmal. Beim Anlegen des Repositorys waeren sie damit dauerhaft in der Historie gelandet, und genau das musste beim Web-Repository schon einmal muehsam rueckgaengig gemacht werden. Jetzt steht alles in config.ini, die nicht mit eingecheckt wird. Was dort hineingehoert, zeigt config.ini.example - beim Aufsetzen kopieren und ausfuellen. Dasselbe Verfahren benutzt der AutoAction-Runner unter autoActions/ schon laenger. import konfig zug = konfig.datenbank() # dict fuer mysql.connector.connect with connect(**zug) as c: ... pw = konfig.wert("wattpilot", "password") """ import configparser import os _PFAD = os.path.join(os.path.dirname(os.path.abspath(__file__)), "config.ini") _konf = None def _lesen(): """Die Datei einmal einlesen und behalten.""" global _konf if _konf is None: _konf = configparser.ConfigParser(interpolation=None) # Prozentzeichen im Passwort if not _konf.read(_PFAD, encoding="utf-8"): raise SystemExit( "%s fehlt - config.ini.example kopieren und ausfuellen." % _PFAD) return _konf def wert(abschnitt, schluessel, vorgabe=None): """Ein einzelner Eintrag. Ohne Vorgabe ist ein fehlender Eintrag ein Fehler. Lieber hier laut abbrechen als spaeter mit einem leeren Passwort an der Datenbank scheitern - der Grund waere dann nicht mehr zu sehen. """ konf = _lesen() if konf.has_option(abschnitt, schluessel): return konf.get(abschnitt, schluessel) if vorgabe is not None: return vorgabe raise SystemExit("config.ini: [%s] %s fehlt." % (abschnitt, schluessel)) def datenbank(abschnitt="database"): """Verbindungsdaten als dict, direkt fuer mysql.connector.connect geeignet. Der Port bleibt Text, weil connect() beides nimmt und der Aufrufer ihn frueher auch als Text stehen hatte. """ return {"host": wert(abschnitt, "host", "localhost"), "port": wert(abschnitt, "port", "3310"), "user": wert(abschnitt, "user"), "password": wert(abschnitt, "password"), "database": wert(abschnitt, "database")}