Feature/consolidate setup (#3092)

* start consolidating

* add start-cli flash-os

* combine install and setup and refactor all

* use http

* undo mock

* fix translation

* translations

* use dialogservice wrapper

* better ST messaging on setup

* only warn on update if breakages (#3097)

* finish setup wizard and ui language-keyboard feature

* fix typo

* wip: localization

* remove start-tunnel readme

* switch to posix strings for language internal

* revert mock

* translate backend strings

* fix missing about text

* help text for args

* feat: add "Add new gateway" option (#3098)

* feat: add "Add new gateway" option

* Update web/projects/ui/src/app/routes/portal/components/form/controls/select.component.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add translation

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Matt Hill <mattnine@protonmail.com>

* fix dns selection

* keyboard keymap also

* ability to shutdown after install

* revert mock

* working setup flow + manifest localization

* (mostly) redundant localization on frontend

* version bump

* omit live medium from disk list and better space management

* ignore missing package archive on 035 migration

* fix device migration

* add i18n helper to sdk

* fix install over 0.3.5.1

* fix grub config

---------

Co-authored-by: Matt Hill <mattnine@protonmail.com>
Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com>
Co-authored-by: Alex Inkin <alexander@inkin.ru>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Aiden McClelland
2026-01-27 14:44:41 -08:00
committed by GitHub
parent 99871805bd
commit c65db31fd9
251 changed files with 12163 additions and 3966 deletions

View File

@@ -141,7 +141,7 @@ async fn add_asset(
.mutate(|s| {
if s.commitment != commitment {
Err(Error::new(
eyre!("commitment does not match"),
eyre!("{}", t!("registry.os.asset.commitment-mismatch")),
ErrorKind::InvalidSignature,
))
} else {
@@ -154,7 +154,7 @@ async fn add_asset(
})?;
Ok(())
} else {
Err(Error::new(eyre!("UNAUTHORIZED"), ErrorKind::Authorization))
Err(Error::new(eyre!("{}", t!("registry.os.asset.unauthorized")), ErrorKind::Authorization))
}
})
.await
@@ -179,11 +179,13 @@ pub async fn add_squashfs(ctx: RegistryContext, params: AddAssetParams) -> Resul
#[command(rename_all = "kebab-case")]
#[serde(rename_all = "camelCase")]
pub struct CliAddAssetParams {
#[arg(short = 'p', long = "platform")]
#[arg(short = 'p', long = "platform", help = "help.arg.platform")]
pub platform: InternedString,
#[arg(short = 'v', long = "version")]
#[arg(short = 'v', long = "version", help = "help.arg.os-version")]
pub version: Version,
#[arg(help = "help.arg.asset-file-path")]
pub file: PathBuf,
#[arg(help = "help.arg.asset-url")]
pub url: Url,
}
@@ -208,7 +210,7 @@ pub async fn cli_add_asset(
Some("squashfs") => "squashfs",
_ => {
return Err(Error::new(
eyre!("Unknown extension"),
eyre!("{}", t!("registry.os.asset.unknown-extension")),
ErrorKind::InvalidRequest,
));
}
@@ -232,7 +234,7 @@ pub async fn cli_add_asset(
let size = file
.size()
.await
.ok_or_else(|| Error::new(eyre!("failed to read file metadata"), ErrorKind::Filesystem))?;
.ok_or_else(|| Error::new(eyre!("{}", t!("registry.os.asset.failed-read-metadata")), ErrorKind::Filesystem))?;
let commitment = Blake3Commitment {
hash: Base64(*blake3.as_bytes()),
size,
@@ -334,7 +336,7 @@ async fn remove_asset(
.remove(&platform)?;
Ok(())
} else {
Err(Error::new(eyre!("UNAUTHORIZED"), ErrorKind::Authorization))
Err(Error::new(eyre!("{}", t!("registry.os.asset.unauthorized")), ErrorKind::Authorization))
}
})
.await

View File

@@ -34,7 +34,7 @@ pub fn get_api<C: Context>() -> ParentHandler<C> {
"iso",
from_fn_async(cli_get_os_asset)
.no_display()
.with_about("Download iso"),
.with_about("about.download-iso"),
)
.subcommand(
"img",
@@ -46,7 +46,7 @@ pub fn get_api<C: Context>() -> ParentHandler<C> {
"img",
from_fn_async(cli_get_os_asset)
.no_display()
.with_about("Download img"),
.with_about("about.download-img"),
)
.subcommand(
"squashfs",
@@ -58,7 +58,7 @@ pub fn get_api<C: Context>() -> ParentHandler<C> {
"squashfs",
from_fn_async(cli_get_os_asset)
.no_display()
.with_about("Download squashfs"),
.with_about("about.download-squashfs"),
)
}
@@ -121,18 +121,20 @@ pub async fn get_squashfs(
#[command(rename_all = "kebab-case")]
#[serde(rename_all = "camelCase")]
pub struct CliGetOsAssetParams {
#[arg(help = "help.arg.os-version")]
pub version: Version,
#[arg(help = "help.arg.platform")]
pub platform: InternedString,
#[arg(
long = "download",
short = 'd',
help = "The path of the directory to download to"
help = "help.arg.download-directory"
)]
pub download: Option<PathBuf>,
#[arg(
long = "reverify",
short = 'r',
help = "verify the hash of the file a second time after download"
help = "help.arg.reverify-hash"
)]
pub reverify: bool,
}

View File

@@ -11,7 +11,7 @@ pub fn asset_api<C: Context>() -> ParentHandler<C> {
"add",
from_fn_async(add::cli_add_asset)
.no_display()
.with_about("Add asset to registry"),
.with_about("about.add-asset-registry"),
)
.subcommand("remove", add::remove_api::<C>())
.subcommand("sign", sign::sign_api::<C>())
@@ -19,10 +19,10 @@ pub fn asset_api<C: Context>() -> ParentHandler<C> {
"sign",
from_fn_async(sign::cli_sign_asset)
.no_display()
.with_about("Sign file and add to registry index"),
.with_about("about.sign-file-add-registry"),
)
.subcommand(
"get",
get::get_api::<C>().with_about("Commands to download image, iso, or squashfs files"),
get::get_api::<C>().with_about("about.commands-download-assets"),
)
}

View File

@@ -89,7 +89,7 @@ async fn sign_asset(
.contains(&guid)
{
return Err(Error::new(
eyre!("signer {guid} is not authorized"),
eyre!("{}", t!("registry.os.asset.signer-not-authorized", guid = guid)),
ErrorKind::Authorization,
));
}
@@ -136,10 +136,11 @@ pub async fn sign_squashfs(ctx: RegistryContext, params: SignAssetParams) -> Res
#[command(rename_all = "kebab-case")]
#[serde(rename_all = "camelCase")]
pub struct CliSignAssetParams {
#[arg(short = 'p', long = "platform")]
#[arg(short = 'p', long = "platform", help = "help.arg.platform")]
pub platform: InternedString,
#[arg(short = 'v', long = "version")]
#[arg(short = 'v', long = "version", help = "help.arg.os-version")]
pub version: Version,
#[arg(help = "help.arg.asset-file-path")]
pub file: PathBuf,
}
@@ -163,7 +164,7 @@ pub async fn cli_sign_asset(
Some("squashfs") => "squashfs",
_ => {
return Err(Error::new(
eyre!("Unknown extension"),
eyre!("{}", t!("registry.os.asset.unknown-extension")),
ErrorKind::InvalidRequest,
));
}
@@ -186,7 +187,7 @@ pub async fn cli_sign_asset(
let size = file
.size()
.await
.ok_or_else(|| Error::new(eyre!("failed to read file metadata"), ErrorKind::Filesystem))?;
.ok_or_else(|| Error::new(eyre!("{}", t!("registry.os.asset.failed-read-metadata")), ErrorKind::Filesystem))?;
let commitment = Blake3Commitment {
hash: Base64(*blake3.as_bytes()),
size,

View File

@@ -17,16 +17,16 @@ pub fn os_api<C: Context>() -> ParentHandler<C> {
from_fn_async(index::get_os_index)
.with_metadata("authenticated", Value::Bool(false))
.with_display_serializable()
.with_about("List index of OS versions")
.with_about("about.list-os-versions-index")
.with_call_remote::<CliContext>(),
)
.subcommand(
"asset",
asset::asset_api::<C>().with_about("Commands to add, sign, or get registry assets"),
asset::asset_api::<C>().with_about("about.commands-add-sign-get-assets"),
)
.subcommand(
"version",
version::version_api::<C>()
.with_about("Commands to add, remove, or list versions or version signers"),
.with_about("about.commands-add-remove-list-versions"),
)
}

View File

@@ -27,7 +27,7 @@ pub fn version_api<C: Context>() -> ParentHandler<C> {
.with_metadata("admin", Value::Bool(true))
.with_metadata("get_signer", Value::Bool(true))
.no_display()
.with_about("Add OS version")
.with_about("about.add-os-version")
.with_call_remote::<CliContext>(),
)
.subcommand(
@@ -35,12 +35,12 @@ pub fn version_api<C: Context>() -> ParentHandler<C> {
from_fn_async(remove_version)
.with_metadata("admin", Value::Bool(true))
.no_display()
.with_about("Remove OS version")
.with_about("about.remove-os-version")
.with_call_remote::<CliContext>(),
)
.subcommand(
"signer",
signer::signer_api::<C>().with_about("Add, remove, and list version signers"),
signer::signer_api::<C>().with_about("about.add-remove-list-version-signers"),
)
.subcommand(
"get",
@@ -51,7 +51,7 @@ pub fn version_api<C: Context>() -> ParentHandler<C> {
.with_custom_display_fn(|handle, result| {
display_version_info(handle.params, result)
})
.with_about("Get OS versions and related version info")
.with_about("about.get-os-versions-info")
.with_call_remote::<CliContext>(),
)
}
@@ -62,10 +62,14 @@ pub fn version_api<C: Context>() -> ParentHandler<C> {
#[ts(export)]
pub struct AddVersionParams {
#[ts(type = "string")]
#[arg(help = "help.arg.os-version")]
pub version: Version,
#[arg(help = "help.arg.version-headline")]
pub headline: String,
#[arg(help = "help.arg.release-notes")]
pub release_notes: String,
#[ts(type = "string")]
#[arg(help = "help.arg.source-version-range")]
pub source_version: VersionRange,
#[arg(skip)]
#[ts(skip)]
@@ -110,6 +114,7 @@ pub async fn add_version(
#[ts(export)]
pub struct RemoveVersionParams {
#[ts(type = "string")]
#[arg(help = "help.arg.os-version")]
pub version: Version,
}
@@ -135,15 +140,15 @@ pub async fn remove_version(
#[ts(export)]
pub struct GetOsVersionParams {
#[ts(type = "string | null")]
#[arg(long = "src")]
#[arg(long = "src", help = "help.arg.source-version")]
pub source_version: Option<Version>,
#[ts(type = "string | null")]
#[arg(long)]
#[arg(long, help = "help.arg.target-version-range")]
pub target_version: Option<VersionRange>,
#[arg(long = "id")]
#[arg(long = "id", help = "help.arg.server-id")]
server_id: Option<String>,
#[ts(type = "string | null")]
#[arg(long)]
#[arg(long, help = "help.arg.platform")]
platform: Option<InternedString>,
#[ts(skip)]
#[arg(skip)]

View File

@@ -21,7 +21,7 @@ pub fn signer_api<C: Context>() -> ParentHandler<C> {
from_fn_async(add_version_signer)
.with_metadata("admin", Value::Bool(true))
.no_display()
.with_about("Add version signer")
.with_about("about.add-version-signer")
.with_call_remote::<CliContext>(),
)
.subcommand(
@@ -29,7 +29,7 @@ pub fn signer_api<C: Context>() -> ParentHandler<C> {
from_fn_async(remove_version_signer)
.with_metadata("admin", Value::Bool(true))
.no_display()
.with_about("Remove version signer")
.with_about("about.remove-version-signer")
.with_call_remote::<CliContext>(),
)
.subcommand(
@@ -38,7 +38,7 @@ pub fn signer_api<C: Context>() -> ParentHandler<C> {
.with_metadata("authenticated", Value::Bool(false))
.with_display_serializable()
.with_custom_display_fn(|handle, result| display_signers(handle.params, result))
.with_about("List version signers and related signer info")
.with_about("about.list-version-signers")
.with_call_remote::<CliContext>(),
)
}
@@ -95,7 +95,7 @@ pub async fn remove_version_signer(
.mutate(|s| Ok(s.remove(&signer)))?
{
return Err(Error::new(
eyre!("signer {signer} is not authorized to sign for v{version}"),
eyre!("{}", t!("registry.os.version.signer-not-authorized", signer = signer, version = version)),
ErrorKind::NotFound,
));
}