Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions projects/start-cli/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ or the CLI's externally observable behavior.

### Added

- **`server epp` shows or sets the CPU energy/performance preference.** The setting persists
across reboots and reports the values available on the server.

- **`s9pk pack` packs the package's `README.md`.** It sits beside `instructions.md` in the
archive and is readable with `S9pk::readme()`. The point is what runs on the server: an AI
assistant administering a service can now read the package's technical reference from the
Expand All @@ -30,6 +33,9 @@ or the CLI's externally observable behavior.

### Changed

- **`server governor` replaces `server experimental governor`.** Scripts that set or inspect
the CPU governor need to use the direct `server` subcommand.

- **`server set-hostname` takes one required hostname, and `setup execute` no
longer takes `--name`.** A StartOS server carries a single name — its `.local`
hostname — where it used to carry a separate display label as well. Setting it
Expand Down
19 changes: 19 additions & 0 deletions projects/start-cli/man/start-cli-server-epp.1
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH start-cli-server-epp 1 "epp "
.SH NAME
start\-cli\-server\-epp \- Show CPU energy performance preferences
.SH SYNOPSIS
\fBstart\-cli server epp\fR [\fB\-\-format\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fISET\fR]
.SH DESCRIPTION
Show CPU energy performance preferences
.SH OPTIONS
.TP
\fB\-\-format\fR

.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fISET\fR]
CPU energy performance preference
19 changes: 0 additions & 19 deletions projects/start-cli/man/start-cli-server-experimental-governor.1

This file was deleted.

7 changes: 2 additions & 5 deletions projects/start-cli/man/start-cli-server-experimental.1
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,16 @@
.el .ds Aq '
.TH start-cli-server-experimental 1 "experimental "
.SH NAME
start\-cli\-server\-experimental \- Commands related to configuring experimental options such as zram and cpu governor
start\-cli\-server\-experimental \- Commands related to configuring experimental options
.SH SYNOPSIS
\fBstart\-cli server experimental\fR [\fB\-h\fR|\fB\-\-help\fR] <\fIsubcommands\fR>
.SH DESCRIPTION
Commands related to configuring experimental options such as zram and cpu governor
Commands related to configuring experimental options
.SH OPTIONS
.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.SH SUBCOMMANDS
.TP
start\-cli\-server\-experimental\-governor(1)
Show CPU governors
.TP
start\-cli\-server\-experimental\-zram(1)
Enable ZRAM
19 changes: 19 additions & 0 deletions projects/start-cli/man/start-cli-server-governor.1
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.TH start-cli-server-governor 1 "governor "
.SH NAME
start\-cli\-server\-governor \- Show CPU governors
.SH SYNOPSIS
\fBstart\-cli server governor\fR [\fB\-\-format\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fISET\fR]
.SH DESCRIPTION
Show CPU governors
.SH OPTIONS
.TP
\fB\-\-format\fR

.TP
\fB\-h\fR, \fB\-\-help\fR
Print help
.TP
[\fISET\fR]
CPU governor name
8 changes: 7 additions & 1 deletion projects/start-cli/man/start-cli-server.1
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,14 @@ Remove system smtp server and credentials
start\-cli\-server\-device\-info(1)
Display device information
.TP
start\-cli\-server\-epp(1)
Show CPU energy performance preferences
.TP
start\-cli\-server\-experimental(1)
Commands related to configuring experimental options such as zram and cpu governor
Commands related to configuring experimental options
.TP
start\-cli\-server\-governor(1)
Show CPU governors
.TP
start\-cli\-server\-host(1)
Commands for modifying the host for the system ui
Expand Down
9 changes: 9 additions & 0 deletions projects/start-os/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ file tracks notable changes since the move to the monorepo.
one's name. See
[Alternative Registries](https://docs.start9.com/start-os/alternative-registries.html).

- **`start-cli server epp` shows and sets the CPU's
energy/performance preference**, persisted across reboots the way the governor
is. On Librem Mini v2 systems without a saved preference, StartOS applies
`balance_power` when available. Without a saved preference, all other systems
retain their current value.

- **A service can permanently retire a network host or a port it no longer
uses, and the port numbers it held become available again.** A service that
reorganizes its interfaces across an update — renaming a host, dropping a
Expand Down Expand Up @@ -159,6 +165,9 @@ file tracks notable changes since the move to the monorepo.
its public address directly, or that is reached over StartTunnel, is
unaffected. See [Public IP](https://docs.start9.com/start-os/public-ip.html).

- **`--format json` on `start-cli server governor` and
`start-cli ssh list` returns the result** it was asked for.

- **A downgrade to a version that cannot take over the service's data is refused
before anything is downloaded or stopped**, with an explanation of what to do
instead.
Expand Down
9 changes: 8 additions & 1 deletion projects/start-os/docs/src/cli-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,12 +147,19 @@ Set the keyboard layout.

Set the Echo IP service URLs used for external IP detection.

### `start-cli server experimental governor [SET]`
### `start-cli server governor [SET]`

View or set the CPU governor (e.g., `performance`, `powersave`).

- `--format` — Output format

### `start-cli server epp [SET]`

View or set the CPU energy/performance preference. StartOS applies `balance_power`
on Librem Mini v2 systems when no preference is saved and the setting is available.

- `--format` — Output format

### `start-cli server experimental zram`

Enable or disable ZRAM compressed swap.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,7 @@ export const mockPatchData: DataModel = {
echoipUrls: ['https://ipconfig.me', 'https://ifconfig.co'],
zram: true,
governor: 'performance',
epp: 'balance_power',
ram: 8 * 1024 * 1024 * 1024,
devices: [],
kiosk: true,
Expand Down
45 changes: 40 additions & 5 deletions shared-libs/crates/start-core/locales/i18n.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,13 @@ setup.password-required:
pl_PL: "Hasło jest wymagane do nowej konfiguracji"

# system.rs
system.epp-not-available:
en_US: "Energy performance preference %{epp} not available"
de_DE: "Energie-Leistungs-Präferenz %{epp} nicht verfügbar"
es_ES: "La preferencia de energía/rendimiento %{epp} no está disponible"
fr_FR: "La préférence énergie/performance %{epp} n'est pas disponible"
pl_PL: "Preferencja energii/wydajności %{epp} nie jest dostępna"

system.governor-not-available:
en_US: "Governor %{governor} not available"
de_DE: "Governor %{governor} nicht verfügbar"
Expand Down Expand Up @@ -1408,13 +1415,27 @@ init.error-running-script:
fr_FR: "Erreur lors de l'exécution de %{script} : %{error}"
pl_PL: "Błąd uruchamiania %{script}: %{error}"

init.cpu-epp-not-available:
en_US: 'CPU Energy Performance Preference "%{epp}" Not Available'
de_DE: 'CPU-Energie-Leistungs-Präferenz "%{epp}" nicht verfügbar'
es_ES: 'Preferencia de energía/rendimiento de CPU "%{epp}" no disponible'
fr_FR: 'Préférence énergie/performance CPU "%{epp}" non disponible'
pl_PL: 'Preferencja energii/wydajności CPU "%{epp}" niedostępna'

init.cpu-governor-not-available:
en_US: 'CPU Governor "%{governor}" Not Available'
de_DE: 'CPU-Governor "%{governor}" nicht verfügbar'
es_ES: 'CPU Governor "%{governor}" no disponible'
fr_FR: 'Gouverneur CPU "%{governor}" non disponible'
pl_PL: 'Governor CPU "%{governor}" niedostępny'

init.setting-cpu-epp:
en_US: 'Setting CPU Energy Performance Preference to "%{epp}"'
de_DE: 'Setze CPU-Energie-Leistungs-Präferenz auf "%{epp}"'
es_ES: 'Configurando la preferencia de energía/rendimiento de CPU a "%{epp}"'
fr_FR: 'Configuration de la préférence énergie/performance CPU à "%{epp}"'
pl_PL: 'Ustawianie preferencji energii/wydajności CPU na "%{epp}"'

init.setting-cpu-governor:
en_US: 'Setting CPU Governor to "%{governor}"'
de_DE: 'Setze CPU-Governor auf "%{governor}"'
Expand Down Expand Up @@ -3404,6 +3425,13 @@ help.arg.event-id:
fr_FR: "Identifiant unique de l'événement"
pl_PL: "Unikalny identyfikator zdarzenia"

help.arg.epp-name:
en_US: "CPU energy performance preference"
de_DE: "CPU-Energie-Leistungs-Präferenz"
es_ES: "Preferencia de energía/rendimiento de CPU"
fr_FR: "Préférence énergie/performance du CPU"
pl_PL: "Preferencja energii/wydajności CPU"

help.arg.except-actions:
en_US: "Action IDs to exclude"
de_DE: "Auszuschließende Aktions-IDs"
Expand Down Expand Up @@ -5026,11 +5054,11 @@ about.command-set-country:
pl_PL: "Polecenie ustawienia kraju"

about.commands-experimental:
en_US: "Commands related to configuring experimental options such as zram and cpu governor"
de_DE: "Befehle zur Konfiguration experimenteller Optionen wie zram und CPU-Governor"
es_ES: "Comandos relacionados con la configuración de opciones experimentales como zram y gobernador de CPU"
fr_FR: "Commandes liées à la configuration d'options expérimentales comme zram et le gouverneur CPU"
pl_PL: "Polecenia konfiguracji opcji eksperymentalnych jak zram i regulator CPU"
en_US: "Commands related to configuring experimental options"
de_DE: "Befehle zur Konfiguration experimenteller Optionen"
es_ES: "Comandos relacionados con la configuración de opciones experimentales"
fr_FR: "Commandes liées à la configuration d'options expérimentales"
pl_PL: "Polecenia konfiguracji opcji eksperymentalnych"

about.commands-host-address-domain:
en_US: "Commands for managing host address domains"
Expand Down Expand Up @@ -6567,6 +6595,13 @@ about.setup-status:
fr_FR: "Afficher l'état actuel de l'assistant d'installation"
pl_PL: "Wyświetl obecny stan kreatora konfiguracji"

about.show-cpu-epp:
en_US: "Show CPU energy performance preferences"
de_DE: "CPU-Energie-Leistungs-Präferenzen anzeigen"
es_ES: "Mostrar preferencias de energía/rendimiento de CPU"
fr_FR: "Afficher les préférences énergie/performance du CPU"
pl_PL: "Pokaż preferencje energii/wydajności CPU"

about.show-cpu-governors:
en_US: "Show CPU governors"
de_DE: "CPU-Governors anzeigen"
Expand Down
5 changes: 4 additions & 1 deletion shared-libs/crates/start-core/src/db/model/public.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ use crate::net::vhost::{AlpnInfo, PassthroughInfo};
use crate::prelude::*;
use crate::progress::FullProgress;
use crate::system::{KeyboardOptions, SmtpValue};
use crate::util::cpupower::Governor;
use crate::util::cpupower::{Epp, Governor};
use crate::util::lshw::LshwDevice;
use crate::util::serde::MaybeUtf8String;
use crate::version::{Current, VersionT};
Expand Down Expand Up @@ -146,6 +146,7 @@ impl Public {
ntp_synced: false,
zram: true,
governor: None,
epp: None,
smtp: None,
echoip_urls: default_echoip_urls(),
ram: 0,
Expand Down Expand Up @@ -197,6 +198,8 @@ pub struct ServerInfo {
#[serde(default)]
pub zram: bool,
pub governor: Option<Governor>,
#[serde(default)]
pub epp: Option<Epp>,
pub smtp: Option<SmtpValue>,
#[serde(default = "default_echoip_urls")]
#[ts(type = "string[]")]
Expand Down
12 changes: 8 additions & 4 deletions shared-libs/crates/start-core/src/firmware.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,17 +49,21 @@ pub fn display_firmware_update_result(result: RequiresReboot) {
}
}

#[instrument]
pub async fn check_for_firmware_update() -> Result<Option<Firmware>, Error> {
let system_product_name = String::from_utf8(
pub(crate) async fn system_product_name() -> Result<String, Error> {
Ok(String::from_utf8(
Command::new("dmidecode")
.arg("-s")
.arg("system-product-name")
.invoke(ErrorKind::Firmware)
.await?,
)?
.trim()
.to_owned();
.to_owned())
}

#[instrument]
pub async fn check_for_firmware_update() -> Result<Option<Firmware>, Error> {
let system_product_name = system_product_name().await?;
let bios_version = String::from_utf8(
Command::new("dmidecode")
.arg("-s")
Expand Down
39 changes: 29 additions & 10 deletions shared-libs/crates/start-core/src/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -314,25 +314,44 @@ pub async fn init(
let server_info = db.peek().await.into_public().into_server_info();
set_governor.start();
let selected_governor = server_info.as_governor().de()?;
let governor = if let Some(governor) = &selected_governor {
if cpupower::get_available_governors()
.await?
.contains(governor)
{
Some(governor)
} else {
let available_governors = cpupower::get_available_governors()
.await
.log_err()
.unwrap_or_default();
let governor = match &selected_governor {
Some(governor) if available_governors.contains(governor) => Some(governor),
Some(governor) => {
tracing::warn!(
"{}",
t!("init.cpu-governor-not-available", governor = governor)
);
None
}
} else {
cpupower::get_preferred_governor().await?
None => cpupower::preferred_governor(&available_governors),
};
if let Some(governor) = governor {
tracing::info!("{}", t!("init.setting-cpu-governor", governor = governor));
cpupower::set_governor(governor).await?;
cpupower::set_governor(governor).await.log_err();
}

let selected_epp = server_info.as_epp().de()?;
let system_product_name = if selected_epp.is_none() {
crate::firmware::system_product_name().await.log_err()
} else {
None
};
let epp = cpupower::preferred_epp(selected_epp, system_product_name.as_deref());
if let Some(epp) = &epp {
let available_epps = cpupower::get_available_epps()
.await
.log_err()
.unwrap_or_default();
if available_epps.contains(epp) {
tracing::info!("{}", t!("init.setting-cpu-epp", epp = epp));
cpupower::set_epp(epp).await.log_err();
} else {
tracing::warn!("{}", t!("init.cpu-epp-not-available", epp = epp));
}
}
set_governor.complete();

Expand Down
20 changes: 20 additions & 0 deletions shared-libs/crates/start-core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,26 @@ pub fn server<C: Context>() -> ParentHandler<C> {
.with_call_remote::<CliContext>(),
),
)
.subcommand(
"governor",
from_fn_async(system::governor)
.with_display_serializable()
.with_custom_display_fn(|handle, result| {
system::display_governor_info(handle.params, result)
})
.with_about("about.show-cpu-governors")
.with_call_remote::<CliContext>(),
)
.subcommand(
"epp",
from_fn_async(system::epp)
.with_display_serializable()
.with_custom_display_fn(|handle, result| {
system::display_epp_info(handle.params, result)
})
.with_about("about.show-cpu-epp")
.with_call_remote::<CliContext>(),
)
.subcommand(
"experimental",
system::experimental::<C>().with_about("about.commands-experimental"),
Expand Down
2 changes: 1 addition & 1 deletion shared-libs/crates/start-core/src/ssh.rs
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ fn display_all_ssh_keys(
use prettytable::*;

if let Some(format) = params.format {
return display_serializable(format, params);
return display_serializable(format, result);
}

let mut table = Table::new();
Expand Down
Loading