WIP: Add Capability to generate manifest file

This commit is contained in:
Till Wegmueller 2021-04-13 22:20:43 -03:00
parent 29090eca35
commit bae6f32d88
7 changed files with 242 additions and 15 deletions

3
.idea/vcs.xml generated
View file

@ -2,8 +2,5 @@
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" /> <mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../pkg6depotd" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../pkg6dev" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../pkg6repo" vcs="Git" />
</component> </component>
</project> </project>

124
Cargo.lock generated
View file

@ -44,12 +44,52 @@ dependencies = [
"rustc-demangle", "rustc-demangle",
] ]
[[package]]
name = "block-buffer"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
dependencies = [
"block-padding",
"generic-array",
]
[[package]]
name = "block-padding"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae"
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
version = "1.0.0" version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cpuid-bool"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634"
[[package]]
name = "crc32fast"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
dependencies = [
"cfg-if",
]
[[package]]
name = "digest"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
dependencies = [
"generic-array",
]
[[package]] [[package]]
name = "failure" name = "failure"
version = "0.1.8" version = "0.1.8"
@ -72,12 +112,40 @@ dependencies = [
"synstructure", "synstructure",
] ]
[[package]]
name = "flate2"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0"
dependencies = [
"cfg-if",
"crc32fast",
"libc",
"miniz_oxide",
]
[[package]]
name = "generic-array"
version = "0.14.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
dependencies = [
"typenum",
"version_check",
]
[[package]] [[package]]
name = "gimli" name = "gimli"
version = "0.23.0" version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce"
[[package]]
name = "keccak"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.90" version = "0.2.90"
@ -90,7 +158,10 @@ version = "0.0.2-placeholder"
dependencies = [ dependencies = [
"failure", "failure",
"maplit", "maplit",
"object",
"regex", "regex",
"sha2",
"sha3",
] ]
[[package]] [[package]]
@ -120,6 +191,16 @@ name = "object"
version = "0.23.0" version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4"
dependencies = [
"flate2",
"wasmparser",
]
[[package]]
name = "opaque-debug"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
[[package]] [[package]]
name = "pkg6depotd" name = "pkg6depotd"
@ -174,6 +255,31 @@ version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232"
[[package]]
name = "sha2"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa827a14b29ab7f44778d14a88d3cb76e949c45083f7dbfa507d0cb699dc12de"
dependencies = [
"block-buffer",
"cfg-if",
"cpuid-bool",
"digest",
"opaque-debug",
]
[[package]]
name = "sha3"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809"
dependencies = [
"block-buffer",
"digest",
"keccak",
"opaque-debug",
]
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.64" version = "1.0.64"
@ -197,8 +303,26 @@ dependencies = [
"unicode-xid", "unicode-xid",
] ]
[[package]]
name = "typenum"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06"
[[package]] [[package]]
name = "unicode-xid" name = "unicode-xid"
version = "0.2.1" version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
[[package]]
name = "version_check"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
[[package]]
name = "wasmparser"
version = "0.57.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32fddd575d477c6e9702484139cf9f23dcd554b06d185ed0f56c857dd3a47aa6"

View file

@ -19,3 +19,6 @@ keywords = ["packaging", "illumos"]
regex = "1.3.7" regex = "1.3.7"
failure = "0.1.8" failure = "0.1.8"
maplit = "0.1.6" maplit = "0.1.6"
object = "0.23.0"
sha2 = "0.9.3"
sha3 = "0.9.1"

View file

@ -15,8 +15,9 @@ use crate::payload::Payload;
use std::clone::Clone; use std::clone::Clone;
use crate::digest::Digest; use crate::digest::Digest;
use std::str::FromStr; use std::str::FromStr;
use std::path::{Path, PathBuf};
trait FacetedAction { pub trait FacetedAction {
// Add a facet to the action if the facet is already present the function returns false. // Add a facet to the action if the facet is already present the function returns false.
fn add_facet(&mut self, facet: Facet) -> bool; fn add_facet(&mut self, facet: Facet) -> bool;
@ -33,7 +34,7 @@ pub struct Action {
} }
impl Action { impl Action {
fn new(kind: ActionKind) -> Action{ pub fn new(kind: ActionKind) -> Action{
Action{ Action{
kind, kind,
payload: Payload::default(), payload: Payload::default(),
@ -90,6 +91,21 @@ pub struct File {
pub facets: HashSet<Facet>, pub facets: HashSet<Facet>,
} }
impl File {
pub fn read_from_path(p: &Path) -> Result<File, Error> {
let mut f = File::default();
f.payload = Payload::compute_payload(p)?;
match p.to_str() {
Some(str) => f.path = str.to_string(),
None => return Err(FileError::FilePathIsNoStringError)?,
}
//TODO group owner mode
Ok(f)
}
}
impl FacetedAction for File { impl FacetedAction for File {
fn add_facet(&mut self, facet: Facet) -> bool { fn add_facet(&mut self, facet: Facet) -> bool {
return self.facets.insert(facet) return self.facets.insert(facet)
@ -100,6 +116,12 @@ impl FacetedAction for File {
} }
} }
#[derive(Debug, Fail)]
pub enum FileError {
#[fail(display = "file path is not a string")]
FilePathIsNoStringError,
}
//TODO implement multiple FMRI for require-any //TODO implement multiple FMRI for require-any
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct Dependency { pub struct Dependency {
@ -157,10 +179,14 @@ impl Manifest {
dependencies: Vec::new(), dependencies: Vec::new(),
}; };
} }
pub fn add_file(&mut self, f: File) {
self.files.push(f);
}
} }
#[derive(Debug)] #[derive(Debug)]
enum ActionKind { pub enum ActionKind {
Attr, Attr,
Dir, Dir,
File, File,

View file

@ -4,6 +4,10 @@
// obtain one at https://mozilla.org/MPL/2.0/. // obtain one at https://mozilla.org/MPL/2.0/.
use std::str::FromStr; use std::str::FromStr;
use sha2::{Digest as Sha2Digest};
use sha3::{Digest as Sha3Digest};
static DEFAULT_ALGORITHM: DigestAlgorithm = DigestAlgorithm::SHA512;
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub enum DigestAlgorithm { pub enum DigestAlgorithm {
@ -85,6 +89,35 @@ impl FromStr for Digest {
} }
} }
impl Digest {
pub fn from_bytes(b: &[u8], algo: DigestAlgorithm, src: DigestSource) -> Result<Self, failure::Error> {
let hash = match algo {
DigestAlgorithm::SHA256=> {
format!("{:x}", sha2::Sha256::digest(b))
}
DigestAlgorithm::SHA512Half => {
format!("{:x}", sha2::Sha512Trunc256::digest(b))
}
DigestAlgorithm::SHA512 => {
format!("{:x}", sha2::Sha512::digest(b))
}
DigestAlgorithm::SHA3512Half | DigestAlgorithm::SHA3256 => {
format!("{:x}", sha3::Sha3_256::digest(b))
}
DigestAlgorithm::SHA3512 | _ => {
format!("{:x}", sha3::Sha3_512::digest(b))
}
};
Ok(Digest{
source: src,
algorithm: algo,
hash,
})
}
}
#[derive(Debug, Fail)] #[derive(Debug, Fail)]
pub enum DigestError { pub enum DigestError {
#[fail(display = "hashing algorithm {} is not known by this library", algorithm)] #[fail(display = "hashing algorithm {} is not known by this library", algorithm)]

View file

@ -3,9 +3,9 @@
// MPL was not distributed with this file, You can // MPL was not distributed with this file, You can
// obtain one at https://mozilla.org/MPL/2.0/. // obtain one at https://mozilla.org/MPL/2.0/.
mod actions; pub mod actions;
mod digest; pub mod digest;
mod payload; pub mod payload;
#[macro_use] extern crate failure; #[macro_use] extern crate failure;
#[macro_use] extern crate maplit; #[macro_use] extern crate maplit;

View file

@ -3,19 +3,22 @@
// MPL was not distributed with this file, You can // MPL was not distributed with this file, You can
// obtain one at https://mozilla.org/MPL/2.0/. // obtain one at https://mozilla.org/MPL/2.0/.
use crate::digest::Digest; use crate::digest::{Digest, DigestAlgorithm, DigestSource};
use failure::Error;
use object::Object;
use std::path::Path;
#[derive(Debug)] #[derive(Debug, PartialEq)]
pub enum PayloadCompressionAlgorithm { pub enum PayloadCompressionAlgorithm {
Gzip, Gzip,
LZ4 LZ4
} }
impl Default for PayloadCompressionAlgorithm { impl Default for PayloadCompressionAlgorithm {
fn default() -> Self { PayloadCompressionAlgorithm::Gzip } fn default() -> Self { PayloadCompressionAlgorithm::LZ4 }
} }
#[derive(Debug)] #[derive(Debug, PartialEq)]
pub enum PayloadBits { pub enum PayloadBits {
Independent, Independent,
Bits32, Bits32,
@ -26,7 +29,7 @@ impl Default for PayloadBits {
fn default() -> Self { PayloadBits::Independent } fn default() -> Self { PayloadBits::Independent }
} }
#[derive(Debug)] #[derive(Debug, PartialEq)]
pub enum PayloadArchitecture { pub enum PayloadArchitecture {
NOARCH, NOARCH,
I386, I386,
@ -47,3 +50,44 @@ pub struct Payload {
pub bitness: PayloadBits, pub bitness: PayloadBits,
pub architecture: PayloadArchitecture, pub architecture: PayloadArchitecture,
} }
impl Payload {
pub fn is_elf(&self) -> bool {
self.architecture == PayloadArchitecture::NOARCH && self.bitness == PayloadBits::Independent
}
pub fn compute_payload(path: &Path) -> Result<Self, Error> {
let f = std::fs::read(path)?;
let (bitness, architecture) = match object::File::parse(f.as_slice()) {
Ok(bin) => {
let bitness = if bin.is_64() {
PayloadBits::Bits64
} else {
PayloadBits::Bits32
};
let architecture = match bin.architecture() {
object::Architecture::X86_64 | object::Architecture::I386 => {
PayloadArchitecture::I386
}
object::Architecture::Aarch64 | object::Architecture::Arm => {
PayloadArchitecture::ARM
}
_ => PayloadArchitecture::NOARCH,
};
(bitness, architecture)
}
Err(_) => (PayloadBits::Independent, PayloadArchitecture::NOARCH),
};
Ok(Payload{
primary_identifier:Digest::from_bytes(f.as_slice(), DigestAlgorithm::SHA3512, DigestSource::PrimaryPayloadHash)?,
additional_identifiers: Vec::<Digest>::new(),
compression_algorithm: PayloadCompressionAlgorithm::default(),
bitness,
architecture
})
}
}