use crate::port_forwarding::PortForwarding;
use crate::port_forwarding::cmd::{PORT_PROXY_V4TOV4, RESET_CMD, add_cmd, del_cmd, set_cmd};
use crate::utils::{Println, check_ipv4_by_string, run_commands};
use ansi_term::Color::Red;
pub fn add(forward: &PortForwarding) {
let cmd = add_cmd(forward);
let out = run_commands(&cmd, true, true);
out.print_ln();
}
pub fn del(address: &String, port: &i64) {
let cmd = del_cmd(address, port);
let out = run_commands(&cmd, true, true);
out.print_ln();
}
pub fn reset() {
let cmd = RESET_CMD;
let out = run_commands(&cmd.to_string(), true, true);
out.print_ln();
}
pub fn set(port: &PortForwarding) {
let cmd = set_cmd(port);
let out = run_commands(&cmd, true, true);
out.print_ln();
}
pub fn get_all_ipv4_to_ipv4_port_proxy() -> Vec<PortForwarding> {
let out = run_commands(PORT_PROXY_V4TOV4, true, false);
out.print_ln();
from_cmd_load_port_forwarding(&out.to_string())
}
pub fn from_cmd_load_port_forwarding(cmd_string: &String) -> Vec<PortForwarding> {
let mut res: Vec<PortForwarding> = Vec::new();
for line in cmd_string.split("\r\n") {
let data: Vec<String> = line.split_whitespace().map(|x| x.to_string()).collect();
if data.len() == 4 {
let listen_address = data.get(0).unwrap().to_string();
let listen_port = data.get(1).unwrap().parse::<i64>();
let connect_address = data.get(2).unwrap().to_string();
let connect_port = data.get(3).unwrap().parse::<i64>();
let address_is_ok =
check_ipv4_by_string(&listen_address) && check_ipv4_by_string(&connect_address);
let port_is_ok = listen_port.is_ok() && connect_port.is_ok();
if address_is_ok && port_is_ok {
let port = PortForwarding::new(
(listen_address, listen_port.unwrap()),
(connect_address, connect_port.unwrap()),
);
res.push(port);
} else {
println!("Invalid port found {}", Red.paint(line));
}
}
}
res
}
pub fn from_cmd_data(data: Vec<String>) -> PortForwarding {
assert_eq!(data.len(), 4, "需传入4个数据! ");
let from = (data[0].to_string(), data[1].parse::<i64>().unwrap());
let to = (data[2].to_string(), data[3].parse::<i64>().unwrap());
PortForwarding::new(from, to)
}