Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@ jobs:
port: ${{ secrets.SSH_PROD_PORT }}
command_timeout: 60m
script: |
curl -X PUT http://localhost:8000/monitor/build-hyperdrive
~/hosting_backend/smd/backend/production/smd_scripts/call-build-hyperdrive.sh
2 changes: 1 addition & 1 deletion .github/workflows/release_candidate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@ jobs:
port: ${{ secrets.SSH_PORT }}
command_timeout: 60m
script: |
curl -X PUT http://localhost:8000/monitor/build-hyperdrive
~/hosting_backend/smd/backend/staging/smd_scripts/call-build-hyperdrive.sh
6 changes: 3 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,11 @@ members = [
"hyperdrive/packages/hypermap-cacher/hypermap-cacher", "hyperdrive/packages/hypermap-cacher/reset-cache", "hyperdrive/packages/hypermap-cacher/set-nodes",
"hyperdrive/packages/hypermap-cacher/start-providing", "hyperdrive/packages/hypermap-cacher/stop-providing",
"hyperdrive/packages/sign/sign",
"hyperdrive/packages/terminal/terminal",
"hyperdrive/packages/terminal/alias", "hyperdrive/packages/terminal/cat", "hyperdrive/packages/terminal/echo",
"hyperdrive/packages/terminal/terminal", "hyperdrive/packages/terminal/add-node-provider", "hyperdrive/packages/terminal/add-rpcurl-provider",
"hyperdrive/packages/terminal/alias", "hyperdrive/packages/terminal/cat", "hyperdrive/packages/terminal/echo", "hyperdrive/packages/terminal/get-providers",
"hyperdrive/packages/terminal/help", "hyperdrive/packages/terminal/hfetch", "hyperdrive/packages/terminal/hi",
"hyperdrive/packages/terminal/kill", "hyperdrive/packages/terminal/m", "hyperdrive/packages/terminal/top",
"hyperdrive/packages/terminal/net-diagnostics", "hyperdrive/packages/terminal/peer", "hyperdrive/packages/terminal/peers",
"hyperdrive/packages/terminal/net-diagnostics", "hyperdrive/packages/terminal/peer", "hyperdrive/packages/terminal/peers", "hyperdrive/packages/terminal/remove-provider",
"hyperdrive/packages/tester/tester",
"scripts/build-packages",
]
Expand Down
48 changes: 46 additions & 2 deletions hyperdrive/packages/terminal/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions hyperdrive/packages/terminal/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
[workspace]
resolver = "2"
members = [
"add-node-provider",
"add-rpcurl-provider",
"alias",
"cat",
"echo",
"get-providers",
"help",
"hfetch",
"hi",
Expand All @@ -12,6 +15,7 @@ members = [
"net-diagnostics",
"peer",
"peers",
"remove-provider",
"terminal",
"top",
]
Expand Down
20 changes: 20 additions & 0 deletions hyperdrive/packages/terminal/add-node-provider/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[package]
name = "add-node-provider"
version = "0.1.0"
edition = "2021"

[features]
simulation-mode = []

[dependencies]
hyperware_process_lib = "2.0.0"
rmp-serde = "1.1.2"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.140"
wit-bindgen = "0.42.1"

[lib]
crate-type = ["cdylib"]

[package.metadata.component]
package = "hyperware:process"
115 changes: 115 additions & 0 deletions hyperdrive/packages/terminal/add-node-provider/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
// add-node-provider/lib.rs
use hyperware_process_lib::{script, Address, Message, Request};
use serde_json::{json, Value};
use std::collections::HashMap;

wit_bindgen::generate!({
path: "../target/wit",
world: "process-v1",
});

script!(init);
fn init(_our: Address, args: String) -> String {
// Parse arguments: <chain-id> <node-name> <public-key> <ip-address> <ws-port> [--trusted <true|false>]
let parts: Vec<&str> = args.trim().split_whitespace().collect();

if parts.len() < 5 {
return "Usage: add-node-provider <chain-id> <node-name> <public-key> <ip-address> <ws-port> [--trusted <true|false>]\n Examples:\n add-node-provider 8453 other-node.hypr abc123pubkey 192.168.1.1 9000 (defaults to trusted=false)\n add-node-provider 1 other-node.hypr abc123pubkey 192.168.1.1 9000 --trusted true".to_string();
}

let chain_id = match parts[0].parse::<u64>() {
Ok(id) => id,
Err(_) => return format!("Invalid chain ID: {}. Must be a number.", parts[0]),
};

let node_name = parts[1];
let public_key = parts[2];
let ip_address = parts[3];
let ws_port = match parts[4].parse::<u16>() {
Ok(port) => port,
Err(_) => return format!("Invalid WebSocket port: {}. Must be a number.", parts[4]),
};

// Parse trusted flag (default to false for node providers)
let trusted = parse_flag_bool(&parts[5..], "--trusted", false);

// Create ports map with WebSocket port
let mut ports = HashMap::new();
ports.insert("ws".to_string(), ws_port);

// Create the HNS update object
let hns_update = json!({
"name": node_name,
"public_key": public_key,
"ips": [ip_address],
"ports": ports,
"routers": []
});

// Create the provider configuration
let provider_config = json!({
"chain_id": chain_id,
"provider": {
"Node": {
"hns_update": hns_update,
"use_as_provider": true
}
},
"trusted": trusted
});

// Create AddProvider request
let request_body = json!({
"AddProvider": provider_config
});

let Ok(Ok(Message::Response { body, .. })) = Request::to(("our", "eth", "distro", "sys"))
.body(serde_json::to_vec(&request_body).unwrap())
.send_and_await_response(60)
else {
return "Failed to communicate with eth module".to_string();
};

// Parse the response
if let Ok(json_value) = serde_json::from_slice::<Value>(&body) {
if let Some(response) = json_value.as_str() {
match response {
"Ok" => {
format!(
"Successfully added node provider: {} ({}:{}) on chain {} with trusted={}",
node_name, ip_address, ws_port, chain_id, trusted
)
}
"PermissionDenied" => "Permission denied: insufficient privileges".to_string(),
other => format!("Error: {}", other),
}
} else {
// Handle any other response types with better formatting
format!(
"Unexpected response: {}",
serde_json::to_string_pretty(&json_value)
.unwrap_or_else(|_| "Failed to format response".to_string())
)
}
} else {
format!(
"Failed to parse response as JSON\nRaw response: {}",
String::from_utf8_lossy(&body)
)
}
}
fn parse_flag_bool(args: &[&str], flag: &str, default: bool) -> bool {
let mut i = 0;
while i < args.len() {
if args[i] == flag {
if i + 1 < args.len() {
if let Ok(value) = args[i + 1].parse::<bool>() {
return value;
}
}
break;
}
i += 1;
}
default
}
20 changes: 20 additions & 0 deletions hyperdrive/packages/terminal/add-rpcurl-provider/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[package]
name = "add-rpcurl-provider"
version = "0.1.0"
edition = "2021"

[features]
simulation-mode = []

[dependencies]
hyperware_process_lib = "2.0.0"
rmp-serde = "1.1.2"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.140"
wit-bindgen = "0.42.1"

[lib]
crate-type = ["cdylib"]

[package.metadata.component]
package = "hyperware:process"
Loading