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 86E039A9E for ; Tue, 5 Sep 2023 15:29:05 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 6226719F0D for ; Tue, 5 Sep 2023 15:28:35 +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 ; Tue, 5 Sep 2023 15:28:33 +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 862CC4229E for ; Tue, 5 Sep 2023 15:28:33 +0200 (CEST) From: Aaron Lauterer To: pve-devel@lists.proxmox.com Date: Tue, 5 Sep 2023 15:28:27 +0200 Message-Id: <20230905132832.3179097-2-a.lauterer@proxmox.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230905132832.3179097-1-a.lauterer@proxmox.com> References: <20230905132832.3179097-1-a.lauterer@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.083 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 URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [command.pm, file.pm, base.pm, ui.pm, gtk3.pm, udev.pm, net.pm] Subject: [pve-devel] [RFC installer 1/6] low level: sys: fetch udev properties 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: Tue, 05 Sep 2023 13:29:05 -0000 Fetch UDEV device properties (prepended with E:) for NICs and disks and store them in their own JSON file so that we can use them for filtering. Signed-off-by: Aaron Lauterer --- Proxmox/Makefile | 1 + Proxmox/Sys/Udev.pm | 54 +++++++++++++++++++++++++++++++++++++ proxmox-low-level-installer | 14 ++++++++++ 3 files changed, 69 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 814961e..99d5b9a 100755 --- a/proxmox-low-level-installer +++ b/proxmox-low-level-installer @@ -23,14 +23,17 @@ use Proxmox::Install::ISOEnv; use Proxmox::Install::RunEnv; use Proxmox::Sys::File qw(file_write_all); +use Proxmox::Sys::Udev; use Proxmox::Log; use Proxmox::Install; use Proxmox::Install::Config; 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.', @@ -85,6 +88,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); -- 2.39.2