pub mod banner;
#[global_allocator]
static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
use env_logger::Builder;
use log::{error, info, trace};
use rusthound_ce::{args, ldap_auth, api::run_collection, utils};
use std::error::Error;
#[cfg(feature = "noargs")]
use args::auto_args;
#[cfg(not(feature = "noargs"))]
use args::{extract_args, Options};
use banner::{print_banner, print_end_banner};
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
print_banner();
#[cfg(not(feature = "noargs"))]
let common_args: Options = extract_args();
#[cfg(feature = "noargs")]
let common_args = auto_args();
Builder::new()
.filter(Some("rusthound"), common_args.verbose)
.filter_level(log::LevelFilter::Error)
.init();
info!("Verbosity level: {:?}", common_args.verbose);
info!("Collection method: {:?}", common_args.collection_method);
let mut ldap = ldap_auth(&common_args).await?;
match run_collection(&mut ldap, &common_args).await {
Ok(out) => trace!("Output written to {out}"),
Err(err) => error!("Collection failed. Reason: {err}"),
}
let _ = ldap.unbind().await;
print_end_banner();
Ok(())
}