From 64b2f04f8f1d3f826a5fe2c456dab41f5a13b3dc Mon Sep 17 00:00:00 2001 From: tomoron Date: Wed, 17 Jun 2026 18:23:24 +0200 Subject: [PATCH] add 'disabled' state, fix handshake proxy send --- Cargo.lock | 2 +- Cargo.toml | 2 +- flake.nix | 2 +- src/cli/archive.rs | 2 +- src/cli/disable.rs | 32 ++++++++++++++++++++++++++++++++ src/cli/mod.rs | 1 + src/cli/remove.rs | 3 ++- src/cli/stop.rs | 2 +- src/main.rs | 4 +++- src/minecraft/client/packet.rs | 3 ++- src/minecraft/manager_loop.rs | 2 +- src/srvmgr/start.rs | 5 ++++- src/srvmgr/stop.rs | 6 +++++- src/status.rs | 2 ++ test.sh | 9 --------- 15 files changed, 57 insertions(+), 20 deletions(-) create mode 100644 src/cli/disable.rs delete mode 100644 test.sh diff --git a/Cargo.lock b/Cargo.lock index 6de8bd3..83b8702 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -640,7 +640,7 @@ dependencies = [ [[package]] name = "dockermcmgr" -version = "0.0.8" +version = "0.0.9" dependencies = [ "async-process", "async-std", diff --git a/Cargo.toml b/Cargo.toml index 83bb879..ff904d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dockermcmgr" -version = "0.0.8" +version = "0.0.9" edition = "2024" [[bin]] diff --git a/flake.nix b/flake.nix index 293b581..8527a30 100644 --- a/flake.nix +++ b/flake.nix @@ -38,7 +38,7 @@ final: { pname = "dmm"; - version = "0.0.8"; + version = "0.0.9"; inherit src; cargoLock.lockFile = src + "/Cargo.lock"; diff --git a/src/cli/archive.rs b/src/cli/archive.rs index 995d054..f639590 100644 --- a/src/cli/archive.rs +++ b/src/cli/archive.rs @@ -36,7 +36,7 @@ pub async fn subcommand(arguments: &ArgMatches, pool: &DbPool, docker: &Docker) if server.status == ServerStatus::Running { println!("Stopping container"); - srvmgr::stop_server(&docker, pool, server_name).await?; + srvmgr::stop_server(&docker, pool, server_name, false).await?; println!("container stopped"); } diff --git a/src/cli/disable.rs b/src/cli/disable.rs new file mode 100644 index 0000000..c4bb59f --- /dev/null +++ b/src/cli/disable.rs @@ -0,0 +1,32 @@ +use bollard::Docker; +use clap::Arg; +use clap::{Command, ArgMatches}; + +use crate::DbPool; + +use crate::srvmgr; +use crate::status::ServerStatus; + +use diesel::prelude::*; + +use crate::schema; + +pub fn create_subcommand() -> Command { + Command::new("disable") + .about("disable") + .arg(Arg::new("NAME").required(true)) +} + +pub async fn subcommand(arguments: &ArgMatches, pool: &DbPool, docker: &Docker) -> Result<(), String> { + use schema::servers::dsl::*; + let server_name = arguments.get_one::("NAME").unwrap(); + println!("Stopping container"); + srvmgr::stop_server(&docker, pool, server_name, true).await?; + println!("container stopped"); + + let conn = &mut pool.get().unwrap(); + + diesel::update(servers).filter(name.eq(server_name)).set(status.eq(ServerStatus::Disabled)).execute(conn).map_err(|e| format!("Failed to disable the server : {}", e))?; + + Ok(()) +} diff --git a/src/cli/mod.rs b/src/cli/mod.rs index b764368..347cd03 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -6,6 +6,7 @@ pub mod start; pub mod stop; pub mod set_state; pub mod archive; +pub mod disable; pub mod env_settings; diff --git a/src/cli/remove.rs b/src/cli/remove.rs index 5a03517..c3266cf 100644 --- a/src/cli/remove.rs +++ b/src/cli/remove.rs @@ -21,7 +21,8 @@ pub async fn subcommand(arguments: &ArgMatches, pool: &DbPool, docker: &Docker) let conn = &mut pool.get().unwrap(); - let _ = srvmgr::stop_server(docker, pool, server_name).await; + println!("stopping container if it exists"); + srvmgr::stop_server(docker, pool, server_name, true).await?; let deleted = diesel::delete(servers.filter(name.eq(server_name))).execute(conn).map_err(|_| "failed to delete from db".to_string())?; if deleted != 1 { diff --git a/src/cli/stop.rs b/src/cli/stop.rs index 7dfbfbd..b7612ac 100644 --- a/src/cli/stop.rs +++ b/src/cli/stop.rs @@ -15,7 +15,7 @@ pub fn create_subcommand() -> Command { pub async fn subcommand(arguments: &ArgMatches, pool: &DbPool, docker: &Docker) -> Result<(), String> { let server_name = arguments.get_one::("NAME").unwrap(); println!("Stopping container"); - srvmgr::stop_server(&docker, pool, server_name).await?; + srvmgr::stop_server(&docker, pool, server_name, false).await?; println!("container stopped"); Ok(()) diff --git a/src/main.rs b/src/main.rs index 467bb8b..94710fd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,7 +6,7 @@ /* By: tomoron +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/05/29 21:22:17 by tomoron #+# #+# */ -/* Updated: 2026/06/14 16:21:23 by tomoron ### ########.fr */ +/* Updated: 2026/06/17 17:21:44 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -67,6 +67,7 @@ fn cli() -> Command { .subcommand(start::create_subcommand()) .subcommand(stop::create_subcommand()) .subcommand(archive::create_subcommand()) + .subcommand(disable::create_subcommand()) } #[tokio::main(flavor = "multi_thread")] @@ -89,6 +90,7 @@ async fn main() -> Result<(), String> { Some(("start", sub_matches)) => { start::subcommand(sub_matches, &pool, &docker).await?; }, Some(("stop", sub_matches)) => { stop::subcommand(sub_matches, &pool, &docker).await?; }, Some(("archive", sub_matches)) => { archive::subcommand(sub_matches, &pool, &docker).await? }, + Some(("disable", sub_matches)) => { disable::subcommand(sub_matches, &pool, &docker).await? }, _ => {panic!("subcommand not implemented")} } Ok(()) diff --git a/src/minecraft/client/packet.rs b/src/minecraft/client/packet.rs index c6e14c5..a9074d9 100644 --- a/src/minecraft/client/packet.rs +++ b/src/minecraft/client/packet.rs @@ -86,7 +86,8 @@ impl Client { let handshake_packet = new_handshake.to_packet(); let mut packet = Vec::new(); - packet.extend(varint_write(handshake_packet.len() as i32)); + packet.extend(varint_write((handshake_packet.len() + 1) as i32)); + packet.push(0x00); packet.extend(handshake_packet); self.out_stream = Some(stream); diff --git a/src/minecraft/manager_loop.rs b/src/minecraft/manager_loop.rs index 0e70139..a642773 100644 --- a/src/minecraft/manager_loop.rs +++ b/src/minecraft/manager_loop.rs @@ -58,7 +58,7 @@ async fn should_stop(docker: &Docker, pool: &DbPool, diff: &TimeDelta, srv: &Ser if diff.num_days() >= 7 { println!("last login time exceeded, stopping {}", srv.name); - let _ = srvmgr::stop_server(docker, pool, &srv.name).await; + let _ = srvmgr::stop_server(docker, pool, &srv.name, false).await; println!("{} stopped", srv.name); } } diff --git a/src/srvmgr/start.rs b/src/srvmgr/start.rs index 4ce518f..f6847b1 100644 --- a/src/srvmgr/start.rs +++ b/src/srvmgr/start.rs @@ -75,11 +75,14 @@ pub async fn start_server(docker: &Docker, pool: &DbPool, server_name: &String) return Err("Server is starting, please wait".to_string()); } + if server.status == ServerStatus::Disabled { + return Err("This server is disabled".to_string()); + } + if server.status != ServerStatus::Stopped && server.status != ServerStatus::Archived { return Err(format!("Invalid server state ({}), refusing to start", server.status)); } - diesel::update(servers).filter(name.eq(server_name)).set(status.eq(ServerStatus::Starting)).execute(conn).map_err(|e| format!("Failed to set server to starting : {}", e))?; if server.status == ServerStatus::Archived { diff --git a/src/srvmgr/stop.rs b/src/srvmgr/stop.rs index ecfe970..e405327 100644 --- a/src/srvmgr/stop.rs +++ b/src/srvmgr/stop.rs @@ -17,7 +17,7 @@ async fn stop_container(docker: &Docker, name: &String) -> Result<(), String> { Ok(()) } -pub async fn stop_server(docker: &Docker, pool: &DbPool, server_name: &String) -> Result<(), String> { +pub async fn stop_server(docker: &Docker, pool: &DbPool, server_name: &String, ignore_stopped: bool) -> Result<(), String> { use schema::servers::dsl::*; let conn = &mut pool.get().unwrap(); @@ -28,6 +28,10 @@ pub async fn stop_server(docker: &Docker, pool: &DbPool, server_name: &String) - Ok(server) => { server } }; + if ignore_stopped && (server.status == ServerStatus::Stopped || server.status == ServerStatus::Archived) { + return Ok(()); + } + if server.status != ServerStatus::Running { return Err(format!("Invalid server state ({}), refusing to stop the server", server.status)); } diff --git a/src/status.rs b/src/status.rs index 2d0f8e2..ba1b0af 100644 --- a/src/status.rs +++ b/src/status.rs @@ -17,6 +17,7 @@ pub enum ServerStatus { Starting = 3, Running = 4, Archiving = 5, + Disabled = 6, Unknown, } @@ -42,6 +43,7 @@ impl ToSql for ServerStatus { impl fmt::Display for ServerStatus { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let str_status = match self { + ServerStatus::Disabled => "disabled", ServerStatus::Archived => "archived", ServerStatus::Archiving => "archiving", ServerStatus::Stopped => "stopped", diff --git a/test.sh b/test.sh deleted file mode 100644 index 2c39b8a..0000000 --- a/test.sh +++ /dev/null @@ -1,9 +0,0 @@ -docker run -v "$(pwd)/servers/potato:/data" \ - -e EULA=TRUE \ - -u 1000:100 \ - --rm \ - -e TYPE=VANILLA\ - -e VERSION="1.21.6" \ - -e DIFFICULTY="2" \ - -p 8080:8080 \ - -it itzg/minecraft-server:latest