From cbbab67507c2d1dddf5eb4d4e213a69159cdc152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B8=D0=B3=D0=BE=D1=80=D0=B8=D0=B9=20=D0=A1?= =?UTF-8?q?=D0=B0=D1=84=D1=80=D0=BE=D0=BD=D0=BE=D0=B2?= Date: Sun, 21 Sep 2025 20:46:04 +0000 Subject: [PATCH] Upload files to "/" --- futriix GOSSIP инструкция.txt | 203 ++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 futriix GOSSIP инструкция.txt diff --git a/futriix GOSSIP инструкция.txt b/futriix GOSSIP инструкция.txt new file mode 100644 index 0000000..f5bb246 --- /dev/null +++ b/futriix GOSSIP инструкция.txt @@ -0,0 +1,203 @@ +1. Пример Lua скрипта для управления кластером (lua-scripts/cluster.lua) + +-- cluster.lua - Пример управления GOSSIP кластером + +-- Функция для добавления узла в кластер +function add_node(address, port) + local result = futriix.gossip_add_node(address, port) + if result then + print("Node " .. address .. ":" .. port .. " added successfully") + else + print("Failed to add node: " .. tostring(result)) + end +end + +-- Функция для удаления узла из кластера +function remove_node(node_id) + local result = futriix.gossip_remove_node(node_id) + if result then + print("Node " .. node_id .. " removed successfully") + else + print("Failed to remove node: " .. tostring(result)) + end +end + +-- Функция для просмотра списка узлов +function list_nodes() + local nodes = futriix.gossip_list_nodes() + if nodes then + print("Cluster nodes (" .. #nodes .. "):") + for i, node in ipairs(nodes) do + local status = "Alive" + if node.status == "Suspect" then + status = "Suspect" + elseif node.status == "Dead" then + status = "Dead" + end + print(string.format(" %d. %s (%s:%d) - %s", i, node.id, node.address, node.port, status)) + end + else + print("Failed to get nodes list") + end +end + +-- Функция для переконфигурации кластера +function reconfigure_cluster(nodes_table) + local result = futriix.gossip_reconfigure(nodes_table) + if result then + print("Cluster reconfigured successfully") + else + print("Failed to reconfigure cluster: " .. tostring(result)) + end +end + +-- Регистрируем глобальные функции +futriix = futriix or {} +futriix.add_node = add_node +futriix.remove_node = remove_node +futriix.list_nodes = list_nodes +futriix.reconfigure_cluster = reconfigure_cluster + +print("GOSSIP cluster management functions loaded:") +print(" futriix.add_node(address, port)") +print(" futriix.remove_node(node_id)") +print(" futriix.list_nodes()") +print(" futriix.reconfigure_cluster(nodes_table)") + + +2. Примеры использования в Lua интерпретаторе + + +-- Загрузка скрипта управления кластером +dofile("lua-scripts/cluster.lua") + +-- Просмотр текущих узлов кластера +futriix.list_nodes() + +-- Добавление новых узлов в кластер +futriix.add_node("192.168.1.100", 7946) +futriix.add_node("192.168.1.101", 7946) +futriix.add_node("192.168.1.102", 7946) + +-- Просмотр обновленного списка узлов +futriix.list_nodes() + +-- Удаление узла из кластера +futriix.remove_node("192.168.1.102:7946") + +-- Переконфигурация всего кластера +local new_nodes = { + {"10.0.0.1", 7946}, + {"10.0.0.2", 7946}, + {"10.0.0.3", 7946} +} +futriix.reconfigure_cluster(new_nodes) + +3. Пример HTTP API для управления кластером + +Добавьте в src/server.rs следующие маршруты: + +async fn start_http_server(&self) -> Result<(), Box> { + use warp::Filter; + + let db = self.db.clone(); + + // Маршрут для добавления узла + let add_node = warp::path!("gossip" / "nodes") + .and(warp::post()) + .and(warp::body::json()) + .and_then(move |node: HashMap| { + let db = db.clone(); + async move { + let address = node.get("address").unwrap_or(&"".to_string()).clone(); + let port: u16 = node.get("port").unwrap_or(&"7946".to_string()).parse().unwrap_or(7946); + + let db_lock = db.lock().await; + match db_lock.gossip_add_node(&address, port) { + Ok(_) => Ok(warp::reply::json(&serde_json::json!({"status": "success"}))), + Err(e) => Ok(warp::reply::json(&serde_json::json!({"status": "error", "message": e}))) + } + } + }); + + // Маршрут для удаления узла + let remove_node = warp::path!("gossip" / "nodes" / String) + .and(warp::delete()) + .and_then(move |node_id: String| { + let db = db.clone(); + async move { + let db_lock = db.lock().await; + match db_lock.gossip_remove_node(&node_id) { + Ok(_) => Ok(warp::reply::json(&serde_json::json!({"status": "success"}))), + Err(e) => Ok(warp::reply::json(&serde_json::json!({"status": "error", "message": e}))) + } + } + }); + + // Маршрут для просмотра узлов + let list_nodes = warp::path!("gossip" / "nodes") + .and(warp::get()) + .and_then(move || { + let db = db.clone(); + async move { + let db_lock = db.lock().await; + match db_lock.gossip_list_nodes() { + Ok(nodes) => Ok(warp::reply::json(&serde_json::json!({"status": "success", "nodes": nodes}))), + Err(e) => Ok(warp::reply::json(&serde_json::json!({"status": "error", "message": e}))) + } + } + }); + + let routes = add_node.or(remove_node).or(list_nodes); + + println!("{} on port {}", Colour::White.paint("HTTP server starting"), self.config.server.port); + warp::serve(routes).run(([127, 0, 0, 1], self.config.server.port)).await; + + Ok(()) +} + +4. Примеры HTTP запросов + +# Добавление узла +curl -X POST http://localhost:8080/gossip/nodes \ + -H "Content-Type: application/json" \ + -d '{"address": "192.168.1.100", "port": 7946}' + +# Просмотр всех узлов +curl http://localhost:8080/gossip/nodes + +# Удаление узла +curl -X DELETE http://localhost:8080/gossip/nodes/192.168.1.100:7946 + +5. Пример автоматической конфигурации кластера (lua-scripts/auto-cluster.lua) + +-- auto-cluster.lua - Автоматическая настройка кластера при запуске + +-- Функция для автоматического обнаружения узлов +function auto_discover_nodes() + print("Starting automatic cluster discovery...") + + -- Предопределенные узлы для подключения + local initial_nodes = { + {"192.168.1.100", 7946}, + {"192.168.1.101", 7946}, + {"192.168.1.102", 7946} + } + + for _, node in ipairs(initial_nodes) do + local address, port = node[1], node[2] + print("Adding node: " .. address .. ":" .. port) + local success = futriix.gossip_add_node(address, port) + if success then + print("✓ Node added successfully") + else + print("✗ Failed to add node: " .. tostring(success)) + end + end + + print("Cluster auto-discovery completed") +end + +-- Запускаем автоматическое обнаружение при загрузке +auto_discover_nodes() +