42个版本
新 0.8.11 | 2024年7月29日 |
---|---|
0.8.3 | 2024年6月24日 |
0.6.0-alpha.8 | 2024年2月23日 |
0.5.4 | 2023年10月27日 |
#688 在 解析器实现 中
1,349 每月下载量
用于 3 个 仓库(其中2个直接使用)
150KB
4K SLoC
CSAF Walker
"遍历"远程服务器上的CSAF数据,允许用户处理这些数据。
此外,该仓库还包含一个用于处理SBOM数据的工具。大多数选项对SBOM和CSAF都有效。
从命令行
有一个可以直接使用的命令行工具。
安装
从GitHub发布页面下载一个可运行的二进制文件: https://github.com/ctron/csaf-walker/releases
您也可以使用 cargo binstall
安装此类二进制文件
cargo binstall csaf-cli
cargo binstall sbom-cli
或者自己编译,使用纯 cargo install
cargo install csaf-cli
cargo install sbom-cli
使用
您可以通过提供CSAF信任提供者的域名来下载所有文档
mkdir out
csaf sync -3 -v -d out/ redhat.com
也可以只下载文件,跳过验证步骤(稍后可以使用已下载的副本进行)
mkdir out
csaf download -3 -v -d out/ redhat.com
[!NOTE] 在数据使用GPG v3签名的情况下,您可以使用
-3
标志,该标志认为这是有效的。另一种选择是使用
--policy-date
参数,并提供一个手动策略日期。另请参阅: https://docs.sequoia-pgp.org/sequoia_openpgp/policy/struct.StandardPolicy.html.
差异同步
默认情况下,HTTP服务器报告的时间戳将应用于下载的文件。当重新运行时,将使用 changes.csv
文件作为源来发现文件何时更改。如果一个文件已经存在并且在 changes.csv
文件中有一个较新的修改时间戳,那么它将被重新下载。否则,它将被跳过。
使用 --since
选项,可以提供一个起始时间戳,这将跳过在此时间戳之前报告的所有更改,并强制在此时间戳之后(独立于文件的本地文件时间戳)的所有更改重新同步。
使用 --since-file
选项,可以通过从文件中初始加载“since”值,并在成功运行结束时将其存储到文件中来自动化“since”值。存储的时间戳将是应用程序开始处理时的戳记。
如果同时提供了 --since
和 --since-file
,则首先使用“since file”,如果文件不存在,则“since”值将作为后备使用。
发送数据
除了存储之外,还可以将数据发送到远程实例(使用 Vexination 或 Bombastic API)。
csaf send -3 redhat.com https://127.0.0.1:8083
当然,也可以将文件系统用作源
csaf send -3 file:out/ https://127.0.0.1:8083
作为库
使用 csaf-walker
库,这也可以用作库
use anyhow::Result;
use url::Url;
use csaf_walker::source::HttpSource;
use csaf_walker::walker::Walker;
use csaf_walker::retrieve::RetrievingVisitor;
use csaf_walker::validation::{ValidatedAdvisory, ValidationError, ValidationVisitor};
use walker_common::fetcher::Fetcher;
async fn walk() -> Result<()> {
let fetcher = Fetcher::new(Default::default()).await?;
let metadata = MetadataRetriever::new("redhat.com");
let source = HttpSource::new(metadata, fetcher, Default::default());
Walker::new(source.clone())
.walk(RetrievingVisitor::new(
source.clone(),
ValidationVisitor::new(
move |advisory: Result<ValidatedAdvisory, ValidationError>| async move {
log::info!("Found advisory: {advisory:?}");
Ok::<_, anyhow::Error>(())
},
)
))
.await?;
Ok(())
}
依赖项
~39–57MB
~1M SLoC