diff --git a/Proxmox/Install/RunEnv.pm b/Proxmox/Install/RunEnv.pm index 0b6c209..dd717fc 100644 --- a/Proxmox/Install/RunEnv.pm +++ b/Proxmox/Install/RunEnv.pm @@ -32,26 +32,58 @@ sub query_total_memory : prototype() { } # Returns a hash. -# { -# name => { -# size => , -# } -# } +# [ +# [ , "/dev/path", size_in_blocks, "model", logical_blocksize, ] +# ] my sub query_blockdevs : prototype() { - my $disks = {}; + my $res = []; + my $count = 0; + foreach my $bd () { + next if $bd =~ m|^/sys/block/ram\d+$|; + next if $bd =~ m|^/sys/block/loop\d+$|; + next if $bd =~ m|^/sys/block/md\d+$|; + next if $bd =~ m|^/sys/block/dm-.*$|; + next if $bd =~ m|^/sys/block/fd\d+$|; + next if $bd =~ m|^/sys/block/sr\d+$|; - # FIXME: not the same as the battle proven way we used in the installer for years! - my $lsblk = fromjs(qx/lsblk -e 230 --bytes --json/); - for my $disk ($lsblk->{blockdevices}->@*) { - my ($name, $ro, $size, $type, $mountpoints) = $disk->@{qw(name ro size type mountpoints)}; + my $info = `udevadm info --path $bd --query all`; + next if !$info; + next if $info !~ m/^E: DEVTYPE=disk$/m; + next if $info =~ m/^E: ID_CDROM/m; + next if $info =~ m/^E: ID_FS_TYPE=iso9660/m; - next if $type ne 'disk' || $ro; - next if grep { defined($_) } @$mountpoints; + my ($name) = $info =~ m/^N: (\S+)$/m; + next if !$name; - $disks->{$name} = { size => $size }; + my $dev_path; + if ($info =~ m/^E: DEVNAME=(\S+)$/m) { + $dev_path = $1; + } else { + $dev_path = "/dev/$name"; + } + + my $size = file_read_firstline("$bd/size"); + chomp $size; + $size = undef if !($size && $size =~ m/^\d+$/); + $size = int($size); + next if !$size; + + my $model = file_read_firstline("$bd/device/model") || ''; + $model =~ s/^\s+//; + $model =~ s/\s+$//; + if (length ($model) > 30) { + $model = substr ($model, 0, 30); + } + + my $logical_bsize = file_read_firstline("$bd/queue/logical_block_size") // ''; + chomp $logical_bsize; + $logical_bsize = undef if !($logical_bsize && $logical_bsize =~ m/^\d+$/); + $logical_bsize = int($logical_bsize); + + push @$res, [$count++, $dev_path, $size, $model, $logical_bsize, "/sys/block/$name"]; } - return $disks; + return $res; } # Returns a hash. diff --git a/proxmox-tui-installer/src/options.rs b/proxmox-tui-installer/src/options.rs index 9f6408c..b78e104 100644 --- a/proxmox-tui-installer/src/options.rs +++ b/proxmox-tui-installer/src/options.rs @@ -223,6 +223,7 @@ pub enum AdvancedBootdiskOptions { #[derive(Clone, Debug, Eq, PartialEq)] pub struct Disk { pub path: String, + pub model: Option, pub size: u64, } diff --git a/proxmox-tui-installer/src/setup.rs b/proxmox-tui-installer/src/setup.rs index 635d610..03cbaa4 100644 --- a/proxmox-tui-installer/src/setup.rs +++ b/proxmox-tui-installer/src/setup.rs @@ -157,23 +157,17 @@ fn deserialize_disks_map<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { - #[derive(Deserialize)] - struct DiskDescriptor { - size: u64, - } - - let map: HashMap = Deserialize::deserialize(deserializer)?; - - let mut result = Vec::with_capacity(map.len()); - for (path, desc) in map.into_iter() { - result.push(Disk { - path: format!("/dev/{path}"), - size: desc.size, - }); - } - - result.sort(); - Ok(result) + let disks = >::deserialize(deserializer)?; + Ok(disks + .into_iter() + .map( + |(_index, device, size_mb, model, logical_bsize, _syspath)| Disk { + size: size_mb * logical_bsize, + path: device, + model: (!model.is_empty()).then_some(model), + }, + ) + .collect()) } fn deserialize_cidr_list<'de, D>(deserializer: D) -> Result, D::Error>