mirror of
https://github.com/smxi/inxi.git
synced 2025-09-02 02:29:11 +00:00
New version, new man page. Bug fix, enhancements, fixes.
Bugs: 1. Big bug found on certain systems, they use non system memory memory arrays, inxi failed to anticipate that situation, and would exit with error when run as root for -m when it hit those array types. These arrays did not have modules listed, so the module array was undefined, which caused the failure. Thanks Manjaro anonymous debugger dataset 'loki' for finding this failure. This is literally the first dataset I've seen that had this issue, but who knows how many other system boards will show something like that as well. Fixes: 1. Related to bug 1, do not show the max module size item if not system memory and size is less than 10 MiB. Assuming there that it's one of these odd boards. Enhancements: 1. For bug 1, extended Memory: report to include array type if not system memory. That instance had Video Memory, Flash Memory, and Cache Memory arrays along with the regular System Memory array. Now shows: use: Video Memory for example if not System Memory to make it clear what is going on. 2. Added basic Parrot system base, but for some inexplicable reason, Parrot changed the /etc/debian_version file to show 'stable' instead of the release number. Why? Who knows, it would be so much easier if people making these derived distros would be consistent and not change things for no good reason. 3. Added a few more pattern matches to existing vendors for disks. As usual, thanks linuxlite/linux hardware database for the endless lists of disk data. 4. Added internal dmidecode debugger switches, that makes it much easier to inject test dmidecode data from text files using debugger switches internally. 5. Added -Cxx item, which will run if root and -C are used, now grabs L1 and L3 cache data from dmidecode and shows it. I didn't realize that data was there, not sure how I'd missed it all these years, I guess pinxi really is much easier to work on! This only runs if user has dmidecode permissions from root or sudo.
This commit is contained in:
parent
7f18dd4a35
commit
9046b7873d
3 changed files with 188 additions and 55 deletions
182
inxi
182
inxi
|
@ -31,8 +31,8 @@ use POSIX qw(uname strftime ttyname);
|
||||||
|
|
||||||
## INXI INFO ##
|
## INXI INFO ##
|
||||||
my $self_name='inxi';
|
my $self_name='inxi';
|
||||||
my $self_version='3.0.23';
|
my $self_version='3.0.24';
|
||||||
my $self_date='2018-09-07';
|
my $self_date='2018-09-10';
|
||||||
my $self_patch='00';
|
my $self_patch='00';
|
||||||
## END INXI INFO ##
|
## END INXI INFO ##
|
||||||
|
|
||||||
|
@ -67,8 +67,9 @@ my @test = (0,0,0,0,0);
|
||||||
## Booleans
|
## Booleans
|
||||||
my ($b_admin,$b_arm,$b_bb_ps,$b_console_irc,$b_debug_gz,$b_debug_timers,
|
my ($b_admin,$b_arm,$b_bb_ps,$b_console_irc,$b_debug_gz,$b_debug_timers,
|
||||||
$b_display,$b_dmesg_boot_check,
|
$b_display,$b_dmesg_boot_check,
|
||||||
$b_dmi,$b_dmidecode_force,$b_fake_bsd,$b_fake_dboot,$b_fake_pciconf,
|
$b_dmi,$b_dmidecode_force,$b_fake_bsd,$b_fake_dboot,$b_fake_dmidecode,
|
||||||
$b_fake_sysctl,$b_fake_usbdevs,$b_force_display,$b_gpudata,$b_irc,
|
$b_fake_pciconf,$b_fake_sysctl,$b_fake_usbdevs,
|
||||||
|
$b_force_display,$b_gpudata,$b_irc,
|
||||||
$b_log,$b_log_colors,$b_log_full,$b_man,$b_mem,$b_mips,$b_pci,$b_pci_tool,
|
$b_log,$b_log_colors,$b_log_full,$b_man,$b_mem,$b_mips,$b_pci,$b_pci_tool,
|
||||||
$b_ppc,$b_proc_debug,$b_ps_gui,$b_root,$b_running_in_display,$b_slot_tool,
|
$b_ppc,$b_proc_debug,$b_ps_gui,$b_root,$b_running_in_display,$b_slot_tool,
|
||||||
$b_soc_audio,$b_soc_gfx,$b_soc_net,$b_sparc,$b_sudo,$b_sys_debug,$b_sysctl,
|
$b_soc_audio,$b_soc_gfx,$b_soc_net,$b_sparc,$b_sudo,$b_sys_debug,$b_sysctl,
|
||||||
|
@ -4113,6 +4114,8 @@ sub get_options{
|
||||||
else {
|
else {
|
||||||
error_handler('bad-arg', $opt, $arg);
|
error_handler('bad-arg', $opt, $arg);
|
||||||
} },
|
} },
|
||||||
|
'fake-dmi' => sub {
|
||||||
|
$b_fake_dmidecode = 1 },
|
||||||
'ftp:s' => sub {
|
'ftp:s' => sub {
|
||||||
my ($opt,$arg) = @_;
|
my ($opt,$arg) = @_;
|
||||||
# pattern: ftp.x.x/x
|
# pattern: ftp.x.x/x
|
||||||
|
@ -4245,7 +4248,16 @@ sub get_options{
|
||||||
error_handler('bad-arg', '--output', '--output-file not provided');
|
error_handler('bad-arg', '--output', '--output-file not provided');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( $show{'ram'} || $show{'slot'} ||
|
$b_sudo = 1 if ( $show{'unmounted'} || ($extra > 0 && $show{'disk'}) );
|
||||||
|
# override for things like -b or -v2 to -v3
|
||||||
|
$show{'cpu-basic'} = 0 if $show{'cpu'};
|
||||||
|
$show{'optical-basic'} = 0 if $show{'optical'};
|
||||||
|
$show{'partition'} = 0 if $show{'partition-full'};
|
||||||
|
if ($show{'disk'} || $show{'optical'} ){
|
||||||
|
$show{'disk-basic'} = 0;
|
||||||
|
$show{'disk-total'} = 0;
|
||||||
|
}
|
||||||
|
if ( $show{'ram'} || $show{'slot'} || ($show{'cpu'} && $extra > 1) ||
|
||||||
( ( $bsd_type || $b_dmidecode_force ) && ($show{'machine'} || $show{'battery'}) ) ){
|
( ( $bsd_type || $b_dmidecode_force ) && ($show{'machine'} || $show{'battery'}) ) ){
|
||||||
$b_dmi = 1;
|
$b_dmi = 1;
|
||||||
}
|
}
|
||||||
|
@ -4262,15 +4274,6 @@ sub get_options{
|
||||||
if ($show{'filter-override'}){
|
if ($show{'filter-override'}){
|
||||||
$show{'filter'} = 0;
|
$show{'filter'} = 0;
|
||||||
}
|
}
|
||||||
$b_sudo = 1 if ( $show{'unmounted'} || ($extra > 0 && $show{'disk'}) );
|
|
||||||
# override for things like -b or -v2 to -v3
|
|
||||||
$show{'cpu-basic'} = 0 if $show{'cpu'};
|
|
||||||
$show{'optical-basic'} = 0 if $show{'optical'};
|
|
||||||
$show{'partition'} = 0 if $show{'partition-full'};
|
|
||||||
if ($show{'disk'} || $show{'optical'} ){
|
|
||||||
$show{'disk-basic'} = 0;
|
|
||||||
$show{'disk-total'} = 0;
|
|
||||||
}
|
|
||||||
if ($bsd_type && ($show{'short'} || $show{'disk-basic'} || $show{'disk-total'} || $show{'disk'})){
|
if ($bsd_type && ($show{'short'} || $show{'disk-basic'} || $show{'disk-total'} || $show{'disk'})){
|
||||||
$b_dm_boot_disk = 1;
|
$b_dm_boot_disk = 1;
|
||||||
}
|
}
|
||||||
|
@ -4467,7 +4470,7 @@ sub show_options {
|
||||||
or line output, not short form):" ],
|
or line output, not short form):" ],
|
||||||
['2', '-A', '', "Chip vendor:product ID for each audio device." ],
|
['2', '-A', '', "Chip vendor:product ID for each audio device." ],
|
||||||
['2', '-B', '', "Serial number, voltage now/minimum (if available)." ],
|
['2', '-B', '', "Serial number, voltage now/minimum (if available)." ],
|
||||||
['2', '-C', '', "Minimum CPU speed, if available." ],
|
['2', '-C', '', "L1/L3 cache (if root and dmidecode installed)." ],
|
||||||
['2', '-D', '', "Disk transfer speed; NVMe lanes; Disk serial number." ],
|
['2', '-D', '', "Disk transfer speed; NVMe lanes; Disk serial number." ],
|
||||||
['2', '-G', '', "Chip vendor:product ID for each video card; OpenGL
|
['2', '-G', '', "Chip vendor:product ID for each video card; OpenGL
|
||||||
compatibility version, if free drivers and available; compositor (experimental);
|
compatibility version, if free drivers and available; compositor (experimental);
|
||||||
|
@ -5317,22 +5320,22 @@ sub translate_size {
|
||||||
#print ":$working:\n";
|
#print ":$working:\n";
|
||||||
return if ! defined $working;
|
return if ! defined $working;
|
||||||
my $math = ( $working =~ /B$/) ? 1000: 1024;
|
my $math = ( $working =~ /B$/) ? 1000: 1024;
|
||||||
if ( $working =~ /^([0-9\.]+)M[B]?$/i){
|
if ( $working =~ /^([0-9\.]+)\s*M[B]?$/i){
|
||||||
$size = $1 * $math;
|
$size = $1 * $math;
|
||||||
}
|
}
|
||||||
elsif ( $working =~ /^([0-9\.]+)G[B]?$/i){
|
elsif ( $working =~ /^([0-9\.]+)\s*G[B]?$/i){
|
||||||
$size = $1 * $math**2;
|
$size = $1 * $math**2;
|
||||||
}
|
}
|
||||||
elsif ( $working =~ /^([0-9\.]+)T[B]?$/i){
|
elsif ( $working =~ /^([0-9\.]+)\s*T[B]?$/i){
|
||||||
$size = $1 * $math**3;
|
$size = $1 * $math**3;
|
||||||
}
|
}
|
||||||
elsif ( $working =~ /^([0-9\.]+)P[B]?$/i){
|
elsif ( $working =~ /^([0-9\.]+)\s*P[B]?$/i){
|
||||||
$size = $1 * $math**4;
|
$size = $1 * $math**4;
|
||||||
}
|
}
|
||||||
elsif ( $working =~ /^([0-9\.]+)E[B]?$/i){
|
elsif ( $working =~ /^([0-9\.]+)\s*E[B]?$/i){
|
||||||
$size = $1 * $math**5;
|
$size = $1 * $math**5;
|
||||||
}
|
}
|
||||||
elsif ( $working =~ /^([0-9\.]+)K[B]?$/i){
|
elsif ( $working =~ /^([0-9\.]+)\s*[kK][B]?$/i){
|
||||||
$size = $1;
|
$size = $1;
|
||||||
}
|
}
|
||||||
$size = int($size) if $size;
|
$size = int($size) if $size;
|
||||||
|
@ -6485,10 +6488,16 @@ sub create_output_full {
|
||||||
$cpu{'microcode'} ||= 'N/A';
|
$cpu{'microcode'} ||= 'N/A';
|
||||||
$rows[$j]{main::key($num++,'microcode')} = $cpu{'microcode'};
|
$rows[$j]{main::key($num++,'microcode')} = $cpu{'microcode'};
|
||||||
}
|
}
|
||||||
|
if ($extra > 1 && $properties{'l1-cache'}){
|
||||||
|
$rows[$j]{main::key($num++,'L1 cache')} = $properties{'l1-cache'};
|
||||||
|
}
|
||||||
$properties{'l2-cache'} ||= 'N/A';
|
$properties{'l2-cache'} ||= 'N/A';
|
||||||
if (!$b_arm || ($b_arm && $properties{'l2-cache'} ne 'N/A')){
|
if (!$b_arm || ($b_arm && $properties{'l2-cache'} ne 'N/A')){
|
||||||
$rows[$j]{main::key($num++,'L2 cache')} = $properties{'l2-cache'};
|
$rows[$j]{main::key($num++,'L2 cache')} = $properties{'l2-cache'};
|
||||||
}
|
}
|
||||||
|
if ($extra > 1 && $properties{'l3-cache'}){
|
||||||
|
$rows[$j]{main::key($num++,'L3 cache')} = $properties{'l3-cache'};
|
||||||
|
}
|
||||||
if ($extra > 0 && !$show{'cpu-flag'}){
|
if ($extra > 0 && !$show{'cpu-flag'}){
|
||||||
$j = scalar @rows;
|
$j = scalar @rows;
|
||||||
@flags = split /\s+/, $cpu{'flags'} if $cpu{'flags'};
|
@flags = split /\s+/, $cpu{'flags'} if $cpu{'flags'};
|
||||||
|
@ -6717,7 +6726,7 @@ sub data_cpuinfo {
|
||||||
my %speeds = set_cpu_speeds_sys();
|
my %speeds = set_cpu_speeds_sys();
|
||||||
my @cpuinfo = main::reader($file);
|
my @cpuinfo = main::reader($file);
|
||||||
my @phys_cpus = (0);# start with 1 always
|
my @phys_cpus = (0);# start with 1 always
|
||||||
my ($cache,$core_count,$die_holder,$die_id,$phys_id,$proc_count,$speed) = (0,0,0,0,0,0,0);
|
my ($core_count,$die_holder,$die_id,$phys_id,$proc_count,$speed) = (0,0,0,0,0,0,0);
|
||||||
my ($phys_holder) = (undef);
|
my ($phys_holder) = (undef);
|
||||||
# need to prime for arm cpus, which do not have physical/core ids usually
|
# need to prime for arm cpus, which do not have physical/core ids usually
|
||||||
# level 0 is phys id, level 1 is die id, level 2 is core id
|
# level 0 is phys id, level 1 is die id, level 2 is core id
|
||||||
|
@ -6956,7 +6965,7 @@ sub data_sysctl {
|
||||||
my %cpu = set_cpu_data();
|
my %cpu = set_cpu_data();
|
||||||
my (@ids,@line,%speeds,@working);
|
my (@ids,@line,%speeds,@working);
|
||||||
my ($sep) = ('');
|
my ($sep) = ('');
|
||||||
my ($cache,$die_holder,$die_id,$phys_holder,$phys_id,$proc_count,$speed) = (0,0,0,0,0,0,0);
|
my ($die_holder,$die_id,$phys_holder,$phys_id,$proc_count,$speed) = (0,0,0,0,0,0,0);
|
||||||
foreach (@sysctl){
|
foreach (@sysctl){
|
||||||
@line = split /\s*:\s*/, $_;
|
@line = split /\s*:\s*/, $_;
|
||||||
next if ! $line[0];
|
next if ! $line[0];
|
||||||
|
@ -6997,6 +7006,9 @@ sub data_sysctl {
|
||||||
elsif ($line[0] eq 'hw.l2cachesize') {
|
elsif ($line[0] eq 'hw.l2cachesize') {
|
||||||
$cpu{'l2-cache'} = $line[1]/1024;
|
$cpu{'l2-cache'} = $line[1]/1024;
|
||||||
}
|
}
|
||||||
|
elsif ($line[0] eq 'hw.l3cachesize') {
|
||||||
|
$cpu{'l3-cache'} = $line[1]/1024;
|
||||||
|
}
|
||||||
# this is in mghz in samples
|
# this is in mghz in samples
|
||||||
elsif ($line[0] eq 'hw.clockrate' || $line[0] eq 'hw.cpuspeed') {
|
elsif ($line[0] eq 'hw.clockrate' || $line[0] eq 'hw.cpuspeed') {
|
||||||
$cpu{'cur-freq'} = $line[1];
|
$cpu{'cur-freq'} = $line[1];
|
||||||
|
@ -7127,7 +7139,17 @@ sub cpu_properties {
|
||||||
#print Data::Dumper::Dumper \@processors;
|
#print Data::Dumper::Dumper \@processors;
|
||||||
# $cpu_cores is per physical cpu
|
# $cpu_cores is per physical cpu
|
||||||
my ($cpu_layout,$cpu_type,$min_max,$min_max_key) = ('','','','');
|
my ($cpu_layout,$cpu_type,$min_max,$min_max_key) = ('','','','');
|
||||||
my ($cache,$core_count,$cpu_cores,$die_count) = (0,0,0,0);
|
my ($l1_cache,$l2_cache,$l3_cache,$core_count,$cpu_cores,$die_count) = (0,0,0,0,0,0);
|
||||||
|
if ($extra > 1){
|
||||||
|
# note: dmidecode has one entry per cpu per cache type, so this already
|
||||||
|
# has done the arithmetic on > 1 cpus for L1 and L3.
|
||||||
|
my %caches = cpu_cache_dmi();
|
||||||
|
$l1_cache = $caches{'L1'} if $caches{'L1'};
|
||||||
|
$l3_cache = $caches{'L3'} if $caches{'L3'};
|
||||||
|
# bsd sysctl can have these values so let's check just in case
|
||||||
|
$l1_cache = $cpu{'l1-cache'} * $phyical_count if !$l1_cache && $cpu{'l1-cache'};
|
||||||
|
$l3_cache = $cpu{'l3-cache'} * $phyical_count if !$l3_cache && $cpu{'l3-cache'};
|
||||||
|
}
|
||||||
foreach my $die_ref ( @phys ){
|
foreach my $die_ref ( @phys ){
|
||||||
next if ! $die_ref;
|
next if ! $die_ref;
|
||||||
my @dies = @$die_ref;
|
my @dies = @$die_ref;
|
||||||
|
@ -7274,25 +7296,34 @@ sub cpu_properties {
|
||||||
$cpu_layout .= ' (' . $cpu{'dies'}. '-Die)' if !$bsd_type && $cpu{'dies'} > 1;
|
$cpu_layout .= ' (' . $cpu{'dies'}. '-Die)' if !$bsd_type && $cpu{'dies'} > 1;
|
||||||
# the only possible change for bsds is if we can get phys counts in the future
|
# the only possible change for bsds is if we can get phys counts in the future
|
||||||
if ($bsd_type){
|
if ($bsd_type){
|
||||||
$cache = $cpu{'l2-cache'} * $phyical_count;
|
$l2_cache = $cpu{'l2-cache'} * $phyical_count;
|
||||||
}
|
}
|
||||||
# AMD SOS chips appear to report full L2 cache per core
|
# AMD SOS chips appear to report full L2 cache per core
|
||||||
elsif ($cpu{'type'} eq 'amd' && ($cpu{'family'} eq '14' || $cpu{'family'} eq '15' || $cpu{'family'} eq '16')){
|
elsif ($cpu{'type'} eq 'amd' && ($cpu{'family'} eq '14' || $cpu{'family'} eq '15' || $cpu{'family'} eq '16')){
|
||||||
$cache = $cpu{'l2-cache'} * $phyical_count;
|
$l2_cache = $cpu{'l2-cache'} * $phyical_count;
|
||||||
}
|
}
|
||||||
elsif ($cpu{'type'} ne 'intel'){
|
elsif ($cpu{'type'} ne 'intel'){
|
||||||
$cache = $cpu{'l2-cache'} * $cpu_cores * $phyical_count;
|
$l2_cache = $cpu{'l2-cache'} * $cpu_cores * $phyical_count;
|
||||||
}
|
}
|
||||||
## note: this handles how intel reports L2, total instead of per core like AMD does
|
## note: this handles how intel reports L2, total instead of per core like AMD does
|
||||||
# note that we need to multiply by number of actual cpus here to get true cache size
|
# note that we need to multiply by number of actual cpus here to get true cache size
|
||||||
else {
|
else {
|
||||||
$cache = $cpu{'l2-cache'} * $phyical_count;
|
$l2_cache = $cpu{'l2-cache'} * $phyical_count;
|
||||||
}
|
}
|
||||||
if ($cache > 10000){
|
if ($l1_cache > 0){
|
||||||
$cache = sprintf("%.01f MiB",$cache/1024); # trim to no decimals?
|
$l1_cache = "$l1_cache KiB";
|
||||||
}
|
}
|
||||||
elsif ($cache > 0){
|
if ($l2_cache > 10000){
|
||||||
$cache = "$cache KiB";
|
$l2_cache = sprintf("%.01f MiB",$l2_cache/1024); # trim to no decimals?
|
||||||
|
}
|
||||||
|
elsif ($l2_cache > 0){
|
||||||
|
$l2_cache = "$l2_cache KiB";
|
||||||
|
}
|
||||||
|
if ($l3_cache > 10000){
|
||||||
|
$l3_cache = sprintf("%.01f MiB",$l3_cache/1024); # trim to no decimals?
|
||||||
|
}
|
||||||
|
elsif ($l3_cache > 0){
|
||||||
|
$l3_cache = "$l3_cache KiB";
|
||||||
}
|
}
|
||||||
if ($cpu{'cur-freq'} && $cpu{'min-freq'} && $cpu{'max-freq'} ){
|
if ($cpu{'cur-freq'} && $cpu{'min-freq'} && $cpu{'max-freq'} ){
|
||||||
$min_max = "$cpu{'min-freq'}/$cpu{'max-freq'} MHz";
|
$min_max = "$cpu{'min-freq'}/$cpu{'max-freq'} MHz";
|
||||||
|
@ -7332,7 +7363,9 @@ sub cpu_properties {
|
||||||
'min-max' => $min_max,
|
'min-max' => $min_max,
|
||||||
'speed-key' => $speed_key,
|
'speed-key' => $speed_key,
|
||||||
'speed' => $speed,
|
'speed' => $speed,
|
||||||
'l2-cache' => $cache,
|
'l1-cache' => $l1_cache,
|
||||||
|
'l2-cache' => $l2_cache,
|
||||||
|
'l3-cache' => $l3_cache,
|
||||||
);
|
);
|
||||||
main::log_data('dump','%cpu_properties',\%cpu_properties) if $b_log;
|
main::log_data('dump','%cpu_properties',\%cpu_properties) if $b_log;
|
||||||
#print Data::Dumper::Dumper \%cpu;
|
#print Data::Dumper::Dumper \%cpu;
|
||||||
|
@ -7342,6 +7375,36 @@ sub cpu_properties {
|
||||||
eval $end if $b_log;
|
eval $end if $b_log;
|
||||||
return %cpu_properties;
|
return %cpu_properties;
|
||||||
}
|
}
|
||||||
|
sub cpu_cache_dmi {
|
||||||
|
eval $start if $b_log;
|
||||||
|
return if !@dmi;
|
||||||
|
my %caches = ('L1' => 0, 'L2' => 0,'L3' => 0);
|
||||||
|
my ($id,$amount);
|
||||||
|
foreach my $ref (@dmi){
|
||||||
|
next if ref $ref ne 'ARRAY';
|
||||||
|
my @item = @$ref;
|
||||||
|
next if $item[0] != 7;
|
||||||
|
last if $item[0] > 7;
|
||||||
|
($id,$amount) = ('',0);
|
||||||
|
foreach my $value (@item){
|
||||||
|
# variants: L3 - Cache; L3 Cache
|
||||||
|
if ($value =~ /^Socket Designation: (L[1-3])\s/){
|
||||||
|
$id = $1;
|
||||||
|
}
|
||||||
|
if ($value =~ /^Installed Size: (.*B)$/){
|
||||||
|
$amount = main::translate_size($1);
|
||||||
|
}
|
||||||
|
if ($id && $amount){
|
||||||
|
$caches{$id} += $amount;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
main::log_data('dump','%caches',\%caches) if $b_log;
|
||||||
|
#print Data::Dumper::Dumper \%caches;
|
||||||
|
eval $end if $b_log;
|
||||||
|
return %caches;
|
||||||
|
}
|
||||||
sub cpu_bugs_sys {
|
sub cpu_bugs_sys {
|
||||||
eval $start if $b_log;
|
eval $start if $b_log;
|
||||||
my (@bugs,$type,$value);
|
my (@bugs,$type,$value);
|
||||||
|
@ -8444,8 +8507,8 @@ sub device_vendor {
|
||||||
# Data URLs: inxi-resources.txt Section: DiskData device_vendor()
|
# Data URLs: inxi-resources.txt Section: DiskData device_vendor()
|
||||||
my @vendors = (
|
my @vendors = (
|
||||||
## These go first because they are the most likely and common ##
|
## These go first because they are the most likely and common ##
|
||||||
['(Crucial|^CT|-CT|^M4-)','Crucial','Crucial',''],
|
['(Crucial|^CT|-CT|^M4\b)','Crucial','Crucial',''],
|
||||||
['^INTEL','^INTEL','Intel',''],
|
['^(INTEL|SSDPAM)','^INTEL','Intel',''],
|
||||||
['(KINGSTON|DataTraveler|^SMS|^SHS|^SUV)','KINGSTON','Kingston',''], # maybe SHS: SHSS37A SKC SUV
|
['(KINGSTON|DataTraveler|^SMS|^SHS|^SUV)','KINGSTON','Kingston',''], # maybe SHS: SHSS37A SKC SUV
|
||||||
# must come before samsung MU. NOTE: toshiba can have: TOSHIBA_MK6475GSX: mush: MKNSSDCR120GB_
|
# must come before samsung MU. NOTE: toshiba can have: TOSHIBA_MK6475GSX: mush: MKNSSDCR120GB_
|
||||||
['(^MKN|Mushkin)','Mushkin','Mushkin',''], # MKNS
|
['(^MKN|Mushkin)','Mushkin','Mushkin',''], # MKNS
|
||||||
|
@ -8467,7 +8530,7 @@ sub device_vendor {
|
||||||
['^(HGST|Touro)','^HGST','HGST (Hitachi)',''], # HGST HUA
|
['^(HGST|Touro)','^HGST','HGST (Hitachi)',''], # HGST HUA
|
||||||
['^(Hitachi|HDS|HDT|IC|HT|HU)','^Hitachi','Hitachi',''],
|
['^(Hitachi|HDS|HDT|IC|HT|HU)','^Hitachi','Hitachi',''],
|
||||||
['^Hoodisk','^Hoodisk','Hoodisk',''],
|
['^Hoodisk','^Hoodisk','Hoodisk',''],
|
||||||
['^(HP\b|MB0|GJ0)','^HP','HP',''], # vb: VB0250EAVER but clashes with vbox; HP_SSD_S700_120G
|
['^(HP\b|MB0|GJ0|v210w)','^HP','HP',''], # vb: VB0250EAVER but clashes with vbox; HP_SSD_S700_120G
|
||||||
['^(LSD|Lexar|JumpDrive)','^Lexar','Lexar',''], # mmc-LEXAR_0xb016546c
|
['^(LSD|Lexar|JumpDrive)','^Lexar','Lexar',''], # mmc-LEXAR_0xb016546c
|
||||||
# OCZSSD2-2VTXE120G is OCZ-VERTEX2_3.5
|
# OCZSSD2-2VTXE120G is OCZ-VERTEX2_3.5
|
||||||
['^(OCZ|APOC|D2|DEN|DEN|DRSAK|EC188|FTNC|GFGC|MANG|MMOC|NIMC|NIMR|PSIR|TALOS2|TMSC|TRSAK)','^OCZ[\s\-]','OCZ',''],
|
['^(OCZ|APOC|D2|DEN|DEN|DRSAK|EC188|FTNC|GFGC|MANG|MMOC|NIMC|NIMR|PSIR|TALOS2|TMSC|TRSAK)','^OCZ[\s\-]','OCZ',''],
|
||||||
|
@ -9364,7 +9427,7 @@ sub get {
|
||||||
}
|
}
|
||||||
elsif ($bsd_type || $b_dmidecode_force){
|
elsif ($bsd_type || $b_dmidecode_force){
|
||||||
my $ref = $alerts{'dmidecode'};
|
my $ref = $alerts{'dmidecode'};
|
||||||
if ( $$ref{'action'} ne 'use'){
|
if ( !$b_fake_dmidecode && $$ref{'action'} ne 'use'){
|
||||||
$key1 = $$ref{'action'};
|
$key1 = $$ref{'action'};
|
||||||
$val1 = $$ref{$key1};
|
$val1 = $$ref{$key1};
|
||||||
$key1 = ucfirst($key1);
|
$key1 = ucfirst($key1);
|
||||||
|
@ -12153,7 +12216,7 @@ sub get {
|
||||||
my $num = 0;
|
my $num = 0;
|
||||||
my $ref = $alerts{'dmidecode'};
|
my $ref = $alerts{'dmidecode'};
|
||||||
@rows = main::memory_data_full('ram') if !$b_mem;
|
@rows = main::memory_data_full('ram') if !$b_mem;
|
||||||
if ( $$ref{'action'} ne 'use'){
|
if ( !$b_fake_dmidecode && $$ref{'action'} ne 'use'){
|
||||||
$key1 = $$ref{'action'};
|
$key1 = $$ref{'action'};
|
||||||
$val1 = $$ref{$key1};
|
$val1 = $$ref{$key1};
|
||||||
@data = ({
|
@data = ({
|
||||||
|
@ -12187,10 +12250,11 @@ sub create_output {
|
||||||
return if !@ram;
|
return if !@ram;
|
||||||
my $num = 0;
|
my $num = 0;
|
||||||
my $j = 0;
|
my $j = 0;
|
||||||
my (@data,@rows);
|
my (@data,@rows,$b_non_system);
|
||||||
foreach (@ram){
|
foreach (@ram){
|
||||||
$j = scalar @rows;
|
$j = scalar @rows;
|
||||||
my %ref = %$_;
|
my %ref = %$_;
|
||||||
|
$b_non_system = ($ref{'use'} && lc($ref{'use'}) ne 'system memory') ? 1:0 ;
|
||||||
$num = 1;
|
$num = 1;
|
||||||
@data = ({
|
@data = ({
|
||||||
main::key($num++,'Array') => '',
|
main::key($num++,'Array') => '',
|
||||||
|
@ -12200,15 +12264,18 @@ sub create_output {
|
||||||
if ($ref{'cap-qualifier'}){
|
if ($ref{'cap-qualifier'}){
|
||||||
$rows[$j]{main::key($num++,'note')} = $ref{'cap-qualifier'};
|
$rows[$j]{main::key($num++,'note')} = $ref{'cap-qualifier'};
|
||||||
}
|
}
|
||||||
|
$rows[$j]{main::key($num++,'use')} = $ref{'use'} if $b_non_system;
|
||||||
$rows[$j]{main::key($num++,'slots')} = $ref{'slots'};
|
$rows[$j]{main::key($num++,'slots')} = $ref{'slots'};
|
||||||
$rows[$j]{main::key($num++,'EC')} = $ref{'eec'};
|
$rows[$j]{main::key($num++,'EC')} = $ref{'eec'};
|
||||||
if ($extra > 0 ){
|
if ($extra > 0 && (!$b_non_system ||
|
||||||
|
( main::is_numeric($ref{'max-module-size'}) && $ref{'max-module-size'} > 10 ) ) ){
|
||||||
$rows[$j]{main::key($num++,'max module size')} = process_size($ref{'max-module-size'});
|
$rows[$j]{main::key($num++,'max module size')} = process_size($ref{'max-module-size'});
|
||||||
if ($ref{'mod-qualifier'}){
|
if ($ref{'mod-qualifier'}){
|
||||||
$rows[$j]{main::key($num++,'note')} = $ref{'mod-qualifier'};
|
$rows[$j]{main::key($num++,'note')} = $ref{'mod-qualifier'};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach my $ref2 ($ref{'modules'}){
|
foreach my $ref2 ($ref{'modules'}){
|
||||||
|
next if ref $ref2 ne 'ARRAY';
|
||||||
my @modules = @$ref2;
|
my @modules = @$ref2;
|
||||||
# print Data::Dumper::Dumper \@modules;
|
# print Data::Dumper::Dumper \@modules;
|
||||||
foreach my $ref3 ( @modules){
|
foreach my $ref3 ( @modules){
|
||||||
|
@ -12266,6 +12333,7 @@ sub dmidecode_data {
|
||||||
my ($i,$j,$k) = (0,0,0);
|
my ($i,$j,$k) = (0,0,0);
|
||||||
foreach (@dmi){
|
foreach (@dmi){
|
||||||
my @ref = @$_;
|
my @ref = @$_;
|
||||||
|
($derived_module_size,$max_cap_5,$max_cap_16,$max_module_size) = (0,0,0,0);
|
||||||
# Portable Battery
|
# Portable Battery
|
||||||
if ($ref[0] == 5){
|
if ($ref[0] == 5){
|
||||||
$ram[$k] = ({}) if !$ram[$k];
|
$ram[$k] = ({}) if !$ram[$k];
|
||||||
|
@ -12303,7 +12371,7 @@ sub dmidecode_data {
|
||||||
$size = calculate_size($temp[1],0);
|
$size = calculate_size($temp[1],0);
|
||||||
# get data after module size
|
# get data after module size
|
||||||
$temp[1] =~ s/ Connection\)?//;
|
$temp[1] =~ s/ Connection\)?//;
|
||||||
$temp[1] =~ s/^[0-9]+\s*[MGTP]B\s*\(?//;
|
$temp[1] =~ s/^[0-9]+\s*[KkMGTP]B\s*\(?//;
|
||||||
$type = lc($temp[1]);
|
$type = lc($temp[1]);
|
||||||
}
|
}
|
||||||
elsif ($temp[0] eq 'Current Speed'){
|
elsif ($temp[0] eq 'Current Speed'){
|
||||||
|
@ -12374,7 +12442,7 @@ sub dmidecode_data {
|
||||||
# do not try to guess from installed modules, only use this to correct type 5 data
|
# do not try to guess from installed modules, only use this to correct type 5 data
|
||||||
elsif ($temp[0] eq 'Size'){
|
elsif ($temp[0] eq 'Size'){
|
||||||
# we want any non real size data to be preserved
|
# we want any non real size data to be preserved
|
||||||
if ( $temp[1] =~ /^[0-9]+\s*[MTPG]B/ ) {
|
if ( $temp[1] =~ /^[0-9]+\s*[KkMTPG]B/ ) {
|
||||||
$derived_module_size = calculate_size($temp[1],$derived_module_size);
|
$derived_module_size = calculate_size($temp[1],$derived_module_size);
|
||||||
$working_size = calculate_size($temp[1],0);
|
$working_size = calculate_size($temp[1],0);
|
||||||
$device_size = $working_size;
|
$device_size = $working_size;
|
||||||
|
@ -12634,8 +12702,11 @@ sub data_processor {
|
||||||
sub process_size {
|
sub process_size {
|
||||||
my ($size) = @_;
|
my ($size) = @_;
|
||||||
my ($b_trim,$unit) = (0,'');
|
my ($b_trim,$unit) = (0,'');
|
||||||
|
#print "size0: $size\n";
|
||||||
return 'N/A' if ( ! $size );
|
return 'N/A' if ( ! $size );
|
||||||
return $size if $size =~ /\D/;
|
#return $size if $size =~ /\D/;
|
||||||
|
return $size if !main::is_numeric($size);
|
||||||
|
#print "size: $size\n";
|
||||||
if ( $size < 1024 ){
|
if ( $size < 1024 ){
|
||||||
$unit='MiB';
|
$unit='MiB';
|
||||||
}
|
}
|
||||||
|
@ -12658,7 +12729,8 @@ sub process_size {
|
||||||
}
|
}
|
||||||
sub calculate_size {
|
sub calculate_size {
|
||||||
my ($data, $size) = @_;
|
my ($data, $size) = @_;
|
||||||
if ( $data =~ /^[0-9]+\s*[GMTP]B/) {
|
# technically k is KiB, K is KB but can't trust that
|
||||||
|
if ( $data =~ /^[0-9]+\s*[kKGMTP]B/) {
|
||||||
if ( $data =~ /([0-9]+)\s*GB/ ) {
|
if ( $data =~ /([0-9]+)\s*GB/ ) {
|
||||||
$data = $1 * 1024;
|
$data = $1 * 1024;
|
||||||
}
|
}
|
||||||
|
@ -12671,13 +12743,20 @@ sub calculate_size {
|
||||||
elsif ( $data =~ /([0-9]+)\s*PB/ ) {
|
elsif ( $data =~ /([0-9]+)\s*PB/ ) {
|
||||||
$data = $1 * 1024 * 1000 * 1000;
|
$data = $1 * 1024 * 1000 * 1000;
|
||||||
}
|
}
|
||||||
if ($data =~ /^[0-9][0-9]+$/ && $data > $size ) {
|
elsif ( $data =~ /([0-9]+)\s*[kK]B/ ) {
|
||||||
|
$data = $1/1024;
|
||||||
|
#print "d3:$data\n";
|
||||||
|
}
|
||||||
|
if (main::is_numeric($data) && $data > $size ) {
|
||||||
|
#if ($data =~ /^[0-9][0-9]+$/ && $data > $size ) {
|
||||||
$size=$data;
|
$size=$data;
|
||||||
}
|
}
|
||||||
|
#print "d1: $data s1: $size\n";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$size = 0;
|
$size = 0;
|
||||||
}
|
}
|
||||||
|
#print "d2: $data s2: $size\n";
|
||||||
return $size;
|
return $size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14380,7 +14459,7 @@ sub get {
|
||||||
my (@data,@rows,$key1,$val1);
|
my (@data,@rows,$key1,$val1);
|
||||||
my $num = 0;
|
my $num = 0;
|
||||||
my $ref = $alerts{'dmidecode'};
|
my $ref = $alerts{'dmidecode'};
|
||||||
if ( $$ref{'action'} eq 'use' && (!$b_arm || $b_slot_tool )){
|
if ($b_fake_dmidecode || ( $$ref{'action'} eq 'use' && (!$b_arm || $b_slot_tool ) )){
|
||||||
@rows = slot_data();
|
@rows = slot_data();
|
||||||
}
|
}
|
||||||
elsif ($b_arm && !$b_slot_tool){
|
elsif ($b_arm && !$b_slot_tool){
|
||||||
|
@ -16144,7 +16223,7 @@ sub get_linux_distro {
|
||||||
}
|
}
|
||||||
if ($extra > 0){
|
if ($extra > 0){
|
||||||
my $base_debian_version_distro = 'sidux';
|
my $base_debian_version_distro = 'sidux';
|
||||||
my $base_debian_version_osr = 'lmde|neptune|pureos|sparky|tails';
|
my $base_debian_version_osr = 'lmde|neptune|parrot|pureos|sparky|tails';
|
||||||
my $base_default = 'antix-version|mx-version'; # osr has base ids
|
my $base_default = 'antix-version|mx-version'; # osr has base ids
|
||||||
my $base_issue = 'bunsen'; # base only found in issue
|
my $base_issue = 'bunsen'; # base only found in issue
|
||||||
my $base_manual = 'blankon|deepin|kali'; # synthesize, no direct data available
|
my $base_manual = 'blankon|deepin|kali'; # synthesize, no direct data available
|
||||||
|
@ -17144,7 +17223,7 @@ sub set_dmesg_boot_data {
|
||||||
sub set_dmi_data {
|
sub set_dmi_data {
|
||||||
eval $start if $b_log;
|
eval $start if $b_log;
|
||||||
$_[0] = 1; # check boolean passed by reference
|
$_[0] = 1; # check boolean passed by reference
|
||||||
if ($alerts{'dmidecode'}{'action'} eq 'use' ){
|
if ($b_fake_dmidecode || $alerts{'dmidecode'}{'action'} eq 'use' ){
|
||||||
set_dmidecode_data();
|
set_dmidecode_data();
|
||||||
}
|
}
|
||||||
eval $end if $b_log;
|
eval $end if $b_log;
|
||||||
|
@ -17153,12 +17232,18 @@ sub set_dmi_data {
|
||||||
sub set_dmidecode_data {
|
sub set_dmidecode_data {
|
||||||
eval $start if $b_log;
|
eval $start if $b_log;
|
||||||
my ($content,@data,@working,$type,$handle);
|
my ($content,@data,@working,$type,$handle);
|
||||||
|
if ($b_fake_dmidecode){
|
||||||
#my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/dmidecode/pci-freebsd-8.2-2";
|
#my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/dmidecode/pci-freebsd-8.2-2";
|
||||||
|
# my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/dmidecode/dmidecode-loki-1.txt";
|
||||||
|
#my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/dmidecode/dmidecode-t41-1.txt";
|
||||||
#open my $fh, '<', $file or die "can't open $file: $!";
|
#open my $fh, '<', $file or die "can't open $file: $!";
|
||||||
#chomp(@data = <$fh>);
|
#chomp(@data = <$fh>);
|
||||||
|
}
|
||||||
|
else {
|
||||||
my $path = check_program('dmidecode');
|
my $path = check_program('dmidecode');
|
||||||
$content = qx($path 2>/dev/null) if $path;
|
$content = qx($path 2>/dev/null) if $path;
|
||||||
@data = split /\n/, $content;
|
@data = split /\n/, $content;
|
||||||
|
}
|
||||||
# we don't need the opener lines of dmidecode output
|
# we don't need the opener lines of dmidecode output
|
||||||
# but we do want to preserve the indentation. Empty lines
|
# but we do want to preserve the indentation. Empty lines
|
||||||
# won't matter, they will be skipped, so no need to handle them.
|
# won't matter, they will be skipped, so no need to handle them.
|
||||||
|
@ -18316,6 +18401,7 @@ sub generate_lines {
|
||||||
}
|
}
|
||||||
if ( $show{'cpu'} || $show{'cpu-basic'} ){
|
if ( $show{'cpu'} || $show{'cpu-basic'} ){
|
||||||
set_pci_data($b_pci_check) if $b_arm && !$b_pci_check;
|
set_pci_data($b_pci_check) if $b_arm && !$b_pci_check;
|
||||||
|
set_dmi_data($b_dmi_check) if $b_dmi && !$b_dmi_check;
|
||||||
set_dmesg_boot_data() if ($bsd_type && !$b_dmesg_boot_check);
|
set_dmesg_boot_data() if ($bsd_type && !$b_dmesg_boot_check);
|
||||||
my $arg = ($show{'cpu-basic'}) ? 'basic' : 'full' ;
|
my $arg = ($show{'cpu-basic'}) ? 'basic' : 'full' ;
|
||||||
%row = line_handler('CPU','cpu',$arg);
|
%row = line_handler('CPU','cpu',$arg);
|
||||||
|
|
6
inxi.1
6
inxi.1
|
@ -1,4 +1,4 @@
|
||||||
.TH INXI 1 "2018\-09\-07" inxi "inxi manual"
|
.TH INXI 1 "2018\-09\-10" inxi "inxi manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
inxi \- Command line system information script for console and IRC
|
inxi \- Command line system information script for console and IRC
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
@ -625,6 +625,10 @@ methods are found for each distribution system base detection.
|
||||||
\- Adds serial number, voltage (if available). Note that \fBvolts\fR shows the
|
\- Adds serial number, voltage (if available). Note that \fBvolts\fR shows the
|
||||||
data (if available) as the voltage now / minimum design voltage.
|
data (if available) as the voltage now / minimum design voltage.
|
||||||
.TP
|
.TP
|
||||||
|
.B \-xx \-C\fR
|
||||||
|
\- Adds \fBL1 cache:\fR and \fBL3 cache:\fR if either are available. Requires
|
||||||
|
dmidecode and sudo/root.
|
||||||
|
.TP
|
||||||
.B \-xx \-D\fR
|
.B \-xx \-D\fR
|
||||||
\- Adds disk serial number.
|
\- Adds disk serial number.
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,46 @@
|
||||||
|
=====================================================================================
|
||||||
|
Version: 3.0.24
|
||||||
|
Patch Version: 00
|
||||||
|
Script Date: 2018-09-10
|
||||||
|
-----------------------------------
|
||||||
|
Changes:
|
||||||
|
-----------------------------------
|
||||||
|
New version, new man page. Bug fix, enhancements, fixes.
|
||||||
|
|
||||||
|
Bugs:
|
||||||
|
1. Big bug found on certain systems, they use non system memory memory arrays, inxi
|
||||||
|
failed to anticipate that situation, and would exit with error when run as root for
|
||||||
|
-m when it hit those array types. These arrays did not have modules listed, so the
|
||||||
|
module array was undefined, which caused the failure. Thanks Manjaro anonymous
|
||||||
|
debugger dataset 'loki' for finding this failure.
|
||||||
|
This is literally the first dataset I've seen that had this issue, but who knows
|
||||||
|
how many other system boards will show something like that as well.
|
||||||
|
|
||||||
|
Fixes:
|
||||||
|
1. Related to bug 1, do not show the max module size item if not system memory
|
||||||
|
and size is less than 10 MiB. Assuming there that it's one of these odd boards.
|
||||||
|
|
||||||
|
Enhancements:
|
||||||
|
1. For bug 1, extended Memory: report to include array type if not system memory.
|
||||||
|
That instance had Video Memory, Flash Memory, and Cache Memory arrays along with
|
||||||
|
the regular System Memory array. Now shows: use: Video Memory for example if not
|
||||||
|
System Memory to make it clear what is going on.
|
||||||
|
2. Added basic Parrot system base, but for some inexplicable reason, Parrot changed
|
||||||
|
the /etc/debian_version file to show 'stable' instead of the release number. Why?
|
||||||
|
Who knows, it would be so much easier if people making these derived distros would
|
||||||
|
be consistent and not change things for no good reason.
|
||||||
|
3. Added a few more pattern matches to existing vendors for disks. As usual, thanks
|
||||||
|
linuxlite/linux hardware database for the endless lists of disk data.
|
||||||
|
4. Added internal dmidecode debugger switches, that makes it much easier to inject
|
||||||
|
test dmidecode data from text files using debugger switches internally.
|
||||||
|
5. Added -Cxx item, which will run if root and -C are used, now grabs L1 and L3
|
||||||
|
cache data from dmidecode and shows it. I didn't realize that data was there, not
|
||||||
|
sure how I'd missed it all these years, I guess pinxi really is much easier to work
|
||||||
|
on! This only runs if user has dmidecode permissions from root or sudo.
|
||||||
|
|
||||||
|
-----------------------------------
|
||||||
|
-- Harald Hope - Mon, 10 Sep 2018 15:00:17 -0700
|
||||||
|
|
||||||
=====================================================================================
|
=====================================================================================
|
||||||
Version: 3.0.23
|
Version: 3.0.23
|
||||||
Patch Version: 00
|
Patch Version: 00
|
||||||
|
|
Loading…
Add table
Reference in a new issue