windows, and tun, and tap are supported
This commit is contained in:
parent
33a995e7dd
commit
fbe2aa12fb
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@ -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"]
|
||||
}
|
||||
@ -2,19 +2,19 @@ mod api;
|
||||
mod local_udp_info;
|
||||
|
||||
use std::fs;
|
||||
use std::fs::File;
|
||||
use std::fs::OpenOptions;
|
||||
use std::io::stdout;
|
||||
use std::process;
|
||||
|
||||
use std::env;
|
||||
use std::time::Duration;
|
||||
use clap::Parser;
|
||||
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
use daemonize::Daemonize;
|
||||
use etherparse::icmpv6::CODE_PARAM_PROBLEM_UNRECOG_NEXT_HEADER_BY_INTERMEDIATE_NODE;
|
||||
|
||||
use futures_util::io;
|
||||
use libc::SIGTERM;
|
||||
use libc::kill;
|
||||
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
use libc::{SIGTERM, kill};
|
||||
use punchnet::CachedLoginInfo;
|
||||
use punchnet::CommandLineInput2;
|
||||
use punchnet::Commands;
|
||||
@ -23,26 +23,20 @@ use punchnet::get_access_token;
|
||||
use punchnet::get_base_dir;
|
||||
use punchnet::get_edge;
|
||||
use punchnet::ip_string_to_u32;
|
||||
use punchnet::mod_hostname;
|
||||
use punchnet::restore_dns;
|
||||
use punchnet::run_sdlan;
|
||||
use punchnet::set_access_token;
|
||||
use punchnet::set_base_dir;
|
||||
use punchnet::CommandLine;
|
||||
use punchnet::CommandLineInput;
|
||||
use sdlan_sn_rs::log;
|
||||
|
||||
use sdlan_sn_rs::utils::Mac;
|
||||
use sdlan_sn_rs::utils::Result;
|
||||
use sdlan_sn_rs::utils::create_or_load_uuid;
|
||||
use tokio::io::AsyncWriteExt;
|
||||
use tokio::net::UdpSocket;
|
||||
use tokio::runtime::Runtime;
|
||||
use tokio::time::sleep;
|
||||
use tracing::error;
|
||||
|
||||
use std::net::ToSocketAddrs;
|
||||
use structopt::StructOpt;
|
||||
|
||||
use crate::api::ConnectData;
|
||||
use crate::api::ConnectResponse;
|
||||
@ -273,15 +267,27 @@ async fn daemonize_me(
|
||||
|
||||
}
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
const SYSTEM: &'static str = "windows";
|
||||
#[cfg(target_os = "windows")]
|
||||
const DEFAULT_BASE_DIR: &'static str = ".";
|
||||
|
||||
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
const SYSTEM: &'static str = "linux";
|
||||
#[cfg(target_os = "linux")]
|
||||
const DEFAULT_BASE_DIR: &'static str = "/usr/local/punchnet";
|
||||
|
||||
|
||||
fn main() {
|
||||
set_base_dir("/usr/local/punchnet");
|
||||
set_base_dir(DEFAULT_BASE_DIR);
|
||||
// let _guard = log::init_log(&format!("{}/.output", get_base_dir()));
|
||||
|
||||
let client_id = create_or_load_uuid(&format!("{}/.id", get_base_dir()), None).unwrap();
|
||||
|
||||
let mac = create_or_load_mac();
|
||||
let system = "linux";
|
||||
let version = "1.0.0";
|
||||
let system = SYSTEM;
|
||||
let version = env!("CARGO_PKG_VERSION");
|
||||
|
||||
// let cmd = CommandLineInput::from_args();
|
||||
let cmd = CommandLineInput2::parse();
|
||||
@ -307,6 +313,8 @@ fn main() {
|
||||
});
|
||||
process::exit(0);
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
Commands::Stop => {
|
||||
match fs::read_to_string("/tmp/punchnet.pid") {
|
||||
Ok(content) => {
|
||||
@ -348,6 +356,7 @@ fn main() {
|
||||
|
||||
let should_daemonize = true;
|
||||
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
if should_daemonize {
|
||||
let out = OpenOptions::new()
|
||||
.create(true)
|
||||
@ -377,11 +386,13 @@ fn main() {
|
||||
eprintln!("failed to daemonize");
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
run_it(cmd, client_id, mac, system, version);
|
||||
}
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
run_it(cmd, client_id, mac, system, version);
|
||||
|
||||
}
|
||||
|
||||
fn run_it(cmd: CommandLineInput2, client_id: String, mac: Mac, system: &str, version: &str) {
|
||||
|
||||
@ -21,7 +21,7 @@ use sdlan_sn_rs::{
|
||||
config::{AF_INET, AF_INET6},
|
||||
peer::{is_sdlan_sock_equal, SdlanSock, V6Info},
|
||||
utils::{
|
||||
aes_decrypt, get_current_timestamp, get_sdlan_sock_from_socketaddr, is_multi_broadcast,
|
||||
get_current_timestamp, get_sdlan_sock_from_socketaddr, is_multi_broadcast,
|
||||
Mac, Result, SDLanError,
|
||||
},
|
||||
};
|
||||
|
||||
@ -321,7 +321,7 @@ impl TunTapPacketHandler for Iface {
|
||||
|
||||
#[cfg(feature = "tun")]
|
||||
impl TunTapPacketHandler for Iface {
|
||||
async fn handle_packet_from_net(&self, data: &[u8], key: &[u8]) -> std::io::Result<()> {
|
||||
async fn handle_packet_from_net(&self, data: &[u8]) -> std::io::Result<()> {
|
||||
debug!("in tun mode");
|
||||
|
||||
// got layer 2 frame
|
||||
@ -401,7 +401,8 @@ impl TunTapPacketHandler for Iface {
|
||||
[((self_ip >> 16) & 0xffff) as u16, (self_ip & 0xffff) as u16];
|
||||
|
||||
let data = arp.marshal_to_bytes();
|
||||
let Ok(encrypted) = aes_encrypt(key, &data) else {
|
||||
// let Ok(encrypted) = aes_encrypt(key, &data) else {
|
||||
let Ok(encrypted) = edge.encryptor.read().unwrap().encrypt(&data) else {
|
||||
error!("failed to encrypt arp reply");
|
||||
return Ok(());
|
||||
};
|
||||
@ -497,7 +498,6 @@ impl TunTapPacketHandler for Iface {
|
||||
async fn handle_packet_from_device(
|
||||
&self,
|
||||
data: Vec<u8>,
|
||||
encrypt_key: &[u8],
|
||||
) -> std::io::Result<()> {
|
||||
use etherparse::IpHeaders;
|
||||
|
||||
@ -560,7 +560,8 @@ impl TunTapPacketHandler for Iface {
|
||||
);
|
||||
let arp_msg =
|
||||
generate_arp_request(src_mac, ip, eee.device_config.get_ip());
|
||||
let Ok(encrypted) = aes_encrypt(&encrypt_key, &arp_msg) else {
|
||||
// let Ok(encrypted) = aes_encrypt(&encrypt_key, &arp_msg) else {
|
||||
let Ok(encrypted) = eee.encryptor.read().unwrap().encrypt(&arp_msg) else {
|
||||
error!("failed to encrypt arp request");
|
||||
return Ok(());
|
||||
};
|
||||
@ -600,7 +601,8 @@ impl TunTapPacketHandler for Iface {
|
||||
let pkt_size = packet.len();
|
||||
// println!("sending data with mac");
|
||||
|
||||
let Ok(encrypted) = aes_encrypt(&encrypt_key, &packet) else {
|
||||
// let Ok(encrypted) = aes_encrypt(&encrypt_key, &packet) else {
|
||||
let Ok(encrypted) = eee.encryptor.read().unwrap().encrypt(&packet) else {
|
||||
error!("failed to encrypt packet request");
|
||||
return Ok(());
|
||||
};
|
||||
|
||||
@ -133,7 +133,7 @@ impl Iface {
|
||||
}
|
||||
|
||||
impl TunTapPacketHandler for Iface {
|
||||
async fn handle_packet_from_net(&self, data: &[u8], key: &[u8]) -> std::io::Result<()> {
|
||||
async fn handle_packet_from_net(&self, data: &[u8]) -> std::io::Result<()> {
|
||||
// got layer 2 frame
|
||||
match Ethernet2Header::from_slice(&data) {
|
||||
Ok((hdr, rest)) => {
|
||||
@ -199,7 +199,10 @@ impl TunTapPacketHandler for Iface {
|
||||
[((self_ip >> 16) & 0xffff) as u16, (self_ip & 0xffff) as u16];
|
||||
|
||||
let data = arp.marshal_to_bytes();
|
||||
let Ok(encrypted) = aes_encrypt(key, &data) else {
|
||||
|
||||
|
||||
// let Ok(encrypted) = aes_encrypt(key, &data) else {
|
||||
let Ok(encrypted) = edge.encryptor.read().unwrap().encrypt(&data) else {
|
||||
error!("failed to encrypt arp reply");
|
||||
return Ok(());
|
||||
};
|
||||
@ -285,7 +288,7 @@ impl TunTapPacketHandler for Iface {
|
||||
async fn handle_packet_from_device(
|
||||
&self,
|
||||
data: Vec<u8>,
|
||||
encrypt_key: &[u8],
|
||||
// encrypt_key: &[u8],
|
||||
) -> std::io::Result<()> {
|
||||
let eee = get_edge();
|
||||
|
||||
@ -336,7 +339,9 @@ impl TunTapPacketHandler for Iface {
|
||||
);
|
||||
let arp_msg =
|
||||
generate_arp_request(src_mac, ip, eee.device_config.get_ip());
|
||||
let Ok(encrypted) = aes_encrypt(&encrypt_key, &arp_msg) else {
|
||||
|
||||
let Ok(encrypted) = eee.encryptor.read().unwrap().encrypt(&arp_msg) else {
|
||||
// let Ok(encrypted) = aes_encrypt(&encrypt_key, &arp_msg) else {
|
||||
error!("failed to encrypt arp request");
|
||||
return Ok(());
|
||||
};
|
||||
@ -380,7 +385,8 @@ impl TunTapPacketHandler for Iface {
|
||||
let pkt_size = packet.len();
|
||||
// println!("sending data with mac");
|
||||
|
||||
let Ok(encrypted) = aes_encrypt(&encrypt_key, &packet) else {
|
||||
// let Ok(encrypted) = aes_encrypt(&encrypt_key, &packet) else {
|
||||
let Ok(encrypted) = eee.encryptor.read().unwrap().encrypt(&packet) else {
|
||||
error!("failed to encrypt packet request");
|
||||
return Ok(());
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user