diff options
Diffstat (limited to 'inxi')
-rwxr-xr-x | inxi | 647 |
1 files changed, 408 insertions, 239 deletions
@@ -48,8 +48,8 @@ use POSIX qw(ceil uname strftime ttyname); ## INXI INFO ## my $self_name='inxi'; -my $self_version='3.3.19'; -my $self_date='2022-06-16'; +my $self_version='3.3.20'; +my $self_date='2022-07-27'; my $self_patch='00'; ## END INXI INFO ## @@ -1508,35 +1508,7 @@ sub new { sub run_debugger { print "Starting $self_name debugging data collector...\n"; - print "Loading required debugger Perl File:: modules... \n"; - # Fedora/Redhat doesn't include File::Find File::Copy in - # core modules. why? Or rather, they deliberately removed them. - if (main::check_perl_module('File::Find')){ - File::Find->import; - } - else { - main::error_handler('required-module', 'File', 'File::Find'); - } - if (main::check_perl_module('File::Copy')){ - File::Copy->import; - } - else { - main::error_handler('required-module', 'File', 'File::Copy'); - } - if (main::check_perl_module('File::Spec::Functions')){ - File::Spec::Functions->import; - } - else { - main::error_handler('required-module', 'File', 'File::Spec::Functions'); - } - if ($debugger{'level'} > 20){ - if (main::check_perl_module('Net::FTP')){ - Net::FTP->import; - } - else { - main::error_handler('required-module', 'Net', 'Net::FTP'); - } - } + check_required_items(); create_debug_directory(); print "Note: for dmidecode, smartctl, lvm data you must be root.\n" if !$b_root; print $line3; @@ -1580,7 +1552,44 @@ sub run_debugger { print $line3; compress_dir(); } - +sub check_required_items { + print "Loading required debugger Perl File:: modules... \n"; + # Fedora/Redhat doesn't include File::Find File::Copy in + # core modules. why? Or rather, they deliberately removed them. + if (main::check_perl_module('File::Find')){ + File::Find->import; + } + else { + main::error_handler('required-module', 'File', 'File::Find'); + } + if (main::check_perl_module('File::Copy')){ + File::Copy->import; + } + else { + main::error_handler('required-module', 'File', 'File::Copy'); + } + if (main::check_perl_module('File::Spec::Functions')){ + File::Spec::Functions->import; + } + else { + main::error_handler('required-module', 'File', 'File::Spec::Functions'); + } + if ($debugger{'level'} > 20){ + if (main::check_perl_module('Net::FTP')){ + Net::FTP->import; + } + else { + main::error_handler('required-module', 'Net', 'Net::FTP'); + } + } + print "Checking basic core system programs exist... \n"; + if ($debugger{'level'} > 19){ + # astoundingly, rhel 9 and variants are shipping without tar in minimal install + if (!main::check_program('tar')){ + main::error_handler('required-program', 'tar', 'debugger'); + } + } +} sub create_debug_directory { my $host = main::get_hostname(); $host =~ s/ /-/g; @@ -2814,6 +2823,9 @@ sub error_handler { ## Modules elsif ($err eq 'required-module'){ $errno=80; $b_recommends=1; "The required $one Perl module is not installed:\n$two" } + ## Programs + elsif ($err eq 'required-program'){ + $errno=90; "Required program '$one' could not be located on your system.\nNeeded for: $two" } ## DEFAULT else { $errno=255; "Error handler ERROR!! Unsupported options: $err!"} @@ -4099,6 +4111,7 @@ sub set_program_values { 'greetd' => ['^greetd',0,'0','greetd',0,1,0,'',''], # no version 'kdm' => ['^kdm',0,'0','KDM',0,1,0,'',''], 'kdm3' => ['^kdm',0,'0','KDM',0,1,0,'',''], + 'kdmctl' => ['^kdm',0,'0','KDM',0,1,0,'',''], 'ldm' => ['^ldm',0,'0','LDM',0,1,0,'',''], 'lightdm' => ['^lightdm',2,'--version','LightDM',0,1,1,'',''], 'lxdm' => ['^lxdm',0,'0','LXDM',0,1,0,'',''], @@ -4116,6 +4129,7 @@ sub set_program_values { 'udm' => ['^udm',0,'0','udm',0,1,0,'',''], 'wdm' => ['^wdm',0,'0','WINGs DM',0,1,0,'',''], 'xdm' => ['^xdm',0,'0','XDM',0,1,0,'',''], + 'xdmctl' => ['^xdm',0,'0','XDM',0,1,0,'',''],# opensuse/redhat may use this to start real dm 'xenodm' => ['^xenodm',0,'0','xenodm',0,1,0,'',''], 'xlogin' => ['^xlogin',0,'-V','xlogin',0,1,0,'',''], # unverified, probably clogin ## Shells - not checked: ion, eshell ## @@ -4698,7 +4712,6 @@ sub get { 'gpu|nvidia|nv' => sub { $b_admin = 1; $show{'short'} = 0; - $show{'gpu-data'} = 1; $show{'graphic'} = 1; $show{'graphic-full'} = 1;}, 'G|graphics|graphic' => sub { @@ -4885,7 +4898,6 @@ sub get { $b_admin = 1; # $use{'downloader'} = 1; # only if weather $show{'edid'} = 1; - $show{'gpu-data'} = 1; $show{'process'} = 1; $show{'ps-cpu'} = 1; $show{'ps-mem'} = 1; @@ -4999,6 +5011,11 @@ sub get { }}, 'z|filter' => sub { $use{'filter'} = 1;}, + 'filter-all|za' => sub { + $use{'filter'} = 1; + $use{'filter-label'} = 1; + $use{'filter-uuid'} = 1; + $use{'filter-vulnerabilities'} = 1;}, 'filter-label|zl' => sub { $use{'filter-label'} = 1;}, 'Z|filter-override|no-filter' => sub { @@ -5082,7 +5099,7 @@ sub get { else { main::error_handler('bad-arg', $opt, $arg); }}, - 'debug-filter|debug-z|debug-zy' => sub { + 'debug-filter|debug-z' => sub { $debugger{'filter'} = 1 }, 'debug-id:s' => sub { my ($opt,$arg) = @_; @@ -5111,15 +5128,25 @@ sub get { $debugger{'sys-print'} = 1;}, 'debug-test-1' => sub { $debugger{'test-1'} = 1;}, - 'debug-width|debug-y|debug-zy:i' => sub { + 'debug-width|debug-y:i' => sub { my ($opt,$arg) = @_; $arg ||= 80; - if ($arg =~ /^[0-9]+$/ && ($arg == 1 || $arg >= 80)){ + if ($arg =~ /^\d+$/ && ($arg == 1 || $arg >= 80)){ $debugger{'width'} = $arg; } else { main::error_handler('bad-arg', $opt, $arg); }}, + 'debug-zy|debug-yz:i' => sub { + my ($opt,$arg) = @_; + $arg ||= 80; + if ($arg =~ /^\d+$/ && ($arg == 1 || $arg >= 80)){ + $debugger{'width'} = $arg; + $debugger{'filter'} = 1; + } + else { + main::error_handler('bad-arg', $opt, $arg); + }}, 'dig' => sub { $force{'no-dig'} = 0;}, 'display:s' => sub { @@ -5571,8 +5598,7 @@ sub show_options { ['1', '-F', '--full', "Full output. Includes all Upper Case line letters (except -J, -W) plus --swap, -s and -n. Does not show extra verbose options such as -d -f -i -J -l -m -o -p -r -t -u -x, unless specified."], - ['1', '', '--gpu', "Show advanced gpu info (arch:, nvidia non-free driver - status). Triggers -Ga."], + ['1', '', '--gpu', "Deprecated. Triggers -Ga."], ['1', '-G', '--graphics', "Graphics info (devices(s), drivers, display protocol (if available), display server/Wayland compositor, resolution, X.org: renderer, OpenGL version; Xvesa: VBE info."], @@ -5650,8 +5676,8 @@ sub show_options { full RAID; triggers -xx."], ['2', '7', '', "Network IP data (-i), bluetooth, logical (-L), RAID forced, full CPU $flags; triggers -xxx."], - ['2', '8', '', "Everything available, including advanced gpu data (--gpu), - EDID (--edid), repos (-r), processes (-tcm), PCI slots (--slots); triggers + ['2', '8', '', "Everything available, including advanced gpu EDID (--edid) + data, repos (-r), processes (-tcm), PCI slots (--slots); triggers admin (-a)."], ); # if distro maintainers don't want the weather feature disable it @@ -5680,6 +5706,7 @@ sub show_options { ['1', '-z', '--filter', "Adds security filters for IP/MAC addresses, serial numbers, location (-w), user home directory name, host name. Default on for IRC clients."], + ['1', '', '--za,--filter-all', "Shortcut, triggers -z, --zl, --zu, --zv."], ['1', '', '--zl,--filter-label', "Filters out ${partition_string} labels in -j, -o, -p, -P, -Sa."], ['1', '', '--zu,--filter-uuid', "Filters out ${partition_string} UUIDs in -j, @@ -6748,7 +6775,6 @@ sub message { 'nv-current' => "current (as of $id)", 'nv-legacy-active' => "legacy-active (EOL~$id)", 'nv-legacy-eol' => 'legacy (EOL)', - 'nv-legacy-eol-try' => 'legacy (EOL, try --gpu)', 'optical-data' => 'No optical or floppy data found.', 'optical-data-bsd' => 'No optical or floppy data found.', 'output-control' => "-:: 'Enter' to continue to next block. Any key + 'Enter' to exit:", @@ -7087,10 +7113,10 @@ sub print_basic { sub print_data { my ($data) = @_; my ($counter,$length,$split_count) = (0,0,0); - my ($hash_id,$holder,$start,$start2,$start_holder) = ('','','','',''); + my ($hash_id,$holder,$holder2,$start,$start2,$start_holder) = ('','','','','',''); my $indent = $size{'indent'}; my (%ids); - my ($b_container,$b_ni2,$holder2,$key,$line,$val2,$val3); + my ($b_container,$b_ni2,$key,$line,$val2,$val3); # these 2 sets are single logic items my $b_single = ($size{'max-cols'} == 1) ? 1: 0; my ($b_row1,$indent_2,$indent_use,$indentx) = (1,0,0,0); @@ -7180,6 +7206,7 @@ sub print_data { # warning in Perl 5.08 oddly enough. ie, no: scalar (split(...)); my @temp = split(/\s+/, $val2); $split_count = scalar @temp; + # print "sc: $split_count l: " . (length("$key$sep{'s2'} $val2") + $indent_use), " val2: $val2\n"; if (!$b_single && (length("$key$sep{'s2'} $val2") + $length) < $size{'max-cols'}){ # print "h-1: r1: $b_row1 iu: $indent_use\n"; @@ -7189,14 +7216,12 @@ sub print_data { # handle case where the key/value pair is > max, and where there are # a lot of terms, like cpu flags, raid types supported. Raid can have # the last row have a lot of devices, or many raid types - elsif (!$b_single && - (length("$key$sep{'s2'} $val2") + $indent_use) > $size{'max-cols'} && - !defined $ids{$key} && $split_count > 2){ + elsif (!$b_single && $split_count > 2 && !defined $ids{$key} && + (length("$key$sep{'s2'} $val2") + $indent_use + $length) > $size{'max-cols'}){ # print "m-2 r1: $b_row1 iu: $indent_use\n"; my @values = split(/\s+/, $val2); $val3 = shift @values; $start2 = "$colors{'c1'}$key$sep{'s2'}$colors{'c2'} $val3 "; - $holder2 = ''; # case where not first item in line, but when key+first word added, # is wider than max width. if ($holder && @@ -7240,7 +7265,9 @@ sub print_data { $holder2 =~ s/\s+$//; $line = sprintf("%-${indent_use}s%s$colors{'cn'}\n","$start","$holder$holder2"); print_line($line); + # make sure wrapped value is indented correctly! $b_row1 = 0; + $indent_use = ($b_row1) ? $indent : $indent_2; $holder = ''; $holder2 = "$_ "; # print "h2: $holder2\n"; @@ -7249,16 +7276,13 @@ sub print_data { $start = ''; } } + # we don't want to start a new line, continue until full length. if ($holder2 !~ /^\s*$/){ # print "p-2: r1: $b_row1 iu: $indent_use\n"; - $holder2 =~ s/\s+$//; $holder2 = "$colors{'c2'}$holder2"; - $line = sprintf("%-${indent_use}s%s$colors{'cn'}\n","$start","$holder$holder2"); - print_line($line); + $holder = $holder2; $b_row1 = 0; - $holder = ''; $holder2 = ''; - $length = $indent_use; $start2 = ''; $start = ''; } @@ -10716,6 +10740,7 @@ sub cp_caches_fallback { } eval $end if $b_log; } + ## START CPU ARCH ## sub cp_cpu_arch { eval $start if $b_log; @@ -10752,121 +10777,128 @@ sub cp_cpu_arch { $year = '1995-99';} } elsif ($family eq '5'){ + ## verified if ($model =~ /^(0|1|2|3)$/){ $arch = 'K5'; - $process = 'AMD 350-500nm'; - $year = '1996';} - elsif ($model =~ /^(6|7)$/){ + $process = 'AMD 350nm'; + $year = '1996-97';} + elsif ($model =~ /^(6)$/){ + $arch = 'K6'; + $process = 'AMD 350nm'; + $year = '1997-98';} + elsif ($model =~ /^(7)$/){ $arch = 'K6'; - $process = 'AMD ' . ($model eq '6') ? '350nm' : '250nm'; + $process = 'AMD 250nm'; $year = '1997-98';} elsif ($model =~ /^(8)$/){ $arch = 'K6-2'; $process = 'AMD 250nm'; $year = '1998-2003';} - elsif ($model =~ /^(9|D)$/){ + elsif ($model =~ /^(9)$/){ + $arch = 'K6-3'; + $process = 'AMD 250nm'; + $year = '1999-2003';} + elsif ($model =~ /^(D)$/){ $arch = 'K6-3'; - $process = 'AMD 180-250nm'; + $process = 'AMD 180nm'; $year = '1999-2003';} + ## unverified elsif ($model =~ /^(A)$/){ - $arch = 'Geode'; + $arch = 'K6 Geode'; $process = 'AMD 150-350nm'; - $year = '';} # dates uncertain, 1999 start + $year = '1999';} # dates uncertain, 1999 start + ## fallback + else { + $arch = 'K6'; + $process = 'AMD 250-350nm'; + $year = '1999-2003';} } elsif ($family eq '6'){ ## verified - if ($model =~ /^(6)$/){ - $arch = 'K7'; # 6:2:Palomino, duron + if ($model =~ /^(1)$/){ + $arch = 'K7'; # 1:2:argon + $process = 'AMD 250nm'; + $year = '1999-2001';} + elsif ($model =~ /^(2|3|4|6)$/){ + # 3:0:duron;3:1:spitfire;4:2,4:thunderbird; 6:2:Palomino, duron; 2:1:Pluto + $arch = 'K7'; $process = 'AMD 180nm'; - $year = '2002-04';} - elsif ($model =~ /^(8)$/){ - $arch = 'K7'; # 8:1:thoroughbred, duron + $year = '2000-01';} + elsif ($model =~ /^(7|8|A)$/){ + $arch = 'K7'; # 7:0,1:Morgan;8:1:thoroughbred,duron-applebred; A:0:barton $process = 'AMD 130nm'; $year = '2002-04';} - ## to confirm - elsif ($model =~ /^(1|2)$/){ - $arch = 'K7'; # Athlon Classic - $process = 'AMD 180-250nm'; - $year = '1999-2002';} - elsif ($model =~ /^(3|4)$/){ - $arch = 'K7'; # Thunderbird - $process = 'AMD 180nm'; - $year = '2000-01';} - elsif ($model =~ /^(7|A)$/){ - $arch = 'K7'; # Palomino+; athlon xp - $process = 'AMD 130-180nm'; - $year = '2001-04';} + ## fallback else { $arch = 'K7'; - $process = 'AMD 130-250nm'; - $year = '2001-04';} + $process = 'AMD 130-180nm'; + $year = '2003-14';} } # note: family F K8 needs granular breakdowns, was a long lived family elsif ($family eq 'F'){ - # positive IDs, but sub arch difficult, stepping based - if ($model =~ /^(7|C)$/){ - $arch = 'K8'; # 7:A:clawhammer ADA3500DEP4AS; C:0:NewCastle + ## verified + # check: B|E|F + if ($model =~ /^(4|5|7|8|B|C|E|F)$/){ + # 4:0:clawhammer;5:8:sledgehammer;8:2,4:8:dubin;7:A;C:0:NewCastle; + $arch = 'K8'; $process = 'AMD 130nm'; $year = '2004-05';} - elsif ($model =~ /^(1C|23|28|2F)$/){ - $arch = 'K8'; # 1C:Palermo;2F:A:Venice; 28:1:Manchester; 23:2:Toledo + # check: 14|17|18|1B|25|48|4B|5D + elsif ($model =~ /^(14|15|17|18|1B|1C|1F|21|23|24|25|27|28|2C|2F|37|3F|41|43|48|4B|4C|4F|5D|5F|C1)$/){ + # 1C:0,2C:2:Palermo;21:0,2,23:2:denmark;1F:0:winchester;2F:2:Venice; + # 27:1,37:2:san diego;28:1,3F:2:Manchester;23:2:Toledo;$F:2,5F:2,3:Orleans; + # 5F:2:Manila?;37:2;C1:3:windsor fx;43:2,3:santa ana;41:2:santa rosa; + # 4C:2:Keene;2C:2:roma;24:2:newark + $arch = 'K8'; $process = 'AMD 90nm'; $year = '2004-06';} - elsif ($model =~ /^(6B|7F)$/){ - $arch = 'K8'; # Lima; 68:1:Brisbane + elsif ($model =~ /^(68|6B|6C|6F|7C|7F)$/){ + $arch = 'K8'; # 7F:1,2:Lima; 68:1,6B:1,2:Brisbane;6F:2:conesus;7C:2:sherman $process = 'AMD 65nm'; - $year = '2005-06';} - ## to confirm - elsif ($model =~ /^(4|5|8|B|E|F|14|15|17|18|1B|1F)$/){ - $arch = 'K8'; - $process = 'AMD 65-130nm'; - $year = '';} - elsif ($model =~ /^(21|24|25|27|2C)$/){ - $arch = 'K8'; # rev.E - $process = 'AMD 65-130nm'; - $year = '';} - elsif ($model =~ /^(41|43|48|4B|4C|4F|5D|5F|68|6C|6F|7C|C1)$/){ - $arch = 'K8'; # rev.F+ - $process = 'AMD 65-130nm'; - $year = '';} + $year = '2005-08';} + ## fallback else { $arch = 'K8'; $process = 'AMD 65-130nm'; - $year = '';} + $year = '2004-2008';} } + # K9 was planned but skipped elsif ($family eq '10'){ - if ($model =~ /^(6)$/){ - $arch = 'K10'; # 6:2:Regor + ## verified + if ($model =~ /^(2)$/){ + $arch = 'K10'; # 2:2:budapest;2:1,3:barcelona + $process = 'AMD 65nm'; + $year = '2007-08';} + elsif ($model =~ /^(4|5|6|8|9|A)$/){ + # 4:2:Suzuka;5:2,3:propus;6:2:Regor;8:0:Istanbul;9:1:maranello + $arch = 'K10'; $process = 'AMD 45nm'; - $year = '2009-14';} - elsif ($model =~ /^(2|4|5|8|9|A)$/){ - $arch = 'K10'; - $process = 'AMD 32-65nm'; - $year = '2007-14';} + $year = '2009-13';} + ## fallback else { $arch = 'K10'; - $process = 'AMD 32-65nm'; - $year = '2007-14';} + $process = 'AMD 45-65nm'; + $year = '2007-13';} } # very loose, all stepping 1: covers athlon x2, sempron, turion x2 # years unclear, could be 2005 start, or 2008 elsif ($family eq '11'){ if ($model =~ /^(3)$/){ - $arch = 'Athlon X2/Turion X2'; # unclear: K8 or K10 + $arch = 'K11 Turion X2'; # mix of K8/K10 $note = $check; - $process = 'AMD 45-90nm'; + $process = 'AMD 65-90nm'; $year = ''; } } # might also need cache handling like 14/16 elsif ($family eq '12'){ if ($model =~ /^(1)$/){ - $arch = 'Fusion'; + $arch = 'K12 Fusion'; # K10 based apu, llano $process = 'GF 32nm'; - $year = '';} + $year = '2011';} # check years else { - $arch = 'Fusion'; + $arch = 'K12 Fusion'; $process = 'GF 32nm'; - $year = '';} + $year = '2011';} # check years } # SOC, apu elsif ($family eq '14'){ @@ -10885,7 +10917,7 @@ sub cp_cpu_arch { $arch = 'Bulldozer'; $process = 'GF 32nm'; $year = '2011';} - # note: only 2,11,13 confirmed + # note: only 2,10,13 confirmed elsif ($model =~ /^(2|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F)$/){ $arch = 'Piledriver'; $process = 'GF 32nm'; @@ -10961,9 +10993,9 @@ sub cp_cpu_arch { $process = 'GF 14nm'; $year = '';} elsif ($family eq '19'){ - # ext model 7,8, but no base models yet + # ext model 6,7, but no base models yet # 10 engineering sample - if ($model =~ /^(10|7\d|8\d)$/){ + if ($model =~ /^(10|6\d|7\d)$/){ $arch = 'Zen 4'; $gen = '5'; $process = 'TSMC n5 (5nm)'; @@ -11135,24 +11167,62 @@ sub cp_cpu_arch { } elsif ($type eq 'intel'){ if ($family eq '4'){ - if ($model =~ /^(0|1|2|3|4|5|6|7|8|9)$/){ - $arch = '486'; + if ($model =~ /^(0|1|2)$/){ + $arch = 'i486'; + $process = '1000nm'; # 33mhz + $year = '1989-98';} + elsif ($model =~ /^(3)$/){ + $arch = 'i486'; + $process = '800nm'; # 66mhz + $year = '1992-98';} + elsif ($model =~ /^(4|5|6|7|8|9)$/){ + $arch = 'i486'; + $process = '600nm'; # 100mhz + $year = '1993-98';} + else { + $arch = 'i486'; $process = '600-1000nm'; - $year = '';} + $year = '1989-98';} } + # 1993-2000 elsif ($family eq '5'){ - if ($model =~ /^(1|2|3|7)$/){ + # verified + if ($model =~ /^(1)$/){ + $arch = 'P5'; + $process = 'Intel 800nm'; # 1:3,5,7:800 + $year = '1993-94';} + elsif ($model =~ /^(2)$/){ + $arch = 'P5'; # 2:5:MMX + # 2:C:350[or 600]; 2:1,4,5,6:600;but: + if ($stepping > 9){ + $process = 'Intel 350nm'; + $year = '1996-2000';} + else { + $process = 'Intel 600nm'; + $year = '1993-95';} + } + elsif ($model =~ /^(4)$/){ $arch = 'P5'; - $process = 'Intel 350-800nm'; + $process = 'Intel 350nm'; # MMX. 4:3:P55C + $year = '1997';} + # unverified + elsif ($model =~ /^(3|7)$/){ + $arch = 'P5'; # 7:0:MMX + $process = 'Intel 350-600nm'; $year = '';} - elsif ($model =~ /^(4|8)$/){ + elsif ($model =~ /^(8)$/){ $arch = 'P5'; - $process = 'Intel 350-800nm'; # MMX + $process = 'Intel 350-600nm'; # MMX $year = '';} elsif ($model =~ /^(9|A)$/){ $arch = 'Lakemont'; - $process = 'Intel 350-800nm'; + $process = 'Intel 350nm'; $year = '';} + # fallback + else { + $arch = 'P5'; + $process = 'Intel 350-600nm'; # MMX + $year = '1994-2000';} } elsif ($family eq '6'){ if ($model =~ /^(1)$/){ @@ -11169,8 +11239,8 @@ sub cp_cpu_arch { $year = '';} elsif ($model =~ /^(6)$/){ $arch = 'P6 II Mendocino'; - $process = 'Intel 250nm'; - $year = '';} + $process = 'Intel 250nm'; # 6:5:P6II-celeron-mendo + $year = '1999';} elsif ($model =~ /^(7)$/){ $arch = 'P6 III Katmai'; $process = 'Intel 250nm'; @@ -11188,7 +11258,7 @@ sub cp_cpu_arch { $process = 'Intel 180-250nm'; $year = '1999';} elsif ($model =~ /^(B)$/){ - $arch = 'P6 III Tualitin'; + $arch = 'P6 III Tualitin'; # 6:B:1,4 $process = 'Intel 130nm'; $year = '2001';} elsif ($model =~ /^(D)$/){ @@ -11200,7 +11270,7 @@ sub cp_cpu_arch { $process = 'Intel 65nm'; $year = '2006-08';} elsif ($model =~ /^(F|16)$/){ - $arch = 'Core2 Merom'; + $arch = 'Core2 Merom'; # 16:1:conroe-l[65nm] $process = 'Intel 65nm'; $year = '2006-09';} elsif ($model =~ /^(15)$/){ @@ -11212,7 +11282,7 @@ sub cp_cpu_arch { $process = 'Intel 45nm'; $year = '2007-08';} elsif ($model =~ /^(17)$/){ - $arch = 'Penryn Yorkfield'; + $arch = 'Penryn'; # 17:A:Core 2,Celeron-wolfdale,yorkfield $process = 'Intel 45nm'; $year = '2008';} # had 25 also, but that's westmere, at least for stepping 2 @@ -11350,17 +11420,19 @@ sub cp_cpu_arch { $process = 'Intel 7 (10nm ESF)'; $year = '2021';} # server elsif ($model =~ /^(97|9A)$/){ - $arch = 'Alder Lake'; + $arch = 'Alder Lake'; # socket LG 1700 $process = 'Intel 7 (10nm ESF)'; $year = '2021';} ## IDS UNKNOWN, release late 2022 # elsif ($model =~ /^()$/){ - # $arch = 'Raptor Lake'; # - # $process = 'Intel 7 (10nm)';} + # $arch = 'Raptor Lake'; # 13 gen, socket LG 1700,1800 + # $process = 'Intel 7 (10nm)'; + # $year = '2022';} # elsif ($model =~ /^()$/){ - # $arch = 'Meteor Lake'; + # $arch = 'Meteor Lake'; # 14 gen # $process = 'Intel 4';} # Granite Rapids: Intel 3 (7nm) + # Arrow Lake - 15 gen elsif ($model =~ /^(9E)$/){ if ($stepping == 9){ $arch = 'Kaby Lake'; @@ -11413,8 +11485,8 @@ sub cp_cpu_arch { $process = 'Intel 90nm'; $year = '2004-06';} # 6? Nocona elsif ($model =~ /^(4)$/){ - if ($stepping == 1){ - $arch = 'Netburst Prescott'; + if ($stepping < 10){ + $arch = 'Netburst Prescott'; # 4:1,9:prescott $process = 'Intel 90nm'; $year = '2004-06';} else { @@ -11443,12 +11515,13 @@ sub cp_cpu_arch { } # gen 1 had no gen, only 3 digits: Core i5-661 Core i5-655K; Core i5 M 520 # EXCEPT gen 1: Core i7-720QM Core i7-740QM Core i7-840QM - # 2nd: Core i5-2390T Core i7-11700F Core i5-8400 + # 2nd: Core i5-2390T Core i7-11700F Core i5-8400 + # 2nd variants: Core i7-1165G7 if ($name){ if ($name =~ /\bi[357][\s-]([A-Z][\s-]?)?(\d{3}([^\d]|\b)|[78][24]00M)/){ $gen = ($gen) ? "$gen (core 1)": 'core 1'; } - elsif ($name =~ /\bi[3579][\s-]([A-Z][\s-]?)?([2-9]|1[0-4])\d{3}/){ + elsif ($name =~ /\bi[3579][\s-]([A-Z][\s-]?)?([2-9]|1[0-4])(\d{3}|\d{2}[A-Z]\d)/){ $gen = ($gen) ? "$gen (core $2)" : "core $2"; } } @@ -11873,7 +11946,8 @@ sub system_cpu_name { # MHZ - cell cpus sub clean_speed { my ($speed,$opt) = @_; - return if !$speed || $speed eq '0'; + # eq '0' might be for string typing; value can be: <unknown> + return if !$speed || $speed eq '0' || $speed =~ /^\D/; $speed =~ s/[GMK]HZ$//gi; $speed = ($speed/1000) if $opt && $opt eq 'khz'; $speed = sprintf("%.0f", $speed); @@ -13204,7 +13278,7 @@ sub set_disk_vendors { # MAB3045SP shows as HP or Fujitsu, probably HP branded fujitsu ['^(MAB\d)','^(HP\b|FUJITSU)','Fujitsu/HP',''], # note: 2012: wdc bought hgst - ['^(HGST|Touro|54[15]0|7250|HC[CT]\d)','^HGST','HGST (Hitachi)',''], # HGST HUA + ['^(DKR|HGST|Touro|54[15]0|7250|HC[CT]\d)','^HGST','HGST (Hitachi)',''], # HGST HUA ['^((ATA\s)?Hitachi|HCS|HD[PST]|DK\d|IC|(HDD\s)?HT|HU|HMS|HDE|0G\d|IHAT)','Hitachi','Hitachi',''], # vb: VB0250EAVER but clashes with vbox; HP_SSD_S700_120G ;GB0500EAFYL GB starter too generic? ['^(HP\b|[MV]B[0-6]|G[BJ]\d|DF\d|F[BK]|0-9]|MM\d{4}|PSS|XR\d{4}|c350|v\d{3}[bgorw]$|x\d{3}[w]$|VK0|HC[CPY]\d|EX9\d\d)','^HP','HP',''], @@ -13213,7 +13287,7 @@ sub set_disk_vendors { ['^STmagic','^STmagic','STmagic',''], ['^(STMicro|SMI|CBA)','^(STMicroelectronics|SMI)','SMI (STMicroelectronics)',''], # note M2 M3 is usually maxtor, but can be samsung. Can conflict with Team: TM\d{4}| - ['^(MAXTOR|Atlas|E0\d0L|L(250|500)|[KL]0[1-9]|Y\d{3}[A-Z]|STM\d|F\d{3}L)','^MAXTOR','Maxtor',''], + ['^(MAXTOR|Atlas|4R\d{2}|E0\d0L|L(250|500)|[KL]0[1-9]|Y\d{3}[A-Z]|STM\d|F\d{3}L)','^MAXTOR','Maxtor',''], # OCZSSD2-2VTXE120G is OCZ-VERTEX2_3.5 ['^(OCZ|Agility|APOC|D2|DEN|DEN|DRSAK|EC188|FTNC|GFGC|MANG|MMOC|NIMC|NIMR|PSIR|RALLY2|TALOS2|TMSC|TRSAK|VERTEX|Trion|Onyx|Vector[\s-]?15)','^OCZ[\s-]','OCZ',''], ['^(OWC|Aura|Mercury[\s-]?(Electra|Extreme))','^OWC\b','OWC',''], @@ -13385,7 +13459,7 @@ sub set_disk_vendors { ['^Hypertec','^Hypertec','Hypertec',''], ['^HyperX','^HyperX','HyperX',''], ['^(Hyundai|Sapphire)','^Hyundai','Hyundai',''], - ['^(IBM|DT|ESA[1-9])','^IBM','IBM',''], + ['^(IBM|DT|ESA[1-9]|ServeRaid)','^IBM','IBM',''], # M5110 too common ['^IEI Tech','^IEI Tech(\.|nology)?( Corp(\.|oration)?)?','IEI Technology',''], ['^(IGEL|UD Pocket)','^IGEL','IGEL',''], ['^(Imation|Nano\s?Pro|HQT)','^Imation(\sImation)?','Imation',''], # Imation_ImationFlashDrive; TF20 is imation/tdk @@ -13395,7 +13469,7 @@ sub set_disk_vendors { ['^(Indilinx|IND-)','^Indilinx','Indilinx',''], ['^INDMEM','^INDMEM','INDMEM',''], ['^(Infokit)','^Infokit','Infokit',''], - ['^(Initio)','^Initio','Initio',''], + # note: Initio default controller, means master/slave jumper is off/wrong, not a vendor ['^Inland','^Inland','Inland',''], ['^(InnoDisk|Innolite|SATA\s?Slim|DRPS)','^InnoDisk( Corp.)?','InnoDisk',''], ['(Innostor|1f75)','(Innostor|1f75)','Innostor',''], @@ -13411,6 +13485,7 @@ sub set_disk_vendors { ['^(Iomega|ZIP\b|Clik!)','^Iomega','Iomega',''], ['^ISOCOM','^ISOCOM','ISOCOM (Shenzhen Longsys Electronics)',''], ['^iTE[\s-]*Tech','^iTE[\s-]*Tech(nology)?','iTE Tech',''], + ['^(James[\s-]?Donkey|JD\d)','^James[\s-]?Donkey','James Donkey',''], ['^(Jaster|JS\d)','^Jaster','Jaster',''], ['^JingX','^JingX','JingX',''], #JingX 120G SSD - not confirmed, but guessing ['^Jingyi','^Jingyi','Jingyi',''], @@ -13418,6 +13493,7 @@ sub set_disk_vendors { ['^JMicron','^JMicron(\s?Tech(nology)?)?','JMicron Tech',''], #JMicron H/W raid ['^Kazuk','^Kazuk','Kazuk',''], ['(\bKDI\b|^OM3P)','\bKDI\b','KDI',''], + ['^KLLISRE','^KLLISRE','KLLISRE',''], ['^KimMIDI','^KimMIDI','KimMIDI',''], ['^Kimtigo','^Kimtigo','Kimtigo',''], ['^Kingbank','^Kingbank','Kingbank',''], @@ -13428,7 +13504,7 @@ sub set_disk_vendors { ['^Kingrich','^Kingrich','Kingrich',''], ['^Kingsand','^Kingsand','Kingsand',''], ['KING\s?SHA\s?RE','KING\s?SHA\s?RE','KingShare',''], - ['^(KingSpec|ACSC|KS[DQ]|N[ET]-\d|P3$|P4\b|PA[_-]?(18|25)|Q-180|T-(3260|64|128)|Z(\d\s|F\d))','^KingSpec','KingSpec',''], + ['^(KingSpec|ACSC|C3000|KS[DQ]|N[ET]-\d|P3$|P4\b|PA[_-]?(18|25)|Q-180|T-(3260|64|128)|Z(\d\s|F\d))','^KingSpec','KingSpec',''], ['^KingSSD','^KingSSD','KingSSD',''], # kingwin docking, not actual drive ['^(EZD|EZ-Dock)','','Kingwin Docking Station',''], @@ -13439,9 +13515,11 @@ sub set_disk_vendors { ['^(KUAIKAI|MSAM)','^KUAIKAI','KuaKai',''], ['(KUIJIA|DAHUA)','^KUIJIA','KUIJIA',''], ['^KUNUP','^KUNUP','KUNUP',''], + ['^KUU','^KUU\b','KUU',''], # KUU-128GB ['^(Lacie|P92|itsaKey|iamaKey)','^Lacie','LaCie',''], ['^LANBO','^LANBO','LANBO',''], ['^LANTIC','^LANTIC','Lantic',''], + ['^Lapcare','^Lapcare','Lapcare',''], ['^(Lazos|L-?ISS)','^Lazos','Lazos',''], ['^LDLC','^LDLC','LDLC',''], # LENSE30512GMSP34MEAT3TA / UMIS RPITJ256PED2MWX @@ -13497,9 +13575,11 @@ sub set_disk_vendors { ['^MSI\b','^MSI\b','MSI',''], ['^MTASE','^MTASE','MTASE',''], ['^MTRON','^MTRON','MTRON',''], - ['^(MyDigitalSSD|BP4)','^MyDigitalSSD','MyDigitalSSD',''], # BP4 = BulletProof4 + ['^(MyDigitalSSD|BP[4X])','^MyDigitalSSD','MyDigitalSSD',''], # BP4 = BulletProof4 + ['^(Myson)','^Myson([\s-]?Century)?([\s-]?Inc\.?)?','Myson Century',''], ['^(Neo\s*Forza|NFS\d)','^Neo\s*Forza','Neo Forza',''], ['^(Netac|S535N)','^Netac','Netac',''], + ['^NFHK','^NFHK','NFHK',''], # NGFF is a type, like msata, sata ['^Nik','^Nikimi','Nikimi',''], ['^NOREL','^NOREL(SYS)?','NorelSys',''], @@ -13515,6 +13595,7 @@ sub set_disk_vendors { ['^(Patriot|PS[8F]|P2\d{2}|PBT|VPN|Viper|Burst|Blast|Blaze|Pyro|Ignite)','^Patriot([-\s]?Memory)?','Patriot',''],#Viper M.2 VPN100 ['^PERC\b','','Dell PowerEdge RAID Card',''], # ssd ['(PHISON[\s-]?|ESR\d)','PHISON[\s-]?','Phison',''],# E12-256G-PHISON-SSD-B3-BB1 + ['^(Pichau[\s-]?Gaming|PG\d{2})','^Pichau[\s-]?Gaming','Pichau Gaming',''], ['^Pioneer','Pioneer','Pioneer',''], ['^Platinet','Platinet','Platinet',''], ['^(PLEXTOR|PX-)','^PLEXTOR','Plextor',''], @@ -13530,6 +13611,7 @@ sub set_disk_vendors { ['^(Ramaxel|RT|RM|RPF|RDM)','^Ramaxel','Ramaxel',''], ['^(Ramsta|R[1-9])','^Ramsta','Ramsta',''], ['^(Realtek|RTL)','^Realtek','Realtek',''], + ['^(Reletech)','^Reletech','Reletech',''], # id: P400 but that's too short ['^RENICE','^RENICE','Renice',''], ['^RevuAhn','^RevuAhn','RevuAhn',''], ['^(Ricoh|R5)','^Ricoh','Ricoh',''], @@ -13587,6 +13669,7 @@ sub set_disk_vendors { ['^Tele2','^Tele2','Tele2',''], ['^Teleplan','^Teleplan','Teleplan',''], ['^TEUTONS','^TEUTONS','TEUTONS',''], + ['^(Textorm)','^Textorm','Textorm',''], # B5 too short ['^THU','^THU','THU',''], ['^Tigo','^Tigo','Tigo',''], ['^(Timetec|35TT)','^Timetec','Timetec',''], @@ -13601,6 +13684,7 @@ sub set_disk_vendors { # note: udisk means usb disk, it's not a vendor ID ['^UDinfo','^UDinfo','UDinfo',''], ['^UMAX','^UMAX','UMAX',''], + ['^(UMIS|RP[IJ]TJ)','^UMIS','UMIS',''], ['^USBTech','^USBTech','USBTech',''], ['^(UNIC2)','^UNIC2','UNIC2',''], ['^(UG|Unigen)','^Unigen','Unigen',''], @@ -13621,7 +13705,10 @@ sub set_disk_vendors { ['^Walton','^Walton','Walton',''], ['^(Wearable|Air-?Stash)','^Wearable','Wearable',''], ['^Wellcomm','^Wellcomm','Wellcomm',''], + ['^(wicgtyp|N900)','^wicgtyp','wicgtyp',''], ['^Wilk','^Wilk','Wilk',''], + ['^(WinMemory|SWG\d)','^WinMemory','WinMemory',''], + ['^(Winton|WT\d{2})','^Winton','Winton',''], ['^WPC','^WPC','WPC',''], # WPC-240GB ['^(Wortmann(\sAG)?|Terra\s?US)','^Wortmann(\sAG)?','Wortmann AG',''], ['^(XinTop|XT-)','^XinTop','XinTop',''], @@ -13659,10 +13746,12 @@ sub disk_vendor { my ($vendor) = (''); return if !$model; # 0 - match pattern; 1 - replace pattern; 2 - vendor print; 3 - serial pattern - # Data URLs: inxi-resources.txt Section: DriveItem disk_vendor() + # Data URLs: inxi-resources.txt Section: DriveItem device_vendor() # $model = 'H10 HBRPEKNX0202A NVMe INTEL 512GB'; # $model = 'Patriot Memory'; set_disk_vendors() if !$vendors; + # prefilter this one, some usb enclosurs and wrong master/slave hdd show default + $model =~ s/^Initio[\s_]//i; foreach my $row (@$vendors){ if ($model =~ /$row->[0]/i || ($row->[3] && $serial && $serial =~ /$row->[3]/)){ $vendor = $row->[2]; @@ -13908,12 +13997,19 @@ sub get { ($gpu_amd,$gpu_intel,$gpu_nv) = (); if (!@$rows){ my $key = 'Message'; + my $message = ''; my $type = 'pci-card-data'; if ($pci_tool && $alerts{$pci_tool}->{'action'} eq 'permissions'){ $type = 'pci-card-data-root'; } + elsif (!$bsd_type && !%risc && !$pci_tool && + $alerts{'lspci'}->{'action'} && + $alerts{'lspci'}->{'action'} eq 'missing'){ + $message = $alerts{'lspci'}->{'message'}; + } + $message = main::message($type,'') if !$message; @$rows = ({ - main::key($num++,0,1,$key) => main::message($type,'') + main::key($num++,0,1,$key) => $message }); } } @@ -13975,7 +14071,7 @@ sub device_output { # ($row->[5],$row->[6],$row->[4]) = ('12de','0029',''); my ($gpu_data,$b_nv) = gpu_data($row->[5],$row->[6],$row->[4]); if (!$bsd_type && $b_nv && $b_admin){ - if ($gpu_data->{'legacy'} && $show{'gpu-data'}){ + if ($gpu_data->{'legacy'}){ $rows->[$j]{main::key($num++,1,3,'non-free')} = ''; $rows->[$j]{main::key($num++,0,4,'series')} = $gpu_data->{'series'}; $rows->[$j]{main::key($num++,0,4,'status')} = $gpu_data->{'status'}; @@ -13995,7 +14091,7 @@ sub device_output { if ($gpu_data->{'arch'}){ $rows->[$j]{main::key($num++,1,2,'arch')} = $gpu_data->{'arch'}; # we don't need to see repeated values here, but usually code is different. - if ($show{'gpu-data'} && $gpu_data->{'code'} && + if ($b_admin && $gpu_data->{'code'} && $gpu_data->{'code'} ne $gpu_data->{'arch'}){ $rows->[$j]{main::key($num++,0,3,'code')} = $gpu_data->{'code'}; } @@ -15727,22 +15823,22 @@ sub set_amd_data { 'process' => 'TSMC 500-600nm', 'years' => '1992-97', }, - {'arch' => 'Rage 2', + {'arch' => 'Rage-2', 'ids' => '4756|4757|4759|475a|4c47', - 'code' => 'Rage 2', + 'code' => 'Rage-2', 'process' => 'TSMC 500nm', 'years' => '1996', }, - {'arch' => 'Rage 3', + {'arch' => 'Rage-3', 'ids' => '4742|4744|4749|474d|474f|4750|4752', - 'code' => 'Rage 3', + 'code' => 'Rage-3', 'process' => 'TSMC 350nm', 'years' => '1997-99', }, - {'arch' => 'Rage 4', - 'ids' => '474e|4753|4c46|4c4d|4c52|4d46|5044|5046|5050|5052|5245|5246|524b|' . - '524c|534d|5446|5452', - 'code' => 'Rage 4', + {'arch' => 'Rage-4', + 'ids' => '474e|4753|4c46|4c4d|4c4e|4c52|4d46|5044|5046|5050|5052|5245|5246|' . + '524b|524c|534d|5446|5452', + 'code' => 'Rage-4', 'process' => 'TSMC 250-350nm', 'years' => '1998-99', }, @@ -15754,13 +15850,13 @@ sub set_amd_data { # 'years' => '1999-2001', # }, # rage 5 was game cube flipper chip - {'arch' => 'Rage 6', + {'arch' => 'Rage-6', 'ids' => '4137|4337|4437|4c59|5144|5159|515e', 'code' => 'R100', 'process' => 'TSMC 180nm', 'years' => '2000-07', }, - {'arch' => 'Rage 7', + {'arch' => 'Rage-7', 'ids' => '4136|4150|4152|4170|4172|4242|4336|4966|496e|4c57|4c58|4c66|4c6e|' . '4e51|4f72|4f73|5148|514c|514d|5157|5834|5835|5940|5941|5944|5960|5961|5962|' . '5964|5965|5b63|5b72|5b73|5c61|5c63|5d44|5d45|7100|7101|7102|7109|710a|710b|' . @@ -15773,7 +15869,7 @@ sub set_amd_data { 'process' => 'TSMC 150nm', 'years' => '2001-06', }, - {'arch' => 'Rage 8', + {'arch' => 'Rage-8', 'ids' => '4144|4146|4147|4148|4151|4153|4154|4155|4157|4164|4165|4166|4168|' . '4171|4173|4e44|4e45|4e46|4e47|4e48|4e49|4e4b|4e50|4e52|4e54|4e64|4e65|4e66|' . '4e67|4e68|4e69|4e6a|4e71|5a41|5a42|5a61|5a62', @@ -15781,7 +15877,7 @@ sub set_amd_data { 'process' => 'TSMC 130nm', 'years' => '2002-07', }, - {'arch' => 'Rage 9', + {'arch' => 'Rage-9', 'ids' => '3150|3151|3152|3154|3155|3171|3e50|3e54|3e70|4e4a|4e56|5460|5461|' . '5462|5464|5657|5854|5874|5954|5955|5974|5975|5b60|5b62|5b64|5b65|5b66|5b70|' . '5b74|5b75', @@ -15819,7 +15915,7 @@ sub set_amd_data { 'process' => 'TSMC 55-65nm', 'years' => '2005-13', }, - {'arch' => 'TeraScale 2', + {'arch' => 'TeraScale-2', 'ids' => '6720|6738|6739|673e|6740|6741|6742|6743|6749|674a|6750|6751|6758|' . '6759|675b|675d|675f|6760|6761|6763|6764|6765|6766|6767|6768|6770|6771|6772|' . '6778|6779|677b|6840|6841|6842|6843|6880|6888|6889|688a|688c|688d|6898|6899|' . @@ -15831,7 +15927,7 @@ sub set_amd_data { 'process' => 'TSMC 32-40nm', 'years' => '2009-15', }, - {'arch' => 'TeraScale 3', + {'arch' => 'TeraScale-3', 'ids' => '6704|6707|6718|6719|671c|671d|671f|9900|9901|9903|9904|9905|9906|' . '9907|9908|9909|990a|990b|990c|990d|990e|990f|9910|9913|9917|9918|9919|9990|' . '9991|9992|9993|9994|9995|9996|9997|9998|9999|999a|999b|999c|999d|99a0|99a2|' . @@ -15840,7 +15936,7 @@ sub set_amd_data { 'process' => 'TSMC 32nm', 'years' => '2010-13', }, - {'arch' => 'GCN 1', + {'arch' => 'GCN-1', 'ids' => '154c|6600|6601|6604|6605|6606|6607|6608|6609|6610|6611|6613|6631|' . '6660|6663|6664|6665|6667|666f|6780|6784|6788|678a|6798|679a|679b|679e|679f|' . '6800|6801|6802|6806|6808|6809|6810|6811|6816|6817|6818|6819|6820|6821|6822|' . @@ -15849,7 +15945,7 @@ sub set_amd_data { 'process' => 'TSMC 28nm', 'years' => '2011-20', }, - {'arch' => 'GCN 2', + {'arch' => 'GCN-2', 'ids' => '1304|1305|1306|1307|1309|130a|130b|130c|130d|130e|130f|1310|1311|' . '1312|1313|1315|1316|1317|1318|131b|131c|131d|6640|6641|6646|6647|6649|664d|' . '6650|6651|6658|665c|665d|665f|67a0|67a1|67a2|67a8|67a9|67aa|67b0|67b1|67b8|' . @@ -15860,13 +15956,13 @@ sub set_amd_data { 'process' => 'GF/TSMC 16-28nm', # both TSMC and GlobalFoundries 'years' => '2013-17', }, - {'arch' => 'GCN 3', + {'arch' => 'GCN-3', 'ids' => '6900|6901|6907|6920|6921|6929|692b|6938|6939|693b|7300|9874', 'code' => 'Volcanic Islands', 'process' => 'TSMC 28nm', 'years' => '2014-19', }, - {'arch' => 'GCN 4', + {'arch' => 'GCN-4', 'ids' => '154e|1551|1552|1561|67c0|67c2|67c4|67c7|67ca|67cc|67cf|67d0|67d4|' . '67d7|67df|67e0|67e1|67e3|67e8|67e9|67eb|67ef|67ff|694c|694e|694f|6980|6981|' . '6985|6986|6987|698f|6995|699f|6fdf|9924|9925', @@ -15874,48 +15970,48 @@ sub set_amd_data { 'process' => 'GF 14nm', 'years' => '2016-20', }, - {'arch' => 'GCN 5.1', + {'arch' => 'GCN-5.1', 'ids' => '15df|1636|1638|164c|66a0|66a1|66a2|66a3|66a7|66af|69af', - 'code' => 'Vega 2', + 'code' => 'Vega-2', 'process' => 'TSMC n7 (7nm)', 'years' => '2018-21', }, - {'arch' => 'GCN 5', + {'arch' => 'GCN-5', 'ids' => '15d8|15dd|15ff|6860|6861|6862|6863|6864|6867|6868|6869|686a|686b|' . '686c|686d|686e|687f|69a0|69a1|69a2|69a3', 'code' => 'Vega', 'process' => 'GF 14nm', 'years' => '2017-20', }, - {'arch' => 'RDNA 1', + {'arch' => 'RDNA-1', 'ids' => '13e9|13fe|1478|1479|1607|7310|7312|731f|7340|7341|7347|734f|7360|' . '7362', 'code' => 'Navi', 'process' => 'TSMC n7 (7nm)', 'years' => '2019-20', }, - {'arch' => 'RDNA 2', - 'ids' => '1506|15e7|163f|164d|1681|73a1|73a2|73a3|73a5|73ab|73ae|73af|73bf|' . - '73c3|73ce|73df|73e0|73e1|73e3|73ef|73ff|7421|7422|7423|7424|743f', - 'code' => 'Navi 2x', + {'arch' => 'RDNA-2', + 'ids' => '13f9|1506|15e7|163f|164d|164e|1681|73a1|73a2|73a3|73a5|73ab|73ae|' . + '73af|73bf|73c3|73ce|73df|73e0|73e1|73e3|73ef|73ff|7421|7422|7423|7424|743f', + 'code' => 'Navi-2x', 'process' => 'TSMC n7 (7nm)', 'years' => '2020-22', }, - {'arch' => 'RDNA 3', + {'arch' => 'RDNA-3', 'ids' => '15bf|164f', - 'code' => 'Navi 3x', + 'code' => 'Navi-3x', 'process' => 'TSMC n5 (5nm)', 'years' => '2022+', }, - {'arch' => 'CDNA 1', + {'arch' => 'CDNA-1', 'ids' => '7388|738c|738e', - 'code' => 'Instinct MI1xx', + 'code' => 'Instinct-MI1xx', 'process' => 'TSMC n7 (7nm)', 'years' => '2020', }, - {'arch' => 'CDNA 2', + {'arch' => 'CDNA-2', 'ids' => '7408|740c|740f', - 'code' => 'Instinct MI2xx', + 'code' => 'Instinct-MI2xx', 'process' => 'TSMC n6 (7nm)', 'years' => '2021-22+', }, @@ -15923,7 +16019,7 @@ sub set_amd_data { } sub set_intel_data { $gpu_intel = [ - {'arch' => 'Gen1', + {'arch' => 'Gen-1', 'ids' => '1132|7120|7121|7122|7123|7124|7125|7126|7128|712a', 'code' => '', 'process' => 'Intel 150nm', @@ -15936,25 +16032,25 @@ sub set_intel_data { 'process' => 'Intel 150nm', 'years' => '1998', }, - {'arch' => 'Gen2', + {'arch' => 'Gen-2', 'ids' => '2562|2572|3577|3582|358e', 'code' => '', 'process' => 'Intel 130nm', 'years' => '2002-03', }, - {'arch' => 'Gen3', + {'arch' => 'Gen-3', 'ids' => '2582|2592|2780|2782|2792', 'code' => 'Intel 130nm', 'process' => '', 'years' => '2004-05', }, - {'arch' => 'Gen3.5', + {'arch' => 'Gen-3.5', 'ids' => '2772|2776|27a2|27a6|27ae|2972|2973', 'code' => '', 'process' => 'Intel 90nm', 'years' => '2005-06', }, - {'arch' => 'Gen4', + {'arch' => 'Gen-4', 'ids' => '2982|2983|2992|2993|29a2|29a3|29b2|29b3|29c2|29c3|29d2|29d3|2a02|' . '2a03|2a12|2a13', 'code' => '', @@ -15962,12 +16058,12 @@ sub set_intel_data { 'years' => '2006-07', }, {'arch' => 'PowerVR SGX535', - 'ids' => '8108|8109|a001|a002|a011|a012', + 'ids' => '4100|8108|8109|a001|a002|a011|a012', 'code' => '', 'process' => 'Intel 45-130nm', 'year' => '2008-10', }, - {'arch' => 'Gen5', + {'arch' => 'Gen-5', 'ids' => '2a41|2a42|2a43|2e02|2e03|2e12|2e13|2e22|2e23|2e32|2e33|2e42|2e43|' . '2e92|2e93', 'code' => '', @@ -15981,7 +16077,7 @@ sub set_intel_data { 'process' => 'Intel 65nm', 'years' => '2008-10', }, - {'arch' => 'Gen5.75', + {'arch' => 'Gen-5.75', 'ids' => '0042|0046|004a|0402|0412|0416', 'code' => '', 'process' => 'Intel 45nm', @@ -15993,66 +16089,68 @@ sub set_intel_data { 'process' => 'Intel 22nm', 'years' => '2012-13', }, - {'arch' => 'Gen6', + {'arch' => 'Gen-6', 'ids' => '0102|0106|010b|010e|0112|0116|0122|0126|08cf', 'code' => '', 'process' => 'Intel 32nm', 'years' => '2011', }, - {'arch' => 'Gen7', + {'arch' => 'Gen-7', 'ids' => '0152|0156|015a|015e|0162|0166|016a|0172|0176', 'code' => '', 'process' => 'Intel 22nm', 'years' => '2012-13', }, - {'arch' => 'Gen7.5', + {'arch' => 'Gen-7.5', 'ids' => '0406|041e|0a06|0a16|0a22|0a26|0a2a|0a2e', 'code' => '', 'process' => 'Intel 22nm', 'years' => '2013', }, - {'arch' => 'Gen8', + {'arch' => 'Gen-8', 'ids' => '1602|160a|160b|160d|160e|1612|1616|161a|161b|161d|161e|1622|1626|' . '162a|162b|162d|162e|1632|1636|163a|163b|163d|163e|22b0|22b1', 'code' => '', 'process' => 'Intel 14nm', 'years' => '2014-15', }, - {'arch' => 'Gen9', - 'ids' => '1902|1906|1912|1916|191b|191d|191e|1921|1926|1927|192b|192d|1932|' . - '193a|193b|193d|5a84|5a85', + {'arch' => 'Gen-9', + 'ids' => '1902|1906|190b|1912|1916|191b|191d|191e|1921|1923|1926|1927|192b|' . + '192d|1932|193a|193b|193d|5a84|5a85', 'code' => '', 'process' => 'Intel 14n', 'years' => '2015-16', }, - {'arch' => 'Gen9.5', - 'ids' => '3184|3185|3e90|3e91|3e92|3e93|3e96|3e98|3e9b|3ea0|3ea5|5902|5912|' . - '5916|5917|591b|591c|591d|591e|5923|5926|5927|87c0|9b41|9ba8|9bc4|9bc5|9bc8|' . - '9bca', + {'arch' => 'Gen-9.5', + 'ids' => '3184|3185|3e90|3e91|3e92|3e93|3e94|3e96|3e98|3e9a|3e9b|3e9c|3ea0|' . + '3ea1|3ea5|3ea6|3ea8|3ea9|5902|5906|590b|5912|5916|5917|591b|591c|591d|591e|' . + '5921|5923|5926|5927|87c0|87ca|9b21|9b41|9ba4|9ba8|9baa|9bac|9bc4|9bc5|9bc6|' . + '9bc8|9bca|9bcc|9be6|9bf6', 'code' => '', 'process' => 'Intel 14nm', 'years' => '2016-20', }, # gen10 was cancelled., - {'arch' => 'Gen11', - 'ids' => '0d16|0d26|0d36|4e55|4e61|4e71|8a51|8a52|8a53|8a56|8a5a|8a5c', + {'arch' => 'Gen-11', + 'ids' => '0d16|0d26|0d36|4555|4571|4e55|4e61|4e71|8a51|8a52|8a53|8a56|8a58|' . + '8a5a|8a5c|9840|9841', 'code' => '', 'process' => 'Intel 10nm', 'years' => '2019-21', }, - {'arch' => 'Gen12.1', - 'ids' => '4905|4908|4c8a|4c8b|4c90|4c9a|9a49|9a60|9a68', + {'arch' => 'Gen-12.1', + 'ids' => '4905|4908|4c8a|4c8b|4c90|4c9a|9a40|9a49|9a60|9a68|9a70|9a78', 'code' => '', 'process' => 'Intel 10nm', 'years' => '2020-21', }, - {'arch' => 'Gen12.2', - 'ids' => '4626|46a3|46a6', + {'arch' => 'Gen-12.2', + 'ids' => '4626|4628|4682|4688|4690|4692|4693|46a3|46a6|46a8|46aa|46b3|46c3', 'code' => '', 'process' => 'Intel 10nm', 'years' => '2021-22+', }, - {'arch' => '12.5', + {'arch' => 'Gen-12.5', 'ids' => '', 'code' => 'Arctic Sound', 'pattern' => 'Arctic', @@ -16060,13 +16158,20 @@ sub set_intel_data { 'years' => '2021-22+', }, # Jupiter Sound cancelled? - {'arch' => 'Gen12.7', + {'arch' => 'Gen-12.7', 'ids' => '', 'code' => 'Alchemist', 'pattern' => 'Alchemist|DG2|Arc A\d{3}M?', 'process' => 'TSMC n6 (7nm)', 'years' => '2022+', }, + {'arch' => 'Gen-13', + 'ids' => 'a780|a781|a782|a783|a788|a789|a78a|a78b', + 'code' => '', + 'pattern' => 'Raptor Lake', + 'process' => 'Intel 7 (10nm)', + 'years' => '2022+', + }, ]; } sub set_nv_data { @@ -16074,8 +16179,7 @@ sub set_nv_data { # 0008|0009|0010|0018|0019 # and these are vendor id: 10de for 73.14 # 0020|0028|0029|002c|002d|00a0|0100|0101|0103|0150|0151|0152|0153 - my $try = ($show{'gpu-data'}) ? '' : '-try'; - my $status_eol = main::message('nv-legacy-eol' . $try); + my $status_eol = main::message('nv-legacy-eol'); my $date = $self_date; $date =~ s/-\d+$//; my $status_current = main::message('nv-current',$date); @@ -18042,12 +18146,20 @@ sub get { } else { my $key = 'Message'; + my $message = ''; my $type = 'pci-card-data'; + # for some reason, this was in device_output too redundantly if ($pci_tool && $alerts{$pci_tool}->{'action'} eq 'permissions'){ $type = 'pci-card-data-root'; } + elsif (!$bsd_type && !%risc && !$pci_tool && + $alerts{'lspci'}->{'action'} && + $alerts{'lspci'}->{'action'} eq 'missing'){ + $message = $alerts{'lspci'}->{'message'}; + } + $message = main::message($type,'') if !$message; @$rows = ({ - main::key($num++,0,1,$key) => main::message($type,'') + main::key($num++,0,1,$key) => $message }); } } @@ -18151,17 +18263,6 @@ sub device_output { # print "$row->[0]\n"; } # @rows = (); - # we want to handle ARM errors in main get - if (!@$rows && !%risc){ - my $key = 'Message'; - my $type = 'pci-card-data'; - if ($pci_tool && $alerts{$pci_tool}->{'action'} eq 'permissions'){ - $type = 'pci-card-data-root'; - } - @$rows = ({ - main::key($num++,0,1,$key) => main::message($type,'') - }); - } eval $end if $b_log; } sub usb_output { @@ -23320,7 +23421,7 @@ sub lm_sensors_data { # NOTE: I've seen an inexplicable case where: CPU:52.0°C fails to match with [\s°] but # does match with: [\s°]*. I can't account for this, but that's why the * is there # Tdie is a new k10temp-pci syntax for real cpu die temp. Tctl is cpu control value, - # NOT the real cpu die temp. + # NOT the real cpu die temp: UNLESS tctl and tdie are equal, sigh.. elsif ($_ =~ /^(Chip 0.*?|T?CPU.*|Tdie.*):([0-9\.]+)[\s°]*(C|F)/i){ $temp_working = $2; $working_unit = $3; @@ -23330,6 +23431,15 @@ sub lm_sensors_data { } $sensors->{'temp-unit'} = set_temp_unit($sensors->{'temp-unit'},$working_unit) if $working_unit; } + elsif ($_ =~ /^(Tctl.*):([0-9\.]+)[\s°]*(C|F)/i){ + $temp_working = $2; + $working_unit = $3; + if (!$sensors->{'tctl-temp'} || + (defined $temp_working && $temp_working > 0 && $temp_working > $sensors->{'tctl-temp'})){ + $sensors->{'tctl-temp'} = $temp_working; + } + $sensors->{'temp-unit'} = set_temp_unit($sensors->{'temp-unit'},$working_unit) if $working_unit; + } elsif ($_ =~ /^PECI\sAgent\s0.*:([0-9\.]+)[\s°]*(C|F)/i){ $sensors->{'cpu-peci-temp'} = $1; $working_unit = $2; @@ -23654,6 +23764,11 @@ sub process_data { my ($fan_type,$i,$j,$index_count_fan_default,$index_count_fan_main) = (0,0,0,0,0); my $temp_diff = 20; # for C, handled for F after that is determined my (@fan_main,@fan_default); + # kernel/sensors only show Tctl if Tctl == Tdie temp, sigh... + if (!$sensors->{'cpu-temp'} && $sensors->{'tctl-temp'}){ + $sensors->{'cpu-temp'} = $sensors->{'tctl-temp'}; + undef $sensors->{'tctl-temp'}; + } # first we need to handle the case where we have to determine which temp/fan to use for cpu and mobo: # note, for rare cases of weird cool cpus, user can override in their prefs and force the assignment # this is wrong for systems with > 2 tempX readings, but the logic is too complex with 3 variables @@ -25946,7 +26061,9 @@ sub get_kde_trinity_data { $kded = $program; $kded_name = 'kded'; } - if ($desktop_session eq 'trinity' || $xdg_desktop eq 'trinity' || (grep {/^tde/} @ps_gui)){ + # note: if TDM is used to start kde, can pass ps tde test + if ($desktop_session eq 'trinity' || $xdg_desktop eq 'trinity' || + (!$desktop_session && !$xdg_desktop && (grep {/^tde/} @ps_gui))){ $desktop->[0] = 'Trinity'; if ($program = main::check_program('kdesktop')){ @version_data = main::grabber("$program --version 2>/dev/null"); @@ -25961,7 +26078,8 @@ sub get_kde_trinity_data { # KDE_SESSION_VERSION is the integer version of the desktop # NOTE: as of plasma 5, the tool: about-distro MAY be available, that will show # actual desktop data, so once that's in debian/ubuntu, if it gets in, add that test - elsif ($xdg_desktop eq 'kde' || $kde_session_version){ + elsif ($desktop_session eq 'kde-plasma' || $xdg_desktop eq 'kde' || + $kde_session_version){ if ($kde_session_version && $kde_session_version <= 4){ @data = ($kded_name) ? main::program_values($kded_name) : (); if (@data){ @@ -25999,7 +26117,7 @@ sub get_kde_trinity_data { $desktop->[0] = 'KDE Plasma'; } if (!$desktop->[1]){ - $desktop->[1] = ($kde_session_version) ? $kde_session_version: main::message('unknown-desktop-version'); + $desktop->[1] = ($kde_session_version) ? $kde_session_version : main::message('unknown-desktop-version'); } # print Data::Dumper::Dumper \@version_data; if ($extra > 1){ @@ -27587,9 +27705,9 @@ sub get_display_manager { # greetd-684.sock if no .run seen. Add Ly in case they add run file/directory. # greetd frontends: agreety dlm gtkgreet qtgreet tuigreet wlgreet # 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 slimski tbsm tdm udm wdm - xdm xenodm xlogin); + my @dms = qw(brzdm cdm clogin emptty entranced gdm gdm3 greetd kdm kdm3 kdmctl + ldm lightdm lxdm ly mdm mlogin nodm pcdm qingy sddm slim slimski tbsm tdm + udm wdm xdm xdmctl 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); @@ -28027,6 +28145,8 @@ sub system_base { my $base_osr = 'aptosid|grml|q4os|siduction|bodhi'; # osr base, distro id in issue my $base_osr_issue = 'grml|linux lite|openmediavault'; + # osr has distro name but has fedora centos redhat ID_LIKE and VERSION_ID same + my $base_osr_redhat = 'almalinux|centos|rocky'; # osr has distro name but has ubuntu ID_LIKE/UBUNTU_CODENAME my $base_osr_ubuntu = 'mint|neon|nitrux|pop!_os|zorin'; my $base_upstream_lsb = '/etc/upstream-release/lsb-release'; @@ -28064,6 +28184,9 @@ sub system_base { elsif (grep {/($base_debian_version_osr)/i} @osr){ $system_base = debian_id(); } + elsif (grep {/($base_osr_redhat)/i} @osr){ + $base_type = 'rhel'; + } elsif (grep {/($base_osr_ubuntu)/i} @osr){ $base_type = 'ubuntu'; } @@ -28194,7 +28317,13 @@ sub get_os_release { $working[1] =~ s/^(debian|ubuntu\sdebian|debian\subuntu)/ubuntu/; $working[1] = 'ubuntu' if $working[1] eq 'debian'; } - $base_name = ucfirst($working[1]); + if ($base_type eq 'rhel' && $working[1] =~ /$base_type/i){ + $base_name = 'RHEL'; + $base_version = $version_id if $version_id; + } + else { + $base_name = ucfirst($working[1]); + } } elsif ($base_type eq 'ubuntu' && $working[0] eq 'UBUNTU_CODENAME' && $working[1]){ $base_version = ucfirst($working[1]); @@ -28229,7 +28358,11 @@ sub get_os_release { # note: mint has varying formats here, some have ubuntu as name, 17 and earlier else { # mint 17 used ubuntu os-release, so won't have $base_version - if ($base_name && $base_version){ + if ($base_name && $base_type eq 'rhel'){ + $distro = $base_name; + $distro .= ' ' . $version_id if $version_id; + } + elsif ($base_name && $base_version){ $base_id = ubuntu_id($base_version) if $base_type eq 'ubuntu' && $base_version; $base_id = '' if $base_id && "$base_name$base_version" =~ /$base_id/; $base_id .= ' ' if $base_id; @@ -28296,6 +28429,7 @@ sub ubuntu_id { $codename = lc($codename); my ($id) = (''); my %codenames = ( + 'kinetic' => '22.10', 'jammy' => '22.04 LTS', 'impish' => '21.10','hirsute' => '21.04', 'groovy' => '20.10','focal' => '20.04 LTS', @@ -28558,6 +28692,16 @@ sub get_init_data { $init = 'Epoch'; $init_version = program_version('epoch', '^Epoch', '4','version'); } + elsif ($comm =~ /finit/){ + $init = 'finit'; + if ($program = check_program('finit')){ + $init_version = program_version($program,'^Finit','2','-v',1); + } + } + # nosh can map service manager to systemctl, service, rcctl, at least. + elsif ($comm =~ /^nosh/){ + $init = 'nosh'; + } # missing data: note, runit can install as a dependency without being the # init system: http://smarden.org/runit/sv.8.html # NOTE: the proc test won't work on bsds, so if runit is used on bsds we @@ -28584,6 +28728,7 @@ sub get_init_data { elsif (check_program('launchctl')){ $init = 'launchd'; } + # could be nosh or runit as well for BSDs, not handled yet elsif (-f '/etc/inittab'){ $init = 'SysVinit'; if (check_program('strings')){ @@ -30473,14 +30618,25 @@ sub process_status { elsif ($key eq 'rcctl'){ $cmd = "$service_tool{$key}->[0] check $service"; } - # dragonfly/netbsd/freebsd have this + # dragonfly/netbsd/freebsd have this. We prefer service over following since + # if it is present, the assumption is that it is being used, though multi id + # is probably better. elsif ($key eq 'service'){ $cmd = "$service_tool{$key}->[0] $service status"; } + # upstart, legacy, and finit, needs more data + elsif ($key eq 'initctl'){ + $cmd = "$service_tool{$key}->[0] status $service"; + } # runit elsif ($key eq 'sv'){ $cmd = "$service_tool{$key}->[0] status $service"; } + # s6: note, shows s6-rc but uses s6-svstat; -n makes human-readable. Needs + # real data samples before adding. + # elsif ($key eq 's6-rc'){ + # $cmd = "$service_tool{$key}->[0] $service"; + # } # check or status or onestatus (netbsd) elsif ($key eq 'rc.d'){ if (-e "$service_tool{$key}->[0]$service"){ @@ -30499,7 +30655,7 @@ sub process_status { $result = 'not found'; } } - @data = main::grabber("$cmd 2>&1",'','strip') if $cmd; + @data = main::grabber("$cmd 2>&1",'','strip') if $cmd; # @data = ('bluetooth is running.'); print "key: $key\n", Data::Dumper::Dumper \@data if $dbg[29]; main::log_data('dump','service @data',\@data) if $b_log; @@ -30522,6 +30678,12 @@ sub process_status { $result .= ",$value" if ($result && $value); last; } + # Status : running + elsif ($working[0] eq 'Status'){ + $result = lc($working[1]); + $result = $translate{$result} if $translate{$result}; + last; + } # valid syntax, but service does not exist # * rc-service: service 'ntp' does not exist :: elsif ($row =~ /$service.*?(not (exist|(be )?found)|no such (directory|file)|unrecognized)/i){ @@ -30585,9 +30747,16 @@ sub set { %service_tool = ('service' => [$path,'service']); } elsif ($path = main::check_program('sv')){ - # service sshd status %service_tool = ('sv' => [$path,'sv']); } + # needs data, never seen output, but report if present + elsif ($path = main::check_program('s6-svstat')){ + %service_tool = ('s6-rc' => [$path,'s6-rc']); + } + # make it last in tools, need more data + elsif ($path = main::check_program('initctl')){ + %service_tool = ('initctl' => [$path,'initctl']); + } # freebsd does not have 'check', netbsd does not have status elsif (-d '/etc/rc.d/'){ # /etc/rc.d/ssh check :: ssh(ok|failed) @@ -32195,7 +32364,7 @@ sub short_output { main::key($prefix,1,0,'SHORT') => $data, }; } -sub info_item{ +sub info_item { eval $start if $b_log; my $num = 0; my $gcc_alt = ''; |