feat: terminate process if config file is invalid
This commit is contained in:
parent
1650e93920
commit
89975894a4
5 changed files with 30 additions and 17 deletions
|
@ -2,6 +2,7 @@
|
|||
use actix::prelude::*;
|
||||
|
||||
use actix::Recipient;
|
||||
use anyhow::{Context, Result};
|
||||
use notify::event::ModifyKind;
|
||||
use notify::Watcher;
|
||||
use tracing::error;
|
||||
|
@ -19,15 +20,13 @@ pub enum Error {
|
|||
#[error("io")]
|
||||
Io(#[from] std::io::Error),
|
||||
}
|
||||
pub async fn watch_file(path: PathBuf, recipient: Recipient<FileUpdated>) {
|
||||
pub async fn watch_file(path: PathBuf, recipient: Recipient<FileUpdated>) -> Result<()> {
|
||||
let (tx, rx) = std::sync::mpsc::channel();
|
||||
|
||||
#[allow(clippy::expect_used)]
|
||||
let mut handler = notify::recommended_watcher(tx).expect("file watcher");
|
||||
#[allow(clippy::expect_used)]
|
||||
let mut handler = notify::recommended_watcher(tx).context("file watcher")?;
|
||||
handler
|
||||
.watch(&path, notify::RecursiveMode::NonRecursive)
|
||||
.expect("watch file");
|
||||
.with_context(|| format!("Watch file: {path:?}"))?;
|
||||
info!("Watching: {:?}", path);
|
||||
async move {
|
||||
loop {
|
||||
|
@ -55,4 +54,5 @@ pub async fn watch_file(path: PathBuf, recipient: Recipient<FileUpdated>) {
|
|||
}
|
||||
}
|
||||
.await;
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -12,13 +12,13 @@ impl Handler<FileUpdated> for ServerActor {
|
|||
type Result = ();
|
||||
|
||||
fn handle(&mut self, _msg: FileUpdated, ctx: &mut Self::Context) -> Self::Result {
|
||||
let server_config = match ServerConfig::load(&self.fs) {
|
||||
Ok(server_config) => server_config,
|
||||
match ServerConfig::load(&self.fs) {
|
||||
Ok(server_config) => {
|
||||
self.do_send(ReceiveServerConfig::new(server_config), ctx);
|
||||
}
|
||||
Err(err) => {
|
||||
tracing::error!("Failed to load config file. Error: {}", err);
|
||||
return;
|
||||
self.abort(ctx, format!("Failed to load config file. Error: {}", err));
|
||||
}
|
||||
};
|
||||
self.do_send(ReceiveServerConfig::new(server_config), ctx);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,18 +12,15 @@ impl Handler<ReceiveServerConfig> for ServerActor {
|
|||
fn handle(&mut self, msg: ReceiveServerConfig, ctx: &mut Self::Context) -> Self::Result {
|
||||
tracing::info!("recieved server config");
|
||||
let Ok(socket_addr) = msg.http() else {
|
||||
tracing::error!("Unable to parse http.addr");
|
||||
return;
|
||||
self.abort(ctx, "Unable to parse http.addr");
|
||||
};
|
||||
|
||||
let Some(server_storage) = self.server_storage(&msg) else {
|
||||
tracing::error!("Server storage not available");
|
||||
return;
|
||||
self.abort(ctx, "Server storage not available");
|
||||
};
|
||||
|
||||
if msg.inbound_webhook().base_url().ends_with('/') {
|
||||
tracing::error!("webhook.url must not end with a '/'");
|
||||
return;
|
||||
self.abort(ctx, "webhook.url must not end with a '/'");
|
||||
}
|
||||
|
||||
self.do_send(
|
||||
|
|
|
@ -229,6 +229,19 @@ impl ServerActor {
|
|||
Some(server_storage)
|
||||
}
|
||||
|
||||
/// Attempts to gracefully shutdown the server before terminating the process.
|
||||
fn abort(
|
||||
&mut self,
|
||||
ctx: &mut <Self as actix::Actor>::Context,
|
||||
message: impl Into<String>,
|
||||
) -> ! {
|
||||
tracing::error!("Aborting: {}", message.into());
|
||||
self.do_send(crate::server::actor::messages::Shutdown, ctx);
|
||||
std::thread::sleep(std::time::Duration::from_millis(200));
|
||||
System::current().stop();
|
||||
std::process::exit(-1);
|
||||
}
|
||||
|
||||
fn do_send<M>(&mut self, msg: M, _ctx: &mut <Self as actix::Actor>::Context)
|
||||
where
|
||||
M: actix::Message + Send + 'static + std::fmt::Debug,
|
||||
|
|
|
@ -46,7 +46,10 @@ pub fn start(
|
|||
server.do_send(FileUpdated);
|
||||
|
||||
info!("Starting File Watcher...");
|
||||
watch_file("git-next-server.toml".into(), server.clone().recipient()).await;
|
||||
#[allow(clippy::expect_used)]
|
||||
watch_file("git-next-server.toml".into(), server.clone().recipient())
|
||||
.await
|
||||
.expect("file watcher");
|
||||
|
||||
info!("Server running - Press Ctrl-C to stop...");
|
||||
let _ = actix_rt::signal::ctrl_c().await;
|
||||
|
|
Loading…
Reference in a new issue