From 51d77ca288e8438d0080d3de5b293ec79d62b8b1 Mon Sep 17 00:00:00 2001 From: gvsafronov Date: Sat, 17 May 2025 20:15:58 +0300 Subject: [PATCH] first commit --- Cargo.lock | 297 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 7 ++ src/main.rs | 140 +++++++++++++++++++++++++ 3 files changed, 444 insertions(+) create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/main.rs diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..32bcf98 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,297 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "cc" +version = "1.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rfut" +version = "0.1.0" +dependencies = [ + "chrono", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.61.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46ec44dc15085cea82cf9c78f85a9114c463a369786585ad2882d1ff0b0acf40" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-result" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b895b5356fc36103d0f64dd1e94dfa7ac5633f1c9dd6e80fe9ec4adef69e09d" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a7ab927b2637c19b3dbe0965e75d8f2d30bdd697a1516191cad2ec4df8fb28a" +dependencies = [ + "windows-link", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..c950e83 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "rfut" +version = "0.1.0" +edition = "2024" + +[dependencies] +chrono = "0.4" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..ce660d9 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,140 @@ +use std::env; +use std::process::{Command, exit}; +use std::fs; + +const BIN_PATH: &str = "/home/grigoriy/futriix/"; +const CLUSTER_HOST: &str = "127.0.0.1"; +const TIMEOUT: &str = "2000"; +const NODES: usize = 6; +//const REPLICAS: usize = 1; +const PROTECTED_MODE: &str = "yes"; +const CONFIG_PATH: &str = "futriix.conf"; + +fn start_nodes(port: &mut u16) { + let end_port = *port + NODES as u16; + while *port < end_port { + println!("Запуск на порту {}", port); + let status = Command::new(format!("{}/futriix-server", BIN_PATH)) + .arg(CONFIG_PATH) + .arg("--server-threads") + .arg("4") + .arg("--port") + .arg(port.to_string()) + .arg("--protected-mode") + .arg(PROTECTED_MODE) + .arg("--cluster-enabled") + .arg("yes") + .arg("--cluster-config-file") + .arg(format!("nodes-{}.conf", port)) + .arg("--cluster-node-timeout") + .arg(TIMEOUT) + .arg("--dbfilename") + .arg(format!("dump-{}.rdb", port)) + .arg("--logfile") + .arg(format!("{}.log", port)) + .arg("--daemonize") + .arg("yes") + .status() + .expect("Не удалось запустить узел"); + + if !status.success() { + eprintln!("Не удалось запустить узел на порту {}", port); + } + *port += 1; + } +} + +fn create_cluster(port: &mut u16, force: bool) { + let hosts: Vec = (0..NODES).map(|i| format!("{}:{}", CLUSTER_HOST, *port + i as u16)).collect(); + + let command_path = format!("{}/futriix-cli", BIN_PATH); // Создаем переменную для пути + let mut command = Command::new(command_path); // Используем переменную + + command.arg("--cluster") + .arg("create") + .args(&hosts); + + if force { + command.arg("--cluster-yes"); + } + + let status = command.status().expect("Не удалось создать кластер"); + if !status.success() { + eprintln!("Не удалось создать кластер"); + } +} + + +fn stop_nodes(port: &mut u16) { + let end_port = *port + NODES as u16; + while *port < end_port { + println!("Остановка на порту {}", port); + let status = Command::new(format!("{}/futriix-cli", BIN_PATH)) + .arg("-p") + .arg(port.to_string()) + .arg("shutdown") + .arg("nosave") + .status() + .expect("Не удалось остановить узел"); + + if !status.success() { + eprintln!("Не удалось остановить узел на порту {}", port); + } + *port += 1; + } +} + +fn watch_nodes(port: &mut u16) { + let end_port = *port + NODES as u16; + while *port < end_port { + println!("\x1B[2J\x1B[1;1H"); // Очистка экрана + println!("{}", chrono::Local::now()); + let output = Command::new(format!("{}/futriix-cli", BIN_PATH)) + .arg("-p") + .arg(port.to_string()) + .arg("info") + .output() + .expect("Не удалось получить информацию об узле"); + + let stdout = String::from_utf8_lossy(&output.stdout); + println!("{}", stdout); + std::thread::sleep(std::time::Duration::from_secs(5)); + *port += 1; // Увеличиваем порт для следующего узла + } +} + +fn clean() { + println!("Очистка логов и данных..."); + fs::remove_dir_all("appendonlydir-*").ok(); + fs::remove_dir_all("nodes-*.conf").ok(); + for entry in fs::read_dir(".").unwrap() { + let entry = entry.unwrap(); + let path = entry.path(); + if path.is_file() { + if let Some(name) = path.file_name() { + if name.to_string_lossy().ends_with(".log") { + fs::remove_file(&path).ok(); // Добавлена точка с запятой + } + } + } + } +} + +fn main() { + let mut port = 7000; // Начальный порт + let command = env::args().nth(1).unwrap_or_else(|| "start".to_string()); + + match command.as_str() { + "start" => start_nodes(&mut port), + "create-cluster" => create_cluster(&mut port, false), + "force-cluster" => create_cluster(&mut port, true), + "stop" => stop_nodes(&mut port), + "watch" => watch_nodes(&mut port), + "clean" => clean(), + _ => { + eprintln!("Неизвестная команда: {}", command); + exit(1); + } + } +} +