1 个不稳定版本
0.6.1 | 2021 年 8 月 29 日 |
---|
#2236 在 解析器实现
325KB
3.5K SLoC
RPM-RS
用于解析和创建 RPM 文件的纯 Rust 库。
目标
- 易于使用的 API
- 纯 Rust,便于在大型项目中使用
- 与 Spec 文件的独立性。纯程序接口用于打包。
- 与 CentOS 7 / Fedora 兼容(我可能还会扩展 SUSE 的测试用例)
非目标
RPM 有许多晦涩难懂的功能。我不想重新实现它们全部。此库专注于我认为有用的功能。此库不构建软件,如 rpmbuild。它用于需要打包为 RPM 的成品工件。
状态
- RPM 创建
- 基本 RPM 读取
- RPM 签名和签名验证
- RPM 读取的高级 API
示例
use rpm;
use rpm::signature::pgp::{Signer,Verifier};
let raw_secret_key = std::fs::read("/path/to/gpg.secret.key")?;
let pkg = rpm::RPMBuilder::new("test", "1.0.0", "MIT", "x86_64", "some awesome package")
.compression(rpm::Compressor::from_str("gzip")?)
.with_file(
"./awesome-config.toml",
RPMFileOptions::new("/etc/awesome/config.toml").is_config(),
)?
// file mode is inherited from source file
.with_file(
"./awesome-bin",
RPMFileOptions::new("/usr/bin/awesome"),
)?
.with_file(
"./awesome-config.toml",
// you can set a custom mode and custom user too
RPMFileOptions::new("/etc/awesome/second.toml").mode(0o100744).user("hugo"),
)?
.pre_install_script("echo preinst")
.add_changelog_entry("me", "was awesome, eh?", 123123123)
.add_changelog_entry("you", "yeah, it was", 12312312)
.requires(Dependency::any("wget"))
.build_and_sign(Signer::load_from_asc_bytes(&raw_secret_key)?)
let mut f = std::fs::File::create("./awesome.rpm")?;
pkg.write(&mut f)?;
// reading
let raw_pub_key = std::fs::read("/path/to/gpg.key.pub")?;
let rpm_file = std::fs::File::open("test_assets/389-ds-base-devel-1.3.8.4-15.el7.x86_64.rpm")?;
let mut buf_reader = std::io::BufReader::new(rpm_file);
let pkg = rpm::RPMPackage::parse(&mut buf_reader)?;
// verifying
pkg.verify_signature(Verifier::load_from_asc_bytes(&raw_pub_key)?)?;
依赖项
~8–11MB
~201K SLoC