add setState command, detect crashed/stopped servers periodically
This commit is contained in:
@ -4,6 +4,7 @@ pub mod remove;
|
|||||||
pub mod ls;
|
pub mod ls;
|
||||||
pub mod start;
|
pub mod start;
|
||||||
pub mod stop;
|
pub mod stop;
|
||||||
|
pub mod set_state;
|
||||||
|
|
||||||
pub mod env_settings;
|
pub mod env_settings;
|
||||||
|
|
||||||
|
|||||||
33
src/cli/set_state.rs
Normal file
33
src/cli/set_state.rs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
use clap::Arg;
|
||||||
|
use clap::ArgMatches;
|
||||||
|
use clap::Command;
|
||||||
|
|
||||||
|
use diesel::prelude::*;
|
||||||
|
use crate::DbPool;
|
||||||
|
use crate::schema;
|
||||||
|
use crate::status::ServerStatus;
|
||||||
|
|
||||||
|
pub fn create_subcommand() -> Command {
|
||||||
|
Command::new("setState")
|
||||||
|
.about("force the known state of a server (will not change the actual state)")
|
||||||
|
.arg(Arg::new("NAME").required(true))
|
||||||
|
.arg(Arg::new("STATE").required(true))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn subcommand(arguments: &ArgMatches, pool: DbPool) -> Result<(), String> {
|
||||||
|
use schema::servers::dsl::*;
|
||||||
|
|
||||||
|
|
||||||
|
let server_name = arguments.get_one::<String>("NAME").unwrap();
|
||||||
|
let wanted_state = match arguments.get_one::<String>("STATE").unwrap().as_str() {
|
||||||
|
"stopped" => {ServerStatus::Stopped},
|
||||||
|
"running" => {ServerStatus::Running},
|
||||||
|
_ => { return Err("invalid state, must be `stoppped` or `running`".to_string()) }
|
||||||
|
};
|
||||||
|
|
||||||
|
let conn = &mut pool.get().unwrap();
|
||||||
|
|
||||||
|
diesel::update(servers).filter(name.eq(server_name)).set(status.eq(wanted_state)).execute(conn).map_err(|e| format!("Failed to set the server to the wanted state : {}", e))?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2026/05/29 21:22:17 by tomoron #+# #+# */
|
/* Created: 2026/05/29 21:22:17 by tomoron #+# #+# */
|
||||||
/* Updated: 2026/06/10 13:16:50 by tomoron ### ########.fr */
|
/* Updated: 2026/06/11 23:41:49 by tomoron ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -60,6 +60,7 @@ fn cli() -> Command {
|
|||||||
.subcommand(remove::create_subcommand())
|
.subcommand(remove::create_subcommand())
|
||||||
.subcommand(edit::create_subcommand())
|
.subcommand(edit::create_subcommand())
|
||||||
.subcommand(ls::create_subcommand())
|
.subcommand(ls::create_subcommand())
|
||||||
|
.subcommand(set_state::create_subcommand())
|
||||||
.subcommand(start::create_subcommand())
|
.subcommand(start::create_subcommand())
|
||||||
.subcommand(stop::create_subcommand())
|
.subcommand(stop::create_subcommand())
|
||||||
}
|
}
|
||||||
@ -79,6 +80,7 @@ async fn main() -> Result<(), String> {
|
|||||||
Some(("remove", sub_matches)) => { remove::subcommand(sub_matches, &pool, &docker).await?; },
|
Some(("remove", sub_matches)) => { remove::subcommand(sub_matches, &pool, &docker).await?; },
|
||||||
Some(("ls", sub_matches)) => { ls::subcommand(sub_matches, pool).await?; },
|
Some(("ls", sub_matches)) => { ls::subcommand(sub_matches, pool).await?; },
|
||||||
Some(("edit", sub_matches)) => { edit::subcommand(sub_matches, pool).await?; },
|
Some(("edit", sub_matches)) => { edit::subcommand(sub_matches, pool).await?; },
|
||||||
|
Some(("setState", sub_matches)) => { set_state::subcommand(sub_matches, pool).await? }
|
||||||
|
|
||||||
Some(("start", sub_matches)) => { start::subcommand(sub_matches, &pool, &docker).await?; },
|
Some(("start", sub_matches)) => { start::subcommand(sub_matches, &pool, &docker).await?; },
|
||||||
Some(("stop", sub_matches)) => { stop::subcommand(sub_matches, &pool, &docker).await?; },
|
Some(("stop", sub_matches)) => { stop::subcommand(sub_matches, &pool, &docker).await?; },
|
||||||
|
|||||||
@ -63,8 +63,9 @@ pub async fn server_manager_loop(pool: DbPool, docker: Docker)
|
|||||||
for srv in a_servers {
|
for srv in a_servers {
|
||||||
let time_diff = Utc::now().naive_utc() - srv.last_login.unwrap();
|
let time_diff = Utc::now().naive_utc() - srv.last_login.unwrap();
|
||||||
should_stop(&docker, &pool, &time_diff, &srv).await;
|
should_stop(&docker, &pool, &time_diff, &srv).await;
|
||||||
|
check_still_online(&docker, &pool, &srv).await;
|
||||||
}
|
}
|
||||||
task::sleep(Duration::from_secs(5)).await;
|
task::sleep(Duration::from_secs(30)).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,3 +78,18 @@ async fn should_stop(docker: &Docker, pool: &DbPool, diff: &TimeDelta, srv: &Ser
|
|||||||
println!("{} stopped", srv.name);
|
println!("{} stopped", srv.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn check_still_online(docker: &Docker, pool: &DbPool, srv: &Servers) {
|
||||||
|
use schema::servers::dsl::*;
|
||||||
|
|
||||||
|
if srv.status != ServerStatus::Running { return ; }
|
||||||
|
|
||||||
|
match docker.inspect_container(&format!("minecraft-{}", srv.name), None).await {
|
||||||
|
Ok(_) => {},
|
||||||
|
Err(_) => {
|
||||||
|
println!("Failed to find minecraft-{} container, setting it as Stopped", srv.name);
|
||||||
|
let conn = &mut pool.get().unwrap();
|
||||||
|
let _ = diesel::update(servers).filter(name.eq(&srv.name)).set(status.eq(ServerStatus::Stopped)).execute(conn);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user