diff --git a/inxi b/inxi index ba82ddc..76a4331 100755 --- a/inxi +++ b/inxi @@ -48,8 +48,8 @@ use POSIX qw(ceil uname strftime ttyname); ## INXI INFO ## my $self_name='inxi'; -my $self_version='3.3.14'; -my $self_date='2022-03-25'; +my $self_version='3.3.15'; +my $self_date='2022-04-08'; my $self_patch='00'; ## END INXI INFO ## my ($b_pledge,@pledges); @@ -287,7 +287,7 @@ sub set_dmidecode { } } else { - if (grep { $_ =~ /^\/dev\/mem: Permission/i } @$data){ + if (grep {$_ =~ /(^\/dev\/mem: Permission|Permission denied)/i } @$data){ $action = 'permissions'; } else { @@ -444,6 +444,7 @@ sub set_basics { $client{'name-print'} = ''; $client{'su-start'} = ''; # shows sudo/su $client{'version'} = ''; + $client{'whoami'} = getpwuid($<) || ''; $colors{'default'} = 2; $show{'partition-sort'} = 'id'; # sort order for partitions @raw_logical = (0,0,0); @@ -1852,6 +1853,7 @@ sub display_data { print "Collecting X, xprop, glxinfo, xrandr, xdpyinfo data, Wayland info...\n"; %data = ( 'desktop-session' => $ENV{'DESKTOP_SESSION'}, + 'display' => $ENV{'DISPLAY'}, 'gdmsession' => $ENV{'GDMSESSION'}, 'gnome-desktop-session-id' => $ENV{'GNOME_DESKTOP_SESSION_ID'}, 'kde-full-session' => $ENV{'KDE_FULL_SESSION'}, @@ -1861,8 +1863,8 @@ sub display_data { 'xdg-session-desktop' => $ENV{'XDG_SESSION_DESKTOP'}, 'xdg-vtnr' => $ENV{'XDG_VTNR'}, # wayland data collectors: - 'xdg-session-type' => $ENV{'XDG_SESSION_TYPE'}, 'wayland-display' => $ENV{'WAYLAND_DISPLAY'}, + 'xdg-session-type' => $ENV{'XDG_SESSION_TYPE'}, 'gdk-backend' => $ENV{'GDK_BACKEND'}, 'qt-qpa-platform' => $ENV{'QT_QPA_PLATFORM'}, 'clutter-backend' => $ENV{'CLUTTER_BACKEND'}, @@ -4084,7 +4086,10 @@ sub set_program_values { 'qmake' => ['^^Using Qt version',4,'--version','Qt',0,0,0,'',''], 'qtdiag' => ['^qt',2,'--version','Qt',0,1,0,'',''], ## Display Managers (dm) ## + 'brzdm' => ['^brzdm',0,'-v','brzdm',0,1,0,'',''], # unverified, like slim 'cdm' => ['^cdm',0,'0','CDM',0,1,0,'',''], + # might be xlogin, unknown output for -V + 'clogin' => ['^clogin',0,'-V','clogin',0,1,0,'',''], # unverified, maybe xlogin 'emptty' => ['^emptty',0,'0','EMPTTY',0,1,0,'',''], # unverified 'entrance' => ['^entrance',0,'0','Entrance',0,1,0,'',''], 'gdm' => ['^gdm',2,'--version','GDM',0,1,0,'',''], @@ -4097,6 +4102,7 @@ sub set_program_values { 'lxdm' => ['^lxdm',0,'0','LXDM',0,1,0,'',''], 'ly' => ['^ly',3,'--version','Ly',0,1,0,'',''], 'mdm' => ['^mdm',0,'0','MDM',0,1,0,'',''], + 'mlogin' => ['^mlogin',0,'0','mlogin',0,1,0,'',''], # unverified 'nodm' => ['^nodm',0,'0','nodm',0,1,0,'',''], 'pcdm' => ['^pcdm',0,'0','PCDM',0,1,0,'',''], 'qingy' => ['^qingy',0,'0','qingy',0,1,0,'',''], # unverified @@ -4108,6 +4114,7 @@ sub set_program_values { 'wdm' => ['^wdm',0,'0','WINGs DM',0,1,0,'',''], 'xdm' => ['^xdm',0,'0','XDM',0,1,0,'',''], 'xenodm' => ['^xenodm',0,'0','xenodm',0,1,0,'',''], + 'xlogin' => ['^xlogin',0,'-V','xlogin',0,1,0,'',''], # unverified, probably clogin ## Shells - not checked: ion, eshell ## ## See ShellData::shell_test() for unhandled but known shells 'ash' => ['',3,'pkg','ash',1,0,0,'',''], # special; dash precursor @@ -5507,7 +5514,7 @@ sub show_options { ['0', '', '', ''], ['0', '', '', "You can use these options alone or together, to show or add the item(s) you want to see: A, B, C, D, E, G, I, J, L, M, N, - P, R, S, W, d, f, i, j, l, m, n, o, p, r, s, t, u, w, --slots. + P, R, S, W, d, f, i, j, l, m, n, o, p, r, s, t, u, w, --edid, --slots. If you use them with -v [level], -b or -F, $self_name will add the requested lines to the output."], ['0', '', '', '' ], @@ -5557,8 +5564,8 @@ sub show_options { LUKS, Crypto, bcache, etc. Shows components/devices, sizes, etc."], ['1', '-m', '--memory', "Memory (RAM) data. Requires root. Numbers of devices (slots) supported and individual memory devices (sticks of memory etc). - For devices, shows device locator, size, speed, type (e.g. DDR3). - If neither -I nor -tm are selected, also shows RAM used/total."], + For devices, shows device locator, type (e.g. DDR3), size, speed. If neither + -I nor -tm are selected, also shows RAM used/total."], ['1', '', '--memory-modules', "Memory (RAM) data. Exclude empty module slots."], ['1', '', '--memory-short', "Memory (RAM) data. Show only short Memory RAM report, number of arrays, slots, modules, and RAM type."], @@ -5718,6 +5725,8 @@ sub show_options { pressure, and if values are default or not."], ['2', '-L', '', "LV, Crypto, devices, components: add maj:min; show full device/components report (speed, mapped names)."], + ['2', '-m', '', "Show full volts report, current, min, max, even if + identical."], ['2', '-n,-N', '', "If available: list of alternate kernel modules/drivers for device(s); PCIe lanes-max: gen, speed, lanes (if relevant)."], ['2', '-o', '', "If available: maj:min of device."], @@ -5726,6 +5735,7 @@ sub show_options { ['2', '-r', '', "Packages, see -Ia."], ['2', '-R', '', "mdraid: device maj:min; per component: size, maj:min, state."], ['2', '-S', '', "If available: kernel boot parameters."], + ['2', '', '--slots', "If available: slot bus ID children."], ['0', '', '', ''], ['1', '-x', '--extra', "Adds the following extra data (only works with verbose or line output, not short form):"], @@ -5760,8 +5770,7 @@ sub show_options { ['2', '-j', '', "Add mapped: name if partition mapped."], ['2', '-J', '', "For Device: driver."], ['2', '-L', '', "For VG > LV, and other Devices, dm:"], - ['2', '-m,--memory-modules', '', "Max memory module size (if available), - device type."], + ['2', '-m,--memory-modules', '', "Max memory module size (if available)."], ['2', '-N', '', "Specific vendor/product information (if relevant); PCI/USB ID of device; Version/port(s)/driver version (if available)."], ['2', '-o,-p,-P', '', "Add mapped: name if partition mapped."], @@ -5773,6 +5782,7 @@ sub show_options { vbat."], ['2', '-S', '', "Kernel gcc version; system base of distro (if relevant and detected)"], + ['2', '', '--slots', "Adds BusID for slot."], ['2', '-t', '', "Adds memory use output to CPU (-xt c), and CPU use to memory (-xt m)."], ); @@ -5809,7 +5819,8 @@ sub show_options { for LVM RAID, adds RAID report line (if not -R); show all components > devices, number of 'c' or 'p' indicate depth of device."], ['2', '-m,--memory-modules', '', "Manufacturer, part number; single/double - bank (if found)."], + bank (if found); memory array voltage (legacy, rare); module voltage (if + available)."], ['2', '-M', '', "Chassis info, BIOS ROM size (dmidecode only), if available."], ['2', '-N', '', "Chip vendor:product ID; PCIe speed, lanes (if found)."], ['2', '-r', '', "Packages, see -Ixx."], @@ -5819,7 +5830,7 @@ sub show_options { ['2', '-S', '', "Display manager (dm) in desktop output (e.g. kdm, gdm3, lightdm); active window manager if detected; desktop toolkit, if available (Xfce/KDE/Trinity only)."], - ['2', '--slots', '', "Slot length."], + ['2', '--slots', '', "Slot length; slot voltage, if available."], ); if ($use{'weather'}){ push(@data, @@ -5846,8 +5857,8 @@ sub show_options { ['2', '-J', '', "If present: Devices: serial number, interface count; USB speed; max power."], ['2', '-m,--memory-modules', '', "Width of memory bus, data and total (if - present and greater than data); Detail for Type, if present; module voltage, - if available; serial number."], + present and greater than data); Detail for Type, if present; module current, + min, max voltages (if present and different from each other); serial number."], ['2', '-N', '', "Serial number, class ID."], ['2', '-R', '', "zfs-raid: portion allocated (used) by RAID devices/arrays. md-raid: system md-raid support types (kernel support, read ahead, RAID @@ -13685,11 +13696,8 @@ sub display_output(){ } # no xdpyinfo installed # undef $graphics{'x-server'}; - if (!$graphics{'x-server'} || !$graphics{'x-server'}->[0][1] || - !$b_display || $graphics{'protocol'} eq 'wayland'){ - # fallback, will complete x-server/x-version, set flags, if found - display_server_data(); - } + # Completes X server data if no previous detections, tests/adds xwayland + display_server_data(); if (!defined $graphics{'display-id'} && defined $ENV{'DISPLAY'}){ $graphics{'display-id'} = $ENV{'DISPLAY'}; } @@ -13771,36 +13779,43 @@ sub display_output(){ } # if xvesa, will always have display-driver set if ($graphics{'xvesa'} && $graphics{'display-driver'}){ - $row[0]->{main::key($num++,1,2,'driver')} = join(',',@{$graphics{'display-driver'}});; + $row[0]->{main::key($num++,0,2,'driver')} = join(',',@{$graphics{'display-driver'}}); } else { - $row[0]->{main::key($num++,1,2,'driver')} = ''; - # The only wayland setups with x drivers have xorg, transitional that is. - if ($x_drivers){ - $row[0]->{main::key($num++,1,3,'X')} = ''; - my $driver = ($x_drivers->[0]) ? $x_drivers->[0] : 'N/A'; - $row[0]->{main::key($num++,1,4,'loaded')} = $driver; - if ($x_drivers->[1]){ - $row[0]->{main::key($num++,0,4,'unloaded')} = $x_drivers->[1]; - } - if ($x_drivers->[2]){ - $row[0]->{main::key($num++,0,4,'failed')} = $x_drivers->[2]; - } - if ($extra > 1 && $x_drivers->[3]){ - $row[0]->{main::key($num++,0,4,'alternate')} = $x_drivers->[3]; - } - } my $gpu_drivers = gpu_drivers_sys('all'); - my $drivers; - if ($gpu_drivers){ - $drivers = join(',',@{$gpu_drivers}); + my $note_indent = 4; + if ($gpu_drivers || $x_drivers){ + $row[0]->{main::key($num++,1,2,'driver')} = ''; + # The only wayland setups with x drivers have xorg, transitional that is. + if ($x_drivers){ + $row[0]->{main::key($num++,1,3,'X')} = ''; + my $driver = ($x_drivers->[0]) ? $x_drivers->[0] : 'N/A'; + $row[0]->{main::key($num++,1,4,'loaded')} = $driver; + if ($x_drivers->[1]){ + $row[0]->{main::key($num++,0,4,'unloaded')} = $x_drivers->[1]; + } + if ($x_drivers->[2]){ + $row[0]->{main::key($num++,0,4,'failed')} = $x_drivers->[2]; + } + if ($extra > 1 && $x_drivers->[3]){ + $row[0]->{main::key($num++,0,4,'alternate')} = $x_drivers->[3]; + } + } + my $drivers; + if ($gpu_drivers){ + $drivers = join(',',@{$gpu_drivers}); + } + else { + $drivers = ($graphics{'gpu-drivers'}) ? join(',',@{$graphics{'gpu-drivers'}}): 'N/A'; + } + $row[0]->{main::key($num++,1,3,'gpu')} = $drivers; } else { - $drivers = ($graphics{'gpu-drivers'}) ? join(',',@{$graphics{'gpu-drivers'}}): 'N/A'; + $note_indent = 3; + $row[0]->{main::key($num++,1,2,'driver')} = 'N/A'; } - $row[0]->{main::key($num++,1,3,'gpu')} = $drivers; if ($driver_note){ - $row[0]->{main::key($num++,0,4,'note')} = $driver_note; + $row[0]->{main::key($num++,0,$note_indent,'note')} = $driver_note; } } } @@ -14046,14 +14061,24 @@ sub monitors_output_full { $$row[$j]->{main::key($$num++,0,$m3,'min')} = ${$monitors->{$key}{'modes'}}[-1]; } } - if ($show{'edid'} && ($monitors->{$key}{'errors'} || $monitors->{$key}{'warnings'})){ - $j++; - $$row[$j]->{main::key($$num++,1,$m2,'EDID')} = ''; - if ($monitors->{$key}{'errors'}){ - $$row[$j]->{main::key($$num++,0,$m3,'errors')} = join('; ', @{$monitors->{$key}{'errors'}}); + if ($show{'edid'}){ + if ($monitors->{$key}{'edid-errors'}){ + $j++; + my $cnt = 1; + $$row[$j]->{main::key($$num++,1,$m2,'EDID-Errors')} = ''; + foreach my $err (@{$monitors->{$key}{'edid-errors'}}){ + $$row[$j]->{main::key($$num++,0,$m3,$cnt)} = $err; + $cnt++; + } } - if ($monitors->{$key}{'warnings'}){ - $$row[$j]->{main::key($$num++,0,$m3,'warnings')} = join('; ', @{$monitors->{$key}{'warnings'}}); + if ($monitors->{$key}{'edid-warnings'}){ + $j++; + my $cnt = 1; + $$row[$j]->{main::key($$num++,1,$m2,'EDID-Warnings')} = ''; + foreach my $warn (@{$monitors->{$key}{'edid-warnings'}}){ + $$row[$j]->{main::key($$num++,0,$m3,$cnt)} = $warn; + $cnt++; + } } } } @@ -15041,8 +15066,7 @@ sub display_server_data { } $graphics{'x-server'} = [[$server,$version]] if $server; } - if ((!$b_display || $graphics{'protocol'} eq 'wayland') && - ($program = main::check_program('Xwayland'))){ + if ($program = main::check_program('Xwayland')){ undef $version; @data = main::grabber("$program -version 2>&1",'','strip'); # Slackware Linux Project Xwayland Version 21.1.4 (12101004) @@ -15201,17 +15225,22 @@ sub display_protocol { elsif ($graphics{'protocol'} eq 'tty'){ $graphics{'protocol'} = ''; } - # need to confirm that there's a point to this test, I believe no, fails out of x + # If no other source, get user session id, then grab session type. # loginctl also results in the session id - if (!$graphics{'protocol'} && $b_display && $force{'display'}){ + # undef $graphics{'protocol'}; + if (!$graphics{'protocol'}){ if (my $program = main::check_program('loginctl')){ my $id = ''; # $id = $ENV{'XDG_SESSION_ID'}; # returns tty session in console my @data = main::grabber("$program --no-pager --no-legend 2>/dev/null",'','strip'); foreach (@data){ - next if /tty[v]?[0-6]$/; # freebsd: ttyv3 + # some systems show empty or ??? for TTY field, but whoami should do ok + next if /(ttyv?\d|pts\/)/; # freebsd: ttyv3 + # in display, root doesn't show in the logins + next if $client{'whoami'} && $client{'whoami'} ne 'root' && !/\b$client{'whoami'}\b/; $id = (split(/\s+/, $_))[0]; - last; # multiuser? too bad, we'll go for the first one + # multiuser? too bad, we'll go for the first one that isn't a tty/pts + last; } if ($id){ my $temp = (main::grabber("$program show-session $id -p Type --no-pager --no-legend 2>/dev/null"))[0]; @@ -18018,7 +18047,7 @@ sub set_partitions { $fs = ($b_fs) ? $row[1]: get_mounts_fs($row[0],\@mount); } # assuming that all null/nullfs are parts of a logical fs - $b_logical = 1 if $fs && $fs =~ /^(btrfs|hammer|null|zfs)/; + $b_logical = 1 if $fs && $fs =~ /^(btrfs|hammer|null|wekafs|zfs)/; $id = join(' ', @row[$cols .. $#row]); $size = $row[$cols - $back_size]; if ($b_admin && -e "/sys/block/"){ @@ -19950,7 +19979,7 @@ sub ram_output { $rows[$j]->{main::key($num++,0,3,'note')} = $item->{'mod-qualifier'}; } } - if ($extra > 2 && $item->{'voltage'}){ + if ($extra > 1 && $item->{'voltage'}){ $rows[$j]->{main::key($num++,0,2,'voltage')} = $item->{'voltage'}; } } @@ -19975,12 +20004,22 @@ sub ram_output { $mod->{'locator'} ||= 'N/A'; push(@rows, { main::key($num++,1,2,'Device') => $mod->{'locator'}, - main::key($num++,0,3,'size') => process_size($mod->{'size'}), }); - next if ($mod->{'size'} =~ /\D/); + # this will contain the no module string + if ($mod->{'size'} =~ /\D/){ + $rows[$j]->{main::key($num++,0,3,'type')} = lc($mod->{'size'}); + next; + } if ($extra > 1 && $mod->{'type'}){ $rows[$j]->{main::key($num++,0,3,'info')} = $mod->{'type'}; } + $mod->{'device-type'} ||= 'N/A'; + $rows[$j]->{main::key($num++,1,3,'type')} = $mod->{'device-type'}; + if ($extra > 2 && $mod->{'device-type'} ne 'N/A'){ + $mod->{'device-type-detail'} ||= 'N/A'; + $rows[$j]->{main::key($num++,0,4,'detail')} = $mod->{'device-type-detail'}; + } + $rows[$j]->{main::key($num++,0,3,'size')} = process_size($mod->{'size'}); if ($mod->{'speed'} && $mod->{'configured-clock-speed'} && $mod->{'speed'} ne $mod->{'configured-clock-speed'}){ $rows[$j]->{main::key($num++,1,3,'speed')} = ''; @@ -20001,19 +20040,45 @@ sub ram_output { $rows[$j]->{main::key($num++,1,3,'speed')} = $mod->{'speed'}; $rows[$j]->{main::key($num++,0,4,'note')} = $mod->{'speed-note'} if $mod->{'speed-note'}; } - if ($extra > 0){ - $mod->{'device-type'} ||= 'N/A'; - $rows[$j]->{main::key($num++,0,3,'type')} = $mod->{'device-type'}; - if ($extra > 2 && $mod->{'device-type'} ne 'N/A'){ - $mod->{'device-type-detail'} ||= 'N/A'; - $rows[$j]->{main::key($num++,0,3,'detail')} = $mod->{'device-type-detail'}; + # handle cases where -xx or -xxx and no voltage data (common) or voltages + # are all the same. + if ($extra > 1){ + if (($mod->{'voltage-config'} || $mod->{'voltage-max'} || $mod->{'voltage-min'}) && + ($b_admin || ( + ($mod->{'voltage-config'} && $mod->{'voltage-max'} && + $mod->{'voltage-config'} ne $mod->{'voltage-max'}) || + ($mod->{'voltage-config'} && $mod->{'voltage-min'} && + $mod->{'voltage-config'} ne $mod->{'voltage-min'}) || + ($mod->{'voltage-min'} && $mod->{'voltage-max'} && + $mod->{'voltage-max'} ne $mod->{'voltage-min'}) + ))){ + $rows[$j]->{main::key($num++,1,3,'volts')} = ''; + if ($mod->{'voltage-config'}){ + $rows[$j]->{main::key($num++,0,4,'curr')} = $mod->{'voltage-config'}; + } + if ($mod->{'voltage-min'}){ + $rows[$j]->{main::key($num++,0,4,'min')} = $mod->{'voltage-min'}; + } + if ($mod->{'voltage-max'}){ + $rows[$j]->{main::key($num++,0,4,'max')} = $mod->{'voltage-max'}; + } + } + else { + $mod->{'voltage-config'} ||= 'N/A'; + $rows[$j]->{main::key($num++,0,3,'volts')} = $mod->{'voltage-config'}; } } if ($source ne 'dboot' && $extra > 2){ - $mod->{'data-width'} ||= 'N/A'; - $rows[$j]->{main::key($num++,0,3,'bus-width')} = $mod->{'data-width'}; - $mod->{'total-width'} ||= 'N/A'; - $rows[$j]->{main::key($num++,0,3,'total')} = $mod->{'total-width'}; + if (!$mod->{'data-width'} && !$mod->{'total-width'}){ + $rows[$j]->{main::key($num++,0,3,'width')} = 'N/A'; + } + else { + $rows[$j]->{main::key($num++,1,3,'width (bits)')} = ''; + $mod->{'data-width'} ||= 'N/A'; + $rows[$j]->{main::key($num++,0,4,'data')} = $mod->{'data-width'}; + $mod->{'total-width'} ||= 'N/A'; + $rows[$j]->{main::key($num++,0,4,'total')} = $mod->{'total-width'}; + } } if ($source ne 'dboot' && $extra > 1){ $mod->{'manufacturer'} ||= 'N/A'; @@ -20066,7 +20131,7 @@ sub dmidecode_data { $ram[$k]->{'max-capacity-5'} = $max_cap_5; } elsif ($temp[0] eq 'Memory Module Voltage'){ - $temp[1] =~ s/\s*V.*$//; + $temp[1] =~ s/\s*V.*$//; # seen: 5.0 V 3.3 V $ram[$k]->{'voltage'} = $temp[1]; } elsif ($temp[0] eq 'Associated Memory Slots'){ @@ -20111,7 +20176,7 @@ sub dmidecode_data { $bank_locator = $temp[1]; } elsif ($temp[0] eq 'Type'){ - $device_type = $temp[1]; + $device_type = main::clean_dmi($temp[1]); } } # because of the wide range of bank/slot type data, we will just use @@ -20176,6 +20241,7 @@ sub dmidecode_data { $main_locator) = ('','','','',''); my ($manufacturer,$vendor_id,$part_number,$serial,$speed,$speed_note, $total_width) = ('','','','','','',''); + my ($voltage_config,$voltage_max,$voltage_min); my ($device_size,$i_data,$i_total,$working_size) = (0,0,0,0); foreach my $item (@$entry){ @temp = split(/:\s*/, $item, 2); @@ -20183,11 +20249,14 @@ sub dmidecode_data { if ($temp[0] eq 'Array Handle'){ $handle = hex($temp[1]); } + # these two can have 'none' or 'unknown' value elsif ($temp[0] eq 'Data Width'){ - $data_width = $temp[1]; + $data_width = main::clean_dmi($temp[1]); + $data_width =~ s/[\s_-]?bits// if $data_width; } elsif ($temp[0] eq 'Total Width'){ - $total_width = $temp[1]; + $total_width = main::clean_dmi($temp[1]); + $total_width =~ s/[\s_-]?bits// if $total_width; } # do not try to guess from installed modules, only use this to correct type 5 data elsif ($temp[0] eq 'Size'){ @@ -20211,11 +20280,12 @@ sub dmidecode_data { elsif ($temp[0] eq 'Form Factor'){ $form_factor = $temp[1]; } + # these two can have 'none' or 'unknown' value elsif ($temp[0] eq 'Type'){ - $device_type = $temp[1]; + $device_type = main::clean_dmi($temp[1]); } elsif ($temp[0] eq 'Type Detail'){ - $device_type_detail = $temp[1]; + $device_type_detail = main::clean_dmi($temp[1]); } elsif ($temp[0] eq 'Speed'){ ($speed,$speed_note) = process_speed($temp[1],$device_type,$check); @@ -20235,6 +20305,21 @@ sub dmidecode_data { elsif ($temp[0] eq 'Serial Number'){ $serial = main::clean_unset($temp[1],'^[0]+$|SerNum.*'); } + elsif ($temp[0] eq 'Configured Voltage'){ + if ($temp[1] =~ /^([\d\.]+)/){ + $voltage_config = $1; + } + } + elsif ($temp[0] eq 'Maximum Voltage'){ + if ($temp[1] =~ /^([\d\.]+)/){ + $voltage_max = $1; + } + } + elsif ($temp[0] eq 'Minimum Voltage'){ + if ($temp[1] =~ /^([\d\.]+)/){ + $voltage_min = $1; + } + } } # because of the wide range of bank/slot type data, we will just use # the one that seems most likely to be right. Some have: Bank: SO DIMM 0 slot: J6A @@ -20293,6 +20378,9 @@ sub dmidecode_data { $ram[$handle]->{'modules'}[$i]{'speed'} = $speed; $ram[$handle]->{'modules'}[$i]{'speed-note'} = $speed_note if $speed_note; $ram[$handle]->{'modules'}[$i]{'total-width'} = $total_width; + $ram[$handle]->{'modules'}[$i]{'voltage-config'} = $voltage_config; + $ram[$handle]->{'modules'}[$i]{'voltage-max'} = $voltage_max; + $ram[$handle]->{'modules'}[$i]{'voltage-min'} = $voltage_min; $i++ } elsif ($entry->[0] < 17){ @@ -20563,7 +20651,9 @@ sub process_data { 'slots' => $item->{'slots-16'}, 'slots-qualifier' => $est_slots, 'use' => $item->{'use'}, - 'voltage' => $item->{'voltage'}, + 'voltage-config' => $item->{'voltage-config'}, + 'voltage-max' => $item->{'voltage-max'}, + 'voltage-min' => $item->{'voltage-min'}, }); } eval $end if $b_log; @@ -22770,12 +22860,16 @@ sub gpu_data { ## SlotItem { package SlotItem; +my ($sys_slots); sub get { eval $start if $b_log; my ($data,@rows,$key1,$val1); my $num = 0; if ($fake{'dmidecode'} || ($alerts{'dmidecode'}->{'action'} eq 'use' && (!%risc || $use{'slot-tool'}))){ + if ($b_admin && -e '/sys/devices/pci0000:00'){ + slot_data_sys(); + } $data = slot_data_dmi(); @rows = slot_output($data) if $data; if (!@rows){ @@ -22836,13 +22930,8 @@ sub slot_output { $rows[$j]->{main::key($num++,0,2,'MHz')} = $slot_data->{'mhz'}; } $rows[$j]->{main::key($num++,0,2,'status')} = $slot_data->{'usage'}; - if ($slot_data->{'j'} || $slot_data->{'m2'}){ - my $info = ($slot_data->{'m2'}) ? $slot_data->{'m2'} : ''; - if ($slot_data->{'j'}){ - $info .= ' ' if $info; - $info .= $slot_data->{'j'}; - } - $rows[$j]->{main::key($num++,0,2,'info')} = $info; + if ($slot_data->{'extra'}){ + $rows[$j]->{main::key($num++,0,2,'info')} = join(', ', @{$slot_data->{'extra'}}); } if ($extra > 1){ $slot_data->{'length'} ||= 'N/A'; @@ -22850,19 +22939,40 @@ sub slot_output { if ($slot_data->{'cpu'}){ $rows[$j]->{main::key($num++,0,2,'cpu')} = $slot_data->{'cpu'}; } + if ($slot_data->{'volts'}){ + $rows[$j]->{main::key($num++,0,2,'volts')} = $slot_data->{'volts'}; + } } if ($extra > 0){ $slot_data->{'bus_address'} ||= 'N/A'; - $rows[$j]->{main::key($num++,0,2,'bus-ID')} =$slot_data->{'bus_address'}; + $rows[$j]->{main::key($num++,1,2,'bus-ID')} = $slot_data->{'bus_address'}; + if ($b_admin && $slot_data->{'children'}){ + children_output(\@rows,$j,\$num,$slot_data->{'children'},3); + } } } eval $end if $b_log; return @rows; } -sub slot_children { - eval $start if $b_log; - - eval $end if $b_log; +sub children_output { + my ($rows,$j,$num,$children,$ind) = @_; + my $cnt = 0; + $rows->[$j]{main::key($$num++,1,$ind,'children')} = ''; + $ind++; + foreach my $id (sort keys %{$children}){ + $cnt++; + $rows->[$j]{main::key($$num++,1,$ind,$cnt)} = $id; + if ($children->{$id}{'class-id'} && $children->{$id}{'class-id-sub'}){ + my $class = $children->{$id}{'class-id'} . $children->{$id}{'class-id-sub'}; + $rows->[$j]{main::key($$num++,0,($ind + 1),'class-ID')} = $class; + if ($children->{$id}{'class'}){ + $rows->[$j]{main::key($$num++,0,($ind + 1),'type')} = $children->{$id}{'class'}; + } + } + if ($children->{$id}{'children'}){ + children_output($rows,$j,$num,$children->{$id}{'children'},$ind + 1); + } + } } sub slot_data_dmi { eval $start if $b_log; @@ -22870,7 +22980,7 @@ sub slot_data_dmi { my @slots; foreach my $slot_data (@dmi){ next if $slot_data->[0] != 9; - my %data; + my (%data,@extra); # skip first two row, we don't need that data foreach my $item (@$slot_data[2 .. $#$slot_data]){ if ($item !~ /^~/){ # skip the indented rows @@ -22887,14 +22997,20 @@ sub slot_data_dmi { if ($value[0] eq 'ID'){ $data{'id'} = $value[1]; } - if ($extra > 1 && $value[0] eq 'Length'){ + if ($value[0] eq 'Length'){ $data{'length'} = lc($value[1]); } - if ($extra > 1 && $value[0] eq 'Bus Address'){ + if ($value[0] eq 'Bus Address'){ $value[1] =~ s/^0000://; $data{'bus_address'} = $value[1]; + if ($b_admin && $sys_slots){ + $data{'children'} = slot_children($data{'bus_address'},$sys_slots); + } } } + elsif ($item =~ /^~([\d.]+)[\s-]?V is provided/){ + $data{'volts'} = $1; + } } if ($data{'type'} eq 'Other' && $data{'designation'}){ $data{'type'} = $data{'designation'}; @@ -22906,6 +23022,9 @@ sub slot_data_dmi { $string =~ s/(PCI[\s_-]?Express|Pci[_-]?e)/PCIe /ig; $string =~ s/PCI[\s_-]?X/PCIX /ig; $string =~ s/Mini[\s_-]?PCI/MiniPCI /ig; + $string =~ s/Media[\s_-]?Card/MediaCard/ig; + $string =~ s/Express[\s_-]?Card/ExpressCard/ig; + $string =~ s/Card[\s_-]?Bus/CardBus/ig; $string =~ s/PCMCIA/PCMCIA /ig; if (!$data{'pci'} && $string =~ /(AGP|ISA|MiniPCI|PCIe|PCIX|PCMCIA|PCI)/){ $data{'pci'} = $1; @@ -22922,18 +23041,21 @@ sub slot_data_dmi { if (!$data{'lanes-active'} && $string =~ /^x\d+ .*? x(\d+)/){ $data{'lanes-active'} = $1; } - if (!defined $data{'slot'} && $string =~ s/SLOT-?(\d+)?\b//){ - $data{'slot'} = $1 if defined $1; - } # legacy format, seens with PCI-X/PCIe mobos: PCIX#2-100MHz, PCIE#3-x8 if (!defined $data{'id'} && $string =~ /(#|PCI)(\d+)\b/){ $data{'id'} = $2; } - if (!$data{'j'} && $string =~ s/\bJ-?(\S+)\b//){ - $data{'j'} = 'J' . $1; + if (!defined $data{'id'} && $string =~ /SLOT[\s-]?(\d+)\b/i){ + $data{'id'} = $1; } - if (!$data{'m2'} && $string =~ s/\bM\.?2\b//){ - $data{'m2'} = 'M.2'; + if ($string =~ s/\bJ-?(\S+)\b//){ + push(@extra,'J' . $1) if ! grep {$_ eq 'J' . $1} @extra; + } + if ($string =~ s/\bM\.?2\b//){ + push(@extra,'M.2') if ! grep {$_ eq 'M.2'} @extra; + } + if ($string =~ /(ExpressCard|MediaCard|CardBus)/){ + push(@extra,$1) if ! grep {$_ eq $1} @extra; } if (!$data{'cpu'} && $string =~ s/CPU-?(\d+)\b//){ $data{'cpu'} = $1; @@ -22950,6 +23072,12 @@ sub slot_data_dmi { } $i++; } + if (!$data{'pci'} && $data{'type'} && + $data{'type'} =~ /(ExpressCard|MediaCard|CardBus)/){ + $data{'pci'} = $1; + @extra = grep {$_ ne $data{'pci'}} @extra; + } + $data{'extra'} = [@extra] if @extra; push(@slots,{%data}) if %data; } print '@slots: ', Data::Dumper::Dumper \@slots if $dbg[48]; @@ -22957,6 +23085,80 @@ sub slot_data_dmi { eval $end if $b_log; return \@slots if @slots; } +sub slot_data_sys { + eval $start if $b_log; + my $path = '/sys/devices/pci0000:*/00*'; + my @data = main::globber($path); + my ($full,$id); + foreach $full (@data){ + $id = $full; + $id =~ s/^.*\/\S+:([0-9a-f]{2}:[0-9a-f]{2}\.[0-9a-f]+)$/$1/; + $sys_slots->{$id} = slot_data_recursive($full); + } + print 'sys_slots: ', Data::Dumper::Dumper $sys_slots if $dbg[49]; + main::log_data('dump','$sys_slots',$sys_slots) if $b_log; + eval $end if $b_log; +} +sub slot_data_recursive { + eval $start if $b_log; + my $path = shift @_; + my $info = {}; + my $id = $path; + $id =~ s/^.*\/\S+:(\S{2}:\S{2}\.\S+)$/$1/; + my ($content,$id2,@files); + # @files = main::globber("$full/{class,current_link_speed,current_link_width,max_link_speed,max_link_width,00*}"); + if (-e "$path/class" && ($content = main::reader("$path/class",'strip',0))){ + if ($content =~ /^0x(\S{2})(\S{2})/){ + $info->{'class-id'} = $1; + $info->{'class-id-sub'} = $2; + $info->{'class'} = DeviceData::pci_class($1); + if ($info->{'class-id'} eq '06'){ + my @files = main::globber("$path/00*:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f].[0-9a-f]"); + foreach my $item (@files){ + $id = $item; + $id =~ s/^.*\/[0-9a-f]+:([0-9a-f]{2}:[0-9a-f]{2}\.[0-9a-f]+)$/$1/; + $info->{'children'}{$id} = slot_data_recursive($item); + } + } + } + } + if (-e "$path/current_link_speed" && + ($content = main::reader("$path/current_link_speed",'strip',0))){ + $content =~ s/\sPCIe//i; + $info->{'current-link-speed'} = main::clean_dmi($content); + } + if (-e "$path/current_link_width" && + ($content = main::reader("$path/current_link_width",'strip',0))){ + $info->{'current-link-width'} = $content; + } + eval $end if $b_log; + return $info; +} +sub slot_children { + eval $start if $b_log; + my ($bus_id,$slots) = @_; + my $children = slot_children_recursive($bus_id,$slots); + # $children->{'0a:00.0'}{'children'} = {'3423' => { + # 'class' => 'test','class-id' => '05','class-id-sub' => '10'}}; + print $bus_id, ' children: ', Data::Dumper::Dumper $children if $dbg[49]; + main::log_data('dump','$children',$children) if $b_log; + eval $end if $b_log; + return $children; +} +sub slot_children_recursive { + my ($bus_id,$slots) = @_; + my $children; + foreach my $key (keys %{$slots}){ + if ($slots->{$bus_id}){ + $children = $slots->{$bus_id}{'children'} if $slots->{$bus_id}{'children'}; + last; + } + elsif ($slots->{$key}{'children'}){ + slot_children_recursive($bus_id,$slots->{$key}{'children'}); + } + } + return $children; +} } ## SwapItem @@ -25084,7 +25286,6 @@ sub set_xprop { } -## DeviceData / PCI / SOC # creates arrays: $devices{'audio'}; $devices{'graphics'}; $devices{'hwraid'}; # $devices{'network'}; $devices{'timer'} and local @devices for logging/debugging # 0 type @@ -26158,9 +26359,12 @@ sub get_display_manager { # Not verified: qingy emptty; greetd.run verified, but alternate: # greetd-684.sock if no .run seen. Add Ly in case they add run file/directory. # greetd frontends: agreety dlm gtkgreet qtgreet tuigreet wlgreet - my @dms = qw(cdm emptty entranced gdm gdm3 greetd kdm kdm3 ldm lightdm lxdm ly - mdm nodm pcdm qingy sddm slim tbsm tdm udm wdm xdm xenodm); - # these are the only one I know of so far that have version info + # mlogin may be mlogind, not verified + my @dms = qw(brzdm cdm clogin emptty entranced gdm gdm3 greetd kdm kdm3 ldm + lightdm lxdm ly mdm mlogin nodm pcdm qingy sddm slim tbsm tdm udm wdm xdm + xenodm xlogin); + # these are the only one I know of so far that have version info. xlogin / + # clogin do, -V, brzdm -v, but syntax not verified. my @dms_version = qw(gdm gdm3 lightdm ly slim); my $pattern = ''; if (-d '/run'){ @@ -26928,6 +27132,7 @@ sub generate_data { # $file = "$ENV{'HOME'}/bin/scripts/inxi/data/ram/dmidecode-speed-configured-2.txt"; # $file = "$ENV{'HOME'}/bin/scripts/inxi/data/ram/00srv-dmidecode-mushkin-1.txt"; # $file = "$ENV{'HOME'}/bin/scripts/inxi/data/dmidecode/dmidecode-slots-pcix-pcie-1.txt"; + # $file = "$ENV{'HOME'}/bin/scripts/inxi/data/dmidecode/dmidecode-Microknopix-pci-vga-types-5-6-16-17.txt"; # open(my $fh, '<', $file) or die "can't open $file: $!"; # chomp(@data = <$fh>); } @@ -28586,37 +28791,37 @@ sub parse_edid { sub _edid_errors { my $edid = shift @_; if (!defined $edid->{edid_version}){ - _edid_error('edid-version','undefined'); + _edid_error($edid,'edid-version','undefined'); } elsif ($edid->{edid_version} < 1 || $edid->{edid_version} > 2){ - _edid_error('edid-version',$edid->{edid_version}); + _edid_error($edid,'edid-version',$edid->{edid_version}); } if (!defined $edid->{edid_revision}){ - _edid_error('edid-revision','undefined'); + _edid_error($edid,'edid-revision','undefined'); } elsif ($edid->{edid_revision} == 0xff){ - _edid_error('edid-revision',$edid->{edid_revision}); + _edid_error($edid,'edid-revision',$edid->{edid_revision}); } if ($edid->{monitor_range}){ if (!$edid->{monitor_range}{horizontal_min}){ - _edid_error('edid-sync','no horizontal'); + _edid_error($edid,'edid-sync','no horizontal'); } elsif ($edid->{monitor_range}{horizontal_min} > $edid->{monitor_range}{horizontal_max}){ - _edid_error('edid-sync', + _edid_error($edid,'edid-sync', "bad horizontal values: min: $edid->{monitor_range}{horizontal_min} max: $edid->{monitor_range}{horizontal_max}"); } if (!$edid->{monitor_range}{vertical_min}){ - _edid_error('edid-sync','no vertical'); + _edid_error($edid,'edid-sync','no vertical'); } elsif ($edid->{monitor_range}{vertical_min} > $edid->{monitor_range}{vertical_max}){ - _edid_error('edid-sync', + _edid_error($edid,'edid-sync', "bad vertical values: min: $edid->{monitor_range}{vertical_min} max: $edid->{monitor_range}{vertical_max}"); } } } sub _edid_error { my ($edid,$error,$data) = @_; - $edid->{edid_errors} = [] if !$edid->{edid_error}; + $edid->{edid_errors} = [] if !$edid->{edid_errors}; push(@{$edid->{edid_errors}},main::message($error,$data)); } sub _nearest_ratio { diff --git a/inxi.1 b/inxi.1 index 7e37418..aa69d3d 100644 --- a/inxi.1 +++ b/inxi.1 @@ -1,5 +1,5 @@ .\" inxi.1 - manpage for inxi system information tool -.\" Copyright (C) 2021 Harald Hope +.\" Copyright (C) 2022 Harald Hope .\" .\" This program is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by @@ -15,7 +15,7 @@ .\" with this program; if not, write to the Free Software Foundation, Inc., .\" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. .\" -.TH INXI 1 "2022\-03\-24" "inxi" "inxi manual" +.TH INXI 1 "2022\-04\-08" "inxi" "inxi manual" .SH NAME inxi \- Command line system information script for console and IRC @@ -62,6 +62,51 @@ filtering with the \fB\-z\fR option (\fB\-Fz\fR, for example). To override the IRC filter, you can use the \fB\-Z\fR option. This can be useful in debugging network connection issues online in a private chat, for example. +.SH TABLE OF CONTENTS +This man page is pretty long and information packed. It is divided into the +following sections: + +* \fBUSING OPTIONS\fR How to use the command line options. + +* \fBSTANDARD OPTIONS\fR Primary data types trigger items. + +* \fBFILTER OPTIONS\fR Apply a variety of output filters. + +* \fBOUTPUT CONTROL OPTIONS\fR Change default colors, widths, heights, output +types, etc. + +* \fBEXTRA DATA OPTIONS\fR What \fB\-x\fR, \fB\-xx\fR, and \fB\-xxx\fR add to +the output per primary data type. + +* \fBADMIN EXTRA DATA OPTIONS\fR What \fB\-a\fR adds to the output per primary +data type. These have a lot of information because this is advanced admin data, +which are not always intuitive or easy to understand. + +* \fBADVANCED OPTIONS\fR Modify behavior or choice of data sources, and other +advanced switches. + +* \fBDEBUGGING OPTIONS\fR For development use mainly, or contributing datasets +to the project. + +* \fBDEBUGGING OPTIONS TO DEBUG DEBUGGER FAILURES\fR Only for advanced users, +sometimes something will hang the debuggers, this shows you various ways to get +around those failures. + +* \fBSUPPORTED IRC CLIENTS\fR List of known good IRC clients. Not checked often, +let us know if something is not working. + +* \fBRUNNING IN IRC CLIENT\fR How to run inxi in various IRC clients. + +* \fBCONFIGURATION FILE\fR Configuration file locations and priority in using. + +* \fBCONFIGURATION OPTIONS\fR Most of the commonly used configuration options, +along with sample values. + +* \fBBUGS\fR How and where to report bugs. + +* \fBHOMEPAGE\fR, \fBAUTHOR AND CONTRIBUTORS TO CODE\fR, \fBSPECIAL THANKS TO +THE FOLLOWING\fR These are self explanitory. + .SH USING OPTIONS Options can be combined if they do not conflict. You can either group the letters together or separate them. @@ -79,24 +124,6 @@ Note that all the short form options have long form equivalents, which are listed below. However, usually the short form is used in examples in order to keep things simple. -These are available options sections: - -* \fBSTANDARD OPTIONS\fR Primary data types trigger items. - -* \fBFILTER OPTIONS\fR Apply a variety of output filters. - -* \fBOUTPUT CONTROL OPTIONS\fR Change default colors, widths, heights, output -types, etc. - -* \fBEXTRA DATA OPTIONS\fR What \fB\-x\fR, \fB\-xx\fR, \fB\-xxx\fR, and \fB\-a\fR -add to the output. - -* \fBADVANCED OPTIONS\fR Modify behavior or choice of data sources, and other -advanced switches. - -* \fBDEBUGGING OPTIONS\fR For development use mainly, or contributing datasets to -the project. - .SH STANDARD OPTIONS .TP @@ -444,13 +471,12 @@ Other types of logical block handling like LUKS, bcache show as: .TP .B \-m \fR, \fB\-\-memory\fR -Memory (RAM) data. Does not display with \fB\-b\fR or \fB\-F\fR unless you -use \fB\-m\fR explicitly. Ordered by system board physical system memory -array(s) (\fBArray\-[number]\fR), and individual memory devices -(\fBDevice\-[number]\fR). Physical memory array data shows array capacity, -number of devices supported, and Error Correction information. Devices shows -locator data (highly variable in syntax), size, speed, type -(eg: \fBtype: DDR3\fR). +Memory (RAM) data. Does not display with \fB\-b\fR or \fB\-F\fR unless you use +\fB\-m\fR explicitly. Ordered by system board physical system memory array(s) +(\fBArray\-[number]\fR), and individual memory devices (\fBDevice\-[number]\fR). +Physical memory array data shows array capacity, number of devices supported, +and Error Correction information. Devices shows locator data (highly variable in +syntax), type (eg: \fBtype: DDR3\fR)size, speed. Note: \fB\-m\fR uses \fBdmidecode\fR, which must be run as root (or start \fBinxi\fR with \fBdoas/sudo\fR), unless you figure out how to set up doas/sudo @@ -488,11 +514,11 @@ If the detected speed is logically absurd, like 1 MT/s or 69910 MT/s, adds: \fBMemory: RAM: total: 31.38 GiB used: 20.65 GiB (65.8%) Array\-1: capacity: N/A slots: 4 note: check EC: N/A - Device\-1: DIMM_A1 size: 8 GiB speed: 1600 MT/s (800 MHz) - Device\-2: DIMM_A2 size: 8 GiB speed: spec: 1600 MT/s (800 MHz) + Device\-1: DIMM_A1 type: DDR3 size: 8 GiB speed: 1600 MT/s (800 MHz) + Device\-2: DIMM_A2 type: DDR3 size: 8 GiB speed: spec: 1600 MT/s (800 MHz) actual: 61910 MT/s (30955 MHz) note: check - Device\-3: DIMM_B1 size: 8 GiB speed: 1600 MT/s (800 MHz) - Device\-4: DIMM_B2 size: 8 GiB speed: spec: 1600 MT/s (800 MHz) + Device\-3: DIMM_B1 type: DDR3 size: 8 GiB speed: 1600 MT/s (800 MHz) + Device\-4: DIMM_B2 type: DDR3 size: 8 GiB speed: spec: 1600 MT/s (800 MHz) actual: 2 MT/s (1 MHz) note: check\fR .fi @@ -1286,8 +1312,6 @@ tracking down which device belongs to what. Only some systems will have this data available. Shows estimate if it can generate one. -\- Adds device type in the Device line. - .TP .B \-x \-N\fR \- Adds (if available and/or relevant) \fBvendor:\fR item, which shows @@ -1333,8 +1357,7 @@ found for each distribution system base detection. .TP .B \-x \-\-slots\fR -\- Adds \fBbus\-ID:\fR. Note that this bus ID does not unfortunately appear to -be readily detected as the source bus ID for any particular device bus ID. +\- Adds slot \fBbus\-ID:\fR, if found. .TP .B \-x \-t\fR (\fB\-\-processes\fR) @@ -1531,6 +1554,11 @@ serial number. 100% right all of the time since it depends on the order that data is found in \fBdmidecode\fR output for \fBtype 6\fR and \fBtype 17\fR. +\- Adds, if present, memory array voltage. Only some legacy systems will have +this data available. + +\- Adds memory module current configured operating voltage, if available. + .TP .B \-xx \-M\fR \- Adds chassis information, if data is available. Also shows BIOS @@ -1575,6 +1603,8 @@ running. If none found, shows nothing. Uses a less accurate fallback tool .B \-xx \-\-slots\fR \- Adds slot length. +\- Adds slot voltage, if available. + .TP .B \-xx \-w \fR, \fB\-W\fR \- Adds wind chill, heat index, and dew point, if available. @@ -1686,18 +1716,24 @@ uses the \fBwhoami\fR test. .TP .B \-xxx \-m\fR, \fB\-\-memory\-modules\fR \- Adds memory bus width: primary bus width, and if present, total width. e.g. -\fBbus width: 64 bit (total: 72 bits)\fR. Note that total / data widths are -mixed up sometimes in dmidecode output, so inxi will take the larger value as -the total if present. If no total width data is found, then inxi will not show -that item. -\- Adds device Type Detail, e.g. \fBdetail: DDR3 (Synchronous)\fR. +\fBwidth (bits): data: 64 total: 72\fR -\- Adds, if present, memory module voltage. Only some systems will have this -data available. +Note that total / data widths are mixed up sometimes in dmidecode output, so +inxi will take the larger value as the total if present. \fBData\fR width +usually corresponds to the CPU bits. \fBTotal\fR can reflect EEC or Dual Channel +widths. If no total width data is found, shows: + +\fBwidth: N/A\fR + +\- Adds device type detail, e.g. \fBtype: DDR3 detail: Synchronous\fR. \- Adds device serial number. +\- Adds memory module current, max, and min voltages, if they are available and +different from each other. If they are the identical, displays same as +\fB\-xxm\fR voltage report. Use \fB\-ma\fR to always see them. + .TP .B \-xxx \-N\fR \- Adds, if present, serial number. @@ -2021,6 +2057,10 @@ mapped name for logical components. Puts each component/device on its own line. \- Adds maj-min to LV and other devices. +.TP +.B \-a \-m\fR +\- Expands volts to include curr/min/max values even if they are all identical. + .TP .B \-a \-n\fR, \fB\-a \-N\fR, \fB\-a \-i\fR \- Adds, if present, possible \fBalternate:\fR kernel modules capable of driving @@ -2071,6 +2111,28 @@ Component report to 1 component per line. \- Adds kernel boot parameters to \fBKernel\fR section (if detected). Support varies by OS type. +.TP +.B \-a \-\-slots\fR +\- Adds PCI children of the main slot bus ID, and their types and class IDs, +recursively. Linux only, and only if detected. Sample: + +.nf +\fBSlot: 0 + type: PCIe + lanes: 16 + status: in use + length: long + volts: 3.3 + bus\-ID: 00:03.1 + children: + 1: 07:00.0 + class\-ID: 0300 + type: display + 2: 07:00.1 + class\-ID: 0403 + type: audio\fR +.fi + .SH ADVANCED OPTIONS .TP diff --git a/inxi.changelog b/inxi.changelog index 0dace8a..531e28a 100644 --- a/inxi.changelog +++ b/inxi.changelog @@ -1,3 +1,145 @@ +================================================================================ +Version: 3.3.15 +Patch: 00 +Date: 2022-04-08 +-------------------------------------------------------------------------------- +RELEASE NOTES: +-------------------------------------------------------------------------------- + +Bug fix, it's a bad edid data bug, rare, but when it trips, kills inxi execution +dead right before -G/Graphics shows. Also some nice fixes and enhancements. + +-------------------------------------------------------------------------------- +KNOWN ISSUES: + +1. Possible case of Gnome Wayland failing to set any gnome environmental +variables, making wayland detection not possible. This was in anonymous dataset +inxi-proBook4540s dataset. Person never appeared in real life so can't follow up +on it. This cascaded down to other failures in display detection, and desktop +detection, though in theory much of the data needed was present. I expect +similar issues may appear with kde wayland. This is/was probably a configuration +or build error I believe, though not enough data yet. + +It appears that sudo start disabled the display environmental variable +detections, which is unfortunate, and the fallback loginctl tests do not appear +to work for unknown reasons. I've confirmed this on Fedora stock Gnome as well. + +-------------------------------------------------------------------------------- +BUGS: + +1. Forgot to test that return from get_display_manager is array ref, this +impacts only a tiny handful of distros probably, TinyCore was one, but it is +a fatal failure, so fixed it. Also fixed in 3.3.14 inxi branch. Never trips in +console, only on tiny linux where no dm is used at all, I think Xvesa might be +the only case this would have tripped. + +2. EDID errors and warnings had several bugs, errors a fatal critical bug which +made execution stop. Had forgotten to pass the $edid hash reference to the error +constructor. Also had used wrong hash key in output so would never have shown. + +-------------------------------------------------------------------------------- +FIXES: + +1. Corrected ram device indentation levels. + +2. Made memory width more clear with: width: data: total: which more +accurately reflects the source data. Also in cases where no data or total +values, only show width: N/A, not the data: total: sub items. + +3. Made edid errors/warnings output to numbered list of warnings/errors instead +of using join() to made one long list. Much more consistent that way. This fixes +issue #266 - thanks SheridanOAI for finding this bug. + +4. In --slots, -x wasn't loading the bus ID so it showed N/A, unnecessary data +collection granularity, removed. + +5. For Display, if no X or gpu driver, show: driver: N/A. Showed driver: gpu: +N/A before. + +6. For Display, remove filters for Xwayland tests, we always want to see +xwayland data if it's installed. This was actually an error to not show it since +display_server_data already had the correct tests to not redo Xorg data if found +previously, which would be glxinfo based data. This is a partial fix also for +Known Issue 1, at least we'll see Xwayland is present even if Wayland detections +failed for unkonwn reasons. + +7. Added some ram value dmi filters, found some that had 'none' or 'unknown'. + +8. Show display protocol out of display!! Also handles most common root use +cases as well, so in most cases, if the initial protocol detections failed, this +will result in a decent attempt, though if root it is less reliable. sudo or +regular user will be fine since looks for not tty/pts TTY type and username. + +This should also help narrow down Known Issue 1 failures, though there are more +cases to be dealt with, but can only chip away since not enough data. + +9. Made info: item in slots more robust, and able to handle more diverse +scenarios. + +10. Added alternate syntaxes for dmidecode permissions errors. + +-------------------------------------------------------------------------------- +ENHANCEMENTS: + +1. Added brzdm clogin mlogind xlogin display managers. Not verified. Version for +brzdm is probably like slim since brzdm is a fork of slim. + +2. Added voltages to ram module report, that had been left out. Note that it's +common for voltages to be either 'unknown' or not present at all. This is as +close as inxi can get to handling issue #265 since there is no other source for +the requested data type (show DDR3L, low voltage DDR3, which doesn't exist as a +type in dmidecode). + +3. Added voltages to --slots report, --slots -xx. Only shows if present. + +4. Added for --slots -a for Linux, if detected, the PCI children of the bus ID +of the slot. This is recursive, so supports as many levels as are present, +though it would be rare for there to be more than one level of children. + +-------------------------------------------------------------------------------- +CHANGES: + +1. In -m ram report, moved ram type before size/speed/voltage, that makes more +sense. + +2. Also in -m ram report, make type: the default value (was an -x options +before), which contains the no module found messages etc, making the order: + Device-1: DIMM 0 type: no module installed + Device-2: DIMM 1 type: DDR4 size: 16 GiB speed: 2400 MT/s + +This puts all the speed/size/voltage data together, and stops putting the no +module found message in speed, which never made any sense. + +2. In -m, changed width data to more clearly reflect the data source: + width (bits): + data: 64 + total: 72 + +-------------------------------------------------------------------------------- +DOCUMENTATION: + +1. Man page, added a TABLE OF CONTENTS section which lists all the primary +sections. Can help since the man page has gotten so darned long and man doesn't +as far as I know support clickable internal links, sadly. + +2. For -m, updated for revised output syntax and -x levels. Note that the help +and man actually had the type: as default for -m, not -mx, but for some reason, +the code had it wrong. Oops. + +3. For -m, fixed some legacy output syntax in the examples. + +-------------------------------------------------------------------------------- +CODE: + +1. Some refactors of slots, ram, as well as a bit more refactoring of edid stuff +for graphics. + +2. Added $ENV{'DISPLAY'} to debugger data collector, no idea why that was left +out. + +-------------------------------------------------------------------------------- +-- Harald Hope - Thu, 8 April 2022 22:46:26 -0700 + ================================================================================ Version: 3.3.14 Patch: 00