diff --git a/hack/dev/configs/edera.sprout.toml b/hack/dev/configs/edera.sprout.toml index 7bcb114..77acdb2 100644 --- a/hack/dev/configs/edera.sprout.toml +++ b/hack/dev/configs/edera.sprout.toml @@ -1,5 +1,8 @@ version = 1 +[defaults] +entry = "edera" + [extractors.boot.filesystem-device-match] has-item = "\\EFI\\BOOT\\xen.efi" diff --git a/hack/dev/configs/kernel.sprout.toml b/hack/dev/configs/kernel.sprout.toml index 40404fe..8ac3fce 100644 --- a/hack/dev/configs/kernel.sprout.toml +++ b/hack/dev/configs/kernel.sprout.toml @@ -1,5 +1,8 @@ version = 1 +[defaults] +entry = "kernel" + [extractors.boot.filesystem-device-match] has-item = "\\EFI\\BOOT\\kernel.efi" diff --git a/hack/dev/configs/shell.sprout.toml b/hack/dev/configs/shell.sprout.toml index 99676ff..f36b850 100644 --- a/hack/dev/configs/shell.sprout.toml +++ b/hack/dev/configs/shell.sprout.toml @@ -1,11 +1,14 @@ version = 1 +[defaults] +entry = "shell" + [extractors.boot.filesystem-device-match] has-item = "\\EFI\\BOOT\\shell.efi" [actions.chainload-shell] chainload.path = "$boot\\EFI\\BOOT\\shell.efi" -[entries.xen] +[entries.shell] title = "Boot Shell" actions = ["chainload-shell"] diff --git a/hack/dev/configs/xen.sprout.toml b/hack/dev/configs/xen.sprout.toml index 46a2a2e..6a54986 100644 --- a/hack/dev/configs/xen.sprout.toml +++ b/hack/dev/configs/xen.sprout.toml @@ -1,5 +1,8 @@ version = 1 +[defaults] +entry = "xen" + [extractors.boot.filesystem-device-match] has-item = "\\EFI\\BOOT\\xen.efi" diff --git a/src/config.rs b/src/config.rs index e322e1d..ba6aaa7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -22,6 +22,9 @@ pub struct RootConfiguration { /// the configuration is the latest version. #[serde(default = "latest_version")] pub version: u32, + /// Default options for Sprout. + #[serde(default)] + pub defaults: DefaultsConfiguration, /// Values to be inserted into the root sprout context. #[serde(default)] pub values: BTreeMap, @@ -59,6 +62,14 @@ pub struct RootConfiguration { pub phases: PhasesConfiguration, } +/// Default configuration for Sprout, used when the corresponding options are not specified. +#[derive(Serialize, Deserialize, Default, Clone)] +pub struct DefaultsConfiguration { + /// The entry to boot without showing the boot menu. + /// If not specified, a boot menu is shown. + pub entry: Option, +} + fn latest_version() -> u32 { LATEST_VERSION } diff --git a/src/main.rs b/src/main.rs index 9a5d5bc..be369e1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -164,13 +164,23 @@ fn main() -> Result<()> { // Execute the late phase. phase(context.clone(), &config.phases.late).context("unable to execute late phase")?; + // If --boot is specified, or defaults.entry is specified, use that to find the entry to boot. + let boot = context + .root() + .options() + .boot + .as_ref() + .or(config.defaults.entry.as_ref()); + // Use the boot option if possible, otherwise pick the first entry. - let entry = if let Some(ref boot) = context.root().options().boot { + let entry = if let Some(ref boot) = boot { entries .iter() .enumerate() .find(|(index, entry)| { - entry.name() == boot || entry.title() == boot || &index.to_string() == boot + entry.name() == boot.as_str() + || entry.title() == boot.as_str() + || index.to_string() == boot.as_str() }) .context(format!("unable to find entry: {boot}"))? .1 // select the bootable entry.