added start_with(out)_feedback's hostname

This commit is contained in:
alex 2025-12-25 22:19:25 +08:00
parent 43c2b01fca
commit 89f7db657d
9 changed files with 109 additions and 19 deletions

View File

@ -1,4 +1,4 @@
{
// "rust-analyzer.cargo.target": "x86_64-pc-windows-gnu"
"rust-analyzer.cargo.target": "x86_64-pc-windows-gnu"
// "rust-analyzer.cargo.features": ["tun"]
}

14
Cargo.lock generated
View File

@ -637,7 +637,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
"windows-sys 0.61.2",
"windows-sys 0.52.0",
]
[[package]]
@ -1324,9 +1324,9 @@ dependencies = [
[[package]]
name = "libc"
version = "0.2.177"
version = "0.2.178"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976"
checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091"
[[package]]
name = "libloading"
@ -1895,6 +1895,7 @@ dependencies = [
"dns-lookup",
"etherparse",
"futures-util",
"libc",
"local-ip-address",
"num_enum",
"once_cell",
@ -1910,6 +1911,7 @@ dependencies = [
"tokio",
"tokio-util",
"tracing",
"winapi",
"wintun",
]
@ -2119,7 +2121,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.61.2",
"windows-sys 0.52.0",
]
[[package]]
@ -2185,7 +2187,7 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "sdlan-sn-rs"
version = "0.1.0"
source = "git+https://gitea.s5s8.com/punchnet/sdlan-rs.git#b58b18d9c31dea900f82a5a8d5d8d29a5b1aa47b"
source = "git+https://gitea.s5s8.com/punchnet/sdlan-rs.git#8e93a4224be025b0a6557e2bfd885aeb467b37ab"
dependencies = [
"aes",
"byteorder",
@ -2750,7 +2752,7 @@ dependencies = [
"getrandom 0.3.4",
"once_cell",
"rustix",
"windows-sys 0.61.2",
"windows-sys 0.52.0",
]
[[package]]

View File

@ -30,8 +30,12 @@ tokio-util = "0.7.11"
tracing = "0.1.40"
# rolling-file = { path = "../rolling-file" }
[target.'cfg(unix)'.dependencies]
libc = "0.2.178"
[target.'cfg(windows)'.dependencies]
wintun = "0.4.0"
winapi = "0.3.9"
[features]
tun = []

View File

@ -1,6 +1,7 @@
use punchnet::get_base_dir;
use punchnet::get_edge;
use punchnet::get_my_networks;
use punchnet::mod_hostname;
use punchnet::restore_dns;
use punchnet::run_sdlan;
use punchnet::set_base_dir;
@ -43,6 +44,22 @@ async fn main() {
println!("server is {}", server);
mod_hostname::get_hostname();
/*
let hostname = if cmd.hostname.len() == 0 {
mod_hostname::get_hostname()
} else {
Some(cmd.hostname)
};
*/
let hostname = if cmd.hostname.len() == 0 {
None
} else {
Some(cmd.hostname)
};
// let hostname = mod_hostname::get_hostname();
println!("hostname = {:?}", hostname);
let _ = run_sdlan(
CommandLine {
sn: server.clone()+":1265",
@ -63,7 +80,7 @@ async fn main() {
tx,
&punchnet::get_install_channel(),
server,
Some(format!("{:08x}", gen_uuid_u64() as u32)),
hostname,
None,
)
.await;
@ -95,7 +112,7 @@ async fn main() {
// exit(0);
}
*/
if let Err(e) = edge.start_without_feedback(cmd.token, cmd.network_code).await {
if let Err(e) = edge.start_without_feedback(cmd.token, cmd.network_code, None).await {
error!("failed to start: {:?}", e);
}

View File

@ -12,12 +12,13 @@ use std::net::{SocketAddr, ToSocketAddrs};
pub use network::get_edge;
pub use network::get_install_channel;
pub use network::{async_main, init_arp, init_edge, NodeConfig, restore_dns};
use sdlan_sn_rs::utils::save_to_file;
use serde::{Deserialize, Serialize};
use tokio::net::UdpSocket;
use tokio::sync::mpsc::{channel, Sender};
use tokio_util::sync::CancellationToken;
use tracing::{debug, error};
pub use utils::{CommandLine, CommandLineInput};
pub use utils::{CommandLine, CommandLineInput, mod_hostname};
pub use config::{get_base_dir, set_base_dir};
@ -53,12 +54,16 @@ pub async fn run_sdlan(
// start_stop_receiver: Receiver<String>,
) -> Result<()> {
let (start_stop_sender, start_stop_chan) = channel(20);
let edge_uuid = create_or_load_uuid(&format!("{}/.id", get_base_dir()))?;
let edge_uuid = create_or_load_uuid(&format!("{}/.id", get_base_dir()), None)?;
let node_conf = parse_config(edge_uuid, &args).await?;
let hostfile = format!("{}/.host", get_base_dir());
let host = create_or_load_uuid(&hostfile, Some(8))?;
init_arp();
let hostname = hostname.unwrap_or("".to_owned());
let hostname = hostname.unwrap_or(host);
let _ = save_to_file(&hostfile, &hostname);
let sock = Arc::new(UdpSocket::bind("0.0.0.0:0").await?);
@ -217,7 +222,7 @@ pub struct NetworkResp {
}
pub async fn get_my_networks(url: &str) -> Result<Vec<NetworkRespSingleNetwork>>{
let edge_uuid = create_or_load_uuid(&format!("{}/.id", get_base_dir()))?;
let edge_uuid = create_or_load_uuid(&format!("{}/.id", get_base_dir()), None)?;
let req_data = NetworkReq {
client_id: &edge_uuid,

View File

@ -64,7 +64,8 @@ async fn handle_tcp_message(msg: SdlanTcp) {
let ip = ip_to_string(&dev.net_addr);
// debug!("aes key is {:?}, ip is {}/{}", aes, ip, dev.net_bit_len,);
println!("assigned ip: {}", ip);
println!("network is: {}.{}", edge.hostname, dev.network_domain);
let hostname = edge.hostname.read().unwrap().clone();
println!("network is: {}.{}", hostname, dev.network_domain);
edge.device_config
.ip
.net_addr
@ -324,7 +325,7 @@ pub async fn async_main(
pub_key: edge.rsa_pubkey.clone(),
token,
network_code: code,
hostname: edge.hostname.clone(),
hostname: edge.hostname.read().unwrap().clone(),
};
// debug!("send register super: {:?}", register_super);
let packet_id = match pkt_id {

View File

@ -26,7 +26,7 @@ use super::device::{DeviceConfig, Mode};
use super::tun::{new_iface, Iface};
use tokio::fs::File;
use sdlan_sn_rs::utils::{gen_rsa_keys, load_private_key_file, Mac};
use sdlan_sn_rs::utils::{Mac, gen_rsa_keys, load_private_key_file, save_to_file};
use sdlan_sn_rs::utils::{Result, SDLanError};
static EDGE: OnceCell<Node> = OnceCell::new();
@ -126,7 +126,7 @@ pub struct Node {
pub network_id: AtomicU32,
pub hostname: String,
pub hostname: RwLock<String>,
pub udp_sock_for_dns: Arc<UdpSocket>,
pub server_ip: String,
@ -201,7 +201,12 @@ impl Node {
self.nat_type.lock().unwrap().clone()
}
pub async fn start_without_feedback(&self, token: String, network_code: String) -> Result<()> {
pub async fn start_without_feedback(&self, token: String, network_code: String, hostname: Option<String>) -> Result<()> {
if let Some(host) = hostname {
let idfile = format!("{}/.host", get_base_dir());
let _ = save_to_file(&idfile, &host);
*self.hostname.write().unwrap() = host;
}
*self._token.lock().unwrap() = token;
*self.network_code.lock().unwrap() = network_code;
let _ = self
@ -218,8 +223,14 @@ impl Node {
&self,
token: String,
network_code: String,
hostname: Option<String>,
timeout: Duration,
) -> Result<RegisterSuperFeedback> {
if let Some(host) = hostname {
let idfile = format!("{}/.host", get_base_dir());
let _ = save_to_file(&idfile, &host);
*self.hostname.write().unwrap() = host;
}
*self._token.lock().unwrap() = token;
*self.network_code.lock().unwrap() = network_code;
let (tx, rx) = oneshot::channel();
@ -286,7 +297,7 @@ impl Node {
Self {
packet_id: AtomicU32::new(1),
network_id: AtomicU32::new(0),
hostname,
hostname: RwLock::new(hostname),
udp_sock_for_dns: udpsock_for_dns,

View File

@ -10,6 +10,9 @@ pub struct CommandLineInput {
#[structopt(long = "code", default_value = "", help="specify a network code")]
pub network_code: String,
#[structopt(short= "h", long = "hostname", default_value="", help="specify the hostname")]
pub hostname: String,
}
#[derive(StructOpt, Debug)]

View File

@ -36,3 +36,50 @@ pub fn generate_mac_address() -> Mac {
mac
}
#[cfg(windows)]
pub mod mod_hostname {
use std::{ffi::OsString, os::windows::ffi::OsStringExt};
use winapi::um::winbase::GetComputerNameW;
pub fn get_hostname() -> Option<String> {
unsafe {
let mut buffer: Vec<u16> = vec![0; 64];
let mut buffer_size = 64;
if GetComputerNameW(buffer.as_mut_ptr(), &mut buffer_size) != 0 {
let hostname = OsString::from_wide(&buffer[..buffer_size as usize]);
return hostname.into_string().ok();
}
None
}
}
}
#[cfg(unix)]
pub mod mod_hostname {
use libc::{size_t, c_int, c_char};
extern "C" {
fn gethostname(name: *mut c_char, size: size_t) -> c_int;
}
pub fn get_hostname() -> Option<String> {
let mut buffer = vec![0u8; 255];
unsafe {
if gethostname(buffer.as_mut_ptr() as *mut c_char, 255) == 0 {
let len = buffer.iter().position(|&b| b == 0).unwrap_or(255);
buffer.truncate(len);
return String::from_utf8(buffer).ok();
}
None
}
}
}
#[cfg(windows)]
pub mod hostname {
}