aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2022-04-09 01:09:36 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2022-04-09 01:09:36 -0400
commitb9fb50643c0806c57385816761cca8170826c1bf (patch)
tree902299c0b8a052f80b04c9cdd5aa9dda1e52a6c1
parent53fa8a4c9c192af8ed408892828f77dd09679e7f (diff)
downloadinxi-b9fb50643c0806c57385816761cca8170826c1bf.tar.bz2
inxi-b9fb50643c0806c57385816761cca8170826c1bf.tar.xz
inxi-b9fb50643c0806c57385816761cca8170826c1bf.tar.zst
New upstream version 3.3.15-1.upstream/3.3.15-1
-rwxr-xr-xinxi423
-rw-r--r--inxi.1146
-rw-r--r--inxi.changelog142
3 files changed, 560 insertions, 151 deletions
diff --git a/inxi b/inxi
index 1f983d1..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-24';
+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];
+ my $gpu_drivers = gpu_drivers_sys('all');
+ 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];
+ }
}
- if ($x_drivers->[2]){
- $row[0]->{main::key($num++,0,4,'failed')} = $x_drivers->[2];
+ my $drivers;
+ if ($gpu_drivers){
+ $drivers = join(',',@{$gpu_drivers});
}
- if ($extra > 1 && $x_drivers->[3]){
- $row[0]->{main::key($num++,0,4,'alternate')} = $x_drivers->[3];
+ else {
+ $drivers = ($graphics{'gpu-drivers'}) ? join(',',@{$graphics{'gpu-drivers'}}): 'N/A';
}
- }
- my $gpu_drivers = gpu_drivers_sys('all');
- my $drivers;
- if ($gpu_drivers){
- $drivers = join(',',@{$gpu_drivers});
+ $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 ($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 (!$data{'m2'} && $string =~ s/\bM\.?2\b//){
- $data{'m2'} = 'M.2';
+ 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 {
@@ -31025,7 +31230,7 @@ sub system_item {
else {
my $dm = ($dms && $dms->[0][0]) ? $dms->[0][0] : 'N/A';
$data{$data_name}->[$index]{main::key($num++,1,$ind_dm,$dm_key)} = $dm;
- if ($dms->[0][1]){
+ if ($dms && $dms->[0][1]){
$data{$data_name}->[$index]{main::key($num++,0,($ind_dm + 1),'v')} = $dms->[0][1];
}
}
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
+
+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:
-\- Adds, if present, memory module voltage. Only some systems will have this
-data available.
+\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.
@@ -2022,6 +2058,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
each \fBDevice\-x\fR (not including the current \fBdriver:\fR). If no
@@ -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..23acbdb 100644
--- a/inxi.changelog
+++ b/inxi.changelog
@@ -1,4 +1,146 @@
================================================================================
+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. Never trips in console, only on tiny linux where no
+dm is used at all. Tripped with Xvesa, seen other bug reports, but not enough
+data to know for sure.
+
+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
Date: 2022-03-24