From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id B9E1A91A78 for ; Thu, 4 Apr 2024 16:49:09 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 505604091 for ; Thu, 4 Apr 2024 16:49:07 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Thu, 4 Apr 2024 16:49:06 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 1A34D452F6 for ; Thu, 4 Apr 2024 16:49:06 +0200 (CEST) From: Aaron Lauterer To: pve-devel@lists.proxmox.com Date: Thu, 4 Apr 2024 16:48:38 +0200 Message-Id: <20240404144902.273800-7-a.lauterer@proxmox.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240404144902.273800-1-a.lauterer@proxmox.com> References: <20240404144902.273800-1-a.lauterer@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.058 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH installer v4 06/30] low-level: add dump-udev command X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 04 Apr 2024 14:49:09 -0000 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 --- 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