obscreen/src/manager/ConfigManager.py
2024-04-29 18:57:33 +02:00

128 lines
5.4 KiB
Python

import re
import os
import sys
import logging
import argparse
from src.manager.VariableManager import VariableManager
from dotenv import load_dotenv
load_dotenv()
class ConfigManager:
DEFAULT_PORT = 5000
VERSION_FILE = 'version.txt'
def __init__(self, variable_manager: VariableManager):
self._variable_manager = variable_manager
self._CONFIG = {
'version': None,
'port': self.DEFAULT_PORT,
'bind': '0.0.0.0',
'debug': False,
'autoconfigure_reverse_proxy_mode': False,
'autoconfigure_lx_file': '/home/pi/.config/lxsession/LXDE-pi/autostart',
'log_file': None,
'log_level': 'INFO',
'log_stdout': True,
'player_url': 'http://localhost:{}'.format(self.DEFAULT_PORT)
}
self.load_version()
self.load_from_env()
self.load_from_args()
self._CONFIG['port'] = self._CONFIG['port'] if self._CONFIG['port'] else self.DEFAULT_PORT
self.autoconfigure()
if self.map().get('debug'):
logging.debug(self._CONFIG)
def map(self) -> dict:
return self._CONFIG
def parse_arguments(self):
parser = argparse.ArgumentParser(description="Obscreen")
parser.add_argument('--debug', '-d', default=self._CONFIG['debug'], help='Debug mode')
parser.add_argument('--port', '-p', default=self._CONFIG['port'], help='Application port')
parser.add_argument('--bind', '-b', default=self._CONFIG['bind'], help='Application bind address')
parser.add_argument('--autoconfigure-reverse-proxy-mode', '-r', default=self._CONFIG['autoconfigure_reverse_proxy_mode'], action='store_true', help='true if you want to use nginx on port 80')
parser.add_argument('--autoconfigure-lx-file', '-x', default=self._CONFIG['autoconfigure_lx_file'], help='Path to lx autostart file')
parser.add_argument('--log-file', '-lf', default=self._CONFIG['log_file'], help='Log File path')
parser.add_argument('--log-level', '-ll', default=self._CONFIG['log_level'], help='Log Level')
parser.add_argument('--log-stdout', '-ls', default=self._CONFIG['log_stdout'], action='store_true', help='Log to standard output')
parser.add_argument('--version', '-v', default=None, action='store_true', help='Get version number')
return parser.parse_args()
def load_version(self) -> str:
with open(self.VERSION_FILE, 'r') as file:
self._CONFIG['version'] = file.read()
def load_from_args(self) -> None:
args = self.parse_arguments()
if args.debug:
self._CONFIG['debug'] = args.debug
if args.autoconfigure_reverse_proxy_mode:
self._CONFIG['autoconfigure_reverse_proxy_mode'] = args.autoconfigure_reverse_proxy_mode
if args.autoconfigure_lx_file:
self._CONFIG['autoconfigure_lx_file'] = args.autoconfigure_lx_file
if args.log_file:
self._CONFIG['log_file'] = args.log_file
if args.log_level:
self._CONFIG['log_level'] = args.log_level
if args.log_stdout:
self._CONFIG['log_stdout'] = args.log_stdout
if args.version:
print("Obscreen version v{} (https://github.com/jr-k/obscreen)".format(self._CONFIG['version']))
sys.exit(0)
def load_from_env(self) -> None:
for key in self._CONFIG:
if key.upper() in os.environ:
value = os.environ[key.upper()]
if value.lower() == 'false' or value == '0' or value == '':
value = False
elif value.lower() == 'true' or value == '1':
value = True
self._CONFIG[key.lower()] = value
logging.info(f"Env var {key} has been found")
def autoconfigure(self) -> None:
if self.map().get('autoconfigure_reverse_proxy_mode'):
self.autoconfigure_nginx()
if self.map().get('autoconfigure_lx_file'):
self.autoconfigure_lxconf()
def autoconfigure_nginx(self) -> None:
reverse_proxy_config_file = 'system/nginx-obscreen'
with open(reverse_proxy_config_file, 'r') as file:
content = file.read()
with open(reverse_proxy_config_file, 'w') as file:
file.write(re.sub(r'proxy_pass .*?;', 'proxy_pass {};'.format(self.map().get('player_url')), content))
self._CONFIG['player_url'] = 'http://localhost'
def autoconfigure_lxconf(self) -> None:
destination_path = self.map().get('autoconfigure_lx_file')
player_url = self.map().get('player_url')
os.makedirs(os.path.dirname(destination_path), exist_ok=True)
xenv_presets = f"""
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
#@point-rpi
@xset s off
@xset -dpms
@xset s noblank
@unclutter -display :0 -noevents -grab
@sed -i 's/"exited_cleanly": false/"exited_cleanly": true/' ~/.config/chromium/Default/Preferences
#@sleep 10
@chromium-browser --disable-features=Translate --ignore-certificate-errors --disable-web-security --disable-restore-session-state --autoplay-policy=no-user-gesture-required --start-maximized --allow-running-insecure-content --remember-cert-error-decisions --disable-restore-session-state --noerrdialogs --kiosk --incognito --window-position=0,0 --display=:0 {player_url}
"""
with open(destination_path, 'w') as file:
file.write(xenv_presets)