integration-not-installation
trivernis 2 years ago
parent fae57a7e3f
commit 8d37f60cd7
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

36
Cargo.lock generated

@ -272,6 +272,16 @@ dependencies = [
"zip", "zip",
] ]
[[package]]
name = "cargo_toml"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd63e5969cd55839b1ff80d8694e7571667befbaee13bbc2fe7aabc7d2cc104c"
dependencies = [
"serde",
"toml",
]
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.0.73" version = "1.0.73"
@ -360,24 +370,37 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "3.2.22" version = "4.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86447ad904c7fb335a790c9d7fe3d0d971dc523b8ccd1561a520de9a85302750" checksum = "0a1af219c3e254a8b4649d6ddaef886b2015089f35f2ac5e1db31410c0566ab8"
dependencies = [ dependencies = [
"atty", "atty",
"bitflags", "bitflags",
"clap_derive",
"clap_lex", "clap_lex",
"indexmap", "once_cell",
"strsim", "strsim",
"termcolor", "termcolor",
"textwrap", ]
[[package]]
name = "clap_derive"
version = "4.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd114ae53ce5a0670f43d2f169c1cd26c69b4896b0c121900cf1e4d06d67316c"
dependencies = [
"heck",
"proc-macro-error",
"proc-macro2",
"quote",
"syn",
] ]
[[package]] [[package]]
name = "clap_lex" name = "clap_lex"
version = "0.2.4" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8"
dependencies = [ dependencies = [
"os_str_bytes", "os_str_bytes",
] ]
@ -3281,6 +3304,7 @@ dependencies = [
name = "tourmaline" name = "tourmaline"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"cargo_toml",
"clap", "clap",
"color-eyre", "color-eyre",
"dotenv", "dotenv",

@ -3,6 +3,9 @@ name = "tourmaline"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
[package.metadata]
codename = "Walter White"
[lib] [lib]
name = "tourmaline" name = "tourmaline"
@ -13,7 +16,7 @@ path = "src/main.rs"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
clap = "3.2.22" clap = { version = "4.0.7", features = ["derive"] }
color-eyre = "0.6.2" color-eyre = "0.6.2"
dotenv = "0.15.0" dotenv = "0.15.0"
lazy_static = "1.4.0" lazy_static = "1.4.0"
@ -29,3 +32,7 @@ thiserror = "1.0.35"
tokio = { version = "1.21.1", features = ["rt", "io-std", "io-util", "process", "time", "macros", "tracing", "fs"] } tokio = { version = "1.21.1", features = ["rt", "io-std", "io-util", "process", "time", "macros", "tracing", "fs"] }
tracing = "0.1.36" tracing = "0.1.36"
tracing-subscriber = "0.3.15" tracing-subscriber = "0.3.15"
[build-dependencies]
cargo_toml = "0.12.3"
serde = { version = "1.0.144", features = ["derive"] }

@ -0,0 +1,20 @@
use serde::Deserialize;
use std::path::PathBuf;
use cargo_toml::Manifest;
#[derive(Clone, Debug, Deserialize)]
struct Metadata {
codename: String,
}
fn main() {
let manifest = Manifest::<Metadata>::from_path_with_metadata(PathBuf::from("Cargo.toml"))
.expect("Failed to read manifest (Cargo.toml)");
if let Some(package) = manifest.package {
if let Some(metadata) = package.metadata {
println!("cargo:rustc-env=TOURMALINE_CODENAME={}", metadata.codename);
}
}
}

@ -0,0 +1,43 @@
use std::path::PathBuf;
use clap::Parser;
use clap::Subcommand;
const VERSION: &str = concat!(
env!("CARGO_PKG_VERSION"),
" (",
env!("TOURMALINE_CODENAME"),
")",
);
#[derive(Debug, Clone, Parser)]
#[clap(bin_name = "trm", name = "Tourmaline", version=VERSION, about= env!("CARGO_PKG_DESCRIPTION"), infer_subcommands = true)]
pub struct Args {
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Clone, Subcommand)]
pub enum Command {
/// Installs the system from the given config
#[command()]
InstallFromConfig(InstallFromConfigArgs),
/// Generates empty script files for the installation
#[command()]
GenerateScripts(GenerateScriptsArgs),
}
#[derive(Debug, Clone, Parser)]
pub struct InstallFromConfigArgs {
/// The path to the json config file
#[arg()]
pub path: PathBuf,
}
#[derive(Debug, Clone, Parser)]
pub struct GenerateScriptsArgs {
/// The path to the folder where the scripts should be generated in
#[arg()]
pub path: PathBuf,
}

@ -31,6 +31,14 @@ pub struct TaskExecutor {
} }
impl TaskExecutor { impl TaskExecutor {
/// Creates a new task executor with a given config
pub fn with_config(config: Config) -> Self {
Self {
config: Some(config),
loader: ScriptLoader::new(),
}
}
tasks!( tasks!(
setup_users => SetupUsersScript, setup_users => SetupUsersScript,
configure_network => ConfigureNetworkScript, configure_network => ConfigureNetworkScript,

@ -1,30 +1,45 @@
use tourmaline::{ use args::{Args, Command, GenerateScriptsArgs, InstallFromConfigArgs};
tasks::{User, UsersConfig}, use clap::Parser;
TaskExecutor, use miette::{Context, IntoDiagnostic};
}; use tokio::{fs::OpenOptions, io::AsyncReadExt};
use tourmaline::{config::Config, error::AppResult, generate_script_files, TaskExecutor};
mod args;
#[tokio::main(flavor = "current_thread")] #[tokio::main(flavor = "current_thread")]
async fn main() -> miette::Result<()> { async fn main() {
color_eyre::install().unwrap(); color_eyre::install().unwrap();
dotenv::dotenv().unwrap(); dotenv::dotenv().unwrap();
let executor = TaskExecutor::default(); let args = Args::parse();
let user_cfg = UsersConfig {
users: vec![ match args.command {
User { Command::InstallFromConfig(args) => install_from_config(args).await,
name: String::from("test"), Command::GenerateScripts(args) => generate_scripts(args).await,
password: String::from("password"), }
sudoer: false, .unwrap();
shell: String::from("/bin/zsh"), }
},
User { async fn install_from_config(args: InstallFromConfigArgs) -> AppResult<()> {
name: String::from("test2"), let mut file = OpenOptions::new()
password: String::from("superpassword"), .read(true)
sudoer: true, .open(args.path)
shell: String::from("/bin/nu"), .await
}, .into_diagnostic()
], .context("Could not read file")?;
}; let mut cfg_contents = String::new();
executor.setup_users(&user_cfg).await?; file.read_to_string(&mut cfg_contents)
.await
.into_diagnostic()
.context("Could not read file")?;
let config: Config = serde_json::from_str(&cfg_contents)
.into_diagnostic()
.context("Could not parse config as JSON")?;
TaskExecutor::with_config(config)
.install_from_config()
.await
}
Ok(()) async fn generate_scripts(args: GenerateScriptsArgs) -> AppResult<()> {
generate_script_files(args.path).await
} }

@ -16,6 +16,16 @@ lazy_static::lazy_static! {
} }
pub async fn generate_script_files<P: AsRef<Path>>(output: P) -> AppResult<()> { pub async fn generate_script_files<P: AsRef<Path>>(output: P) -> AppResult<()> {
let script_path = output.as_ref().join("scripts");
let hook_path = output.as_ref().join("hooks");
if !script_path.exists() {
fs::create_dir_all(&script_path).await?;
}
if !hook_path.exists() {
fs::create_dir_all(&hook_path).await?;
}
let tasks = all_tasks(); let tasks = all_tasks();
for task in tasks { for task in tasks {

Loading…
Cancel
Save