Files
dkl/src/lib.rs

97 lines
2.6 KiB
Rust
Raw Normal View History

2025-07-17 15:42:08 +02:00
pub mod apply;
2026-04-12 19:55:56 +02:00
pub mod rc;
pub mod cgroup;
pub mod human;
2025-07-17 15:42:08 +02:00
pub mod bootstrap;
2025-06-29 18:28:01 +02:00
pub mod dls;
2025-07-21 01:41:03 +02:00
pub mod dynlay;
pub mod fs;
2025-11-16 17:21:41 +01:00
pub mod logger;
pub mod proxy;
2025-07-17 15:42:08 +02:00
2025-11-16 17:21:41 +01:00
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
2025-07-17 15:42:08 +02:00
pub struct Config {
pub layers: Vec<String>,
pub root_user: RootUser,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub mounts: Vec<Mount>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub files: Vec<File>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub groups: Vec<Group>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub users: Vec<User>,
}
2025-11-16 17:21:41 +01:00
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
2025-07-17 15:42:08 +02:00
pub struct RootUser {
#[serde(skip_serializing_if = "Option::is_none")]
pub password_hash: Option<String>,
pub authorized_keys: Vec<String>,
}
2025-11-16 17:21:41 +01:00
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
2025-07-17 15:42:08 +02:00
pub struct Mount {
pub dev: String,
pub path: String,
2025-11-16 17:21:41 +01:00
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
2025-07-17 15:42:08 +02:00
pub options: Option<String>,
}
#[derive(Debug, serde::Deserialize, serde::Serialize)]
pub struct Group {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub gid: Option<u32>,
}
#[derive(Debug, serde::Deserialize, serde::Serialize)]
pub struct User {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub uid: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gid: Option<u32>,
}
2025-12-03 12:54:45 +01:00
#[derive(Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
2025-07-17 15:42:08 +02:00
pub struct File {
pub path: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub mode: Option<u32>,
#[serde(flatten)]
pub kind: FileKind,
}
2025-12-03 12:54:45 +01:00
#[derive(Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "lowercase")]
2025-07-17 15:42:08 +02:00
pub enum FileKind {
Content(String),
Content64(String),
2025-07-17 15:42:08 +02:00
Symlink(String),
Dir(bool),
}
2025-12-03 12:54:45 +01:00
// ------------------------------------------------------------------------
impl Config {
pub fn has_file(&self, path: &str) -> bool {
self.files.iter().any(|f| f.path == path)
}
pub fn file(&self, path: &str) -> Option<&File> {
self.files.iter().find(|f| f.path == path)
}
}
2026-02-10 21:23:11 +01:00
pub fn base64_decode(s: &str) -> Result<Vec<u8>, base64::DecodeError> {
2026-03-16 11:06:19 +01:00
use base64::{prelude::BASE64_STANDARD_NO_PAD as B64, Engine as _};
2026-02-10 21:23:11 +01:00
B64.decode(s.trim_end_matches('='))
}
2026-03-16 11:06:19 +01:00
pub fn base64_encode(b: &[u8]) -> String {
use base64::{prelude::BASE64_STANDARD as B64, Engine as _};
B64.encode(b)
}