mirror of
https://github.com/edu4rdshl/unimap.git
synced 2026-07-17 23:24:49 +00:00
Clippy fixes.
This commit is contained in:
parent
482b6f6e21
commit
d72e115859
9 changed files with 51 additions and 47 deletions
|
|
@ -11,6 +11,7 @@ use {
|
||||||
};
|
};
|
||||||
|
|
||||||
#[allow(clippy::cognitive_complexity)]
|
#[allow(clippy::cognitive_complexity)]
|
||||||
|
#[must_use]
|
||||||
pub fn get_args() -> Args {
|
pub fn get_args() -> Args {
|
||||||
let yaml = load_yaml!("cli.yml");
|
let yaml = load_yaml!("cli.yml");
|
||||||
let matches = App::from_yaml(yaml)
|
let matches = App::from_yaml(yaml)
|
||||||
|
|
|
||||||
17
src/files.rs
17
src/files.rs
|
|
@ -1,5 +1,8 @@
|
||||||
use {
|
use {
|
||||||
crate::{errors::*, structs::Args},
|
crate::{
|
||||||
|
errors::{Result, ResultExt},
|
||||||
|
structs::Args,
|
||||||
|
},
|
||||||
log::error,
|
log::error,
|
||||||
prettytable::Table,
|
prettytable::Table,
|
||||||
std::{
|
std::{
|
||||||
|
|
@ -10,6 +13,7 @@ use {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
pub fn return_file_targets(args: &Args, mut files: Vec<String>) -> Vec<String> {
|
pub fn return_file_targets(args: &Args, mut files: Vec<String>) -> Vec<String> {
|
||||||
let mut targets: Vec<String> = Vec::new();
|
let mut targets: Vec<String> = Vec::new();
|
||||||
files.sort();
|
files.sort();
|
||||||
|
|
@ -23,13 +27,10 @@ pub fn return_file_targets(args: &Args, mut files: Vec<String>) -> Vec<String> {
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
if args.files.len() == 1 {
|
if args.files.len() == 1 {
|
||||||
error!("Can not open file {}. Error: {}\n", f, e);
|
error!("Can not open file {f}. Error: {e}\n");
|
||||||
std::process::exit(1)
|
std::process::exit(1)
|
||||||
} else if !args.quiet_flag {
|
} else if !args.quiet_flag {
|
||||||
error!(
|
error!("Can not open file {f}, working with next file. Error: {e}\n");
|
||||||
"Can not open file {}, working with next file. Error: {}\n",
|
|
||||||
f, e
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -44,6 +45,7 @@ pub fn table_to_file(table: &Table, file_name: Option<std::fs::File>) -> Result<
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
pub fn return_output_file(args: &Args) -> Option<File> {
|
pub fn return_output_file(args: &Args) -> Option<File> {
|
||||||
if args.file_name.is_empty() || !args.with_output {
|
if args.file_name.is_empty() || !args.with_output {
|
||||||
None
|
None
|
||||||
|
|
@ -59,6 +61,7 @@ pub fn return_output_file(args: &Args) -> Option<File> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
pub fn check_full_path(full_path: &str) -> bool {
|
pub fn check_full_path(full_path: &str) -> bool {
|
||||||
(Path::new(full_path).exists() && Path::new(full_path).is_dir())
|
(Path::new(full_path).exists() && Path::new(full_path).is_dir())
|
||||||
|| fs::create_dir_all(full_path).is_ok()
|
|| fs::create_dir_all(full_path).is_ok()
|
||||||
|
|
@ -68,7 +71,7 @@ pub fn delete_files(paths: &HashSet<String>) {
|
||||||
for file in paths {
|
for file in paths {
|
||||||
if Path::new(&file).exists() {
|
if Path::new(&file).exists() {
|
||||||
match std::fs::remove_file(file) {
|
match std::fs::remove_file(file) {
|
||||||
Ok(_) => (),
|
Ok(()) => (),
|
||||||
Err(e) => error!("Error deleting the file {}. Description: {}", &file, e),
|
Err(e) => error!("Error deleting the file {}. Description: {}", &file, e),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,10 +21,10 @@ impl Log for SimpleLogger {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn log(&self, record: &Record) {
|
fn log(&self, record: &Record) {
|
||||||
let target = if !record.target().is_empty() {
|
let target = if record.target().is_empty() {
|
||||||
record.target()
|
|
||||||
} else {
|
|
||||||
record.module_path().unwrap_or_default()
|
record.module_path().unwrap_or_default()
|
||||||
|
} else {
|
||||||
|
record.target()
|
||||||
};
|
};
|
||||||
if target.contains("unimap") && self.enabled(record.metadata()) {
|
if target.contains("unimap") && self.enabled(record.metadata()) {
|
||||||
let level_string = {
|
let level_string = {
|
||||||
|
|
|
||||||
22
src/main.rs
22
src/main.rs
|
|
@ -1,27 +1,27 @@
|
||||||
use {
|
use {
|
||||||
log::{error, Level},
|
log::{error, Level},
|
||||||
std::{collections::HashSet, iter::FromIterator},
|
std::{collections::HashSet, iter::FromIterator},
|
||||||
unimap::{args, errors::*, files::return_file_targets, logger, misc, resolver_engine},
|
unimap::{args, errors::Result, files::return_file_targets, logger, misc, resolver_engine},
|
||||||
};
|
};
|
||||||
|
|
||||||
fn run() -> Result<()> {
|
fn run() -> Result<()> {
|
||||||
if std::env::var("UNIMAP_LOG_LEVEL").is_ok() {
|
if std::env::var("UNIMAP_LOG_LEVEL").is_ok() {
|
||||||
logger::init_by_env()
|
logger::init_by_env();
|
||||||
} else {
|
} else {
|
||||||
logger::init_with_level(Level::Info).unwrap()
|
logger::init_with_level(Level::Info).unwrap();
|
||||||
}
|
}
|
||||||
let mut arguments = args::get_args();
|
let mut arguments = args::get_args();
|
||||||
if !arguments.files.is_empty() {
|
if !arguments.files.is_empty() {
|
||||||
arguments.targets =
|
arguments.targets =
|
||||||
HashSet::from_iter(return_file_targets(&arguments, arguments.files.clone()))
|
HashSet::from_iter(return_file_targets(&arguments, arguments.files.clone()));
|
||||||
} else if !arguments.target.is_empty() {
|
} else if !arguments.target.is_empty() {
|
||||||
arguments.targets.insert(arguments.target.clone());
|
arguments.targets.insert(arguments.target.clone());
|
||||||
} else {
|
} else {
|
||||||
arguments.targets = misc::read_stdin()
|
arguments.targets = misc::read_stdin();
|
||||||
}
|
}
|
||||||
|
|
||||||
if arguments.targets.len() < 50 {
|
if arguments.targets.len() < 50 {
|
||||||
arguments.threads = arguments.targets.len()
|
arguments.threads = arguments.targets.len();
|
||||||
}
|
}
|
||||||
|
|
||||||
rayon::ThreadPoolBuilder::new()
|
rayon::ThreadPoolBuilder::new()
|
||||||
|
|
@ -29,19 +29,19 @@ fn run() -> Result<()> {
|
||||||
.build_global()
|
.build_global()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
if !arguments.targets.is_empty() {
|
if arguments.targets.is_empty() {
|
||||||
resolver_engine::parallel_resolver_all(&mut arguments)
|
|
||||||
} else {
|
|
||||||
error!("Error: Target is empty or invalid!\n");
|
error!("Error: Target is empty or invalid!\n");
|
||||||
std::process::exit(1)
|
std::process::exit(1)
|
||||||
|
} else {
|
||||||
|
resolver_engine::parallel_resolver_all(&mut arguments)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
if let Err(err) = run() {
|
if let Err(err) = run() {
|
||||||
error!("Error: {}", err);
|
error!("Error: {err}");
|
||||||
for cause in err.iter_chain().skip(1) {
|
for cause in err.iter_chain().skip(1) {
|
||||||
error!("Error description: {}\n", cause);
|
error!("Error description: {cause}\n");
|
||||||
}
|
}
|
||||||
std::process::exit(1);
|
std::process::exit(1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ use std::{
|
||||||
io::{self, Read},
|
io::{self, Read},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
pub fn sanitize_target_string(target: String) -> String {
|
pub fn sanitize_target_string(target: String) -> String {
|
||||||
target
|
target
|
||||||
.replace("www.", "")
|
.replace("www.", "")
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ use {
|
||||||
pub fn get_records(resolver: &Resolver, domain: &str) -> String {
|
pub fn get_records(resolver: &Resolver, domain: &str) -> String {
|
||||||
if let Ok(ips) = resolver.ipv4_lookup(domain) {
|
if let Ok(ips) = resolver.ipv4_lookup(domain) {
|
||||||
ips.iter()
|
ips.iter()
|
||||||
.map(|x| x.to_string())
|
.map(std::string::ToString::to_string)
|
||||||
.next()
|
.next()
|
||||||
.expect("Failed to get IPV4.")
|
.expect("Failed to get IPV4.")
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
11
src/nmap.rs
11
src/nmap.rs
|
|
@ -132,17 +132,17 @@ pub fn get_nmap_data(
|
||||||
];
|
];
|
||||||
|
|
||||||
if !min_rate.is_empty() {
|
if !min_rate.is_empty() {
|
||||||
nmap_args.append(&mut vec!["--min-rate", &min_rate])
|
nmap_args.append(&mut vec!["--min-rate", &min_rate]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if fast_scan {
|
if fast_scan {
|
||||||
nmap_args.append(&mut vec!["--host-timeout", "20m"])
|
nmap_args.append(&mut vec!["--host-timeout", "20m"]);
|
||||||
} else {
|
} else {
|
||||||
nmap_args.append(&mut vec!["-sV"])
|
nmap_args.append(&mut vec!["-sV"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if !ports.is_empty() {
|
if !ports.is_empty() {
|
||||||
nmap_args.append(&mut vec!["-p", ports])
|
nmap_args.append(&mut vec!["-p", ports]);
|
||||||
}
|
}
|
||||||
|
|
||||||
nmap_args.push(host);
|
nmap_args.push(host);
|
||||||
|
|
@ -159,8 +159,7 @@ pub fn get_nmap_data(
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
error!(
|
error!(
|
||||||
"Error waiting command to finish for {}, continuing with remaining hosts. Description: {}",
|
"Error waiting command to finish for {host}, continuing with remaining hosts. Description: {e}"
|
||||||
host, e
|
|
||||||
);
|
);
|
||||||
Ok(Nmaprun::default())
|
Ok(Nmaprun::default())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use {
|
use {
|
||||||
crate::{
|
crate::{
|
||||||
args,
|
args,
|
||||||
errors::*,
|
errors::Result,
|
||||||
files, logic, networking,
|
files, logic, networking,
|
||||||
nmap::{self, Nmaprun},
|
nmap::{self, Nmaprun},
|
||||||
structs::{Args, ResolvData},
|
structs::{Args, ResolvData},
|
||||||
|
|
@ -30,7 +30,7 @@ lazy_static! {
|
||||||
match r.parse::<Ipv4Addr>() {
|
match r.parse::<Ipv4Addr>() {
|
||||||
Ok(ip) => resolver_ips.push(ip),
|
Ok(ip) => resolver_ips.push(ip),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
error!("Error parsing the {} IP from resolvers file to IP address. Please check and try again. Error: {}\n", r, e);
|
error!("Error parsing the {r} IP from resolvers file to IP address. Please check and try again. Error: {e}\n");
|
||||||
std::process::exit(1)
|
std::process::exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -40,7 +40,7 @@ lazy_static! {
|
||||||
match r.parse::<Ipv4Addr>() {
|
match r.parse::<Ipv4Addr>() {
|
||||||
Ok(ip) => resolver_ips.push(ip),
|
Ok(ip) => resolver_ips.push(ip),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
error!("Error parsing the {} IP from resolvers file to IP address. Please check and try again. Error: {}\n", r, e);
|
error!("Error parsing the {r} IP from resolvers file to IP address. Please check and try again. Error: {e}\n");
|
||||||
std::process::exit(1)
|
std::process::exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -51,13 +51,16 @@ lazy_static! {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parallel_resolver_all(args: &mut Args) -> Result<()> {
|
pub fn parallel_resolver_all(args: &mut Args) -> Result<()> {
|
||||||
files::check_full_path(&args.logs_dir);
|
if !files::check_full_path(&args.logs_dir) {
|
||||||
|
error!("The logs directory {} does not exist.\n", args.logs_dir);
|
||||||
|
std::process::exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
if !args.quiet_flag {
|
if !args.quiet_flag {
|
||||||
info!(
|
info!(
|
||||||
"Performing parallel resolution for {} targets with {} threads, it will take a while...\n",
|
"Performing parallel resolution for {} targets with {} threads, it will take a while...\n",
|
||||||
args.targets.len(), args.threads
|
args.targets.len(), args.threads
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let opts = ResolverOpts {
|
let opts = ResolverOpts {
|
||||||
|
|
@ -79,9 +82,9 @@ pub fn parallel_resolver_all(args: &mut Args) -> Result<()> {
|
||||||
"SERVICES"
|
"SERVICES"
|
||||||
]);
|
]);
|
||||||
if args.raw_output && !args.quiet_flag {
|
if args.raw_output && !args.quiet_flag {
|
||||||
println!("HOST,IP,PORT,SERVICE,VERSION,PRODUCT,OS,EXTRAINFO")
|
println!("HOST,IP,PORT,SERVICE,VERSION,PRODUCT,OS,EXTRAINFO");
|
||||||
} else if args.url_output && !args.quiet_flag {
|
} else if args.url_output && !args.quiet_flag {
|
||||||
println!("HOST:IP")
|
println!("HOST:IP");
|
||||||
}
|
}
|
||||||
for (target, resolv_data) in &data {
|
for (target, resolv_data) in &data {
|
||||||
if !resolv_data.ip.is_empty() {
|
if !resolv_data.ip.is_empty() {
|
||||||
|
|
@ -120,11 +123,11 @@ pub fn parallel_resolver_all(args: &mut Args) -> Result<()> {
|
||||||
.extrainfo
|
.extrainfo
|
||||||
.clone()
|
.clone()
|
||||||
.unwrap_or_else(|| "NULL".to_string())
|
.unwrap_or_else(|| "NULL".to_string())
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
} else if args.url_output {
|
} else if args.url_output {
|
||||||
for port_data in &resolv_data.ports_data {
|
for port_data in &resolv_data.ports_data {
|
||||||
println!("{}:{}", target, port_data.portid)
|
println!("{}:{}", target, port_data.portid);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let mut services_table = Table::new();
|
let mut services_table = Table::new();
|
||||||
|
|
@ -179,7 +182,7 @@ pub fn parallel_resolver_all(args: &mut Args) -> Result<()> {
|
||||||
error!(
|
error!(
|
||||||
"An error occurred while writing the output file {}.\n",
|
"An error occurred while writing the output file {}.\n",
|
||||||
args.file_name
|
args.file_name
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
if !args.quiet_flag && !args.raw_output && !args.url_output {
|
if !args.quiet_flag && !args.raw_output && !args.url_output {
|
||||||
table.printstd();
|
table.printstd();
|
||||||
|
|
@ -206,7 +209,7 @@ fn parallel_resolver_engine(
|
||||||
let resolv_data: HashMap<String, ResolvData> = targets
|
let resolv_data: HashMap<String, ResolvData> = targets
|
||||||
.par_iter()
|
.par_iter()
|
||||||
.map(|target| {
|
.map(|target| {
|
||||||
let fqdn_target = format!("{}.", target);
|
let fqdn_target = format!("{target}.");
|
||||||
let mut resolv_data = ResolvData::default();
|
let mut resolv_data = ResolvData::default();
|
||||||
resolv_data.ip = networking::get_records(&resolver, &fqdn_target);
|
resolv_data.ip = networking::get_records(&resolver, &fqdn_target);
|
||||||
(target.to_owned(), resolv_data)
|
(target.to_owned(), resolv_data)
|
||||||
|
|
@ -227,10 +230,7 @@ fn parallel_resolver_engine(
|
||||||
});
|
});
|
||||||
|
|
||||||
if nmap_ips.is_empty() {
|
if nmap_ips.is_empty() {
|
||||||
error!(
|
error!("No valid IPs found for scanning. IPs found: {nmap_ips_orig:?}\n");
|
||||||
"No valid IPs found for scanning. IPs found: {:?}\n",
|
|
||||||
nmap_ips_orig
|
|
||||||
);
|
|
||||||
std::process::exit(1)
|
std::process::exit(1)
|
||||||
} else {
|
} else {
|
||||||
let nmap_data: HashMap<String, Nmaprun> = nmap_ips
|
let nmap_data: HashMap<String, Nmaprun> = nmap_ips
|
||||||
|
|
@ -254,7 +254,7 @@ fn parallel_resolver_engine(
|
||||||
.port
|
.port
|
||||||
.retain(|f| f.state.state == "open");
|
.retain(|f| f.state.state == "open");
|
||||||
if args.no_keep_nmap_logs && std::fs::remove_file(&filename).is_err() {
|
if args.no_keep_nmap_logs && std::fs::remove_file(&filename).is_err() {
|
||||||
error!("Error removing filename {}.", &filename)
|
error!("Error removing filename {}.", &filename);
|
||||||
}
|
}
|
||||||
(ip.clone(), nmap_data)
|
(ip.clone(), nmap_data)
|
||||||
}
|
}
|
||||||
|
|
@ -268,7 +268,7 @@ fn parallel_resolver_engine(
|
||||||
|
|
||||||
// Delete the args.logs_dir directory if it's empty
|
// Delete the args.logs_dir directory if it's empty
|
||||||
if args.no_keep_nmap_logs && std::fs::remove_dir(&args.logs_dir).is_err() {
|
if args.no_keep_nmap_logs && std::fs::remove_dir(&args.logs_dir).is_err() {
|
||||||
error!("Error removing directory {}.", &args.logs_dir)
|
error!("Error removing directory {}.", &args.logs_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
resolv_data
|
resolv_data
|
||||||
|
|
|
||||||
|
|
@ -35,8 +35,8 @@ pub struct ResolvData {
|
||||||
pub ports_data: Vec<Port>,
|
pub ports_data: Vec<Port>,
|
||||||
}
|
}
|
||||||
impl ResolvData {
|
impl ResolvData {
|
||||||
pub fn default() -> ResolvData {
|
pub const fn default() -> Self {
|
||||||
ResolvData {
|
Self {
|
||||||
ip: String::new(),
|
ip: String::new(),
|
||||||
ports_data: Vec::new(),
|
ports_data: Vec::new(),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue