Skip to content

Commit 98f31d4

Browse files
committed
wip: start-tunnel
1 parent 24521e3 commit 98f31d4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1429
-816
lines changed

Makefile

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@ PLATFORM_FILE := $(shell ./check-platform.sh)
55
ENVIRONMENT_FILE := $(shell ./check-environment.sh)
66
GIT_HASH_FILE := $(shell ./check-git-hash.sh)
77
VERSION_FILE := $(shell ./check-version.sh)
8-
BASENAME := $(shell ./basename.sh)
8+
BASENAME := $(shell PROJECT=startos ./basename.sh)
99
PLATFORM := $(shell if [ -f ./PLATFORM.txt ]; then cat ./PLATFORM.txt; else echo unknown; fi)
1010
ARCH := $(shell if [ "$(PLATFORM)" = "raspberrypi" ]; then echo aarch64; else echo $(PLATFORM) | sed 's/-nonfree$$//g'; fi)
11+
REGISTRY_BASENAME := $(shell PROJECT=start-registry PLATFORM=$(ARCH) ./basename.sh)
12+
TUNNEL_BASENAME := $(shell PROJECT=start-tunnel PLATFORM=$(ARCH) ./basename.sh)
1113
IMAGE_TYPE=$(shell if [ "$(PLATFORM)" = raspberrypi ]; then echo img; else echo iso; fi)
1214
WEB_UIS := web/dist/raw/ui/index.html web/dist/raw/setup-wizard/index.html web/dist/raw/install-wizard/index.html
1315
COMPRESSED_WEB_UIS := web/dist/static/ui/index.html web/dist/static/setup-wizard/index.html web/dist/static/install-wizard/index.html
1416
FIRMWARE_ROMS := ./firmware/$(PLATFORM) $(shell jq --raw-output '.[] | select(.platform[] | contains("$(PLATFORM)")) | "./firmware/$(PLATFORM)/" + .id + ".rom.gz"' build/lib/firmware.json)
1517
BUILD_SRC := $(call ls-files, build) build/lib/depends build/lib/conflicts $(FIRMWARE_ROMS)
16-
DEBIAN_SRC := $(call ls-files, debian/)
1718
IMAGE_RECIPE_SRC := $(call ls-files, image-recipe/)
1819
STARTD_SRC := core/startos/startd.service $(BUILD_SRC)
1920
CORE_SRC := $(call ls-files, core) $(shell git ls-files --recurse-submodules patch-db) $(GIT_HASH_FILE)
@@ -25,7 +26,7 @@ PATCH_DB_CLIENT_SRC := $(shell git ls-files --recurse-submodules patch-db/client
2526
GZIP_BIN := $(shell which pigz || which gzip)
2627
TAR_BIN := $(shell which gtar || which tar)
2728
COMPILED_TARGETS := core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/startbox core/target/$(ARCH)-unknown-linux-musl/release/containerbox container-runtime/rootfs.$(ARCH).squashfs
28-
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) \
29+
STARTOS_TARGETS := $(STARTD_SRC) $(ENVIRONMENT_FILE) $(GIT_HASH_FILE) $(VERSION_FILE) $(COMPILED_TARGETS) cargo-deps/$(ARCH)-unknown-linux-musl/release/startos-backup-fs $(PLATFORM_FILE) \
2930
$(shell if [ "$(PLATFORM)" = "raspberrypi" ]; then \
3031
echo cargo-deps/aarch64-unknown-linux-musl/release/pi-beep; \
3132
fi) \
@@ -35,6 +36,8 @@ ALL_TARGETS := $(STARTD_SRC) $(ENVIRONMENT_FILE) $(GIT_HASH_FILE) $(VERSION_FILE
3536
$(shell /bin/bash -c 'if [[ "${ENVIRONMENT}" =~ (^|-)console($$|-) ]]; then \
3637
echo cargo-deps/$(ARCH)-unknown-linux-musl/release/tokio-console; \
3738
fi')
39+
REGISTRY_TARGETS := core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/registrybox core/startos/start-registryd.service
40+
TUNNEL_TARGETS := core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/tunnelbox core/startos/start-tunneld.service
3841
REBUILD_TYPES = 1
3942

4043
ifeq ($(REMOTE),)
@@ -58,12 +61,12 @@ endif
5861

5962
.DELETE_ON_ERROR:
6063

61-
.PHONY: all metadata install clean format cli uis ui reflash deb $(IMAGE_TYPE) squashfs wormhole wormhole-deb test test-core test-sdk test-container-runtime registry
64+
.PHONY: all metadata install clean format cli uis ui reflash deb $(IMAGE_TYPE) squashfs wormhole wormhole-deb test test-core test-sdk test-container-runtime registry install-registry tunnel install-tunnel
6265

63-
all: $(ALL_TARGETS)
66+
all: $(STARTOS_TARGETS)
6467

6568
touch:
66-
touch $(ALL_TARGETS)
69+
touch $(STARTOS_TARGETS)
6770

6871
metadata: $(VERSION_FILE) $(PLATFORM_FILE) $(ENVIRONMENT_FILE) $(GIT_HASH_FILE)
6972

@@ -111,20 +114,49 @@ test-container-runtime: container-runtime/node_modules/.package-lock.json $(call
111114
cli:
112115
./core/install-cli.sh
113116

114-
registry:
115-
./core/build-registrybox.sh
117+
registry: core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/registrybox
116118

117-
tunnel:
118-
./core/build-tunnelbox.sh
119+
install-registry: $(REGISTRY_TARGETS)
120+
$(call mkdir,$(DESTDIR)/usr/bin)
121+
$(call cp,core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/registrybox,$(DESTDIR)/usr/bin/start-registrybox)
122+
$(call ln,/usr/bin/start-registrybox,$(DESTDIR)/usr/bin/start-registryd)
123+
$(call ln,/usr/bin/start-registrybox,$(DESTDIR)/usr/bin/start-registry)
119124

120-
deb: results/$(BASENAME).deb
125+
$(call mkdir,$(DESTDIR)/lib/systemd/system)
126+
$(call cp,core/startos/start-registryd.service,$(DESTDIR)/lib/systemd/system/start-registryd.service)
127+
128+
core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/registrybox: $(CORE_SRC) $(ENVIRONMENT_FILE)
129+
ARCH=$(ARCH) PROFILE=$(PROFILE) ./core/build-registrybox.sh
121130

122-
debian/control: build/lib/depends build/lib/conflicts
123-
./debuild/control.sh
131+
tunnel: core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/tunnelbox
132+
133+
install-tunnel: core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/tunnelbox core/startos/start-tunneld.service
134+
$(call mkdir,$(DESTDIR)/usr/bin)
135+
$(call cp,core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/tunnelbox,$(DESTDIR)/usr/bin/start-tunnelbox)
136+
$(call ln,/usr/bin/start-tunnelbox,$(DESTDIR)/usr/bin/start-tunneld)
137+
$(call ln,/usr/bin/start-tunnelbox,$(DESTDIR)/usr/bin/start-tunnel)
138+
139+
$(call mkdir,$(DESTDIR)/lib/systemd/system)
140+
$(call cp,core/startos/start-tunneld.service,$(DESTDIR)/lib/systemd/system/start-tunneld.service)
124141

125-
results/$(BASENAME).deb: dpkg-build.sh $(DEBIAN_SRC) $(ALL_TARGETS)
142+
core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/tunnelbox: $(CORE_SRC) $(ENVIRONMENT_FILE)
143+
ARCH=$(ARCH) PROFILE=$(PROFILE) ./core/build-tunnelbox.sh
144+
145+
deb: results/$(BASENAME).deb
146+
147+
results/$(BASENAME).deb: dpkg-build.sh $(call ls-files,debian/startos) $(STARTOS_TARGETS)
126148
PLATFORM=$(PLATFORM) REQUIRES=debian ./build/os-compat/run-compat.sh ./dpkg-build.sh
127149

150+
registry-deb: results/$(REGISTRY_BASENAME).deb
151+
152+
results/$(REGISTRY_BASENAME).deb: dpkg-build.sh $(call ls-files,debian/start-registry) $(REGISTRY_TARGETS)
153+
PROJECT=start-registry PLATFORM=$(ARCH) REQUIRES=debian ./build/os-compat/run-compat.sh ./dpkg-build.sh
154+
155+
tunnel-deb: results/$(TUNNEL_BASENAME).deb
156+
157+
results/$(TUNNEL_BASENAME).deb: dpkg-build.sh $(call ls-files,debian/start-tunnel) $(TUNNEL_TARGETS)
158+
PROJECT=start-tunnel PLATFORM=$(ARCH) REQUIRES=debian DEPENDS=wireguard-tools,iptables,network-manager ./build/os-compat/run-compat.sh ./dpkg-build.sh
159+
128160
$(IMAGE_TYPE): results/$(BASENAME).$(IMAGE_TYPE)
129161

130162
squashfs: results/$(BASENAME).squashfs
@@ -133,7 +165,7 @@ results/$(BASENAME).$(IMAGE_TYPE) results/$(BASENAME).squashfs: $(IMAGE_RECIPE_S
133165
REQUIRES=debian ./build/os-compat/run-compat.sh ./image-recipe/run-local-build.sh "results/$(BASENAME).deb"
134166

135167
# For creating os images. DO NOT USE
136-
install: $(ALL_TARGETS)
168+
install: $(STARTOS_TARGETS)
137169
$(call mkdir,$(DESTDIR)/usr/bin)
138170
$(call mkdir,$(DESTDIR)/usr/sbin)
139171
$(call cp,core/target/$(ARCH)-unknown-linux-musl/$(PROFILE)/startbox,$(DESTDIR)/usr/bin/startbox)
@@ -165,7 +197,7 @@ install: $(ALL_TARGETS)
165197

166198
$(call cp,firmware/$(PLATFORM),$(DESTDIR)/usr/lib/startos/firmware)
167199

168-
update-overlay: $(ALL_TARGETS)
200+
update-overlay: $(STARTOS_TARGETS)
169201
@echo "\033[33m!!! THIS WILL ONLY REFLASH YOUR DEVICE IN MEMORY !!!\033[0m"
170202
@echo "\033[33mALL CHANGES WILL BE REVERTED IF YOU RESTART THE DEVICE\033[0m"
171203
@if [ -z "$(REMOTE)" ]; then >&2 echo "Must specify REMOTE" && false; fi
@@ -191,7 +223,7 @@ wormhole-squashfs: results/$(BASENAME).squashfs
191223
@echo
192224
@wormhole send results/$(BASENAME).squashfs 2>&1 | awk -Winteractive '/wormhole receive/ { printf "sudo sh -c '"'"'/usr/lib/startos/scripts/prune-images $(SQFS_SIZE) && /usr/lib/startos/scripts/prune-boot && cd /media/startos/images && wormhole receive --accept-file %s && CHECKSUM=$(SQFS_SUM) /usr/lib/startos/scripts/use-img ./$(BASENAME).squashfs'"'"'\n", $$3 }'
193225

194-
update: $(ALL_TARGETS)
226+
update: $(STARTOS_TARGETS)
195227
@if [ -z "$(REMOTE)" ]; then >&2 echo "Must specify REMOTE" && false; fi
196228
$(call ssh,'sudo /usr/lib/startos/scripts/chroot-and-upgrade --create')
197229
$(MAKE) install REMOTE=$(REMOTE) SSHPASS=$(SSHPASS) DESTDIR=/media/startos/next PLATFORM=$(PLATFORM)
@@ -219,7 +251,7 @@ update-squashfs: results/$(BASENAME).squashfs
219251
$(call cp,results/$(BASENAME).squashfs,/media/startos/images/next.rootfs)
220252
$(call ssh,'sudo CHECKSUM=$(SQFS_SUM) /usr/lib/startos/scripts/use-img /media/startos/images/next.rootfs')
221253

222-
emulate-reflash: $(ALL_TARGETS)
254+
emulate-reflash: $(STARTOS_TARGETS)
223255
@if [ -z "$(REMOTE)" ]; then >&2 echo "Must specify REMOTE" && false; fi
224256
$(call ssh,'sudo /usr/lib/startos/scripts/chroot-and-upgrade --create')
225257
$(MAKE) install REMOTE=$(REMOTE) SSHPASS=$(SSHPASS) DESTDIR=/media/startos/next PLATFORM=$(PLATFORM)

basename.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#!/bin/bash
22

3+
PROJECT=${PROJECT:-"startos"}
4+
35
cd "$(dirname "${BASH_SOURCE[0]}")"
46

57
PLATFORM="$(if [ -f ./PLATFORM.txt ]; then cat ./PLATFORM.txt; else echo unknown; fi)"
@@ -16,4 +18,4 @@ if [ -n "$STARTOS_ENV" ]; then
1618
VERSION_FULL="$VERSION_FULL~${STARTOS_ENV}"
1719
fi
1820

19-
echo -n "startos-${VERSION_FULL}_${PLATFORM}"
21+
echo -n "${PROJECT}-${VERSION_FULL}_${PLATFORM}"

build/os-compat/run-compat.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ if [ "$FORCE_COMPAT" = 1 ] || ( [ "$REQUIRES" = "linux" ] && [ "$(uname -s)" !=
1818

1919
docker run -d --rm --name os-compat --privileged --security-opt apparmor=unconfined -v "${project_pwd}:/root/start-os" -v /lib/modules:/lib/modules:ro start9/build-env
2020
while ! docker exec os-compat systemctl is-active --quiet multi-user.target 2> /dev/null; do sleep .5; done
21-
docker exec -eARCH -eENVIRONMENT -ePLATFORM -eGIT_BRANCH_AS_HASH $USE_TTY -w "/root/start-os${rel_pwd}" os-compat $@
21+
docker exec -eARCH -eENVIRONMENT -ePLATFORM -eGIT_BRANCH_AS_HASH -ePROJECT -eDEPENDS -eCONFLICTS $USE_TTY -w "/root/start-os${rel_pwd}" os-compat $@
2222
code=$?
2323
docker stop os-compat
2424
exit $code

core/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/startos/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ unix-named-pipe = "0.2.0"
259259
url = { version = "2.4.1", features = ["serde"] }
260260
urlencoding = "2.1.3"
261261
uuid = { version = "1.4.1", features = ["v4"] }
262+
x25519-dalek = "2.0.1"
262263
zbus = "5.1.1"
263264
zeroize = "1.6.0"
264265
mail-send = { git = "https://github.com/dr-bonez/mail-send.git", branch = "main", optional = true }

core/startos/src/account.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use openssl::pkey::{PKey, Private};
55
use openssl::x509::X509;
66

77
use crate::db::model::DatabaseModel;
8-
use crate::hostname::{Hostname, generate_hostname, generate_id};
8+
use crate::hostname::{generate_hostname, generate_id, Hostname};
99
use crate::net::ssl::{generate_key, make_root_cert};
1010
use crate::net::tor::TorSecretKey;
1111
use crate::prelude::*;
@@ -107,6 +107,7 @@ impl AccountInfo {
107107
.map(|tor_key| tor_key.onion_address())
108108
.collect(),
109109
)?;
110+
server_info.as_password_hash_mut().ser(&self.password)?;
110111
db.as_private_mut().as_password_mut().ser(&self.password)?;
111112
db.as_private_mut()
112113
.as_ssh_privkey_mut()

core/startos/src/auth.rs

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ use std::collections::BTreeMap;
33
use chrono::{DateTime, Utc};
44
use clap::Parser;
55
use color_eyre::eyre::eyre;
6-
use imbl_value::{InternedString, json};
6+
use imbl_value::{json, InternedString};
77
use itertools::Itertools;
88
use josekit::jwk::Jwk;
99
use rpc_toolkit::yajrc::RpcError;
10-
use rpc_toolkit::{CallRemote, Context, HandlerArgs, HandlerExt, ParentHandler, from_fn_async};
10+
use rpc_toolkit::{from_fn_async, CallRemote, Context, HandlerArgs, HandlerExt, ParentHandler};
1111
use serde::{Deserialize, Serialize};
1212
use tokio::io::AsyncWriteExt;
1313
use tracing::instrument;
@@ -20,8 +20,8 @@ use crate::middleware::auth::{
2020
use crate::prelude::*;
2121
use crate::util::crypto::EncryptedWire;
2222
use crate::util::io::create_file_mod;
23-
use crate::util::serde::{HandlerExtSerde, WithIoFormat, display_serializable};
24-
use crate::{Error, ResultExt, ensure_code};
23+
use crate::util::serde::{display_serializable, HandlerExtSerde, WithIoFormat};
24+
use crate::{ensure_code, Error, ResultExt};
2525

2626
#[derive(Debug, Clone, Default, Deserialize, Serialize, TS)]
2727
pub struct Sessions(pub BTreeMap<InternedString, Session>);
@@ -220,7 +220,7 @@ pub fn check_password(hash: &str, password: &str) -> Result<(), Error> {
220220
pub struct LoginParams {
221221
password: String,
222222
#[ts(skip)]
223-
#[serde(rename = "__auth_userAgent")] // from Auth middleware
223+
#[serde(rename = "__Auth_userAgent")] // from Auth middleware
224224
user_agent: Option<String>,
225225
#[serde(default)]
226226
ephemeral: bool,
@@ -279,7 +279,7 @@ pub async fn login_impl<C: AuthContext>(
279279
#[command(rename_all = "kebab-case")]
280280
pub struct LogoutParams {
281281
#[ts(skip)]
282-
#[serde(rename = "__auth_session")] // from Auth middleware
282+
#[serde(rename = "__Auth_session")] // from Auth middleware
283283
session: InternedString,
284284
}
285285

@@ -373,7 +373,7 @@ fn display_sessions(params: WithIoFormat<ListParams>, arg: SessionList) -> Resul
373373
pub struct ListParams {
374374
#[arg(skip)]
375375
#[ts(skip)]
376-
#[serde(rename = "__auth_session")] // from Auth middleware
376+
#[serde(rename = "__Auth_session")] // from Auth middleware
377377
session: Option<InternedString>,
378378
}
379379

@@ -474,30 +474,19 @@ pub async fn reset_password_impl(
474474
let old_password = old_password.unwrap_or_default().decrypt(&ctx)?;
475475
let new_password = new_password.unwrap_or_default().decrypt(&ctx)?;
476476

477-
let mut account = ctx.account.write().await;
478-
if !argon2::verify_encoded(&account.password, old_password.as_bytes())
479-
.with_kind(crate::ErrorKind::IncorrectPassword)?
480-
{
481-
return Err(Error::new(
482-
eyre!("Incorrect Password"),
483-
crate::ErrorKind::IncorrectPassword,
484-
));
485-
}
486-
account.set_password(&new_password)?;
487-
let account_password = &account.password;
488-
let account = account.clone();
489-
ctx.db
490-
.mutate(|d| {
491-
d.as_public_mut()
492-
.as_server_info_mut()
493-
.as_password_hash_mut()
494-
.ser(account_password)?;
495-
account.save(d)?;
496-
497-
Ok(())
498-
})
499-
.await
500-
.result
477+
let account = ctx.account.mutate(|account| {
478+
if !argon2::verify_encoded(&account.password, old_password.as_bytes())
479+
.with_kind(crate::ErrorKind::IncorrectPassword)?
480+
{
481+
return Err(Error::new(
482+
eyre!("Incorrect Password"),
483+
crate::ErrorKind::IncorrectPassword,
484+
));
485+
}
486+
account.set_password(&new_password)?;
487+
Ok(account.clone())
488+
})?;
489+
ctx.db.mutate(|d| account.save(d)).await.result
501490
}
502491

503492
#[instrument(skip_all)]

core/startos/src/backup/backup_bulk.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use tokio::io::AsyncWriteExt;
1313
use tracing::instrument;
1414
use ts_rs::TS;
1515

16-
use super::PackageBackupReport;
1716
use super::target::{BackupTargetId, PackageBackupInfo};
17+
use super::PackageBackupReport;
1818
use crate::backup::os::OsBackup;
1919
use crate::backup::{BackupReport, ServerBackupReport};
2020
use crate::context::RpcContext;
@@ -24,7 +24,7 @@ use crate::disk::mount::backup::BackupMountGuard;
2424
use crate::disk::mount::filesystem::ReadWrite;
2525
use crate::disk::mount::guard::{GenericMountGuard, TmpMountGuard};
2626
use crate::middleware::auth::AuthContext;
27-
use crate::notifications::{NotificationLevel, notify};
27+
use crate::notifications::{notify, NotificationLevel};
2828
use crate::prelude::*;
2929
use crate::util::io::dir_copy;
3030
use crate::util::serde::IoFormat;
@@ -317,7 +317,7 @@ async fn perform_backup(
317317
.with_kind(ErrorKind::Filesystem)?;
318318
os_backup_file
319319
.write_all(&IoFormat::Json.to_vec(&OsBackup {
320-
account: ctx.account.read().await.clone(),
320+
account: ctx.account.peek(|a| a.clone()),
321321
ui,
322322
})?)
323323
.await?;
@@ -342,7 +342,7 @@ async fn perform_backup(
342342
let timestamp = Utc::now();
343343

344344
backup_guard.unencrypted_metadata.version = crate::version::Current::default().semver().into();
345-
backup_guard.unencrypted_metadata.hostname = ctx.account.read().await.hostname.clone();
345+
backup_guard.unencrypted_metadata.hostname = ctx.account.peek(|a| a.hostname.clone());
346346
backup_guard.unencrypted_metadata.timestamp = timestamp.clone();
347347
backup_guard.metadata.version = crate::version::Current::default().semver().into();
348348
backup_guard.metadata.timestamp = Some(timestamp);

core/startos/src/bins/start_cli.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use std::ffi::OsString;
33
use rpc_toolkit::CliApp;
44
use serde_json::Value;
55

6-
use crate::context::CliContext;
76
use crate::context::config::ClientConfig;
7+
use crate::context::CliContext;
88
use crate::util::logger::LOGGER;
99
use crate::version::{Current, VersionT};
1010

@@ -17,7 +17,7 @@ pub fn main(args: impl IntoIterator<Item = OsString>) {
1717

1818
if let Err(e) = CliApp::new(
1919
|cfg: ClientConfig| Ok(CliContext::init(cfg.load()?)?),
20-
crate::expanded_api(),
20+
crate::main_api(),
2121
)
2222
.run(args)
2323
{

0 commit comments

Comments
 (0)