diff --git a/Cargo.lock b/Cargo.lock index 00d9738..5953204 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,6 +13,7 @@ name = "alex" version = "0.1.0" dependencies = [ "chrono", + "clap", "flate2", "tar", ] @@ -32,6 +33,55 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" + +[[package]] +name = "anstyle-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle", + "windows-sys", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -77,6 +127,54 @@ dependencies = [ "winapi", ] +[[package]] +name = "clap" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ed2379f8603fa2b7509891660e802b88c70a79a6427a70abb5968054de2c28" +dependencies = [ + "clap_builder", + "clap_derive", + "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980" +dependencies = [ + "anstream", + "anstyle", + "bitflags", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59e9ef9a08ee1c0e1f2e162121665ac45ac3783b0f897db7244ae75ad9a8f65b" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "core-foundation-sys" version = "0.8.4" @@ -92,6 +190,27 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "filetime" version = "0.2.21" @@ -114,6 +233,18 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "iana-time-zone" version = "0.1.56" @@ -137,6 +268,29 @@ dependencies = [ "cc", ] +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", +] + +[[package]] +name = "is-terminal" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +dependencies = [ + "hermit-abi", + "io-lifetimes", + "rustix", + "windows-sys", +] + [[package]] name = "js-sys" version = "0.3.63" @@ -152,6 +306,12 @@ version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + [[package]] name = "log" version = "0.4.18" @@ -209,6 +369,26 @@ dependencies = [ "bitflags", ] +[[package]] +name = "rustix" +version = "0.37.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "syn" version = "2.0.18" @@ -248,6 +428,12 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "wasi" version = "0.10.0+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index dabe62b..1db76f8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,8 @@ [package] name = "alex" version = "0.1.0" +description = "Wrapper around Minecraft server processes, designed to complement Docker image installations." +authors = ["Jef Roosens"] edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -12,8 +14,10 @@ tar = "0.4.38" flate2 = "1.0.26" # Used for backup filenames chrono = "0.4.26" +clap = { version = "4.3.1", features = ["derive"] } [profile.release] lto = "fat" codegen-units = 1 panic = "abort" +strip = true diff --git a/src/main.rs b/src/main.rs index 38b2f6b..658dc57 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,17 +1,57 @@ mod server; +use clap::{Parser, Subcommand}; use server::{ServerCommand, ServerType}; use std::io; +use std::path::PathBuf; + +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +struct Cli { + /// Type of server + type_: ServerType, + /// Version string for the server, e.g. 1.19.4-545 + server_version: String, + /// Server jar to execute + jar: PathBuf, + + /// Directory where configs are stored, and where the server will run; defaults to the current + /// directory. + #[arg(long, value_name = "CONFIG_DIR")] + config: Option, + /// Directory where world files will be saved; defaults to ../worlds + #[arg(long, value_name = "WORLD_DIR")] + world: Option, + /// Directory where backups will be stored; defaults to ../backups + #[arg(long, value_name = "BACKUP_DIR")] + backup: Option, + + /// XMS value for the server instance + #[arg(long)] + xms: Option, + /// XMX value for the server instance + #[arg(long)] + xmx: Option, +} fn main() { - let mut server = server::ServerCommand::new(ServerType::Paper, "1.19.4-545") - .jar("paper-1.19.4-545.jar") - .config("data/config") - .world("data/worlds") - .backup("data/backups") - .mem(512, 1024) - .spawn() - .unwrap(); + let cli = Cli::parse(); + + let mut cmd = server::ServerCommand::new(cli.type_, &cli.server_version) + .jar(cli.jar) + .config(cli.config.unwrap_or(".".into())) + .world(cli.world.unwrap_or("../worlds".into())) + .backup(cli.backup.unwrap_or("../backups".into())); + + if let Some(xms) = cli.xms { + cmd = cmd.xms(xms); + } + + if let Some(xmx) = cli.xmx { + cmd = cmd.xmx(xmx); + } + + let mut server = cmd.spawn().expect("Failed to start server."); let stdin = io::stdin(); let input = &mut String::new(); diff --git a/src/server/command.rs b/src/server/command.rs index 456841d..50075de 100644 --- a/src/server/command.rs +++ b/src/server/command.rs @@ -1,10 +1,12 @@ use crate::server::ServerProcess; +use clap::ValueEnum; use std::fmt; use std::fs::File; use std::io::Write; use std::path::{Path, PathBuf}; use std::process::{Child, Command, Stdio}; +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] pub enum ServerType { Paper, Forge, @@ -77,10 +79,13 @@ impl ServerCommand { self } - pub fn mem(mut self, xms: u32, xmx: u32) -> Self { - self.xms = xms; - self.xmx = xmx; + pub fn xms(mut self, v: u32) -> Self { + self.xms = v; + self + } + pub fn xmx(mut self, v: u32) -> Self { + self.xmx = v; self }