feat: implemented the whole process

This commit is contained in:
Didier Slof 2023-07-13 22:47:09 +02:00
parent 4bd99c44ec
commit e5cbd9f9e5
Signed by: didier
GPG key ID: 01E71F18AA4398E5
9 changed files with 64 additions and 25 deletions

View file

@ -13,3 +13,4 @@ serde = { version = "1.0.171", features = ["derive"] }
regex = "1.9.1"
reqwest = { version = "0.11.18", features = ["blocking"] }
uuid = { version = "1.4.0", features = ["serde", "v4"] }
tar = "0.4.39"

View file

@ -1,6 +1,5 @@
pub enum Command {
Strap,
Unpack,
None,
}
@ -8,7 +7,6 @@ impl From<String> for Command {
fn from(value: String) -> Self {
match value.to_lowercase().as_str() {
"strap" => Command::Strap,
"unpack" => Command::Unpack,
_ => Command::None,
}
}

View file

@ -1,7 +1,7 @@
use std::env;
use std::env::temp_dir;
use std::fs::{create_dir_all, File, remove_dir_all};
use std::io::Write;
use std::fs::{create_dir_all, remove_dir_all};
use std::io::Cursor;
use std::process::exit;
use uuid::Uuid;
@ -9,6 +9,7 @@ use uuid::Uuid;
use pkgfile::PKGFile;
use crate::args::{Args, Command};
use crate::prelude::run_bootstrap;
mod args;
mod prelude;
@ -67,27 +68,25 @@ fn main() {
create_dir_all(&tmp_dir)
.expect("Could not create tmp dir.");
println!("** extracting pkgtar...");
{
println!("** writing tar to tmp file...");
let mut file = File::create(format!("{}/pkgtar", tmp_dir.to_str().unwrap_or("/tmp")))
.expect("Could not create tmp pkgtar file");
file.write(&pkg.data)
.expect("Could not write pkgtar to tmp file");
let mut archive = tar::Archive::new(Cursor::new(pkg.data));
archive.unpack(format!("{}/contents", &tmp_dir.to_str().unwrap()))
.expect("Could not extract archive");
}
env::set_current_dir(format!("{}/contents", &tmp_dir.to_str().unwrap()))
.expect("could not enter tmp dir");
// TODO: untar
// TODO: cd into pkg
// TODO: run bootstrap commands
println!("** running bootstrap commands...");
let res_bootstrap = run_bootstrap(mani);
println!("** removing temporary directory...");
remove_dir_all(&tmp_dir)
.expect(&*format!("Could not remove tmp dir: {}", &tmp_dir.to_str().unwrap()));
exit(if res_bootstrap { println!("!! bootstrap success"); 0 } else { 1 })
}
Command::Unpack => {}
_ => {
println!("Unsupported command, allowed commands: strap/unpack.");
println!("Unsupported command, allowed commands: strap.");
exit(1);
}
}

View file

@ -12,8 +12,8 @@ pub struct PKGR {
#[derive(Serialize, Deserialize)]
pub struct Bootstrap {
check_installed_commands: Vec<String>,
commands: Vec<String>
pub check_installed_commands: Vec<String>,
pub commands: Vec<String>
}
#[derive(Serialize, Deserialize)]
@ -33,3 +33,34 @@ pub fn mani_from_str(s: &str) -> Manifest<Option<PKGR>> {
pkgr: bmani.pkgr
}
}
pub fn run_bootstrap(mani: Manifest<Option<PKGR>>) -> bool {
if let Some(pkgr) = mani.pkgr {
if let Some(bootstrap) = pkgr.bootstrap {
fn run_command<S: Into<String>>(s: S) -> i32 {
std::process::Command::new("sh")
.arg("-c")
.arg(s.into())
.spawn().expect("Could not spawn process.")
.wait().expect("Could not wait for process.")
.code().expect("Could not fetch exit code.")
}
for command in &bootstrap.check_installed_commands {
if run_command(command) != 0 {
println!("!! Command failed: {}", command);
println!("!! Already installed.");
return false
}
}
for command in &bootstrap.commands {
if run_command(command) != 0 {
println!("!! Command failed: {}", command);
println!("!! Bootstrap failed!!!");
return false
}
}
}
}
return true
}

View file

@ -78,8 +78,8 @@ root = "/root" #*
# After the install script the build directory will be deleted and an CTREE (changed tree) will be generated.
# Then the CTREE will be used to copy the files over.
[build]
build_script = "/scripts/build" # relative to pkg
install_script = "/scripts/install" # relative to pkg
build_script = "scripts/build" # relative to pkg
install_script = "scripts/install" # relative to pkg
[build.dependencies]
base = "latest,stable" # selected by default
@ -95,11 +95,13 @@ base = "latest,stable" # selected by default
# and only 1 release channel for pkgr
[pkgr.bootstrap]
## any non-zero = installed
check_installed_commands = [ "/scripts/check_installed" ]
check_installed_commands = [
"sh scripts/check_installed"
]
# any non-zero = fail
commands = [
"/scripts/bootstrap/download_latest @version /tmp/pkgr.pkg",
"/scripts/bootstrap/dirty_install /tmp/pkgr.pkg",
"/scripts/bootstrap/check_install"
"sh scripts/bootstrap/download_latest @version /tmp/pkgr.pkg",
"sh scripts/bootstrap/dirty_install /tmp/pkgr.pkg",
"sh scripts/check_installed"
]

View file

@ -0,0 +1,3 @@
#!/bin/sh
printf ""

View file

@ -1,7 +1,9 @@
#!/bin/sh
fetch_latest_version() {
printf ""
}
download_file() {
printf ""
}

View file

@ -0,0 +1,3 @@
#!/bin/sh
printf ""

View file

@ -13,7 +13,7 @@ impl TryFrom<Vec<u8>> for PKGFile {
.iter()
.map(|v| u32::from(*v))
.collect();
let manifest_size: u32 = ((header[1] << 8) | header[2]);
let manifest_size: u32 = (header[1] << 8) | header[2];
if manifest_size > value.len() as u32 {
return Err(());
}