_mount: take an attrset

This commit is contained in:
phaer 2023-01-09 20:35:54 +01:00
parent 30642cadbc
commit 7b59532520

View file

@ -162,12 +162,12 @@ rec {
mount :: types.devices -> str mount :: types.devices -> str
*/ */
mount = devices: let mount = devices: let
fsMounts = diskoLib.deepMergeMap (dev: dev._mount.fs or {}) (flatten (map attrValues (attrValues devices))); fsMounts = diskoLib.deepMergeMap (dev: (dev._mount {}).fs or {}) (flatten (map attrValues (attrValues devices)));
sortedDeviceList = diskoLib.sortDevicesByDependencies ((diskoLib.meta devices).deviceDependencies or {}) devices; sortedDeviceList = diskoLib.sortDevicesByDependencies ((diskoLib.meta devices).deviceDependencies or {}) devices;
in '' in ''
set -efux set -efux
# first create the necessary devices # first create the necessary devices
${concatMapStrings (dev: attrByPath (dev ++ [ "_mount" "dev" ]) "" devices) sortedDeviceList} ${concatMapStrings (dev: ((attrByPath (dev ++ [ "_mount" ]) "" devices) {}).dev ) sortedDeviceList}
# and then mount the filesystems in alphabetical order # and then mount the filesystems in alphabetical order
# attrValues returns values sorted by name. This is important, because it # attrValues returns values sorted by name. This is important, because it
@ -314,8 +314,8 @@ rec {
_mount = mkOption { _mount = mkOption {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = { default = {}: {
fs.${config.mountpoint} = '' fs.${config.mountpoint} = ''
if ! findmnt ${config.fsType} "/mnt${config.mountpoint}" > /dev/null 2>&1; then if ! findmnt ${config.fsType} "/mnt${config.mountpoint}" > /dev/null 2>&1; then
mount -t ${config.fsType} ${config.device} "/mnt${config.mountpoint}" \ mount -t ${config.fsType} ${config.device} "/mnt${config.mountpoint}" \
@ -397,9 +397,9 @@ rec {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = types.functionTo diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = dev: default = {dev}:
let let
subvolMounts = diskoLib.deepMergeMap (subvol: subvol._mount dev config.mountpoint) (attrValues config.subvolumes); subvolMounts = diskoLib.deepMergeMap (subvol: subvol._mount {inherit dev; parent = config.mountpoint;}) (attrValues config.subvolumes);
in { in {
fs = subvolMounts.fs // optionalAttrs (!isNull config.mountpoint) { fs = subvolMounts.fs // optionalAttrs (!isNull config.mountpoint) {
${config.mountpoint} = '' ${config.mountpoint} = ''
@ -492,8 +492,8 @@ rec {
_mount = mkOption { _mount = mkOption {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = types.functionTo (types.functionTo diskoLib.jsonType); type = types.functionTo diskoLib.jsonType;
default = dev: parent: let default = {dev, parent}: let
mountpoint = if (!isNull config.mountpoint) then config.mountpoint mountpoint = if (!isNull config.mountpoint) then config.mountpoint
else if (isNull parent) then config.name else if (isNull parent) then config.name
else null; else null;
@ -582,7 +582,7 @@ rec {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = types.functionTo diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = dev: { default = {dev}: {
fs.${config.mountpoint} = '' fs.${config.mountpoint} = ''
if ! findmnt ${dev} "/mnt${config.mountpoint}" > /dev/null 2>&1; then if ! findmnt ${dev} "/mnt${config.mountpoint}" > /dev/null 2>&1; then
mount ${dev} "/mnt${config.mountpoint}" \ mount ${dev} "/mnt${config.mountpoint}" \
@ -666,9 +666,9 @@ rec {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = types.functionTo diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = dev: default = {dev}:
let let
partMounts = diskoLib.deepMergeMap (partition: partition._mount dev) config.partitions; partMounts = diskoLib.deepMergeMap (partition: partition._mount {inherit dev;}) config.partitions;
in { in {
dev = '' dev = ''
${concatMapStrings (x: x.dev or "") (attrValues partMounts)} ${concatMapStrings (x: x.dev or "") (attrValues partMounts)}
@ -780,8 +780,8 @@ rec {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = types.functionTo diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = dev: default = {dev}:
optionalAttrs (!isNull config.content) (config.content._mount (diskoLib.deviceNumbering dev config.index)); optionalAttrs (!isNull config.content) (config.content._mount {dev = (diskoLib.deviceNumbering dev config.index);});
description = "Mount script"; description = "Mount script";
}; };
_config = mkOption { _config = mkOption {
@ -834,7 +834,7 @@ rec {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = types.functionTo diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = dev: { default = {dev}: {
fs.${dev} = '' fs.${dev} = ''
if ! swapon --show | grep -q '^${dev} '; then if ! swapon --show | grep -q '^${dev} '; then
swapon ${dev} swapon ${dev}
@ -898,7 +898,7 @@ rec {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = types.functionTo diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = dev: default = {dev}:
{}; {};
description = "Mount script"; description = "Mount script";
}; };
@ -956,9 +956,9 @@ rec {
_mount = mkOption { _mount = mkOption {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = let default = {}: let
lvMounts = diskoLib.deepMergeMap (lv: lv._mount config.name) (attrValues config.lvs); lvMounts = diskoLib.deepMergeMap (lv: lv._mount {vg = config.name;}) (attrValues config.lvs);
in { in {
dev = '' dev = ''
vgchange -a y vgchange -a y
@ -1041,8 +1041,8 @@ rec {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = types.functionTo diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = vg: default = {vg}:
optionalAttrs (!isNull config.content) (config.content._mount "/dev/${vg}/${config.name}"); optionalAttrs (!isNull config.content) (config.content._mount {dev = "/dev/${vg}/${config.name}";});
description = "Mount script"; description = "Mount script";
}; };
_config = mkOption { _config = mkOption {
@ -1100,7 +1100,7 @@ rec {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = types.functionTo diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = dev: default = {dev}:
{}; {};
description = "Mount script"; description = "Mount script";
}; };
@ -1188,9 +1188,9 @@ rec {
_mount = mkOption { _mount = mkOption {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = let default = {}: let
datasetMounts = diskoLib.deepMergeMap (dataset: dataset._mount config.name) (attrValues config.datasets); datasetMounts = diskoLib.deepMergeMap (dataset: dataset._mount {zpool = config.name;}) (attrValues config.datasets);
in { in {
dev = '' dev = ''
zpool list '${config.name}' >/dev/null 2>/dev/null || zpool import '${config.name}' zpool list '${config.name}' >/dev/null 2>/dev/null || zpool import '${config.name}'
@ -1305,8 +1305,8 @@ rec {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = types.functionTo diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = zpool: default = {zpool}:
optionalAttrs (config.zfs_type == "volume" && !isNull config.content) (config.content._mount "/dev/zvol/${zpool}/${config.name}") // optionalAttrs (config.zfs_type == "volume" && !isNull config.content) (config.content._mount {dev = "/dev/zvol/${zpool}/${config.name}";}) //
optionalAttrs (config.zfs_type == "filesystem" && config.options.mountpoint or "" != "none") { fs.${config.mountpoint} = '' optionalAttrs (config.zfs_type == "filesystem" && config.options.mountpoint or "" != "none") { fs.${config.mountpoint} = ''
if ! findmnt ${zpool}/${config.name} "/mnt${config.mountpoint}" > /dev/null 2>&1; then if ! findmnt ${zpool}/${config.name} "/mnt${config.mountpoint}" > /dev/null 2>&1; then
mount ${zpool}/${config.name} "/mnt${config.mountpoint}" \ mount ${zpool}/${config.name} "/mnt${config.mountpoint}" \
@ -1394,9 +1394,9 @@ rec {
_mount = mkOption { _mount = mkOption {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = default = {}:
optionalAttrs (!isNull config.content) (config.content._mount "/dev/md/${config.name}"); optionalAttrs (!isNull config.content) (config.content._mount {dev = "/dev/md/${config.name}";});
# TODO we probably need to assemble the mdadm somehow # TODO we probably need to assemble the mdadm somehow
description = "Mount script"; description = "Mount script";
}; };
@ -1452,7 +1452,7 @@ rec {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = types.functionTo diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = dev: default = {dev}:
{}; {};
description = "Mount script"; description = "Mount script";
}; };
@ -1517,9 +1517,9 @@ rec {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = types.functionTo diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = dev: default = {dev}:
let let
contentMount = config.content._mount "/dev/mapper/${config.name}"; contentMount = config.content._mount {dev = "/dev/mapper/${config.name}";};
in in
{ {
dev = '' dev = ''
@ -1587,9 +1587,9 @@ rec {
_mount = mkOption { _mount = mkOption {
internal = true; internal = true;
readOnly = true; readOnly = true;
type = diskoLib.jsonType; type = types.functionTo diskoLib.jsonType;
default = default = {}:
optionalAttrs (!isNull config.content) (config.content._mount config.device); optionalAttrs (!isNull config.content) (config.content._mount {dev = config.device;});
description = "Mount script"; description = "Mount script";
}; };
_config = mkOption { _config = mkOption {