From b83441498313c2283ef6ca1d3c270babd590ac84 Mon Sep 17 00:00:00 2001 From: Ningyuan Li Date: Mon, 12 Jun 2023 15:07:39 +0900 Subject: [PATCH] added gen-manifest --- Cargo.lock | 91 ++++++++++++++++++++++++++++++ common/ipk/src/ipk.rs | 5 ++ common/ipk/src/lib.rs | 4 ++ packages/fw-extract/Cargo.toml | 2 +- packages/gen-manifest/Cargo.toml | 8 ++- packages/gen-manifest/src/hash.rs | 12 ++++ packages/gen-manifest/src/main.rs | 92 ++++++++++++++++++++++++++++++- packages/ipk-verify/Cargo.toml | 6 +- packages/ipk-verify/src/main.rs | 6 +- 9 files changed, 213 insertions(+), 13 deletions(-) create mode 100644 packages/gen-manifest/src/hash.rs diff --git a/Cargo.lock b/Cargo.lock index 332f291..6de2e21 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,6 +100,15 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "byteorder" version = "1.4.3" @@ -201,6 +210,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "cpufeatures" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.3.2" @@ -210,6 +228,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "csv" version = "1.2.2" @@ -249,6 +277,16 @@ dependencies = [ "zstd", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "dirs-next" version = "2.0.0" @@ -380,7 +418,21 @@ dependencies = [ name = "gen-manifest" version = "0.1.0" dependencies = [ + "clap", "ipk-lib", + "serde", + "serde_json", + "sha256", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", ] [[package]] @@ -412,6 +464,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "indexmap" version = "1.9.3" @@ -719,6 +777,27 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha256" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a975c1bc0941703000eaf232c4d8ce188d8d5408d6344b6b2c8c6262772828" +dependencies = [ + "hex", + "sha2", +] + [[package]] name = "strsim" version = "0.10.0" @@ -791,6 +870,12 @@ dependencies = [ "syn", ] +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + [[package]] name = "unicode-ident" version = "1.0.8" @@ -824,6 +909,12 @@ dependencies = [ "ipk-lib", ] +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/common/ipk/src/ipk.rs b/common/ipk/src/ipk.rs index 12b7e60..d28e599 100644 --- a/common/ipk/src/ipk.rs +++ b/common/ipk/src/ipk.rs @@ -2,6 +2,7 @@ use std::borrow::Cow; use std::collections::HashMap; use std::fs::File; use std::io::{Error, ErrorKind, Read}; +use std::path::Path; use debpkg::{Control, DebPkg}; use path_slash::CowExt; @@ -9,6 +10,10 @@ use path_slash::CowExt; use crate::{AppInfo, Component, Package, PackageInfo, ServiceInfo, Symlinks}; impl Package { + pub fn open>(path: P) -> Result { + return File::open(path.as_ref()).and_then(|file| Package::parse(file)); + } + pub fn parse(read: R) -> Result where R: Read, diff --git a/common/ipk/src/lib.rs b/common/ipk/src/lib.rs index 95b9615..a54f77d 100644 --- a/common/ipk/src/lib.rs +++ b/common/ipk/src/lib.rs @@ -31,9 +31,13 @@ pub struct PackageInfo { } #[derive(Debug, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] pub struct AppInfo { pub id: String, + pub version: String, pub r#type: String, + pub title: String, + pub app_description: Option, pub main: String, } diff --git a/packages/fw-extract/Cargo.toml b/packages/fw-extract/Cargo.toml index 433df16..19fab90 100644 --- a/packages/fw-extract/Cargo.toml +++ b/packages/fw-extract/Cargo.toml @@ -27,6 +27,6 @@ name = "webosbrew-toolbox-fw-symbols" section = "devel" assets = [ ["target/release/fw-extract", "usr/bin/webosbrew-fw-symbols-extract", "755"], - ["../../data/**/*", "usr/share/webosbrew/compat-checker/data/", "644"] + ["../../common/data/**/*", "usr/share/webosbrew/compat-checker/data/", "644"] ] features = ["linux-install"] \ No newline at end of file diff --git a/packages/gen-manifest/Cargo.toml b/packages/gen-manifest/Cargo.toml index cfe60a2..642c7b6 100644 --- a/packages/gen-manifest/Cargo.toml +++ b/packages/gen-manifest/Cargo.toml @@ -9,9 +9,11 @@ license = "Apache-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] - -[dependencies.ipk-lib] -path = "../../common/ipk" +serde = { version = "1.0.160", features = ["derive"] } +serde_json = "1.0.96" +clap = { version = "4.2.4", features = ["derive"] } +ipk-lib = { path = "../../common/ipk" } +sha256 = "1.1.3" [package.metadata.deb] name = "webosbrew-toolbox-gen-manifest" diff --git a/packages/gen-manifest/src/hash.rs b/packages/gen-manifest/src/hash.rs new file mode 100644 index 0000000..4f2b3df --- /dev/null +++ b/packages/gen-manifest/src/hash.rs @@ -0,0 +1,12 @@ +use std::io::Error; +use std::path::Path; + +use crate::IpkHash; + +impl IpkHash { + pub(crate) fn from>(path: P) -> Result { + return Ok(Self { + sha256: sha256::try_digest(path.as_ref())?, + }); + } +} diff --git a/packages/gen-manifest/src/main.rs b/packages/gen-manifest/src/main.rs index e7a11a9..a749359 100644 --- a/packages/gen-manifest/src/main.rs +++ b/packages/gen-manifest/src/main.rs @@ -1,3 +1,93 @@ +mod hash; + +use std::fs::File; +use std::path::PathBuf; + +use clap::{Parser, ValueEnum}; +use ipk_lib::Package; +use serde::{Serialize, Serializer}; + +#[derive(Parser, Debug)] +struct Args { + #[arg(short, long)] + appinfo: Option, + #[arg(short, long)] + pkgfile: PathBuf, + #[arg(short, long)] + output: Option, + #[arg(short, long)] + icon: String, + #[arg(short, long)] + link: String, + #[arg(short, long, value_enum)] + root: Option, +} + +#[derive(Debug, Clone, PartialEq, ValueEnum)] +enum RootRequired { + True, + False, + Optional, +} + +impl Serialize for RootRequired { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + return match self { + RootRequired::True => serializer.serialize_bool(true), + RootRequired::False => serializer.serialize_bool(false), + RootRequired::Optional => serializer.serialize_str("optional"), + }; + } +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +struct IpkHash { + sha256: String, +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +struct HomebrewManifest { + id: String, + version: String, + r#type: String, + title: String, + #[serde(skip_serializing_if = "Option::is_none")] + app_description: Option, + icon_url: String, + source_url: String, + #[serde(skip_serializing_if = "Option::is_none")] + root_required: Option, + ipk_url: String, + ipk_hash: IpkHash, +} + fn main() { - println!("Hello, world!"); + let args = Args::parse(); + if args.appinfo.is_some() { + eprintln!("--appinfo option is not needed anymore."); + } + let package = Package::open(&args.pkgfile).unwrap(); + let app_info = package.app.info; + let manifest = HomebrewManifest { + id: app_info.id, + version: app_info.version, + r#type: app_info.r#type, + title: app_info.title, + app_description: app_info.app_description, + icon_url: args.icon, + source_url: args.link, + root_required: args.root, + ipk_url: String::from(args.pkgfile.file_name().unwrap().to_string_lossy()), + ipk_hash: IpkHash::from(&args.pkgfile).unwrap(), + }; + if let Some(output) = args.output { + serde_json::to_writer_pretty(&mut File::create(&output).unwrap(), &manifest).unwrap(); + } else { + serde_json::to_writer_pretty(&mut std::io::stdout(), &manifest).unwrap(); + } } diff --git a/packages/ipk-verify/Cargo.toml b/packages/ipk-verify/Cargo.toml index ce6ce1a..25f529a 100644 --- a/packages/ipk-verify/Cargo.toml +++ b/packages/ipk-verify/Cargo.toml @@ -16,13 +16,9 @@ prettytable-rs = "^0.10" semver = "1.0.17" is-terminal = "0.4.7" term = "0.7.0" +clap = { version = "4.2.4", features = ["derive"] } verify-lib = { path = "../../common/verify", features = ["ipk"] } - -[dependencies.clap] -version = "4.2.4" -features = ["derive"] - [dependencies.fw-lib] path = "../../common/fw" diff --git a/packages/ipk-verify/src/main.rs b/packages/ipk-verify/src/main.rs index e78b811..8850374 100644 --- a/packages/ipk-verify/src/main.rs +++ b/packages/ipk-verify/src/main.rs @@ -3,7 +3,7 @@ use std::io::{Error, Write}; use std::iter; use std::path::PathBuf; -use clap::Parser; +use clap::{Parser, ValueEnum}; use is_terminal::IsTerminal; use prettytable::{Cell, Row, Table}; use semver::VersionReq; @@ -31,7 +31,7 @@ struct Args { debug: u8, } -#[derive(Debug, Clone, PartialEq, clap::ValueEnum)] +#[derive(Debug, Clone, PartialEq, ValueEnum)] pub enum OutputFormat { Markdown, Terminal, @@ -73,7 +73,7 @@ fn main() { eprintln!("No firmware found"); } for package in args.packages { - let package = match File::open(&package).and_then(|file| Package::parse(file)) { + let package = match Package::open(&package) { Ok(package) => package, Err(e) => { eprintln!(