Dobrý den, bylo by prosím možné přidat podporu Docker Compose secrets pro přihlašovací údaje Oneplay?Aktuální Docker image načítá v Docker režimu hodnoty `USERNAME` a `PASSWORD` z environment variables. Docker Compose secrets jsou ale standardně dostupné jako soubory v `/run/secrets/...`, například:
Aplikace nyní 'USERNAME_FILE' a `PASSWORD_FILE` neinterpretuje, takže musím mít user/pass v config nebo v compose. Navrhuji přidat podporu konvence `<PROMENNA>_FILE` do `get_config_value()` v `resources/lib/utils.py`.
Požadované chování:
1. Pokud je nastavena `USERNAME_FILE`, načíst obsah tohoto souboru jako hodnotu `USERNAME`.
2. Pokud je nastavena `PASSWORD_FILE`, načíst obsah tohoto souboru jako hodnotu `PASSWORD`.
3. Hodnota z `*_FILE` má přednost před přímou proměnnou `USERNAME` / `PASSWORD`.
4. Pokud `*_FILE` není nastaveno, zachovat stávající chování beze změny.
5. Odstranit pouze koncový LF/CRLF ze souboru se secretem.
6. Při nečitelném nebo neexistujícím souboru skončit s jasnou chybou, aby nedošlo k tichému přihlášení s prázdným nebo chybným údajem.
Tím bude image kompatibilní s Docker Compose secrets, Docker Swarm secrets a běžnou `_FILE` konvencí používanou mnoha Docker images.
Níže přikládám návrh minimální změny. Změny jsem otestoval u sebe a fungují jak při použití USERNAME tak i USERNAME_FILE resp. PASSWORD i PASSWORD_FILE. Tento návrh je schválně obecný, nepodporuje jen USERNAME_FILE a PASSWORD_FILE ale i AUTH_PASS_FILE nebo PIN_FILE atp. aniž by se musela stejná logika kopírovat.
Jak bude fungovat Compose
Aplikace pak při volání najde nejdříve USERNAME_FILE a PASSWORD_FILE, načte obsah těchto souborů a vrátí jej jako hodnotu uživatelského jména a hesla. Současné nasazení s běžnými proměnnými USERNAME a PASSWORD zůstane plně kompatibilní.
Kód:
environment:
USERNAME_FILE: /run/secrets/USERNAME
PASSWORD_FILE: /run/secrets/PASSWORD
secrets:
- USERNAME
- PASSWORDAplikace nyní 'USERNAME_FILE' a `PASSWORD_FILE` neinterpretuje, takže musím mít user/pass v config nebo v compose. Navrhuji přidat podporu konvence `<PROMENNA>_FILE` do `get_config_value()` v `resources/lib/utils.py`.
Požadované chování:
1. Pokud je nastavena `USERNAME_FILE`, načíst obsah tohoto souboru jako hodnotu `USERNAME`.
2. Pokud je nastavena `PASSWORD_FILE`, načíst obsah tohoto souboru jako hodnotu `PASSWORD`.
3. Hodnota z `*_FILE` má přednost před přímou proměnnou `USERNAME` / `PASSWORD`.
4. Pokud `*_FILE` není nastaveno, zachovat stávající chování beze změny.
5. Odstranit pouze koncový LF/CRLF ze souboru se secretem.
6. Při nečitelném nebo neexistujícím souboru skončit s jasnou chybou, aby nedošlo k tichému přihlášení s prázdným nebo chybným údajem.
Tím bude image kompatibilní s Docker Compose secrets, Docker Swarm secrets a běžnou `_FILE` konvencí používanou mnoha Docker images.
Níže přikládám návrh minimální změny. Změny jsem otestoval u sebe a fungují jak při použití USERNAME tak i USERNAME_FILE resp. PASSWORD i PASSWORD_FILE. Tento návrh je schválně obecný, nepodporuje jen USERNAME_FILE a PASSWORD_FILE ale i AUTH_PASS_FILE nebo PIN_FILE atp. aniž by se musela stejná logika kopírovat.
Kód:
def get_config_value(setting):
if is_kodi():
import xbmcaddon
return xbmcaddon.Addon().getSetting(setting)
config_file = os.path.join(get_script_path(), 'config.txt')
defaults = {
'WEBSERVER_IP': '0.0.0.0',
'WEBSERVER_PORT': 8082,
'EPG_DNU_ZPETNE': 1,
'EPG_DNU_DOPREDU': 1,
'INTERVAL_STAHOVANI_EPG': 0,
'ODSTRANIT_HD': 0,
'POUZIVAT_CISLA_KANALU': 0,
'PORADI_SLUZBY': -1,
'PIN': '4321',
'PROFILE_PIN': '4321',
'DEBUG': 0,
'CESTA_FFMPEG': '/usr/bin/ffmpeg',
'AUTH_USER': '',
'AUTH_PASS': '',
}
if is_docker() and not os.path.exists(config_file):
- return os.getenv(setting.upper(), defaults.get(setting.upper()))
+ env_name = setting.upper()
+ secret_file = os.getenv(f'{env_name}_FILE')
+
+ if secret_file:
+ try:
+ with open(secret_file, encoding='utf-8') as file:
+ return file.read().rstrip('\r\n')
+ except OSError as error:
+ raise RuntimeError(
+ f'Cannot read Docker secret from {env_name}_FILE: {secret_file}'
+ ) from error
+
+ return os.getenv(env_name, defaults.get(env_name))
with open(config_file, encoding='utf-8') as file:
return json.load(file).get(setting, defaults.get(setting.upper()))Jak bude fungovat Compose
Kód:
services:
oneplayserver:
image: XXXX/oneplayserver:verze-s-podporou-secrets
environment:
USERNAME_FILE: /run/secrets/USERNAME
PASSWORD_FILE: /run/secrets/PASSWORD
DEVICEID: atv34
WEBSERVER_IP: 192.168.X.X
WEBSERVER_PORT: 8082
secrets:
- USERNAME
- PASSWORD
secrets:
USERNAME:
file: /share/Docker_data/secrets/O2TV/USERNAME
PASSWORD:
file: /share/Docker_data/secrets/O2TV/PASSWORDAplikace pak při volání najde nejdříve USERNAME_FILE a PASSWORD_FILE, načte obsah těchto souborů a vrátí jej jako hodnotu uživatelského jména a hesla. Současné nasazení s běžnými proměnnými USERNAME a PASSWORD zůstane plně kompatibilní.
