aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Unit 193 <unit193@unit193.net>2024-04-16 02:54:30 -0400
committerLibravatar Unit 193 <unit193@unit193.net>2024-04-16 02:54:30 -0400
commitc81a0473e828413b178398802646062c98b5beab (patch)
tree0204ed474f8f717f9207b318fbb28804cb6fbac1
parentbfd00ee5282d7f8f9c4d81d37fbba99aa582fd70 (diff)
downloadinxi-upstream.tar.bz2
inxi-upstream.tar.xz
inxi-upstream.tar.zst
New upstream version 3.3.34-1.upstream/3.3.34-1upstream
-rw-r--r--README.txt14
-rwxr-xr-xinxi295
-rw-r--r--inxi.12
-rw-r--r--inxi.changelog159
4 files changed, 345 insertions, 125 deletions
diff --git a/README.txt b/README.txt
index 27e35e4..92f89db 100644
--- a/README.txt
+++ b/README.txt
@@ -2,8 +2,8 @@
README for inxi - a command line system information tool
================================================================================
FILE: README.txt
-VERSION: 6.0
-DATE: 2024-01-14
+VERSION: 6.1
+DATE: 2024-03-28
The new faster, more powerful Perl inxi is here! File all issue reports with the
master branch. All support for versions prior to 3.0 is ended.
@@ -26,14 +26,8 @@ inxi-perl > https://codeberg.org/smxi/pinxi master
master > https://codeberg.org/smxi/inxi master
tarballs > https://codeberg.org/smxi/inxi-tarballs master
-inxi-perl branch has been rebuilt and now only contains the pinxi, pinxi.1
-files, plus a minimal README.txt for github users. docs and tarballs have been
-deleted. The inxi-perl branch should not be used, and exists only so that
-current pinxi users can update from there to get the new version with new URLs.
-
-inxi master will be mirrored to github until most packagers have switched to
-using codeberg. inxi-perl/pinxi no longer gets updates, and exists only to let
-users update to a version with the new self updater codeberg URLs.
+No syncing to github smxi repos has been done since December, 2023. Github
+versions are out of date.
The inxi repo only contains master, plus the one, two branches, which are
obsolete.
diff --git a/inxi b/inxi
index 5edb0d2..92e8cb3 100755
--- a/inxi
+++ b/inxi
@@ -49,8 +49,8 @@ use POSIX qw(ceil uname strftime ttyname);
## INXI INFO ##
my $self_name='inxi';
-my $self_version='3.3.33';
-my $self_date='2024-02-06';
+my $self_version='3.3.34';
+my $self_date='2024-04-13';
my $self_patch='00';
## END INXI INFO ##
@@ -422,9 +422,13 @@ sub set_basics {
$ENV{'LC_ALL'}='C';
# remember, perl uses the opposite t/f return as shell!!!
# some versions of busybox do not have tty, like openwrt
- $b_irc = (check_program('tty') && system('tty >/dev/null')) ? 1 : 0;
+ $b_irc = 1 if (check_program('tty') && system('tty >/dev/null'));
# print "birc: $b_irc\n";
- $b_display = ($ENV{'DISPLAY'}) ? 1 : 0;
+ # with X, DISPLAY sets, then check Wayland, other DE/WM sessions
+ if ($ENV{'DISPLAY'} || $ENV{'WAYLAND_DISPLAY'} ||
+ $ENV{'XDG_CURRENT_DESKTOP'} || $ENV{'DESKTOP_SESSION'}){
+ $b_display = 1;
+ }
$b_root = $< == 0; # root UID 0, all others > 0
$dl{'dl'} = 'curl';
$dl{'curl'} = 1;
@@ -6012,13 +6016,13 @@ my $pppid = '';
sub set {
eval $start if $b_log;
- PsData::set_cmd() if !$loaded{'ps-cmd'};
# $b_irc = 1; # for testing, like cli konvi start which shows as tty
if (!$b_irc){
# we'll run ShellData::set() for -I, but only then
}
else {
$use{'filter'} = 1;
+ PsData::set() if !$loaded{'ps-data'};
get_client_name();
if ($client{'konvi'} == 1 || $client{'konvi'} == 3){
set_konvi_data();
@@ -11504,7 +11508,8 @@ sub cp_cpu_arch {
$gen = '5';
$process = 'TSMC n3 (3nm)'; # turin could be 4nm, need more data
$year = '2023+';}
- elsif ($model =~ /^(20|40)$/){
+ # Strix Point; Granite Ridge; Krackan Point; Strix Halo
+ elsif ($model =~ /^(10|20|40|60|70)$/){
$arch = 'Zen 5';
$gen = '5';
$process = 'TSMC n3 (3nm)'; # desktop, granite ridge, confirm 2024
@@ -13917,7 +13922,7 @@ sub set_disk_vendors {
# HM320II HM320II HM
['(SAMSUNG|^(AWMB|[BC]DS20|[BC]WB|BJ[NT]|[BC]GND|CJ[NT]|CKT|CUT|[DG]3 Station|DUO\b|DUT|EB\dMW|E[CS]\d[A-Z]\d|FD\d[A-Z]\dGE4S5|[GS]2 Portable|GN|HD\d{3}[A-Z]{2}$|(HM|SP)\d{2}|HS\d|M[AB]G\d[FG]|MCC|MCBOE|MCG\d+GC|[CD]JN|MZ|^G[CD][1-9][QS]|P[BM]\d|(SSD\s?)?SM\s?841)|^SSD\s?[89]\d{2}\s(DCT|PRO|QVD|\d+[GT]B)|\bEVO\b|SV\d|[BE][A-Z][1-9]QT|YP\b|[CH]N-M|MMC[QR]E)','SAMSUNG','Samsung',''], # maybe ^SM, ^HM
# Android UMS Composite?U1
- ['(SanDisk|0781|^(A[BCD]LC[DE]|AFGCE|D[AB]4|DX[1-9]|Extreme|Firebird|S[CD]\d{2}G|SC\d{3,4}|SD(CF|S[S]?[ADQ]|SL\d+G|SU\d|U\d|\sUltra)|SDW[1-9]|SE\d{2}|SEM\d{2}|\d[STU]|U(3\b|1\d0))|Clip Sport|Cruzer|iXpand|SN(\d+G|128|256)|SSD (Plus|U1[01]0) [1-9]|ULTRA\s(FIT|trek|II)|X[1-6]\d{2})','(SanDisk|0781)','SanDisk',''],
+ ['(SanDisk|0781|^(A[BCD]LC[DE]|AFGCE|D[AB]4|DX[1-9]|Extreme|Firebird|S[CD]\d{2}G|SC\d{3,4}|SD(CF|S[S]?[ADQ]|SL\d+G|SU\d|U\d|\sUltra)|SDW[1-9]|SE\d{2}|SEM\d{2}|\d[STU]|U(3\b|1\d0))|Clip Sport|Cruzer|iXpand|SN(\d+G|128|256)|SSD (Plus|U1[01]0) [1-9]|ULTRA\s(FIT|trek|II)|^X[1-6]\d{2})','(SanDisk|0781)','SanDisk',''],
# these are HP/Sandisk cobranded. DX110064A5xnNMRI ids as HP and Sandisc
['(^DX[1-9])','^(HP\b|SANDDISK)','Sandisk/HP',''], # ssd drive, must come before seagate ST test
# real, SSEAGATE Backup+; XP1600HE30002 | 024 HN (spinpoint) ; possible usb: 24AS
@@ -14526,6 +14531,7 @@ sub disk_vendor {
# Data URLs: inxi-resources.txt Section: DriveItem device_vendor()
# $model = 'H10 HBRPEKNX0202A NVMe INTEL 512GB';
# $model = 'SD Ultra 3D 1TB';
+ # $model = 'ST8000DM004-2CX188_WCT193ZX';
set_disk_vendors() if !$vendors;
# prefilter this one, some usb enclosurs and wrong master/slave hdd show default
$model =~ s/^Initio[\s_]//i;
@@ -17579,7 +17585,7 @@ sub display_drivers_x {
chips cirrus cyrix etnaviv fbdev fbturbo fglrx geode glide glint
i128 i740 i810-dec100 i810e i810 i815 i830 i845 i855 i865 i915 i945 i965
iftv igs imstt intel ipaq ivtv mach64 mesa mga m68k modesetting neomagic
- newport nouveau nsc nvidia nv openchrome r128 radeonhd radeon rendition
+ newport nouveau nova nsc nvidia nv openchrome r128 radeonhd radeon rendition
s3virge s3 savage siliconmotion sisimedia sisusb sis sis530 sunbw2 suncg14
suncg3 suncg6 sunffb sunleo suntcx tdfx tga trident trio ts300 tseng
unichrome v4l vboxvideo vesa vga via vmware vmwgfx voodoo));
@@ -17685,6 +17691,7 @@ sub set_mesa_drivers {
'iris' => 'intel',
'lima' => 'mali',
'nouveau' => 'nvidia',
+ 'nova' => 'nvidia',
'panfrost' => 'mali/bifrost',
'r200' => 'amd',
'r300' => 'amd',
@@ -18026,8 +18033,8 @@ sub set_intel_data {
'years' => '2013',
},
{'arch' => 'Gen-7',
- 'ids' => '0152|0155|0156|0157|015a|015e|0162|0166|016a|0172|0176|0f31|0f32|' .
- '0f33',
+ 'ids' => '0152|0155|0156|0157|015a|015e|0162|0166|016a|0172|0176|0f30|0f31|' .
+ '0f32|0f33',
'code' => '',
'process' => 'Intel 22nm',
'years' => '2012-13',
@@ -18075,7 +18082,8 @@ sub set_intel_data {
},
{'arch' => 'Gen-12.2',
'ids' => '4626|4628|462a|4636|4638|463a|4682|4688|468a|468b|4690|4692|4693|' .
- '46a3|46a6|46a8|46aa|46b0|46b1|46b3|46b6|46b8|46ba|46c1|46c3|46d0|46d1|46d2',
+ '46a3|46a6|46a8|46aa|46b0|46b1|46b3|46b6|46b8|46ba|46c1|46c3|46d0|46d1|46d2|' .
+ '46d3|46d4',
'code' => '',
'process' => 'Intel 10nm',
'years' => '2021-22+',
@@ -18090,7 +18098,7 @@ sub set_intel_data {
{'arch' => 'Gen-12.7',
'ids' => '4f80|4f81|4f82|4f83|4f84|4f85|4f86|4f87|4f88|5690|5691|5692|5693|' .
'5694|5695|5696|5697|5698|56a0|56a1|56a3|56a4|56a5|56a6|56a7|56a8|56a9|56b0|' .
- '56b1|56b2|56b3|56ba|56bb|56bc|56bd',
+ '56b1|56b2|56b3|56ba|56bb|56bc|56bd|56be|56bf',
'code' => 'Alchemist',
'process' => 'TSMC n6 (7nm)',
'years' => '2022+',
@@ -18102,24 +18110,30 @@ sub set_intel_data {
'years' => '2022+',
},
{'arch' => 'Gen-13',
- 'ids' => 'a720|a721|a74d|a780|a781|a782|a783|a788|a789|a78a|a78b|a7a0|a7a1|' .
- 'a7a8|a7a9|a7aa|a7ab|a7ac|a7ad',
+ 'ids' => 'a70d|a720|a721|a74d|a780|a781|a782|a783|a788|a789|a78a|a78b|a7a0|' .
+ 'a7a1|a7a8|a7a9|a7aa|a7ab|a7ac|a7ad',
'code' => '',
'process' => 'Intel 7 (10nm)',
'years' => '2022+',
},
- {'arch' => 'Gen-14',
+ {'arch' => 'Gen-13',
'ids' => '7d40|7d45|7d55|7d60|7dd5',
'code' => '',
'process' => 'Intel 4 (7nm+)',
'years' => '2023+',
},
- {'arch' => 'Gen-15',
- 'ids' => '7d51|7d67|7dd1',
+ {'arch' => 'Gen-14',
+ 'ids' => '6420|64a0|64b0',
'code' => '',
'process' => 'TSMC 3nm',
'years' => '2024+',
},
+ {'arch' => 'Gen-15',
+ 'ids' => '7d41|7d51|7d67|7dd1',
+ 'code' => '',
+ 'process' => 'TSMC 3nm?',
+ 'years' => '2025+',
+ },
];
}
@@ -18380,13 +18394,14 @@ sub set_nv_data {
'1f07|1f08|1f0a|1f0b|1f10|1f11|1f12|1f14|1f15|1f36|1f42|1f47|1f50|1f51|1f54|' .
'1f55|1f76|1f82|1f83|1f91|1f95|1f96|1f97|1f98|1f99|1f9c|1f9d|1f9f|1fa0|1fb0|' .
'1fb1|1fb2|1fb6|1fb7|1fb8|1fb9|1fba|1fbb|1fbc|1fdd|1ff0|1ff2|1ff9|2182|2184|' .
- '2187|2188|2189|2191|2192|21c4|21d1|25a6|25a7|25a9|25aa|25ad|25ed|28b8|28f8',
+ '2187|2188|2189|2191|2192|21c4|21d1|25a6|25a7|25a9|25aa|25ad|25ed|28b0|28b8|' .
+ '28f8',
'code' => 'TUxxx',
'kernel' => '',
'legacy' => 0,
'process' => 'TSMC 12nm FF',
'release' => '',
- 'series' => '545.xx+',
+ 'series' => '550.xx+',
'status' => main::message('nv-current-eol',$date,'2026-12-xx'),
'xorg' => '',
'years' => '2018-2022',
@@ -18396,21 +18411,21 @@ sub set_nv_data {
'2204|2206|2207|2208|220a|220d|2216|2230|2231|2232|2233|2235|2236|2237|2238|' .
'2414|2420|2438|2460|2482|2484|2486|2487|2488|2489|248a|249c|249d|24a0|24b0|' .
'24b1|24b6|24b7|24b8|24b9|24ba|24bb|24c7|24c9|24dc|24dd|24e0|24fa|2503|2504|' .
- '2507|2508|2520|2521|2523|2531|2544|2560|2563|2571|2582|25a0|25a2|25a5|25ab|' .
- '25ac|25b6|25b8|25b9|25ba|25bb|25bc|25bd|25e0|25e2|25e5|25ec|25f9|25fa|25fb|' .
- '2838',
+ '2507|2508|2520|2521|2523|2531|2544|2560|2563|2571|2582|2584|25a0|25a2|25a5|' .
+ '25ab|25ac|25b6|25b8|25b9|25ba|25bb|25bc|25bd|25e0|25e2|25e5|25ec|25f9|25fa|' .
+ '25fb|2838',
'code' => 'GAxxx',
'kernel' => '',
'legacy' => 0,
'process' => 'TSMC n7 (7nm)',
'release' => '',
- 'series' => '545.xx+',
+ 'series' => '550.xx+',
'status' => main::message('nv-current-eol',$date,'2026-12-xx'),
'xorg' => '',
'years' => '2020-2023',
},
{'arch' => 'Hopper',
- 'ids' => '2321|2322|2324|2330|2331|2339|233a|2342',
+ 'ids' => '2321|2322|2324|2329|2330|2331|2339|233a|2342',
'code' => 'GH1xx',
'kernel' => '',
'legacy' => 0,
@@ -18422,15 +18437,15 @@ sub set_nv_data {
'years' => '2022+',
},
{'arch' => 'Lovelace',
- 'ids' => '2684|2685|26b1|26b2|26b3|26b5|26b9|26ba|2704|2705|2717|2730|2757|' .
- '2770|2782|2783|2786|27a0|27b0|27b1|27b2|27b6|27b8|27ba|27bb|27e0|27fb|2803|' .
- '2805|2820|2860|2882|28a0|28a1|28e0|28e1',
+ 'ids' => '2684|2685|26b1|26b2|26b3|26b5|26b9|26ba|2702|2704|2705|2709|2717|' .
+ '2730|2757|2770|2782|2783|2786|2788|27a0|27b0|27b1|27b2|27b6|27b8|27ba|27bb|' .
+ '27e0|27fb|2803|2805|2808|2820|2860|2882|28a0|28a1|28b9|28ba|28bb|28e0|28e1',
'code' => 'AD1xx',
'kernel' => '',
'legacy' => 0,
'process' => 'TSMC n4 (5nm)',
'release' => '',
- 'series' => '545.xx+',
+ 'series' => '550.xx+',
'status' => $status_current,
'xorg' => '',
'years' => '2022+',
@@ -20751,7 +20766,6 @@ sub info_data {
my $j = scalar @$rows;
my $num = 0;
my $services;
- PsData::set_cmd() if !$loaded{'ps-cmd'};
PsData::set_network();
if (@{$ps_data{'network-services'}}){
main::make_list_value($ps_data{'network-services'},\$services,',','sort');
@@ -20759,7 +20773,6 @@ sub info_data {
else {
$services = main::message('network-services');
}
-
push(@$rows,{
main::key($num++,1,1,'Info') => '',
main::key($num++,0,2,'services') => $services,
@@ -21372,6 +21385,7 @@ sub set_partitions {
# $file = "$fake_data_dir/block-devices/df/df-kT-wrapped-1.txt";
# @partitions_working = main::reader($file);
}
+ # NOTE: add push(@partitions_working,'data') here to emulate item; match unmounted
# print Data::Dumper::Dumper \@partitions_working;
# Determine positions
if (@partitions_working){
@@ -21459,6 +21473,7 @@ sub set_partitions {
($b_fs && ($row[2] == 0 || $row[1] =~ /^(autofs|devtmpfs|iso9660|tmpfs)$/))){
next;
}
+ # print "row 0:", $row[0],"\n";
# cygwin C:\cygwin passes this test so has to be handled later
if ($row[0] =~ /^\/dev\/|:\/|\/\//){
# this could point to by-label or by-uuid so get that first. In theory, abs_path should
@@ -21480,6 +21495,15 @@ sub set_partitions {
$temp =~ s|^/.*/||;
$dev_mapped = $dmmapper{$temp};
}
+ elsif ($bsd_type && $row[0] =~ m|^/dev/gpt[^/]*/|){
+ my $temp1 = $row[0];
+ $temp1 =~ s|^/dev/||;
+ my $temp2 = GlabelData::get($temp1);
+ if ($temp2 && $temp2 ne $temp1){
+ $dev_mapped = $row[0];
+ $row[0] = $temp2;
+ }
+ }
$dev_base = $row[0];
$dev_base =~ s|^/.*/||;
$part = LsblkData::get($dev_base) if @lsblk;
@@ -21664,7 +21688,7 @@ sub swap_data {
}
else {
if ($path = main::check_program('swapctl')){
- # output in in KB blocks
+ # output in in KB blocks$mount
@working = main::grabber("$path -l -k 2>/dev/null");
}
($size_id,$used_id) = (1,2);
@@ -21674,16 +21698,16 @@ sub swap_data {
# now add the swap partition data, don't want to show swap files, just partitions,
# though this can include /dev/ramzswap0. Note: you can also use /proc/swaps for this
# data, it's the same exact output as swapon -s
- foreach (@working){
+ foreach my $line (@working){
#next if ! /^\/dev/ || /^\/dev\/(ramzwap|zram)/;
- next if /^(Device|Filename|no swap)/;
+ next if $line =~ /^(Device|Filename|no swap)/;
($block_size,$dev_base,$dev_mapped,$dev_type,$label,$maj_min,$mount,
$swap_type,$uuid) = ('','','','','','','','partition','');
($priority,$zram_comp_avail,$zram_comp,$zram_mcs) = ();
- @data = split(/\s+/, $_);
+ @data = split(/\s+/, $line);
# /dev/zramX; ramzswapX == compcache, legacy version of zram.
# /run/initramfs/dev/zram0; /dev/ramzswap0
- if (/^\/(dev|run).*?\/((compcache|ramzwap|zram)\d+)/i){
+ if ($line =~ /^\/(dev|run).*?\/((compcache|ramzwap|zram)\d+)/i){
$dev_base = $2;
$swap_type = 'zram';
$dev_type = 'dev';
@@ -21694,7 +21718,7 @@ sub swap_data {
elsif ($data[1] && $data[1] eq 'ram'){
$swap_type = 'ram';
}
- elsif (m|^/dev|){
+ elsif ($line =~ m|^/dev|){
$swap_type = 'partition';
$dev_base = $data[0];
$dev_base =~ s|^/dev/||;
@@ -21710,8 +21734,17 @@ sub swap_data {
}
}
else {
+ my $part_id = $dev_base;
+ if ($dev_base =~ m|^gpt[^/]*/|){
+ my $temp = GlabelData::get($dev_base);
+ if ($temp && $temp ne $dev_base){
+ $dev_mapped = '/dev/' . $dev_base;
+ $part_id = $dev_base = $temp;
+ $mount = '/dev/' . $temp;
+ }
+ }
if ($show{'label'} || $show{'uuid'}){
- my $temp = DiskDataBSD::get($data[0]);
+ my $temp = DiskDataBSD::get($part_id);
$block_size = $temp->{'logical-block-size'};
$label = $temp->{'label'};
$uuid = $temp->{'uuid'};
@@ -21727,7 +21760,7 @@ sub swap_data {
# swpaon -s: /dev/sdb1 partition 16383996 109608 -2
# swapctl -l -k: /dev/label/swap0.eli 524284 154092
# users could have space in swapfile name
- if (/^($pattern2)\s+($pattern1)\s+/){
+ if (!$mount && $line =~ /^($pattern2)\s+($pattern1)\s+/){
$mount = main::trimmer($1);
}
$size = $data[$size_id];
@@ -23233,50 +23266,50 @@ sub soft_data {
sub zfs_data {
eval $start if $b_log;
my ($zpool) = @_;
- my (@components,@zfs);
+ my (@data,@zfs);
my ($allocated,$free,$size,$size_holder,$status,$zfs_used,$zfs_avail,
- $zfs_size,@working);
+ $zfs_size);
my $b_v = 1;
my ($i,$j,$k) = (0,0,0);
if ($fake{'raid-zfs'}){
- # my $file;
+ my $file;
# $file = "$fake_data_dir/raid-logical/zfs/zpool-list-1-mirror-main-solestar.txt";
# $file = "$fake_data_dir/raid-logical/zfs/zpool-list-2-mirror-main-solestar.txt";
# $file = "$fake_data_dir/raid-logical/zfs/zpool-list-v-tank-1.txt";
# $file = "$fake_data_dir/raid-logical/zfs/zpool-list-v-gojev-1.txt";
# $file = "$fake_data_dir/raid-logical/zfs/zpool-list-v-w-spares-1.txt";
- #@working = main::reader($file);$zpool = '';
+ $file = "$fake_data_dir/raid-logical/zfs/zpool-list-v-freebsd-linear-1.txt";
+ @data = main::reader($file);$zpool = '';
}
else {
- @working = main::grabber("$zpool list -v 2>/dev/null");
+ @data = main::grabber("$zpool list -v 2>/dev/null");
}
# bsd sed does not support inserting a true \n so use this trick
# some zfs does not have -v
- if (!@working){
- @working = main::grabber("$zpool list 2>/dev/null");
+ if (!@data){
+ @data = main::grabber("$zpool list 2>/dev/null");
$b_v = 0;
}
my $zfs_path = main::check_program('zfs');
- # print Data::Dumper::Dumper \@working;
- main::log_data('dump','@working',\@working) if $b_log;
- if (!@working){
+ # print 'zpool @data: ', Data::Dumper::Dumper \@data;
+ main::log_data('dump','@data',\@data) if $b_log;
+ if (!@data){
main::log_data('data','no zpool list data') if $b_log;
eval $end if $b_log;
return ();
}
my ($status_i) = (0);
# NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
- my $test = shift @working; # get rid of first header line
+ my $test = shift @data; # get rid of first header line
if ($test){
foreach (split(/\s+/, $test)){
last if $_ eq 'HEALTH';
$status_i++;
}
}
- foreach (@working){
+ foreach (@data){
my @row = split(/\s+/, $_);
if (/^[\S]+/){
- @components = ();
$i = 0;
$size = ($row[1] && $row[1] ne '-') ? main::translate_size($row[1]): '';
$allocated = ($row[2] && $row[2] ne '-')? main::translate_size($row[2]): '';
@@ -23332,6 +23365,8 @@ sub zfs_data {
# A single device not in an array:
# ada0s2 25.9G 14.6G 11.3G - 0% 56%
# gptid/3838f796-5c46-11e6-a931-d05099ac4dc2 - - - - - -
+ # A single device not in an array:
+ # ada0p4 5G 3.88G 633M - - 49% 86.3% - ONLINE
# Using /dev/disk/by-id:
# ata-VBOX_HARDDISK_VB5b6350cd-06618d58
# Using /dev/disk/by-partuuid:
@@ -23340,29 +23375,41 @@ sub zfs_data {
# /home/fred/zvol/hdd-2-3 - - - - - - - - INUSE
elsif ($row[1] =~ /^(sd[a-z]+|[a-z0-9]+[0-9]+|([\S]+)\/.*|(ata|mmc|nvme|pci|scsi|wwn)-\S+|[a-f0-9]{4,}(-[a-f0-9]{4,}){3,})$/ &&
($row[2] eq '-' || $row[2] =~ /^[0-9\.]+[MGTPE]$/)){
+ shift @row if !$row[0]; # get rid of empty first column
+ # print Data::Dumper::Dumper \@row;
+ # print 'status-i: ', $row[$status_i], ' row0: ', $row[0], "\n";
+ my ($maj_min,$real,$part_size,$state,$working);
#print "r1:$row[1]",' :: ', Cwd::abs_path('/dev/disk/by-id/'.$row[1]), "\n";
- $row[1] =~ /^(sd[a-z]+|[a-z0-9]+[0-9]+|([\S]+)\/.*|(ata|mmc|nvme|pci|scsi|wwn)-\S+|[a-f0-9]{4,}(-[a-f0-9]{4,}){3,})\s.*?(DEGRADED|FAULTED|INUSE|OFFLINE)?$/;
- #my $working = '';
- my $working = ($1) ? $1 : ''; # note: the negative case can never happen
- my $state = ($4) ? $4 : '';
- my ($maj_min,$real,$part_size);
- if ($bsd_type && $working =~ /[\S]+\//){
- $working = GlabelData::get($working);
- }
- elsif (!$bsd_type && $row[1] =~ /^(ata|mmc|nvme|scsi|wwn)-/ &&
- -e "/dev/disk/by-id/$row[1]" && ($real = Cwd::abs_path('/dev/disk/by-id/'.$row[1]))){
- $real =~ s|/dev/||;
- $working = $real;
- }
- elsif (!$bsd_type && $row[1] =~ /^(pci)-/ &&
- -e "/dev/disk/by-path/$row[1]" && ($real = Cwd::abs_path('/dev/disk/by-path/'.$row[1]))){
- $real =~ s|/dev/||;
- $working = $real;
- }
- elsif (!$bsd_type && $row[1] =~ /^[a-f0-9]{4,}(-[a-f0-9]{4,}){3,}$/ &&
- -e "/dev/disk/by-partuuid/$row[1]" && ($real = Cwd::abs_path('/dev/disk/by-partuuid/'.$row[1]))){
- $real =~ s|/dev/||;
- $working = $real;
+ if ($row[0] =~ /^(sd[a-z]+|[a-z0-9]+[0-9]+|([\S]+)\/.*|(ata|mmc|nvme|pci|scsi|wwn)-\S+|[a-f0-9]{4,}(-[a-f0-9]{4,}){3,})$/){
+ $working = $1; # note: the negative case can never happen
+ }
+ # We only care about non ONLINE states for components
+ if ($status_i && $row[$status_i] &&
+ $row[$status_i] =~ /^(DEGRADED|FAULTED|INUSE|OFFLINE)$/){
+ $state = $1;
+ }
+ if ($bsd_type){
+ if ($working =~ /[\S]+\//){
+ my $temp = GlabelData::get($working);
+ $working = $temp if $temp;
+ }
+ }
+ elsif (!$bsd_type){
+ if ($row[0] =~ /^(ata|mmc|nvme|scsi|wwn)-/ &&
+ -e "/dev/disk/by-id/$row[0]" && ($real = Cwd::abs_path('/dev/disk/by-id/'.$row[0]))){
+ $real =~ s|/dev/||;
+ $working = $real;
+ }
+ elsif ($row[0] =~ /^(pci)-/ &&
+ -e "/dev/disk/by-path/$row[0]" && ($real = Cwd::abs_path('/dev/disk/by-path/'.$row[0]))){
+ $real =~ s|/dev/||;
+ $working = $real;
+ }
+ elsif ($row[0] =~ /^[a-f0-9]{4,}(-[a-f0-9]{4,}){3,}$/ &&
+ -e "/dev/disk/by-partuuid/$row[0]" && ($real = Cwd::abs_path('/dev/disk/by-partuuid/'.$row[0]))){
+ $real =~ s|/dev/||;
+ $working = $real;
+ }
}
# kind of a hack, things like cache may not show size/free
# data since they have no array row, but they might show it in
@@ -23370,18 +23417,18 @@ sub zfs_data {
# ada0s2 25.9G 19.6G 6.25G - 0% 75%
# ec399377-c03c-e844-a876-8c8b044124b8 1.88G 397M 1.49G - - 0% 20.7% - ONLINE
# keys were size/allocated/free but those keys don't exist, assume failed to add raw-
- if (!$zfs[$j]->{'raw-size'} && $row[2] && $row[2] ne '-'){
- $size = ($row[2]) ? main::translate_size($row[2]): '';
+ if (!$zfs[$j]->{'raw-size'} && $row[1] && $row[1] ne '-'){
+ $size = ($row[1]) ? main::translate_size($row[1]): '';
$size_holder = 0;
$zfs[$j]->{'arrays'}[$k]{'raw-size'} = $size;
$raw_logical[0] += $size if $size;
}
- if (!$zfs[$j]->{'raw-allocated'} && $row[3] && $row[3] ne '-'){
- $allocated = ($row[3]) ? main::translate_size($row[3]) : '';
+ if (!$zfs[$j]->{'raw-allocated'} && $row[2] && $row[2] ne '-'){
+ $allocated = ($row[2]) ? main::translate_size($row[2]) : '';
$zfs[$j]->{'arrays'}[$k]{'raw-allocated'} = $allocated;
}
- if (!$zfs[$j]->{'raw-free'} && $row[4] && $row[4] ne '-'){
- $free = ($row[4]) ? main::translate_size($row[4]) : '';
+ if (!$zfs[$j]->{'raw-free'} && $row[3] && $row[3] ne '-'){
+ $free = ($row[3]) ? main::translate_size($row[3]) : '';
$zfs[$j]->{'arrays'}[$k]{'raw-free'} = $free;
}
if ((!$maj_min || !$part_size) && $working && @proc_partitions){
@@ -23400,6 +23447,10 @@ sub zfs_data {
my $temp = DiskDataBSD::get($working);
$part_size = $temp->{'size'} if $temp->{'size'};
}
+ # with linear zfs, can show full partition size data
+ if (!$part_size && $working && $row[1] && $row[1] ne '-'){
+ $part_size = main::translate_size($row[1]);
+ }
$raw_logical[1] += $part_size if $part_size;
$zfs[$j]->{'arrays'}[$k]{'components'}[$i] = [$working,$part_size,$maj_min,$state];
$i++;
@@ -26837,7 +26888,7 @@ sub load_lm_sensors {
$type = 'network';
}
# put last just in case some other sensor type above had intel in name
- elsif ($adapter =~ /^(amdgpu|intel|nouveau|radeon)-/){
+ elsif ($adapter =~ /^(amdgpu|intel|nova|nouveau|radeon)-/){
$type = 'gpu';
}
elsif ($adapter =~ /^(acpitz)-/ && $adapter !~ /^(acpitz-virtual)-/ ){
@@ -26937,7 +26988,7 @@ sub load_sys_data {
$type = 'network';
}
# put last just in case some other sensor type above had intel in name
- elsif ($name =~ /^(amdgpu|intel|nouveau|radeon)/){
+ elsif ($name =~ /^(amdgpu|intel|nova|nouveau|radeon)/){
$type = 'gpu';
}
# not confirmed in /sys that name will be acpitz-virtual, verify
@@ -27459,7 +27510,7 @@ sub gpu_sensor_data {
foreach my $adapter (keys %{$sensors_raw->{'gpu'}}){
$j = scalar @$gpu_data;
$gpu_data->[$j]{'type'} = $adapter;
- $gpu_data->[$j]{'type'} =~ s/^(amdgpu|intel|nouveau|radeon)-.*/$1/;
+ $gpu_data->[$j]{'type'} =~ s/^(amdgpu|intel|nouveau|nova|radeon)-.*/$1/;
# print "ad: $adapter\n";
foreach (@{$sensors_raw->{'gpu'}{$adapter}}){
# print "val: $_\n";
@@ -27899,7 +27950,9 @@ sub create_output {
$rows->[$j]{main::key($num++,0,3,'max-streams')} = $row->{'zram-max-comp-streams'};
}
}
- $row->{'mount'} =~ s|/home/[^/]+/(.*)|/home/$filter_string/$1| if $row->{'mount'} && $use{'filter'};
+ if ($row->{'mount'} && $use{'filter'}){
+ $row->{'mount'} =~ s|/home/[^/]+/(.*)|/home/$filter_string/$1|;
+ }
$rows->[$j]{main::key($num++,1,2,$dev)} = ($row->{'mount'}) ? $row->{'mount'} : 'N/A';
if ($b_admin && $row->{'maj-min'}){
$rows->[$j]{main::key($num++,0,3,'maj-min')} = $row->{'maj-min'};
@@ -28053,6 +28106,7 @@ sub proc_data {
PartitionItem::set_partitions() if !$loaded{'set-partitions'};
RaidItem::raid_data() if !$loaded{'raid'};
my $mounted = get_mounted();
+ # NOTE: add push(@$mounted,'data') here to emulate item, match partition data
# print join("\n",(@filters,@$mounted)),"\n";
foreach my $row (@proc_partitions){
($dev_mapped,$fs,$label,$maj_min,$uuid,$size) = ('','','','','','');
@@ -28069,13 +28123,16 @@ sub proc_data {
# remove from list. this only works for sdxx drives, but is better than no fix
# This logic may also end up working for btrfs partitions, and maybe hammer?
# In arm/android seen /dev/block/mmcblk0p12
+ # @filters test separate since it contains regex list, @$mounted can contain
+ # regex special characters like GDRIVE{6Cm8i}:
# print "mount: $row->[-1]\n";
if ($row->[-1] !~ /^(nvme[0-9]+n|mmcblk|mtdblk|mtdblock)[0-9]+$/ &&
$row->[-1] =~ /[a-z][0-9]+$|dm-[0-9]+$/ &&
$row->[-1] !~ /\bloop/ &&
- !(grep {$row->[-1] =~ /$_$/} (@filters,@$mounted)) &&
+ !(grep {$row->[-1] =~ /$_$/} @filters) &&
+ !(grep {$row->[-1] =~ /\Q$_\E$/} @$mounted) &&
!(grep {$_ =~ /(block\/)?$row->[-1]$/} @$mounted) &&
- !(grep {$_ =~ /^sd[a-z]+$/ && $row->[-1] =~ /^$_[0-9]+/} @$mounted)){
+ !(grep {$_ =~ /^sd[a-z]+$/ && $row->[-1] =~ /^\Q$_\E[0-9]+/} @$mounted)){
$dev_mapped = $dmmapper{$row->[-1]} if $dmmapper{$row->[-1]};
if (@lsblk){
my $id = ($dev_mapped) ? $dev_mapped: $row->[-1];
@@ -31124,7 +31181,7 @@ sub set_dboot_disks {
}
}
}
- print Data::Dumper::Dumper \%disks_bsd if $dbg[34];
+ print 'dboot disk: ', Data::Dumper::Dumper \%disks_bsd if $dbg[34];
main::log_data('dump','%disks_bsd',\%disks_bsd) if $b_log;
eval $end if $b_log;
}
@@ -31216,7 +31273,7 @@ sub set_disklabel_data {
}
}
}
- print Data::Dumper::Dumper \%disks_bsd if $dbg[34];
+ print 'disklabel: ', Data::Dumper::Dumper \%disks_bsd if $dbg[34];
main::log_data('dump', '%disks_bsd', \%disks_bsd) if $b_log;
eval $end if $b_log;
}
@@ -31311,7 +31368,7 @@ sub set_gpart_data {
}
}
}
- print Data::Dumper::Dumper \%disks_bsd if $dbg[34];
+ print 'gpart: ', Data::Dumper::Dumper \%disks_bsd if $dbg[34];
main::log_data('dump', '%disks_bsd', \%disks_bsd) if $b_log;
eval $end if $b_log;
}
@@ -31888,8 +31945,8 @@ sub system_base_linux {
$base_distro_arch .= '|talkingarch|theshell|ubos|velt|xero';
my $base_file_debian_version = 'sidux';
# detect debian steamos before arch steamos
- my $base_osr_debian_version = '\belive|lmde|neptune|nitrux|parrot|pureos|';
- $base_osr_debian_version .= 'rescatux|septor|sparky|steamos|tails';
+ my $base_osr_debian_version = '\belive|blankon|lmde|neptune|nitrux|parrot|';
+ $base_osr_debian_version .= 'pureos|rescatux|septor|solyd|sparky|steamos|tails';
my $base_osr_devuan_version = 'crowz|dowse|etertics|\bexe\b|fluxuan|gnuinos|';
$base_osr_devuan_version .= 'gobmis|heads|miyo|refracta|\bstar\b|virage';
# osr has base ids
@@ -31897,7 +31954,7 @@ sub system_base_linux {
# base only found in issue
my $base_issue = 'bunsen';
# synthesize, no direct data available
- my $base_manual = 'blankon|deepin|kali';
+ my $base_manual = 'deepin|kali';
# osr base, distro id in list of distro files
my $base_osr = 'aptosid|bodhi|grml|q4os|siduction|slax|zenwalk';
# osr base, distro id in issue
@@ -31984,7 +32041,7 @@ sub system_base_linux {
if (!$distro->{'base'} && $lc_issue && $lc_issue =~ /($base_manual)/){
my $id = $1;
my %manual = (
- 'blankon' => 'Debian unstable',
+ # 'blankon' => 'Debian unstable', # use /etc/debian_version
'deepin' => 'Debian unstable',
'kali' => 'Debian testing',
);
@@ -32517,18 +32574,19 @@ sub get_driver_modules {
return $modules;
}
-## GlabelData: public methods: set(), get()
-# Used only to get RAID ZFS gptid path standard name, like ada0p1
+## GlabelData: public methods: get()
+# Used to partitions, swap, RAID ZFS gptid path standard name, like ada0p1
{
package GlabelData;
# gptid/c5e940f1-5ce2-11e6-9eeb-d05099ac4dc2 N/A ada0p1
+# gpt/efiesp N/A ada0p2
sub get {
eval $start if $b_log;
- my ($gptid) = @_;
+ my $gptid = $_[0];
set() if !$loaded{'glabel'};
return if !@glabel || !$gptid;
- my ($dev_id) = ('');
+ my $dev_id = '';
foreach (@glabel){
my @temp = split(/\s+/, $_);
my $gptid_trimmed = $gptid;
@@ -32548,7 +32606,7 @@ sub set {
eval $start if $b_log;
$loaded{'glabel'} = 1;
if (my $path = main::check_program('glabel')){
- @glabel = main::grabber("$path status 2>/dev/null");
+ @glabel = main::grabber("$path status 2>/dev/null",'','strip');
}
main::log_data('dump','@glabel:with Headers',\@glabel) if $b_log;
# get rid of first header line
@@ -35186,6 +35244,8 @@ sub set_values {
'dawn' => ['^dawn',1,'-v','dawn',0,1,1,'^dawn-',''], # to stderr, not verified
'dcompmgr' => ['^dcompmgr',0,'0','dcompmgr',0,1,0,'',''], # unverified
'deepin' => ['^Version',2,'file','Deepin',0,100,'=','','/etc/deepin-version'], # special
+ 'deepin-kwin_wayland' => ['^deepin-kwin',2,'--version','deepin-kwin_wayland',0,1,0,'',''],#
+ 'deepin-kwin_x11' => ['^deepin-kwin',2,'--version','deepin-kwin_x11',0,1,0,'',''],#
'deepin-metacity' => ['^metacity',2,'--version','Deepin-Metacity',0,1,0,'',''],
'deepin-mutter' => ['^mutter',2,'--version','Deepin-Mutter',0,1,0,'',''],
'deepin-wm' => ['^gala',0,'0','DeepinWM',0,1,0,'',''], # no version
@@ -35193,7 +35253,7 @@ sub set_values {
'dusk' => ['^dusk',1,'-v','dusk',0,1,1,'^dusk-',''], # to stderr, not verified
'dtwm' => ['^dtwm',0,'0','dtwm',0,1,0,'',''],# no version
'dwc' => ['^dwc',0,'0','dwc',0,1,0,'',''], # unverified
- 'dwl' => ['^dwl',0,'0','dwl',0,1,0,'',''], # unverified
+ 'dwl' => ['^dwl',1,'-v','dwl',0,1,0,'^dwl-',''], # assume same as dwm
'dwm' => ['^dwm',1,'-v','dwm',0,1,1,'^dwm-',''],
'echinus' => ['^echinus',1,'-v','echinus',0,1,1,'',''], # echinus-0.4.9 (c)...
# only listed here for compositor values, version data comes from xprop
@@ -35264,7 +35324,7 @@ sub set_values {
'lxqt-session' => ['^lxqt-session',2,'--version','LXQt',0,1,0,'',''],
'lxqt-variant' => ['^lxqt-panel',0,'0','LXQt-Variant',0,1,0,'',''],
'lxsession' => ['^lxsession',0,'0','lxsession',0,1,0,'',''],
- 'mahogany' => ['^mahogany',0,'0','Mahogany',0,1,0,'',''], # unverified
+ 'mahogany' => ['^mahogany',0,'0','Mahogany',0,1,0,'',''], # unverified, from stumpwm
'manokwari' => ['^manokwari',0,'0','Manokwari',0,1,0,'',''],
'marina' => ['^marina',0,'0','Marina',0,1,0,'',''], # unverified
'marco' => ['^marco',2,'--version','marco',0,1,0,'',''],
@@ -35667,17 +35727,18 @@ sub version_pkg {
## PsData
# public methods:
-# set_cmd(): sets @ps_aux, @ps_cmd
+# set(): sets @ps_aux, @ps_cmd
# set_dm(): sets $ps_data{'dm-active'}
# set_de_wm(): sets -S/-G de/wm/comp/tools items
+# set_network(): sets -na network services
# set_power(): sets -I $ps_data{'power-services'}
{
package PsData;
-sub set_cmd {
+sub set {
eval $start if $b_log;
my ($b_busybox,$header,$ps,@temp);
- $loaded{'ps-cmd'} = 1;
+ $loaded{'ps-data'} = 1;
my $args = 'wwaux';
my $path = main::check_program('ps');
my $link = readlink($path);
@@ -35699,11 +35760,15 @@ sub set_cmd {
}
$ps_data{'header'}->[0] = $#temp; # the indexes, not the scalar count
for (my $i = 0; $i <= $#temp; $i++){
- if ($temp[$i] eq 'PID'){$ps_data{'header'}->[1] = $i;}
- elsif ($temp[$i] eq '%CPU'){$ps_data{'header'}->[2] = $i;}
+ if ($temp[$i] eq 'PID'){
+ $ps_data{'header'}->[1] = $i;}
+ elsif ($temp[$i] eq '%CPU'){
+ $ps_data{'header'}->[2] = $i;}
# note: %mem is percent used
- elsif ($temp[$i] eq '%MEM'){$ps_data{'header'}->[3] = $i;}
- elsif ($temp[$i] eq 'RSS'){$ps_data{'header'}->[4] = $i;}
+ elsif ($temp[$i] eq '%MEM'){
+ $ps_data{'header'}->[3] = $i;}
+ elsif ($temp[$i] eq 'RSS'){
+ $ps_data{'header'}->[4] = $i;}
}
# we want more data from ps busybox, to get TinyX screen res
my $cols_use = ($b_busybox) ? 7 : 2;
@@ -35725,6 +35790,8 @@ sub set_cmd {
# should NOT be happening, except on busybox ps, which has no ww.
next if !defined $split[$ps_data{'header'}->[0]];
# we don't want zombie/system/kernel processes, or servers, browsers.
+ # but we do want network kernel process servers [nfsd]
+ $split[$ps_data{'header'}->[0]] =~ s/^\[(mld|nfsd)\]/$1/;
if ($split[$ps_data{'header'}->[0]] !~ /^([\[\(]|(\S+\/|)($pattern))/i){
push(@ps_cmd,join(' ', @split[$ps_data{'header'}->[0] .. $final]));
}
@@ -35786,9 +35853,9 @@ sub set_de_wm {
}
if ($b_de_wm_comp){
process_items(\@{$ps_data{'de-wm-compositors'}},join('|',qw(budgie-wm compiz
- deepin-wm enlightenment gala gnome-shell twin kwin_wayland kwin_x11 kwinft kwin
- marco deepin-metacity metacity metisse mir moksha muffin deepin-mutter mutter
- ukwm xfwm[345]?)));
+ deepin-kwin_wayland deepin-kwin_x11 deepin-wm enlightenment gala gnome-shell
+ twin kwin_wayland kwin_x11 kwinft kwin marco deepin-metacity metacity
+ metisse mir moksha muffin deepin-mutter mutter ukwm xfwm[345]?)));
}
if ($b_wm_comp){
# x11: 3dwm, qtile [originally], rest wayland
@@ -35823,8 +35890,9 @@ sub set_de_wm {
# Generate tools: power manager daemons, then screensavers/lockers.
# Note that many lockers may not be services
@{$ps_data{'tools-test'}}=qw(away boinc-screensaver budgie-screensaver
- cinnamon-screensaver gnome-screensaver gsd-screensaver-proxy gtklock i3lock
- kscreenlocker light-locker lockscreen lxlock mate-screensaver nwg-lock
+ cinnamon-screensaver gnome-screensaver gsd-screensaver-proxy gtklock
+ hyprlock i3lock kscreenlocker light-locker lockscreen lxlock
+ mate-screensaver nwg-lock
physlock rss-glx slock swayidle swaylock ukui-screensaver unicode-screensaver
xautolock xfce4-screensaver xlock xlockmore xscreensaver
xscreensaver-systemd xsecurelock xss-lock xtrlock);
@@ -35848,7 +35916,7 @@ sub set_network {
eval $start if $b_log;
process_items(\@{$ps_data{'network-services'}},join('|', qw(apache\d?
cC]onn[mM]and? dhcpd dhcpleased fingerd ftpd gated httpd inetd ircd iwd
- [mM]odem[mM]nager named networkd-dispatcher [nN]etwork[mM]anager nfsd nginx
+ mld [mM]odem[mM]nager named networkd-dispatcher [nN]etwork[mM]anager nfsd nginx
ntpd proftpd routed smbd sshd systemd-networkd systemd-timesyncd tftpd
wicd wpa_supplicant xinetd xntpd)));
print '$ps_data{network-daemons}: ', Data::Dumper::Dumper $ps_data{'network-services'} if $dbg[5];
@@ -37734,13 +37802,12 @@ my ($items,$subs);
sub generate {
eval $start if $b_log;
my ($item,%checks);
- PsData::set_cmd() if !$loaded{'ps-cmd'};
+ PsData::set() if !$loaded{'ps-data'};
main::set_sysctl_data() if $use{'sysctl'};
main::set_dboot_data() if $bsd_type && !$loaded{'dboot'};
# note: ps aux loads before logging starts, so create debugger data here
if ($b_log){
# With logging, we already get ps wwwaux so no need to get it again here
- # main::log_data('dump','@ps_aux',\@ps_aux);
main::log_data('dump','@ps_cmd',\@ps_cmd);
}
print Data::Dumper::Dumper \@ps_cmd if $dbg[61];
diff --git a/inxi.1 b/inxi.1
index d515dbb..3ba259d 100644
--- a/inxi.1
+++ b/inxi.1
@@ -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 "2024\-02-06"inxi" "inxi manual"
+.TH INXI 1 "2024\-04-13"inxi" "inxi manual"
.SH NAME
inxi \- Command line system information script for console and IRC
diff --git a/inxi.changelog b/inxi.changelog
index b1fb5b5..56644c2 100644
--- a/inxi.changelog
+++ b/inxi.changelog
@@ -1,4 +1,163 @@
================================================================================
+Version: 3.3.34
+Patch: 00
+Date: 2024-04-13
+--------------------------------------------------------------------------------
+RELEASE NOTES:
+--------------------------------------------------------------------------------
+
+This is a nice point release that corrects and updates numerous smaller, and
+larger, features. Most pressing in terms of numbers affected was the failure
+to detect in display, non console, for Wayland without Xwayland running. But
+updates will impact a fairly wide range of systems, though mostly are corner
+case issues, but inxi is all about handling corner cases to make the handliing
+of core stuff more robust and less prone to failure or error.
+
+--------------------------------------------------------------------------------
+SPECIAL THANKS:
+
+1. RAID: Codeberg issue #301 from olegStreejak helped expose a long standing set
+of ZFS components bugs. This was superficially exposed by an unexpected
+undefined value error in -o/--unmounted.
+
+2. PARTITIONS/SWAP: again raised in issue #301, partitions failed to handle
+/dev/gpt/[gpt-lable] syntax, leading to undetected mounted partitions showwing
+in unmounted, and label/uuid not working.
+
+3. UNMOUNTED: codeberg user kysh in issue #302 found a corner case that exposed
+bug 2, using raw data as regex pattern, without protecting it. But most
+important, he took the time to report it.
+
+--------------------------------------------------------------------------------
+KNOWN ISSUES:
+
+1. GRAPHICS/CPU: Intel data is really hard to track, and getting solid lists
+of their gpu vs cpu generations is almost impossible, so these are just going
+to lag a year or two fairly consistently. They also keep jumbling marketing
+names up with physical hardware, making it even more difficult.
+
+--------------------------------------------------------------------------------
+BUGS:
+
+1. RAID: zfs_data(): a series of small glitches led to certain cases of BSD
+RAID ZFS component data generating undefined value errors in unexpected places.
+
+The bug and fixes required some careful corrections since there were more than
+1 present, a bad regex pattern.
+
+2. UNMOUNTED: weak regex fails when mount line item contains regex special
+characters in its string, like: GDRIVE{**6Cm8i**}. Thanks codeberg issue poster
+#302 for reporting this failure. This was already handled correctly in
+partitions, so this was just an oversight.
+
+Solution was to pull apart some combined test arrays, and then use \Q$_\E
+wrappers in the regex. Obviously using raw system data in a regex when you don't
+know what it can contain was always a mistake, but this one just slipped by
+since that syntax is not common.
+
+--------------------------------------------------------------------------------
+FIXES:
+
+1. DRIVES: DiskItem::disk_vendor(): Fixed an overly loose SanDisk vendor ID that
+led to a Seagate ST8000DM004-2CX188_WCT193ZX being ID'ed as a SanDisk. The
+culprit was forgetting the 'starts with ^ in:
+^X[1-6]\d{2}
+Thanks Codebergy issue poster thatso in issue #299 for pointing this out.
+
+2. NETWORK: services: was missing nfsd because it's a kernel process, that's
+corrected. Showed as: [nfsd]
+
+3. MAIN: primary DISPLAY test fails to check for WAYLAND_DISPLAY and other
+desktop session environmental variables only present if X/Wayland are running
+current display. This led to $b_display not getting set when for example Wayland
+in Sway without Xwayland, so no $DISPLAY set.
+
+4. GlabelData: glabel status will right align column 1, which is not obvious
+unless you have something like this:
+ gpt/bootfs N/A ada0p1
+gptid/67d1a56b-7fb2-11ee-a7ba-002590ec5bf2 N/A ada0p1
+ gpt/efiesp N/A ada0p2
+
+This led to the expected splits being off by one. Fix is using 'strip' in
+main::grabber.
+
+5. BSD: PARTITIONS/SWAP: failed to get mapped gpt data, which led to more false
+unmounted issues. These were exposed in codeberg issue #301. Added explicit
+detections for /dev/gtp[^\]*/ which means relying on that literal path to be
+present. Note that can be gpt or gptid, the latter if it's a UUID type string.
+
+This also led to failures for UUID and LABEL for partitions and swap.
+
+6. SYSTEM: DistroData: changed blankon to use system base from debian_version
+file version. Had as manual before, but when install gets old, that's deceptive
+since it will be an ancient Debian sid. Better to call it what it is in the
+actual install.
+
+--------------------------------------------------------------------------------
+ENHANCEMENTS:
+
+1a. SYSTEM: DesktopData: Added support for yet another Deepin window manager,
+deepin-kwin_x11. Also for deepin-kwin_wayland.
+
+1b. SYSTEM: DesktopData: Added support for hyprlock, hyprland's screenlocker.
+
+1c. SYSTEM: DistroData: Added support for SolyD system base Debian detection.
+
+2. NETWORK: services: added mld. As with nfsd, it's a kernel process: [mld]
+
+3a. GRAPHICS: GPU DATA: added more gpu ids for nvidia, amd, intel.
+
+3b. GRAPHICS: Xorg drivers: added possible future rust nvidia nova driver. Not
+in kernel yet but may be. Also added in various filter lists just in case.
+Search for'nouveau' to find occurances.
+
+4. CPU: Added more AMD, Intel CPU Ids. The Intel stuff is getting really
+difficult to track, they refuse to adopt sane family updates, keeping it always
+at 6, and thus cram more and more into finite 2 hexadecimal numbers, leaving
+marketing terms in place of actual die process engineering. There's only so much
+I can do to work around this, so if you find errors, do the research, and submit
+corrections, keeping in mind these things are super fuzzy.
+
+5. DRIVES: More disk vendors, the endless list. Unhandled list grows slowly,
+maybe one day someone will step in and figure out what more of them are,
+assuming they have a unique name string of course.
+
+--------------------------------------------------------------------------------
+CHANGES:
+
+1. No Changes.
+
+--------------------------------------------------------------------------------
+DOCUMENTATION:
+
+1a. DOCS: inxi-network.txt: added notes for nfsd, mld
+
+1b. DOCS: inxi-desktop.txt: added de wm deepin-kwin_x11, deepin-kwin_wayland.
+
+1c. DOCS: inxi-power.txt: added hyperlock.
+
+2. DATA: data/machine/elbrus/sets: added bootdata/fruid sets. These are from a
+while back but were not labeled consistently, so sorted them into what are
+hopefully actual pairs of data files.
+
+--------------------------------------------------------------------------------
+CODE:
+
+1. PsData: Changed set_cmd() to set(), since all ps data is being set, not just
+@ps_cmd. Changed $loaded{'ps-cmd'} to $loaded{'ps-data'} for same reason. Also
+removed redundant check for loaded, and moved first load to IRC test, if not IRC
+type scenario, then loads right before building the items.
+
+2. RAID: zfs_data(): cleaned up to make more debuggable ZFS component data. Some
+of the items would never have worked due to bad regex, and also simplified by
+shifting empty index 0 from @row to make values same as top sections for main
+ZFS Array data. The regex was simply too convoluted to work reliably, so it
+failed under certain cases, FreeBSD Linear ZFS mode for example.
+
+--------------------------------------------------------------------------------
+-- Harald Hope - Sat, 13 March 2024 19:00:08 -0800
+
+================================================================================
Version: 3.3.33
Patch: 00
Date: 2024-02-06