128 lines
5.4 KiB
Python
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)
|