diff --git a/Cargo.lock b/Cargo.lock index cd940ab..8d24753 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -218,9 +218,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.6.4" +version = "4.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e962dae2b1e5007fe9e3db363ddc43a8bf25546d279f7a8a4401204690e80c" +checksum = "e0a7a9bfdb35811f9e59832f0f05975114d2251b415fb534108e6f34060fd772" dependencies = [ "clap", "clap_lex", @@ -1038,9 +1038,9 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl" -version = "0.10.79" +version = "0.10.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf0b434746ee2832f4f0baf10137e1cabb18cbe6912c69e2e33263c45250f542" +checksum = "a45fa2aa886c42762255da344f0a0d313e254066c46aad76f300c3d3da62d967" dependencies = [ "bitflags", "cfg-if", @@ -1069,9 +1069,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.115" +version = "0.9.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "158fe5b292746440aa6e7a7e690e55aeb72d41505e2804c23c6973ad0e9c9781" +checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4" dependencies = [ "cc", "libc", @@ -1672,9 +1672,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.10" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68d6fdd9f81c2819c9a8b0e0cd91660e7746a8e6ea2ba7c6b2b057985f6bcb51" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ "bitflags", "bytes", @@ -2286,9 +2286,9 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] diff --git a/src/apply.rs b/src/apply.rs index a475483..4b50bf8 100644 --- a/src/apply.rs +++ b/src/apply.rs @@ -3,101 +3,75 @@ use log::info; use std::path::Path; use tokio::fs; -use crate::{base64_decode, File}; +use crate::{File, base64_decode}; pub async fn files(files: &[File], root: &str, dry_run: bool) -> Result<()> { for f in files { if let Err(e) = file(f, root, dry_run).await { - return Err(format_err!("{}: {e}", f.path)) + return Err(format_err!("{}: {e}", f.path)); } } Ok(()) } pub async fn file(file: &File, root: &str, dry_run: bool) -> Result<()> { - let path = chroot(root, &file.path); - let path = Path::new(&path); + let path = chroot(root, &file.path); + let path = Path::new(&path); - if !dry_run && let Some(parent) = path.parent() { - fs::create_dir_all(parent).await?; - } + if !dry_run && let Some(parent) = path.parent() { + fs::create_dir_all(parent).await?; + } - use crate::{FileKind as K, FilePart as P}; - match file.kind().as_ref() { - K::Skip => { - info!("{}: kind is skip", file.path); - return Ok(()) - }, - K::Content(content) => { - if dry_run { - info!( - "would create {} ({} bytes from content)", - file.path, - content.len() - ); - } else { - fs::write(path, content.as_bytes()).await?; - } - } - K::Content64(content) => { - let content = base64_decode(content)?; - if dry_run { - info!( - "would create {} ({} bytes from content64)", - file.path, - content.len() - ); - } else { - fs::write(path, content).await? - } - } - K::Parts(parts) => { - let mut assembly = Vec::new(); - for part in parts { - match part { - P::Content(content) => assembly.extend(content.as_bytes()), - P::Content64(content) => assembly.extend(base64_decode(content)?), - } - } - if dry_run { - info!( - "would create {} ({} bytes from parts)", - file.path, - assembly.len() - ); - } else { - fs::write(path, assembly).await? - } - } - K::Dir => { - if dry_run { - info!("would create {} (directory)", file.path); - } else { - fs::create_dir(path).await?; - } - } - K::Symlink(tgt) => { - if dry_run { - info!("would create {} (symlink to {})", file.path, tgt); - } else { - let _ = fs::remove_file(path).await; // we're ln --force - fs::symlink(tgt, path).await?; - } - } - } + let kind = file.kind(); + let content = kind.content()?; - if dry_run { + use crate::{FileKind as K}; + match kind.as_ref() { + K::Skip => { + info!("{}: kind is skip", file.path); return Ok(()); } - - if !file.is_symlink() { - set_perms(path, file.mode).await?; + K::Content(_) | K::Content64(_) | K::Parts(_) => { + let content = content.expect("this file kind should have content"); + if dry_run { + info!( + "would create {} ({} bytes)", + file.path, + content.len() + ); + } else { + fs::write(path, &content).await?; + } + } + K::Dir => { + if dry_run { + info!("would create {} (directory)", file.path); + } else { + fs::create_dir(path).await?; + } + } + K::Symlink(tgt) => { + if dry_run { + info!("would create {} (symlink to {})", file.path, tgt); + } else { + let _ = fs::remove_file(path).await; // we're ln --force + fs::symlink(tgt, path).await?; + } } - - info!("created {}", file.path); - Ok(()) } + if dry_run { + return Ok(()); + } + + if !file.is_symlink() { + set_perms(path, file.mode).await?; + } + + info!("created {}", file.path); + Ok(()) +} + pub async fn set_perms(path: impl AsRef, mode: Option) -> std::io::Result<()> { if let Some(mode) = mode.filter(|m| *m != 0) { use std::os::unix::fs::PermissionsExt; diff --git a/src/bin/dkl.rs b/src/bin/dkl.rs index 28872c0..4726be7 100644 --- a/src/bin/dkl.rs +++ b/src/bin/dkl.rs @@ -1,5 +1,5 @@ use clap::{CommandFactory, Parser, Subcommand}; -use eyre::{format_err, Result}; +use eyre::{Result, format_err}; use human_units::Duration; use log::{debug, error}; use std::net::SocketAddr; diff --git a/src/cgroup.rs b/src/cgroup.rs index f14f276..283d682 100644 --- a/src/cgroup.rs +++ b/src/cgroup.rs @@ -64,8 +64,8 @@ pub async fn ls( } use tabled::settings::{ - object::{Column, Row}, Alignment, Modify, + object::{Column, Row}, }; let mut table = table.build(); table.with(tabled::settings::Style::psql()); diff --git a/src/dynlay.rs b/src/dynlay.rs index 59a663f..ef2e96c 100644 --- a/src/dynlay.rs +++ b/src/dynlay.rs @@ -1,4 +1,4 @@ -use eyre::{format_err, Result}; +use eyre::{Result, format_err}; use log::{debug, error, info, warn}; use std::path::PathBuf; use tokio::{fs, io::AsyncWriteExt, process::Command}; diff --git a/src/lib.rs b/src/lib.rs index 08be54b..e314765 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -148,3 +148,34 @@ impl<'t> File { } } } + +impl FileKind { + pub fn content<'t>(&'t self) -> Result>, base64::DecodeError> { + use FileKind::*; + Ok(match self { + Content(content) => Some(Cow::Borrowed(content.as_bytes())), + Content64(content) => { + let content = base64_decode(content)?; + Some(Cow::Owned(content)) + } + Parts(parts) => { + let mut assembly = Vec::new(); + for part in parts { + assembly.extend(part.content()?.into_iter()); + } + Some(Cow::Owned(assembly)) + } + _ => None, + }) + } +} + +impl FilePart { + pub fn content(&self) -> Result, base64::DecodeError> { + use FilePart::*; + Ok(match self { + Content(content) => Cow::Borrowed(content.as_bytes()), + Content64(content) => Cow::Owned(base64_decode(content)?), + }) + } +} diff --git a/src/logger.rs b/src/logger.rs index ef9e9c6..83c6366 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -1,6 +1,6 @@ use async_compression::tokio::write::{ZstdDecoder, ZstdEncoder}; use chrono::{DurationRound, TimeDelta, Utc}; -use eyre::{format_err, Result}; +use eyre::{Result, format_err}; use log::{debug, error, warn}; use std::ffi::OsStr; use std::path::{Path, PathBuf}; @@ -10,7 +10,7 @@ use tokio::{ io::{self, AsyncBufReadExt, AsyncRead, AsyncWrite, AsyncWriteExt, BufReader, BufWriter}, process::{Child, Command}, sync::mpsc, - time::{sleep, Duration}, + time::{Duration, sleep}, }; use crate::{cgroup, fs}; @@ -220,7 +220,7 @@ impl Logger { fn forward_signals_to(pid: i32) { use nix::{ - sys::signal::{kill, Signal}, + sys::signal::{Signal, kill}, unistd::Pid, }; use signal_hook::{consts::*, low_level::register}; diff --git a/src/rc.rs b/src/rc.rs index 54b1631..2aabf6c 100644 --- a/src/rc.rs +++ b/src/rc.rs @@ -5,9 +5,9 @@ use std::collections::{BTreeMap as Map, BTreeSet as Set}; use std::path::PathBuf; use std::sync::LazyLock; use tokio::{ - io::{copy, AsyncBufReadExt, AsyncReadExt, AsyncWriteExt, BufReader}, + io::{AsyncBufReadExt, AsyncReadExt, AsyncWriteExt, BufReader, copy}, net::{UnixListener, UnixStream}, - sync::{mpsc, watch, RwLock}, + sync::{RwLock, mpsc, watch}, }; use crate::{cgroup, fs}; @@ -185,7 +185,7 @@ async fn handle(mut conn: UnixStream) { } async fn wait_terminate() { - use tokio::signal::unix::{signal, SignalKind}; + use tokio::signal::unix::{SignalKind, signal}; let Ok(mut sig) = signal(SignalKind::terminate()) .inspect_err(|e| error!("failed to listen to SIGTERM (will be ignored): {e}")) else { @@ -203,7 +203,7 @@ async fn wait_terminate() { } async fn wait_reload() { - use tokio::signal::unix::{signal, SignalKind}; + use tokio::signal::unix::{SignalKind, signal}; let Ok(mut sig) = signal(SignalKind::hangup()) .inspect_err(|e| error!("failed to listen to SIGHUP (will be ignored): {e}")) else { diff --git a/src/rc/runner.rs b/src/rc/runner.rs index 8851f78..b27adf7 100644 --- a/src/rc/runner.rs +++ b/src/rc/runner.rs @@ -1,13 +1,13 @@ use log::{error, warn}; use nix::{ - sys::signal::{kill, Signal}, + sys::signal::{Signal, kill}, unistd::Pid, }; use std::num::NonZero; use tokio::{ process, select, sync::{mpsc, watch}, - time::{sleep, sleep_until, Duration, Instant}, + time::{Duration, Instant, sleep, sleep_until}, }; use super::{Error, Result, Service};