better restart management

This commit is contained in:
jr-k 2024-05-18 20:42:39 +02:00
parent 28cfae03a8
commit 3cacc9fb00
6 changed files with 49 additions and 18 deletions

View File

@ -9,7 +9,7 @@ jQuery(document).ready(function ($) {
if (confirm(l.js_sysinfo_restart_confirmation)) { if (confirm(l.js_sysinfo_restart_confirmation)) {
$('body').html(l.js_sysinfo_restart_loading).css({margin:200}); $('body').html(l.js_sysinfo_restart_loading).css({margin:200});
$.ajax({ $.ajax({
url: '/sysinfo/restart', url: '/sysinfo/restart?secret_key='+secret_key,
headers: {'Content-Type': 'application/json'}, headers: {'Content-Type': 'application/json'},
data: '', data: '',
method: 'POST', method: 'POST',

View File

@ -24,6 +24,9 @@ class AuthController(ObController):
if current_user.is_authenticated: if current_user.is_authenticated:
return redirect(url_for('slideshow_slide_list')) return redirect(url_for('slideshow_slide_list'))
if not self._model_store.variable().map().get('auth_enabled').as_bool():
return redirect(url_for('slideshow_slide_list'))
if len(request.form): if len(request.form):
user = self._model_store.user().get_one_by_username(request.form['username'], enabled=True) user = self._model_store.user().get_one_by_username(request.form['username'], enabled=True)
if user: if user:
@ -42,6 +45,13 @@ class AuthController(ObController):
def logout(self): def logout(self):
logout_user() logout_user()
if request.args.get('restart'):
return redirect(url_for(
'sysinfo_restart',
secret_key=self._model_store.config().map().get('secret_key')
))
return redirect(url_for('login')) return redirect(url_for('login'))
def auth_user_list(self): def auth_user_list(self):

View File

@ -39,7 +39,10 @@ class SettingsController(ObController):
if variable.name == 'auth_enabled': if variable.name == 'auth_enabled':
self.reload_web_server() self.reload_web_server()
if variable.as_bool(): if variable.as_bool():
return redirect(url_for('logout')) return redirect(url_for(
'logout',
restart=1
))
if variable.name == 'lang': if variable.name == 'lang':
self._model_store.lang().set_lang(variable.value) self._model_store.lang().set_lang(variable.value)

View File

@ -2,21 +2,23 @@ import os
import sys import sys
import platform import platform
import subprocess import subprocess
import threading
import time
from flask import Flask, render_template, jsonify from flask import Flask, render_template, jsonify, request, url_for, redirect
from src.manager.VariableManager import VariableManager from src.manager.VariableManager import VariableManager
from src.manager.ConfigManager import ConfigManager from src.manager.ConfigManager import ConfigManager
from src.service.ModelStore import ModelStore from src.service.ModelStore import ModelStore
from src.interface.ObController import ObController from src.interface.ObController import ObController
from src.utils import get_ip_address from src.utils import get_ip_address, am_i_in_docker
class SysinfoController(ObController): class SysinfoController(ObController):
def register(self): def register(self):
self._app.add_url_rule('/sysinfo', 'sysinfo_attribute_list', self._auth(self.sysinfo), methods=['GET']) self._app.add_url_rule('/sysinfo', 'sysinfo_attribute_list', self._auth(self.sysinfo), methods=['GET'])
self._app.add_url_rule('/sysinfo/restart', 'sysinfo_restart', self._auth(self.sysinfo_restart), methods=['POST']) self._app.add_url_rule('/sysinfo/restart', 'sysinfo_restart', self.sysinfo_restart, methods=['GET', 'POST'])
self._app.add_url_rule('/sysinfo/restart/needed', 'sysinfo_restart_needed', self._auth(self.sysinfo_restart_needed), methods=['GET']) self._app.add_url_rule('/sysinfo/restart/needed', 'sysinfo_restart_needed', self._auth(self.sysinfo_restart_needed), methods=['GET'])
def sysinfo(self): def sysinfo(self):
@ -29,20 +31,13 @@ class SysinfoController(ObController):
) )
def sysinfo_restart(self): def sysinfo_restart(self):
if platform.system().lower() == 'darwin': secret = self._model_store.config().map().get('secret_key')
if self._model_store.config().map().get('debug'): challenge = request.args.get('secret_key')
python = sys.executable thread = threading.Thread(target=self.restart, args=(secret, challenge))
os.execl(python, python, *sys.argv) thread.daemon = True
else: thread.start()
try:
subprocess.run(["sudo", "systemctl", "restart", 'obscreen'], check=True, timeout=10, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
pass
except subprocess.TimeoutExpired:
pass
except subprocess.CalledProcessError:
pass
return jsonify({'status': 'ok'}) return redirect(url_for('manage'))
def sysinfo_restart_needed(self): def sysinfo_restart_needed(self):
var_last_slide_update = self._model_store.variable().get_one_by_name('last_slide_update') var_last_slide_update = self._model_store.variable().get_one_by_name('last_slide_update')
@ -53,3 +48,24 @@ class SysinfoController(ObController):
return jsonify({'status': True}) return jsonify({'status': True})
def restart(self, secret: str, challenge: str) -> None:
time.sleep(1)
if secret != challenge:
return jsonify({'status': 'error'})
if platform.system().lower() == 'darwin':
if self._model_store.config().map().get('debug'):
python = sys.executable
os.execl(python, python, *sys.argv)
elif am_i_in_docker:
python = sys.executable
os.execl(python, python, *sys.argv)
else:
try:
subprocess.run(["sudo", "systemctl", "restart", 'obscreen-manager'], check=True, timeout=10, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
pass
except subprocess.TimeoutExpired:
pass
except subprocess.CalledProcessError:
pass

View File

@ -25,6 +25,7 @@ class TemplateRenderer:
def get_view_globals(self) -> dict: def get_view_globals(self) -> dict:
globals = dict( globals = dict(
STATIC_PREFIX="/{}/{}/".format(WebDirConstant.FOLDER_STATIC, WebDirConstant.FOLDER_STATIC_WEB_ASSETS), STATIC_PREFIX="/{}/{}/".format(WebDirConstant.FOLDER_STATIC, WebDirConstant.FOLDER_STATIC_WEB_ASSETS),
SECRET_KEY=self._model_store.config().map().get('secret_key'),
FLEET_ENABLED=self._model_store.variable().map().get('fleet_enabled').as_bool(), FLEET_ENABLED=self._model_store.variable().map().get('fleet_enabled').as_bool(),
AUTH_ENABLED=self._model_store.variable().map().get('auth_enabled').as_bool(), AUTH_ENABLED=self._model_store.variable().map().get('auth_enabled').as_bool(),
track_created=self._model_store.user().track_user_created, track_created=self._model_store.user().track_user_created,

View File

@ -113,6 +113,7 @@
{% endblock %} {% endblock %}
</div> </div>
<script> <script>
var secret_key = '{{ SECRET_KEY }}';
var l = { var l = {
'js_slideshow_slide_delete_confirmation': '{{ l.slideshow_slide_delete_confirmation }}', 'js_slideshow_slide_delete_confirmation': '{{ l.slideshow_slide_delete_confirmation }}',
'js_fleet_screen_delete_confirmation': '{{ l.js_fleet_screen_delete_confirmation }}', 'js_fleet_screen_delete_confirmation': '{{ l.js_fleet_screen_delete_confirmation }}',