mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-02 01:05:20 +03:00
Improve restart from UI
This commit is contained in:
parent
50f0c05e69
commit
870b2f4919
@ -90,7 +90,7 @@ def create_mqtt_client(config: FrigateConfig, camera_metrics):
|
|||||||
client.publish(state_topic, payload, retain=True)
|
client.publish(state_topic, payload, retain=True)
|
||||||
|
|
||||||
def on_restart_command(client, userdata, message):
|
def on_restart_command(client, userdata, message):
|
||||||
restart_frigate()
|
restart_frigate(client, mqtt_config.topic_prefix)
|
||||||
|
|
||||||
def on_connect(client, userdata, flags, rc):
|
def on_connect(client, userdata, flags, rc):
|
||||||
threading.current_thread().name = "mqtt"
|
threading.current_thread().name = "mqtt"
|
||||||
|
|||||||
@ -519,9 +519,16 @@ def clipped(obj, frame_shape):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def restart_frigate():
|
def restart_frigate(mqtt_client, topic_prefix, from_ui = 1):
|
||||||
|
|
||||||
|
def on_publish(client,userdata,result):
|
||||||
|
time.sleep(0.67)
|
||||||
|
logger.info("Restart requested.")
|
||||||
os.kill(os.getpid(), signal.SIGTERM)
|
os.kill(os.getpid(), signal.SIGTERM)
|
||||||
|
|
||||||
|
mqtt_client.on_publish = on_publish
|
||||||
|
mqtt_client.publish(f"{topic_prefix}/restarted", int(from_ui))
|
||||||
|
|
||||||
|
|
||||||
class EventsPerSecond:
|
class EventsPerSecond:
|
||||||
def __init__(self, max_events=1000):
|
def __init__(self, max_events=1000):
|
||||||
|
|||||||
@ -6,17 +6,14 @@ import AutoAwesomeIcon from './icons/AutoAwesome';
|
|||||||
import LightModeIcon from './icons/LightMode';
|
import LightModeIcon from './icons/LightMode';
|
||||||
import DarkModeIcon from './icons/DarkMode';
|
import DarkModeIcon from './icons/DarkMode';
|
||||||
import FrigateRestartIcon from './icons/FrigateRestart';
|
import FrigateRestartIcon from './icons/FrigateRestart';
|
||||||
import Dialog from './components/Dialog';
|
import DialogRestart from './components/DialogRestart';
|
||||||
import { useDarkMode } from './context';
|
import { useDarkMode } from './context';
|
||||||
import { useCallback, useRef, useState } from 'preact/hooks';
|
import { useCallback, useRef, useState } from 'preact/hooks';
|
||||||
import { useRestart } from './api/mqtt';
|
|
||||||
|
|
||||||
export default function AppBar() {
|
export default function AppBar() {
|
||||||
const [showMoreMenu, setShowMoreMenu] = useState(false);
|
const [showMoreMenu, setShowMoreMenu] = useState(false);
|
||||||
const [showDialog, setShowDialog] = useState(false);
|
const [showDialogRestart, setShowDialogRestart] = useState(false);
|
||||||
const [showDialogWait, setShowDialogWait] = useState(false);
|
|
||||||
const { setDarkMode } = useDarkMode();
|
const { setDarkMode } = useDarkMode();
|
||||||
const { send: sendRestart } = useRestart();
|
|
||||||
|
|
||||||
const handleSelectDarkMode = useCallback(
|
const handleSelectDarkMode = useCallback(
|
||||||
(value, label) => {
|
(value, label) => {
|
||||||
@ -36,16 +33,6 @@ export default function AppBar() {
|
|||||||
setShowMoreMenu(false);
|
setShowMoreMenu(false);
|
||||||
}, [setShowMoreMenu]);
|
}, [setShowMoreMenu]);
|
||||||
|
|
||||||
const handleClickRestartDialog = useCallback(() => {
|
|
||||||
setShowDialog(false);
|
|
||||||
setShowDialogWait(true);
|
|
||||||
sendRestart();
|
|
||||||
}, [setShowDialog]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
||||||
|
|
||||||
const handleDismissRestartDialog = useCallback(() => {
|
|
||||||
setShowDialog(false);
|
|
||||||
}, [setShowDialog]);
|
|
||||||
|
|
||||||
const handleRestart = useCallback(() => {
|
const handleRestart = useCallback(() => {
|
||||||
setShowMoreMenu(false);
|
setShowMoreMenu(false);
|
||||||
setShowDialog(true);
|
setShowDialog(true);
|
||||||
@ -64,23 +51,7 @@ export default function AppBar() {
|
|||||||
<MenuItem icon={FrigateRestartIcon} label="Restart Frigate" onSelect={handleRestart} />
|
<MenuItem icon={FrigateRestartIcon} label="Restart Frigate" onSelect={handleRestart} />
|
||||||
</Menu>
|
</Menu>
|
||||||
) : null},
|
) : null},
|
||||||
{showDialog ? (
|
<DialogRestart show={showDialogRestart} setShow={setShowDialogRestart} />
|
||||||
<Dialog
|
|
||||||
onDismiss={handleDismissRestartDialog}
|
|
||||||
title="Restart Frigate"
|
|
||||||
text="Are you sure?"
|
|
||||||
actions={[
|
|
||||||
{ text: 'Yes', color: 'red', onClick: handleClickRestartDialog },
|
|
||||||
{ text: 'Cancel', onClick: handleDismissRestartDialog },
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
) : null},
|
|
||||||
{showDialogWait ? (
|
|
||||||
<Dialog
|
|
||||||
title="Restart in progress"
|
|
||||||
text="Please wait a few seconds for the restart to complete before reloading the page."
|
|
||||||
/>
|
|
||||||
) : null}
|
|
||||||
</Fragment>
|
</Fragment>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -124,6 +124,6 @@ export function useRestart() {
|
|||||||
value: { payload },
|
value: { payload },
|
||||||
send,
|
send,
|
||||||
connected,
|
connected,
|
||||||
} = useMqtt('restart', 'restart');
|
} = useMqtt('restarted', 'restart');
|
||||||
return { payload, send, connected };
|
return { payload, send, connected };
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,7 +28,7 @@ export default function Dialog({ actions = [], portalRootID = 'dialogs', title,
|
|||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<div className="p-4">
|
<div className="p-4">
|
||||||
<Heading size="lg">{title}</Heading>
|
<Heading size="lg" className="mb-4">{title}</Heading>
|
||||||
<p>{text}</p>
|
<p>{text}</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="p-2 flex justify-start flex-row-reverse space-x-2">
|
<div className="p-2 flex justify-start flex-row-reverse space-x-2">
|
||||||
|
|||||||
59
web/src/components/DialogRestart.jsx
Normal file
59
web/src/components/DialogRestart.jsx
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import { h, Fragment } from 'preact';
|
||||||
|
import Dialog from './Dialog';
|
||||||
|
import { useCallback, useEffect, useState } from 'preact/hooks';
|
||||||
|
import { useRestart } from '../api/mqtt';
|
||||||
|
|
||||||
|
export default function DialogRestart({ show, setShow }) {
|
||||||
|
const { payload: detectRestarted = null, send: sendRestart } = useRestart();
|
||||||
|
const [dialogTitle, setDialogTitle] = useState('Restart in progress');
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (detectRestarted != null && Number.isInteger(detectRestarted)) {
|
||||||
|
if (!detectRestarted)
|
||||||
|
setDialogTitle('Server-initiated startup');
|
||||||
|
setShow(false);
|
||||||
|
}
|
||||||
|
}, [detectRestarted]); // eslint-disable-line react-hooks/exhaustive-deps
|
||||||
|
|
||||||
|
const waitPlease = async () => {
|
||||||
|
const delay = ms => new Promise(res => setTimeout(res, ms));
|
||||||
|
await delay(3456);
|
||||||
|
/* eslint-disable no-constant-condition */
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
const response = await fetch('/api/config', { method: 'GET' });
|
||||||
|
if (await response.status === 200)
|
||||||
|
window.location.reload();
|
||||||
|
}
|
||||||
|
catch (e) {}
|
||||||
|
await delay(987);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleClick = useCallback(() => {
|
||||||
|
sendRestart();
|
||||||
|
setShow(false);
|
||||||
|
waitPlease();
|
||||||
|
}, [show]); // eslint-disable-line react-hooks/exhaustive-deps
|
||||||
|
|
||||||
|
const handleDismiss = useCallback(() => {
|
||||||
|
setShow(false);
|
||||||
|
}, [show]); // eslint-disable-line react-hooks/exhaustive-deps
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Fragment>
|
||||||
|
{show ? (
|
||||||
|
<Dialog
|
||||||
|
onDismiss={handleDismiss}
|
||||||
|
title="Restart Frigate"
|
||||||
|
text="Are you sure?"
|
||||||
|
actions={[
|
||||||
|
{ text: 'Yes', color: 'red', onClick: handleClick },
|
||||||
|
{ text: 'Cancel', onClick: handleDismiss } ]}
|
||||||
|
/>
|
||||||
|
) : detectRestarted != null && (
|
||||||
|
<Dialog title={dialogTitle} text="This page should refresh as soon as the server is up and running…" />
|
||||||
|
)}
|
||||||
|
</Fragment>
|
||||||
|
);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user