From 946f13f35cd3542d0b271ac5eb57755b0ec3ea2b Mon Sep 17 00:00:00 2001 From: Jia Chao Date: Tue, 23 Jul 2024 11:09:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=8E=B0=E6=9C=89=E5=8F=AF?= =?UTF-8?q?=E7=94=A8=E6=9B=B4=E6=96=B0=E7=9A=84=20saID=20=E9=9B=86?= =?UTF-8?q?=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jia Chao --- Cargo.toml | 1 + src/analyzer/db.rs | 12 ++++++++---- src/analyzer/mod.rs | 44 +++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index bfadf7e..e8f4d44 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,3 +10,4 @@ toml = { version = "0.8" } updateinfo-xmlparser = { git = "https://git.zhgsun.com:8089/jiachao2130/updateinfo-xmlparser.git", version = "0.1.0" } cvrf-xmlparser = { git = "https://git.zhgsun.com:8089/jiachao2130/cvrf-xmlparser.git", version = "0.1.0" } rpm-rs = { git = "https://git.zhgsun.com:8089/jiachao2130/rpm-rs.git", version = "0.1.0" } +lazy_static = { version = "1.5" } diff --git a/src/analyzer/db.rs b/src/analyzer/db.rs index b5dc7fb..fd48e3e 100644 --- a/src/analyzer/db.rs +++ b/src/analyzer/db.rs @@ -7,13 +7,13 @@ use updateinfo_xmlparser::{UpdateInfoDb, RpmInfo}; // PackageDb 从 updateinfo 中获取 // 以包名为键,值为一个 Vector ,里面包含更新的不同版本的 rpm 包信息 #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct PacakgeDb { +pub struct PackgeDb { db: HashMap>, } -impl PacakgeDb { +impl PackgeDb { pub fn new() -> Self { - PacakgeDb { + PackgeDb { db: HashMap::new(), } } @@ -31,6 +31,10 @@ impl PacakgeDb { } } } + + pub fn db(&self) -> &HashMap> { + &self.db + } } // SaDb 为精简版的安全公告集 @@ -98,7 +102,7 @@ mod test { let mut updatedb = UpdateInfoDb::new(); updatedb.load_xml(&updatexml).unwrap(); - let mut pkgdb = PacakgeDb::new(); + let mut pkgdb = PackgeDb::new(); pkgdb.load_from_updateinfodb(&updatedb); let bash_pkgs = pkgdb.db.get("bash").unwrap(); diff --git a/src/analyzer/mod.rs b/src/analyzer/mod.rs index c934a13..5146b6b 100644 --- a/src/analyzer/mod.rs +++ b/src/analyzer/mod.rs @@ -1,11 +1,26 @@ +use std::collections::HashSet; + +use lazy_static::lazy_static; use rpm_rs::rpm::{ get_installed_packages, Package, }; - use rpm_rs::rpmio::rpmvercmp; +use updateinfo_xmlparser::{UpdateInfoDb, RpmInfo}; use crate::cli::Cli; +use crate::analyzer::db::PackgeDb; + +lazy_static! { + pub static ref update_pkgs: PackgeDb= { + let mut updatedb = UpdateInfoDb::new(); + updatedb.load_xml("test/updateinfo.xml").unwrap(); + + let mut pkgdb = PackgeDb::new(); + pkgdb.load_from_updateinfodb(&updatedb); + pkgdb + }; +} pub mod db; @@ -42,6 +57,7 @@ fn repoter(cli: &Cli) -> crate::Result<()> { } fn summary(cli: &Cli) -> crate::Result<()> { + let mut sa_ids: HashSet = HashSet::new(); // 当前系统所有已安装的 rpm 包 let installed = get_installed_packages(); // installed 已被消费掉 @@ -54,8 +70,30 @@ fn summary(cli: &Cli) -> crate::Result<()> { latest }).collect(); - // 列出所有已安装的软件包 - // latest_installed.iter().for_each(|pkg| println!("{}", pkg.nevra())); + // 获取 sa 更新列表 + for pkg in latest_installed { + let name = pkg.name(); + if let Some(updates) = update_pkgs.db().get(name) { + for update in updates { + // epoch 判断 + match (update.epoch(), pkg.epoch()) { + (Some(_), None) => { + let _ = sa_ids.insert(update.sa().into()); + }, + (None, Some(_)) => continue, + _ => {} + } + + // evr 对比 + if rpmvercmp(&update.evr(), &pkg.evr()) > 0 { + sa_ids.insert(update.sa().into()); + } + } + } + } + + println!("{:#?}", sa_ids.len()); + // TODO: sa -> { rpms, cves } Ok(()) }