diff --git a/Makefile b/Makefile index 9872b9fed..659b4926e 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,7 @@ WEB_SHARED_SRC := $(call ls-files, web/projects/shared) $(call ls-files, web/pro WEB_UI_SRC := $(call ls-files, web/projects/ui) WEB_SETUP_WIZARD_SRC := $(call ls-files, web/projects/setup-wizard) WEB_INSTALL_WIZARD_SRC := $(call ls-files, web/projects/install-wizard) +WEB_START_TUNNEL_SRC := $(call ls-files, web/projects/start-tunnel) 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) @@ -139,7 +140,7 @@ install-tunnel: core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/tunnelbox core $(call mkdir,$(DESTDIR)/lib/systemd/system) $(call cp,core/startos/start-tunneld.service,$(DESTDIR)/lib/systemd/system/start-tunneld.service) -core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/tunnelbox: $(CORE_SRC) $(ENVIRONMENT_FILE) +core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/tunnelbox: $(CORE_SRC) $(ENVIRONMENT_FILE) web/dist/static/start-tunnel/index.html ARCH=$(ARCH) PROFILE=$(PROFILE) ./core/build-tunnelbox.sh deb: results/$(BASENAME).deb @@ -339,8 +340,12 @@ web/dist/raw/install-wizard/index.html: $(WEB_INSTALL_WIZARD_SRC) $(WEB_SHARED_S npm --prefix web run build:install touch web/dist/raw/install-wizard/index.html -$(COMPRESSED_WEB_UIS): $(WEB_UIS) $(ENVIRONMENT_FILE) - ./compress-uis.sh +web/dist/raw/start-tunnel/index.html: $(WEB_START_TUNNEL_SRC) $(WEB_SHARED_SRC) web/.angular/.updated + npm --prefix web run build:tunnel + touch web/dist/raw/start-tunnel/index.html + +web/dist/static/%/index.html: web/dist/raw/%/index.html + ./compress-uis.sh $* web/config.json: $(GIT_HASH_FILE) web/config-sample.json jq '.useMocks = false' web/config-sample.json | jq '.gitHash = "$(shell cat GIT_HASH.txt)"' > web/config.json diff --git a/compress-uis.sh b/compress-uis.sh index 3ca6cccf0..91048d19f 100755 --- a/compress-uis.sh +++ b/compress-uis.sh @@ -4,13 +4,17 @@ cd "$(dirname "${BASH_SOURCE[0]}")" set -e -rm -rf web/dist/static +STATIC_DIR=web/dist/static/$1 +RAW_DIR=web/dist/raw/$1 + +mkdir -p $STATIC_DIR +rm -rf $STATIC_DIR if ! [[ "$ENVIRONMENT" =~ (^|-)dev($|-) ]]; then - find web/dist/raw -type f -not -name '*.gz' -and -not -name '*.br' | xargs -n 1 -P 0 gzip -kf - find web/dist/raw -type f -not -name '*.gz' -and -not -name '*.br' | xargs -n 1 -P 0 brotli -kf + find $RAW_DIR -type f -not -name '*.gz' -and -not -name '*.br' | xargs -n 1 -P 0 gzip -kf + find $RAW_DIR -type f -not -name '*.gz' -and -not -name '*.br' | xargs -n 1 -P 0 brotli -kf - for file in $(find web/dist/raw -type f -not -name '*.gz' -and -not -name '*.br'); do + for file in $(find $RAW_DIR -type f -not -name '*.gz' -and -not -name '*.br'); do raw_size=$(du $file | awk '{print $1 * 512}') gz_size=$(du $file.gz | awk '{print $1 * 512}') br_size=$(du $file.br | awk '{print $1 * 512}') @@ -23,4 +27,5 @@ if ! [[ "$ENVIRONMENT" =~ (^|-)dev($|-) ]]; then done fi -cp -r web/dist/raw web/dist/static \ No newline at end of file + +cp -r $RAW_DIR $STATIC_DIR \ No newline at end of file diff --git a/core/startos/src/account.rs b/core/startos/src/account.rs index 14752b5da..87e127d17 100644 --- a/core/startos/src/account.rs +++ b/core/startos/src/account.rs @@ -6,7 +6,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 4729a3fb9..aac044bb9 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 54c62e0df..c4ef42475 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 9098b4deb..1a57319fd 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/bins/registry.rs b/core/startos/src/bins/registry.rs index 53fd06ea7..cee20adc8 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 5e25a0cca..647e509d4 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 259831315..fedc9f623 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::gateway::UpgradableListener; diff --git a/core/startos/src/bins/tunnel.rs b/core/startos/src/bins/tunnel.rs index 5c505551d..dde7d116d 100644 --- a/core/startos/src/bins/tunnel.rs +++ b/core/startos/src/bins/tunnel.rs @@ -11,8 +11,8 @@ use tokio::signal::unix::signal; use tracing::instrument; use visit_rs::Visit; -use crate::context::config::ClientConfig; use crate::context::CliContext; +use crate::context::config::ClientConfig; use crate::net::gateway::{Bind, BindTcp}; use crate::net::tls::TlsListener; use crate::net::web_server::{Accept, Acceptor, MetadataVisitor, WebServer}; diff --git a/core/startos/src/context/cli.rs b/core/startos/src/context/cli.rs index b10af854a..9248db005 100644 --- a/core/startos/src/context/cli.rs +++ b/core/startos/src/context/cli.rs @@ -21,9 +21,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; diff --git a/core/startos/src/context/init.rs b/core/startos/src/context/init.rs index bceae8a86..b7d5eac6a 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/rpc.rs b/core/startos/src/context/rpc.rs index cb4114715..7ffd339d9 100644 --- a/core/startos/src/context/rpc.rs +++ b/core/startos/src/context/rpc.rs @@ -3,8 +3,8 @@ use std::ffi::OsStr; use std::future::Future; 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}; @@ -17,18 +17,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, RwLock}; +use tokio::sync::{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::LxcManager; use crate::net::gateway::UpgradableListener; @@ -40,14 +41,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, SyncRwLock, 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 5594f781a..a00b092ed 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::gateway::UpgradableListener; @@ -28,7 +29,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/db/mod.rs b/core/startos/src/db/mod.rs index b271deb8d..aad28d1eb 100644 --- a/core/startos/src/db/mod.rs +++ b/core/startos/src/db/mod.rs @@ -13,7 +13,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; @@ -24,7 +24,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/public.rs b/core/startos/src/db/model/public.rs index caebe5c85..7cc1ea619 100644 --- a/core/startos/src/db/model/public.rs +++ b/core/startos/src/db/model/public.rs @@ -16,12 +16,12 @@ use serde::{Deserialize, Serialize}; use ts_rs::TS; use crate::account::AccountInfo; -use crate::db::model::package::AllPackageData; -use crate::db::model::Database; use crate::db::DbAccessByKey; +use crate::db::model::Database; +use crate::db::model::package::AllPackageData; use crate::net::acme::AcmeProvider; -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::*; diff --git a/core/startos/src/dependencies.rs b/core/startos/src/dependencies.rs index 43ed3bbc3..375b6c67d 100644 --- a/core/startos/src/dependencies.rs +++ b/core/startos/src/dependencies.rs @@ -6,9 +6,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/disk/mount/guard.rs b/core/startos/src/disk/mount/guard.rs index 761060f20..980e4daa5 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/init.rs b/core/startos/src/init.rs index 0f9382515..001dca911 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; @@ -35,10 +35,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/lib.rs b/core/startos/src/lib.rs index c07f58fce..896d7ad03 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; @@ -90,7 +90,7 @@ use crate::disk::fsck::RequiresReboot; use crate::registry::context::{RegistryContext, RegistryUrlParams}; use crate::system::kiosk; use crate::tunnel::context::TunnelUrlParams; -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 728c9cd71..15bf31ebe 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/middleware/auth.rs b/core/startos/src/middleware/auth.rs index 47a6935a8..3d2d7679e 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,15 +25,15 @@ 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::middleware::signature::{SignatureAuth, SignatureAuthContext}; use crate::prelude::*; use crate::rpc_continuations::OpenAuthedContinuations; +use crate::util::Invoke; use crate::util::io::{create_file_mod, read_file_to_string}; 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/signature.rs b/core/startos/src/middleware/signature.rs index 21df6e053..1ad72197c 100644 --- a/core/startos/src/middleware/signature.rs +++ b/core/startos/src/middleware/signature.rs @@ -9,16 +9,16 @@ use http::{HeaderMap, HeaderValue}; use reqwest::Client; 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, RpcContext}; use crate::db::model::Database; 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::iter::TransposeResultIterExt; use crate::util::serde::Base64; @@ -33,7 +33,7 @@ pub trait SignatureAuthContext: Context { fn sig_context( &self, ) -> impl Future + Send, Error>> + Send> - + Send; + + Send; fn check_pubkey( db: &Model, pubkey: Option<&AnyVerifyingKey>, @@ -304,10 +304,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 134a70af8..2d562b0df 100644 --- a/core/startos/src/net/acme.rs +++ b/core/startos/src/net/acme.rs @@ -3,28 +3,28 @@ use std::net::IpAddr; use std::str::FromStr; use std::sync::Arc; -use async_acme::acme::{Identifier, ACME_TLS_ALPN_NAME}; -use clap::builder::ValueParserFactory; +use async_acme::acme::{ACME_TLS_ALPN_NAME, Identifier}; use clap::Parser; +use clap::builder::ValueParserFactory; use futures::StreamExt; 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 tokio_rustls::rustls::ServerConfig; use tokio_rustls::rustls::crypto::CryptoProvider; use tokio_rustls::rustls::pki_types::{CertificateDer, PrivateKeyDer, PrivatePkcs8KeyDer}; use tokio_rustls::rustls::server::ClientHello; use tokio_rustls::rustls::sign::CertifiedKey; -use tokio_rustls::rustls::ServerConfig; 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::db::{DbAccess, DbAccessByKey, DbAccessMut}; use crate::net::tls::{SingleCertResolver, TlsHandler}; use crate::net::web_server::Accept; diff --git a/core/startos/src/net/dns.rs b/core/startos/src/net/dns.rs index cfb150505..fac1249cd 100644 --- a/core/startos/src/net/dns.rs +++ b/core/startos/src/net/dns.rs @@ -11,36 +11,36 @@ use futures::future::BoxFuture; use futures::{FutureExt, StreamExt}; use helpers::NonDetachingJoinHandle; use hickory_client::client::Client; +use hickory_client::proto::DnsHandle; 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::DnsHandle; +use hickory_server::ServerFuture; use hickory_server::authority::MessageResponseBuilder; use hickory_server::proto::op::{Header, ResponseCode}; use hickory_server::proto::rr::{Name, Record, RecordType}; use hickory_server::server::{Request, RequestHandler, ResponseHandler, ResponseInfo}; -use hickory_server::ServerFuture; use imbl::OrdMap; use imbl_value::InternedString; use itertools::Itertools; use models::{GatewayId, OptionExt, PackageId}; use patch_db::json_ptr::JsonPointer; use rpc_toolkit::{ - from_fn_async, from_fn_blocking, Context, HandlerArgs, HandlerExt, ParentHandler, + Context, HandlerArgs, HandlerExt, ParentHandler, from_fn_async, from_fn_blocking, }; use serde::{Deserialize, Serialize}; use tokio::net::{TcpListener, UdpSocket}; use tracing::instrument; 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::gateway::NetworkInterfaceWatcher; use crate::prelude::*; use crate::util::actor::background::BackgroundJobQueue; use crate::util::io::file_string_stream; -use crate::util::serde::{display_serializable, HandlerExtSerde}; +use crate::util::serde::{HandlerExtSerde, display_serializable}; use crate::util::sync::{SyncRwLock, Watch}; pub fn dns_api() -> ParentHandler { @@ -478,11 +478,7 @@ impl RequestHandler for Resolver { header, &ip.into_iter() .filter_map(|a| { - if let IpAddr::V4(a) = a { - Some(a) - } else { - None - } + if let IpAddr::V4(a) = a { Some(a) } else { None } }) .map(|ip| { Record::from_rdata( @@ -508,11 +504,7 @@ impl RequestHandler for Resolver { header, &ip.into_iter() .filter_map(|a| { - if let IpAddr::V6(a) = a { - Some(a) - } else { - None - } + if let IpAddr::V6(a) = a { Some(a) } else { None } }) .map(|ip| { Record::from_rdata( diff --git a/core/startos/src/net/forward.rs b/core/startos/src/net/forward.rs index 972f4f75b..92deaecbe 100644 --- a/core/startos/src/net/forward.rs +++ b/core/startos/src/net/forward.rs @@ -8,7 +8,7 @@ use id_pool::IdPool; use iddqd::{IdOrdItem, IdOrdMap}; use imbl::OrdMap; use models::GatewayId; -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::process::Command; use tokio::sync::mpsc; @@ -18,9 +18,9 @@ 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::serde::{display_serializable, HandlerExtSerde}; -use crate::util::sync::Watch; use crate::util::Invoke; +use crate::util::serde::{HandlerExtSerde, display_serializable}; +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 8f07147dc..2db91cd70 100644 --- a/core/startos/src/net/gateway.rs +++ b/core/startos/src/net/gateway.rs @@ -3,7 +3,7 @@ use std::collections::{BTreeMap, BTreeSet, HashMap}; use std::future::Future; use std::net::{IpAddr, Ipv4Addr, SocketAddr, SocketAddrV6}; use std::sync::{Arc, Weak}; -use std::task::{ready, Poll}; +use std::task::{Poll, ready}; use std::time::Duration; use clap::Parser; @@ -17,7 +17,7 @@ use itertools::Itertools; use models::GatewayId; use nix::net::if_::if_nametoindex; use patch_db::json_ptr::JsonPointer; -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::io::{AsyncBufReadExt, BufReader}; use tokio::net::TcpListener; @@ -29,22 +29,22 @@ use zbus::proxy::{PropertyChanged, PropertyStream, SignalStream}; use zbus::zvariant::{ DeserializeDict, Dict, OwnedObjectPath, OwnedValue, Type as ZType, Value as ZValue, }; -use zbus::{proxy, Connection}; +use zbus::{Connection, proxy}; use crate::context::{CliContext, RpcContext}; -use crate::db::model::public::{IpInfo, NetworkInterfaceInfo, NetworkInterfaceType}; use crate::db::model::Database; +use crate::db::model::public::{IpInfo, NetworkInterfaceInfo, NetworkInterfaceType}; use crate::net::forward::START9_BRIDGE_IFACE; use crate::net::gateway::device::DeviceProxy; use crate::net::utils::ipv6_is_link_local; use crate::net::web_server::{Accept, AcceptStream, Acceptor, MetadataVisitor}; use crate::prelude::*; +use crate::util::Invoke; use crate::util::collections::OrdMapIterMut; use crate::util::future::Until; use crate::util::io::open_file; -use crate::util::serde::{display_serializable, HandlerExtSerde}; +use crate::util::serde::{HandlerExtSerde, display_serializable}; use crate::util::sync::{SyncMutex, Watch}; -use crate::util::Invoke; pub fn gateway_api() -> ParentHandler { ParentHandler::new() diff --git a/core/startos/src/net/host/address.rs b/core/startos/src/net/host/address.rs index c09500601..6d7723a23 100644 --- a/core/startos/src/net/host/address.rs +++ b/core/startos/src/net/host/address.rs @@ -4,17 +4,17 @@ use std::net::Ipv4Addr; 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")] @@ -105,8 +105,8 @@ fn handle_duplicates(db: &mut 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 bb2e12454..59939b689 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)] @@ -170,8 +170,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 e2278a858..c5e6388eb 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 a6316bc10..7f1497234 100644 --- a/core/startos/src/net/net_controller.rs +++ b/core/startos/src/net/net_controller.rs @@ -3,7 +3,7 @@ use std::net::{Ipv4Addr, SocketAddr}; use std::sync::{Arc, Weak}; use color_eyre::eyre::eyre; -use imbl::{vector, OrdMap}; +use imbl::{OrdMap, vector}; use imbl_value::InternedString; use ipnet::IpNet; use models::{GatewayId, HostId, OptionExt, PackageId}; @@ -12,8 +12,9 @@ use tokio::task::JoinHandle; use tokio_rustls::rustls::ClientConfig as TlsClientConfig; use tracing::instrument; -use crate::db::model::public::NetworkInterfaceType; +use crate::HOST_IP; use crate::db::model::Database; +use crate::db::model::public::NetworkInterfaceType; use crate::error::ErrorCollection; use crate::hostname::Hostname; use crate::net::dns::DnsController; @@ -24,7 +25,7 @@ use crate::net::gateway::{ }; use crate::net::host::address::HostAddress; use crate::net::host::binding::{AddSslOptions, BindId, BindOptions}; -use crate::net::host::{host_for, Host, Hosts}; +use crate::net::host::{Host, Hosts, host_for}; use crate::net::service_interface::{GatewayInfo, HostnameInfo, IpHostname, OnionHostname}; use crate::net::socks::SocksController; use crate::net::tor::{OnionAddress, TorController, TorSecretKey}; @@ -33,7 +34,6 @@ use crate::net::vhost::{AlpnInfo, DynVHostTarget, ProxyTarget, VHostController}; use crate::prelude::*; use crate::service::effects::callbacks::ServiceCallbacks; use crate::util::serde::MaybeUtf8String; -use crate::HOST_IP; pub struct NetController { pub(crate) db: TypedPatchDb, diff --git a/core/startos/src/net/socks.rs b/core/startos/src/net/socks.rs index b6ac3030c..d556fa143 100644 --- a/core/startos/src/net/socks.rs +++ b/core/startos/src/net/socks.rs @@ -8,10 +8,10 @@ use socks5_impl::server::auth::NoAuth; use socks5_impl::server::{AuthAdaptor, ClientConnection, Server}; use tokio::net::{TcpListener, TcpStream}; +use crate::HOST_IP; use crate::net::tor::TorController; use crate::prelude::*; use crate::util::actor::background::BackgroundJobQueue; -use crate::HOST_IP; pub const DEFAULT_SOCKS_LISTEN: SocketAddr = SocketAddr::V4(SocketAddrV4::new( Ipv4Addr::new(HOST_IP[0], HOST_IP[1], HOST_IP[2], HOST_IP[3]), diff --git a/core/startos/src/net/ssl.rs b/core/startos/src/net/ssl.rs index e5dcb74af..fef0c2b0f 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; @@ -19,17 +19,18 @@ use openssl::x509::extension::{ AuthorityKeyIdentifier, BasicConstraints, KeyUsage, SubjectAlternativeName, SubjectKeyIdentifier, }; -use openssl::x509::{X509Builder, X509NameBuilder, X509}; +use openssl::x509::{X509, X509Builder, X509NameBuilder}; use openssl::*; use patch_db::HasModel; use serde::{Deserialize, Serialize}; +use tokio_rustls::rustls::ServerConfig; use tokio_rustls::rustls::crypto::CryptoProvider; use tokio_rustls::rustls::pki_types::{PrivateKeyDer, PrivatePkcs8KeyDer}; use tokio_rustls::rustls::server::ClientHello; -use tokio_rustls::rustls::ServerConfig; use tracing::instrument; use visit_rs::Visit; +use crate::SOURCE_DATE; use crate::account::AccountInfo; use crate::db::model::Database; use crate::db::{DbAccess, DbAccessMut}; @@ -37,10 +38,9 @@ use crate::hostname::Hostname; use crate::init::check_time_is_synchronized; use crate::net::gateway::GatewayInfo; use crate::net::tls::TlsHandler; -use crate::net::web_server::{extract, Accept, ExtractVisitor, TcpMetadata}; +use crate::net::web_server::{Accept, ExtractVisitor, TcpMetadata, extract}; use crate::prelude::*; use crate::util::serde::Pem; -use crate::SOURCE_DATE; pub fn gen_nistp256() -> Result, ErrorStack> { PKey::from_ec_key(EcKey::generate(&*EcGroup::from_curve_name( diff --git a/core/startos/src/net/static_server.rs b/core/startos/src/net/static_server.rs index f328ad22d..7cc089bc3 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::{IntoResponse, Redirect, Response}; use axum::routing::{any, get}; -use axum::Router; use base64::display::Base64Display; use digest::Digest; use futures::future::ready; @@ -21,7 +21,7 @@ use http::header::{ use http::request::Parts as RequestParts; use http::{HeaderValue, Method, StatusCode}; use imbl_value::InternedString; -use include_dir::Dir; +use include_dir::{Dir, include_dir}; use models::PackageId; use new_mime_guess::MimeGuess; use openssl::hash::MessageDigest; @@ -41,10 +41,10 @@ use crate::net::gateway::GatewayInfo; use crate::net::tls::TlsHandshakeInfo; use crate::prelude::*; 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; @@ -57,14 +57,29 @@ const INTERNAL_SERVER_ERROR: &[u8] = b"Internal Server Error"; const PROXY_STRIP_HEADERS: &[&str] = &["cookie", "host", "origin", "referer", "user-agent"]; -#[cfg(all(feature = "startd", not(feature = "test")))] -const EMBEDDED_UIS: Dir<'_> = - include_dir::include_dir!("$CARGO_MANIFEST_DIR/../../web/dist/static"); -#[cfg(not(all(feature = "startd", not(feature = "test"))))] -const EMBEDDED_UIS: Dir<'_> = Dir::new("", &[]); +pub const EMPTY_DIR: Dir<'_> = Dir::new("", &[]); + +#[macro_export] +macro_rules! else_empty_dir { + ($cfg:meta => $dir:expr) => {{ + #[cfg(all($cfg, not(feature = "test")))] + { + $dir + } + #[cfg(not(all($cfg, not(feature = "test"))))] + { + crate::net::static_server::EMPTY_DIR + } + }}; +} + +const EMBEDDED_UI_ROOT: Dir<'_> = else_empty_dir!( + feature = "startd" => + include_dir::include_dir!("$CARGO_MANIFEST_DIR/../../web/dist/static") +); pub trait UiContext: Context + AsRef + Clone + Sized { - fn path(path: &str) -> PathBuf; + const UI_DIR: &'static Dir<'static>; fn middleware(server: Server) -> HttpServer; fn extend_router(self, router: Router) -> Router { router @@ -72,9 +87,11 @@ pub trait UiContext: Context + AsRef + Clone + Sized { } impl UiContext for RpcContext { - fn path(path: &str) -> PathBuf { - Path::new("ui").join(path) - } + const UI_DIR: &'static Dir<'static> = &else_empty_dir!( + feature = "startd" => + include_dir::include_dir!("$CARGO_MANIFEST_DIR/../../web/dist/static/ui") + ); + fn middleware(server: Server) -> HttpServer { server .middleware(Cors::new()) @@ -134,36 +151,44 @@ impl UiContext for RpcContext { } impl UiContext for InitContext { - fn path(path: &str) -> PathBuf { - Path::new("ui").join(path) - } + const UI_DIR: &'static Dir<'static> = &else_empty_dir!( + feature = "startd" => + include_dir::include_dir!("$CARGO_MANIFEST_DIR/../../web/dist/static/ui") + ); + fn middleware(server: Server) -> HttpServer { server.middleware(Cors::new()) } } impl UiContext for DiagnosticContext { - fn path(path: &str) -> PathBuf { - Path::new("ui").join(path) - } + const UI_DIR: &'static Dir<'static> = &else_empty_dir!( + feature = "startd" => + include_dir::include_dir!("$CARGO_MANIFEST_DIR/../../web/dist/static/ui") + ); + fn middleware(server: Server) -> HttpServer { server.middleware(Cors::new()) } } impl UiContext for SetupContext { - fn path(path: &str) -> PathBuf { - Path::new("setup-wizard").join(path) - } + const UI_DIR: &'static Dir<'static> = &else_empty_dir!( + feature = "startd" => + include_dir::include_dir!("$CARGO_MANIFEST_DIR/../../web/dist/static/setup-wizard") + ); + fn middleware(server: Server) -> HttpServer { server.middleware(Cors::new()) } } impl UiContext for InstallContext { - fn path(path: &str) -> PathBuf { - Path::new("install-wizard").join(path) - } + const UI_DIR: &'static Dir<'static> = &else_empty_dir!( + feature = "startd" => + include_dir::include_dir!("$CARGO_MANIFEST_DIR/../../web/dist/static/install-wizard") + ); + fn middleware(server: Server) -> HttpServer { server.middleware(Cors::new()) } @@ -206,20 +231,19 @@ fn serve_ui(req: Request) -> Result { let (request_parts, _body) = req.into_parts(); match &request_parts.method { &Method::GET | &Method::HEAD => { - let uri_path = C::path( - request_parts - .uri - .path() - .strip_prefix('/') - .unwrap_or(request_parts.uri.path()), - ); + let uri_path = request_parts + .uri + .path() + .strip_prefix('/') + .unwrap_or(request_parts.uri.path()); - let file = EMBEDDED_UIS - .get_file(&*uri_path) - .or_else(|| EMBEDDED_UIS.get_file(&*C::path("index.html"))); + let file = C::UI_DIR + .get_file(uri_path) + .or_else(|| C::UI_DIR.get_file("index.html")); if let Some(file) = file { - FileData::from_embedded(&request_parts, file)?.into_response(&request_parts) + FileData::from_embedded(&request_parts, file, C::UI_DIR)? + .into_response(&request_parts) } else { Ok(not_found()) } @@ -505,6 +529,7 @@ impl FileData { fn from_embedded( req: &RequestParts, file: &'static include_dir::File<'static>, + ui_dir: &'static Dir<'static>, ) -> Result { let path = file.path(); let (encoding, data, len, content_range) = if let Some(range) = req.headers.get(RANGE) { @@ -546,12 +571,12 @@ impl FileData { .fold((None, file.contents()), |acc, e| { if let Some(file) = (e == "br") .then_some(()) - .and_then(|_| EMBEDDED_UIS.get_file(format!("{}.br", path.display()))) + .and_then(|_| ui_dir.get_file(format!("{}.br", path.display()))) { (Some("br"), file.contents()) } else if let Some(file) = (e == "gzip" && acc.0 != Some("br")) .then_some(()) - .and_then(|_| EMBEDDED_UIS.get_file(format!("{}.gz", path.display()))) + .and_then(|_| ui_dir.get_file(format!("{}.gz", path.display()))) { (Some("gzip"), file.contents()) } else { diff --git a/core/startos/src/net/tls.rs b/core/startos/src/net/tls.rs index 4a71453dd..a29a63b5e 100644 --- a/core/startos/src/net/tls.rs +++ b/core/startos/src/net/tls.rs @@ -1,17 +1,17 @@ use std::sync::Arc; use std::task::Poll; -use futures::future::BoxFuture; use futures::FutureExt; +use futures::future::BoxFuture; use imbl_value::InternedString; use openssl::x509::X509Ref; use tokio::io::AsyncWriteExt; +use tokio_rustls::LazyConfigAcceptor; use tokio_rustls::rustls::crypto::CryptoProvider; use tokio_rustls::rustls::pki_types::CertificateDer; use tokio_rustls::rustls::server::{Acceptor, ClientHello, ResolvesServerCert}; use tokio_rustls::rustls::sign::CertifiedKey; use tokio_rustls::rustls::{ClientConfig, RootCertStore, ServerConfig}; -use tokio_rustls::LazyConfigAcceptor; use visit_rs::{Visit, VisitFields}; use crate::net::web_server::{Accept, AcceptStream, MetadataVisitor}; diff --git a/core/startos/src/net/tor/arti.rs b/core/startos/src/net/tor/arti.rs index 775210395..1cfe7cfb1 100644 --- a/core/startos/src/net/tor/arti.rs +++ b/core/startos/src/net/tor/arti.rs @@ -14,7 +14,7 @@ use futures::{FutureExt, StreamExt}; use helpers::NonDetachingJoinHandle; use imbl_value::InternedString; use itertools::Itertools; -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::{AsyncReadExt, AsyncWriteExt}; use tokio::net::TcpStream; @@ -34,8 +34,8 @@ use crate::util::actor::background::BackgroundJobQueue; use crate::util::future::Until; use crate::util::io::ReadWriter; use crate::util::serde::{ - deserialize_from_str, display_serializable, serialize_display, Base64, HandlerExtSerde, - WithIoFormat, BASE64, + BASE64, Base64, HandlerExtSerde, WithIoFormat, deserialize_from_str, display_serializable, + serialize_display, }; use crate::util::sync::{SyncMutex, SyncRwLock, Watch}; @@ -628,11 +628,7 @@ impl TorController { } else { false }; - if rm { - s.remove(&addr) - } else { - None - } + if rm { s.remove(&addr) } else { None } }) { s.shutdown().await } else { diff --git a/core/startos/src/net/tor/ctor.rs b/core/startos/src/net/tor/ctor.rs index 18f987cb8..83011bd36 100644 --- a/core/startos/src/net/tor/ctor.rs +++ b/core/startos/src/net/tor/ctor.rs @@ -15,7 +15,7 @@ use imbl::OrdMap; use imbl_value::InternedString; 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::net::TcpStream; use tokio::process::Command; @@ -27,16 +27,16 @@ use tracing::instrument; use ts_rs::TS; use crate::context::{CliContext, RpcContext}; -use crate::logs::{journalctl, LogSource, LogsParams}; +use crate::logs::{LogSource, LogsParams, journalctl}; use crate::prelude::*; +use crate::util::Invoke; use crate::util::collections::ordmap_retain; -use crate::util::io::{write_file_atomic, ReadWriter}; +use crate::util::io::{ReadWriter, write_file_atomic}; use crate::util::serde::{ - deserialize_from_str, display_serializable, serialize_display, Base64, HandlerExtSerde, - WithIoFormat, BASE64, + BASE64, Base64, HandlerExtSerde, WithIoFormat, deserialize_from_str, display_serializable, + serialize_display, }; use crate::util::sync::Watch; -use crate::util::Invoke; pub const SYSTEMD_UNIT: &str = "tor@default"; const STARTING_HEALTH_TIMEOUT: u64 = 120; // 2min @@ -911,7 +911,12 @@ async fn torctl( .is_err() { if last_success.elapsed() > *health_timeout { - let err = Error::new(eyre!("Tor health check failed for longer than current timeout ({health_timeout:?})"), crate::ErrorKind::Tor); + let err = Error::new( + eyre!( + "Tor health check failed for longer than current timeout ({health_timeout:?})" + ), + crate::ErrorKind::Tor, + ); *health_timeout *= 2; wipe_state.store(true, std::sync::atomic::Ordering::SeqCst); return Err(err); diff --git a/core/startos/src/net/tor/mod.rs b/core/startos/src/net/tor/mod.rs index 06b57ae2a..d4d5c8007 100644 --- a/core/startos/src/net/tor/mod.rs +++ b/core/startos/src/net/tor/mod.rs @@ -5,6 +5,6 @@ mod arti; mod ctor; #[cfg(feature = "arti")] -pub use arti::{tor_api, OnionAddress, OnionStore, TorController, TorSecretKey}; +pub use arti::{OnionAddress, OnionStore, TorController, TorSecretKey, tor_api}; #[cfg(not(feature = "arti"))] -pub use ctor::{tor_api, OnionAddress, OnionStore, TorController, TorSecretKey}; +pub use ctor::{OnionAddress, OnionStore, TorController, TorSecretKey, tor_api}; diff --git a/core/startos/src/net/tunnel.rs b/core/startos/src/net/tunnel.rs index a31ca5a8b..f61023401 100644 --- a/core/startos/src/net/tunnel.rs +++ b/core/startos/src/net/tunnel.rs @@ -2,7 +2,7 @@ use clap::Parser; use imbl_value::InternedString; use models::GatewayId; use patch_db::json_ptr::JsonPointer; -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; @@ -10,8 +10,8 @@ use ts_rs::TS; use crate::context::{CliContext, RpcContext}; use crate::db::model::public::{NetworkInterfaceInfo, 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 8aa7ea46a..80c3325fd 100644 --- a/core/startos/src/net/vhost.rs +++ b/core/startos/src/net/vhost.rs @@ -2,30 +2,30 @@ use std::any::Any; use std::collections::{BTreeMap, BTreeSet}; use std::net::{IpAddr, SocketAddr}; use std::sync::{Arc, Weak}; -use std::task::{ready, Poll}; +use std::task::{Poll, ready}; use async_acme::acme::ACME_TLS_ALPN_NAME; use color_eyre::eyre::eyre; -use futures::future::BoxFuture; use futures::FutureExt; +use futures::future::BoxFuture; use helpers::NonDetachingJoinHandle; use imbl_value::{InOMap, InternedString}; use models::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::net::TcpStream; +use tokio_rustls::TlsConnector; use tokio_rustls::rustls::crypto::CryptoProvider; use tokio_rustls::rustls::pki_types::ServerName; use tokio_rustls::rustls::server::ClientHello; use tokio_rustls::rustls::{ClientConfig, ServerConfig}; -use tokio_rustls::TlsConnector; use tracing::instrument; use ts_rs::TS; use visit_rs::Visit; use crate::context::{CliContext, RpcContext}; -use crate::db::model::public::AcmeSettings; use crate::db::model::Database; +use crate::db::model::public::AcmeSettings; use crate::db::{DbAccessByKey, DbAccessMut}; use crate::net::acme::{ AcmeCertStore, AcmeProvider, AcmeTlsAlpnCache, AcmeTlsHandler, GetAcmeProvider, @@ -38,10 +38,10 @@ use crate::net::ssl::{CertStore, RootCaTlsHandler}; use crate::net::tls::{ ChainedHandler, TlsHandlerWrapper, TlsListener, TlsMetadata, WrapTlsHandler, }; -use crate::net::web_server::{extract, Accept, AcceptStream, ExtractVisitor, TcpMetadata}; +use crate::net::web_server::{Accept, AcceptStream, ExtractVisitor, TcpMetadata, extract}; use crate::prelude::*; use crate::util::collections::EqSet; -use crate::util::serde::{display_serializable, HandlerExtSerde, MaybeUtf8String}; +use crate::util::serde::{HandlerExtSerde, MaybeUtf8String, display_serializable}; use crate::util::sync::{SyncMutex, Watch}; pub fn vhost_api() -> ParentHandler { diff --git a/core/startos/src/net/web_server.rs b/core/startos/src/net/web_server.rs index 13f67a436..01af76a7d 100644 --- a/core/startos/src/net/web_server.rs +++ b/core/startos/src/net/web_server.rs @@ -5,7 +5,7 @@ use std::net::SocketAddr; use std::ops::Deref; use std::pin::Pin; use std::sync::Arc; -use std::task::{ready, Poll}; +use std::task::{Poll, ready}; use std::time::Duration; use axum::Router; @@ -18,7 +18,7 @@ use tokio::net::TcpListener; use tokio::sync::oneshot; use visit_rs::{Visit, VisitFields, Visitor}; -use crate::net::static_server::{ui_router, UiContext}; +use crate::net::static_server::{UiContext, ui_router}; use crate::prelude::*; use crate::util::actor::background::BackgroundJobQueue; use crate::util::io::ReadWriter; diff --git a/core/startos/src/net/wifi.rs b/core/startos/src/net/wifi.rs index 8f4f58091..6d6774998 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>>; diff --git a/core/startos/src/notifications.rs b/core/startos/src/notifications.rs index 1ab569dc7..cbbea5da6 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/registry/context.rs b/core/startos/src/registry/context.rs index 0d50641f1..5da5b2937 100644 --- a/core/startos/src/registry/context.rs +++ b/core/startos/src/registry/context.rs @@ -18,13 +18,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; diff --git a/core/startos/src/registry/device_info.rs b/core/startos/src/registry/device_info.rs index acddf644e..9b76ace68 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/mod.rs b/core/startos/src/registry/mod.rs index e9aacd168..11fe2b807 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/package/get.rs b/core/startos/src/registry/package/get.rs index b242217c4..8f61e51ef 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/s9pk/v2/compat.rs b/core/startos/src/s9pk/v2/compat.rs index 923b07bb3..4e01f8889 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/pack.rs b/core/startos/src/s9pk/v2/pack.rs index 6e8371191..a8fbe6f98 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::{DataUrl, ImageId, PackageId, VersionString}; @@ -18,20 +18,20 @@ use crate::context::CliContext; use crate::dependencies::{DependencyMetadata, MetadataSrc}; 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/effects/callbacks.rs b/core/startos/src/service/effects/callbacks.rs index 8493f8a02..dea736aeb 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/net/ssl.rs b/core/startos/src/service/effects/net/ssl.rs index a39c6a35a..fcd1dac9d 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/mod.rs b/core/startos/src/service/mod.rs index 3c6da0da4..8df13ee9d 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}; diff --git a/core/startos/src/service/service_actor.rs b/core/startos/src/service/service_actor.rs index cdd45c836..4dd99a86e 100644 --- a/core/startos/src/service/service_actor.rs +++ b/core/startos/src/service/service_actor.rs @@ -1,19 +1,19 @@ use std::sync::Arc; use std::time::Duration; -use futures::future::{BoxFuture, Either}; use futures::FutureExt; +use futures::future::{BoxFuture, Either}; 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/system.rs b/core/startos/src/system.rs index 07a44da64..a76ca8641 100644 --- a/core/startos/src/system.rs +++ b/core/startos/src/system.rs @@ -8,7 +8,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 serde::{Deserialize, Deserializer, Serialize, Serializer}; use tokio::process::Command; use tokio::sync::broadcast::Receiver; @@ -21,12 +21,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 { diff --git a/core/startos/src/tunnel/api.rs b/core/startos/src/tunnel/api.rs index 91af3b6d6..de9896932 100644 --- a/core/startos/src/tunnel/api.rs +++ b/core/startos/src/tunnel/api.rs @@ -3,7 +3,7 @@ use std::net::{IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4}; use clap::Parser; use imbl_value::InternedString; use ipnet::Ipv4Net; -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 crate::context::CliContext; @@ -12,7 +12,7 @@ use crate::prelude::*; use crate::tunnel::context::TunnelContext; use crate::tunnel::db::GatewayPort; use crate::tunnel::wg::{ClientConfig, WgConfig, WgSubnetClients, WgSubnetConfig}; -use crate::util::serde::{display_serializable, HandlerExtSerde}; +use crate::util::serde::{HandlerExtSerde, display_serializable}; pub fn tunnel_api() -> ParentHandler { ParentHandler::new() diff --git a/core/startos/src/tunnel/auth.rs b/core/startos/src/tunnel/auth.rs index bcbd1286f..19a93d795 100644 --- a/core/startos/src/tunnel/auth.rs +++ b/core/startos/src/tunnel/auth.rs @@ -3,11 +3,11 @@ use imbl::HashMap; use imbl_value::InternedString; use itertools::Itertools; use patch_db::HasModel; -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::auth::{check_password, Sessions}; +use crate::auth::{Sessions, check_password}; use crate::context::CliContext; use crate::middleware::auth::AuthContext; use crate::middleware::signature::SignatureAuthContext; @@ -16,7 +16,7 @@ use crate::rpc_continuations::OpenAuthedContinuations; use crate::sign::AnyVerifyingKey; use crate::tunnel::context::TunnelContext; use crate::tunnel::db::TunnelDatabase; -use crate::util::serde::{display_serializable, HandlerExtSerde}; +use crate::util::serde::{HandlerExtSerde, display_serializable}; use crate::util::sync::SyncMutex; impl SignatureAuthContext for TunnelContext { diff --git a/core/startos/src/tunnel/context.rs b/core/startos/src/tunnel/context.rs index dbe270c10..1514f7a62 100644 --- a/core/startos/src/tunnel/context.rs +++ b/core/startos/src/tunnel/context.rs @@ -9,6 +9,7 @@ use cookie::{Cookie, Expiration, SameSite}; use http::HeaderMap; use imbl::OrdMap; use imbl_value::InternedString; +use include_dir::Dir; use models::GatewayId; use patch_db::PatchDb; use rpc_toolkit::yajrc::RpcError; @@ -23,18 +24,27 @@ use crate::auth::Sessions; use crate::context::config::ContextConfig; use crate::context::{CliContext, RpcContext}; use crate::db::model::public::NetworkInterfaceInfo; -use crate::middleware::auth::AuthContext; +use crate::else_empty_dir; +use crate::middleware::auth::{Auth, AuthContext}; +use crate::middleware::cors::Cors; use crate::net::forward::PortForwardController; use crate::net::gateway::{IdFilter, InterfaceFilter}; +use crate::net::static_server::UiContext; use crate::prelude::*; use crate::rpc_continuations::{OpenAuthedContinuations, RpcContinuations}; +use crate::tunnel::TUNNEL_DEFAULT_LISTEN; use crate::tunnel::db::{GatewayPort, TunnelDatabase}; use crate::tunnel::wg::WIREGUARD_INTERFACE_NAME; -use crate::tunnel::TUNNEL_DEFAULT_LISTEN; +use crate::util::Invoke; use crate::util::collections::OrdMapIterMut; use crate::util::io::read_file_to_string; use crate::util::sync::{SyncMutex, Watch}; -use crate::util::Invoke; + +#[cfg(all(feature = "tunnel", not(feature = "test")))] +const EMBEDDED_TUNNEL_UI_ROOT: Dir<'_> = + include_dir::include_dir!("$CARGO_MANIFEST_DIR/../../web/dist/static"); +#[cfg(not(all(feature = "tunnel", not(feature = "test"))))] +const EMBEDDED_TUNNEL_UI_ROOT: Dir<'_> = Dir::new("", &[]); #[derive(Debug, Clone, Default, Deserialize, Serialize, Parser)] #[serde(rename_all = "kebab-case")] @@ -295,3 +305,14 @@ impl CallRemote for RpcContext { .await } } + +impl UiContext for TunnelContext { + const UI_DIR: &'static include_dir::Dir<'static> = &else_empty_dir!( + feature = "tunnel" => + include_dir::include_dir!("$CARGO_MANIFEST_DIR/../../web/dist/static/start-tunnel") + ); + + fn middleware(server: rpc_toolkit::Server) -> rpc_toolkit::HttpServer { + server.middleware(Cors::new()).middleware(Auth::new()) + } +} diff --git a/core/startos/src/tunnel/db.rs b/core/startos/src/tunnel/db.rs index 64d20b99d..91f4d54c9 100644 --- a/core/startos/src/tunnel/db.rs +++ b/core/startos/src/tunnel/db.rs @@ -2,16 +2,16 @@ use std::collections::BTreeMap; use std::net::SocketAddrV4; use std::path::PathBuf; -use clap::builder::ValueParserFactory; use clap::Parser; +use clap::builder::ValueParserFactory; use imbl::{HashMap, OrdMap}; use imbl_value::InternedString; use itertools::Itertools; use models::{FromStrParser, GatewayId}; -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; @@ -25,7 +25,7 @@ use crate::tunnel::auth::SignerInfo; use crate::tunnel::context::TunnelContext; use crate::tunnel::web::WebserverInfo; use crate::tunnel::wg::WgServer; -use crate::util::serde::{apply_expr, deserialize_from_str, serialize_display, HandlerExtSerde}; +use crate::util::serde::{HandlerExtSerde, apply_expr, deserialize_from_str, serialize_display}; #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct GatewayPort(pub GatewayId, pub u16); diff --git a/core/startos/src/tunnel/mod.rs b/core/startos/src/tunnel/mod.rs index 97ef93d4f..778a3272a 100644 --- a/core/startos/src/tunnel/mod.rs +++ b/core/startos/src/tunnel/mod.rs @@ -1,13 +1,8 @@ use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4}; use axum::Router; -use futures::future::ready; -use rpc_toolkit::Server; -use crate::middleware::auth::Auth; -use crate::middleware::cors::Cors; -use crate::net::static_server::{bad_request, not_found, server_error}; -use crate::rpc_continuations::Guid; +use crate::net::static_server::ui_router; use crate::tunnel::context::TunnelContext; pub mod api; @@ -24,57 +19,5 @@ pub const TUNNEL_DEFAULT_LISTEN: SocketAddr = SocketAddr::V4(SocketAddrV4::new( )); pub fn tunnel_router(ctx: TunnelContext) -> Router { - use axum::extract as x; - use axum::routing::{any, get}; - Router::new() - .route("/rpc/{*path}", { - let ctx = ctx.clone(); - any( - Server::new(move || ready(Ok(ctx.clone())), api::tunnel_api()) - .middleware(Cors::new()) - .middleware(Auth::new()) - ) - }) - .route( - "/ws/rpc/{*path}", - get({ - let ctx = ctx.clone(); - move |x::Path(path): x::Path, - ws: axum::extract::ws::WebSocketUpgrade| async move { - match Guid::from(&path) { - None => { - tracing::debug!("No Guid Path"); - bad_request() - } - Some(guid) => match ctx.rpc_continuations.get_ws_handler(&guid).await { - Some(cont) => ws.on_upgrade(cont), - _ => not_found(), - }, - } - } - }), - ) - .route( - "/rest/rpc/{*path}", - any({ - let ctx = ctx.clone(); - move |request: x::Request| async move { - let path = request - .uri() - .path() - .strip_prefix("/rest/rpc/") - .unwrap_or_default(); - match Guid::from(&path) { - None => { - tracing::debug!("No Guid Path"); - bad_request() - } - Some(guid) => match ctx.rpc_continuations.get_rest_handler(&guid).await { - None => not_found(), - Some(cont) => cont(request).await.unwrap_or_else(server_error), - }, - } - } - }), - ) + ui_router(ctx) } diff --git a/core/startos/src/tunnel/web.rs b/core/startos/src/tunnel/web.rs index 893c27f69..eb58c544a 100644 --- a/core/startos/src/tunnel/web.rs +++ b/core/startos/src/tunnel/web.rs @@ -4,17 +4,17 @@ use std::net::{IpAddr, Ipv6Addr, SocketAddr}; use std::sync::Arc; use clap::Parser; -use imbl_value::{json, InternedString}; +use imbl_value::{InternedString, json}; use itertools::Itertools; use openssl::pkey::{PKey, Private}; use openssl::x509::X509; -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::io::{AsyncBufReadExt, BufReader}; +use tokio_rustls::rustls::ServerConfig; use tokio_rustls::rustls::crypto::CryptoProvider; use tokio_rustls::rustls::pki_types::{CertificateDer, PrivateKeyDer, PrivatePkcs8KeyDer}; use tokio_rustls::rustls::server::ClientHello; -use tokio_rustls::rustls::ServerConfig; use crate::context::CliContext; use crate::net::ssl::SANInfo; @@ -411,7 +411,9 @@ pub async fn init_web(ctx: CliContext) -> Result<(), Error> { match l.trim().parse() { Ok(addr) => break addr, Err(_) => { - println!("Invalid socket address. Please enter in format IP:PORT (e.g., 0.0.0.0:8443)"); + println!( + "Invalid socket address. Please enter in format IP:PORT (e.g., 0.0.0.0:8443)" + ); readline.clear_history(); } } diff --git a/core/startos/src/tunnel/wg.rs b/core/startos/src/tunnel/wg.rs index 5b19f508c..16374beb4 100644 --- a/core/startos/src/tunnel/wg.rs +++ b/core/startos/src/tunnel/wg.rs @@ -9,9 +9,9 @@ use tokio::process::Command; use x25519_dalek::{PublicKey, StaticSecret}; use crate::prelude::*; +use crate::util::Invoke; use crate::util::io::write_file_atomic; use crate::util::serde::Base64; -use crate::util::Invoke; pub const WIREGUARD_INTERFACE_NAME: &str = "wg-start-tunnel"; 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/io.rs b/core/startos/src/util/io.rs index 8524e9c53..5378f2003 100644 --- a/core/startos/src/util/io.rs +++ b/core/startos/src/util/io.rs @@ -6,8 +6,8 @@ use std::os::unix::prelude::MetadataExt; use std::path::{Path, PathBuf}; use std::pin::Pin; use std::str::FromStr; -use std::sync::atomic::AtomicU64; use std::sync::Arc; +use std::sync::atomic::AtomicU64; use std::task::{Poll, Waker}; use std::time::Duration; @@ -22,8 +22,8 @@ use nix::unistd::{Gid, Uid}; use serde::{Deserialize, Serialize}; use tokio::fs::{File, OpenOptions}; use tokio::io::{ - duplex, AsyncRead, AsyncReadExt, AsyncSeek, AsyncWrite, AsyncWriteExt, DuplexStream, ReadBuf, - SeekFrom, WriteHalf, + AsyncRead, AsyncReadExt, AsyncSeek, AsyncWrite, AsyncWriteExt, DuplexStream, ReadBuf, SeekFrom, + WriteHalf, duplex, }; use tokio::net::TcpStream; use tokio::sync::{Notify, OwnedMutexGuard}; diff --git a/core/startos/src/util/logger.rs b/core/startos/src/util/logger.rs index 9dfc8e412..c2dceed54 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 0a1031d4b..96444af7a 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/squashfs.rs b/core/startos/src/util/squashfs.rs index 803f369b6..f6dfba414 100644 --- a/core/startos/src/util/squashfs.rs +++ b/core/startos/src/util/squashfs.rs @@ -4,7 +4,7 @@ use std::task::Poll; use async_compression::codecs::{Encode, ZstdEncoder}; use async_compression::core::util::PartialBuffer; -use futures::{ready, TryStreamExt}; +use futures::{TryStreamExt, ready}; use tokio::io::{AsyncSeek, AsyncWrite}; use visit_rs::{Visit, VisitAsync, VisitFields, VisitFieldsAsync, Visitor}; diff --git a/core/startos/src/util/sync.rs b/core/startos/src/util/sync.rs index 40f6dcfbf..98b24509d 100644 --- a/core/startos/src/util/sync.rs +++ b/core/startos/src/util/sync.rs @@ -5,8 +5,8 @@ use std::sync::atomic::AtomicUsize; use std::sync::{Arc, Weak}; use std::task::{Poll, Waker}; -use futures::stream::BoxStream; use futures::Stream; +use futures::stream::BoxStream; use crate::prelude::*; diff --git a/core/startos/src/version/mod.rs b/core/startos/src/version/mod.rs index b18bdc993..6f8bae32a 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; 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 ebcd9ae16..d396e0c97 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::{HostId, Id, 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; @@ -31,9 +31,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! { @@ -208,10 +208,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_10.rs b/core/startos/src/version/v0_3_6_alpha_10.rs index 74fe17e89..7b514bbf9 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_7.rs b/core/startos/src/version/v0_3_6_alpha_7.rs index dbecceba1..358ddaa49 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 2fc3f060c..b58d9c9e6 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_4_0_alpha_11.rs b/core/startos/src/version/v0_4_0_alpha_11.rs index 4834ab362..ad078f63b 100644 --- a/core/startos/src/version/v0_4_0_alpha_11.rs +++ b/core/startos/src/version/v0_4_0_alpha_11.rs @@ -1,7 +1,7 @@ use exver::{PreReleaseSegment, VersionRange}; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_4_0_alpha_10, VersionT}; +use super::{VersionT, v0_4_0_alpha_10}; use crate::prelude::*; lazy_static::lazy_static! { diff --git a/core/startos/src/version/v0_4_0_alpha_12.rs b/core/startos/src/version/v0_4_0_alpha_12.rs index 7bbbbb6ee..95b210ce9 100644 --- a/core/startos/src/version/v0_4_0_alpha_12.rs +++ b/core/startos/src/version/v0_4_0_alpha_12.rs @@ -4,7 +4,7 @@ use exver::{PreReleaseSegment, VersionRange}; use imbl_value::InternedString; use super::v0_3_5::V0_3_0_COMPAT; -use super::{v0_4_0_alpha_11, VersionT}; +use super::{VersionT, v0_4_0_alpha_11}; use crate::net::tor::TorSecretKey; use crate::prelude::*; 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 a89902824..55eea5115 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 aa71640f6..a2d006ff3 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 1b5566f7f..e4fb566fb 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 085375fc8..3cdf12694 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 6431c0d66..0e92ba544 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 a79c77104..e23b561a5 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(