diff --git a/clanModules/diskLayouts.nix b/clanModules/diskLayouts.nix index 097ff2fa..32de6f11 100644 --- a/clanModules/diskLayouts.nix +++ b/clanModules/diskLayouts.nix @@ -6,33 +6,37 @@ example = "/dev/disk/by-id/ata-Samsung_SSD_850_EVO_250GB_S21PNXAGB12345"; }; }; - config.disko.devices = { - disk = { - main = { - type = "disk"; - device = config.clan.diskLayouts.singleDiskExt4.device; - content = { - type = "gpt"; - partitions = { - boot = { - size = "1M"; - type = "EF02"; # for grub MBR - }; - ESP = { - size = "512M"; - type = "EF00"; - content = { - type = "filesystem"; - format = "vfat"; - mountpoint = "/boot"; + config = { + boot.loader.grub.efiSupport = lib.mkDefault true; + boot.loader.grub.efiInstallAsRemovable = lib.mkDefault true; + disko.devices = { + disk = { + main = { + type = "disk"; + device = config.clan.diskLayouts.singleDiskExt4.device; + content = { + type = "gpt"; + partitions = { + boot = { + size = "1M"; + type = "EF02"; # for grub MBR }; - }; - root = { - size = "100%"; - content = { - type = "filesystem"; - format = "ext4"; - mountpoint = "/"; + ESP = { + size = "512M"; + type = "EF00"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + }; + }; + root = { + size = "100%"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/"; + }; }; }; }; diff --git a/flakeModules/clan.nix b/flakeModules/clan.nix index 4df243ae..fa4cc981 100644 --- a/flakeModules/clan.nix +++ b/flakeModules/clan.nix @@ -22,7 +22,7 @@ in description = "The directory containing the clan subdirectory"; }; specialArgs = mkOption { - type = types.attrsOf types.str; + type = types.attrsOf types.raw; default = { }; description = "Extra arguments to pass to nixosSystem i.e. useful to make self available"; }; diff --git a/pkgs/clan-cli/clan_cli/flash.py b/pkgs/clan-cli/clan_cli/flash.py index e59d2102..a03c1af5 100644 --- a/pkgs/clan-cli/clan_cli/flash.py +++ b/pkgs/clan-cli/clan_cli/flash.py @@ -4,6 +4,7 @@ import logging import os import shlex import shutil +import textwrap from collections.abc import Sequence from dataclasses import dataclass from pathlib import Path @@ -20,7 +21,7 @@ log = logging.getLogger(__name__) def flash_machine( - machine: Machine, disks: dict[str, str], dry_run: bool, debug: bool + machine: Machine, mode: str, disks: dict[str, str], dry_run: bool, debug: bool ) -> None: secret_facts_module = importlib.import_module(machine.secret_facts_module) secret_facts_store: SecretStoreBase = secret_facts_module.SecretStore( @@ -56,6 +57,7 @@ def flash_machine( disko_install.extend(["--extra-files", str(local_dir), upload_dir]) disko_install.extend(["--flake", str(machine.flake) + "#" + machine.name]) + disko_install.extend(["--mode", str(mode)]) cmd = nix_shell( ["nixpkgs#disko"], @@ -73,6 +75,7 @@ class FlashOptions: dry_run: bool confirm: bool debug: bool + mode: str class AppendDiskAction(argparse.Action): @@ -99,6 +102,7 @@ def flash_command(args: argparse.Namespace) -> None: dry_run=args.dry_run, confirm=not args.yes, debug=args.debug, + mode=args.mode, ) machine = Machine(opts.machine, flake=opts.flake) if opts.confirm and not opts.dry_run: @@ -110,7 +114,9 @@ def flash_command(args: argparse.Namespace) -> None: ask = input(msg) if ask != "y": return - flash_machine(machine, disks=opts.disks, dry_run=opts.dry_run, debug=opts.debug) + flash_machine( + machine, opts.mode, disks=opts.disks, dry_run=opts.dry_run, debug=opts.debug + ) def register_parser(parser: argparse.ArgumentParser) -> None: @@ -128,6 +134,20 @@ def register_parser(parser: argparse.ArgumentParser) -> None: help="device to flash to", default={}, ) + mode_help = textwrap.dedent("""\ + Specify the mode of operation. Valid modes are: format, mount." + Format will format the disk before installing. + Mount will mount the disk before installing. + Mount is useful for updating an existing system without losing data. + """) + parser.add_argument( + "--mode", + type=str, + help=mode_help, + choices=["format", "mount"], + default="format", + ) + parser.add_argument( "--yes", action="store_true",