first commit

This commit is contained in:
Григорий Сафронов 2025-05-17 20:15:58 +03:00
commit 51d77ca288
3 changed files with 444 additions and 0 deletions

297
Cargo.lock generated Normal file
View File

@ -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",
]

7
Cargo.toml Normal file
View File

@ -0,0 +1,7 @@
[package]
name = "rfut"
version = "0.1.0"
edition = "2024"
[dependencies]
chrono = "0.4"

140
src/main.rs Normal file
View File

@ -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<String> = (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);
}
}
}