Fetches UDEV device properties prepended with 'E:' for NICs and disks. The result is stored in its own JSON file.
This information is needed to filter for specific devices. Mainly for the auto-installer for now. Signed-off-by: Aaron Lauterer <a.laute...@proxmox.com> --- Proxmox/Makefile | 1 + Proxmox/Sys/Udev.pm | 54 +++++++++++++++++++++++++++++++++++++ proxmox-low-level-installer | 13 +++++++++ 3 files changed, 68 insertions(+) create mode 100644 Proxmox/Sys/Udev.pm diff --git a/Proxmox/Makefile b/Proxmox/Makefile index d49da80..9561d9b 100644 --- a/Proxmox/Makefile +++ b/Proxmox/Makefile @@ -16,6 +16,7 @@ PERL_MODULES=\ Sys/Command.pm \ Sys/File.pm \ Sys/Net.pm \ + Sys/Udev.pm \ UI.pm \ UI/Base.pm \ UI/Gtk3.pm \ diff --git a/Proxmox/Sys/Udev.pm b/Proxmox/Sys/Udev.pm new file mode 100644 index 0000000..69d674f --- /dev/null +++ b/Proxmox/Sys/Udev.pm @@ -0,0 +1,54 @@ +package Proxmox::Sys::Udev; + +use strict; +use warnings; + +use base qw(Exporter); +our @EXPORT_OK = qw(disk_details); + +my $udev_regex = '^E: ([A-Z_]*)=(.*)$'; + +my sub fetch_udevadm_info { + my ($path) = @_; + + my $info = `udevadm info --path $path --query all`; + if (!$info) { + warn "no details found for device '${path}'\n"; + next; + } + my $details = {}; + for my $line (split('\n', $info)) { + if ($line =~ m/$udev_regex/) { + $details->{$1} = $2; + } + } + return $details; +} + +# return hash of E: properties returned by udevadm +sub disk_details { + my $result = {}; + for my $data (@{Proxmox::Sys::Block::get_cached_disks()}) { + my $index = @$data[0]; + my $bd = @$data[5]; + $result->{$index} = fetch_udevadm_info($bd); + } + return $result; +} + + +sub nic_details { + my $nic_path = "/sys/class/net"; + my $result = {}; + + my $nics = Proxmox::Sys::Net::get_ip_config()->{ifaces}; + + for my $index (keys %$nics) { + my $name = $nics->{$index}->{name}; + my $nic = "${nic_path}/${name}"; + $result->{$name} = fetch_udevadm_info($nic); + } + return $result; +} + +1; diff --git a/proxmox-low-level-installer b/proxmox-low-level-installer index 2848295..54f689a 100755 --- a/proxmox-low-level-installer +++ b/proxmox-low-level-installer @@ -21,6 +21,7 @@ use Time::HiRes qw(usleep); use Proxmox::Install::ISOEnv; use Proxmox::Install::RunEnv; +use Proxmox::Sys::Udev; use Proxmox::Sys::File qw(file_write_all); @@ -31,6 +32,7 @@ use Proxmox::UI; my $commands = { 'dump-env' => 'Dump the current ISO and Hardware environment to base the installer UI on.', + 'dump-udev' => 'Dump disk and network device info. Used for the auto installation.', 'start-session' => 'Start an installation session, with command and result transmitted via stdin/out', 'start-session-test' => 'Start an installation TEST session, with command and result transmitted via stdin/out', 'help' => 'Output this usage help.', @@ -115,6 +117,17 @@ if ($cmd eq 'dump-env') { my $run_env = Proxmox::Install::RunEnv::query_installation_environment(); my $run_env_serialized = to_json($run_env, {canonical => 1, utf8 => 1}) ."\n"; file_write_all($run_env_file, $run_env_serialized); +} elsif ($cmd eq 'dump-udev') { + my $out_dir = $env->{locations}->{run}; + make_path($out_dir); + die "failed to create output directory '$out_dir'\n" if !-d $out_dir; + + my $output = {}; + $output->{disks} = Proxmox::Sys::Udev::disk_details(); + $output->{nics} = Proxmox::Sys::Udev::nic_details(); + + my $output_serialized = to_json($output, {canonical => 1, utf8 => 1}) ."\n"; + file_write_all("$out_dir/run-env-udev.json", $output_serialized); } elsif ($cmd eq 'start-session') { Proxmox::UI::init_stdio({}, $env); read_and_merge_config(); -- 2.39.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel