diff --git a/Makefile b/Makefile index 52ca35980..27be8f39f 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,14 @@ PATCH_DB_CLIENT_SRC := $(shell git ls-files --recurse-submodules patch-db/client GZIP_BIN := $(shell which pigz || which gzip) TAR_BIN := $(shell which gtar || which tar) COMPILED_TARGETS := core/target/$(ARCH)-unknown-linux-musl/release/startbox core/target/$(ARCH)-unknown-linux-musl/release/containerbox container-runtime/rootfs.$(ARCH).squashfs -ALL_TARGETS := $(STARTD_SRC) $(ENVIRONMENT_FILE) $(GIT_HASH_FILE) $(VERSION_FILE) $(COMPILED_TARGETS) cargo-deps/$(ARCH)-unknown-linux-musl/release/startos-backup-fs $(shell if [ "$(PLATFORM)" = "raspberrypi" ]; then echo cargo-deps/aarch64-unknown-linux-musl/release/pi-beep; fi) $(shell /bin/bash -c 'if [[ "${ENVIRONMENT}" =~ (^|-)unstable($$|-) ]]; then echo cargo-deps/$(ARCH)-unknown-linux-musl/release/tokio-console; fi') $(PLATFORM_FILE) +ALL_TARGETS := $(STARTD_SRC) $(ENVIRONMENT_FILE) $(GIT_HASH_FILE) $(VERSION_FILE) $(COMPILED_TARGETS) cargo-deps/$(ARCH)-unknown-linux-musl/release/startos-backup-fs $(PLATFORM_FILE) \ + $(shell if [ "$(PLATFORM)" = "raspberrypi" ]; then \ + echo cargo-deps/aarch64-unknown-linux-musl/release/pi-beep; \ + fi) \ + $(shell /bin/bash -c 'if [[ "${ENVIRONMENT}" =~ (^|-)unstable($$|-) ]]; then \ + echo cargo-deps/$(ARCH)-unknown-linux-musl/release/tokio-console; \ + echo cargo-deps/$(ARCH)-unknown-linux-musl/release/flamegraph; \ + fi') REBUILD_TYPES = 1 ifeq ($(REMOTE),) @@ -130,7 +137,10 @@ install: $(ALL_TARGETS) $(call ln,/usr/bin/startbox,$(DESTDIR)/usr/bin/startd) $(call ln,/usr/bin/startbox,$(DESTDIR)/usr/bin/start-cli) if [ "$(PLATFORM)" = "raspberrypi" ]; then $(call cp,cargo-deps/aarch64-unknown-linux-musl/release/pi-beep,$(DESTDIR)/usr/bin/pi-beep); fi - if /bin/bash -c '[[ "${ENVIRONMENT}" =~ (^|-)unstable($$|-) ]]'; then $(call cp,cargo-deps/$(ARCH)-unknown-linux-musl/release/tokio-console,$(DESTDIR)/usr/bin/tokio-console); fi + if /bin/bash -c '[[ "${ENVIRONMENT}" =~ (^|-)unstable($$|-) ]]'; then \ + $(call cp,cargo-deps/$(ARCH)-unknown-linux-musl/release/tokio-console,$(DESTDIR)/usr/bin/tokio-console); \ + $(call cp,cargo-deps/$(ARCH)-unknown-linux-musl/release/flamegraph,$(DESTDIR)/usr/bin/flamegraph); \ + fi $(call cp,cargo-deps/$(ARCH)-unknown-linux-musl/release/startos-backup-fs,$(DESTDIR)/usr/bin/startos-backup-fs) $(call ln,/usr/bin/startos-backup-fs,$(DESTDIR)/usr/sbin/mount.backup-fs) @@ -325,3 +335,6 @@ cargo-deps/$(ARCH)-unknown-linux-musl/release/tokio-console: cargo-deps/$(ARCH)-unknown-linux-musl/release/startos-backup-fs: ARCH=$(ARCH) PREINSTALL="apk add fuse3 fuse3-dev fuse3-static musl-dev pkgconfig" ./build-cargo-dep.sh --git https://github.com/Start9Labs/start-fs.git startos-backup-fs + +cargo-deps/$(ARCH)-unknown-linux-musl/release/flamegraph: + ARCH=$(ARCH) PREINSTALL="apk add musl-dev pkgconfig" ./build-cargo-dep.sh flamegraph \ No newline at end of file diff --git a/build/dpkg-deps/generate.sh b/build/dpkg-deps/generate.sh index 53a7b87e5..6aafeefc3 100755 --- a/build/dpkg-deps/generate.sh +++ b/build/dpkg-deps/generate.sh @@ -8,8 +8,8 @@ IFS="-" read -ra FEATURES <<< "$ENVIRONMENT" feature_file_checker=' /^#/ { next } -/^\+ [a-z0-9]+$/ { next } -/^- [a-z0-9]+$/ { next } +/^\+ [a-z0-9-]+$/ { next } +/^- [a-z0-9-]+$/ { next } { exit 1 } ' diff --git a/build/dpkg-deps/unstable.depends b/build/dpkg-deps/unstable.depends index fe5dee256..ebf3b58b4 100644 --- a/build/dpkg-deps/unstable.depends +++ b/build/dpkg-deps/unstable.depends @@ -1,2 +1,3 @@ + gdb -+ heaptrack \ No newline at end of file ++ heaptrack ++ linux-perf \ No newline at end of file diff --git a/core/Cargo.lock b/core/Cargo.lock index 4e9a781fc..f8b130893 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -3909,8 +3909,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ "bitflags 2.9.2", + "futures-core", "inotify-sys", "libc", + "tokio", ] [[package]] @@ -7344,6 +7346,7 @@ dependencies = [ "include_dir", "indexmap 2.10.0", "indicatif", + "inotify", "integer-encoding", "ipnet", "isocountry", diff --git a/core/startos/Cargo.toml b/core/startos/Cargo.toml index b39fd8e29..c71ea7f85 100644 --- a/core/startos/Cargo.toml +++ b/core/startos/Cargo.toml @@ -63,6 +63,7 @@ arti-client = { version = "0.33", features = [ "rustls", "static", "tokio", + "ephemeral-keystore", ], default-features = false } aes = { version = "0.7.5", features = ["ctr"] } async-acme = { version = "0.6.0", git = "https://github.com/dr-bonez/async-acme.git", features = [ @@ -139,6 +140,7 @@ imbl-value = { version = "0.4.3", features = ["ts-rs"] } include_dir = { version = "0.7.3", features = ["metadata"] } indexmap = { version = "2.0.2", features = ["serde"] } indicatif = { version = "0.17.7", features = ["tokio"] } +inotify = "0.11.0" integer-encoding = { version = "4.0.0", features = ["tokio_async"] } ipnet = { version = "2.8.0", features = ["serde"] } isocountry = "0.3.2" diff --git a/core/startos/src/account.rs b/core/startos/src/account.rs index 37996b429..58d4649e0 100644 --- a/core/startos/src/account.rs +++ b/core/startos/src/account.rs @@ -5,7 +5,7 @@ use openssl::pkey::{PKey, Private}; use openssl::x509::X509; use crate::db::model::DatabaseModel; -use crate::hostname::{generate_hostname, generate_id, Hostname}; +use crate::hostname::{Hostname, generate_hostname, generate_id}; use crate::net::ssl::{generate_key, make_root_cert}; use crate::net::tor::TorSecretKey; use crate::prelude::*; diff --git a/core/startos/src/action.rs b/core/startos/src/action.rs index 4bc3e4380..5b8747de5 100644 --- a/core/startos/src/action.rs +++ b/core/startos/src/action.rs @@ -4,7 +4,7 @@ use clap::{CommandFactory, FromArgMatches, Parser}; pub use models::ActionId; use models::{PackageId, ReplayId}; use qrcode::QrCode; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use tracing::instrument; use ts_rs::TS; @@ -14,7 +14,7 @@ use crate::db::model::package::TaskSeverity; use crate::prelude::*; use crate::rpc_continuations::Guid; use crate::util::serde::{ - display_serializable, HandlerExtSerde, StdinDeserializable, WithIoFormat, + HandlerExtSerde, StdinDeserializable, WithIoFormat, display_serializable, }; pub fn action_api() -> ParentHandler { diff --git a/core/startos/src/auth.rs b/core/startos/src/auth.rs index 7a4c51237..a49c8f2ab 100644 --- a/core/startos/src/auth.rs +++ b/core/startos/src/auth.rs @@ -3,11 +3,11 @@ use std::collections::BTreeMap; use chrono::{DateTime, Utc}; use clap::Parser; use color_eyre::eyre::eyre; -use imbl_value::{json, InternedString}; +use imbl_value::{InternedString, json}; use itertools::Itertools; use josekit::jwk::Jwk; use rpc_toolkit::yajrc::RpcError; -use rpc_toolkit::{from_fn_async, CallRemote, Context, HandlerArgs, HandlerExt, ParentHandler}; +use rpc_toolkit::{CallRemote, Context, HandlerArgs, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use tokio::io::AsyncWriteExt; use tracing::instrument; @@ -20,8 +20,8 @@ use crate::middleware::auth::{ use crate::prelude::*; use crate::util::crypto::EncryptedWire; use crate::util::io::create_file_mod; -use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; -use crate::{ensure_code, Error, ResultExt}; +use crate::util::serde::{HandlerExtSerde, WithIoFormat, display_serializable}; +use crate::{Error, ResultExt, ensure_code}; #[derive(Debug, Clone, Default, Deserialize, Serialize, TS)] pub struct Sessions(pub BTreeMap); diff --git a/core/startos/src/backup/backup_bulk.rs b/core/startos/src/backup/backup_bulk.rs index c24904cf8..28170eb9b 100644 --- a/core/startos/src/backup/backup_bulk.rs +++ b/core/startos/src/backup/backup_bulk.rs @@ -13,8 +13,8 @@ use tokio::io::AsyncWriteExt; use tracing::instrument; use ts_rs::TS; -use super::target::{BackupTargetId, PackageBackupInfo}; use super::PackageBackupReport; +use super::target::{BackupTargetId, PackageBackupInfo}; use crate::backup::os::OsBackup; use crate::backup::{BackupReport, ServerBackupReport}; use crate::context::RpcContext; @@ -24,7 +24,7 @@ use crate::disk::mount::backup::BackupMountGuard; use crate::disk::mount::filesystem::ReadWrite; use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; use crate::middleware::auth::AuthContext; -use crate::notifications::{notify, NotificationLevel}; +use crate::notifications::{NotificationLevel, notify}; use crate::prelude::*; use crate::util::io::dir_copy; use crate::util::serde::IoFormat; diff --git a/core/startos/src/backup/mod.rs b/core/startos/src/backup/mod.rs index 110a918b6..b68a2fd9d 100644 --- a/core/startos/src/backup/mod.rs +++ b/core/startos/src/backup/mod.rs @@ -3,7 +3,7 @@ use std::collections::BTreeMap; use chrono::{DateTime, Utc}; use models::{HostId, PackageId}; use reqwest::Url; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use crate::context::CliContext; diff --git a/core/startos/src/backup/os.rs b/core/startos/src/backup/os.rs index 61ad77dbd..380772b77 100644 --- a/core/startos/src/backup/os.rs +++ b/core/startos/src/backup/os.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; use ssh_key::private::Ed25519Keypair; use crate::account::AccountInfo; -use crate::hostname::{generate_hostname, generate_id, Hostname}; +use crate::hostname::{Hostname, generate_hostname, generate_id}; use crate::net::tor::TorSecretKey; use crate::prelude::*; use crate::util::crypto::ed25519_expand_key; @@ -36,7 +36,7 @@ impl<'de> Deserialize<'de> for OsBackup { v => { return Err(serde::de::Error::custom(&format!( "Unknown backup version {v}" - ))) + ))); } }) } diff --git a/core/startos/src/backup/restore.rs b/core/startos/src/backup/restore.rs index 1885e198e..d8d536aea 100644 --- a/core/startos/src/backup/restore.rs +++ b/core/startos/src/backup/restore.rs @@ -2,7 +2,7 @@ use std::collections::BTreeMap; use std::sync::Arc; use clap::Parser; -use futures::{stream, StreamExt}; +use futures::{StreamExt, stream}; use models::PackageId; use patch_db::json_ptr::ROOT; use serde::{Deserialize, Serialize}; @@ -11,6 +11,7 @@ use tracing::instrument; use ts_rs::TS; use super::target::BackupTargetId; +use crate::PLATFORM; use crate::backup::os::OsBackup; use crate::context::setup::SetupResult; use crate::context::{RpcContext, SetupContext}; @@ -26,7 +27,6 @@ use crate::service::service_map::DownloadInstallFuture; use crate::setup::SetupExecuteProgress; use crate::system::sync_kiosk; use crate::util::serde::IoFormat; -use crate::PLATFORM; #[derive(Deserialize, Serialize, Parser, TS)] #[serde(rename_all = "camelCase")] diff --git a/core/startos/src/backup/target/cifs.rs b/core/startos/src/backup/target/cifs.rs index 63e18d0d8..350e53220 100644 --- a/core/startos/src/backup/target/cifs.rs +++ b/core/startos/src/backup/target/cifs.rs @@ -4,17 +4,17 @@ use std::path::{Path, PathBuf}; use clap::Parser; use color_eyre::eyre::eyre; use imbl_value::InternedString; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; use super::{BackupTarget, BackupTargetId}; use crate::context::{CliContext, RpcContext}; use crate::db::model::DatabaseModel; -use crate::disk::mount::filesystem::cifs::Cifs; use crate::disk::mount::filesystem::ReadOnly; +use crate::disk::mount::filesystem::cifs::Cifs; use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; -use crate::disk::util::{recovery_info, StartOsRecoveryInfo}; +use crate::disk::util::{StartOsRecoveryInfo, recovery_info}; use crate::prelude::*; use crate::util::serde::KeyVal; diff --git a/core/startos/src/backup/target/mod.rs b/core/startos/src/backup/target/mod.rs index 71df2925f..3eb37e12e 100644 --- a/core/startos/src/backup/target/mod.rs +++ b/core/startos/src/backup/target/mod.rs @@ -2,15 +2,15 @@ use std::collections::BTreeMap; use std::path::{Path, PathBuf}; use chrono::{DateTime, Utc}; -use clap::builder::ValueParserFactory; use clap::Parser; +use clap::builder::ValueParserFactory; use color_eyre::eyre::eyre; -use digest::generic_array::GenericArray; use digest::OutputSizeUser; +use digest::generic_array::GenericArray; use exver::Version; use imbl_value::InternedString; use models::{FromStrParser, PackageId}; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use sha2::Sha256; use tokio::sync::Mutex; @@ -27,10 +27,10 @@ use crate::disk::mount::filesystem::{FileSystem, MountType, ReadWrite}; use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; use crate::disk::util::PartitionInfo; use crate::prelude::*; -use crate::util::serde::{ - deserialize_from_str, display_serializable, serialize_display, HandlerExtSerde, WithIoFormat, -}; use crate::util::VersionString; +use crate::util::serde::{ + HandlerExtSerde, WithIoFormat, deserialize_from_str, display_serializable, serialize_display, +}; pub mod cifs; diff --git a/core/startos/src/bins/registry.rs b/core/startos/src/bins/registry.rs index 4f122fbdd..2aacebd39 100644 --- a/core/startos/src/bins/registry.rs +++ b/core/startos/src/bins/registry.rs @@ -6,8 +6,8 @@ use rpc_toolkit::CliApp; use tokio::signal::unix::signal; use tracing::instrument; -use crate::context::config::ClientConfig; use crate::context::CliContext; +use crate::context::config::ClientConfig; use crate::net::web_server::{Acceptor, WebServer}; use crate::prelude::*; use crate::registry::context::{RegistryConfig, RegistryContext}; diff --git a/core/startos/src/bins/start_cli.rs b/core/startos/src/bins/start_cli.rs index bda5e00d3..b3b10cf71 100644 --- a/core/startos/src/bins/start_cli.rs +++ b/core/startos/src/bins/start_cli.rs @@ -3,8 +3,8 @@ use std::ffi::OsString; use rpc_toolkit::CliApp; use serde_json::Value; -use crate::context::config::ClientConfig; use crate::context::CliContext; +use crate::context::config::ClientConfig; use crate::util::logger::LOGGER; use crate::version::{Current, VersionT}; diff --git a/core/startos/src/bins/start_init.rs b/core/startos/src/bins/start_init.rs index 8bf20ce31..70c32ed1a 100644 --- a/core/startos/src/bins/start_init.rs +++ b/core/startos/src/bins/start_init.rs @@ -6,9 +6,9 @@ use tracing::instrument; use crate::context::config::ServerConfig; use crate::context::rpc::InitRpcContextPhases; use crate::context::{DiagnosticContext, InitContext, InstallContext, RpcContext, SetupContext}; +use crate::disk::REPAIR_DISK_PATH; use crate::disk::fsck::RepairStrategy; use crate::disk::main::DEFAULT_PASSWORD; -use crate::disk::REPAIR_DISK_PATH; use crate::firmware::{check_for_firmware_update, update_firmware}; use crate::init::{InitPhases, STANDBY_MODE_PATH}; use crate::net::web_server::{UpgradableListener, WebServer}; @@ -137,7 +137,7 @@ async fn setup_or_init( return Err(Error::new( eyre!("Setup mode exited before setup completed"), ErrorKind::Unknown, - )) + )); } })) } else { diff --git a/core/startos/src/bins/tunnel.rs b/core/startos/src/bins/tunnel.rs index 6aa0003af..d1deede3f 100644 --- a/core/startos/src/bins/tunnel.rs +++ b/core/startos/src/bins/tunnel.rs @@ -6,8 +6,8 @@ use rpc_toolkit::CliApp; use tokio::signal::unix::signal; use tracing::instrument; -use crate::context::config::ClientConfig; use crate::context::CliContext; +use crate::context::config::ClientConfig; use crate::net::web_server::{Acceptor, WebServer}; use crate::prelude::*; use crate::tunnel::context::{TunnelConfig, TunnelContext}; diff --git a/core/startos/src/context/cli.rs b/core/startos/src/context/cli.rs index ed61ffcea..e93963f56 100644 --- a/core/startos/src/context/cli.rs +++ b/core/startos/src/context/cli.rs @@ -20,9 +20,9 @@ use tokio_tungstenite::{MaybeTlsStream, WebSocketStream}; use tracing::instrument; use super::setup::CURRENT_SECRET; -use crate::context::config::{local_config_path, ClientConfig}; +use crate::context::config::{ClientConfig, local_config_path}; use crate::context::{DiagnosticContext, InitContext, InstallContext, RpcContext, SetupContext}; -use crate::developer::{default_developer_key_path, OS_DEVELOPER_KEY_PATH}; +use crate::developer::{OS_DEVELOPER_KEY_PATH, default_developer_key_path}; use crate::middleware::auth::AuthContext; use crate::prelude::*; use crate::rpc_continuations::Guid; @@ -190,7 +190,7 @@ impl CliContext { eyre!("Cannot parse scheme from base URL"), crate::ErrorKind::ParseUrl, ) - .into()) + .into()); } }; url.set_scheme(ws_scheme) diff --git a/core/startos/src/context/config.rs b/core/startos/src/context/config.rs index ba7907bdd..a0ccbb2b4 100644 --- a/core/startos/src/context/config.rs +++ b/core/startos/src/context/config.rs @@ -8,11 +8,11 @@ use reqwest::Url; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; +use crate::MAIN_DATA; use crate::disk::OsPartitionInfo; use crate::prelude::*; use crate::util::serde::IoFormat; use crate::version::VersionT; -use crate::MAIN_DATA; pub const DEVICE_CONFIG_PATH: &str = "/media/startos/config/config.yaml"; // "/media/startos/config/config.yaml"; pub const CONFIG_PATH: &str = "/etc/startos/config.yaml"; diff --git a/core/startos/src/context/diagnostic.rs b/core/startos/src/context/diagnostic.rs index 6acb21e30..e1bff2466 100644 --- a/core/startos/src/context/diagnostic.rs +++ b/core/startos/src/context/diagnostic.rs @@ -1,15 +1,15 @@ use std::ops::Deref; use std::sync::Arc; -use rpc_toolkit::yajrc::RpcError; use rpc_toolkit::Context; +use rpc_toolkit::yajrc::RpcError; use tokio::sync::broadcast::Sender; use tracing::instrument; +use crate::Error; use crate::context::config::ServerConfig; use crate::rpc_continuations::RpcContinuations; use crate::shutdown::Shutdown; -use crate::Error; pub struct DiagnosticContextSeed { pub shutdown: Sender, diff --git a/core/startos/src/context/init.rs b/core/startos/src/context/init.rs index 566457a9c..1a3ba745c 100644 --- a/core/startos/src/context/init.rs +++ b/core/startos/src/context/init.rs @@ -6,10 +6,10 @@ use tokio::sync::broadcast::Sender; use tokio::sync::watch; use tracing::instrument; +use crate::Error; use crate::context::config::ServerConfig; use crate::progress::FullProgressTracker; use crate::rpc_continuations::RpcContinuations; -use crate::Error; pub struct InitContextSeed { pub config: ServerConfig, diff --git a/core/startos/src/context/install.rs b/core/startos/src/context/install.rs index c0c564b34..04717cf93 100644 --- a/core/startos/src/context/install.rs +++ b/core/startos/src/context/install.rs @@ -5,9 +5,9 @@ use rpc_toolkit::Context; use tokio::sync::broadcast::Sender; use tracing::instrument; +use crate::Error; use crate::net::utils::find_eth_iface; use crate::rpc_continuations::RpcContinuations; -use crate::Error; pub struct InstallContextSeed { pub ethernet_interface: String, diff --git a/core/startos/src/context/rpc.rs b/core/startos/src/context/rpc.rs index 52cd0b2f7..53b666929 100644 --- a/core/startos/src/context/rpc.rs +++ b/core/startos/src/context/rpc.rs @@ -4,8 +4,8 @@ use std::future::Future; use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4}; use std::ops::Deref; use std::path::{Path, PathBuf}; -use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; use std::time::Duration; use chrono::{TimeDelta, Utc}; @@ -18,18 +18,19 @@ use models::{ActionId, PackageId}; use reqwest::{Client, Proxy}; use rpc_toolkit::yajrc::RpcError; use rpc_toolkit::{CallRemote, Context, Empty}; -use tokio::sync::{broadcast, oneshot, watch, Mutex, RwLock}; +use tokio::sync::{Mutex, RwLock, broadcast, oneshot, watch}; use tokio::time::Instant; use tracing::instrument; use super::setup::CURRENT_SECRET; +use crate::DATA_DIR; use crate::account::AccountInfo; use crate::auth::Sessions; use crate::context::config::ServerConfig; -use crate::db::model::package::TaskSeverity; use crate::db::model::Database; +use crate::db::model::package::TaskSeverity; use crate::disk::OsPartitionInfo; -use crate::init::{check_time_is_synchronized, InitResult}; +use crate::init::{InitResult, check_time_is_synchronized}; use crate::install::PKG_ARCHIVE_DIR; use crate::lxc::{ContainerId, LxcContainer, LxcManager}; use crate::net::net_controller::{NetController, NetService}; @@ -39,14 +40,13 @@ use crate::net::wifi::WpaCli; use crate::prelude::*; use crate::progress::{FullProgressTracker, PhaseProgressTrackerHandle}; use crate::rpc_continuations::{Guid, OpenAuthedContinuations, RpcContinuations}; +use crate::service::ServiceMap; use crate::service::action::update_tasks; use crate::service::effects::callbacks::ServiceCallbacks; -use crate::service::ServiceMap; use crate::shutdown::Shutdown; use crate::util::io::delete_file; use crate::util::lshw::LshwDevice; use crate::util::sync::{SyncMutex, Watch}; -use crate::DATA_DIR; pub struct RpcContextSeed { is_closed: AtomicBool, diff --git a/core/startos/src/context/setup.rs b/core/startos/src/context/setup.rs index fed7b8814..22107825d 100644 --- a/core/startos/src/context/setup.rs +++ b/core/startos/src/context/setup.rs @@ -10,14 +10,15 @@ use josekit::jwk::Jwk; use patch_db::PatchDb; use rpc_toolkit::Context; use serde::{Deserialize, Serialize}; -use tokio::sync::broadcast::Sender; use tokio::sync::OnceCell; +use tokio::sync::broadcast::Sender; use tracing::instrument; use ts_rs::TS; +use crate::MAIN_DATA; use crate::account::AccountInfo; -use crate::context::config::ServerConfig; use crate::context::RpcContext; +use crate::context::config::ServerConfig; use crate::disk::OsPartitionInfo; use crate::hostname::Hostname; use crate::net::web_server::{UpgradableListener, WebServer, WebServerAcceptorSetter}; @@ -27,7 +28,6 @@ use crate::rpc_continuations::{Guid, RpcContinuation, RpcContinuations}; use crate::setup::SetupProgress; use crate::shutdown::Shutdown; use crate::util::net::WebSocketExt; -use crate::MAIN_DATA; lazy_static::lazy_static! { pub static ref CURRENT_SECRET: Jwk = Jwk::generate_ec_key(josekit::jwk::alg::ec::EcCurve::P256).unwrap_or_else(|e| { diff --git a/core/startos/src/control.rs b/core/startos/src/control.rs index afb1768f2..4690c8a39 100644 --- a/core/startos/src/control.rs +++ b/core/startos/src/control.rs @@ -5,10 +5,10 @@ use serde::{Deserialize, Serialize}; use tracing::instrument; use ts_rs::TS; +use crate::Error; use crate::context::RpcContext; use crate::prelude::*; use crate::rpc_continuations::Guid; -use crate::Error; #[derive(Deserialize, Serialize, Parser, TS)] #[serde(rename_all = "camelCase")] diff --git a/core/startos/src/db/mod.rs b/core/startos/src/db/mod.rs index 2c08a9e5d..f1a16ab2f 100644 --- a/core/startos/src/db/mod.rs +++ b/core/startos/src/db/mod.rs @@ -12,7 +12,7 @@ use itertools::Itertools; use patch_db::json_ptr::{JsonPointer, ROOT}; use patch_db::{DiffPatch, Dump, Revision}; use rpc_toolkit::yajrc::RpcError; -use rpc_toolkit::{from_fn_async, Context, HandlerArgs, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerArgs, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use tokio::sync::mpsc::{self, UnboundedReceiver}; use tokio::sync::watch; @@ -23,7 +23,7 @@ use crate::context::{CliContext, RpcContext}; use crate::prelude::*; use crate::rpc_continuations::{Guid, RpcContinuation}; use crate::util::net::WebSocketExt; -use crate::util::serde::{apply_expr, HandlerExtSerde}; +use crate::util::serde::{HandlerExtSerde, apply_expr}; lazy_static::lazy_static! { static ref PUBLIC: JsonPointer = "/public".parse().unwrap(); diff --git a/core/startos/src/db/model/package.rs b/core/startos/src/db/model/package.rs index 9506bd6bb..2a2abe2b6 100644 --- a/core/startos/src/db/model/package.rs +++ b/core/startos/src/db/model/package.rs @@ -5,8 +5,8 @@ use chrono::{DateTime, Utc}; use exver::VersionRange; use imbl_value::InternedString; use models::{ActionId, DataUrl, HealthCheckId, HostId, PackageId, ReplayId, ServiceInterfaceId}; -use patch_db::json_ptr::JsonPointer; use patch_db::HasModel; +use patch_db::json_ptr::JsonPointer; use reqwest::Url; use serde::{Deserialize, Serialize}; use ts_rs::TS; @@ -17,7 +17,7 @@ use crate::prelude::*; use crate::progress::FullProgress; use crate::s9pk::manifest::Manifest; use crate::status::MainStatus; -use crate::util::serde::{is_partial_of, Pem}; +use crate::util::serde::{Pem, is_partial_of}; #[derive(Debug, Default, Deserialize, Serialize, TS)] #[ts(export)] @@ -268,7 +268,7 @@ impl Model { return Err(Error::new( eyre!("could not determine package state to get manifest"), ErrorKind::Database, - )) + )); } }) } diff --git a/core/startos/src/db/model/public.rs b/core/startos/src/db/model/public.rs index b4ab8e556..c228bb32a 100644 --- a/core/startos/src/db/model/public.rs +++ b/core/startos/src/db/model/public.rs @@ -1,5 +1,5 @@ use std::collections::{BTreeMap, BTreeSet}; -use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; +use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; use chrono::{DateTime, Utc}; use exver::{Version, VersionRange}; @@ -19,8 +19,8 @@ use crate::account::AccountInfo; use crate::db::model::package::AllPackageData; use crate::net::acme::AcmeProvider; use crate::net::forward::START9_BRIDGE_IFACE; -use crate::net::host::binding::{AddSslOptions, BindInfo, BindOptions, NetInfo}; use crate::net::host::Host; +use crate::net::host::binding::{AddSslOptions, BindInfo, BindOptions, NetInfo}; use crate::net::utils::ipv6_is_local; use crate::net::vhost::AlpnInfo; use crate::prelude::*; @@ -202,8 +202,8 @@ pub struct NetworkInfo { #[model = "Model"] #[ts(export)] pub struct DnsSettings { - pub dhcp_servers: Vec, - pub static_servers: Option>, + pub dhcp_servers: Vec, + pub static_servers: Option>, } #[derive(Clone, Debug, Default, Deserialize, Serialize, HasModel, TS)] diff --git a/core/startos/src/dependencies.rs b/core/startos/src/dependencies.rs index 8e08ea808..76b459a5e 100644 --- a/core/startos/src/dependencies.rs +++ b/core/startos/src/dependencies.rs @@ -5,9 +5,9 @@ use models::PackageId; use serde::{Deserialize, Serialize}; use ts_rs::TS; +use crate::Error; use crate::prelude::*; use crate::util::PathOrUrl; -use crate::Error; #[derive(Clone, Debug, Default, Deserialize, Serialize, HasModel, TS)] #[model = "Model"] diff --git a/core/startos/src/developer/mod.rs b/core/startos/src/developer/mod.rs index c5cf864e2..102a30e22 100644 --- a/core/startos/src/developer/mod.rs +++ b/core/startos/src/developer/mod.rs @@ -1,13 +1,13 @@ use std::path::{Path, PathBuf}; -use ed25519::pkcs8::EncodePrivateKey; use ed25519::PublicKeyBytes; +use ed25519::pkcs8::EncodePrivateKey; use ed25519_dalek::{SigningKey, VerifyingKey}; use tokio::io::AsyncWriteExt; use tracing::instrument; -use crate::context::config::local_config_path; use crate::context::CliContext; +use crate::context::config::local_config_path; use crate::prelude::*; use crate::util::io::create_file_mod; use crate::util::serde::Pem; diff --git a/core/startos/src/diagnostic.rs b/core/startos/src/diagnostic.rs index 49d82c16f..820d05512 100644 --- a/core/startos/src/diagnostic.rs +++ b/core/startos/src/diagnostic.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use rpc_toolkit::yajrc::RpcError; use rpc_toolkit::{ - from_fn, from_fn_async, CallRemoteHandler, Context, Empty, HandlerExt, ParentHandler, + CallRemoteHandler, Context, Empty, HandlerExt, ParentHandler, from_fn, from_fn_async, }; use crate::context::{CliContext, DiagnosticContext, RpcContext}; diff --git a/core/startos/src/disk/fsck/btrfs.rs b/core/startos/src/disk/fsck/btrfs.rs index 2a198cd8f..3d7556825 100644 --- a/core/startos/src/disk/fsck/btrfs.rs +++ b/core/startos/src/disk/fsck/btrfs.rs @@ -4,9 +4,9 @@ use std::path::Path; use tokio::process::Command; use tracing::instrument; +use crate::Error; use crate::disk::fsck::RequiresReboot; use crate::util::Invoke; -use crate::Error; #[instrument(skip_all)] pub async fn btrfs_check_readonly(logicalname: impl AsRef) -> Result { diff --git a/core/startos/src/disk/fsck/ext4.rs b/core/startos/src/disk/fsck/ext4.rs index a068749fa..534efd12d 100644 --- a/core/startos/src/disk/fsck/ext4.rs +++ b/core/startos/src/disk/fsck/ext4.rs @@ -2,13 +2,13 @@ use std::ffi::OsStr; use std::path::Path; use color_eyre::eyre::eyre; -use futures::future::BoxFuture; use futures::FutureExt; +use futures::future::BoxFuture; use tokio::process::Command; use tracing::instrument; -use crate::disk::fsck::RequiresReboot; use crate::Error; +use crate::disk::fsck::RequiresReboot; #[instrument(skip_all)] pub async fn e2fsck_preen( diff --git a/core/startos/src/disk/fsck/mod.rs b/core/startos/src/disk/fsck/mod.rs index 6758ddd58..1c6949138 100644 --- a/core/startos/src/disk/fsck/mod.rs +++ b/core/startos/src/disk/fsck/mod.rs @@ -3,10 +3,10 @@ use std::path::Path; use color_eyre::eyre::eyre; use tokio::process::Command; +use crate::Error; use crate::disk::fsck::btrfs::{btrfs_check_readonly, btrfs_check_repair}; use crate::disk::fsck::ext4::{e2fsck_aggressive, e2fsck_preen}; use crate::util::Invoke; -use crate::Error; pub mod btrfs; pub mod ext4; @@ -45,7 +45,7 @@ impl RepairStrategy { return Err(Error::new( eyre!("Unknown filesystem {fs}"), crate::ErrorKind::DiskManagement, - )) + )); } } } diff --git a/core/startos/src/disk/mod.rs b/core/startos/src/disk/mod.rs index 144aa8bb4..7857dbdca 100644 --- a/core/startos/src/disk/mod.rs +++ b/core/startos/src/disk/mod.rs @@ -2,13 +2,13 @@ use std::path::{Path, PathBuf}; use itertools::Itertools; use lazy_format::lazy_format; -use rpc_toolkit::{from_fn_async, CallRemoteHandler, Context, Empty, HandlerExt, ParentHandler}; +use rpc_toolkit::{CallRemoteHandler, Context, Empty, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; +use crate::Error; use crate::context::{CliContext, RpcContext}; use crate::disk::util::DiskInfo; -use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; -use crate::Error; +use crate::util::serde::{HandlerExtSerde, WithIoFormat, display_serializable}; pub mod fsck; pub mod main; diff --git a/core/startos/src/disk/mount/backup.rs b/core/startos/src/disk/mount/backup.rs index fe771ceba..5fadba407 100644 --- a/core/startos/src/disk/mount/backup.rs +++ b/core/startos/src/disk/mount/backup.rs @@ -10,8 +10,8 @@ use tracing::instrument; use super::guard::{GenericMountGuard, TmpMountGuard}; use crate::auth::check_password; use crate::backup::target::BackupInfo; -use crate::disk::mount::filesystem::backupfs::BackupFS; use crate::disk::mount::filesystem::ReadWrite; +use crate::disk::mount::filesystem::backupfs::BackupFS; use crate::disk::mount::guard::SubPath; use crate::disk::util::StartOsRecoveryInfo; use crate::util::crypto::{decrypt_slice, encrypt_slice}; diff --git a/core/startos/src/disk/mount/filesystem/cifs.rs b/core/startos/src/disk/mount/filesystem/cifs.rs index 87509f150..255da377b 100644 --- a/core/startos/src/disk/mount/filesystem/cifs.rs +++ b/core/startos/src/disk/mount/filesystem/cifs.rs @@ -11,9 +11,9 @@ use tracing::instrument; use ts_rs::TS; use super::{FileSystem, MountType, ReadOnly}; +use crate::Error; use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; use crate::util::Invoke; -use crate::Error; async fn resolve_hostname(hostname: &str) -> Result { if let Ok(addr) = hostname.parse() { diff --git a/core/startos/src/disk/mount/filesystem/httpdirfs.rs b/core/startos/src/disk/mount/filesystem/httpdirfs.rs index df9416774..1cc107794 100644 --- a/core/startos/src/disk/mount/filesystem/httpdirfs.rs +++ b/core/startos/src/disk/mount/filesystem/httpdirfs.rs @@ -7,8 +7,8 @@ use serde::{Deserialize, Serialize}; use sha2::Sha256; use super::{FileSystem, MountType}; -use crate::util::Invoke; use crate::Error; +use crate::util::Invoke; pub async fn mount_httpdirfs(url: &Url, mountpoint: impl AsRef) -> Result<(), Error> { tokio::fs::create_dir_all(mountpoint.as_ref()).await?; diff --git a/core/startos/src/disk/mount/filesystem/mod.rs b/core/startos/src/disk/mount/filesystem/mod.rs index f4c85296a..ac37f2217 100644 --- a/core/startos/src/disk/mount/filesystem/mod.rs +++ b/core/startos/src/disk/mount/filesystem/mod.rs @@ -2,8 +2,8 @@ use std::ffi::OsStr; use std::fmt::{Display, Write}; use std::path::Path; -use digest::generic_array::GenericArray; use digest::OutputSizeUser; +use digest::generic_array::GenericArray; use futures::Future; use sha2::Sha256; use tokio::process::Command; @@ -106,6 +106,7 @@ pub trait FileSystem: Send + Sync { } fn source_hash( &self, - ) -> impl Future::OutputSize>, Error>> - + Send; + ) -> impl Future< + Output = Result::OutputSize>, Error>, + > + Send; } diff --git a/core/startos/src/disk/mount/filesystem/overlayfs.rs b/core/startos/src/disk/mount/filesystem/overlayfs.rs index 85df0e12c..09a7d953b 100644 --- a/core/startos/src/disk/mount/filesystem/overlayfs.rs +++ b/core/startos/src/disk/mount/filesystem/overlayfs.rs @@ -21,11 +21,8 @@ impl, P1: AsRef, P2: AsRef> OverlayFs { Self { lower, upper, work } } } -impl< - P0: AsRef + Send + Sync, - P1: AsRef + Send + Sync, - P2: AsRef + Send + Sync, - > FileSystem for OverlayFs +impl + Send + Sync, P1: AsRef + Send + Sync, P2: AsRef + Send + Sync> + FileSystem for OverlayFs { fn mount_type(&self) -> Option> { Some("overlay") diff --git a/core/startos/src/disk/mount/guard.rs b/core/startos/src/disk/mount/guard.rs index 6e1cdc35e..03c08f1d5 100644 --- a/core/startos/src/disk/mount/guard.rs +++ b/core/startos/src/disk/mount/guard.rs @@ -10,8 +10,8 @@ use tracing::instrument; use super::filesystem::{FileSystem, MountType, ReadOnly, ReadWrite}; use super::util::unmount; -use crate::util::{Invoke, Never}; use crate::Error; +use crate::util::{Invoke, Never}; pub const TMP_MOUNTPOINT: &'static str = "/media/startos/tmp"; diff --git a/core/startos/src/disk/mount/util.rs b/core/startos/src/disk/mount/util.rs index 61368e67a..292345a59 100644 --- a/core/startos/src/disk/mount/util.rs +++ b/core/startos/src/disk/mount/util.rs @@ -2,8 +2,8 @@ use std::path::Path; use tracing::instrument; -use crate::util::Invoke; use crate::Error; +use crate::util::Invoke; pub async fn is_mountpoint(path: impl AsRef) -> Result { let is_mountpoint = tokio::process::Command::new("mountpoint") diff --git a/core/startos/src/disk/util.rs b/core/startos/src/disk/util.rs index cb6520611..a6b5bea39 100644 --- a/core/startos/src/disk/util.rs +++ b/core/startos/src/disk/util.rs @@ -14,14 +14,14 @@ use serde::{Deserialize, Serialize}; use tokio::process::Command; use tracing::instrument; -use super::mount::filesystem::block_dev::BlockDev; use super::mount::filesystem::ReadOnly; +use super::mount::filesystem::block_dev::BlockDev; use super::mount::guard::TmpMountGuard; -use crate::disk::mount::guard::GenericMountGuard; use crate::disk::OsPartitionInfo; +use crate::disk::mount::guard::GenericMountGuard; use crate::hostname::Hostname; -use crate::util::serde::IoFormat; use crate::util::Invoke; +use crate::util::serde::IoFormat; use crate::{Error, ResultExt as _}; #[derive(Clone, Copy, Debug, Deserialize, Serialize)] diff --git a/core/startos/src/firmware.rs b/core/startos/src/firmware.rs index a70cf9e47..f053bc743 100644 --- a/core/startos/src/firmware.rs +++ b/core/startos/src/firmware.rs @@ -6,11 +6,11 @@ use serde::{Deserialize, Serialize}; use tokio::io::BufReader; use tokio::process::Command; +use crate::PLATFORM; use crate::disk::fsck::RequiresReboot; use crate::prelude::*; -use crate::util::io::open_file; use crate::util::Invoke; -use crate::PLATFORM; +use crate::util::io::open_file; /// Part of the Firmware, look there for more about #[derive(Debug, Clone, Deserialize, Serialize)] diff --git a/core/startos/src/hostname.rs b/core/startos/src/hostname.rs index f650529cc..5c88bdcec 100644 --- a/core/startos/src/hostname.rs +++ b/core/startos/src/hostname.rs @@ -1,6 +1,6 @@ use imbl_value::InternedString; use lazy_format::lazy_format; -use rand::{rng, Rng}; +use rand::{Rng, rng}; use tokio::process::Command; use tracing::instrument; diff --git a/core/startos/src/init.rs b/core/startos/src/init.rs index da58faf35..e96131639 100644 --- a/core/startos/src/init.rs +++ b/core/startos/src/init.rs @@ -8,7 +8,7 @@ use const_format::formatcp; use futures::{StreamExt, TryStreamExt}; use itertools::Itertools; use models::ResultExt; -use rpc_toolkit::{from_fn_async, Context, Empty, HandlerArgs, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, Empty, HandlerArgs, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use tokio::process::Command; use tracing::instrument; @@ -17,8 +17,8 @@ use ts_rs::TS; use crate::account::AccountInfo; use crate::context::config::ServerConfig; use crate::context::{CliContext, InitContext, RpcContext}; -use crate::db::model::public::ServerStatus; use crate::db::model::Database; +use crate::db::model::public::ServerStatus; use crate::developer::OS_DEVELOPER_KEY_PATH; use crate::hostname::Hostname; use crate::middleware::auth::AuthContext; @@ -33,10 +33,10 @@ use crate::rpc_continuations::{Guid, RpcContinuation}; use crate::s9pk::v2::pack::{CONTAINER_DATADIR, CONTAINER_TOOL}; use crate::ssh::SSH_DIR; use crate::system::{get_mem_info, sync_kiosk}; -use crate::util::io::{open_file, IOHook}; +use crate::util::io::{IOHook, open_file}; use crate::util::lshw::lshw; use crate::util::net::WebSocketExt; -use crate::util::{cpupower, Invoke}; +use crate::util::{Invoke, cpupower}; use crate::{Error, MAIN_DATA, PACKAGE_DATA}; pub const SYSTEM_REBUILD_PATH: &str = "/media/startos/config/system-rebuild"; diff --git a/core/startos/src/install/mod.rs b/core/startos/src/install/mod.rs index c290bba03..3c4d54ebc 100644 --- a/core/startos/src/install/mod.rs +++ b/core/startos/src/install/mod.rs @@ -4,17 +4,17 @@ use std::time::Duration; use axum::extract::ws; use clap::builder::ValueParserFactory; -use clap::{value_parser, CommandFactory, FromArgMatches, Parser}; +use clap::{CommandFactory, FromArgMatches, Parser, value_parser}; use color_eyre::eyre::eyre; use exver::VersionRange; use futures::{AsyncWriteExt, StreamExt}; -use imbl_value::{json, InternedString}; +use imbl_value::{InternedString, json}; use itertools::Itertools; use models::{FromStrParser, VersionString}; -use reqwest::header::{HeaderMap, CONTENT_LENGTH}; use reqwest::Url; -use rpc_toolkit::yajrc::RpcError; +use reqwest::header::{CONTENT_LENGTH, HeaderMap}; use rpc_toolkit::HandlerArgs; +use rpc_toolkit::yajrc::RpcError; use rustyline_async::ReadlineEvent; use serde::{Deserialize, Serialize}; use tokio::sync::oneshot; @@ -31,9 +31,9 @@ use crate::registry::package::get::GetPackageResponse; use crate::rpc_continuations::{Guid, RpcContinuation}; use crate::s9pk::manifest::PackageId; use crate::upload::upload; +use crate::util::Never; use crate::util::io::open_file; use crate::util::net::WebSocketExt; -use crate::util::Never; pub const PKG_ARCHIVE_DIR: &str = "package-data/archive"; pub const PKG_PUBLIC_DIR: &str = "package-data/public"; @@ -483,7 +483,9 @@ pub async fn cli_install( let version = if packages.best.len() == 1 { packages.best.pop_first().map(|(k, _)| k).unwrap() } else { - println!("Multiple flavors of {id} found. Please select one of the following versions to install:"); + println!( + "Multiple flavors of {id} found. Please select one of the following versions to install:" + ); let version; loop { let (mut read, mut output) = rustyline_async::Readline::new("> ".into()) diff --git a/core/startos/src/lib.rs b/core/startos/src/lib.rs index 04bfb6d39..bcf3d3418 100644 --- a/core/startos/src/lib.rs +++ b/core/startos/src/lib.rs @@ -79,8 +79,8 @@ pub use error::{Error, ErrorKind, ResultExt}; use imbl_value::Value; use rpc_toolkit::yajrc::RpcError; use rpc_toolkit::{ - from_fn, from_fn_async, from_fn_blocking, CallRemoteHandler, Context, Empty, HandlerExt, - ParentHandler, + CallRemoteHandler, Context, Empty, HandlerExt, ParentHandler, from_fn, from_fn_async, + from_fn_blocking, }; use serde::{Deserialize, Serialize}; use ts_rs::TS; @@ -91,7 +91,7 @@ use crate::context::{ use crate::disk::fsck::RequiresReboot; use crate::registry::context::{RegistryContext, RegistryUrlParams}; use crate::system::kiosk; -use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; +use crate::util::serde::{HandlerExtSerde, WithIoFormat, display_serializable}; #[derive(Deserialize, Serialize, Parser, TS)] #[serde(rename_all = "camelCase")] diff --git a/core/startos/src/logs.rs b/core/startos/src/logs.rs index b51593fce..a32190e70 100644 --- a/core/startos/src/logs.rs +++ b/core/startos/src/logs.rs @@ -15,7 +15,7 @@ use itertools::Itertools; use models::{FromStrParser, PackageId}; use rpc_toolkit::yajrc::RpcError; use rpc_toolkit::{ - from_fn_async, CallRemote, Context, Empty, HandlerArgs, HandlerExt, HandlerFor, ParentHandler, + CallRemote, Context, Empty, HandlerArgs, HandlerExt, HandlerFor, ParentHandler, from_fn_async, }; use serde::de::{self, DeserializeOwned}; use serde::{Deserialize, Serialize}; @@ -30,9 +30,9 @@ use crate::error::ResultExt; use crate::lxc::ContainerId; use crate::prelude::*; use crate::rpc_continuations::{Guid, RpcContinuation, RpcContinuations}; +use crate::util::Invoke; use crate::util::net::WebSocketExt; use crate::util::serde::Reversible; -use crate::util::Invoke; #[pin_project::pin_project] pub struct LogStream { diff --git a/core/startos/src/lxc/mod.rs b/core/startos/src/lxc/mod.rs index 4ad11ecae..ff9f0fc24 100644 --- a/core/startos/src/lxc/mod.rs +++ b/core/startos/src/lxc/mod.rs @@ -31,7 +31,7 @@ use crate::rpc_continuations::{Guid, RpcContinuation}; use crate::service::ServiceStats; use crate::util::io::open_file; use crate::util::rpc_client::UnixRpcClient; -use crate::util::{new_guid, Invoke}; +use crate::util::{Invoke, new_guid}; const LXC_CONTAINER_DIR: &str = "/var/lib/lxc"; const RPC_DIR: &str = "media/startos/rpc"; // must not be absolute path diff --git a/core/startos/src/middleware/auth.rs b/core/startos/src/middleware/auth.rs index 0032b2dc1..01c3eafbc 100644 --- a/core/startos/src/middleware/auth.rs +++ b/core/startos/src/middleware/auth.rs @@ -13,9 +13,9 @@ use chrono::Utc; use color_eyre::eyre::eyre; use digest::Digest; use helpers::const_true; -use http::header::{COOKIE, USER_AGENT}; use http::HeaderValue; -use imbl_value::{json, InternedString}; +use http::header::{COOKIE, USER_AGENT}; +use imbl_value::{InternedString, json}; use rand::random; use rpc_toolkit::yajrc::INTERNAL_ERROR; use rpc_toolkit::{Middleware, RpcRequest, RpcResponse}; @@ -25,18 +25,18 @@ use tokio::io::AsyncWriteExt; use tokio::process::Command; use tokio::sync::Mutex; -use crate::auth::{check_password, write_shadow, Sessions}; +use crate::auth::{Sessions, check_password, write_shadow}; use crate::context::RpcContext; use crate::db::model::Database; use crate::middleware::signature::{SignatureAuth, SignatureAuthContext}; use crate::prelude::*; use crate::rpc_continuations::OpenAuthedContinuations; use crate::sign::AnyVerifyingKey; +use crate::util::Invoke; use crate::util::io::{create_file_mod, read_file_to_string}; use crate::util::iter::TransposeResultIterExt; use crate::util::serde::BASE64; use crate::util::sync::SyncMutex; -use crate::util::Invoke; pub trait AuthContext: SignatureAuthContext { const LOCAL_AUTH_COOKIE_PATH: &str; diff --git a/core/startos/src/middleware/db.rs b/core/startos/src/middleware/db.rs index 4e5f0e037..ec0b94821 100644 --- a/core/startos/src/middleware/db.rs +++ b/core/startos/src/middleware/db.rs @@ -1,6 +1,6 @@ use axum::response::Response; -use http::header::InvalidHeaderValue; use http::HeaderValue; +use http::header::InvalidHeaderValue; use rpc_toolkit::{Middleware, RpcRequest, RpcResponse}; use serde::Deserialize; diff --git a/core/startos/src/middleware/signature.rs b/core/startos/src/middleware/signature.rs index 9b651b73a..b07d79a20 100644 --- a/core/startos/src/middleware/signature.rs +++ b/core/startos/src/middleware/signature.rs @@ -8,15 +8,15 @@ use axum::extract::Request; use http::HeaderValue; use rpc_toolkit::yajrc::RpcError; use rpc_toolkit::{Context, Middleware, RpcRequest, RpcResponse}; -use serde::de::DeserializeOwned; use serde::Deserialize; +use serde::de::DeserializeOwned; use tokio::sync::Mutex; use url::Url; use crate::context::CliContext; use crate::prelude::*; -use crate::sign::commitment::request::RequestCommitment; use crate::sign::commitment::Commitment; +use crate::sign::commitment::request::RequestCommitment; use crate::sign::{AnySignature, AnySigningKey, AnyVerifyingKey, SignatureScheme}; use crate::util::serde::Base64; @@ -28,7 +28,7 @@ pub trait SignatureAuthContext: Context { fn sig_context( &self, ) -> impl Future + Send, Error>> + Send> - + Send; + + Send; fn check_pubkey( db: &Model, pubkey: Option<&AnyVerifyingKey>, @@ -223,10 +223,10 @@ pub async fn call_remote( method: &str, params: Value, ) -> Result { - use reqwest::header::{ACCEPT, CONTENT_LENGTH, CONTENT_TYPE}; use reqwest::Method; - use rpc_toolkit::yajrc::{GenericRpcMethod, Id, RpcRequest}; + use reqwest::header::{ACCEPT, CONTENT_LENGTH, CONTENT_TYPE}; use rpc_toolkit::RpcResponse; + use rpc_toolkit::yajrc::{GenericRpcMethod, Id, RpcRequest}; let rpc_req = RpcRequest { id: Some(Id::Number(0.into())), diff --git a/core/startos/src/net/acme.rs b/core/startos/src/net/acme.rs index 3348cc2f6..f1648f3eb 100644 --- a/core/startos/src/net/acme.rs +++ b/core/startos/src/net/acme.rs @@ -2,21 +2,21 @@ use std::collections::{BTreeMap, BTreeSet}; use std::str::FromStr; use async_acme::acme::Identifier; -use clap::builder::ValueParserFactory; use clap::Parser; +use clap::builder::ValueParserFactory; use imbl_value::InternedString; use itertools::Itertools; use models::{ErrorData, FromStrParser}; use openssl::pkey::{PKey, Private}; use openssl::x509::X509; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; use url::Url; use crate::context::{CliContext, RpcContext}; -use crate::db::model::public::AcmeSettings; use crate::db::model::Database; +use crate::db::model::public::AcmeSettings; use crate::prelude::*; use crate::util::serde::{Pem, Pkcs8Doc}; diff --git a/core/startos/src/net/dns.rs b/core/startos/src/net/dns.rs index aea5cd99a..deb6e40a9 100644 --- a/core/startos/src/net/dns.rs +++ b/core/startos/src/net/dns.rs @@ -1,17 +1,19 @@ use std::borrow::Borrow; use std::collections::BTreeMap; -use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; +use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; use std::sync::{Arc, Weak}; use std::time::Duration; use clap::Parser; use color_eyre::eyre::eyre; -use futures::{FutureExt, TryStreamExt}; +use futures::future::BoxFuture; +use futures::{FutureExt, StreamExt, TryStreamExt}; use helpers::NonDetachingJoinHandle; use hickory_client::client::Client; use hickory_client::proto::runtime::TokioRuntimeProvider; +use hickory_client::proto::tcp::TcpClientStream; use hickory_client::proto::udp::UdpClientStream; -use hickory_client::proto::xfer::DnsRequestOptions; +use hickory_client::proto::xfer::{DnsExchangeBackground, DnsRequestOptions}; use hickory_client::proto::DnsHandle; use hickory_server::authority::MessageResponseBuilder; use hickory_server::proto::op::{Header, ResponseCode}; @@ -20,7 +22,7 @@ use hickory_server::server::{Request, RequestHandler, ResponseHandler, ResponseI use hickory_server::ServerFuture; use imbl::OrdMap; use imbl_value::InternedString; -use models::{GatewayId, PackageId}; +use models::{GatewayId, OptionExt, PackageId}; use rpc_toolkit::{ from_fn_async, from_fn_blocking, Context, HandlerArgs, HandlerExt, ParentHandler, }; @@ -30,10 +32,12 @@ use tracing::instrument; use crate::context::RpcContext; use crate::db::model::public::NetworkInterfaceInfo; +use crate::db::model::Database; use crate::net::gateway::NetworkInterfaceWatcher; +use crate::prelude::*; +use crate::util::io::file_string_stream; use crate::util::serde::{display_serializable, HandlerExtSerde}; use crate::util::sync::{SyncRwLock, Watch}; -use crate::{Error, ErrorKind, ResultExt}; pub fn dns_api() -> ParentHandler { ParentHandler::new() @@ -103,14 +107,35 @@ pub fn query_dns( #[derive(Deserialize, Serialize, Parser)] pub struct SetStaticDnsParams { - pub servers: Option>, + pub servers: Option>, } pub async fn set_static_dns( ctx: RpcContext, SetStaticDnsParams { servers }: SetStaticDnsParams, ) -> Result<(), Error> { - todo!() + ctx.db + .mutate(|db| { + db.as_public_mut() + .as_server_info_mut() + .as_network_mut() + .as_dns_mut() + .as_static_servers_mut() + .ser( + &servers + .map(|s| { + s.into_iter() + .map(|s| { + s.parse::() + .or_else(|_| s.parse::().map(|a| (a, 53).into())) + }) + .collect() + }) + .transpose()?, + ) + }) + .await + .result } #[derive(Default)] @@ -125,8 +150,120 @@ pub struct DnsController { dns_server: NonDetachingJoinHandle<()>, } +struct DnsClient { + client: Arc>>, + _thread: NonDetachingJoinHandle<()>, +} +impl DnsClient { + pub fn new(db: TypedPatchDb) -> Self { + let client = Arc::new(SyncRwLock::new(Vec::new())); + Self { + client: client.clone(), + _thread: tokio::spawn(async move { + loop { + if let Err::<(), Error>(e) = async { + let mut stream = file_string_stream("/run/systemd/resolve/resolv.conf") + .filter_map(|a| futures::future::ready(a.transpose())).boxed(); + let mut conf = stream + .next() + .await + .or_not_found("/run/systemd/resolve/resolv.conf")??; + let mut prev_nameservers = Vec::new(); + let mut bg = BTreeMap::>::new(); + loop { + let nameservers = conf + .lines() + .map(|l| l.trim()) + .filter_map(|l| l.strip_prefix("nameserver ")) + .map(|n| { + n.parse::() + .or_else(|_| n.parse::().map(|a| (a, 53).into())) + }) + .collect::, _>>()?; + let static_nameservers = db + .mutate(|db| { + let dns = db + .as_public_mut() + .as_server_info_mut() + .as_network_mut() + .as_dns_mut(); + dns.as_dhcp_servers_mut().ser(&nameservers)?; + dns.as_static_servers().de() + }) + .await + .result?; + let nameservers = static_nameservers.unwrap_or(nameservers); + if nameservers != prev_nameservers { + let mut existing: BTreeMap<_, _> = + client.peek(|c| c.iter().cloned().collect()); + let mut new = Vec::with_capacity(nameservers.len()); + for addr in &nameservers { + if let Some(existing) = existing.remove(addr) { + new.push((*addr, existing)); + } else { + let client = if let Ok((client, bg_thread)) = + Client::connect( + UdpClientStream::builder( + *addr, + TokioRuntimeProvider::new(), + ) + .build(), + ) + .await + { + bg.insert(*addr, bg_thread.boxed()); + client + } else { + let (stream, sender) = TcpClientStream::new( + *addr, + None, + Some(Duration::from_secs(30)), + TokioRuntimeProvider::new(), + ); + let (client, bg_thread) = + Client::new(stream, sender, None) + .await + .with_kind(ErrorKind::Network)?; + bg.insert(*addr, bg_thread.boxed()); + client + }; + new.push((*addr, client)); + } + } + bg.retain(|n, _| nameservers.iter().any(|a| a == n)); + prev_nameservers = nameservers; + } + tokio::select! { + c = stream.next() => conf = c.or_not_found("/run/systemd/resolve/resolv.conf")??, + _ = futures::future::join_all(bg.values_mut()) => (), + } + } + } + .await + { + tracing::error!("{e}"); + tracing::debug!("{e:?}"); + } + } + }) + .into(), + } + } + fn lookup( + &self, + query: hickory_client::proto::op::Query, + options: DnsRequestOptions, + ) -> Vec { + self.client.peek(|c| { + c.iter() + .map(|(_, c)| c.lookup(query.clone(), options.clone())) + .collect() + }) + } +} + struct Resolver { - client: hickory_client::client::Client, + client: DnsClient, net_iface: Watch>, resolve: Arc>, } @@ -271,29 +408,43 @@ impl RequestHandler for Resolver { } } else { let query = query.original().clone(); - let mut stream = self.client.lookup(query, DnsRequestOptions::default()); - let mut res = None; - while let Some(msg) = stream.try_next().await? { - res = Some( - response_handle - .send_response( - MessageResponseBuilder::from_message_request(&*request).build( - msg.header().clone(), - msg.answers(), - msg.name_servers(), - &msg.soa().map(|s| s.to_owned().into_record_of_rdata()), - msg.additionals(), - ), - ) - .await?, - ); + let mut streams = self.client.lookup(query, DnsRequestOptions::default()); + let mut err = None; + for stream in streams.iter_mut() { + match stream.next().await { + None => (), + Some(Err(e)) => err = Some(e), + Some(Ok(msg)) => { + return response_handle + .send_response( + MessageResponseBuilder::from_message_request(&*request).build( + msg.header().clone(), + msg.answers(), + msg.name_servers(), + &msg.soa().map(|s| s.to_owned().into_record_of_rdata()), + msg.additionals(), + ), + ) + .await; + } + } } - res.ok_or_else(|| { - std::io::Error::new( - std::io::ErrorKind::NotFound, - eyre!("no response from server"), + if let Some(e) = err { + tracing::error!("{e}"); + tracing::debug!("{e:?}"); + } + let res = Header::response_from_request(request.header()); + response_handle + .send_response( + MessageResponseBuilder::from_message_request(&*request).build( + res.into(), + [], + [], + [], + [], + ), ) - }) + .await } } .await @@ -309,50 +460,40 @@ impl RequestHandler for Resolver { impl DnsController { #[instrument(skip_all)] - pub async fn init(watcher: &NetworkInterfaceWatcher) -> Result { + pub async fn init( + db: TypedPatchDb, + watcher: &NetworkInterfaceWatcher, + ) -> Result { let resolve = Arc::new(SyncRwLock::new(ResolveMap::default())); - let stream = - UdpClientStream::builder(([127, 0, 0, 53], 5355).into(), TokioRuntimeProvider::new()) - .build(); - let (client, bg) = Client::connect(stream) - .await - .with_kind(ErrorKind::Network)?; - let mut server = ServerFuture::new(Resolver { - client, + client: DnsClient::new(db), net_iface: watcher.subscribe(), resolve: resolve.clone(), }); let dns_server = tokio::spawn( - futures::future::join( - async move { - server.register_listener( - TcpListener::bind((Ipv6Addr::UNSPECIFIED, 53)) - .await - .with_kind(ErrorKind::Network)?, - Duration::from_secs(30), - ); - server.register_socket( - UdpSocket::bind((Ipv6Addr::UNSPECIFIED, 53)) - .await - .with_kind(ErrorKind::Network)?, - ); - - server - .block_until_done() + async move { + server.register_listener( + TcpListener::bind((Ipv6Addr::UNSPECIFIED, 53)) .await - .with_kind(ErrorKind::Network) - } - .map(|r| { - r.log_err(); - }), - bg.map(|r| { - r.log_err(); - }), - ) - .map(|_| ()), + .with_kind(ErrorKind::Network)?, + Duration::from_secs(30), + ); + server.register_socket( + UdpSocket::bind((Ipv6Addr::UNSPECIFIED, 53)) + .await + .with_kind(ErrorKind::Network)?, + ); + + server + .block_until_done() + .await + .with_kind(ErrorKind::Network) + } + .map(|r| { + r.log_err(); + }), ) .into(); diff --git a/core/startos/src/net/forward.rs b/core/startos/src/net/forward.rs index 9a900069e..adc36ff62 100644 --- a/core/startos/src/net/forward.rs +++ b/core/startos/src/net/forward.rs @@ -15,8 +15,8 @@ use crate::db::model::public::NetworkInterfaceInfo; use crate::net::gateway::{DynInterfaceFilter, InterfaceFilter}; use crate::net::utils::ipv6_is_link_local; use crate::prelude::*; -use crate::util::sync::Watch; use crate::util::Invoke; +use crate::util::sync::Watch; pub const START9_BRIDGE_IFACE: &str = "lxcbr0"; pub const FIRST_DYNAMIC_PRIVATE_PORT: u16 = 49152; diff --git a/core/startos/src/net/gateway.rs b/core/startos/src/net/gateway.rs index 90036e1cf..d4346dbb0 100644 --- a/core/startos/src/net/gateway.rs +++ b/core/startos/src/net/gateway.rs @@ -316,6 +316,7 @@ trait Dhcp4Config { #[zvariant(signature = "dict")] struct Dhcp4Options { ntp_servers: Option, + domain_name_servers: Option, } impl TryFrom for Dhcp4Options { type Error = zbus::Error; @@ -323,6 +324,8 @@ impl TryFrom for Dhcp4Options { let dict = value.downcast_ref::()?; Ok(Self { ntp_servers: dict.get::<_, String>(&zbus::zvariant::Str::from_static("ntp_servers"))?, + domain_name_servers: dict + .get::<_, String>(&zbus::zvariant::Str::from_static("domain_name_servers"))?, }) } } @@ -622,12 +625,20 @@ async fn watch_ip( .chain(ip6_proxy.address_data().await?) .collect_vec(); let lan_ip = [ - dbg!(ip4_proxy.gateway().await?).parse::()?, - dbg!(ip6_proxy.gateway().await?).parse::()?, + Some(ip4_proxy.gateway().await?) + .filter(|g| !g.is_empty()) + .map(|g| g.parse::()) + .transpose()?, + Some(ip6_proxy.gateway().await?) + .filter(|g| !g.is_empty()) + .map(|g| g.parse::()) + .transpose()?, ] .into_iter() + .filter_map(|a| a) .collect(); let mut ntp_servers = OrdSet::new(); + let mut dns_servers = OrdSet::new(); if let Some(dhcp4_proxy) = &dhcp4_proxy { let dhcp = dhcp4_proxy.options().await?; if let Some(ntp) = dhcp.ntp_servers { @@ -636,15 +647,14 @@ async fn watch_ip( .map(InternedString::intern), ); } + if let Some(dns) = dhcp.domain_name_servers { + dns_servers.extend( + dns.split(",") + .map(|s| s.trim().parse::()) + .collect::, _>>()?, + ); + } } - let dns_servers = [] - .into_iter() - .chain(ip4_proxy.nameserver_data().await?) - .chain(ip6_proxy.nameserver_data().await?) - .map(|NameserverData { address }| { - address.parse::() - }) - .collect::>()?; let scope_id = if_nametoindex(iface.as_str()) .with_kind(ErrorKind::Network)?; let subnets: OrdSet = addresses @@ -852,22 +862,6 @@ impl NetworkInterfaceController { ) -> Result<(), Error> { tracing::debug!("syncronizing {info:?} to db"); - // let dns = todo!(); - let dns = info - .values() - .filter_map(|i| i.ip_info.as_ref()) - .flat_map(|i| &i.dns_servers) - .copied() - .collect(); - - db.mutate(|db| { - let net = db.as_public_mut().as_server_info_mut().as_network_mut(); - net.as_dns_mut().as_dhcp_servers_mut().ser(&dns)?; - net.as_gateways_mut().ser(info) - }) - .await - .result?; - let ntp: BTreeSet<_> = info .values() .filter_map(|i| i.ip_info.as_ref()) @@ -1191,23 +1185,39 @@ impl ListenerMap { } pub trait InterfaceFilter: Any + Clone + std::fmt::Debug + Eq + Ord + Send + Sync { + #[cfg_attr(feature = "unstable", inline(never))] fn filter(&self, id: &GatewayId, info: &NetworkInterfaceInfo) -> bool; + #[cfg_attr(feature = "unstable", inline(never))] fn simplify(&self) -> &dyn DynInterfaceFilterT { self } + #[cfg_attr(feature = "unstable", inline(never))] fn eq(&self, other: &dyn Any) -> bool { Some(self) == other.downcast_ref::() } + #[cfg_attr(feature = "unstable", inline(never))] fn cmp(&self, other: &dyn Any) -> std::cmp::Ordering { - match self.as_any().type_id().cmp(&other.type_id()) { - std::cmp::Ordering::Equal => std::cmp::Ord::cmp(&self, other.downcast_ref().unwrap()), + match (self as &dyn Any).type_id().cmp(&other.type_id()) { + std::cmp::Ordering::Equal => { + std::cmp::Ord::cmp(self, other.downcast_ref::().unwrap()) + } ord => ord, } } + #[cfg_attr(feature = "unstable", inline(never))] fn as_any(&self) -> &dyn Any { self } fn into_dyn(self) -> DynInterfaceFilter { + #[cfg(feature = "unstable")] + { + let res = DynInterfaceFilter::new(self.clone()); + if !DynInterfaceFilterT::eq(&self, &res) || !DynInterfaceFilterT::eq(&res, &self) { + panic!("self != self") + } + res + } + #[cfg(not(feature = "unstable"))] DynInterfaceFilter::new(self) } } @@ -1285,12 +1295,9 @@ impl InterfaceFilter for AndFilter }) .into_inner() } else { - match InterfaceFilter::as_any(self) - .type_id() - .cmp(&other.type_id()) - { + match (self as &dyn Any).type_id().cmp(&other.type_id()) { std::cmp::Ordering::Equal => { - std::cmp::Ord::cmp(&self, other.downcast_ref().unwrap()) + std::cmp::Ord::cmp(self, other.downcast_ref::().unwrap()) } ord => ord, } @@ -1337,12 +1344,9 @@ impl InterfaceFilter for OrFilter }) .into_inner() } else { - match InterfaceFilter::as_any(self) - .type_id() - .cmp(&other.type_id()) - { + match (self as &dyn Any).type_id().cmp(&other.type_id()) { std::cmp::Ordering::Equal => { - std::cmp::Ord::cmp(&self, other.downcast_ref().unwrap()) + std::cmp::Ord::cmp(self, other.downcast_ref::().unwrap()) } ord => ord, } @@ -1380,7 +1384,7 @@ impl InterfaceFilter for AllFilter { } } -pub trait DynInterfaceFilterT: std::fmt::Debug + Send + Sync { +pub trait DynInterfaceFilterT: std::fmt::Debug + Any + Send + Sync { fn filter(&self, id: &GatewayId, info: &NetworkInterfaceInfo) -> bool; fn eq(&self, other: &dyn Any) -> bool; fn cmp(&self, other: &dyn Any) -> std::cmp::Ordering; @@ -1392,15 +1396,15 @@ impl DynInterfaceFilterT for T { } fn eq(&self, other: &dyn Any) -> bool { let simplified = self.simplify(); - if std::ptr::eq(simplified, self) { + if (simplified as &dyn Any).is::() { InterfaceFilter::eq(self, other) } else { - simplified.eq(other) + dbg!(simplified.eq(other)) } } fn cmp(&self, other: &dyn Any) -> std::cmp::Ordering { let simplified = self.simplify(); - if std::ptr::eq(simplified, self) { + if (simplified as &dyn Any).is::() { InterfaceFilter::cmp(self, other) } else { simplified.cmp(other) @@ -1408,7 +1412,7 @@ impl DynInterfaceFilterT for T { } fn as_any(&self) -> &dyn Any { let simplified = self.simplify(); - if std::ptr::eq(simplified, self) { + if (simplified as &dyn Any).is::() { InterfaceFilter::as_any(self) } else { simplified.as_any() @@ -1571,6 +1575,7 @@ impl NetworkInterfaceListener { self.listeners.port } + #[cfg_attr(feature = "unstable", inline(never))] pub fn poll_accept( &mut self, cx: &mut std::task::Context<'_>, @@ -1580,7 +1585,7 @@ impl NetworkInterfaceListener { || !InterfaceFilter::eq(&self.listeners.prev_filter, filter) { self.ip_info - .peek(|ip_info| self.listeners.update(ip_info, filter))?; + .peek_and_mark_seen(|ip_info| self.listeners.update(ip_info, filter))?; } self.listeners.poll_accept(cx) } diff --git a/core/startos/src/net/host/address.rs b/core/startos/src/net/host/address.rs index 3f1d7ffcf..03957c767 100644 --- a/core/startos/src/net/host/address.rs +++ b/core/startos/src/net/host/address.rs @@ -3,17 +3,17 @@ use std::collections::BTreeSet; use clap::Parser; use imbl_value::InternedString; use models::GatewayId; -use rpc_toolkit::{from_fn_async, Context, Empty, HandlerArgs, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, Empty, HandlerArgs, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; use crate::context::{CliContext, RpcContext}; use crate::db::model::DatabaseModel; use crate::net::acme::AcmeProvider; -use crate::net::host::{all_hosts, HostApiKind}; +use crate::net::host::{HostApiKind, all_hosts}; use crate::net::tor::OnionAddress; use crate::prelude::*; -use crate::util::serde::{display_serializable, HandlerExtSerde}; +use crate::util::serde::{HandlerExtSerde, display_serializable}; #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] @@ -73,8 +73,8 @@ fn check_duplicates(db: &DatabaseModel) -> Result<(), Error> { Ok(()) } -pub fn address_api( -) -> ParentHandler { +pub fn address_api() +-> ParentHandler { ParentHandler::::new() .subcommand( "domain", diff --git a/core/startos/src/net/host/binding.rs b/core/startos/src/net/host/binding.rs index d37a74dad..75508aed4 100644 --- a/core/startos/src/net/host/binding.rs +++ b/core/startos/src/net/host/binding.rs @@ -1,11 +1,11 @@ use std::collections::{BTreeMap, BTreeSet}; use std::str::FromStr; -use clap::builder::ValueParserFactory; use clap::Parser; +use clap::builder::ValueParserFactory; use imbl::OrdSet; use models::{FromStrParser, GatewayId, HostId}; -use rpc_toolkit::{from_fn_async, Context, Empty, HandlerArgs, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, Empty, HandlerArgs, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; @@ -16,7 +16,7 @@ use crate::net::gateway::InterfaceFilter; use crate::net::host::HostApiKind; use crate::net::vhost::AlpnInfo; use crate::prelude::*; -use crate::util::serde::{display_serializable, HandlerExtSerde}; +use crate::util::serde::{HandlerExtSerde, display_serializable}; #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, TS)] #[ts(export)] @@ -169,8 +169,8 @@ pub struct AddSslOptions { pub alpn: Option, } -pub fn binding( -) -> ParentHandler { +pub fn binding() +-> ParentHandler { ParentHandler::::new() .subcommand( "list", diff --git a/core/startos/src/net/host/mod.rs b/core/startos/src/net/host/mod.rs index 5b10f3d9c..a921d436c 100644 --- a/core/startos/src/net/host/mod.rs +++ b/core/startos/src/net/host/mod.rs @@ -6,15 +6,15 @@ use clap::Parser; use imbl_value::InternedString; use itertools::Itertools; use models::{HostId, PackageId}; -use rpc_toolkit::{from_fn_async, Context, Empty, HandlerExt, OrEmpty, ParentHandler}; +use rpc_toolkit::{Context, Empty, HandlerExt, OrEmpty, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; use crate::context::RpcContext; use crate::db::model::DatabaseModel; use crate::net::forward::AvailablePorts; -use crate::net::host::address::{address_api, HostAddress, PublicDomainConfig}; -use crate::net::host::binding::{binding, BindInfo, BindOptions}; +use crate::net::host::address::{HostAddress, PublicDomainConfig, address_api}; +use crate::net::host::binding::{BindInfo, BindOptions, binding}; use crate::net::service_interface::HostnameInfo; use crate::net::tor::OnionAddress; use crate::prelude::*; diff --git a/core/startos/src/net/net_controller.rs b/core/startos/src/net/net_controller.rs index e2675860c..b113f1435 100644 --- a/core/startos/src/net/net_controller.rs +++ b/core/startos/src/net/net_controller.rs @@ -50,8 +50,8 @@ impl NetController { Ok(Self { db: db.clone(), tor: TorController::new().await?, - vhost: VHostController::new(db, net_iface.clone()), - dns: DnsController::init(&net_iface.watcher).await?, + vhost: VHostController::new(db.clone(), net_iface.clone()), + dns: DnsController::init(db, &net_iface.watcher).await?, forward: PortForwardController::new(net_iface.watcher.subscribe()), net_iface, server_hostnames: vec![ diff --git a/core/startos/src/net/ssl.rs b/core/startos/src/net/ssl.rs index a89853591..9b0c51f3c 100644 --- a/core/startos/src/net/ssl.rs +++ b/core/startos/src/net/ssl.rs @@ -1,4 +1,4 @@ -use std::cmp::{min, Ordering}; +use std::cmp::{Ordering, min}; use std::collections::{BTreeMap, BTreeSet}; use std::net::IpAddr; use std::path::Path; @@ -13,18 +13,18 @@ use openssl::ec::{EcGroup, EcKey}; use openssl::hash::MessageDigest; use openssl::nid::Nid; use openssl::pkey::{PKey, Private}; -use openssl::x509::{X509Builder, X509Extension, X509NameBuilder, X509}; +use openssl::x509::{X509, X509Builder, X509Extension, X509NameBuilder}; use openssl::*; use patch_db::HasModel; use serde::{Deserialize, Serialize}; use tracing::instrument; +use crate::SOURCE_DATE; use crate::account::AccountInfo; use crate::hostname::Hostname; use crate::init::check_time_is_synchronized; use crate::prelude::*; use crate::util::serde::Pem; -use crate::SOURCE_DATE; #[derive(Debug, Deserialize, Serialize, HasModel)] #[model = "Model"] diff --git a/core/startos/src/net/static_server.rs b/core/startos/src/net/static_server.rs index ca19990d1..b055dec72 100644 --- a/core/startos/src/net/static_server.rs +++ b/core/startos/src/net/static_server.rs @@ -6,11 +6,11 @@ use std::sync::Arc; use std::time::UNIX_EPOCH; use async_compression::tokio::bufread::GzipEncoder; +use axum::Router; use axum::body::Body; use axum::extract::{self as x, Request}; use axum::response::{Redirect, Response}; use axum::routing::{any, get}; -use axum::Router; use base64::display::Base64Display; use digest::Digest; use futures::future::ready; @@ -37,12 +37,12 @@ use crate::middleware::auth::{Auth, HasValidSession}; use crate::middleware::cors::Cors; use crate::middleware::db::SyncDb; use crate::prelude::*; -use crate::sign::commitment::merkle_archive::MerkleArchiveCommitment; use crate::rpc_continuations::{Guid, RpcContinuations}; +use crate::s9pk::S9pk; +use crate::s9pk::merkle_archive::source::FileSource; use crate::s9pk::merkle_archive::source::http::HttpSource; use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; -use crate::s9pk::merkle_archive::source::FileSource; -use crate::s9pk::S9pk; +use crate::sign::commitment::merkle_archive::MerkleArchiveCommitment; use crate::util::io::open_file; use crate::util::net::SyncBody; use crate::util::serde::BASE64; diff --git a/core/startos/src/net/tor.rs b/core/startos/src/net/tor.rs index aacbe4cc6..af6666fb1 100644 --- a/core/startos/src/net/tor.rs +++ b/core/startos/src/net/tor.rs @@ -357,7 +357,16 @@ pub enum OnionServiceState { } impl From for OnionServiceState { fn from(value: ArtiOnionServiceState) -> Self { - todo!() + match value { + ArtiOnionServiceState::Shutdown => Self::Shutdown, + ArtiOnionServiceState::Bootstrapping => Self::Bootstrapping, + ArtiOnionServiceState::DegradedReachable => Self::DegradedReachable, + ArtiOnionServiceState::DegradedUnreachable => Self::DegradedUnreachable, + ArtiOnionServiceState::Running => Self::Running, + ArtiOnionServiceState::Recovering => Self::Recovering, + ArtiOnionServiceState::Broken => Self::Broken, + _ => unreachable!(), + } } } @@ -369,7 +378,7 @@ pub async fn list_services( } pub struct TorController { - client: TorClient, + client: Arc>>, services: SyncMutex>, } impl TorController { @@ -381,10 +390,12 @@ impl TorController { .primary() .kind(ArtiKeystoreKind::Ephemeral.into()); Ok(Self { - client: TorClient::with_runtime(TokioRustlsRuntime::current()?) - .config(config.build().with_kind(ErrorKind::Tor)?) - .create_unbootstrapped_async() - .await?, + client: Arc::new(SyncRwLock::new( + TorClient::with_runtime(TokioRustlsRuntime::current()?) + .config(config.build().with_kind(ErrorKind::Tor)?) + .create_unbootstrapped_async() + .await?, + )), services: SyncMutex::new(BTreeMap::new()), }) } @@ -440,11 +451,14 @@ impl TorController { } pub async fn reset(&self, wipe_state: bool) -> Result<(), Error> { - todo!() + // todo!() + Ok(()) } pub async fn list_services(&self) -> Result, Error> { - todo!() + Ok(self + .services + .peek(|s| s.iter().map(|(a, s)| (a.clone(), s.state())).collect())) } } @@ -456,7 +470,10 @@ struct OnionServiceData { _thread: NonDetachingJoinHandle<()>, } impl OnionService { - fn launch(client: TorClient, key: TorSecretKey) -> Result { + fn launch( + client: Arc>>, + key: TorSecretKey, + ) -> Result { let service = Arc::new(SyncMutex::new(None)); let bindings = Arc::new(SyncRwLock::new(BTreeMap::< u16, @@ -471,8 +488,8 @@ impl OnionService { .run_while(async { loop { if let Err(e) = async { - let (new_service, mut stream) = client - .launch_onion_service_with_hsid( + let (new_service, mut stream) = client.peek(|c| { + c.launch_onion_service_with_hsid( OnionServiceConfigBuilder::default() .nickname( key.onion_address() @@ -485,7 +502,8 @@ impl OnionService { .with_kind(ErrorKind::Tor)?, key.clone().0, ) - .with_kind(ErrorKind::Tor)?; + .with_kind(ErrorKind::Tor) + })?; service.replace(Some(new_service)); while let Some(req) = stream.next().await { bg.add_job({ @@ -608,4 +626,11 @@ impl OnionService { self.0._thread.abort(); Ok(()) } + + pub fn state(&self) -> OnionServiceState { + self.0 + .service + .peek(|s| s.as_ref().map(|s| s.status().state().into())) + .unwrap_or(OnionServiceState::Bootstrapping) + } } diff --git a/core/startos/src/net/tunnel.rs b/core/startos/src/net/tunnel.rs index 228d736d9..2e9a21812 100644 --- a/core/startos/src/net/tunnel.rs +++ b/core/startos/src/net/tunnel.rs @@ -1,7 +1,7 @@ use clap::Parser; use imbl_value::InternedString; use models::GatewayId; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use tokio::process::Command; use ts_rs::TS; @@ -9,8 +9,8 @@ use ts_rs::TS; use crate::context::{CliContext, RpcContext}; use crate::db::model::public::NetworkInterfaceType; use crate::prelude::*; -use crate::util::io::{write_file_atomic, TmpDir}; use crate::util::Invoke; +use crate::util::io::{TmpDir, write_file_atomic}; pub fn tunnel_api() -> ParentHandler { ParentHandler::new() diff --git a/core/startos/src/net/vhost.rs b/core/startos/src/net/vhost.rs index e62ee120e..40fb1441c 100644 --- a/core/startos/src/net/vhost.rs +++ b/core/startos/src/net/vhost.rs @@ -2,7 +2,7 @@ use std::collections::{BTreeMap, BTreeSet}; use std::net::{IpAddr, SocketAddr}; use std::sync::{Arc, Weak}; -use async_acme::acme::{Identifier, ACME_TLS_ALPN_NAME}; +use async_acme::acme::{ACME_TLS_ALPN_NAME, Identifier}; use axum::body::Body; use axum::extract::Request; use axum::response::Response; @@ -14,7 +14,7 @@ use imbl::OrdMap; use imbl_value::InternedString; use itertools::Itertools; use models::{GatewayId, ResultExt}; -use rpc_toolkit::{from_fn, Context, HandlerArgs, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerArgs, HandlerExt, ParentHandler, from_fn}; use serde::{Deserialize, Serialize}; use tokio::io::AsyncWriteExt; use tokio::net::TcpStream; @@ -27,14 +27,14 @@ use tokio_rustls::rustls::server::{Acceptor, ResolvesServerCert}; use tokio_rustls::rustls::sign::CertifiedKey; use tokio_rustls::rustls::{RootCertStore, ServerConfig}; use tokio_rustls::{LazyConfigAcceptor, TlsConnector}; -use tokio_stream::wrappers::WatchStream; use tokio_stream::StreamExt; +use tokio_stream::wrappers::WatchStream; use tracing::instrument; use ts_rs::TS; use crate::context::{CliContext, RpcContext}; -use crate::db::model::public::NetworkInterfaceInfo; use crate::db::model::Database; +use crate::db::model::public::NetworkInterfaceInfo; use crate::net::acme::{AcmeCertCache, AcmeProvider}; use crate::net::gateway::{ Accepted, AnyFilter, DynInterfaceFilter, InterfaceFilter, NetworkInterfaceController, @@ -44,7 +44,7 @@ use crate::net::static_server::server_error; use crate::prelude::*; use crate::util::collections::EqSet; use crate::util::io::BackTrackingIO; -use crate::util::serde::{display_serializable, HandlerExtSerde, MaybeUtf8String}; +use crate::util::serde::{HandlerExtSerde, MaybeUtf8String, display_serializable}; use crate::util::sync::SyncMutex; pub fn vhost_api() -> ParentHandler { diff --git a/core/startos/src/net/web_server.rs b/core/startos/src/net/web_server.rs index 64c4ff1a1..dad3c9702 100644 --- a/core/startos/src/net/web_server.rs +++ b/core/startos/src/net/web_server.rs @@ -23,7 +23,7 @@ use crate::net::static_server::{ }; use crate::prelude::*; use crate::util::actor::background::BackgroundJobQueue; -use crate::util::sync::{SyncMutex, Watch}; +use crate::util::sync::{SyncMutex, SyncRwLock, Watch}; pub struct Accepted { pub https_redirect: bool, @@ -170,7 +170,7 @@ impl WebServer { let thread = NonDetachingJoinHandle::from(tokio::spawn(async move { #[derive(Clone)] struct QueueRunner { - queue: Arc>>, + queue: Arc>>, } impl hyper::rt::Executor for QueueRunner where @@ -215,7 +215,7 @@ impl WebServer { } } - let queue_cell = Arc::new(SyncMutex::new(None)); + let queue_cell = Arc::new(SyncRwLock::new(None)); let graceful = hyper_util::server::graceful::GracefulShutdown::new(); let mut server = hyper_util::server::conn::auto::Builder::new(QueueRunner { queue: queue_cell.clone(), @@ -231,7 +231,7 @@ impl WebServer { .keep_alive_interval(Duration::from_secs(60)) .keep_alive_timeout(Duration::from_secs(300)); let (queue, mut runner) = BackgroundJobQueue::new(); - queue_cell.mutate(|q| *q = Some(queue.clone())); + queue_cell.replace(Some(queue.clone())); let handler = async { loop { @@ -266,7 +266,7 @@ impl WebServer { } drop(queue); - drop(queue_cell.mutate(|q| q.take())); + drop(queue_cell.replace(None)); if !runner.is_empty() { tokio::time::timeout(Duration::from_secs(60), runner) diff --git a/core/startos/src/net/wifi.rs b/core/startos/src/net/wifi.rs index 73fa69db7..44465e501 100644 --- a/core/startos/src/net/wifi.rs +++ b/core/startos/src/net/wifi.rs @@ -3,12 +3,12 @@ use std::path::Path; use std::sync::Arc; use std::time::Duration; -use clap::builder::TypedValueParser; use clap::Parser; +use clap::builder::TypedValueParser; use isocountry::CountryCode; use lazy_static::lazy_static; use regex::Regex; -use rpc_toolkit::{from_fn_async, Context, Empty, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, Empty, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use tokio::process::Command; use tokio::sync::RwLock; @@ -16,11 +16,11 @@ use tracing::instrument; use ts_rs::TS; use crate::context::{CliContext, RpcContext}; -use crate::db::model::public::WifiInfo; use crate::db::model::Database; +use crate::db::model::public::WifiInfo; use crate::prelude::*; -use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; use crate::util::Invoke; +use crate::util::serde::{HandlerExtSerde, WithIoFormat, display_serializable}; use crate::{Error, ErrorKind}; type WifiManager = Arc>>; @@ -315,7 +315,12 @@ pub async fn remove(ctx: RpcContext, SsidParams { ssid }: SsidParams) -> Result< let is_current_removed_and_no_hardwire = is_current_being_removed && !interface_connected(&ctx.ethernet_interface).await?; if is_current_removed_and_no_hardwire { - return Err(Error::new(color_eyre::eyre::eyre!("Forbidden: Deleting this network would make your server unreachable. Either connect to ethernet or connect to a different WiFi network to remedy this."), ErrorKind::Wifi)); + return Err(Error::new( + color_eyre::eyre::eyre!( + "Forbidden: Deleting this network would make your server unreachable. Either connect to ethernet or connect to a different WiFi network to remedy this." + ), + ErrorKind::Wifi, + )); } wpa_supplicant.remove_network(ctx.db.clone(), &ssid).await?; diff --git a/core/startos/src/notifications.rs b/core/startos/src/notifications.rs index 5a1255705..f4eee6da9 100644 --- a/core/startos/src/notifications.rs +++ b/core/startos/src/notifications.rs @@ -3,13 +3,13 @@ use std::fmt; use std::str::FromStr; use chrono::{DateTime, Utc}; -use clap::builder::ValueParserFactory; use clap::Parser; +use clap::builder::ValueParserFactory; use color_eyre::eyre::eyre; use helpers::const_true; use imbl_value::InternedString; use models::{FromStrParser, PackageId}; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use tracing::instrument; use ts_rs::TS; diff --git a/core/startos/src/os_install/gpt.rs b/core/startos/src/os_install/gpt.rs index bb9712207..491c62431 100644 --- a/core/startos/src/os_install/gpt.rs +++ b/core/startos/src/os_install/gpt.rs @@ -1,10 +1,10 @@ use std::path::Path; -use gpt::disk::LogicalBlockSize; use gpt::GptConfig; +use gpt::disk::LogicalBlockSize; -use crate::disk::util::DiskInfo; use crate::disk::OsPartitionInfo; +use crate::disk::util::DiskInfo; use crate::os_install::partition_for; use crate::prelude::*; diff --git a/core/startos/src/os_install/mbr.rs b/core/startos/src/os_install/mbr.rs index 72319023c..6d85e29a3 100644 --- a/core/startos/src/os_install/mbr.rs +++ b/core/startos/src/os_install/mbr.rs @@ -1,10 +1,10 @@ use color_eyre::eyre::eyre; -use mbrman::{MBRPartitionEntry, CHS, MBR}; +use mbrman::{CHS, MBR, MBRPartitionEntry}; -use crate::disk::util::DiskInfo; -use crate::disk::OsPartitionInfo; -use crate::os_install::partition_for; use crate::Error; +use crate::disk::OsPartitionInfo; +use crate::disk::util::DiskInfo; +use crate::os_install::partition_for; pub async fn partition(disk: &DiskInfo, overwrite: bool) -> Result { { diff --git a/core/startos/src/os_install/mod.rs b/core/startos/src/os_install/mod.rs index 4cd8aac2d..651838cfb 100644 --- a/core/startos/src/os_install/mod.rs +++ b/core/startos/src/os_install/mod.rs @@ -3,13 +3,15 @@ use std::path::{Path, PathBuf}; use clap::Parser; use color_eyre::eyre::eyre; use models::Error; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use tokio::process::Command; use ts_rs::TS; +use crate::ARCH; use crate::context::config::ServerConfig; use crate::context::{CliContext, InstallContext}; +use crate::disk::OsPartitionInfo; use crate::disk::mount::filesystem::bind::Bind; use crate::disk::mount::filesystem::block_dev::BlockDev; use crate::disk::mount::filesystem::efivarfs::EfiVarFs; @@ -17,14 +19,12 @@ use crate::disk::mount::filesystem::overlayfs::OverlayFs; use crate::disk::mount::filesystem::{MountType, ReadWrite}; use crate::disk::mount::guard::{GenericMountGuard, MountGuard, TmpMountGuard}; use crate::disk::util::{DiskInfo, PartitionTable}; -use crate::disk::OsPartitionInfo; use crate::net::utils::find_eth_iface; use crate::prelude::*; use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; -use crate::util::io::{delete_file, open_file, TmpDir}; -use crate::util::serde::IoFormat; use crate::util::Invoke; -use crate::ARCH; +use crate::util::io::{TmpDir, delete_file, open_file}; +use crate::util::serde::IoFormat; mod gpt; mod mbr; diff --git a/core/startos/src/registry/admin.rs b/core/startos/src/registry/admin.rs index 04e7fdfc4..e28397b5a 100644 --- a/core/startos/src/registry/admin.rs +++ b/core/startos/src/registry/admin.rs @@ -3,18 +3,18 @@ use std::path::PathBuf; use clap::Parser; use itertools::Itertools; -use rpc_toolkit::{from_fn_async, Context, HandlerArgs, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerArgs, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; use crate::context::CliContext; use crate::prelude::*; -use crate::registry::context::RegistryContext; -use crate::sign::AnyVerifyingKey; -use crate::registry::signer::{ContactInfo, SignerInfo}; use crate::registry::RegistryDatabase; +use crate::registry::context::RegistryContext; +use crate::registry::signer::{ContactInfo, SignerInfo}; use crate::rpc_continuations::Guid; -use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; +use crate::sign::AnyVerifyingKey; +use crate::util::serde::{HandlerExtSerde, WithIoFormat, display_serializable}; pub fn admin_api() -> ParentHandler { ParentHandler::new() diff --git a/core/startos/src/registry/asset.rs b/core/startos/src/registry/asset.rs index 274da5955..fb317c153 100644 --- a/core/startos/src/registry/asset.rs +++ b/core/startos/src/registry/asset.rs @@ -11,13 +11,13 @@ use url::Url; use crate::prelude::*; use crate::progress::PhaseProgressTrackerHandle; +use crate::registry::signer::AcceptSigners; +use crate::s9pk::S9pk; +use crate::s9pk::merkle_archive::source::http::HttpSource; +use crate::s9pk::merkle_archive::source::{ArchiveSource, Section}; use crate::sign::commitment::merkle_archive::MerkleArchiveCommitment; use crate::sign::commitment::{Commitment, Digestable}; use crate::sign::{AnySignature, AnyVerifyingKey}; -use crate::registry::signer::AcceptSigners; -use crate::s9pk::merkle_archive::source::http::HttpSource; -use crate::s9pk::merkle_archive::source::{ArchiveSource, Section}; -use crate::s9pk::S9pk; use crate::upload::UploadingFile; #[derive(Debug, Deserialize, Serialize, TS)] diff --git a/core/startos/src/registry/context.rs b/core/startos/src/registry/context.rs index 402f03bb3..b97a2679f 100644 --- a/core/startos/src/registry/context.rs +++ b/core/startos/src/registry/context.rs @@ -17,13 +17,13 @@ use tracing::instrument; use ts_rs::TS; use url::Url; -use crate::context::config::{ContextConfig, CONFIG_PATH}; +use crate::context::config::{CONFIG_PATH, ContextConfig}; use crate::context::{CliContext, RpcContext}; use crate::middleware::signature::SignatureAuthContext; use crate::prelude::*; -use crate::registry::device_info::{DeviceInfo, DEVICE_INFO_HEADER}; -use crate::registry::signer::SignerInfo; use crate::registry::RegistryDatabase; +use crate::registry::device_info::{DEVICE_INFO_HEADER, DeviceInfo}; +use crate::registry::signer::SignerInfo; use crate::rpc_continuations::RpcContinuations; use crate::sign::AnyVerifyingKey; use crate::util::io::append_file; @@ -197,10 +197,10 @@ impl CallRemote for RpcContext { params: Value, RegistryUrlParams { registry }: RegistryUrlParams, ) -> Result { - use reqwest::header::{ACCEPT, CONTENT_LENGTH, CONTENT_TYPE}; use reqwest::Method; - use rpc_toolkit::yajrc::{GenericRpcMethod, Id, RpcRequest}; + use reqwest::header::{ACCEPT, CONTENT_LENGTH, CONTENT_TYPE}; use rpc_toolkit::RpcResponse; + use rpc_toolkit::yajrc::{GenericRpcMethod, Id, RpcRequest}; let url = registry.join("rpc/v0")?; method = method.strip_prefix("registry.").unwrap_or(method); diff --git a/core/startos/src/registry/db.rs b/core/startos/src/registry/db.rs index 59a55d9fb..3c3da4c12 100644 --- a/core/startos/src/registry/db.rs +++ b/core/startos/src/registry/db.rs @@ -2,19 +2,19 @@ use std::path::PathBuf; use clap::Parser; use itertools::Itertools; -use patch_db::json_ptr::{JsonPointer, ROOT}; use patch_db::Dump; +use patch_db::json_ptr::{JsonPointer, ROOT}; use rpc_toolkit::yajrc::RpcError; -use rpc_toolkit::{from_fn_async, Context, HandlerArgs, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerArgs, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use tracing::instrument; use ts_rs::TS; use crate::context::CliContext; use crate::prelude::*; -use crate::registry::context::RegistryContext; use crate::registry::RegistryDatabase; -use crate::util::serde::{apply_expr, HandlerExtSerde}; +use crate::registry::context::RegistryContext; +use crate::util::serde::{HandlerExtSerde, apply_expr}; pub fn db_api() -> ParentHandler { ParentHandler::new() diff --git a/core/startos/src/registry/device_info.rs b/core/startos/src/registry/device_info.rs index 410e45f8f..cb3f19089 100644 --- a/core/startos/src/registry/device_info.rs +++ b/core/startos/src/registry/device_info.rs @@ -15,8 +15,8 @@ use url::Url; use crate::context::RpcContext; use crate::prelude::*; use crate::registry::context::RegistryContext; -use crate::util::lshw::{LshwDevice, LshwDisplay, LshwProcessor}; use crate::util::VersionString; +use crate::util::lshw::{LshwDevice, LshwDisplay, LshwProcessor}; use crate::version::VersionT; pub const DEVICE_INFO_HEADER: &str = "X-StartOS-Device-Info"; diff --git a/core/startos/src/registry/info.rs b/core/startos/src/registry/info.rs index 382e0cae8..2793180a1 100644 --- a/core/startos/src/registry/info.rs +++ b/core/startos/src/registry/info.rs @@ -5,7 +5,7 @@ use clap::Parser; use imbl_value::InternedString; use itertools::Itertools; use models::DataUrl; -use rpc_toolkit::{from_fn_async, Context, Empty, HandlerArgs, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, Empty, HandlerArgs, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; diff --git a/core/startos/src/registry/mod.rs b/core/startos/src/registry/mod.rs index df67e5786..811188d4e 100644 --- a/core/startos/src/registry/mod.rs +++ b/core/startos/src/registry/mod.rs @@ -3,7 +3,7 @@ use std::collections::{BTreeMap, BTreeSet}; use axum::Router; use futures::future::ready; use models::DataUrl; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler, Server}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, Server, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; diff --git a/core/startos/src/registry/os/asset/add.rs b/core/startos/src/registry/os/asset/add.rs index 32e5fa1a4..e5ca3a934 100644 --- a/core/startos/src/registry/os/asset/add.rs +++ b/core/startos/src/registry/os/asset/add.rs @@ -7,7 +7,7 @@ use clap::Parser; use exver::Version; use imbl_value::InternedString; use itertools::Itertools; -use rpc_toolkit::{from_fn_async, Context, HandlerArgs, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerArgs, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; use url::Url; @@ -17,15 +17,15 @@ use crate::prelude::*; use crate::progress::{FullProgressTracker, ProgressUnits}; use crate::registry::asset::RegistryAsset; use crate::registry::context::RegistryContext; -use crate::registry::os::index::OsVersionInfo; use crate::registry::os::SIG_CONTEXT; +use crate::registry::os::index::OsVersionInfo; +use crate::s9pk::merkle_archive::hash::VerifyingWriter; +use crate::s9pk::merkle_archive::source::ArchiveSource; +use crate::s9pk::merkle_archive::source::http::HttpSource; +use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; use crate::sign::commitment::blake3::Blake3Commitment; use crate::sign::ed25519::Ed25519; use crate::sign::{AnySignature, AnyVerifyingKey, SignatureScheme}; -use crate::s9pk::merkle_archive::hash::VerifyingWriter; -use crate::s9pk::merkle_archive::source::http::HttpSource; -use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; -use crate::s9pk::merkle_archive::source::ArchiveSource; use crate::util::io::open_file; use crate::util::serde::Base64; @@ -101,10 +101,10 @@ async fn add_asset( commitment, }: AddAssetParams, accessor: impl FnOnce( - &mut Model, - ) -> &mut Model>> - + UnwindSafe - + Send, + &mut Model, + ) -> &mut Model>> + + UnwindSafe + + Send, ) -> Result<(), Error> { signer .scheme() @@ -207,7 +207,7 @@ pub async fn cli_add_asset( return Err(Error::new( eyre!("Unknown extension"), ErrorKind::InvalidRequest, - )) + )); } }; @@ -302,10 +302,10 @@ async fn remove_asset( signer, }: RemoveAssetParams, accessor: impl FnOnce( - &mut Model, - ) -> &mut Model>> - + UnwindSafe - + Send, + &mut Model, + ) -> &mut Model>> + + UnwindSafe + + Send, ) -> Result<(), Error> { ctx.db .mutate(|db| { diff --git a/core/startos/src/registry/os/asset/get.rs b/core/startos/src/registry/os/asset/get.rs index 2d84e7ce7..d3723c894 100644 --- a/core/startos/src/registry/os/asset/get.rs +++ b/core/startos/src/registry/os/asset/get.rs @@ -5,9 +5,9 @@ use std::path::{Path, PathBuf}; use clap::Parser; use exver::Version; use helpers::AtomicFile; -use imbl_value::{json, InternedString}; +use imbl_value::{InternedString, json}; use itertools::Itertools; -use rpc_toolkit::{from_fn_async, Context, HandlerArgs, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerArgs, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; @@ -16,11 +16,11 @@ use crate::prelude::*; use crate::progress::{FullProgressTracker, ProgressUnits}; use crate::registry::asset::RegistryAsset; use crate::registry::context::RegistryContext; -use crate::registry::os::index::OsVersionInfo; use crate::registry::os::SIG_CONTEXT; -use crate::sign::commitment::blake3::Blake3Commitment; -use crate::sign::commitment::Commitment; +use crate::registry::os::index::OsVersionInfo; use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; +use crate::sign::commitment::Commitment; +use crate::sign::commitment::blake3::Blake3Commitment; use crate::util::io::open_file; pub fn get_api() -> ParentHandler { @@ -62,10 +62,10 @@ async fn get_os_asset( ctx: RegistryContext, GetOsAssetParams { version, platform }: GetOsAssetParams, accessor: impl FnOnce( - &Model, - ) -> &Model>> - + UnwindSafe - + Send, + &Model, + ) -> &Model>> + + UnwindSafe + + Send, ) -> Result, Error> { accessor( ctx.db diff --git a/core/startos/src/registry/os/asset/mod.rs b/core/startos/src/registry/os/asset/mod.rs index 9cafa14a6..39b881128 100644 --- a/core/startos/src/registry/os/asset/mod.rs +++ b/core/startos/src/registry/os/asset/mod.rs @@ -1,4 +1,4 @@ -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; pub mod add; pub mod get; diff --git a/core/startos/src/registry/os/asset/sign.rs b/core/startos/src/registry/os/asset/sign.rs index 67cdb1c0d..61501b46e 100644 --- a/core/startos/src/registry/os/asset/sign.rs +++ b/core/startos/src/registry/os/asset/sign.rs @@ -6,7 +6,7 @@ use clap::Parser; use exver::Version; use imbl_value::InternedString; use itertools::Itertools; -use rpc_toolkit::{from_fn_async, Context, HandlerArgs, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerArgs, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; @@ -15,13 +15,13 @@ use crate::prelude::*; use crate::progress::FullProgressTracker; use crate::registry::asset::RegistryAsset; use crate::registry::context::RegistryContext; -use crate::registry::os::index::OsVersionInfo; use crate::registry::os::SIG_CONTEXT; +use crate::registry::os::index::OsVersionInfo; +use crate::s9pk::merkle_archive::source::ArchiveSource; +use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; use crate::sign::commitment::blake3::Blake3Commitment; use crate::sign::ed25519::Ed25519; use crate::sign::{AnySignature, AnyVerifyingKey, SignatureScheme}; -use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; -use crate::s9pk::merkle_archive::source::ArchiveSource; use crate::util::io::open_file; use crate::util::serde::Base64; @@ -70,10 +70,10 @@ async fn sign_asset( signature, }: SignAssetParams, accessor: impl FnOnce( - &mut Model, - ) -> &mut Model>> - + UnwindSafe - + Send, + &mut Model, + ) -> &mut Model>> + + UnwindSafe + + Send, ) -> Result<(), Error> { ctx.db .mutate(|db| { @@ -165,7 +165,7 @@ pub async fn cli_sign_asset( return Err(Error::new( eyre!("Unknown extension"), ErrorKind::InvalidRequest, - )) + )); } }; diff --git a/core/startos/src/registry/os/mod.rs b/core/startos/src/registry/os/mod.rs index a1d18cb03..3c2b95864 100644 --- a/core/startos/src/registry/os/mod.rs +++ b/core/startos/src/registry/os/mod.rs @@ -1,4 +1,4 @@ -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use crate::context::CliContext; use crate::util::serde::HandlerExtSerde; diff --git a/core/startos/src/registry/os/version/mod.rs b/core/startos/src/registry/os/version/mod.rs index 9ca54e17a..4fb2b10e9 100644 --- a/core/startos/src/registry/os/version/mod.rs +++ b/core/startos/src/registry/os/version/mod.rs @@ -5,7 +5,7 @@ use clap::Parser; use exver::{Version, VersionRange}; use imbl_value::InternedString; use itertools::Itertools; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; @@ -15,7 +15,7 @@ use crate::registry::context::RegistryContext; use crate::registry::device_info::DeviceInfo; use crate::registry::os::index::OsVersionInfo; use crate::sign::AnyVerifyingKey; -use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; +use crate::util::serde::{HandlerExtSerde, WithIoFormat, display_serializable}; pub mod signer; diff --git a/core/startos/src/registry/os/version/signer.rs b/core/startos/src/registry/os/version/signer.rs index d73311219..eab8215a3 100644 --- a/core/startos/src/registry/os/version/signer.rs +++ b/core/startos/src/registry/os/version/signer.rs @@ -2,7 +2,7 @@ use std::collections::BTreeMap; use clap::Parser; use exver::Version; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; diff --git a/core/startos/src/registry/package/add.rs b/core/startos/src/registry/package/add.rs index 995aba54f..7bd836ff9 100644 --- a/core/startos/src/registry/package/add.rs +++ b/core/startos/src/registry/package/add.rs @@ -15,13 +15,13 @@ use crate::prelude::*; use crate::progress::{FullProgressTracker, ProgressTrackerWriter, ProgressUnits}; use crate::registry::context::RegistryContext; use crate::registry::package::index::PackageVersionInfo; +use crate::s9pk::S9pk; +use crate::s9pk::merkle_archive::source::ArchiveSource; +use crate::s9pk::merkle_archive::source::http::HttpSource; +use crate::s9pk::v2::SIG_CONTEXT; use crate::sign::commitment::merkle_archive::MerkleArchiveCommitment; use crate::sign::ed25519::Ed25519; use crate::sign::{AnySignature, AnyVerifyingKey, SignatureScheme}; -use crate::s9pk::merkle_archive::source::http::HttpSource; -use crate::s9pk::merkle_archive::source::ArchiveSource; -use crate::s9pk::v2::SIG_CONTEXT; -use crate::s9pk::S9pk; use crate::util::io::TrackingIO; #[derive(Debug, Deserialize, Serialize, TS)] diff --git a/core/startos/src/registry/package/category.rs b/core/startos/src/registry/package/category.rs index 57ffb27a9..92e7d0df7 100644 --- a/core/startos/src/registry/package/category.rs +++ b/core/startos/src/registry/package/category.rs @@ -3,7 +3,7 @@ use std::collections::BTreeMap; use clap::Parser; use imbl_value::InternedString; use models::PackageId; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; @@ -11,7 +11,7 @@ use crate::context::CliContext; use crate::prelude::*; use crate::registry::context::RegistryContext; use crate::registry::package::index::Category; -use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; +use crate::util::serde::{HandlerExtSerde, WithIoFormat, display_serializable}; pub fn category_api() -> ParentHandler { ParentHandler::new() diff --git a/core/startos/src/registry/package/get.rs b/core/startos/src/registry/package/get.rs index 32a279fde..cdaef66a8 100644 --- a/core/startos/src/registry/package/get.rs +++ b/core/startos/src/registry/package/get.rs @@ -12,8 +12,8 @@ use crate::prelude::*; use crate::registry::context::RegistryContext; use crate::registry::device_info::DeviceInfo; use crate::registry::package::index::{PackageIndex, PackageVersionInfo}; -use crate::util::serde::{display_serializable, WithIoFormat}; use crate::util::VersionString; +use crate::util::serde::{WithIoFormat, display_serializable}; #[derive( Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize, TS, ValueEnum, diff --git a/core/startos/src/registry/package/index.rs b/core/startos/src/registry/package/index.rs index f4ca663da..22357d8ef 100644 --- a/core/startos/src/registry/package/index.rs +++ b/core/startos/src/registry/package/index.rs @@ -13,10 +13,10 @@ use crate::registry::asset::RegistryAsset; use crate::registry::context::RegistryContext; use crate::registry::device_info::DeviceInfo; use crate::rpc_continuations::Guid; +use crate::s9pk::S9pk; use crate::s9pk::git_hash::GitHash; use crate::s9pk::manifest::{Alerts, Description, HardwareRequirements}; use crate::s9pk::merkle_archive::source::FileSource; -use crate::s9pk::S9pk; use crate::sign::commitment::merkle_archive::MerkleArchiveCommitment; use crate::sign::{AnySignature, AnyVerifyingKey}; diff --git a/core/startos/src/registry/package/mod.rs b/core/startos/src/registry/package/mod.rs index 621e040f4..db9059a7f 100644 --- a/core/startos/src/registry/package/mod.rs +++ b/core/startos/src/registry/package/mod.rs @@ -1,4 +1,4 @@ -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use crate::context::CliContext; use crate::prelude::*; diff --git a/core/startos/src/registry/package/signer.rs b/core/startos/src/registry/package/signer.rs index 393c1c48e..09ed2f1c2 100644 --- a/core/startos/src/registry/package/signer.rs +++ b/core/startos/src/registry/package/signer.rs @@ -2,7 +2,7 @@ use std::collections::BTreeMap; use clap::Parser; use models::PackageId; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; diff --git a/core/startos/src/rpc_continuations.rs b/core/startos/src/rpc_continuations.rs index 4614f8fa6..a81d21a23 100644 --- a/core/startos/src/rpc_continuations.rs +++ b/core/startos/src/rpc_continuations.rs @@ -5,8 +5,8 @@ use std::sync::Mutex as SyncMutex; use std::task::{Context, Poll}; use std::time::Duration; -use axum::extract::ws::WebSocket; use axum::extract::Request; +use axum::extract::ws::WebSocket; use axum::response::Response; use clap::builder::ValueParserFactory; use futures::future::BoxFuture; @@ -14,7 +14,7 @@ use futures::{Future, FutureExt}; use helpers::TimedResource; use imbl_value::InternedString; use models::FromStrParser; -use tokio::sync::{broadcast, Mutex as AsyncMutex}; +use tokio::sync::{Mutex as AsyncMutex, broadcast}; use ts_rs::TS; #[allow(unused_imports)] diff --git a/core/startos/src/s9pk/merkle_archive/directory_contents.rs b/core/startos/src/s9pk/merkle_archive/directory_contents.rs index b39789222..5b85ab6c9 100644 --- a/core/startos/src/s9pk/merkle_archive/directory_contents.rs +++ b/core/startos/src/s9pk/merkle_archive/directory_contents.rs @@ -4,20 +4,20 @@ use std::path::{Path, PathBuf}; use std::sync::Arc; use blake3::Hash; -use futures::future::BoxFuture; use futures::FutureExt; +use futures::future::BoxFuture; use imbl::OrdMap; use imbl_value::InternedString; use itertools::Itertools; use tokio::io::AsyncRead; +use crate::CAP_10_MiB; use crate::prelude::*; use crate::s9pk::merkle_archive::sink::Sink; use crate::s9pk::merkle_archive::source::{ArchiveSource, DynFileSource, FileSource, Section}; use crate::s9pk::merkle_archive::write_queue::WriteQueue; -use crate::s9pk::merkle_archive::{varint, Entry, EntryContents}; +use crate::s9pk::merkle_archive::{Entry, EntryContents, varint}; use crate::util::io::{ParallelBlake3Writer, TrackingIO}; -use crate::CAP_10_MiB; #[derive(Clone)] pub struct DirectoryContents { @@ -145,7 +145,12 @@ impl DirectoryContents { { dir = d; } else { - return Err(Error::new(eyre!("failed to insert entry at path {path:?}: ancestor exists and is not a directory"), ErrorKind::Pack)); + return Err(Error::new( + eyre!( + "failed to insert entry at path {path:?}: ancestor exists and is not a directory" + ), + ErrorKind::Pack, + )); } } dir.insert(file.into(), entry); diff --git a/core/startos/src/s9pk/merkle_archive/expected.rs b/core/startos/src/s9pk/merkle_archive/expected.rs index 71088f243..5e49a5d64 100644 --- a/core/startos/src/s9pk/merkle_archive/expected.rs +++ b/core/startos/src/s9pk/merkle_archive/expected.rs @@ -2,9 +2,9 @@ use std::ffi::OsStr; use std::path::Path; use crate::prelude::*; +use crate::s9pk::merkle_archive::Entry; use crate::s9pk::merkle_archive::directory_contents::DirectoryContents; use crate::s9pk::merkle_archive::source::FileSource; -use crate::s9pk::merkle_archive::Entry; /// An object for tracking the files expected to be in an s9pk pub struct Expected<'a, T> { diff --git a/core/startos/src/s9pk/merkle_archive/file_contents.rs b/core/startos/src/s9pk/merkle_archive/file_contents.rs index c34193e31..c604e92c1 100644 --- a/core/startos/src/s9pk/merkle_archive/file_contents.rs +++ b/core/startos/src/s9pk/merkle_archive/file_contents.rs @@ -1,11 +1,11 @@ use blake3::Hash; use tokio::io::AsyncRead; +use crate::CAP_10_MiB; use crate::prelude::*; use crate::s9pk::merkle_archive::sink::Sink; use crate::s9pk::merkle_archive::source::{ArchiveSource, DynFileSource, FileSource, Section}; use crate::util::io::{ParallelBlake3Writer, TrackingIO}; -use crate::CAP_10_MiB; #[derive(Debug, Clone)] pub struct FileContents(S); diff --git a/core/startos/src/s9pk/merkle_archive/hash.rs b/core/startos/src/s9pk/merkle_archive/hash.rs index c7ad470e4..55d129f85 100644 --- a/core/startos/src/s9pk/merkle_archive/hash.rs +++ b/core/startos/src/s9pk/merkle_archive/hash.rs @@ -4,9 +4,9 @@ use blake3::Hash; use tokio::io::AsyncWrite; use tokio_util::either::Either; +use crate::CAP_10_MiB; use crate::prelude::*; use crate::util::io::{ParallelBlake3Writer, TeeWriter}; -use crate::CAP_10_MiB; #[pin_project::pin_project] pub struct VerifyingWriter { diff --git a/core/startos/src/s9pk/merkle_archive/mod.rs b/core/startos/src/s9pk/merkle_archive/mod.rs index 04cfbb294..6a8cfe301 100644 --- a/core/startos/src/s9pk/merkle_archive/mod.rs +++ b/core/startos/src/s9pk/merkle_archive/mod.rs @@ -6,17 +6,17 @@ use imbl_value::InternedString; use sha2::{Digest, Sha512}; use tokio::io::AsyncRead; +use crate::CAP_1_MiB; use crate::prelude::*; -use crate::sign::commitment::merkle_archive::MerkleArchiveCommitment; -use crate::sign::ed25519::Ed25519; -use crate::sign::SignatureScheme; use crate::s9pk::merkle_archive::directory_contents::DirectoryContents; use crate::s9pk::merkle_archive::file_contents::FileContents; use crate::s9pk::merkle_archive::sink::Sink; use crate::s9pk::merkle_archive::source::{ArchiveSource, DynFileSource, FileSource, Section}; use crate::s9pk::merkle_archive::write_queue::WriteQueue; +use crate::sign::SignatureScheme; +use crate::sign::commitment::merkle_archive::MerkleArchiveCommitment; +use crate::sign::ed25519::Ed25519; use crate::util::serde::Base64; -use crate::CAP_1_MiB; pub mod directory_contents; pub mod expected; @@ -128,7 +128,9 @@ impl MerkleArchive> { } else { if max_size > CAP_1_MiB as u64 { return Err(Error::new( - eyre!("root directory max size over 1MiB, cancelling download in case of DOS attack"), + eyre!( + "root directory max size over 1MiB, cancelling download in case of DOS attack" + ), ErrorKind::InvalidSignature, )); } diff --git a/core/startos/src/s9pk/merkle_archive/source/http.rs b/core/startos/src/s9pk/merkle_archive/source/http.rs index e58208277..c5a3facfd 100644 --- a/core/startos/src/s9pk/merkle_archive/source/http.rs +++ b/core/startos/src/s9pk/merkle_archive/source/http.rs @@ -12,8 +12,8 @@ use tokio_util::io::StreamReader; use crate::prelude::*; use crate::s9pk::merkle_archive::source::ArchiveSource; -use crate::util::io::TrackingIO; use crate::util::Apply; +use crate::util::io::TrackingIO; pub struct HttpSource { url: Url, diff --git a/core/startos/src/s9pk/merkle_archive/source/mod.rs b/core/startos/src/s9pk/merkle_archive/source/mod.rs index 6550d1829..c2daed6da 100644 --- a/core/startos/src/s9pk/merkle_archive/source/mod.rs +++ b/core/startos/src/s9pk/merkle_archive/source/mod.rs @@ -12,7 +12,7 @@ use tokio::io::{AsyncRead, AsyncReadExt, AsyncSeekExt, AsyncWrite, Take}; use crate::prelude::*; use crate::s9pk::merkle_archive::hash::VerifyingWriter; -use crate::util::io::{open_file, TmpDir}; +use crate::util::io::{TmpDir, open_file}; pub mod http; pub mod multi_cursor_file; diff --git a/core/startos/src/s9pk/merkle_archive/test.rs b/core/startos/src/s9pk/merkle_archive/test.rs index 820e5be92..7948ce63e 100644 --- a/core/startos/src/s9pk/merkle_archive/test.rs +++ b/core/startos/src/s9pk/merkle_archive/test.rs @@ -87,7 +87,7 @@ fn test(files: Vec<(PathBuf, String)>) -> Result<(), Error> { return Err(Error::new( eyre!("expected file at {path:?}"), ErrorKind::ParseS9pk, - )) + )); } } } diff --git a/core/startos/src/s9pk/mod.rs b/core/startos/src/s9pk/mod.rs index a06218d40..1eb30a95b 100644 --- a/core/startos/src/s9pk/mod.rs +++ b/core/startos/src/s9pk/mod.rs @@ -7,7 +7,7 @@ pub mod v2; use std::sync::Arc; use tokio::io::{AsyncReadExt, AsyncSeek}; -pub use v2::{manifest, S9pk}; +pub use v2::{S9pk, manifest}; use crate::prelude::*; use crate::progress::FullProgressTracker; diff --git a/core/startos/src/s9pk/rpc.rs b/core/startos/src/s9pk/rpc.rs index 98b46ac77..eced48e97 100644 --- a/core/startos/src/s9pk/rpc.rs +++ b/core/startos/src/s9pk/rpc.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use clap::Parser; use models::ImageId; -use rpc_toolkit::{from_fn_async, Empty, HandlerExt, ParentHandler}; +use rpc_toolkit::{Empty, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use ts_rs::TS; @@ -11,11 +11,11 @@ use crate::context::CliContext; use crate::prelude::*; use crate::s9pk::manifest::Manifest; use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; -use crate::s9pk::v2::pack::ImageConfig; use crate::s9pk::v2::SIG_CONTEXT; -use crate::util::io::{create_file, open_file, TmpDir}; -use crate::util::serde::{apply_expr, HandlerExtSerde}; +use crate::s9pk::v2::pack::ImageConfig; use crate::util::Apply; +use crate::util::io::{TmpDir, create_file, open_file}; +use crate::util::serde::{HandlerExtSerde, apply_expr}; pub const SKIP_ENV: &[&str] = &["TERM", "container", "HOME", "HOSTNAME"]; diff --git a/core/startos/src/s9pk/v1/builder.rs b/core/startos/src/s9pk/v1/builder.rs index 199742439..3bf9bd15a 100644 --- a/core/startos/src/s9pk/v1/builder.rs +++ b/core/startos/src/s9pk/v1/builder.rs @@ -3,11 +3,11 @@ use tokio::io::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt, SeekFrom}; use tracing::instrument; use typed_builder::TypedBuilder; +use super::SIG_CONTEXT; use super::header::{FileSection, Header}; use super::manifest::Manifest; -use super::SIG_CONTEXT; -use crate::util::io::to_cbor_async_writer; use crate::util::HashWriter; +use crate::util::io::to_cbor_async_writer; use crate::{Error, ResultExt}; #[derive(TypedBuilder)] @@ -31,15 +31,15 @@ pub struct S9pkPacker< scripts: Option, } impl< - 'a, - W: AsyncWriteExt + AsyncSeekExt + Unpin, - RLicense: AsyncReadExt + Unpin, - RInstructions: AsyncReadExt + Unpin, - RIcon: AsyncReadExt + Unpin, - RDockerImages: AsyncReadExt + Unpin, - RAssets: AsyncReadExt + Unpin, - RScripts: AsyncReadExt + Unpin, - > S9pkPacker<'a, W, RLicense, RInstructions, RIcon, RDockerImages, RAssets, RScripts> + 'a, + W: AsyncWriteExt + AsyncSeekExt + Unpin, + RLicense: AsyncReadExt + Unpin, + RInstructions: AsyncReadExt + Unpin, + RIcon: AsyncReadExt + Unpin, + RDockerImages: AsyncReadExt + Unpin, + RAssets: AsyncReadExt + Unpin, + RScripts: AsyncReadExt + Unpin, +> S9pkPacker<'a, W, RLicense, RInstructions, RIcon, RDockerImages, RAssets, RScripts> { /// BLOCKING #[instrument(skip_all)] diff --git a/core/startos/src/s9pk/v1/reader.rs b/core/startos/src/s9pk/v1/reader.rs index 5748d4d1d..c181eae89 100644 --- a/core/startos/src/s9pk/v1/reader.rs +++ b/core/startos/src/s9pk/v1/reader.rs @@ -15,12 +15,12 @@ use tokio::fs::File; use tokio::io::{AsyncRead, AsyncReadExt, AsyncSeek, AsyncSeekExt, BufReader, ReadBuf}; use tracing::instrument; -use super::header::{FileSection, Header, TableOfContents}; use super::SIG_CONTEXT; +use super::header::{FileSection, Header, TableOfContents}; use crate::prelude::*; use crate::s9pk::v1::docker::DockerReader; -use crate::util::io::open_file; use crate::util::VersionString; +use crate::util::io::open_file; #[pin_project::pin_project] #[derive(Debug)] diff --git a/core/startos/src/s9pk/v2/compat.rs b/core/startos/src/s9pk/v2/compat.rs index 568d8ed4f..f86f2ae87 100644 --- a/core/startos/src/s9pk/v2/compat.rs +++ b/core/startos/src/s9pk/v2/compat.rs @@ -16,10 +16,10 @@ use crate::s9pk::merkle_archive::source::TmpSource; use crate::s9pk::merkle_archive::{Entry, MerkleArchive}; use crate::s9pk::v1::manifest::{Manifest as ManifestV1, PackageProcedure}; use crate::s9pk::v1::reader::S9pkReader; -use crate::s9pk::v2::pack::{ImageSource, PackSource, CONTAINER_TOOL}; +use crate::s9pk::v2::pack::{CONTAINER_TOOL, ImageSource, PackSource}; use crate::s9pk::v2::{S9pk, SIG_CONTEXT}; -use crate::util::io::{create_file, TmpDir}; use crate::util::Invoke; +use crate::util::io::{TmpDir, create_file}; pub const MAGIC_AND_VERSION: &[u8] = &[0x3b, 0x3b, 0x01]; diff --git a/core/startos/src/s9pk/v2/manifest.rs b/core/startos/src/s9pk/v2/manifest.rs index 420c5bf9d..6dd3adf03 100644 --- a/core/startos/src/s9pk/v2/manifest.rs +++ b/core/startos/src/s9pk/v2/manifest.rs @@ -5,7 +5,7 @@ use color_eyre::eyre::eyre; use exver::{Version, VersionRange}; use imbl_value::InternedString; pub use models::PackageId; -use models::{mime, ImageId, VolumeId}; +use models::{ImageId, VolumeId, mime}; use serde::{Deserialize, Serialize}; use ts_rs::TS; use url::Url; @@ -16,8 +16,8 @@ use crate::s9pk::git_hash::GitHash; use crate::s9pk::merkle_archive::directory_contents::DirectoryContents; use crate::s9pk::merkle_archive::expected::{Expected, Filter}; use crate::s9pk::v2::pack::ImageConfig; -use crate::util::serde::Regex; use crate::util::VersionString; +use crate::util::serde::Regex; use crate::version::{Current, VersionT}; fn current_version() -> Version { @@ -153,7 +153,12 @@ impl Manifest { check_arch(&arch)?; } } else { - return Err(Error::new(eyre!("`emulateMissingAs` required for all images if no `arch` specified in `hardwareRequirements`"), ErrorKind::ParseS9pk)); + return Err(Error::new( + eyre!( + "`emulateMissingAs` required for all images if no `arch` specified in `hardwareRequirements`" + ), + ErrorKind::ParseS9pk, + )); } } Ok(expected.into_filter()) diff --git a/core/startos/src/s9pk/v2/mod.rs b/core/startos/src/s9pk/v2/mod.rs index 9d5de56c3..29dd543e0 100644 --- a/core/startos/src/s9pk/v2/mod.rs +++ b/core/startos/src/s9pk/v2/mod.rs @@ -3,12 +3,11 @@ use std::path::Path; use std::sync::Arc; use imbl_value::InternedString; -use models::{mime, DataUrl, PackageId}; +use models::{DataUrl, PackageId, mime}; use tokio::fs::File; use crate::dependencies::DependencyMetadata; use crate::prelude::*; -use crate::sign::commitment::merkle_archive::MerkleArchiveCommitment; use crate::s9pk::manifest::Manifest; use crate::s9pk::merkle_archive::sink::Sink; use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; @@ -17,7 +16,8 @@ use crate::s9pk::merkle_archive::source::{ }; use crate::s9pk::merkle_archive::{Entry, MerkleArchive}; use crate::s9pk::v2::pack::{ImageSource, PackSource}; -use crate::util::io::{open_file, TmpDir}; +use crate::sign::commitment::merkle_archive::MerkleArchiveCommitment; +use crate::util::io::{TmpDir, open_file}; use crate::util::serde::IoFormat; const MAGIC_AND_VERSION: &[u8] = &[0x3b, 0x3b, 0x02]; diff --git a/core/startos/src/s9pk/v2/pack.rs b/core/startos/src/s9pk/v2/pack.rs index 1e4aa0de0..6552ba40c 100644 --- a/core/startos/src/s9pk/v2/pack.rs +++ b/core/startos/src/s9pk/v2/pack.rs @@ -3,7 +3,7 @@ use std::path::{Path, PathBuf}; use std::sync::Arc; use clap::Parser; -use futures::future::{ready, BoxFuture}; +use futures::future::{BoxFuture, ready}; use futures::{FutureExt, TryStreamExt}; use imbl_value::InternedString; use models::{ImageId, PackageId, VersionString}; @@ -18,20 +18,20 @@ use crate::context::CliContext; use crate::dependencies::DependencyMetadata; use crate::prelude::*; use crate::rpc_continuations::Guid; +use crate::s9pk::S9pk; use crate::s9pk::git_hash::GitHash; use crate::s9pk::manifest::Manifest; use crate::s9pk::merkle_archive::directory_contents::DirectoryContents; use crate::s9pk::merkle_archive::source::http::HttpSource; use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; use crate::s9pk::merkle_archive::source::{ - into_dyn_read, ArchiveSource, DynFileSource, DynRead, FileSource, TmpSource, + ArchiveSource, DynFileSource, DynRead, FileSource, TmpSource, into_dyn_read, }; use crate::s9pk::merkle_archive::{Entry, MerkleArchive}; use crate::s9pk::v2::SIG_CONTEXT; -use crate::s9pk::S9pk; -use crate::util::io::{create_file, open_file, TmpDir}; +use crate::util::io::{TmpDir, create_file, open_file}; use crate::util::serde::IoFormat; -use crate::util::{new_guid, Invoke, PathOrUrl}; +use crate::util::{Invoke, PathOrUrl, new_guid}; #[cfg(not(feature = "docker"))] pub const CONTAINER_TOOL: &str = "podman"; @@ -369,10 +369,12 @@ impl ImageSource { workdir, .. } => { - vec![workdir - .as_deref() - .unwrap_or(Path::new(".")) - .join(dockerfile.as_deref().unwrap_or(Path::new("Dockerfile")))] + vec![ + workdir + .as_deref() + .unwrap_or(Path::new(".")) + .join(dockerfile.as_deref().unwrap_or(Path::new("Dockerfile"))), + ] } Self::DockerTag(_) => Vec::new(), } diff --git a/core/startos/src/service/cli.rs b/core/startos/src/service/cli.rs index eaf1f1b95..2db07040c 100644 --- a/core/startos/src/service/cli.rs +++ b/core/startos/src/service/cli.rs @@ -5,7 +5,7 @@ use clap::Parser; use imbl_value::Value; use once_cell::sync::OnceCell; use rpc_toolkit::yajrc::RpcError; -use rpc_toolkit::{call_remote_socket, yajrc, CallRemote, Context, Empty}; +use rpc_toolkit::{CallRemote, Context, Empty, call_remote_socket, yajrc}; use tokio::runtime::Runtime; use crate::lxc::HOST_RPC_SERVER_SOCKET; diff --git a/core/startos/src/service/effects/action.rs b/core/startos/src/service/effects/action.rs index 6f1bef852..f4f030bd0 100644 --- a/core/startos/src/service/effects/action.rs +++ b/core/startos/src/service/effects/action.rs @@ -1,9 +1,9 @@ use std::collections::BTreeSet; use models::{ActionId, PackageId, ReplayId}; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; -use crate::action::{display_action_result, ActionInput, ActionResult}; +use crate::action::{ActionInput, ActionResult, display_action_result}; use crate::db::model::package::{ ActionMetadata, Task, TaskCondition, TaskEntry, TaskSeverity, TaskTrigger, }; diff --git a/core/startos/src/service/effects/callbacks.rs b/core/startos/src/service/effects/callbacks.rs index 4ae45b451..b4c44d7a1 100644 --- a/core/startos/src/service/effects/callbacks.rs +++ b/core/startos/src/service/effects/callbacks.rs @@ -6,7 +6,7 @@ use std::time::{Duration, SystemTime}; use clap::Parser; use futures::future::join_all; use helpers::NonDetachingJoinHandle; -use imbl::{vector, Vector}; +use imbl::{Vector, vector}; use imbl_value::InternedString; use models::{HostId, PackageId, ServiceInterfaceId}; use serde::{Deserialize, Serialize}; diff --git a/core/startos/src/service/effects/control.rs b/core/startos/src/service/effects/control.rs index 266680e05..ff4ed5f27 100644 --- a/core/startos/src/service/effects/control.rs +++ b/core/startos/src/service/effects/control.rs @@ -3,9 +3,9 @@ use std::str::FromStr; use clap::builder::ValueParserFactory; use models::{FromStrParser, PackageId}; +use crate::service::RebuildParams; use crate::service::effects::prelude::*; use crate::service::rpc::CallbackId; -use crate::service::RebuildParams; use crate::status::MainStatus; pub async fn rebuild(context: EffectContext) -> Result<(), Error> { diff --git a/core/startos/src/service/effects/dependency.rs b/core/startos/src/service/effects/dependency.rs index 7c2377239..38feeb90f 100644 --- a/core/startos/src/service/effects/dependency.rs +++ b/core/startos/src/service/effects/dependency.rs @@ -8,6 +8,7 @@ use imbl::OrdMap; use imbl_value::InternedString; use models::{FromStrParser, HealthCheckId, PackageId, ReplayId, VersionString, VolumeId}; +use crate::DATA_DIR; use crate::db::model::package::{ CurrentDependencies, CurrentDependencyInfo, CurrentDependencyKind, ManifestPreference, TaskEntry, @@ -19,7 +20,6 @@ use crate::disk::mount::util::{is_mountpoint, unmount}; use crate::service::effects::prelude::*; use crate::status::health_check::NamedHealthCheckResult; use crate::volume::data_dir; -use crate::DATA_DIR; #[derive(Debug, Clone, Serialize, Deserialize, TS)] #[ts(export)] diff --git a/core/startos/src/service/effects/health.rs b/core/startos/src/service/effects/health.rs index 2fb7a529a..013172a92 100644 --- a/core/startos/src/service/effects/health.rs +++ b/core/startos/src/service/effects/health.rs @@ -1,8 +1,8 @@ use models::HealthCheckId; use crate::service::effects::prelude::*; -use crate::status::health_check::NamedHealthCheckResult; use crate::status::MainStatus; +use crate::status::health_check::NamedHealthCheckResult; #[derive(Debug, Clone, Serialize, Deserialize, TS)] #[serde(rename_all = "camelCase")] diff --git a/core/startos/src/service/effects/mod.rs b/core/startos/src/service/effects/mod.rs index ab1092ec5..eb2a52bc9 100644 --- a/core/startos/src/service/effects/mod.rs +++ b/core/startos/src/service/effects/mod.rs @@ -1,11 +1,11 @@ use std::net::Ipv4Addr; -use rpc_toolkit::{from_fn, from_fn_async, from_fn_blocking, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn, from_fn_async, from_fn_blocking}; use crate::prelude::*; use crate::service::cli::ContainerCliContext; use crate::service::effects::context::EffectContext; -use crate::{echo, HOST_IP}; +use crate::{HOST_IP, echo}; mod action; pub mod callbacks; diff --git a/core/startos/src/service/effects/net/ssl.rs b/core/startos/src/service/effects/net/ssl.rs index 8cf278fa4..be8a5d7d7 100644 --- a/core/startos/src/service/effects/net/ssl.rs +++ b/core/startos/src/service/effects/net/ssl.rs @@ -6,11 +6,11 @@ use ipnet::IpNet; use itertools::Itertools; use openssl::pkey::{PKey, Private}; +use crate::HOST_IP; use crate::service::effects::callbacks::CallbackHandler; use crate::service::effects::prelude::*; use crate::service::rpc::CallbackId; use crate::util::serde::Pem; -use crate::HOST_IP; #[derive(Debug, Clone, Copy, serde::Serialize, serde::Deserialize, TS, PartialEq, Eq)] #[serde(rename_all = "camelCase")] diff --git a/core/startos/src/service/effects/subcontainer/mod.rs b/core/startos/src/service/effects/subcontainer/mod.rs index e7b4f73cf..fd80dfb6f 100644 --- a/core/startos/src/service/effects/subcontainer/mod.rs +++ b/core/startos/src/service/effects/subcontainer/mod.rs @@ -61,7 +61,9 @@ pub async fn destroy_subcontainer_fs( } overlay.overlay.unmount(true).await?; } else { - tracing::warn!("Could not find a subcontainer fs to destroy; assumming that it already is destroyed and will be skipping"); + tracing::warn!( + "Could not find a subcontainer fs to destroy; assumming that it already is destroyed and will be skipping" + ); } Ok(()) } diff --git a/core/startos/src/service/effects/subcontainer/sync.rs b/core/startos/src/service/effects/subcontainer/sync.rs index 5c14a84ed..16ffca3cd 100644 --- a/core/startos/src/service/effects/subcontainer/sync.rs +++ b/core/startos/src/service/effects/subcontainer/sync.rs @@ -1,5 +1,5 @@ use std::collections::BTreeMap; -use std::ffi::{c_int, OsStr, OsString}; +use std::ffi::{OsStr, OsString, c_int}; use std::fs::File; use std::io::{IsTerminal, Read}; use std::os::unix::process::{CommandExt, ExitStatusExt}; @@ -13,10 +13,10 @@ use signal_hook::consts::signal::*; use termion::raw::IntoRawMode; use tokio::sync::oneshot; -use crate::service::effects::prelude::*; -use crate::service::effects::ContainerCliContext; -use crate::util::io::TermSize; use crate::CAP_1_KiB; +use crate::service::effects::ContainerCliContext; +use crate::service::effects::prelude::*; +use crate::util::io::TermSize; const FWD_SIGNALS: &[c_int] = &[ SIGABRT, SIGALRM, SIGCONT, SIGHUP, SIGINT, SIGIO, SIGPIPE, SIGPROF, SIGQUIT, SIGTERM, SIGTRAP, diff --git a/core/startos/src/service/effects/subcontainer/sync_dummy.rs b/core/startos/src/service/effects/subcontainer/sync_dummy.rs index 285bdcbc1..f7d566394 100644 --- a/core/startos/src/service/effects/subcontainer/sync_dummy.rs +++ b/core/startos/src/service/effects/subcontainer/sync_dummy.rs @@ -1,5 +1,5 @@ -use crate::service::effects::prelude::*; use crate::service::effects::ContainerCliContext; +use crate::service::effects::prelude::*; pub fn launch(_: ContainerCliContext) -> Result<(), Error> { Err(Error::new( diff --git a/core/startos/src/service/effects/version.rs b/core/startos/src/service/effects/version.rs index 8595be3ea..185e1f629 100644 --- a/core/startos/src/service/effects/version.rs +++ b/core/startos/src/service/effects/version.rs @@ -1,9 +1,9 @@ use std::path::Path; +use crate::DATA_DIR; use crate::service::effects::prelude::*; use crate::util::io::{delete_file, maybe_read_file_to_string, write_file_atomic}; use crate::volume::PKG_VOLUME_DIR; -use crate::DATA_DIR; #[derive(Debug, Clone, Serialize, Deserialize, TS, Parser)] #[serde(rename_all = "camelCase")] diff --git a/core/startos/src/service/mod.rs b/core/startos/src/service/mod.rs index aae6f4bdd..c3804fa01 100644 --- a/core/startos/src/service/mod.rs +++ b/core/startos/src/service/mod.rs @@ -15,12 +15,12 @@ use futures::future::BoxFuture; use futures::stream::FusedStream; use futures::{FutureExt, SinkExt, StreamExt, TryStreamExt}; use helpers::NonDetachingJoinHandle; -use imbl_value::{json, InternedString}; +use imbl_value::{InternedString, json}; use itertools::Itertools; use models::{ActionId, HostId, ImageId, PackageId}; use nix::sys::signal::Signal; use persistent_container::{PersistentContainer, Subcontainer}; -use rpc_toolkit::{from_fn_async, CallRemoteHandler, Empty, HandlerArgs, HandlerFor}; +use rpc_toolkit::{CallRemoteHandler, Empty, HandlerArgs, HandlerFor, from_fn_async}; use serde::{Deserialize, Serialize}; use service_actor::ServiceActor; use start_stop::StartStop; @@ -47,11 +47,11 @@ use crate::service::action::update_tasks; use crate::service::rpc::{ExitParams, InitKind}; use crate::service::service_map::InstallProgressHandles; use crate::service::uninstall::cleanup; +use crate::util::Never; use crate::util::actor::concurrent::ConcurrentActor; -use crate::util::io::{create_file, delete_file, AsyncReadStream, TermSize}; +use crate::util::io::{AsyncReadStream, TermSize, create_file, delete_file}; use crate::util::net::WebSocketExt; use crate::util::serde::Pem; -use crate::util::Never; use crate::volume::data_dir; use crate::{CAP_1_KiB, DATA_DIR}; @@ -852,7 +852,9 @@ pub async fn attach( .map(format_subcontainer_pair) .join("\n"); return Err(Error::new( - eyre!("no matching subcontainers are running for {id}; some possible choices are:\n{subcontainers}"), + eyre!( + "no matching subcontainers are running for {id}; some possible choices are:\n{subcontainers}" + ), ErrorKind::NotFound, )); }; diff --git a/core/startos/src/service/persistent_container.rs b/core/startos/src/service/persistent_container.rs index c81497f69..28fcb0687 100644 --- a/core/startos/src/service/persistent_container.rs +++ b/core/startos/src/service/persistent_container.rs @@ -4,16 +4,16 @@ use std::path::Path; use std::sync::{Arc, Weak}; use std::time::Duration; -use futures::future::ready; use futures::Future; +use futures::future::ready; use helpers::NonDetachingJoinHandle; -use imbl::{vector, Vector}; +use imbl::{Vector, vector}; use imbl_value::InternedString; use models::{ImageId, ProcedureName, VolumeId}; use rpc_toolkit::{Empty, Server, ShutdownHandle}; use serde::de::DeserializeOwned; use tokio::process::Command; -use tokio::sync::{oneshot, watch, Mutex, OnceCell}; +use tokio::sync::{Mutex, OnceCell, oneshot, watch}; use tracing::instrument; use crate::context::RpcContext; @@ -23,12 +23,12 @@ use crate::disk::mount::filesystem::loop_dev::LoopDev; use crate::disk::mount::filesystem::overlayfs::OverlayGuard; use crate::disk::mount::filesystem::{MountType, ReadOnly}; use crate::disk::mount::guard::{GenericMountGuard, MountGuard}; -use crate::lxc::{LxcConfig, LxcContainer, HOST_RPC_SERVER_SOCKET}; +use crate::lxc::{HOST_RPC_SERVER_SOCKET, LxcConfig, LxcContainer}; use crate::net::net_controller::NetService; use crate::prelude::*; use crate::rpc_continuations::Guid; -use crate::s9pk::merkle_archive::source::FileSource; use crate::s9pk::S9pk; +use crate::s9pk::merkle_archive::source::FileSource; use crate::service::effects::context::EffectContext; use crate::service::effects::handler; use crate::service::rpc::{ @@ -36,10 +36,10 @@ use crate::service::rpc::{ }; use crate::service::start_stop::StartStop; use crate::service::transition::{TransitionKind, TransitionState}; -use crate::service::{rpc, RunningStatus, Service}; +use crate::service::{RunningStatus, Service, rpc}; +use crate::util::Invoke; use crate::util::io::create_file; use crate::util::rpc_client::UnixRpcClient; -use crate::util::Invoke; use crate::volume::data_dir; use crate::{ARCH, DATA_DIR, PACKAGE_DATA}; diff --git a/core/startos/src/service/rpc.rs b/core/startos/src/service/rpc.rs index 33949587e..7b8f0a598 100644 --- a/core/startos/src/service/rpc.rs +++ b/core/startos/src/service/rpc.rs @@ -8,8 +8,8 @@ use exver::{ExtendedVersion, VersionRange}; use imbl::Vector; use imbl_value::{InternedString, Value}; use models::{FromStrParser, ProcedureName}; -use rpc_toolkit::yajrc::RpcMethod; use rpc_toolkit::Empty; +use rpc_toolkit::yajrc::RpcMethod; use ts_rs::TS; use crate::prelude::*; diff --git a/core/startos/src/service/service_actor.rs b/core/startos/src/service/service_actor.rs index 0019cd854..697245c5d 100644 --- a/core/startos/src/service/service_actor.rs +++ b/core/startos/src/service/service_actor.rs @@ -3,15 +3,15 @@ use std::time::Duration; use imbl::vector; -use super::start_stop::StartStop; use super::ServiceActorSeed; +use super::start_stop::StartStop; use crate::prelude::*; +use crate::service::SYNC_RETRY_COOLDOWN_SECONDS; use crate::service::persistent_container::ServiceStateKinds; use crate::service::transition::TransitionKind; -use crate::service::SYNC_RETRY_COOLDOWN_SECONDS; use crate::status::MainStatus; -use crate::util::actor::background::BackgroundJobQueue; use crate::util::actor::Actor; +use crate::util::actor::background::BackgroundJobQueue; #[derive(Clone)] pub(super) struct ServiceActor(pub(super) Arc); diff --git a/core/startos/src/service/service_map.rs b/core/startos/src/service/service_map.rs index ba3275696..355ef8316 100644 --- a/core/startos/src/service/service_map.rs +++ b/core/startos/src/service/service_map.rs @@ -10,22 +10,23 @@ use futures::{Future, FutureExt, StreamExt, TryFutureExt}; use helpers::NonDetachingJoinHandle; use imbl::OrdMap; use models::ErrorData; -use tokio::sync::{oneshot, OwnedRwLockReadGuard, OwnedRwLockWriteGuard, RwLock}; +use tokio::sync::{OwnedRwLockReadGuard, OwnedRwLockWriteGuard, RwLock, oneshot}; use tracing::instrument; use url::Url; +use crate::DATA_DIR; use crate::context::RpcContext; use crate::db::model::package::{ InstallingInfo, InstallingState, PackageDataEntry, PackageState, UpdatingState, }; use crate::disk::mount::guard::GenericMountGuard; use crate::install::PKG_ARCHIVE_DIR; -use crate::notifications::{notify, NotificationLevel}; +use crate::notifications::{NotificationLevel, notify}; use crate::prelude::*; use crate::progress::{FullProgressTracker, PhaseProgressTrackerHandle, ProgressTrackerWriter}; +use crate::s9pk::S9pk; use crate::s9pk::manifest::PackageId; use crate::s9pk::merkle_archive::source::FileSource; -use crate::s9pk::S9pk; use crate::service::rpc::ExitParams; use crate::service::start_stop::StartStop; use crate::service::{LoadDisposition, Service, ServiceRef}; @@ -33,7 +34,6 @@ use crate::sign::commitment::merkle_archive::MerkleArchiveCommitment; use crate::status::MainStatus; use crate::util::serde::{Base32, Pem}; use crate::util::sync::SyncMutex; -use crate::DATA_DIR; pub type DownloadInstallFuture = BoxFuture<'static, Result>; pub type InstallFuture = BoxFuture<'static, Result<(), Error>>; diff --git a/core/startos/src/service/transition/backup.rs b/core/startos/src/service/transition/backup.rs index 6205cdd61..f61ffa4ae 100644 --- a/core/startos/src/service/transition/backup.rs +++ b/core/startos/src/service/transition/backup.rs @@ -1,17 +1,17 @@ use std::path::PathBuf; use std::sync::Arc; -use futures::future::BoxFuture; use futures::FutureExt; +use futures::future::BoxFuture; use models::ProcedureName; use super::TempDesiredRestore; use crate::disk::mount::filesystem::ReadWrite; use crate::prelude::*; use crate::rpc_continuations::Guid; +use crate::service::ServiceActor; use crate::service::action::GetActionInput; use crate::service::transition::{TransitionKind, TransitionState}; -use crate::service::ServiceActor; use crate::util::actor::background::BackgroundJobQueue; use crate::util::actor::{ConflictBuilder, Handler}; use crate::util::future::RemoteCancellable; diff --git a/core/startos/src/service/transition/restart.rs b/core/startos/src/service/transition/restart.rs index 786c8cc8f..a271e7f44 100644 --- a/core/startos/src/service/transition/restart.rs +++ b/core/startos/src/service/transition/restart.rs @@ -1,5 +1,5 @@ -use futures::future::BoxFuture; use futures::FutureExt; +use futures::future::BoxFuture; use super::TempDesiredRestore; use crate::prelude::*; diff --git a/core/startos/src/setup.rs b/core/startos/src/setup.rs index 48d7de673..b206119b9 100644 --- a/core/startos/src/setup.rs +++ b/core/startos/src/setup.rs @@ -8,7 +8,7 @@ use const_format::formatcp; use josekit::jwk::Jwk; use patch_db::json_ptr::ROOT; use rpc_toolkit::yajrc::RpcError; -use rpc_toolkit::{from_fn_async, Context, Empty, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, Empty, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use tokio::io::AsyncWriteExt; use tokio::process::Command; @@ -24,24 +24,24 @@ use crate::context::rpc::InitRpcContextPhases; use crate::context::setup::SetupResult; use crate::context::{RpcContext, SetupContext}; use crate::db::model::Database; +use crate::disk::REPAIR_DISK_PATH; use crate::disk::fsck::RepairStrategy; use crate::disk::main::DEFAULT_PASSWORD; -use crate::disk::mount::filesystem::cifs::Cifs; use crate::disk::mount::filesystem::ReadWrite; +use crate::disk::mount::filesystem::cifs::Cifs; use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard}; -use crate::disk::util::{pvscan, recovery_info, DiskInfo, StartOsRecoveryInfo}; -use crate::disk::REPAIR_DISK_PATH; -use crate::init::{init, InitPhases, InitResult}; +use crate::disk::util::{DiskInfo, StartOsRecoveryInfo, pvscan, recovery_info}; +use crate::init::{InitPhases, InitResult, init}; use crate::net::ssl::root_ca_start_time; use crate::prelude::*; use crate::progress::{FullProgress, PhaseProgressTrackerHandle, ProgressUnits}; use crate::rpc_continuations::Guid; use crate::shutdown::Shutdown; use crate::system::sync_kiosk; -use crate::util::crypto::EncryptedWire; -use crate::util::io::{create_file, dir_copy, dir_size, Counter}; use crate::util::Invoke; -use crate::{Error, ErrorKind, ResultExt, DATA_DIR, MAIN_DATA, PACKAGE_DATA, PLATFORM}; +use crate::util::crypto::EncryptedWire; +use crate::util::io::{Counter, create_file, dir_copy, dir_size}; +use crate::{DATA_DIR, Error, ErrorKind, MAIN_DATA, PACKAGE_DATA, PLATFORM, ResultExt}; pub fn setup() -> ParentHandler { ParentHandler::new() @@ -331,7 +331,7 @@ pub async fn execute( return Err(Error::new( color_eyre::eyre::eyre!("Couldn't decode startOsPassword"), crate::ErrorKind::Unknown, - )) + )); } }; let recovery = match recovery_source { diff --git a/core/startos/src/shutdown.rs b/core/startos/src/shutdown.rs index 9fba71fca..5df2317a3 100644 --- a/core/startos/src/shutdown.rs +++ b/core/startos/src/shutdown.rs @@ -1,12 +1,12 @@ use std::sync::Arc; +use crate::PLATFORM; use crate::context::RpcContext; use crate::disk::main::export; use crate::init::{STANDBY_MODE_PATH, SYSTEM_REBUILD_PATH}; use crate::prelude::*; use crate::sound::SHUTDOWN; use crate::util::Invoke; -use crate::PLATFORM; #[derive(Debug, Clone)] pub struct Shutdown { diff --git a/core/startos/src/sign/commitment/blake3.rs b/core/startos/src/sign/commitment/blake3.rs index 98c73555b..d16acaed3 100644 --- a/core/startos/src/sign/commitment/blake3.rs +++ b/core/startos/src/sign/commitment/blake3.rs @@ -4,13 +4,13 @@ use serde::{Deserialize, Serialize}; use tokio::io::AsyncWrite; use ts_rs::TS; +use crate::CAP_10_MiB; use crate::prelude::*; -use crate::sign::commitment::{Commitment, Digestable}; use crate::s9pk::merkle_archive::hash::VerifyingWriter; use crate::s9pk::merkle_archive::source::ArchiveSource; +use crate::sign::commitment::{Commitment, Digestable}; use crate::util::io::{ParallelBlake3Writer, TrackingIO}; use crate::util::serde::Base64; -use crate::CAP_10_MiB; #[derive(Clone, Debug, Deserialize, Serialize, HasModel, PartialEq, Eq, TS)] #[serde(rename_all = "camelCase")] diff --git a/core/startos/src/sign/commitment/merkle_archive.rs b/core/startos/src/sign/commitment/merkle_archive.rs index caddc72e8..111923aef 100644 --- a/core/startos/src/sign/commitment/merkle_archive.rs +++ b/core/startos/src/sign/commitment/merkle_archive.rs @@ -4,9 +4,9 @@ use tokio::io::AsyncWrite; use ts_rs::TS; use crate::prelude::*; -use crate::s9pk::merkle_archive::source::FileSource; -use crate::s9pk::merkle_archive::MerkleArchive; use crate::s9pk::S9pk; +use crate::s9pk::merkle_archive::MerkleArchive; +use crate::s9pk::merkle_archive::source::FileSource; use crate::sign::commitment::{Commitment, Digestable}; use crate::util::io::TrackingIO; use crate::util::serde::Base64; diff --git a/core/startos/src/ssh.rs b/core/startos/src/ssh.rs index 406c70ac1..c54989f37 100644 --- a/core/startos/src/ssh.rs +++ b/core/startos/src/ssh.rs @@ -1,11 +1,11 @@ use std::collections::BTreeMap; use std::path::Path; -use clap::builder::ValueParserFactory; use clap::Parser; +use clap::builder::ValueParserFactory; use imbl_value::InternedString; use models::FromStrParser; -use rpc_toolkit::{from_fn_async, Context, Empty, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, Empty, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use tokio::fs::OpenOptions; use tokio::process::Command; @@ -15,9 +15,9 @@ use ts_rs::TS; use crate::context::{CliContext, RpcContext}; use crate::hostname::Hostname; use crate::prelude::*; -use crate::util::io::create_file; -use crate::util::serde::{display_serializable, HandlerExtSerde, Pem, WithIoFormat}; use crate::util::Invoke; +use crate::util::io::create_file; +use crate::util::serde::{HandlerExtSerde, Pem, WithIoFormat, display_serializable}; pub const SSH_DIR: &str = "/home/start9/.ssh"; diff --git a/core/startos/src/system.rs b/core/startos/src/system.rs index 996fd334b..e4befb77f 100644 --- a/core/startos/src/system.rs +++ b/core/startos/src/system.rs @@ -9,7 +9,7 @@ use color_eyre::eyre::eyre; use futures::{FutureExt, TryStreamExt}; use imbl::vector; use imbl_value::InternedString; -use rpc_toolkit::{from_fn_async, Context, Empty, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, Empty, HandlerExt, ParentHandler, from_fn_async}; use rustls::RootCertStore; use rustls_pki_types::CertificateDer; use serde::{Deserialize, Deserializer, Serialize, Serializer}; @@ -24,12 +24,12 @@ use crate::logs::{LogSource, LogsParams, SYSTEM_UNIT}; use crate::prelude::*; use crate::rpc_continuations::{Guid, RpcContinuation, RpcContinuations}; use crate::shutdown::Shutdown; -use crate::util::cpupower::{get_available_governors, set_governor, Governor}; +use crate::util::Invoke; +use crate::util::cpupower::{Governor, get_available_governors, set_governor}; use crate::util::io::open_file; use crate::util::net::WebSocketExt; -use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat}; +use crate::util::serde::{HandlerExtSerde, WithIoFormat, display_serializable}; use crate::util::sync::Watch; -use crate::util::Invoke; use crate::{MAIN_DATA, PACKAGE_DATA}; pub fn experimental() -> ParentHandler { @@ -1039,8 +1039,8 @@ pub async fn test_smtp( ) -> Result<(), Error> { #[cfg(feature = "mail-send")] { - use mail_send::mail_builder::{self, MessageBuilder}; use mail_send::SmtpClientBuilder; + use mail_send::mail_builder::{self, MessageBuilder}; use rustls_pki_types::pem::PemObject; let Some(pass_val) = password else { diff --git a/core/startos/src/tunnel/api.rs b/core/startos/src/tunnel/api.rs index 7ce208806..11c5ec512 100644 --- a/core/startos/src/tunnel/api.rs +++ b/core/startos/src/tunnel/api.rs @@ -2,7 +2,7 @@ use std::net::Ipv4Addr; use clap::Parser; use ipnet::Ipv4Net; -use rpc_toolkit::{from_fn_async, Context, Empty, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, Empty, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use crate::context::CliContext; diff --git a/core/startos/src/tunnel/context.rs b/core/startos/src/tunnel/context.rs index 54084cf75..ff4b15a56 100644 --- a/core/startos/src/tunnel/context.rs +++ b/core/startos/src/tunnel/context.rs @@ -14,17 +14,17 @@ use serde::{Deserialize, Serialize}; use tokio::sync::broadcast::Sender; use tracing::instrument; -use crate::auth::{check_password, Sessions}; -use crate::context::config::ContextConfig; +use crate::auth::{Sessions, check_password}; use crate::context::CliContext; +use crate::context::config::ContextConfig; use crate::middleware::auth::AuthContext; use crate::middleware::signature::SignatureAuthContext; use crate::net::forward::PortForwardController; use crate::net::gateway::NetworkInterfaceWatcher; use crate::prelude::*; use crate::rpc_continuations::{OpenAuthedContinuations, RpcContinuations}; -use crate::tunnel::db::TunnelDatabase; use crate::tunnel::TUNNEL_DEFAULT_PORT; +use crate::tunnel::db::TunnelDatabase; use crate::util::sync::SyncMutex; #[derive(Debug, Clone, Default, Deserialize, Serialize, Parser)] diff --git a/core/startos/src/tunnel/db.rs b/core/startos/src/tunnel/db.rs index a7f77af57..23ed05c63 100644 --- a/core/startos/src/tunnel/db.rs +++ b/core/startos/src/tunnel/db.rs @@ -6,10 +6,10 @@ use clap::Parser; use imbl_value::InternedString; use ipnet::Ipv4Net; use itertools::Itertools; -use patch_db::json_ptr::{JsonPointer, ROOT}; use patch_db::Dump; +use patch_db::json_ptr::{JsonPointer, ROOT}; use rpc_toolkit::yajrc::RpcError; -use rpc_toolkit::{from_fn_async, Context, HandlerArgs, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerArgs, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; use tracing::instrument; use ts_rs::TS; @@ -20,7 +20,7 @@ use crate::prelude::*; use crate::sign::AnyVerifyingKey; use crate::tunnel::context::TunnelContext; use crate::tunnel::wg::WgServer; -use crate::util::serde::{apply_expr, HandlerExtSerde}; +use crate::util::serde::{HandlerExtSerde, apply_expr}; #[derive(Default, Deserialize, Serialize, HasModel)] #[serde(rename_all = "camelCase")] diff --git a/core/startos/src/tunnel/mod.rs b/core/startos/src/tunnel/mod.rs index acd4836ed..152526c01 100644 --- a/core/startos/src/tunnel/mod.rs +++ b/core/startos/src/tunnel/mod.rs @@ -1,6 +1,6 @@ use axum::Router; use futures::future::ready; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler, Server}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, Server, from_fn_async}; use crate::context::CliContext; use crate::middleware::auth::Auth; diff --git a/core/startos/src/tunnel/wg.rs b/core/startos/src/tunnel/wg.rs index 29fd427ad..4f5277119 100644 --- a/core/startos/src/tunnel/wg.rs +++ b/core/startos/src/tunnel/wg.rs @@ -9,9 +9,9 @@ use serde::{Deserialize, Serialize}; use tokio::process::Command; use crate::prelude::*; +use crate::util::Invoke; use crate::util::io::write_file_atomic; use crate::util::serde::Base64; -use crate::util::Invoke; #[derive(Deserialize, Serialize, HasModel)] #[serde(rename_all = "camelCase")] diff --git a/core/startos/src/update/mod.rs b/core/startos/src/update/mod.rs index 35a44c498..635ab59c1 100644 --- a/core/startos/src/update/mod.rs +++ b/core/startos/src/update/mod.rs @@ -3,7 +3,7 @@ use std::path::Path; use std::time::Duration; use clap::{ArgAction, Parser}; -use color_eyre::eyre::{eyre, Result}; +use color_eyre::eyre::{Result, eyre}; use exver::{Version, VersionRange}; use futures::TryStreamExt; use helpers::{AtomicFile, NonDetachingJoinHandle}; @@ -17,32 +17,32 @@ use tokio::process::Command; use tracing::instrument; use ts_rs::TS; +use crate::PLATFORM; use crate::context::{CliContext, RpcContext}; +use crate::disk::mount::filesystem::MountType; use crate::disk::mount::filesystem::bind::Bind; use crate::disk::mount::filesystem::block_dev::BlockDev; use crate::disk::mount::filesystem::efivarfs::EfiVarFs; use crate::disk::mount::filesystem::overlayfs::OverlayGuard; -use crate::disk::mount::filesystem::MountType; use crate::disk::mount::guard::{GenericMountGuard, MountGuard, TmpMountGuard}; -use crate::notifications::{notify, NotificationLevel}; +use crate::notifications::{NotificationLevel, notify}; use crate::prelude::*; use crate::progress::{ FullProgressTracker, PhaseProgressTrackerHandle, PhasedProgressBar, ProgressUnits, }; use crate::registry::asset::RegistryAsset; use crate::registry::context::{RegistryContext, RegistryUrlParams}; -use crate::registry::os::index::OsVersionInfo; use crate::registry::os::SIG_CONTEXT; -use crate::sign::commitment::blake3::Blake3Commitment; -use crate::sign::commitment::Commitment; +use crate::registry::os::index::OsVersionInfo; use crate::rpc_continuations::{Guid, RpcContinuation}; use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; +use crate::sign::commitment::Commitment; +use crate::sign::commitment::blake3::Blake3Commitment; use crate::sound::{ CIRCLE_OF_5THS_SHORT, UPDATE_FAILED_1, UPDATE_FAILED_2, UPDATE_FAILED_3, UPDATE_FAILED_4, }; -use crate::util::net::WebSocketExt; use crate::util::Invoke; -use crate::PLATFORM; +use crate::util::net::WebSocketExt; #[derive(Deserialize, Serialize, Parser, TS)] #[serde(rename_all = "camelCase")] @@ -87,7 +87,12 @@ pub async fn update_system( .into_updated() .de()? { - return Err(Error::new(eyre!("Server was already updated. Please restart your device before attempting to update again."), ErrorKind::InvalidRequest)); + return Err(Error::new( + eyre!( + "Server was already updated. Please restart your device before attempting to update again." + ), + ErrorKind::InvalidRequest, + )); } let target = maybe_do_update(ctx.clone(), registry, target.unwrap_or(VersionRange::Any)).await?; @@ -298,7 +303,9 @@ async fn maybe_do_update( if status.updated { return Err(Error::new( - eyre!("Server was already updated. Please restart your device before attempting to update again."), + eyre!( + "Server was already updated. Please restart your device before attempting to update again." + ), crate::ErrorKind::InvalidRequest, )); } diff --git a/core/startos/src/upload.rs b/core/startos/src/upload.rs index 4076c579d..ca34f34d1 100644 --- a/core/startos/src/upload.rs +++ b/core/startos/src/upload.rs @@ -8,7 +8,7 @@ use axum::body::Body; use axum::extract::Request; use axum::response::Response; use bytes::Bytes; -use futures::{ready, FutureExt, Stream, StreamExt}; +use futures::{FutureExt, Stream, StreamExt, ready}; use http::header::CONTENT_LENGTH; use http::{HeaderMap, StatusCode}; use imbl_value::InternedString; @@ -20,9 +20,9 @@ use crate::context::RpcContext; use crate::prelude::*; use crate::progress::{PhaseProgressTrackerHandle, ProgressUnits}; use crate::rpc_continuations::{Guid, RpcContinuation}; -use crate::s9pk::merkle_archive::source::multi_cursor_file::{FileCursor, MultiCursorFile}; use crate::s9pk::merkle_archive::source::ArchiveSource; -use crate::util::io::{create_file, TmpDir}; +use crate::s9pk::merkle_archive::source::multi_cursor_file::{FileCursor, MultiCursorFile}; +use crate::util::io::{TmpDir, create_file}; pub async fn upload( ctx: &RpcContext, diff --git a/core/startos/src/util/actor/concurrent.rs b/core/startos/src/util/actor/concurrent.rs index 5a24970d4..a929a0ab3 100644 --- a/core/startos/src/util/actor/concurrent.rs +++ b/core/startos/src/util/actor/concurrent.rs @@ -2,7 +2,7 @@ use std::any::Any; use std::sync::Arc; use std::time::Duration; -use futures::future::{ready, BoxFuture}; +use futures::future::{BoxFuture, ready}; use futures::{Future, FutureExt, TryFutureExt}; use helpers::NonDetachingJoinHandle; use tokio::sync::{mpsc, oneshot}; @@ -318,8 +318,10 @@ mod test { .await .is_ok() ); - assert!(tokio::time::timeout(Duration::from_secs(1), pending) - .await - .is_err()); + assert!( + tokio::time::timeout(Duration::from_secs(1), pending) + .await + .is_err() + ); } } diff --git a/core/startos/src/util/actor/mod.rs b/core/startos/src/util/actor/mod.rs index 05cdd83c1..0787e61e7 100644 --- a/core/startos/src/util/actor/mod.rs +++ b/core/startos/src/util/actor/mod.rs @@ -146,11 +146,7 @@ impl ConflictBuilder { Arc::new(move |m| { self.base ^ if let Some(entry) = self.except.get(&m.type_id()) { - if let Some(f) = entry { - f(m) - } else { - true - } + if let Some(f) = entry { f(m) } else { true } } else { false } diff --git a/core/startos/src/util/crypto.rs b/core/startos/src/util/crypto.rs index bb164b6ad..a99e4593a 100644 --- a/core/startos/src/util/crypto.rs +++ b/core/startos/src/util/crypto.rs @@ -1,4 +1,4 @@ -use ed25519_dalek::{SecretKey, EXPANDED_SECRET_KEY_LENGTH}; +use ed25519_dalek::{EXPANDED_SECRET_KEY_LENGTH, SecretKey}; #[inline] pub fn ed25519_expand_key(key: &SecretKey) -> [u8; EXPANDED_SECRET_KEY_LENGTH] { @@ -8,8 +8,8 @@ pub fn ed25519_expand_key(key: &SecretKey) -> [u8; EXPANDED_SECRET_KEY_LENGTH] { .to_bytes() } -use aes::cipher::{CipherKey, NewCipher, Nonce, StreamCipher}; use aes::Aes256Ctr; +use aes::cipher::{CipherKey, NewCipher, Nonce, StreamCipher}; use hmac::Hmac; use josekit::jwk::Jwk; use serde::{Deserialize, Serialize}; diff --git a/core/startos/src/util/future.rs b/core/startos/src/util/future.rs index c690f9754..7ac34ff02 100644 --- a/core/startos/src/util/future.rs +++ b/core/startos/src/util/future.rs @@ -1,7 +1,7 @@ use std::pin::Pin; use std::task::{Context, Poll}; -use futures::future::{abortable, pending, BoxFuture, FusedFuture}; +use futures::future::{BoxFuture, FusedFuture, abortable, pending}; use futures::stream::{AbortHandle, Abortable, BoxStream}; use futures::{Future, FutureExt, Stream, StreamExt}; use tokio::sync::watch; diff --git a/core/startos/src/util/http_reader.rs b/core/startos/src/util/http_reader.rs index 02a9f57ae..688a1be36 100644 --- a/core/startos/src/util/http_reader.rs +++ b/core/startos/src/util/http_reader.rs @@ -122,7 +122,7 @@ impl HttpReader { http_url ), crate::ErrorKind::MissingHeader, - )) + )); } }; @@ -137,7 +137,7 @@ impl HttpReader { return Err(Error::new( eyre!("No content length headers for {}", http_url), crate::ErrorKind::MissingHeader, - )) + )); } }; diff --git a/core/startos/src/util/io.rs b/core/startos/src/util/io.rs index 565971bc7..a1e3b8e03 100644 --- a/core/startos/src/util/io.rs +++ b/core/startos/src/util/io.rs @@ -14,8 +14,9 @@ use std::time::Duration; use bytes::{Buf, BytesMut}; use clap::builder::ValueParserFactory; use futures::future::{BoxFuture, Fuse}; -use futures::{AsyncSeek, FutureExt, Stream, TryStreamExt}; +use futures::{AsyncSeek, FutureExt, Stream, StreamExt, TryStreamExt}; use helpers::{AtomicFile, NonDetachingJoinHandle}; +use inotify::{EventMask, EventStream, Inotify, WatchMask}; use models::FromStrParser; use nix::unistd::{Gid, Uid}; use serde::{Deserialize, Serialize}; @@ -390,7 +391,7 @@ impl AsyncRead for BufferedWriteReader { match this.hdl.poll(cx) { Poll::Ready(Ok(Err(e))) => return Poll::Ready(Err(e)), Poll::Ready(Err(e)) => { - return Poll::Ready(Err(std::io::Error::new(std::io::ErrorKind::BrokenPipe, e))) + return Poll::Ready(Err(std::io::Error::new(std::io::ErrorKind::BrokenPipe, e))); } _ => res, } @@ -1526,3 +1527,56 @@ impl ValueParserFactory for TermSize { FromStrParser::new() } } + +#[instrument(skip_all)] +async fn wait_for_created(stream: &mut EventStream<[u8; 1024]>, path: &Path) -> Result<(), Error> { + let parent = stream + .watches() + .add(path.parent().unwrap_or("/".as_ref()), WatchMask::CREATE)?; + while let Some(e) = stream.try_next().await? { + if e.mask & EventMask::CREATE != EventMask::empty() && e.name.as_deref() == path.file_name() + { + break; + } + } + stream.watches().remove(parent)?; + Ok(()) +} + +#[instrument(skip_all)] +pub fn file_string_stream( + path: impl Into, +) -> impl Stream, Error>> { + let path = path.into(); + async_stream::try_stream! { + let mut stream = Inotify::init()?.into_event_stream([0; 1024])?; + loop { + stream.watches().add( + &path, + WatchMask::MODIFY | WatchMask::MOVE_SELF | WatchMask::MOVED_TO | WatchMask::DELETE_SELF, + )?; + if let Some(contents) = maybe_read_file_to_string(&path).await? { + yield Some(contents); + } else { + wait_for_created(&mut stream, &path).await?; + } + while let Some(e) = stream.try_next().await? { + yield maybe_read_file_to_string(&path).await?; + if e.mask & EventMask::DELETE_SELF != EventMask::empty() { + break; + } + } + } + } +} + +#[tokio::test] +async fn test_wait_for_created() { + let mut stream = Inotify::init() + .unwrap() + .into_event_stream([0; 1024]) + .unwrap(); + wait_for_created(&mut stream, Path::new("/tmp/wait-for-me")) + .await + .unwrap(); +} diff --git a/core/startos/src/util/logger.rs b/core/startos/src/util/logger.rs index 5fc9fb98e..d6bc01418 100644 --- a/core/startos/src/util/logger.rs +++ b/core/startos/src/util/logger.rs @@ -59,7 +59,7 @@ impl StartOSLogger { fn base_subscriber(logfile: LogFile) -> impl Subscriber { use tracing_error::ErrorLayer; use tracing_subscriber::prelude::*; - use tracing_subscriber::{fmt, EnvFilter}; + use tracing_subscriber::{EnvFilter, fmt}; let filter_layer = || { EnvFilter::builder() diff --git a/core/startos/src/util/mod.rs b/core/startos/src/util/mod.rs index 646b07f99..45c402031 100644 --- a/core/startos/src/util/mod.rs +++ b/core/startos/src/util/mod.rs @@ -14,10 +14,10 @@ use ::serde::{Deserialize, Serialize}; use async_trait::async_trait; use color_eyre::eyre::{self, eyre}; use fd_lock_rs::FdLock; -use futures::future::BoxFuture; use futures::FutureExt; -use helpers::canonicalize; +use futures::future::BoxFuture; pub use helpers::NonDetachingJoinHandle; +use helpers::canonicalize; use imbl_value::InternedString; use lazy_static::lazy_static; pub use models::VersionString; @@ -25,7 +25,7 @@ use pin_project::pin_project; use sha2::Digest; use tokio::fs::File; use tokio::io::{AsyncRead, AsyncReadExt, BufReader}; -use tokio::sync::{oneshot, Mutex, OwnedMutexGuard, RwLock}; +use tokio::sync::{Mutex, OwnedMutexGuard, RwLock, oneshot}; use tracing::instrument; use ts_rs::TS; use url::Url; diff --git a/core/startos/src/util/rpc.rs b/core/startos/src/util/rpc.rs index f7c91eb82..165632c5d 100644 --- a/core/startos/src/util/rpc.rs +++ b/core/startos/src/util/rpc.rs @@ -1,18 +1,18 @@ use std::path::Path; use clap::Parser; -use rpc_toolkit::{from_fn_async, Context, HandlerExt, ParentHandler}; +use rpc_toolkit::{Context, HandlerExt, ParentHandler, from_fn_async}; use serde::{Deserialize, Serialize}; +use crate::CAP_10_MiB; use crate::context::CliContext; use crate::prelude::*; +use crate::s9pk::merkle_archive::source::ArchiveSource; use crate::s9pk::merkle_archive::source::http::HttpSource; use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; -use crate::s9pk::merkle_archive::source::ArchiveSource; -use crate::util::io::{open_file, ParallelBlake3Writer}; +use crate::util::io::{ParallelBlake3Writer, open_file}; use crate::util::serde::Base16; use crate::util::{Apply, PathOrUrl}; -use crate::CAP_10_MiB; pub fn util() -> ParentHandler { ParentHandler::new().subcommand( diff --git a/core/startos/src/util/rpc_client.rs b/core/startos/src/util/rpc_client.rs index 82ce11e20..58998afad 100644 --- a/core/startos/src/util/rpc_client.rs +++ b/core/startos/src/util/rpc_client.rs @@ -10,11 +10,11 @@ use lazy_async_pool::Pool; use models::{Error, ErrorKind, ResultExt}; use rpc_toolkit::yajrc::{self, Id, RpcError, RpcMethod, RpcRequest, RpcResponse}; use serde::{Deserialize, Serialize}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use tokio::io::{AsyncBufReadExt, AsyncRead, AsyncWrite, AsyncWriteExt, BufReader}; use tokio::net::UnixStream; use tokio::runtime::Handle; -use tokio::sync::{oneshot, Mutex, OnceCell}; +use tokio::sync::{Mutex, OnceCell, oneshot}; use crate::util::io::TmpDir; diff --git a/core/startos/src/util/serde.rs b/core/startos/src/util/serde.rs index 2115bf153..e2d621daf 100644 --- a/core/startos/src/util/serde.rs +++ b/core/startos/src/util/serde.rs @@ -686,7 +686,7 @@ impl std::str::FromStr for Duration { return Err(Error::new( eyre!("Invalid units for duration"), crate::ErrorKind::Deserialization, - )) + )); } })) } diff --git a/core/startos/src/util/sync.rs b/core/startos/src/util/sync.rs index 40427486c..25a05f41f 100644 --- a/core/startos/src/util/sync.rs +++ b/core/startos/src/util/sync.rs @@ -1,4 +1,5 @@ -use std::collections::VecDeque; +use std::collections::{BTreeMap, VecDeque}; +use std::ops::Deref; use std::pin::Pin; use std::sync::atomic::AtomicUsize; use std::sync::{Arc, Weak}; @@ -7,34 +8,217 @@ use std::task::{Poll, Waker}; use futures::stream::BoxStream; use futures::Stream; +use crate::prelude::*; + +#[cfg(feature = "unstable")] +lazy_static::lazy_static! { + static ref ID_CTR: AtomicUsize = AtomicUsize::new(0); +} + +#[cfg(not(feature = "unstable"))] +fn annotate_lock(f: F, _: bool) -> T +where + F: FnOnce() -> T, +{ + f() +} + +#[cfg(feature = "unstable")] +fn annotate_lock(f: F, id: usize, write: bool) -> T +where + F: FnOnce() -> T, +{ + std::thread_local! { + static LOCK_CTX: std::cell::RefCell>> = std::cell::RefCell::new(BTreeMap::new()); + } + if LOCK_CTX.with_borrow_mut(|ctx| { + let panic = if write { + ctx.contains_key(&id) + } else { + ctx.get(&id).copied().unwrap_or(Err(0)).is_ok() + }; + if !panic { + if write { + ctx.insert(id, Ok(())); + } else { + if let Err(count) = ctx.entry(id).or_insert(Err(0)) { + *count += 1; + } + } + } + panic + }) { + panic!("lock {id} is already locked on this thread"); + } + let tracer: helpers::NonDetachingJoinHandle<()> = { + let bt = std::backtrace::Backtrace::capture(); + tokio::spawn(async move { + use std::time::Duration; + + tokio::time::sleep(Duration::from_secs(10)).await; + tracing::error!("waited on lock {id} more than 10s:\n{bt}"); + }) + .into() + }; + let res = f(); + drop(tracer); + LOCK_CTX.with_borrow_mut(|ctx| { + if write { + ctx.remove(&id); + } else { + if ctx + .get_mut(&id) + .map(|c| { + c.as_mut().map_err(|count| { + *count -= 1; + *count + }) == Err(0) + }) + .unwrap_or(false) + { + ctx.remove(&id); + } + } + }); + res +} + +#[cfg(feature = "unstable")] +#[test] +#[should_panic] +fn test_annotate_lock() { + annotate_lock(|| annotate_lock(|| (), 0, true), 0, true) +} + #[derive(Debug, Default)] -pub struct SyncMutex(std::sync::Mutex); +pub struct SyncMutex { + #[cfg(feature = "unstable")] + id: usize, + lock: std::sync::Mutex, +} impl SyncMutex { pub fn new(t: T) -> Self { - Self(std::sync::Mutex::new(t)) + Self { + #[cfg(feature = "unstable")] + id: ID_CTR.fetch_add(1, std::sync::atomic::Ordering::SeqCst), + lock: std::sync::Mutex::new(t), + } } + #[cfg_attr(feature = "unstable", inline(never))] pub fn mutate U, U>(&self, f: F) -> U { - f(&mut *self.0.lock().unwrap()) + annotate_lock( + || f(&mut *self.lock.lock().unwrap()), + #[cfg(feature = "unstable")] + self.id, + true, + ) } + #[cfg_attr(feature = "unstable", inline(never))] pub fn peek U, U>(&self, f: F) -> U { - f(&*self.0.lock().unwrap()) + annotate_lock( + || f(&*self.lock.lock().unwrap()), + #[cfg(feature = "unstable")] + self.id, + true, + ) } + #[cfg_attr(feature = "unstable", inline(never))] pub fn replace(&self, value: T) -> T { - std::mem::replace(&mut *self.0.lock().unwrap(), value) + annotate_lock( + || std::mem::replace(&mut *self.lock.lock().unwrap(), value), + #[cfg(feature = "unstable")] + self.id, + true, + ) } } #[derive(Debug, Default)] -pub struct SyncRwLock(std::sync::RwLock); +pub struct SyncRwLock { + #[cfg(feature = "unstable")] + id: usize, + lock: std::sync::RwLock, +} impl SyncRwLock { pub fn new(t: T) -> Self { - Self(std::sync::RwLock::new(t)) + Self { + #[cfg(feature = "unstable")] + id: ID_CTR.fetch_add(1, std::sync::atomic::Ordering::SeqCst), + lock: std::sync::RwLock::new(t), + } } + #[cfg_attr(feature = "unstable", inline(never))] pub fn mutate U, U>(&self, f: F) -> U { - f(&mut *self.0.write().unwrap()) + annotate_lock( + || f(&mut *self.lock.write().unwrap()), + #[cfg(feature = "unstable")] + self.id, + true, + ) } + #[cfg_attr(feature = "unstable", inline(never))] pub fn peek U, U>(&self, f: F) -> U { - f(&*self.0.read().unwrap()) + annotate_lock( + || f(&*self.lock.read().unwrap()), + #[cfg(feature = "unstable")] + self.id, + false, + ) + } + #[cfg_attr(feature = "unstable", inline(never))] + pub fn replace(&self, value: T) -> T { + annotate_lock( + || std::mem::replace(&mut *self.lock.write().unwrap(), value), + #[cfg(feature = "unstable")] + self.id, + true, + ) + } +} + +#[derive(Debug, Default)] +pub struct AsyncMutex(tokio::sync::Mutex); +impl AsyncMutex { + pub fn new(t: T) -> Self { + Self(tokio::sync::Mutex::new(t)) + } + pub async fn mutate U, U>(&self, f: F) -> U { + f(&mut *self.0.lock().await) + } + pub async fn peek U, U>(&self, f: F) -> U { + f(&*self.0.lock().await) + } + pub async fn replace(&self, value: T) -> T { + std::mem::replace(&mut *self.lock().await, value) + } +} +impl Deref for AsyncMutex { + type Target = tokio::sync::Mutex; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +#[derive(Debug, Default)] +pub struct AsyncRwLock(tokio::sync::RwLock); +impl AsyncRwLock { + pub fn new(t: T) -> Self { + Self(tokio::sync::RwLock::new(t)) + } + pub async fn mutate U, U>(&self, f: F) -> U { + f(&mut *self.0.write().await) + } + pub async fn peek U, U>(&self, f: F) -> U { + f(&*self.0.read().await) + } + pub async fn replace(&self, value: T) -> T { + std::mem::replace(&mut *self.0.write().await, value) + } +} +impl Deref for AsyncRwLock { + type Target = tokio::sync::RwLock; + fn deref(&self) -> &Self::Target { + &self.0 } } @@ -54,7 +238,7 @@ impl WatchShared { #[pin_project::pin_project] pub struct Watch { - shared: Arc>>, + shared: Arc>>, version: u64, } impl Clone for Watch { @@ -68,7 +252,7 @@ impl Clone for Watch { impl Watch { pub fn new(init: T) -> Self { Self { - shared: Arc::new(SyncMutex::new(WatchShared { + shared: Arc::new(SyncRwLock::new(WatchShared { version: 1, data: init, wakers: Vec::new(), @@ -82,6 +266,7 @@ impl Watch { version: 0, } } + #[cfg_attr(feature = "unstable", inline(never))] pub fn poll_changed(&mut self, cx: &mut std::task::Context<'_>) -> Poll<()> { self.shared.mutate(|shared| { if shared.version != self.version { @@ -96,9 +281,11 @@ impl Watch { } }) } + #[cfg_attr(feature = "unstable", inline(never))] pub async fn changed(&mut self) { futures::future::poll_fn(|cx| self.poll_changed(cx)).await } + #[cfg_attr(feature = "unstable", inline(never))] pub async fn wait_for bool>(&mut self, mut f: F) { loop { if self.peek(&mut f) { @@ -107,6 +294,7 @@ impl Watch { self.changed().await; } } + #[cfg_attr(feature = "unstable", inline(never))] pub fn send_if_modified bool>(&self, modify: F) -> bool { self.shared.mutate(|shared| { let changed = modify(&mut shared.data); @@ -116,6 +304,7 @@ impl Watch { changed }) } + #[cfg_attr(feature = "unstable", inline(never))] pub fn send_modify U>(&self, modify: F) -> U { self.shared.mutate(|shared| { let res = modify(&mut shared.data); @@ -123,40 +312,49 @@ impl Watch { res }) } + #[cfg_attr(feature = "unstable", inline(never))] pub fn send_replace(&self, new: T) -> T { self.send_modify(|a| std::mem::replace(a, new)) } + #[cfg_attr(feature = "unstable", inline(never))] pub fn send(&self, new: T) { self.send_replace(new); } + #[cfg_attr(feature = "unstable", inline(never))] pub fn mark_changed(&self) { self.shared.mutate(|shared| shared.modified()) } pub fn mark_unseen(&mut self) { self.version = 0; } + #[cfg_attr(feature = "unstable", inline(never))] pub fn mark_seen(&mut self) { self.shared.peek(|shared| { self.version = shared.version; }) } + #[cfg_attr(feature = "unstable", inline(never))] pub fn peek U>(&self, f: F) -> U { self.shared.peek(|shared| f(&shared.data)) } + #[cfg_attr(feature = "unstable", inline(never))] pub fn peek_and_mark_seen U>(&mut self, f: F) -> U { self.shared.peek(|shared| { self.version = shared.version; f(&shared.data) }) } + #[cfg_attr(feature = "unstable", inline(never))] pub fn peek_mut U>(&self, f: F) -> U { self.shared.mutate(|shared| f(&mut shared.data)) } } impl Watch { + #[cfg_attr(feature = "unstable", inline(never))] pub fn read(&self) -> T { self.peek(|a| a.clone()) } + #[cfg_attr(feature = "unstable", inline(never))] pub fn read_and_mark_seen(&mut self) -> T { self.peek_and_mark_seen(|a| a.clone()) } diff --git a/core/startos/src/version/mod.rs b/core/startos/src/version/mod.rs index 16f6e1493..a63a51a6f 100644 --- a/core/startos/src/version/mod.rs +++ b/core/startos/src/version/mod.rs @@ -5,14 +5,14 @@ use std::panic::{RefUnwindSafe, UnwindSafe}; use color_eyre::eyre::eyre; use futures::future::BoxFuture; use futures::{Future, FutureExt}; -use imbl_value::{to_value, InternedString}; +use imbl_value::{InternedString, to_value}; use patch_db::json_ptr::ROOT; +use crate::Error; use crate::context::RpcContext; use crate::db::model::Database; use crate::prelude::*; use crate::progress::PhaseProgressTrackerHandle; -use crate::Error; mod v0_3_5; mod v0_3_5_1; @@ -183,7 +183,7 @@ impl Version { return Err(Error::new( eyre!("cannot migrate from versions before 0.3.5"), ErrorKind::MigrationFailed, - )) + )); } Self::V0_3_5(v) => DynVersion(Box::new(v.0)), Self::V0_3_5_1(v) => DynVersion(Box::new(v.0)), @@ -222,7 +222,7 @@ impl Version { return Err(Error::new( eyre!("unknown version {v}"), ErrorKind::MigrationFailed, - )) + )); } }) } @@ -339,7 +339,7 @@ impl PreUps { from.semver() ), crate::ErrorKind::MigrationFailed, - )) + )); } Ordering::Equal => None, }; diff --git a/core/startos/src/version/v0_3_5_1.rs b/core/startos/src/version/v0_3_5_1.rs index 808eae3bc..c228913b8 100644 --- a/core/startos/src/version/v0_3_5_1.rs +++ b/core/startos/src/version/v0_3_5_1.rs @@ -1,7 +1,7 @@ use exver::VersionRange; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_5, VersionT}; +use super::{VersionT, v0_3_5}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_5_2.rs b/core/startos/src/version/v0_3_5_2.rs index 9bbe38f1c..b2cbecf12 100644 --- a/core/startos/src/version/v0_3_5_2.rs +++ b/core/startos/src/version/v0_3_5_2.rs @@ -1,7 +1,7 @@ use exver::VersionRange; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_5_1, VersionT}; +use super::{VersionT, v0_3_5_1}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_0.rs b/core/startos/src/version/v0_3_6_alpha_0.rs index 16070d2c3..0edc98677 100644 --- a/core/startos/src/version/v0_3_6_alpha_0.rs +++ b/core/startos/src/version/v0_3_6_alpha_0.rs @@ -6,7 +6,7 @@ use chrono::{DateTime, Utc}; use const_format::formatcp; use ed25519_dalek::SigningKey; use exver::{PreReleaseSegment, VersionRange}; -use imbl_value::{json, InternedString}; +use imbl_value::{InternedString, json}; use models::{PackageId, ReplayId}; use openssl::pkey::PKey; use openssl::x509::X509; @@ -15,7 +15,7 @@ use sqlx::{PgPool, Row}; use tokio::process::Command; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_5_2, VersionT}; +use super::{VersionT, v0_3_5_2}; use crate::account::AccountInfo; use crate::auth::Sessions; use crate::backup::target::cifs::CifsTargets; @@ -30,9 +30,9 @@ use crate::notifications::Notifications; use crate::prelude::*; use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; use crate::ssh::{SshKeys, SshPubKey}; +use crate::util::Invoke; use crate::util::crypto::ed25519_expand_key; use crate::util::serde::Pem; -use crate::util::Invoke; use crate::{DATA_DIR, PACKAGE_DATA}; lazy_static::lazy_static! { @@ -259,10 +259,12 @@ impl VersionT for Version { let tor_address: String = from_value(db["server-info"]["tor-address"].clone())?; // Maybe we do this like the Public::init does server_info["torAddress"] = json!(tor_address); - server_info["onionAddress"] = json!(tor_address - .replace("https://", "") - .replace("http://", "") - .replace(".onion/", "")); + server_info["onionAddress"] = json!( + tor_address + .replace("https://", "") + .replace("http://", "") + .replace(".onion/", "") + ); server_info["networkInterfaces"] = json!({}); server_info["statusInfo"] = status_info; server_info["wifi"] = wifi; diff --git a/core/startos/src/version/v0_3_6_alpha_1.rs b/core/startos/src/version/v0_3_6_alpha_1.rs index 2cec81140..aeca4ada6 100644 --- a/core/startos/src/version/v0_3_6_alpha_1.rs +++ b/core/startos/src/version/v0_3_6_alpha_1.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_0, VersionT}; +use super::{VersionT, v0_3_6_alpha_0}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_10.rs b/core/startos/src/version/v0_3_6_alpha_10.rs index cd1b90dfe..655b0e1f3 100644 --- a/core/startos/src/version/v0_3_6_alpha_10.rs +++ b/core/startos/src/version/v0_3_6_alpha_10.rs @@ -6,7 +6,7 @@ use models::GatewayId; use serde::{Deserialize, Serialize}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_9, VersionT}; +use super::{VersionT, v0_3_6_alpha_9}; use crate::net::host::address::PublicDomainConfig; use crate::net::tor::OnionAddress; use crate::prelude::*; diff --git a/core/startos/src/version/v0_3_6_alpha_11.rs b/core/startos/src/version/v0_3_6_alpha_11.rs index 0d99cb5be..ce1bc6a03 100644 --- a/core/startos/src/version/v0_3_6_alpha_11.rs +++ b/core/startos/src/version/v0_3_6_alpha_11.rs @@ -2,7 +2,7 @@ use exver::{PreReleaseSegment, VersionRange}; use imbl_value::json; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_10, VersionT}; +use super::{VersionT, v0_3_6_alpha_10}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_12.rs b/core/startos/src/version/v0_3_6_alpha_12.rs index cf86500d1..e2cec380a 100644 --- a/core/startos/src/version/v0_3_6_alpha_12.rs +++ b/core/startos/src/version/v0_3_6_alpha_12.rs @@ -4,7 +4,7 @@ use exver::{PreReleaseSegment, VersionRange}; use imbl_value::json; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_11, VersionT}; +use super::{VersionT, v0_3_6_alpha_11}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_13.rs b/core/startos/src/version/v0_3_6_alpha_13.rs index 965b9c04d..54476f325 100644 --- a/core/startos/src/version/v0_3_6_alpha_13.rs +++ b/core/startos/src/version/v0_3_6_alpha_13.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_12, VersionT}; +use super::{VersionT, v0_3_6_alpha_12}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_14.rs b/core/startos/src/version/v0_3_6_alpha_14.rs index 4370239e6..22086e124 100644 --- a/core/startos/src/version/v0_3_6_alpha_14.rs +++ b/core/startos/src/version/v0_3_6_alpha_14.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_13, VersionT}; +use super::{VersionT, v0_3_6_alpha_13}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_15.rs b/core/startos/src/version/v0_3_6_alpha_15.rs index f7e050cce..a670a4ad0 100644 --- a/core/startos/src/version/v0_3_6_alpha_15.rs +++ b/core/startos/src/version/v0_3_6_alpha_15.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_14, VersionT}; +use super::{VersionT, v0_3_6_alpha_14}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_16.rs b/core/startos/src/version/v0_3_6_alpha_16.rs index 177fd01d2..22c54ff06 100644 --- a/core/startos/src/version/v0_3_6_alpha_16.rs +++ b/core/startos/src/version/v0_3_6_alpha_16.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_15, VersionT}; +use super::{VersionT, v0_3_6_alpha_15}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_17.rs b/core/startos/src/version/v0_3_6_alpha_17.rs index 92207b9e7..da361675e 100644 --- a/core/startos/src/version/v0_3_6_alpha_17.rs +++ b/core/startos/src/version/v0_3_6_alpha_17.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_16, VersionT}; +use super::{VersionT, v0_3_6_alpha_16}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_18.rs b/core/startos/src/version/v0_3_6_alpha_18.rs index b5d27eef7..4cfa8a61d 100644 --- a/core/startos/src/version/v0_3_6_alpha_18.rs +++ b/core/startos/src/version/v0_3_6_alpha_18.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_17, VersionT}; +use super::{VersionT, v0_3_6_alpha_17}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_2.rs b/core/startos/src/version/v0_3_6_alpha_2.rs index 7787f7e89..2788f84cf 100644 --- a/core/startos/src/version/v0_3_6_alpha_2.rs +++ b/core/startos/src/version/v0_3_6_alpha_2.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_1, VersionT}; +use super::{VersionT, v0_3_6_alpha_1}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_3.rs b/core/startos/src/version/v0_3_6_alpha_3.rs index b2284c909..aa7db98f7 100644 --- a/core/startos/src/version/v0_3_6_alpha_3.rs +++ b/core/startos/src/version/v0_3_6_alpha_3.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_2, VersionT}; +use super::{VersionT, v0_3_6_alpha_2}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_4.rs b/core/startos/src/version/v0_3_6_alpha_4.rs index 3890a25a3..c1c6cd3bf 100644 --- a/core/startos/src/version/v0_3_6_alpha_4.rs +++ b/core/startos/src/version/v0_3_6_alpha_4.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_3, VersionT}; +use super::{VersionT, v0_3_6_alpha_3}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_5.rs b/core/startos/src/version/v0_3_6_alpha_5.rs index b565abdca..9d707a425 100644 --- a/core/startos/src/version/v0_3_6_alpha_5.rs +++ b/core/startos/src/version/v0_3_6_alpha_5.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_4, VersionT}; +use super::{VersionT, v0_3_6_alpha_4}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_6.rs b/core/startos/src/version/v0_3_6_alpha_6.rs index 0a95a19a5..e3622e80a 100644 --- a/core/startos/src/version/v0_3_6_alpha_6.rs +++ b/core/startos/src/version/v0_3_6_alpha_6.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_5, VersionT}; +use super::{VersionT, v0_3_6_alpha_5}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_3_6_alpha_7.rs b/core/startos/src/version/v0_3_6_alpha_7.rs index 2f19dbb15..241404fd2 100644 --- a/core/startos/src/version/v0_3_6_alpha_7.rs +++ b/core/startos/src/version/v0_3_6_alpha_7.rs @@ -3,7 +3,7 @@ use imbl_value::json; use tokio::process::Command; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_6, VersionT}; +use super::{VersionT, v0_3_6_alpha_6}; use crate::context::RpcContext; use crate::prelude::*; use crate::util::Invoke; diff --git a/core/startos/src/version/v0_3_6_alpha_8.rs b/core/startos/src/version/v0_3_6_alpha_8.rs index 7f661d57d..92f96b4c4 100644 --- a/core/startos/src/version/v0_3_6_alpha_8.rs +++ b/core/startos/src/version/v0_3_6_alpha_8.rs @@ -4,18 +4,18 @@ use exver::{PreReleaseSegment, VersionRange}; use tokio::fs::File; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_7, VersionT}; +use super::{VersionT, v0_3_6_alpha_7}; +use crate::DATA_DIR; use crate::context::RpcContext; use crate::install::PKG_ARCHIVE_DIR; use crate::prelude::*; -use crate::s9pk::manifest::{DeviceFilter, Manifest}; -use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; -use crate::s9pk::merkle_archive::MerkleArchive; -use crate::s9pk::v2::SIG_CONTEXT; use crate::s9pk::S9pk; +use crate::s9pk::manifest::{DeviceFilter, Manifest}; +use crate::s9pk::merkle_archive::MerkleArchive; +use crate::s9pk::merkle_archive::source::multi_cursor_file::MultiCursorFile; +use crate::s9pk::v2::SIG_CONTEXT; use crate::service::LoadDisposition; use crate::util::io::create_file; -use crate::DATA_DIR; lazy_static::lazy_static! { static ref V0_3_6_alpha_8: exver::Version = exver::Version::new( diff --git a/core/startos/src/version/v0_3_6_alpha_9.rs b/core/startos/src/version/v0_3_6_alpha_9.rs index 4ccecd43c..a31b8fb86 100644 --- a/core/startos/src/version/v0_3_6_alpha_9.rs +++ b/core/startos/src/version/v0_3_6_alpha_9.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_8, VersionT}; +use super::{VersionT, v0_3_6_alpha_8}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_4_0_alpha_0.rs b/core/startos/src/version/v0_4_0_alpha_0.rs index d095fbd65..39cb530bf 100644 --- a/core/startos/src/version/v0_4_0_alpha_0.rs +++ b/core/startos/src/version/v0_4_0_alpha_0.rs @@ -2,9 +2,9 @@ use exver::{PreReleaseSegment, VersionRange}; use imbl_value::json; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_3_6_alpha_18, VersionT}; +use super::{VersionT, v0_3_6_alpha_18}; use crate::context::RpcContext; -use crate::notifications::{notify, NotificationLevel}; +use crate::notifications::{NotificationLevel, notify}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_4_0_alpha_1.rs b/core/startos/src/version/v0_4_0_alpha_1.rs index 3e17db8ac..a917b88a0 100644 --- a/core/startos/src/version/v0_4_0_alpha_1.rs +++ b/core/startos/src/version/v0_4_0_alpha_1.rs @@ -2,7 +2,7 @@ use exver::{PreReleaseSegment, VersionRange}; use imbl_value::json; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_4_0_alpha_0, VersionT}; +use super::{VersionT, v0_4_0_alpha_0}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_4_0_alpha_10.rs b/core/startos/src/version/v0_4_0_alpha_10.rs index 2fdd1839a..2aad86ea1 100644 --- a/core/startos/src/version/v0_4_0_alpha_10.rs +++ b/core/startos/src/version/v0_4_0_alpha_10.rs @@ -5,7 +5,7 @@ use exver::{PreReleaseSegment, VersionRange}; use imbl_value::json; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_4_0_alpha_9, VersionT}; +use super::{VersionT, v0_4_0_alpha_9}; use crate::prelude::*; lazy_static::lazy_static! { @@ -39,6 +39,38 @@ impl VersionT for Version { .flatten() .find(|(_, i)| i["ipInfo"]["wanIp"].is_string()) .map(|(g, _)| g.clone()); + let fix_host = |host: &mut Value| { + let mut public = BTreeMap::new(); + let mut private = BTreeSet::new(); + for (domain, info) in host["domains"] + .as_object_mut() + .ok_or_else(|| { + Error::new( + eyre!("expected public.packageData[id].hosts[id].domains to be an object"), + ErrorKind::Database, + ) + })? + .iter_mut() + { + let Some(info) = info.as_object_mut() else { + continue; + }; + if info["public"].as_bool().unwrap_or_default() + && let Some(gateway) = &default_gateway + { + info.insert( + "gateway".into(), + Value::String(Arc::new((&**gateway).to_owned())), + ); + public.insert(domain.clone(), info.clone()); + } else { + private.insert(domain.clone()); + } + } + host["publicDomains"] = to_value(&public)?; + host["privateDomains"] = to_value(&private)?; + Ok::<_, Error>(()) + }; for (_, package) in db["public"]["packageData"] .as_object_mut() .ok_or_else(|| { @@ -59,43 +91,16 @@ impl VersionT for Version { })? .iter_mut() { - let mut public = BTreeMap::new(); - let mut private = BTreeSet::new(); - for (domain, info) in host["domains"] - .as_object_mut() - .ok_or_else(|| { - Error::new( - eyre!( - "expected public.packageData[id].hosts[id].domains to be an object" - ), - ErrorKind::Database, - ) - })? - .iter_mut() - { - let Some(info) = info.as_object_mut() else { - continue; - }; - if info["public"].as_bool().unwrap_or_default() && let Some(gateway) = &default_gateway { - info.insert( - "gateway".into(), - Value::String(Arc::new((&**gateway).to_owned())), - ); - public.insert(domain.clone(), info.clone()); - } else { - private.insert(domain.clone()); - } - - } - host["publicDomains"] = to_value(&public)?; - host["privateDomains"] = to_value(&private)?; + fix_host(host)?; } } + fix_host(&mut db["public"]["serverInfo"]["network"]["host"])?; let network = &mut db["public"]["serverInfo"]["network"]; network["gateways"] = network["networkInterfaces"].clone(); network["dns"] = json!({ - "dhcp": [], + "dhcpServers": [], }); + db["private"]["authPubkeys"] = json!([]); Ok(Value::Null) } diff --git a/core/startos/src/version/v0_4_0_alpha_2.rs b/core/startos/src/version/v0_4_0_alpha_2.rs index 541cc2b20..f18866099 100644 --- a/core/startos/src/version/v0_4_0_alpha_2.rs +++ b/core/startos/src/version/v0_4_0_alpha_2.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_4_0_alpha_1, VersionT}; +use super::{VersionT, v0_4_0_alpha_1}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_4_0_alpha_3.rs b/core/startos/src/version/v0_4_0_alpha_3.rs index b5aaa188c..46ab9745d 100644 --- a/core/startos/src/version/v0_4_0_alpha_3.rs +++ b/core/startos/src/version/v0_4_0_alpha_3.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_4_0_alpha_2, VersionT}; +use super::{VersionT, v0_4_0_alpha_2}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_4_0_alpha_4.rs b/core/startos/src/version/v0_4_0_alpha_4.rs index 420e1a596..ffc83fe65 100644 --- a/core/startos/src/version/v0_4_0_alpha_4.rs +++ b/core/startos/src/version/v0_4_0_alpha_4.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_4_0_alpha_3, VersionT}; +use super::{VersionT, v0_4_0_alpha_3}; use crate::context::RpcContext; use crate::prelude::*; use crate::util::io::create_file_mod; diff --git a/core/startos/src/version/v0_4_0_alpha_5.rs b/core/startos/src/version/v0_4_0_alpha_5.rs index de7a49c58..4ff950e5e 100644 --- a/core/startos/src/version/v0_4_0_alpha_5.rs +++ b/core/startos/src/version/v0_4_0_alpha_5.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_4_0_alpha_4, VersionT}; +use super::{VersionT, v0_4_0_alpha_4}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_4_0_alpha_6.rs b/core/startos/src/version/v0_4_0_alpha_6.rs index ce208e6f4..d75aceb19 100644 --- a/core/startos/src/version/v0_4_0_alpha_6.rs +++ b/core/startos/src/version/v0_4_0_alpha_6.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_4_0_alpha_5, VersionT}; +use super::{VersionT, v0_4_0_alpha_5}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_4_0_alpha_7.rs b/core/startos/src/version/v0_4_0_alpha_7.rs index 851073362..bd8a226e1 100644 --- a/core/startos/src/version/v0_4_0_alpha_7.rs +++ b/core/startos/src/version/v0_4_0_alpha_7.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_4_0_alpha_6, VersionT}; +use super::{VersionT, v0_4_0_alpha_6}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_4_0_alpha_8.rs b/core/startos/src/version/v0_4_0_alpha_8.rs index d03dc357d..fa2c87a0a 100644 --- a/core/startos/src/version/v0_4_0_alpha_8.rs +++ b/core/startos/src/version/v0_4_0_alpha_8.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_4_0_alpha_7, VersionT}; +use super::{VersionT, v0_4_0_alpha_7}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_4_0_alpha_9.rs b/core/startos/src/version/v0_4_0_alpha_9.rs index 6a3499d28..ffb5ad5be 100644 --- a/core/startos/src/version/v0_4_0_alpha_9.rs +++ b/core/startos/src/version/v0_4_0_alpha_9.rs @@ -7,13 +7,13 @@ use imbl_value::{InOMap, InternedString}; use models::PackageId; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_4_0_alpha_8, VersionT}; +use super::{VersionT, v0_4_0_alpha_8}; +use crate::DATA_DIR; use crate::context::RpcContext; use crate::install::PKG_ARCHIVE_DIR; use crate::prelude::*; use crate::util::io::write_file_atomic; use crate::volume::PKG_VOLUME_DIR; -use crate::DATA_DIR; lazy_static::lazy_static! { static ref V0_4_0_alpha_9: exver::Version = exver::Version::new( diff --git a/core/startos/startd.service b/core/startos/startd.service index 6ce17697e..c40b69a99 100644 --- a/core/startos/startd.service +++ b/core/startos/startd.service @@ -4,6 +4,7 @@ Description=StartOS Daemon [Service] Type=simple Environment=RUST_LOG=startos=debug,patch_db=warn +Environment=RUST_BACKTRACE=1 ExecStart=/usr/bin/startd Restart=always RestartSec=3 diff --git a/debian/postinst b/debian/postinst index f2ec29f59..a8d4ee729 100755 --- a/debian/postinst +++ b/debian/postinst @@ -58,17 +58,12 @@ EOF rm -f /etc/localtime ln -s /usr/share/zoneinfo/Etc/UTC /etc/localtime -# switch to systemd-resolved & network-manager +rm /etc/resolv.conf +echo "nameserver 127.0.0.1" > /etc/resolv.conf +echo "nameserver 1.1.1.1" >> /etc/resolv.conf # Cloudflare DNS Fallback + +# switch to network-manager echo "#" > /etc/network/interfaces -if ! [ -f /etc/resolv.conf ]; then - rm -f /etc/resolv.conf - echo "nameserver 1.1.1.1" > /etc/resolv.conf # Cloudflare DNS Fallback -fi -if ! [ -f /run/systemd/resolve/stub-resolv.conf ]; then - mkdir -p /run/systemd/resolve - cp /etc/resolv.conf /run/systemd/resolve/stub-resolv.conf -fi -ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf cat << EOF > /etc/NetworkManager/NetworkManager.conf [main] plugins=ifupdown,keyfile @@ -110,8 +105,9 @@ sed -i '/^\s*#\?\s*issue_discards\s*=\s*/c\issue_discards = 1' /etc/lvm/lvm.conf sed -i '/\(^\|#\)\s*unqualified-search-registries\s*=\s*/c\unqualified-search-registries = ["docker.io"]' /etc/containers/registries.conf sed -i 's/\(#\|\^\)\s*\([^=]\+\)=\(suspend\|hibernate\)\s*$/\2=ignore/g' /etc/systemd/logind.conf sed -i '/\(^\|#\)MulticastDNS=/c\MulticastDNS=no' /etc/systemd/resolved.conf -sed -i '/\(^\|#\)DNS=/c\DNS=127.0.0.1:5355' /etc/systemd/resolved.conf -sed -i '/\(^\|#\)DNSStubListenerExtra=/c\DNSStubListenerExtra=0.0.0.0:53' /etc/systemd/resolved.conf +sed -i '/\(^\|#\)DNSStubListener=/c\DNSStubListener=no' /etc/systemd/resolved.conf +sed -i '/\(^\|#\)LXC_DHCP_CONFILE=/c\LXC_DHCP_CONFILE=/etc/dnsmasq.conf' /etc/default/lxc-net +echo 'port=0' > /etc/dnsmasq.conf sed -i 's/\[Service\]/[Service]\nEnvironment=SYSTEMD_LOG_LEVEL=debug/' /lib/systemd/system/systemd-timesyncd.service sed -i "s/\.debian\./\./g;s/#FallbackNTP=/FallbackNTP=/" /etc/systemd/timesyncd.conf sed -i '/\(^\|#\)RootDistanceMaxSec=/c\RootDistanceMaxSec=10' /etc/systemd/timesyncd.conf