Add ./src/main.rs
This commit is contained in:
+161
@@ -0,0 +1,161 @@
|
||||
use anyhow::Result;
|
||||
use clap::{Parser, Subcommand};
|
||||
use colored::*;
|
||||
use tracing::{info, warn, error};
|
||||
|
||||
mod config;
|
||||
mod ioc_fetcher;
|
||||
mod scanner;
|
||||
mod trust_scorer;
|
||||
mod utils;
|
||||
mod hook;
|
||||
|
||||
use scanner::PackageScanner;
|
||||
use config::AegisConfig;
|
||||
|
||||
#[derive(Parser)]
|
||||
#[command(name = "aegisaur")]
|
||||
#[command(about = "👻 Trust-Scoring + IOC-Scanner für Arch Linux AUR-Pakete")]
|
||||
#[command(version = env!("CARGO_PKG_VERSION"))]
|
||||
struct Cli {
|
||||
#[command(subcommand)]
|
||||
command: Commands,
|
||||
}
|
||||
|
||||
#[derive(Subcommand)]
|
||||
enum Commands {
|
||||
/// Scannt ein einzelnes AUR-Paket
|
||||
Scan {
|
||||
/// Paketname
|
||||
package: String,
|
||||
/// Zeigt detaillierte Analyse
|
||||
#[arg(short, long)]
|
||||
verbose: bool,
|
||||
},
|
||||
/// Scannt alle installierten AUR-Pakete
|
||||
ScanAll {
|
||||
/// Zeigt detaillierte Analyse
|
||||
#[arg(short, long)]
|
||||
verbose: bool,
|
||||
},
|
||||
/// Prüft gegen aktuelle IOC-Listen (Atomic Arch, etc.)
|
||||
CheckIoc {
|
||||
/// Spezifische Liste prüfen (atomicarch, all)
|
||||
#[arg(short, long, default_value = "all")]
|
||||
list: String,
|
||||
},
|
||||
/// Fügt Paket zur Whitelist hinzu
|
||||
Allow {
|
||||
/// Paketname
|
||||
package: String,
|
||||
},
|
||||
/// Entfernt Paket von Whitelist
|
||||
Deny {
|
||||
/// Paketname
|
||||
package: String,
|
||||
},
|
||||
/// Zeigt Konfiguration
|
||||
Config,
|
||||
/// Installiert ALPM-Hook
|
||||
InstallHook,
|
||||
/// Entfernt ALPM-Hook
|
||||
RemoveHook,
|
||||
/// Zeigt Cache-Status
|
||||
Cache,
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<()> {
|
||||
// Logging initialisieren
|
||||
tracing_subscriber::fmt()
|
||||
.with_env_filter("aegisaur=info")
|
||||
.init();
|
||||
|
||||
let cli = Cli::parse();
|
||||
let config = AegisConfig::load_or_default()?;
|
||||
let scanner = PackageScanner::new(config).await?;
|
||||
|
||||
match cli.command {
|
||||
Commands::Scan { package, verbose } => {
|
||||
println!("{} {}", "🔍 Scanne".cyan(), package.bold());
|
||||
let result = scanner.scan_package(&package, verbose).await?;
|
||||
print_result(&result);
|
||||
}
|
||||
Commands::ScanAll { verbose } => {
|
||||
println!("{}", "🔍 Scanne alle installierten AUR-Pakete...".cyan());
|
||||
let results = scanner.scan_all_installed(verbose).await?;
|
||||
for result in results {
|
||||
print_result(&result);
|
||||
println!();
|
||||
}
|
||||
}
|
||||
Commands::CheckIoc { list } => {
|
||||
println!("{} {}", "🛡️ Prüfe IOC-Listen:".cyan(), list.yellow());
|
||||
let threats = scanner.check_iocs(&list).await?;
|
||||
if threats.is_empty() {
|
||||
println!("{}", "✅ Keine Bedrohungen gefunden!".green().bold());
|
||||
} else {
|
||||
println!("{} {}", "⚠️ Bedrohungen gefunden:".red().bold(), threats.len());
|
||||
for threat in threats {
|
||||
println!(" {} {} - {}", "🔴".red(), threat.package, threat.reason);
|
||||
}
|
||||
}
|
||||
}
|
||||
Commands::Allow { package } => {
|
||||
scanner.allow_package(&package)?;
|
||||
println!("{} {}", "✅ Erlaubt:".green(), package);
|
||||
}
|
||||
Commands::Deny { package } => {
|
||||
scanner.deny_package(&package)?;
|
||||
println!("{} {}", "❌ Entfernt:".yellow(), package);
|
||||
}
|
||||
Commands::Config => {
|
||||
println!("{}", "⚙️ AegisAUR Konfiguration".cyan().bold());
|
||||
println!("Config-Path: {}", scanner.config_path()?.display());
|
||||
println!("Cache-Path: {}", scanner.cache_path()?.display());
|
||||
}
|
||||
Commands::InstallHook => {
|
||||
hook::install_alpm_hook()?;
|
||||
println!("{}", "✅ ALPM-Hook installiert".green().bold());
|
||||
}
|
||||
Commands::RemoveHook => {
|
||||
hook::remove_alpm_hook()?;
|
||||
println!("{}", "❌ ALPM-Hook entfernt".yellow().bold());
|
||||
}
|
||||
Commands::Cache => {
|
||||
scanner.show_cache_status().await?;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn print_result(result: &scanner::ScanResult) {
|
||||
let score_color = match result.score {
|
||||
0..=30 => "🔴".red(),
|
||||
31..=60 => "🟡".yellow(),
|
||||
61..=100 => "🟢".green(),
|
||||
_ => "⚪".white(),
|
||||
};
|
||||
|
||||
println!(
|
||||
"{} {} {} {} {}",
|
||||
score_color,
|
||||
result.package.bold(),
|
||||
format!("({}/100)", result.score).dimmed(),
|
||||
"-".dimmed(),
|
||||
result.status_message()
|
||||
);
|
||||
|
||||
if !result.warnings.is_empty() {
|
||||
for warning in &result.warnings {
|
||||
println!(" {} {}", "⚠️ ".yellow(), warning);
|
||||
}
|
||||
}
|
||||
|
||||
if !result.ioc_matches.is_empty() {
|
||||
for ioc in &result.ioc_matches {
|
||||
println!(" {} {} - {}", "🚨".red().bold(), "IOC MATCH!".red().bold(), ioc);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user