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