Compare commits
8 Commits
v2.6.1
...
c8437c655c
| Author | SHA1 | Date | |
|---|---|---|---|
| c8437c655c | |||
| fe3752baf9 | |||
| f29dc650b4 | |||
| 5ebf1331bb | |||
| be0e10723a | |||
| 01b211d0c5 | |||
| 0ef1ae769e | |||
| afac751118 |
Generated
+112
-614
File diff suppressed because it is too large
Load Diff
+3
-2
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "init"
|
name = "init"
|
||||||
version = "2.6.0"
|
version = "2.6.5"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
@@ -28,6 +28,7 @@ unix_mode = "0.1.4"
|
|||||||
sys-info = "0.9.1"
|
sys-info = "0.9.1"
|
||||||
dkl = { git = "https://novit.tech/direktil/dkl", version = "1.0.0" }
|
dkl = { git = "https://novit.tech/direktil/dkl", version = "1.0.0" }
|
||||||
openssl = "0.10.73"
|
openssl = "0.10.73"
|
||||||
reqwest = { version = "0.13.1", features = ["native-tls"] }
|
#reqwest = { version = "0.13.1", features = ["native-tls", "system-proxy"], default-features = false }
|
||||||
|
reqwest = { git = "https://github.com/mcluseau/rs-reqwest", version = "0.13.1", features = ["native-tls", "system-proxy", "socks"], default-features = false }
|
||||||
glob = "0.3.3"
|
glob = "0.3.3"
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
|
|||||||
+59
-12
@@ -1,5 +1,5 @@
|
|||||||
use eyre::{format_err, Result};
|
use eyre::{format_err, Result};
|
||||||
use log::{info, warn};
|
use log::{debug, info, warn};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use tokio::{
|
use tokio::{
|
||||||
fs,
|
fs,
|
||||||
@@ -49,7 +49,7 @@ pub async fn bootstrap(cfg: Config) {
|
|||||||
.await;
|
.await;
|
||||||
|
|
||||||
let sys_cfg: dkl::Config = retry(async || {
|
let sys_cfg: dkl::Config = retry(async || {
|
||||||
let sys_cfg_bytes = seed_config(base_dir, &bs.seed, &verifier).await?;
|
let sys_cfg_bytes = seed_config(base_dir, &bs, &verifier).await?;
|
||||||
Ok(serde_yaml::from_slice(&sys_cfg_bytes)?)
|
Ok(serde_yaml::from_slice(&sys_cfg_bytes)?)
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
@@ -79,7 +79,30 @@ pub async fn bootstrap(cfg: Config) {
|
|||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
exec("chroot", &["/system", "update-ca-certificates"]).await
|
exec("chroot", &["/system", "update-ca-certificates"]).await;
|
||||||
|
|
||||||
|
// activate ttyS* consoles as needed
|
||||||
|
retry_or_ignore(async || {
|
||||||
|
const PATH: &str = "/system/etc/inittab";
|
||||||
|
let mut inittab = fs::read_to_string(PATH).await?;
|
||||||
|
let mut changed = false;
|
||||||
|
for opt in utils::cmdline().filter_map(|s| s.strip_prefix("console=ttyS")) {
|
||||||
|
info!("inittab: adding entry for ttyS{opt}");
|
||||||
|
changed = true;
|
||||||
|
|
||||||
|
let mut params = opt.split(',');
|
||||||
|
let num = params.next().unwrap();
|
||||||
|
let speed = params.next().unwrap_or("115200");
|
||||||
|
inittab.push_str(&format!(
|
||||||
|
"S{num}:12345:respawn:/sbin/agetty --noclear {speed} ttyS{num} linux\n"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
if changed {
|
||||||
|
fs::write(PATH, inittab.as_bytes()).await?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Verifier {
|
struct Verifier {
|
||||||
@@ -130,7 +153,7 @@ impl Verifier {
|
|||||||
|
|
||||||
async fn seed_config(
|
async fn seed_config(
|
||||||
base_dir: &str,
|
base_dir: &str,
|
||||||
seed_url: &Option<String>,
|
bs: &dkl::bootstrap::Bootstrap,
|
||||||
verifier: &Verifier,
|
verifier: &Verifier,
|
||||||
) -> Result<Vec<u8>> {
|
) -> Result<Vec<u8>> {
|
||||||
let cfg_path = &format!("{base_dir}/config.yaml");
|
let cfg_path = &format!("{base_dir}/config.yaml");
|
||||||
@@ -141,13 +164,12 @@ async fn seed_config(
|
|||||||
|
|
||||||
let bs_tar = "/bootstrap.tar";
|
let bs_tar = "/bootstrap.tar";
|
||||||
if !fs::try_exists(bs_tar).await? {
|
if !fs::try_exists(bs_tar).await? {
|
||||||
if let Some(seed_url) = seed_url.as_ref() {
|
if bs.seed.is_none() {
|
||||||
fetch_bootstrap(seed_url, bs_tar).await?;
|
|
||||||
} else {
|
|
||||||
return Err(format_err!(
|
return Err(format_err!(
|
||||||
"no {cfg_path}, no {bs_tar} and no seed, can't bootstrap"
|
"no {cfg_path}, no {bs_tar} and no seed URL, can't bootstrap"
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
fetch_bootstrap(bs, bs_tar).await?;
|
||||||
}
|
}
|
||||||
|
|
||||||
try_exec("tar", &["xf", bs_tar, "-C", base_dir]).await?;
|
try_exec("tar", &["xf", bs_tar, "-C", base_dir]).await?;
|
||||||
@@ -159,15 +181,41 @@ async fn seed_config(
|
|||||||
verifier.verify_path(&cfg_path).await
|
verifier.verify_path(&cfg_path).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn fetch_bootstrap(seed_url: &str, output_file: &str) -> Result<()> {
|
async fn fetch_bootstrap(bs: &dkl::bootstrap::Bootstrap, output_file: &str) -> Result<()> {
|
||||||
let seed_url: reqwest::Url = seed_url.parse()?;
|
let seed_url: reqwest::Url = (bs.seed.as_ref())
|
||||||
|
.ok_or(format_err!("no seed URL"))?
|
||||||
|
.parse()
|
||||||
|
.map_err(|e| format_err!("invalid seed URL: {e}"))?;
|
||||||
|
|
||||||
info!(
|
info!(
|
||||||
"fetching {output_file} from {}",
|
"fetching {output_file} from {}",
|
||||||
seed_url.host_str().unwrap_or("<no host>")
|
seed_url.host_str().unwrap_or("<no host>")
|
||||||
);
|
);
|
||||||
|
|
||||||
let resp = reqwest::get(seed_url).await?;
|
let mut builder = reqwest::Client::builder();
|
||||||
|
|
||||||
|
if let Some(ref proxy) = bs.seed_proxy {
|
||||||
|
debug!("using proxy {proxy}");
|
||||||
|
let proxy = reqwest::Proxy::all(proxy) //
|
||||||
|
.map_err(|e| format_err!("seed proxy setup failed: {e}"))?;
|
||||||
|
builder = builder.proxy(proxy);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(ref ca) = bs.seed_ca {
|
||||||
|
debug!("using custom CA certificate");
|
||||||
|
let ca = base64_decode(ca).map_err(|e| format_err!("invalid seed CA: decode: {e}"))?;
|
||||||
|
let ca = reqwest::Certificate::from_der(&ca)
|
||||||
|
.map_err(|e| format_err!("invalid seed CA: parse: {e}"))?;
|
||||||
|
builder = builder.tls_certs_only([ca]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(ref sn) = bs.seed_servername {
|
||||||
|
debug!("tls server name: {sn}");
|
||||||
|
builder = builder.tls_server_name(bs.seed_servername.clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
let req = builder.build()?.get(seed_url);
|
||||||
|
let resp = req.send().await?;
|
||||||
|
|
||||||
if !resp.status().is_success() {
|
if !resp.status().is_success() {
|
||||||
return Err(format_err!("HTTP request failed: {}", resp.status()));
|
return Err(format_err!("HTTP request failed: {}", resp.status()));
|
||||||
@@ -315,7 +363,6 @@ async fn mount_system(cfg: &dkl::Config, bs_cfg: &Config, bs_dir: &str, verifier
|
|||||||
if layer == "modules" && bs_cfg.modules.is_some() {
|
if layer == "modules" && bs_cfg.modules.is_some() {
|
||||||
continue; // take modules from initrd
|
continue; // take modules from initrd
|
||||||
}
|
}
|
||||||
|
|
||||||
mounter.mount(layer).await;
|
mounter.mount(layer).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@ static CMDLINE: LazyLock<String> = LazyLock::new(|| {
|
|||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
});
|
});
|
||||||
|
|
||||||
fn cmdline() -> impl Iterator<Item = &'static str> {
|
pub fn cmdline() -> impl Iterator<Item = &'static str> {
|
||||||
CMDLINE.split_ascii_whitespace()
|
CMDLINE.split_ascii_whitespace()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,8 +95,8 @@ lvm:
|
|||||||
#- dev: /dev/storage/bootstrap
|
#- dev: /dev/storage/bootstrap
|
||||||
#- dev: /dev/storage/dls
|
#- dev: /dev/storage/dls
|
||||||
|
|
||||||
signer_public_key: 'MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBe6Y3zGQUIHvVXoS5GI8irY8yoB0ozFpzn/cUykA46TkHdJ8xCEaaM1MpqMrfWgDtP/rA2KeE9HjVerLnEFD01uUAUh4/OYgCBDYJPhridVDoC78KOJpkWBj7Shl0Rp0AtETvatNPa1RRe15V7nDF/Nm75Y6O3IL29lYPQ6jqEGhR810='
|
signer_public_key: 'MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAd5sR4NqLtjSt8ESNlYWvuufYj7v+aYGDlgxQThcKbzDPVe639IfH94hHE0l9TAfyU94qtN/GpFyKJ68F/u2pu70A/umT1m24ELFDqXlQXqhTsH91r+nYUZ7due3EqSrvru/yjchNNRkpoCCu3QkDF25KnrYfWWHqj9ZIRlBTCJE9SwM='
|
||||||
bootstrap:
|
bootstrap:
|
||||||
dev: /dev/storage/bootstrap
|
dev: /dev/storage/bootstrap
|
||||||
seed: http://192.168.12.254:7606/public/download-set/host/m1/bootstrap.tar?set=ICIXKJJWA6U4RQESD3KQMWO3IBW6THG4FJUM2HUNFPTIODVSXGDPXTCHSFT6IOUZO6LBAG65QIGYUMIZA3TEHTPB6BXKUFONNUWKUWAJAQRE2GDEOC4RWAAAQA3DSZJXMNSDGN34NA5G2MJ2MJXW65DTORZGC4BOORQXEAAAAAACMICVFM
|
seed: http://192.168.12.254:7606/public/download-set/host/m1/bootstrap.tar?set=ICM5KUZDRAMJPMO5OWW6PSIFYF4AHMYLAQSBZVFUDNG4DQDEW6UFQQJQKMGIXPI4CFOZFVA4CXULRXCAHKX3WELVAYS246FM6SGSGHIOAQRE2GDEOC4RUAAAQA3GEZDFMUZDOMD4NA5CUOTCN5XXI43UOJQXALTUMFZAAAAAACHHUMRU
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user