diff --git a/src/config.rs b/src/config.rs index 682a942..6fef3a0 100644 --- a/src/config.rs +++ b/src/config.rs @@ -43,4 +43,8 @@ impl Config { let key_str = key.into(); self.shells.get(&key_str).cloned() } + + pub fn get_shell_keys(&self) -> Vec { + self.shells.keys().map(|s| s.to_owned()).collect() + } } diff --git a/src/main.rs b/src/main.rs index 40e17c2..cd284b8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ use axum::{ }; mod argparse; -mod print_dir; +mod print_interface; mod config; mod shells; mod logging; @@ -23,7 +23,14 @@ async fn main() { None => conf.web_port }; - print_dir::print_interface(&args.interface, &port, &args.directory); + println!("Files in current directory:"); + print_interface::print_directory(&args.interface, &port, &args.directory, None).unwrap(); + + println!("\nFiles in persistent download directory:"); + print_interface::print_directory(&args.interface, &port, &conf.get_download_path(), Some("download")).unwrap(); + + println!("\nConfigured shells:"); + print_interface::print_interface(&args.interface, &port, &conf.get_shell_keys(), Some("shells")); let app = Router::new() .route("/upload", post(upload::upload_handler)) diff --git a/src/print_dir.rs b/src/print_dir.rs deleted file mode 100644 index 1219bcc..0000000 --- a/src/print_dir.rs +++ /dev/null @@ -1,41 +0,0 @@ -use std::{fs, io}; -use std::net::IpAddr; -use std::path::Path; -use if_addrs::{get_if_addrs, IfAddr, Interface}; - -fn print_single_interface>(iface: Interface, port: &u16, path: P) -> io::Result<()> { - for entry in fs::read_dir(path)? { - let entry = entry?; - let entry_path = entry.path(); - if entry_path.is_dir() { continue } - - let filename = entry_path.file_name().unwrap(); - - if let IfAddr::V4(_) = iface.addr { - println!("http://{}:{}/{}", iface.ip(), port, filename.to_str().unwrap()); - } - } - - Ok(()) -} - -fn is_last_octet_one(ip: IpAddr) -> bool { - match ip { - IpAddr::V4(addr) => addr.octets()[3] == 1, - _ => false - } -} - -pub fn print_interface>(iface_str: &str, port: &u16, path: P) { - for iface in get_if_addrs().unwrap() { - if iface_str == "all" { - if iface.is_loopback() || is_last_octet_one(iface.ip()) { - continue - } - } else { - if iface_str != iface.name { continue } - } - - print_single_interface(iface, port, &path).unwrap(); - } -} diff --git a/src/print_interface.rs b/src/print_interface.rs new file mode 100644 index 0000000..66f2087 --- /dev/null +++ b/src/print_interface.rs @@ -0,0 +1,50 @@ +use std::{fs, io}; +use std::net::IpAddr; +use std::path::Path; +use if_addrs::{get_if_addrs, IfAddr, Interface}; + +fn print_single_interface(iface: Interface, port: &u16, keys: &Vec, prefix: Option<&str>) { + for key in keys.iter() { + if let IfAddr::V4(_) = iface.addr { + match prefix { + Some(prefix) => println!("http://{}:{}/{}/{}", iface.ip(), port, prefix, key), + None => println!("http://{}:{}/{}", iface.ip(), port, key), + } + } + } +} + +fn is_last_octet_one(ip: IpAddr) -> bool { + match ip { + IpAddr::V4(addr) => addr.octets()[3] == 1, + _ => false + } +} + +pub fn print_interface(iface_str: &str, port: &u16, keys: &Vec, prefix: Option<&str>) { + for iface in get_if_addrs().unwrap() { + if iface_str == "all" { + if iface.is_loopback() || is_last_octet_one(iface.ip()) { + continue + } + } else { + if iface_str != iface.name { continue } + } + + print_single_interface(iface, port, keys, prefix); + } + +} + +pub fn print_directory>(iface_str: &str, port: &u16, path: P, prefix: Option<&str>) -> io::Result<()> { + let files = fs::read_dir(path)? + .filter_map(|entry| entry.ok()) + .map(|entry| entry.path()) + .filter(|path| path.is_file()) + .map(|path| path.file_name().unwrap().to_string_lossy().to_string()) + .collect::>(); + + print_interface(iface_str.into(), port, &files, prefix); + + Ok(()) +}