aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2020-08-22 19:41:26 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2020-08-22 19:41:26 -0400
commite06112ed81893de328da38fbd41a435359cb7cd3 (patch)
tree2e7a9d163f0f2709826aaf3b1eb7ee1daa2b2bb2
parent6aa81e6d3ec977234cfcdd7842912214ab3e5b07 (diff)
downloadinxi-upstream.tar.bz2
inxi-upstream.tar.xz
inxi-upstream.tar.zst
New upstream version 3.1.06-1.upstream/3.1.06-1upstream
-rwxr-xr-xinxi645
-rw-r--r--inxi.183
-rw-r--r--inxi.changelog121
3 files changed, 589 insertions, 260 deletions
diff --git a/inxi b/inxi
index 277efa9..0ce2026 100755
--- a/inxi
+++ b/inxi
@@ -39,8 +39,8 @@ use POSIX qw(uname strftime ttyname);
## INXI INFO ##
my $self_name='inxi';
-my $self_version='3.1.05';
-my $self_date='2020-07-27';
+my $self_version='3.1.06';
+my $self_date='2020-08-17';
my $self_patch='00';
## END INXI INFO ##
@@ -60,27 +60,28 @@ if (eval {require Time::HiRes}){
}
@t0 = eval 'Time::HiRes::gettimeofday()' if $b_hires; # let's start it right away
## Hashes
-my (%alerts,%client,%colors,%debugger,%dl,%files,%program_values,%rows,%system_files);
+my (%alerts,%client,%colors,%debugger,%dl,%files,%program_values,%rows,
+%sensors_raw,%system_files);
## Arrays
# ps_aux is full output, ps_cmd is only the last 10 columns to last
my (@app,@dmesg_boot,@devices_audio,@devices_graphics,@devices_network,
@devices_hwraid,@devices_timer,@dmi,@gpudata,@ifs,@ifs_bsd,
-@paths,@proc_partitions,@ps_aux,@ps_cmd,@ps_gui,
+@paths,@proc_partitions,@ps_aux,@ps_cmd,@ps_gui,@sensors_exclude,@sensors_use,
@sysctl,@sysctl_battery,@sysctl_sensors,@sysctl_machine,@uname,@usb);
## Disk arrays
my (@dm_boot_disk,@dm_boot_optical,@glabel,@gpart,@hardware_raid,@labels,
-@lsblk,@partitions,@raid,@swaps,@sysctl_disks,@uuids);
+@lsblk,@partitions,@raid,@sysctl_disks,@swaps,@uuids);
my @test = (0,0,0,0,0);
## Booleans
-my ($b_admin,$b_arm,$b_bb_ps,$b_block_tool,$b_console_irc,
+my ($b_admin,$b_arm,$b_bb_ps,$b_block_tool,
$b_display,$b_dmesg_boot_check,$b_dmi,$b_dmidecode_force,
$b_fake_bsd,$b_fake_dboot,$b_fake_dmidecode,$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_no_sudo,
+$b_log,$b_log_colors,$b_log_full,$b_man,$b_mem,$b_no_html_wan,$b_mips,$b_no_sudo,
$b_pci,$b_pci_tool,$b_pkg,$b_ppc,$b_proc_partitions,$b_ps_gui,
-$b_root,$b_running_in_display,$b_skip_dig,
+$b_root,$b_running_in_display,$b_sensors,$b_skip_dig,
$b_slot_tool,$b_soc_audio,$b_soc_gfx,$b_soc_net,$b_soc_timer,$b_sparc,
$b_swaps,$b_sysctl,$b_usb,$b_usb_check,$b_usb_sys,$b_usb_tool,
$b_wmctrl);
@@ -99,7 +100,6 @@ my ($bits_sys,$cpu_arch);
my ($cpu_sleep,$dl_timeout,$limit,$ps_cols,$ps_count) = (0.35,4,10,0,5);
my $sensors_cpu_nu = 0;
my ($dl_ua,$weather_source,$weather_unit) = ('s-tools/' . $self_name . '-',100,'mi');
-
## Tools
my ($display,$ftp_alt,$tty_session);
my ($display_opt,$sudo) = ('','');
@@ -506,7 +506,7 @@ sub set_sep {
# sudo will just error out which is the safest course here for now,
# otherwise that interactive sudo password thing is too annoying
sub set_sudo {
- if (!$b_root && !$b_no_sudo && (my $path = main::check_program('sudo'))) {
+ if (!$b_root && !$b_no_sudo && (my $path = check_program('sudo'))) {
my @data = program_data('sudo');
$data[1] =~ s/^([0-9]+\.[0-9]+).*/$1/;
#print "sudo v: $data[1]\n";
@@ -703,6 +703,7 @@ sub get_color_scheme {
[qw(MAGENTA BLUE NORMAL)],
[qw(MAGENTA DBLUE NORMAL)],
);
+ eval $end if $b_log;
if ($type eq 'count' ){
return scalar @color_schemes;
}
@@ -713,7 +714,6 @@ sub get_color_scheme {
return @{$color_schemes[$type]};
# print Dumper $color_schemes[$scheme_nu];
}
- eval $end if $b_log;
}
sub set_color_scheme {
@@ -1020,7 +1020,7 @@ sub process_selection {
}
sub delete_all_colors {
my @file_lines = main::reader( $user_config_file );
- open( $w_fh, '>', $user_config_file ) or error_handler('open', $user_config_file, $!);
+ open( $w_fh, '>', $user_config_file ) or main::error_handler('open', $user_config_file, $!);
foreach ( @file_lines ) {
if ( $_ !~ /^(CONSOLE_COLOR_SCHEME|GLOBAL_COLOR_SCHEME|IRC_COLOR_SCHEME|IRC_CONS_COLOR_SCHEME|IRC_X_TERM_COLOR_SCHEME|VIRT_TERM_COLOR_SCHEME)/){
print {$w_fh} "$_";
@@ -1030,7 +1030,7 @@ sub delete_all_colors {
}
sub delete_global_color {
my @file_lines = main::reader( $user_config_file );
- open( $w_fh, '>', $user_config_file ) or error_handler('open', $user_config_file, $!);
+ open( $w_fh, '>', $user_config_file ) or main::error_handler('open', $user_config_file, $!);
foreach ( @file_lines ) {
if ( $_ !~ /^GLOBAL_COLOR_SCHEME/){
print {$w_fh} "$_";
@@ -1042,7 +1042,7 @@ sub set_config_color_scheme {
my $value = shift;
my @file_lines = main::reader( $user_config_file );
my $b_found = 0;
- open( $w_fh, '>', $user_config_file ) or error_handler('open', $user_config_file, $!);
+ open( $w_fh, '>', $user_config_file ) or main::error_handler('open', $user_config_file, $!);
foreach ( @file_lines ) {
if ( $_ =~ /^$configs{'variable'}/ ){
$_ = "$configs{'variable'}=$value";
@@ -1141,10 +1141,13 @@ sub get_config_item {
elsif ($key eq 'LIMIT') {$limit = $val if is_int($val)}
elsif ($key eq 'OUTPUT_TYPE') {$output_type = $val if $val =~ /^(json|screen|xml)$/}
elsif ($key eq 'NO_DIG') {$b_skip_dig = $val if is_int($val)}
+ elsif ($key eq 'NO_HTML_WAN') {$b_no_html_wan = $val if is_int($val)}
elsif ($key eq 'NO_SUDO') {$b_no_sudo = $val if is_int($val)}
elsif ($key eq 'PARTITION_SORT') {$show{'partition-sort'} = $val if ($val =~ /^(dev-base|fs|id|label|percent-used|size|uuid|used)$/) }
elsif ($key eq 'PS_COUNT') {$ps_count = $val if is_int($val) }
elsif ($key eq 'SENSORS_CPU_NO') {$sensors_cpu_nu = $val if is_int($val)}
+ elsif ($key eq 'SENSORS_EXCLUDE') {@sensors_exclude = split /\s*,\s*/, $val if $val}
+ elsif ($key eq 'SENSORS_USE') {@sensors_use = split /\s*,\s*/, $val if $val}
elsif ($key eq 'SHOW_HOST' || $key eq 'B_SHOW_HOST') {
if (is_int($val)){
$show{'host'} = $val;
@@ -1248,7 +1251,7 @@ sub log_data {
# print "1: $one 2: $two 3: $three\n";
if ($one eq 'fs') {
if (ref $three eq 'ARRAY'){
- my @temp = @$three;
+ # my @temp = @$three;
# print Data::Dumper::Dumper \@$three;
$args = "\n${spacer}Args: " . joiner($three, '; ', 'unset');
}
@@ -1828,6 +1831,8 @@ sub system_data {
['rc-status','-l'],
['rc-status','-r'],
['sensors',''],
+ ['sensors','-j'],
+ ['sensors','-u'],
# leaving this commented out to remind that some systems do not
# support strings --version, but will just simply hang at that command
# which you can duplicate by simply typing: strings then hitting enter.
@@ -3564,7 +3569,7 @@ sub program_values {
@program_data = @{$program_values{$app}};
}
#my $debug = Dumper \@program_data;
- main::log_data('dump',"Program Data",\@program_data) if $b_log;
+ log_data('dump',"Program Data",\@program_data) if $b_log;
return @program_data;
}
@@ -3772,7 +3777,7 @@ sub writer {
sub get_defaults {
my ($type) = @_;
my %defaults = (
- 'ftp-upload' => 'ftp.techpatterns.com/incoming',
+ 'ftp-upload' => 'ftp.smxi.org/incoming',
'inxi-branch-1' => 'https://github.com/smxi/inxi/raw/one/',
'inxi-branch-2' => 'https://github.com/smxi/inxi/raw/two/',
'inxi-dev' => 'https://smxi.org/in/',
@@ -3978,8 +3983,8 @@ sub get_options{
eval $start if $b_log;
my (@args) = @_;
$show{'short'} = 1;
- my ($b_downloader,$b_help,$b_no_man,$b_no_man_force,$b_recommends,$b_updater,
- $b_version,$b_use_man,$self_download, $download_id);
+ my ($b_downloader,$b_help,$b_no_man,$b_no_man_force,$b_sensors_default,
+ $b_recommends,$b_updater,$b_version,$b_use_man,$self_download, $download_id);
GetOptions (
'a|admin' => sub {
$b_admin = 1;},
@@ -4454,6 +4459,8 @@ sub get_options{
'host|hostname' => sub {
$show{'host'} = 1;
$show{'no-host'} = 0},
+ 'html-wan' => sub {
+ $b_no_html_wan = 0; },
'indent-min:i' => sub {
my ($opt,$arg) = @_;
if ($arg =~ /^\d+$/){
@@ -4486,6 +4493,8 @@ sub get_options{
'no-host|no-hostname' => sub {
$show{'host'} = 0 ;
$show{'no-host'} = 1},
+ 'no-html-wan' => sub {
+ $b_no_html_wan= 1;},
'no-man' => sub {
$b_no_man_force = 0; },
'no-ssl' => sub {
@@ -4509,6 +4518,24 @@ sub get_options{
$b_ppc = 1 },
'recommends' => sub {
$b_recommends = 1; },
+ 'sensors-default' => sub {
+ $b_sensors_default = 1; },
+ 'sensors-exclude:s' => sub {
+ my ($opt,$arg) = @_;
+ if ($arg){
+ @sensors_exclude = split /\s*,\s*/, $arg;
+ }
+ else {
+ error_handler('bad-arg',$opt,$arg);
+ }},
+ 'sensors-use:s' => sub {
+ my ($opt,$arg) = @_;
+ if ($arg){
+ @sensors_use = split /\s*,\s*/, $arg;
+ }
+ else {
+ error_handler('bad-arg',$opt,$arg);
+ }},
'sparc' => sub {
$b_sparc = 1; },
'sys-debug' => sub {
@@ -4587,6 +4614,10 @@ sub get_options{
}
}
$show{'graphic-basic'} = 0 if $b_admin;
+ if ($b_sensors_default){
+ @sensors_exclude = ();
+ @sensors_use = ();
+ }
$b_block_tool = 1 if ( $b_admin && ($show{'partition'} || $show{'partition-full'} ));
set_sudo() if ( $show{'unmounted'} || ($extra > 0 && $show{'disk'}) );
$extra = 3 if $b_admin;
@@ -4624,7 +4655,6 @@ sub get_options{
if ($b_admin && $show{'disk'}){
$b_smartctl = 1;
}
-
}
sub show_options {
@@ -4966,6 +4996,7 @@ sub show_options {
(e.g. -M, -B)." ],
['1', '', '--downloader', "Force $self_name to use [curl|fetch|perl|wget] for downloads." ],
['1', '', '--host', "Turn on hostname for -S." ],
+ ['1', '', '--html-wan', "Overrides configuration item NO_HTML_WAN (resets to default)." ],
['1', '', '--indent-min', "Set point where $self_name autowraps line starters." ],
['1', '', '--limit', "[-1; 1-x] Set max output limit of IP addresses for -i
(default 10; -1 removes limit)." ],
@@ -4980,6 +5011,8 @@ sub show_options {
@rows = (
['1', '', '--no-dig', "Skip dig for WAN IP checks, use downloader program." ],
['1', '', '--no-host', "Turn off hostname for -S. Useful if showing output from servers etc." ],
+ ['1', '', '--no-html-wan', "Skip HTML IP sources for WAN IP checks, use dig only,
+ or nothing if --no-dig." ],
);
push @data, @rows;
if ( $use{'update'} ){
@@ -4998,6 +5031,12 @@ sub show_options {
['1', '', '--output-file', "[Full filepath|print] Output file to be used for --output." ],
['1', '', '--partition-sort', "[dev-base|fs|id|label|percent-used|size|uuid|used]
Change sort order of ${partition_string} output. See man page for specifics." ],
+ ['1', '', '--sensors-default', "Removes configuration item SENSORS_USE and SENSORS_EXCLUDE.
+ Same as default behavior." ],
+ ['1', '', '--sensors-exclude', "[sensor[s] name, comma separated] Exclude supplied sensor
+ array[s] for -s output (lm-sensors, Linux only)." ],
+ ['1', '', '--sensors-use', "[sensor[s] name, comma separated] Use only supplied sensor
+ array[s] for -s output (lm-sensors, Linux only)." ],
['1', '', '--sleep', "[0-x.x] Change CPU sleep time, in seconds, for -C
(default:^$cpu_sleep). Allows system to catch up and show a more accurate CPU
use. Example:^$self_name^-Cxxx^--sleep^0.15" ],
@@ -5021,7 +5060,7 @@ sub show_options {
['2', '11', '', "Full file/system info logging." ],
['1', '', ,'', "The following create a tar.gz file of system data, plus $self_name
output. To automatically upload debugger data tar.gz file
- to ftp.techpatterns.com: $self_name^--debug^21" ],
+ to ftp.smxi.org: $self_name^--debug^21" ],
['2', '20', '', "Full system data collection: /sys; xorg conf and log data, xrandr,
xprop, xdpyinfo, glxinfo etc.; data from dev, disks,
${partition_string}s, etc." ],
@@ -5699,6 +5738,7 @@ sub row_defaults {
'dmesg-boot-missing' => 'dmesg.boot not found',
'IP' => "No $id found. Connected to web? SSL issues?",
'IP-dig' => "No $id found. Connected to web? SSL issues? Try --no-dig",
+ 'IP-no-dig' => "No $id found. Connected to web? SSL issues? Try enabling dig",
'machine-data' => "No machine data: try newer kernel.",
'machine-data-bsd' => "No machine data: Is dmidecode installed? Try -M --dmidecode.",
'machine-data-dmidecode' => "No machine data: try newer kernel. Is dmidecode installed? Try -M --dmidecode.",
@@ -6897,7 +6937,7 @@ sub create_output_full {
my $j = scalar @rows;
$cpu{'model_name'} ||= 'N/A';
@data = ({
- main::key($num++,1,1,'Topology') => $properties{'cpu-layout'},
+ main::key($num++,1,1,'Info') => $properties{'cpu-layout'},
main::key($num++,0,2,'model') => $cpu{'model_name'},
},);
@rows = (@rows,@data);
@@ -7072,8 +7112,8 @@ sub create_output_short {
$cpu[1] ||= main::row_defaults('cpu-model-null');
$cpu[2] ||= 'N/A';
@data = ({
- main::key($num++,1,1,$cpu[0]) => $cpu[1],
- main::key($num++,0,2,'type') => $cpu[2],
+ main::key($num++,1,1,'Info') => $cpu[0] . ' ' . $cpu[1] . ' [' . $cpu[2] . ']',
+ #main::key($num++,0,2,'type') => $cpu[2],
},);
if ($extra > 0){
$data[0]{main::key($num++,0,2,'arch')} = $cpu[7];
@@ -8836,7 +8876,7 @@ sub disk_data {
# to same partitions, or btrfs sub volume mounts, is present. The value is
# searched for an earlier appearance of that partition and if it is present,
# the data is not added into the partition used size.
- if ( $row{'dev-base'} !~ /^\/\/|:\// && ! (grep {/$row{'dev-base'}/} @devs) ){
+ if ( $row{'dev-base'} !~ /^(\/\/|:\/)/ && ! (grep {/$row{'dev-base'}/} @devs) ){
$used += $row{'used'} if $row{'used'};
push @devs, $row{'dev-base'};
}
@@ -8895,9 +8935,12 @@ sub proc_data {
# special case from this data: 8 0 156290904 sda
# 43 0 48828124 nbd0
# note: known starters: vm: 252/253/254; grsec: 202; nvme: 259 mmcblk: 179
+ # Note: with > 1 nvme drives, the minor number no longer passes the modulus tests,
+ # It appears to just increase randomly from the first 0 minor of the first nvme to
+ # nvme partitions to next nvme, so it only passes the test for the first nvme drive.
if ( $row[0] =~ /^(3|8|22|33|43|179|202|252|253|254|259)$/ &&
$row[-1] =~ /(mmcblk[0-9]+|n[b]?d[0-9]+|nvme[0-9]+n[0-9]+|[hsv]d[a-z]+)$/ &&
- ( $row[1] % 16 == 0 || $row[1] % 16 == 8 ) ) {
+ ( $row[1] % 16 == 0 || $row[1] % 16 == 8 || $row[-1] =~ /(nvme[0-9]+n[0-9]+)$/) ) {
$size += $row[2];
}
}
@@ -9711,12 +9754,12 @@ sub set_vendors {
['(Crucial|^(FC)?CT|-CT|^M4\b|Gizmo!)','Crucial','Crucial',''],
['^(INTEL|SSD(PAM|SA2))','^INTEL','Intel',''],
# note: S[AV][1-9][0-9] can trigger false positives
- ['(KINGSTON|DataTraveler|DT\s?(DUO|Microduo|101)|^SMS|^SHS|^SS0|^SUV|^Ultimate CF|HyperX|^S[AV][1234]00)','KINGSTON','Kingston',''], # maybe SHS: SHSS37A SKC SUV
+ ['(KINGSTON|DataTraveler|DT\s?(DUO|Microduo|101)|^SMS|^SHS|^SS0|^SUV|^Ultimate CF|HyperX|^S[AV][1234]00|^SKYMEDI)','KINGSTON','Kingston',''], # maybe SHS: SHSS37A SKC SUV
# must come before samsung MU. NOTE: toshiba can have: TOSHIBA_MK6475GSX: mush: MKNSSDCR120GB_
['(^MKN|Mushkin)','Mushkin','Mushkin',''], # MKNS
# MU = Multiple_Flash_Reader too risky: |M[UZ][^L] HD103SI HD start risky
# HM320II HM320II
- ['(SAMSUNG|^MCG[0-9]+GC|^MCC|^MCBOE|^[GS]2 Portable|^[DG]3 Station|^DUO\b|^P3|^BGN|^BJ[NT]|^BWB|^(HM|SP)[0-9]{2}|^MZMPC|^HD[0-9]{3}[A-Z]{2}$)','SAMSUNG','Samsung',''], # maybe ^SM, ^HM
+ ['(SAMSUNG|^MCG[0-9]+GC|^MCC|^MCBOE|\bEVO\b|^[GS]2 Portable|^[DG]3 Station|^DUO\b|^P3|^BGN|^BJ[NT]|^BWB|^(HM|SP)[0-9]{2}|^MZMPC|^HD[0-9]{3}[A-Z]{2}$)','SAMSUNG','Samsung',''], # maybe ^SM, ^HM
# Android UMS Composite?
['(SanDisk|^SDS[S]?[DQ]|^SL([0-9]+)G|^AFGCE|^ABLCD|^SDW[1-9]|^U3\b|ULTRA\sFIT|Clip Sport|Cruzer|^Extreme)','SanDisk','SanDisk',''],
['^STEC\b','^STEC\b','STEC',''], # ssd drive, must come before seagate ST test
@@ -9737,7 +9780,7 @@ sub set_vendors {
['^(Hitachi|HCS|HD[PST]|DK[0-9]|IC|HT|HU|HMS)','^Hitachi','Hitachi',''],
# vb: VB0250EAVER but clashes with vbox; HP_SSD_S700_120G ;GB0500EAFYL GB starter too generic?
# DX110064A5xnNMRI ids as HP and Sandisc, same ID, made by sandisc for hp? not sure
- ['^(HP\b|[MV]B[0-6]|G[BJ][01]|DF[FK|012]|v[0-9]{3}[bgorw]$|x[0-9]{3}[w]$)','^HP','HP',''],
+ ['^(HP\b|[MV]B[0-6]|G[BJ][01]|DF|0-9]|FK|0-9]|PSS|v[0-9]{3}[bgorw]$|x[0-9]{3}[w]$)','^HP','HP',''],
['^(LSD|Lexar|JumpDrive|JD\s?Firefly|WorkFlow)','^Lexar','Lexar',''], # mmc-LEXAR_0xb016546c; JD Firefly;
# OCZSSD2-2VTXE120G is OCZ-VERTEX2_3.5
['^(OCZ|APOC|D2|DEN|DEN|DRSAK|EC188|FTNC|GFGC|MANG|MMOC|NIMC|NIMR|PSIR|RALLY2|TALOS2|TMSC|TRSAK)','^OCZ[\s-]','OCZ',''],
@@ -9818,7 +9861,7 @@ sub set_vendors {
['^Fordisk','^Fordisk','Fordisk',''],
# FK0032CAAZP/FB160C4081 FK or FV can be HP but can be other things
['^FORESEE','^FORESEE','Foresee',''],
- ['^FOXLINE','^FOXLINE','Foxline',''], # russian vendor?
+ ['^(FOXLINE|FLD)','^FOXLINE','Foxline',''], # russian vendor?
['^(GALAX\b|Gamer\s?L)','^GALAX','GALAX',''],
['^Galaxy\b','^Galaxy','Galaxy',''],
['^(Garmin|Fenix|Nuvi|Zumo)','^Garmin','Garmin',''],
@@ -9830,7 +9873,7 @@ sub set_vendors {
['^Goldendisk','^Goldendisk','Goldendisk',''],
['^Goldenfir','^Goldenfir','Goldenfir',''],
# Wilk Elektronik SA, poland
- ['^(Wilk\s*)?(GOODRAM|GOODDRIVE|IR SSD|IRP|SSDPR)','^GOODRAM','GOODRAM',''],
+ ['^(Wilk\s*)?(GOODRAM|GOODDRIVE|IR[\s-]?SSD|IRP|SSDPR)','^GOODRAM','GOODRAM',''],
# supertalent also has FM: |FM
['^(G[\.]?SKILL)','^G[\.]?SKILL','G.SKILL',''],
['^G[\s-]*Tech','^G[\s-]*Technology','G-Technology',''],
@@ -9873,8 +9916,8 @@ sub set_vendors {
['^(Lacie|P92|itsaKey|iamaKey)','^Lacie','LaCie',''],
['^LANBO','^LANBO','LANBO',''],
['^LDLC','^LDLC','LDLC',''],
- # LENSE30512GMSP34MEAT3TA
- ['^LEN','^Lenovo','Lenovo',''],
+ # LENSE30512GMSP34MEAT3TA / UMIS RPITJ256PED2MWX
+ ['^(LEN|UMIS)','^Lenovo','Lenovo',''],
['^RPFT','','Lenovo O.E.M.',''],
['^LG\b','^LG','LG',''],
['^(LITE[-\s]?ON[\s-]?IT)','^LITE[-]?ON[\s-]?IT','LITE-ON IT',''], # LITEONIT_LSS-24L6G
@@ -9982,7 +10025,7 @@ sub set_vendors {
['^(OOS[1-9]|Utania)','Utania','Utania',''],
['^U-TECH','U-TECH','U-Tech',''],
['^VBOX','','VirtualBox',''],
- ['^(Verbatim|STORE N GO)','^Verbatim','Verbatim',''],
+ ['^(Verbatim|STORE N GO|Vi[1-9])','^Verbatim','Verbatim',''],
['^V-GEN','^V-GEN','V-Gen',''],
['^(Victorinox|Swissflash)','^Victorinox','Victorinox',''],
['^(Visipro|SDVP)','^Visipro','Visipro',''],
@@ -9994,6 +10037,7 @@ sub set_vendors {
['^XPG','^XPG','XPG',''],
['^XUNZHE','^XUNZHE','XUNZHE',''],
['^(YUCUN|R880)','^YUCUN','YUCUN',''],
+ ['^ZALMAN','^ZALMAN','Zalman',''],
['^ZEUSLAP','^ZEUSLAP','ZEUSLAP',''],
['^(Zheino|CHN[0-9]|CNM)','^Zheino','Zheino',''],
['^(Zotac|ZTSSD)','^Zotac','Zotac',''],
@@ -12279,14 +12323,21 @@ sub if_ip {
# dig +short +time=1 +tries=1 myip.opendns.com. A @208.67.222.222
sub wan_ip {
eval $start if $b_log;
- my (@data,$b_dig,$ip,$ua);
+ my (@data,$b_dig,$b_html,$ip,$ua);
my $num = 0;
# time: 0.06 - 0.07 seconds
+ # cisco opendns.com may be terminating supporting this one, sometimes works, sometimes not:
+ # use -4/6 to force ipv 4 or 6, but generally we want the 'natural' native
+ # ip returned.
+ # dig +short +time=1 +tries=1 myip.opendns.com @resolver1.opendns.com
+ # dig +short @ns1-1.akamaitech.net ANY whoami.akamai.net
+ # this one can take forever, and sometimes requires explicit -4 or -6
+ # dig -4 TXT +short o-o.myaddr.l.google.com @ns1.google.com
if (!$b_skip_dig && (my $program = main::check_program('dig') )){
- $ip = (main::grabber("$program +short +time=1 +tries=1 myip.opendns.com \@resolver1.opendns.com 2>/dev/null"))[0];
+ $ip = (main::grabber("$program +short +time=1 +tries=1 \@ns1-1.akamaitech.net ANY whoami.akamai.net 2>/dev/null"))[0];
$b_dig = 1;
}
- else {
+ if (!$ip && !$b_no_html_wan) {
# note: tests: akamai: 0.055 - 0.065 icanhazip.com: 0.177 0.164
# smxi: 0.525, so almost 10x slower. Dig is fast too
# leaving smxi as last test because I know it will always be up.
@@ -12303,12 +12354,22 @@ sub wan_ip {
last;
}
}
+ $b_html = 1;
}
if ($ip && $use{'filter'}){
$ip = $filter_string;
}
if (!$ip){
- $ip = ($b_dig) ? main::row_defaults('IP-dig', 'WAN IP') : main::row_defaults('IP', 'WAN IP');
+ # true case trips
+ if (!$b_dig){
+ $ip = main::row_defaults('IP-no-dig', 'WAN IP');
+ }
+ elsif ($b_dig && !$b_html){
+ $ip = main::row_defaults('IP-dig', 'WAN IP');
+ }
+ else {
+ $ip = main::row_defaults('IP', 'WAN IP');
+ }
}
@data = ({
main::key($num++,0,1,'WAN IP') => $ip,
@@ -13469,8 +13530,8 @@ sub get {
},);
@processes = (@processes,@rows);
}
- return @processes;
eval $end if $b_log;
+ return @processes;
}
sub cpu_processes {
eval $start if $b_log;
@@ -15583,7 +15644,6 @@ sub file_path {
## SensorData
{
package SensorData;
-my (@sensors_data);
my ($b_ipmi) = (0);
sub get {
eval $start if $b_log;
@@ -15635,7 +15695,6 @@ sub get {
}
@rows = (@rows,@data);
}
- undef @sensors_data;
eval $end if $b_log;
return @rows;
}
@@ -15688,6 +15747,9 @@ sub create_output {
my $gpu_unit = (defined $gpu[0]{'temp-unit'} && $gpu_temp ) ? " $gpu[0]{'temp-unit'}" : ' C';
$rows[$j]{main::key($num++,1,2,'gpu')} = $gpu_type;
$rows[$j]{main::key($num++,0,3,'temp')} = $gpu_temp . $gpu_unit;
+ if ($extra > 1 && $gpu[0]{'temp-mem'}){
+ $rows[$j]{main::key($num++,0,3,'mem')} = $gpu[0]{'temp-mem'} . $gpu_unit;
+ }
}
$j = scalar @rows;
my $ref_main = $sensors{'fan-main'};
@@ -15753,9 +15815,18 @@ sub create_output {
$rows[$j]{main::key($num++,0,3,'screen')} = $info{'screen'};
}
$rows[$j]{main::key($num++,0,3,'temp')} = $gpu_temp;
+ if ($extra > 1 && $info{'temp-mem'}){
+ $rows[$j]{main::key($num++,0,3,'mem')} = $info{'temp-mem'} . $gpu_unit;
+ }
if (defined $gpu_fan){
$rows[$j]{main::key($num++,0,3,'fan')} = $gpu_fan;
}
+ if ($extra > 2 && $info{'watts'}){
+ $rows[$j]{main::key($num++,0,3,'watts')} = $info{'watts'};
+ }
+ if ($extra > 2 && $info{'mvolts'}){
+ $rows[$j]{main::key($num++,0,3,'mV')} = $info{'mvolts'};
+ }
}
}
if ($extra > 0 && ($source eq 'ipmi' ||
@@ -15765,7 +15836,7 @@ sub create_output {
$sensors{'volts-5'} ||= 'N/A';
$sensors{'volts-3.3'} ||= 'N/A';
$sensors{'volts-vbat'} ||= 'N/A';
- $rows[$j]{main::key($num++,1,1,'Voltages')} = $data_source;
+ $rows[$j]{main::key($num++,1,1,'Power')} = $data_source;
$rows[$j]{main::key($num++,0,2,'12v')} = $sensors{'volts-12'};
$rows[$j]{main::key($num++,0,2,'5v')} = $sensors{'volts-5'};
$rows[$j]{main::key($num++,0,2,'3.3v')} = $sensors{'volts-3.3'};
@@ -15778,6 +15849,11 @@ sub create_output {
$rows[$j]{main::key($num++,0,2,'soc-p1')} = $sensors{'volts-soc-p1'} if $sensors{'volts-soc-p1'};
$rows[$j]{main::key($num++,0,2,'soc-p2')} = $sensors{'volts-soc-p2'} if $sensors{'volts-soc-p2'};
}
+ if (scalar @gpu == 1 && $extra > 2 && ($gpu[0]{'watts'} || $gpu[0]{'mvolts'})){
+ $rows[$j]{main::key($num++,1,2,'gpu')} = $gpu[0]{'type'};
+ $rows[$j]{main::key($num++,0,3,'watts')} = $gpu[0]{'watts'} if $gpu[0]{'watts'} ;
+ $rows[$j]{main::key($num++,0,3,'mV')} = $gpu[0]{'mvolts'} if $gpu[0]{'mvolts'};
+ }
}
eval $end if $b_log;
return @rows;
@@ -15950,189 +16026,174 @@ sub ipmi_data {
sub lm_sensors_data {
eval $start if $b_log;
my (%sensors);
- my ($b_valid,$sys_fan_nu) = (0,0);
- my ($adapter,$fan_working,$temp_working,$working_unit) = ('','','','');
- @sensors_data = main::grabber(main::check_program('sensors') . " 2>/dev/null");
- #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/amdgpu-w-fan-speed-stretch-k10.txt";
- #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/peci-tin-geggo.txt";
- #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/sensors-w-other-biker.txt";
- #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/sensors-asus-chassis-1.txt";
- #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/sensors-devnull-1.txt";
- #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/sensors-jammin1.txt";
- #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/sensors-mx-incorrect-1.txt";
- # my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/sensors-maximus-arch-1.txt";
- # @sensors_data = main::reader($file);
- # print join ("\n", @sensors_data), "\n";
- @sensors_data = map {$_ =~ s/\s*:\s*\+?/:/;$_} @sensors_data;
- foreach (@sensors_data){
- # we get this from gpu_data()
- if (/^(amdgpu|intel|nouveau|radeon|.*hwmon)-pci/){
- $b_valid = 0;
- $adapter = '';
+ my ($sys_fan_nu) = (0);
+ my ($adapter,$fan_working,$temp_working,$working_unit) = ('','','','','');
+ lm_sensors_processor() if !$b_sensors;
+ foreach $adapter (keys %{$sensors_raw{'main'}}){
+ next if !$adapter || ref $sensors_raw{'main'}->{$adapter} ne 'ARRAY';
+ # not sure why hwmon is excluded, forgot to add info in comments
+ if ((@sensors_use && !(grep {/$adapter/} @sensors_use)) ||
+ (@sensors_exclude && (grep {/$adapter/} @sensors_exclude))){
next;
}
- if (/^(?:(?!amdgpu|intel|nouveau|radeon|.*hwmon).)*-(isa|pci|virtual)-/){
- $b_valid = 1;
- $adapter = $1;
- next;
- }
- next if !$b_valid;
- my @working = split /:/, $_;
- next if !$working[0] || /^Adapter/;
- #print "$working[0]:$working[1]\n";
- # There are some guesses here, but with more sensors samples it will get closer.
- # note: using arrays starting at 1 for all fan arrays to make it easier overall
- # we have to be sure we are working with the actual real string before assigning
- # data to real variables and arrays. Extracting C/F degree unit as well to use
- # when constructing temp items for array.
- # note that because of charset issues, no "°" degree sign used, but it is required
- # in testing regex to avoid error. It might be because I got that data from a forum post,
- # note directly via debugger.
- if ($_ =~ /^(AMBIENT|M\/B|MB|Motherboard|SIO|SYS).*:([0-9\.]+)[\s°]*(C|F)/i) {
- # avoid SYSTIN: 118 C
- if (main::is_numeric($2) && $2 < 90 ){
- $sensors{'mobo-temp'} = $2;
+ foreach (@{$sensors_raw{'main'}->{$adapter}}){
+ my @working = split /:/, $_;
+ next if !$working[0];
+ #print "$working[0]:$working[1]\n";
+ # There are some guesses here, but with more sensors samples it will get closer.
+ # note: using arrays starting at 1 for all fan arrays to make it easier overall
+ # we have to be sure we are working with the actual real string before assigning
+ # data to real variables and arrays. Extracting C/F degree unit as well to use
+ # when constructing temp items for array.
+ # note that because of charset issues, no "°" degree sign used, but it is required
+ # in testing regex to avoid error. It might be because I got that data from a forum post,
+ # note directly via debugger.
+ if ($_ =~ /^(AMBIENT|M\/B|MB|Motherboard|SIO|SYS).*:([0-9\.]+)[\s°]*(C|F)/i) {
+ # avoid SYSTIN: 118 C
+ if (main::is_numeric($2) && $2 < 90 ){
+ $sensors{'mobo-temp'} = $2;
+ $working_unit = $3;
+ $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
+ }
+ }
+ # issue 58 msi/asus show wrong for CPUTIN so overwrite it if PECI 0 is present
+ # http://www.spinics.net/lists/lm-sensors/msg37308.html
+ # NOTE: had: ^CPU.*\+([0-9]+): but that misses: CPUTIN and anything not with + in starter
+ # However, "CPUTIN is not a reliable measurement because it measures difference to Tjmax,
+ # which is the maximum CPU temperature reported as critical temperature by coretemp"
+ # 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 cpu die temp
+ elsif ($_ =~ /^(CPU.*|Tdie.*):([0-9\.]+)[\s°]*(C|F)/i) {
+ $temp_working = $2;
$working_unit = $3;
+ if ( !$sensors{'cpu-temp'} ||
+ ( defined $temp_working && $temp_working > 0 && $temp_working > $sensors{'cpu-temp'} ) ) {
+ $sensors{'cpu-temp'} = $temp_working;
+ }
$sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
}
- }
- # issue 58 msi/asus show wrong for CPUTIN so overwrite it if PECI 0 is present
- # http://www.spinics.net/lists/lm-sensors/msg37308.html
- # NOTE: had: ^CPU.*\+([0-9]+): but that misses: CPUTIN and anything not with + in starter
- # However, "CPUTIN is not a reliable measurement because it measures difference to Tjmax,
- # which is the maximum CPU temperature reported as critical temperature by coretemp"
- # 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 cpu die temp
- elsif ($_ =~ /^(CPU.*|Tdie.*):([0-9\.]+)[\s°]*(C|F)/i) {
- $temp_working = $2;
- $working_unit = $3;
- if ( !$sensors{'cpu-temp'} ||
- ( defined $temp_working && $temp_working > 0 && $temp_working > $sensors{'cpu-temp'} ) ) {
- $sensors{'cpu-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;
- $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
- }
- elsif ($_ =~ /^(P\/S|Power).*:([0-9\.]+)[\s°]*(C|F)/i) {
- $sensors{'psu-temp'} = $2;
- $working_unit = $3;
- $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
- }
- elsif ($_ =~ /^SODIMM.*:([0-9\.]+)[\s°]*(C|F)/i) {
- $sensors{'sodimm-temp'} = $1;
- $working_unit = $2;
- $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
- }
- # for temp1/2 only use temp1/2 if they are null or greater than the last ones
- elsif ($_ =~ /^temp1:([0-9\.]+)[\s°]*(C|F)/i) {
- $temp_working = $1;
- $working_unit = $2;
- if ( !$sensors{'temp1'} ||
- ( defined $temp_working && $temp_working > 0 && $temp_working > $sensors{'temp1'} ) ) {
- $sensors{'temp1'} = $temp_working;
- }
- $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
- }
- elsif ($_ =~ /^temp2:([0-9\.]+)[\s°]*(C|F)/i) {
- $temp_working = $1;
- $working_unit = $2;
- if ( !$sensors{'temp2'} ||
- ( defined $temp_working && $temp_working > 0 && $temp_working > $sensors{'temp2'} ) ) {
- $sensors{'temp2'} = $temp_working;
+ elsif ($_ =~ /^PECI\sAgent\s0.*:([0-9\.]+)[\s°]*(C|F)/i) {
+ $sensors{'cpu-peci-temp'} = $1;
+ $working_unit = $2;
+ $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
}
- $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
- }
- # temp3 is only used as an absolute override for systems with all 3 present
- elsif ($_ =~ /^temp3:([0-9\.]+)[\s°]*(C|F)/i) {
- $temp_working = $1;
- $working_unit = $2;
- if ( !$sensors{'temp3'} ||
- ( defined $temp_working && $temp_working > 0 && $temp_working > $sensors{'temp3'} ) ) {
- $sensors{'temp3'} = $temp_working;
+ elsif ($_ =~ /^(P\/S|Power).*:([0-9\.]+)[\s°]*(C|F)/i) {
+ $sensors{'psu-temp'} = $2;
+ $working_unit = $3;
+ $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
}
- $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
- }
- # final fallback if all else fails, funtoo user showed sensors putting
- # temp on wrapped second line, not handled
- elsif ($_ =~ /^(core0|core 0|Physical id 0)(.*):([0-9\.]+)[\s°]*(C|F)/i) {
- $temp_working = $3;
- $working_unit = $4;
- if ( !$sensors{'core-0-temp'} ||
- ( defined $temp_working && $temp_working > 0 && $temp_working > $sensors{'core-0-temp'} ) ) {
- $sensors{'core-0-temp'} = $temp_working;
+ elsif ($_ =~ /^SODIMM.*:([0-9\.]+)[\s°]*(C|F)/i) {
+ $sensors{'sodimm-temp'} = $1;
+ $working_unit = $2;
+ $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
}
- $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
- }
- # note: can be cpu fan:, cpu fan speed:, etc.
- elsif (!$sensors{'fan-main'}[1] && $_ =~ /^(CPU|Processor).*:([0-9]+)[\s]RPM/i) {
- $sensors{'fan-main'} = () if !$sensors{'fan-main'};
- $sensors{'fan-main'}[1] = $2;
- }
- elsif (!$sensors{'fan-main'}[2] && $_ =~ /^(M\/B|MB|SYS|Motherboard).*:([0-9]+)[\s]RPM/i) {
- $sensors{'fan-main'} = () if !$sensors{'fan-main'};
- $sensors{'fan-main'}[2] = $2;
- }
- elsif (!$sensors{'fan-main'}[3] && $_ =~ /(Power|P\/S|POWER).*:([0-9]+)[\s]RPM/i) {
- $sensors{'fan-main'} = () if !$sensors{'fan-main'};
- $sensors{'fan-main'}[3] = $2;
- }
- elsif (!$sensors{'fan-main'}[4] && $_ =~ /(SODIMM).*:([0-9]+)[\s]RPM/i) {
- $sensors{'fan-main'} = () if !$sensors{'fan-main'};
- $sensors{'fan-main'}[4] = $2;
- }
- # note that the counters are dynamically set for fan numbers here
- # otherwise you could overwrite eg aux fan2 with case fan2 in theory
- # note: cpu/mobo/ps/sodimm are 1/2/3/4
- elsif ($_ =~ /^(AUX|CASE|CHASSIS).*:([0-9]+)[\s]RPM/i) {
- $temp_working = $2;
- $sensors{'fan-main'} = () if !$sensors{'fan-main'};
- for ( my $i = 5; $i < 30; $i++ ){
- next if defined $sensors{'fan-main'}[$i];
- if ( !defined $sensors{'fan-main'}[$i] ){
- $sensors{'fan-main'}[$i] = $temp_working;
- last;
+ # for temp1/2 only use temp1/2 if they are null or greater than the last ones
+ elsif ($_ =~ /^temp1:([0-9\.]+)[\s°]*(C|F)/i) {
+ $temp_working = $1;
+ $working_unit = $2;
+ if ( !$sensors{'temp1'} ||
+ ( defined $temp_working && $temp_working > 0 && $temp_working > $sensors{'temp1'} ) ) {
+ $sensors{'temp1'} = $temp_working;
}
+ $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
}
- }
- # in rare cases syntax is like: fan1: xxx RPM
- elsif ($_ =~ /^FAN(1)?:([0-9]+)[\s]RPM/i) {
- $sensors{'fan-default'} = () if !$sensors{'fan-default'};
- $sensors{'fan-default'}[1] = $2;
- }
- elsif ($_ =~ /^FAN([2-9]|1[0-9]).*:([0-9]+)[\s]RPM/i) {
- $fan_working = $2;
- $sys_fan_nu = $1;
- $sensors{'fan-default'} = () if !$sensors{'fan-default'};
- if ( $sys_fan_nu =~ /^([0-9]+)$/ ) {
- # add to array if array index does not exist OR if number is > existing number
- if ( defined $sensors{'fan-default'}[$sys_fan_nu] ) {
- if ( $fan_working >= $sensors{'fan-default'}[$sys_fan_nu] ) {
- $sensors{'fan-default'}[$sys_fan_nu] = $fan_working;
- }
+ elsif ($_ =~ /^temp2:([0-9\.]+)[\s°]*(C|F)/i) {
+ $temp_working = $1;
+ $working_unit = $2;
+ if ( !$sensors{'temp2'} ||
+ ( defined $temp_working && $temp_working > 0 && $temp_working > $sensors{'temp2'} ) ) {
+ $sensors{'temp2'} = $temp_working;
}
- else {
- $sensors{'fan-default'}[$sys_fan_nu] = $fan_working;
+ $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
+ }
+ # temp3 is only used as an absolute override for systems with all 3 present
+ elsif ($_ =~ /^temp3:([0-9\.]+)[\s°]*(C|F)/i) {
+ $temp_working = $1;
+ $working_unit = $2;
+ if ( !$sensors{'temp3'} ||
+ ( defined $temp_working && $temp_working > 0 && $temp_working > $sensors{'temp3'} ) ) {
+ $sensors{'temp3'} = $temp_working;
}
+ $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
}
- }
- if ($extra > 0){
- if ($_ =~ /^[+]?(12 Volt|12V).*:([0-9\.]+)\sV/i) {
- $sensors{'volts-12'} = $2;
+ # final fallback if all else fails, funtoo user showed sensors putting
+ # temp on wrapped second line, not handled
+ elsif ($_ =~ /^(core0|core 0|Physical id 0)(.*):([0-9\.]+)[\s°]*(C|F)/i) {
+ $temp_working = $3;
+ $working_unit = $4;
+ if ( !$sensors{'core-0-temp'} ||
+ ( defined $temp_working && $temp_working > 0 && $temp_working > $sensors{'core-0-temp'} ) ) {
+ $sensors{'core-0-temp'} = $temp_working;
+ }
+ $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
}
- # note: 5VSB is a field name
- elsif ($_ =~ /^[+]?(5 Volt|5V):([0-9\.]+)\sV/i) {
- $sensors{'volts-5'} = $2;
+ # note: can be cpu fan:, cpu fan speed:, etc.
+ elsif (!$sensors{'fan-main'}[1] && $_ =~ /^(CPU|Processor).*:([0-9]+)[\s]RPM/i) {
+ $sensors{'fan-main'} = () if !$sensors{'fan-main'};
+ $sensors{'fan-main'}[1] = $2;
+ }
+ elsif (!$sensors{'fan-main'}[2] && $_ =~ /^(M\/B|MB|SYS|Motherboard).*:([0-9]+)[\s]RPM/i) {
+ $sensors{'fan-main'} = () if !$sensors{'fan-main'};
+ $sensors{'fan-main'}[2] = $2;
+ }
+ elsif (!$sensors{'fan-main'}[3] && $_ =~ /(Power|P\/S|POWER).*:([0-9]+)[\s]RPM/i) {
+ $sensors{'fan-main'} = () if !$sensors{'fan-main'};
+ $sensors{'fan-main'}[3] = $2;
+ }
+ elsif (!$sensors{'fan-main'}[4] && $_ =~ /(SODIMM).*:([0-9]+)[\s]RPM/i) {
+ $sensors{'fan-main'} = () if !$sensors{'fan-main'};
+ $sensors{'fan-main'}[4] = $2;
+ }
+ # note that the counters are dynamically set for fan numbers here
+ # otherwise you could overwrite eg aux fan2 with case fan2 in theory
+ # note: cpu/mobo/ps/sodimm are 1/2/3/4
+ elsif ($_ =~ /^(AUX|CASE|CHASSIS).*:([0-9]+)[\s]RPM/i) {
+ $temp_working = $2;
+ $sensors{'fan-main'} = () if !$sensors{'fan-main'};
+ for ( my $i = 5; $i < 30; $i++ ){
+ next if defined $sensors{'fan-main'}[$i];
+ if ( !defined $sensors{'fan-main'}[$i] ){
+ $sensors{'fan-main'}[$i] = $temp_working;
+ last;
+ }
+ }
}
- elsif ($_ =~ /^[+]?(3\.3 Volt|3\.3V).*:([0-9\.]+)\sV/i) {
- $sensors{'volts-3.3'} = $2;
+ # in rare cases syntax is like: fan1: xxx RPM
+ elsif ($_ =~ /^FAN(1)?:([0-9]+)[\s]RPM/i) {
+ $sensors{'fan-default'} = () if !$sensors{'fan-default'};
+ $sensors{'fan-default'}[1] = $2;
+ }
+ elsif ($_ =~ /^FAN([2-9]|1[0-9]).*:([0-9]+)[\s]RPM/i) {
+ $fan_working = $2;
+ $sys_fan_nu = $1;
+ $sensors{'fan-default'} = () if !$sensors{'fan-default'};
+ if ( $sys_fan_nu =~ /^([0-9]+)$/ ) {
+ # add to array if array index does not exist OR if number is > existing number
+ if ( defined $sensors{'fan-default'}[$sys_fan_nu] ) {
+ if ( $fan_working >= $sensors{'fan-default'}[$sys_fan_nu] ) {
+ $sensors{'fan-default'}[$sys_fan_nu] = $fan_working;
+ }
+ }
+ else {
+ $sensors{'fan-default'}[$sys_fan_nu] = $fan_working;
+ }
+ }
}
- elsif ($_ =~ /^(Vbat).*:([0-9\.]+)\sV/i) {
- $sensors{'volts-vbat'} = $2;
+ if ($extra > 0){
+ if ($_ =~ /^[+]?(12 Volt|12V).*:([0-9\.]+)\sV/i) {
+ $sensors{'volts-12'} = $2;
+ }
+ # note: 5VSB is a field name
+ elsif ($_ =~ /^[+]?(5 Volt|5V):([0-9\.]+)\sV/i) {
+ $sensors{'volts-5'} = $2;
+ }
+ elsif ($_ =~ /^[+]?(3\.3 Volt|3\.3V).*:([0-9\.]+)\sV/i) {
+ $sensors{'volts-3.3'} = $2;
+ }
+ elsif ($_ =~ /^(Vbat).*:([0-9\.]+)\sV/i) {
+ $sensors{'volts-vbat'} = $2;
+ }
}
}
}
@@ -16143,6 +16204,74 @@ sub lm_sensors_data {
eval $end if $b_log;
return %sensors;
}
+sub lm_sensors_processor {
+ eval $start if $b_log;
+ my (@data,@sensors_data,@values);
+ my ($adapter,$holder,$type) = ('','','');
+ @sensors_data = main::grabber(main::check_program('sensors') . " 2>/dev/null");
+ #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/amdgpu-w-fan-speed-stretch-k10.txt";
+ #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/peci-tin-geggo.txt";
+ #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/sensors-w-other-biker.txt";
+ #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/sensors-asus-chassis-1.txt";
+ #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/sensors-devnull-1.txt";
+ #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/sensors-jammin1.txt";
+ #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/sensors-mx-incorrect-1.txt";
+ # my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/sensors-maximus-arch-1.txt";
+ # my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/kernel-58-sensors-ant-1.txt";
+ # my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/sensors/sensors-zenpower-nvme-2.txt";
+ # @sensors_data = main::reader($file); # only way to get sensor array data? Unless using sensors -j, but can't assume json
+ # print join ("\n", @sensors_data), "\n";
+ if (@sensors_data){
+ @sensors_data = map {$_ =~ s/\s*:\s*\+?/:/;$_} @sensors_data;
+ push @sensors_data, 'END';
+ }
+ #print Data::Dumper::Dumper \@sensors_data;
+ foreach (@sensors_data){
+ #print 'st:', $_, "\n";
+ next if /^\s*$/;
+ $_ = main::trimmer($_);
+ if (@values && $adapter && (/^Adapter/ || $_ eq 'END')){
+ # note: drivetemp: known, but many others could exist
+ if ($adapter =~ /^(drive|nvme)/){
+ $type = 'disk';
+ }
+ elsif ($adapter =~ /^(amdgpu|intel|nouveau|radeon)-/){
+ $type = 'gpu';
+ }
+ # ath/iwl: wifi; enp/eno/eth: lan nic
+ elsif ($adapter =~ /^(ath|iwl|en[op][0-9]|eth)[\S]+-/){
+ $type = 'network';
+ }
+ elsif ($adapter =~ /^(.*hwmon)-/){
+ $type = 'hwmon';
+ }
+ else {
+ $type = 'main';
+ }
+ $sensors_raw{$type}->{$adapter} = [@values];
+ @values = ();
+ $adapter = '';
+ }
+ if (/^Adapter/){
+ $adapter = $holder;
+ }
+ elsif (/\S:\S/){
+ push @values, $_;
+ }
+ else {
+ $holder = $_;
+ }
+ }
+ $b_sensors = 1;
+ if ($test[18]){
+ print 'lm sensors: ' , Data::Dumper::Dumper \%sensors_raw;
+ }
+ if ($b_log){
+ main::log_data('dump','lm-sensors data: %sensors_raw',\%sensors_raw);
+ }
+ eval $end if $b_log;
+ return @data;
+}
# oddly, openbsd sysctl actually has hw.sensors data!
sub sysctl_data {
@@ -16166,7 +16295,6 @@ sub sysctl_data {
sub set_temp_unit {
my ($sensors,$working) = @_;
my $return_unit = '';
-
if ( !$sensors && $working ){
$return_unit = $working;
}
@@ -16510,39 +16638,44 @@ sub gpu_data {
}
}
}
- if (@sensors_data){
- my ($b_found,$holder) = (0,'');
- foreach (@sensors_data){
- next if (/^Adapter:/ || /^\s*$/);
- if (/^(amdgpu|intel|nouveau|radeon)-pci-(.*)/){
- $b_found = 1;
- $holder = $1;
- $j = scalar @gpudata;
- }
- if (/^(?:(?!amdgpu|.*hwmon|intel|nouveau|radeon).)*-(pci|virtual|isa)-(.*)/){
- $b_found = 0;
- $holder = '';
- }
- if ($b_found){
- $gpudata[$j]{'type'} = $holder;
- if (/^[^:]*:([0-9]+).*\b(C|F)\s/i){
+ if ($sensors_raw{'gpu'}){
+ #my ($b_found,$holder) = (0,'');
+ foreach my $adapter (keys %{$sensors_raw{'gpu'}}){
+ $j = scalar @gpudata;
+ $gpudata[$j]{'type'} = $adapter;
+ $gpudata[$j]{'type'} =~ s/^(amdgpu|intel|nouveau|radeon)-.*/$1/;
+ # print "ad: $adapter\n";
+ foreach (@{$sensors_raw{'gpu'}->{$adapter}}){
+ # print "val: $_\n";
+ if (/^[^:]*mem[^:]*:([0-9\.]+).*\b(C|F)\b/i){
+ $gpudata[$j]{'temp-mem'} = $1;
+ $gpudata[$j]{'unit'} = $2;
+ # print "temp: $_\n";
+ }
+ elsif (/^[^:]+:([0-9\.]+).*\b(C|F)\b/i){
$gpudata[$j]{'temp'} = $1;
$gpudata[$j]{'unit'} = $2;
- # print "$_\n";
+ # print "temp: $_\n";
}
# speeds can be in percents or rpms, so need the 'fan' in regex
- if (/^.*fan.*:([0-9]+).*(RPM)?/i){
+ elsif (/^.*fan.*:([0-9\.]+).*(RPM)?/i){
$gpudata[$j]{'fan-speed'} = $1;
# NOTE: we test for nvidia %, everything else stays with nothing
$gpudata[$j]{'speed-unit'} = '';
}
- main::log_data('dump','sensors output: video: @gpudata',\@gpudata);
+ elsif (/^[^:]+:([0-9\.]+)\s+W\s/i){
+ $gpudata[$j]{'watts'} = $1;
+ }
+ elsif (/^[^:]+:([0-9\.]+)\s+mV\s/i){
+ $gpudata[$j]{'mvolts'} = $1;
+ }
}
}
}
+ main::log_data('dump','sensors output: video: @gpudata',\@gpudata);
# we'll probably use this data elsewhere so make it a one time call
$b_gpudata = 1;
- # print Data::Dumper::Dumper \@gpudata;
+ print 'gpudata: ', Data::Dumper::Dumper \@gpudata if $test[18];
eval $end if $b_log;
return @gpudata;
}
@@ -17541,8 +17674,8 @@ sub get_weather {
$date_time = test_locale_date($date_time,$show{'weather-location'},$weather{'observation-epoch'});
$weather{'observation-time-local'} = $date_time;
}
- return %weather;
eval $end if $b_log;
+ return %weather;
}
sub download_weather {
eval $start if $b_log;
@@ -17730,16 +17863,21 @@ sub get_compiler_version_bsd {
sub get_compiler_version_linux {
eval $start if $b_log;
my ($file) = @_;
- my (@compiler,$type);
+ my (@compiler,$version);
my @data = reader($file);
my $result = $data[0] if @data;
if ($result){
- $result =~ /(gcc|clang).*version\s([\S]+)/;
# $result = $result =~ /\*(gcc|clang)\*eval\*/;
- if ($1){
- $type = $2;
- $type ||= 'N/A'; # we don't really know what linux clang looks like!
- @compiler = ($1,$type);
+ # $result='Linux version 5.4.0-rc1 (sourav@archlinux-pc) (clang version 9.0.0 (tags/RELEASE_900/final)) #1 SMP PREEMPT Sun Oct 6 18:02:41 IST 2019';
+ if ($result =~ /(gcc|clang).*version\s([\S]+)/){
+ $version = $2;
+ $version ||= 'N/A'; # we don't really know what linux clang looks like!
+ @compiler = ($1,$version);
+ }
+ elsif ($result =~ /\((gcc|clang)[^\(]*\([^\)]+\)\s+([0-9\.]+)\s.*,\s*/){
+ $version = $2;
+ $version ||= 'N/A'; # we don't really know what linux clang looks like!
+ @compiler = ($1,$version);
}
}
log_data('dump','@compiler',\@compiler) if $b_log;
@@ -18007,8 +18145,8 @@ sub check_gnome {
$b_gnome = 1;
}
main::log_data('data','$detection:$b_gnome',$detection . ":$b_gnome") if $b_log;
- return $b_gnome;
eval $end if $b_log;
+ return $b_gnome;
}
sub get_env_xprop_non_gnome_based_data {
eval $start if $b_log;
@@ -18414,10 +18552,10 @@ sub get_display_manager {
( $b_vrun && ( -f "/var/run/$id" || -d "/var/run/$working" ) ) ||
( $b_vrunrc && ( -f "/var/run/rc.d/$working" || -d "/var/run/rc.d/$id" ) ) ) &&
! grep {/$working/} @found ){
- if ($extra > 2 && awk( \@dms_version, $working) && ($path = main::check_program($working)) ){}
+ if ($extra > 2 && awk( \@dms_version, $working) && ($path = check_program($working)) ){}
else {$path = $working;}
# print "$path $extra\n";
- @data = main::program_data($working,$path,3);
+ @data = program_data($working,$path,3);
$working = $data[0];
$working .= ' ' . $data[1] if $data[1];
push @found, $working;
@@ -18426,7 +18564,7 @@ sub get_display_manager {
if (!@found){
# ly does not have a run/pid file
if (grep {$_ eq 'ly'} @ps_gui) {
- @data = main::program_data('ly','ly',3);
+ @data = program_data('ly','ly',3);
$found[0] = $data[0];
$found[0] .= ' ' . $data[1] if $data[1];
}
@@ -19457,6 +19595,8 @@ sub create_output {
if ($extra > 1 && %counts){
foreach (sort keys %counts){
my ($cont,$ind) = (1,2);
+ # if package mgr command returns error, this will not be an array
+ next if ref $counts{$_} ne 'ARRAY';
if ($counts{$_}->[0] || $b_admin){
my $key = $_;
$key =~ s/^zzz-//; # get rid of the special sorters for items to show last
@@ -19490,7 +19630,7 @@ sub package_counts {
['guix-sys','guix','p','package -p "/run/current-system/profile" -I',1,0,''],
['guix-usr','guix','p','package package -I',1,0,''],
['pacman','pacman','p','-Qq --color never',1,0,''],
- ['pacman-g2','pacman-g2','p','-i',1,0,''],
+ ['pacman-g2','pacman-g2','p','-Q',1,0,''],
['pkg','pkg','d','/var/db/pkg/*',1,0,''], # 'pkg list' returns non programs
['pkg_info','pkg_info','p','',1,0,''],
['pkgtool','pkgtool','d','/var/log/packages/*',1,4,'\\/'],
@@ -19679,7 +19819,7 @@ sub get_shell_data {
# do nothing, just leave $shell as is
}
# note: not all programs return version data. This may miss unhandled shells!
- elsif ((@app = main::program_data(lc($shell),lc($shell),1)) && $app[0]){
+ elsif ((@app = program_data(lc($shell),lc($shell),1)) && $app[0]){
$shell = $app[0];
$client{'version'} = $app[1] if $app[1];
#print "app test $shell v: $client{'version'}\n";
@@ -19699,7 +19839,7 @@ sub get_shell_data {
if (test_shell($parent)){
$shell = $parent;
}
- elsif ((@app = main::program_data(lc($parent),lc($parent),0)) && $app[0]){
+ elsif ((@app = program_data(lc($parent),lc($parent),0)) && $app[0]){
$shell = $app[0];
$client{'version'} = $app[1] if $app[1];
}
@@ -19717,7 +19857,7 @@ sub get_shell_data {
$client{'name-print'} = $shell;
#print "shell4: $client{'name-print'} version: $client{'version'}\n";
if ($extra > 2 && $working && lc($shell) ne lc($working)){
- if (@app = main::program_data(lc($working))){
+ if (@app = program_data(lc($working))){
$client{'default-shell'} = $app[0];
$client{'default-shell-v'} = $app[1];
$client{'default-shell-v'} =~ s/(\(.*|-release|-version)// if $client{'default-shell-v'};
@@ -20579,7 +20719,7 @@ sub set_dmidecode_data {
# about random dmi type ordering in the data, which happens. Also sort
# by handle, as secondary sort.
@dmi = sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] } @dmi;
- main::log_data('dump','@dmi',\@dmi) if $b_log;
+ log_data('dump','@dmi',\@dmi) if $b_log;
print Dumper \@dmi if $test[2];
eval $end if $b_log;
}
@@ -20645,7 +20785,7 @@ sub set_ip_addr {
@temp = ($if,[@ips]);
@ifs = (@ifs,@temp);
}
- main::log_data('dump','@ifs',\@ifs) if $b_log;
+ log_data('dump','@ifs',\@ifs) if $b_log;
print Dumper \@ifs if $test[3];
eval $end if $b_log;
}
@@ -20746,8 +20886,8 @@ sub set_ifconfig {
}
print Dumper \@ifs if $test[3];
print Dumper \@ifs_bsd if $test[3];
- main::log_data('dump','@ifs',\@ifs) if $b_log;
- main::log_data('dump','@ifs_bsd',\@ifs_bsd) if $b_log;
+ log_data('dump','@ifs',\@ifs) if $b_log;
+ log_data('dump','@ifs_bsd',\@ifs_bsd) if $b_log;
eval $end if $b_log;
}
@@ -21383,7 +21523,7 @@ sub generate_lines {
if ($b_log){
# I don't think we need to see this, it's long, but leave in case we do
#main::log_data('dump','@ps_aux',\@ps_aux);
- main::log_data('dump','@ps_cmd',\@ps_cmd);
+ log_data('dump','@ps_cmd',\@ps_cmd);
}
if ( $show{'short'} ){
set_dmesg_boot_data() if ($bsd_type && !$b_dmesg_boot_check);
@@ -21540,6 +21680,7 @@ sub generate_short_data {
eval $start if $b_log;
my $num = 0;
my $kernel_os = ($bsd_type) ? 'OS' : 'Kernel';
+ get_shell_data($client{'ppid'}) if $client{'ppid'};
my $client = $client{'name-print'};
my $client_shell = ($b_irc) ? 'Client' : 'Shell';
if ($client{'version'}){
@@ -21583,14 +21724,14 @@ sub generate_short_data {
if (@disk){
$size = $disk[0]{'size'};
# must be > 0
- if ($disk[0]{'size'} && main::is_numeric($disk[0]{'size'}) ){
+ if ($disk[0]{'size'} && is_numeric($disk[0]{'size'}) ){
$size_holder = $disk[0]{'size'};
@temp = get_size($size);
$size = $temp[0];
$size_type = " $temp[1]";
}
$used = $disk[0]{'used'};
- if (main::is_numeric($disk[0]{'used'}) ){
+ if (is_numeric($disk[0]{'used'}) ){
$used_holder = $disk[0]{'used'};
@temp = get_size($used);
$used = $temp[0];
diff --git a/inxi.1 b/inxi.1
index 0964f22..8ae052f 100644
--- a/inxi.1
+++ b/inxi.1
@@ -1,4 +1,4 @@
-.TH INXI 1 "2020\-07\-26" inxi "inxi manual"
+.TH INXI 1 "2020\-08\-17" inxi "inxi manual"
.SH NAME
inxi \- Command line system information script for console and IRC
@@ -9,12 +9,13 @@ inxi \- Command line system information script for console and IRC
\fBinxi\fR [\fB\-AbBCdDfFGhijJIlmMnNopPrRsSuUVwzZ\fR]
\fBinxi\fR [\fB\-c NUMBER\fR] [\fB\-t\fR
+[\fB\-\-sensors\-exclude SENSORS\fR] [\fB\-\-sensors\-use SENSORS\fR]
[\fBc\fR|\fBm\fR|\fBcm\fR|\fBmc\fR][\fBNUMBER\fR]]
[\fB\-v NUMBER\fR] [\fB\-W LOCATION\fR]
[\fB\-\-weather\-unit\fR {\fBm\fR|\fBi\fR|\fBmi\fR|\fBim\fR}] [\fB\-y WIDTH\fR]
\fBinxi\fR [\fB\-\-memory\-modules\fR] [\fB\-\-memory\-short\fR]
-[\fB\-\-recommends\fR] [\fB\-\-slots\fR]
+[\fB\-\-recommends\fR] [\fB\-\-sensors\-default\fR] [\fB\-\-slots\fR]
\fBinxi\fB [\fB\-x\fR|\fB\-xx\fR|\fB\-xxx\fR|\fB\-a\fR] \fB\-OPTION(s)\fR
@@ -440,7 +441,9 @@ then shows what package(s) you need to install to add support for each feature.
Show output from sensors if sensors installed/configured: Motherboard/CPU/GPU
temperatures; detected fan speeds. GPU temperature when available. Nvidia shows
screen number for multiple screens. IPMI sensors are also used (root required)
-if present.
+if present. See Advanced options \fB\-\-sensors\-use\fR or
+\fB\-\-sensors\-exclude\fR if you want to use only a subset of all sensors, or
+exclude one.
.
.TP
.B \-\-slots\fR
@@ -1349,6 +1352,12 @@ This is an absolute override, the host will always show no matter what
other switches you use.
.TP
+.B \-\-html\-wan\fR
+Temporary override of \fBNO_HTML_WAN\fR configuration item. Only use to test w/wo
+HTML downloaders for WAN IP. Restores default behavior for WAN IP, which is use HTML
+downloader if present and if dig failed.
+
+.TP
.B \-\-indent\-min [integer]\fR
Overrides default indent minimum value. This is the value that makes inxi change from
wrapped line starters [like \fBInfo\fR] to non wrapped. If less than \fB80\fR,
@@ -1383,11 +1392,22 @@ This is an absolute override, the host will not show no matter what other
switches you use.
.TP
+.B \-\-no\-html-wan\fR
+Overrides use of HTML downloaders to get WAN IP address. Use either only dig, or
+do not get wan IP. Only use if dig is failing, and the HTML downloaders are taking
+too long, or are hanging or failing.
+Make permanent with \fBNO_HTML_WAN='true'\fR
+
+.TP
.B \-\-no\-man\fR
Disables man page install with \fB\-U\fR for master and active development branches.
(Only active if \fB\-U\fR is is not disabled by maintainers).
.TP
+.B \-\-no\-sensor\-force\fR
+Overrides user set \fBSENSOR_FORCE\fR configuration value. Restores default behavior.
+
+.TP
.B \-\-no\-ssl\fR
Skip SSL certificate checks for all downloader actions (\fB\-U\fR, \fB\-w\fR,
\fB\-W\fR, \fB\-i\fR). Use if your system does not have current SSL certificate
@@ -1442,6 +1462,43 @@ For distro package maintainers only, and only for non apt, rpm, or pacman based
To be used to test replacement package lists for recommends for that package manager.
.TP
+.B \-\-sensors\-default\fR
+Overrides configuration values \fBSENSORS_USE\fR or \fBSENSORS_EXCLUDE\fR
+on a one time basis.
+
+.TP
+.B \-\-sensors\-exclude\fR
+Similar to \fB\-\-sensors\-use\fR except removes listed sensors from sensor data.
+Make permanent with \fBSENSORS_EXCLUDE\fR configuration item. Note that gpu, network,
+disk, and other specific device monitor chips are excluded by default.
+
+Example: \fBinxi \-sxx \-\-sensors\-exclude k10temp-pci-00c3\fR
+
+.TP
+.B \-\-sensors\-use\fR
+Use only the (comma separated) sensor arrays for \fB\-s\fR output. Make permanent
+with \fBSENSORS_USE\fR configuration item. Sensor array ID value must be the exact
+value shown in lm-sensors sensors output (Linux/lm-sensors only). If you only want
+to exclude one (or more) sensors from the output, use \fB\-\-sensors\-exlude\fR.
+
+Can be useful if the default sensor data used by inxi is not from the right sensor
+array. Note that all other sensor data will be removed, which may lead to undesired
+consequences. Please be aware that this can lead to many undesirable side-effects,
+since default behavior is to use all the sensors arrays and select which values
+to use from them following a set sequence of rules. So if you force one to be used,
+you may lose data that was used from another one.
+
+Most likely best use is when one (or two) of the sensor arrays has all the sensor data
+you want, and you just want to make sure inxi doesn't use data from another array that
+has inacurate or misleading data.
+
+Note that gpu, network, disk, and other specific device monitor chips are excluded by
+default, and should not be added since they do not provide cpu, board, system, etc,
+sensor data.
+
+Example: \fBinxi \-sxx \-\-sensors\-use nct6791-isa-0290,k10temp-pci-00c3\fR
+
+.TP
.B \-\-sleep [0\-x.x]\fR
Usually in decimals. Change CPU sleep time for \fB\-C\fR (current: \fB\0.35\fR).
Sleep is used to let the system catch up and show a more accurate CPU use. Example:
@@ -1539,13 +1596,13 @@ other system data.
.TP
.B \-\-debug 21\fR
-Automatically uploads debugger data tar.gz file to \fIftp.techpatterns.com\fR,
+Automatically uploads debugger data tar.gz file to \fIftp.smxi.org\fR,
then removes the debug data directory, but leaves the debug tar.gz file.
See \fB\-\-ftp\fR for uploading to alternate locations.
.TP
.B \-\-debug 22\fR
-Automatically uploads debugger data tar.gz file to \fIftp.techpatterns.com\fR, then
+Automatically uploads debugger data tar.gz file to \fIftp.smxi.org\fR, then
removes the debug data directory and the tar.gz file.
See \fB\-\-ftp\fR for uploading to alternate locations.
@@ -1691,6 +1748,10 @@ to sys admins running servers with many IP addresses.
\fBNO_DIG\fR Set to \fB1\fR or \fBtrue\fR to disable WAN IP use of \fBdig\fR and force
use of alternate downloaders.
+\fBNO_HTML_WAN\fR Set to \fB1\fR or \fBtrue\fR to disable WAN IP use of \fBHTML Downloaders\fR and force
+use of dig only, or nothing if dig disabled as well. Same as \fB\-\-no\-html\-wan\fR. Only use if
+dig is failing, and HTML downloaders are hanging.
+
\fBNO_SUDO\fR Set to \fB1\fR or \fBtrue\fR to disable internal use of \fBsudo\fR.
\fBPARTITION_SORT\fR Overrides default partition output sort. See
@@ -1703,6 +1764,12 @@ use of alternate downloaders.
is the CPU), forces sensors to use either value 1 or 2 as CPU temperature. See the
above configuration page on smxi.org for full info.
+\fBSENSORS_EXCLUDE\fR Exclude supplied sensor array[s] from sensor output. Override with
+\fB\-\-sensors\-default\fR. See \fB\-\-sensors\-exclude\fR.
+
+\fBSENSORS_USE\fR Use only supplied sensor array[s]. Override with
+\fB\-\-sensors\-default\fR. See \fB\-\-sensors\-use\fR.
+
\fBSEP2_CONSOLE\fR Replaces default key / value separator of '\fB:\fR'.
\fBUSB_SYS\fR Forces all USB data to use \fB/sys\fR instead of \fBlsusb\fR.
@@ -1759,9 +1826,9 @@ out its report.
File an issue report:
.I https://github.com/smxi/inxi/issues
.TP
-.B Developer Forums
-Post on inxi developer forums:
-.I https://techpatterns.com/forums/forum\-32.html
+.B Forums
+Post on inxi forums:
+.I https://techpatterns.com/forums/forum\-33.html
.TP
.B IRC irc.oftc.net#smxi
You can also visit
diff --git a/inxi.changelog b/inxi.changelog
index 83b7cbe..33fd5d8 100644
--- a/inxi.changelog
+++ b/inxi.changelog
@@ -1,4 +1,125 @@
=====================================================================================
+Version: 3.1.06
+Patch: 00
+Date: 2020-08-16
+-----------------------------------
+Changes:
+-----------------------------------
+
+New features, new changes, new bug fixes!!! Excitement!!! Thrills!!!
+
+Bugs:
+1. Forgot to set get Shell logic in inxi short form, oops, so Shell remained blank,
+only inxi short, which I rarely use so I didn't notice.
+
+2. Failed to test pacman-g2 for packages, had wrong query argument, so it failed.
+Also failed to test for null data, so showed errors for packages as well. Both
+fixed.
+
+3. A big bug, subtle, and also at the same time, an enhancement, it turns out NVME
+drives do NOT follow the age old /proc/partitions logic where if the minor number is
+divisible by 16 or has remainder 8 when divided by 16, it's a primary drive, not
+a partition. nvme drives use a random numbering when > 1 nvme drives are present, and
+the old tests would fail for all nvme drivers more than the first one, which led
+to wrong disk size totals. Thanks gardotd426 who took the time to help figure this
+out in issue #223 - fix is to not do that test for nvme drives, or rather, to add
+a last fail test for nvme primary nvme[0-9]n[0-9] drive detections, not the minor
+number.
+
+Fixes:
+1. Corrected indentation for block sizes, children were not indented.
+
+2. Updated some older inxi-perl/docs pages, why not, once in a while?
+
+3. Kernel 5.8 introduces a changed syntax to gcc string location, this has been
+corrected, and the kernel gcc version now shows correctly for the previous
+syntax and the new one. Hopefully they do not change it again, sigh...
+
+4. Removed string 'hwmon' sensors from gpu, those are not gpu sensors, and
+are also usually not board/cpu sensors, but things like ath10, iwl, etc,
+network, or disk sensors, etc. In some cases hwmon sensor data would appear
+
+Enhancements:
+1. Big sensors refactor, now inxi supports two new sensors options:
+--sensors-exclude - which allows you to exclude any primary sensor type[s]. Note that
+in the refactored logic, and in the old logic, gpu sensors were already excluded.
+Now other hardware specific sensors like network are excluded as well.
+
+--sensors-use - use ONLY list of supplied sensor IDs, which have to match the
+syntax you see in lm-sensors sensors output.
+
+Both accept comma separated list of sensors, 1 or more, no spaces.
+
+The refactor however is more far reaching, now inxi stores and structures data
+not as a long line of sensors and data without differentiation, but by sensor array/chip
+ID, which is how the exclude and use features can work, and how granular default
+hardware sensor exclusions and uses can happen. This is now working in the gpu
+sensors, and will in the future be extended to the newer 5.7/5.8 kernel disk
+temperature sensors values, which will lead in some cases to being able to get
+sensors data for disks without root or hddtemp. This is a complicated bit of logic,
+and I don't have time to do it right now, but the data is now there and stored
+and possible to use in the future.
+
+To see sensors structures, use: inxi -s --dbg 18 and that will show the sensors data
+and its structures, which makes debugger a lot easier for new features.
+
+This issue was originally generated by what was in my view an invalid complaint
+about some inxi sensors defaults, which led me to look more closely at sensors
+logic, which is severely lacking. More work on sensors will happen in the future,
+time, health, and energy permitting.
+
+2. Added Watts, mem temp, for amdgpu sensors, as -sxxx option. More gpu sensor
+data will be added as new data samples show what will be available for the
+free modules like amdgpu, nouvean, and the intel graphics modules.
+
+3. More disk vendors and IDs, as noted, the list never ends, and it hasn't ended,
+so statement remains true. Thanks linux-lite hardware database.
+
+Changes:
+
+1. This has always bugged me since it was introduced, the primary cpu line starter
+Topology: which was only technically accurate for its direct value, not its children,
+and also, in -b, cpu short form was using the value as the key, which is a no-no,
+I'd been meaning to fix that too, but finally realized if I just make the primary
+CPU line key be 'Info:', which is short, yet non-ambiguous, it would solve both
+problems.
+To keep the -b cpu line as short as before, I removed the 'type:' and integraged
+that value into the primary Info: string:
+CPU:
+ Info: 6-Core AMD Ryzen 5 2600 [MT MCP] speed: 2750 MHz min/max: 1550/3400 MHz
+
+-b 3.1.05 and earlier:
+CPU:
+ 6-Core: AMD Ryzen 5 2600 type: MT MCP speed: 1515 MHz min/max: 1550/3400 MHz
+
+These resolve something that has irked me for quite a while, 'Topology:' didn't
+fit, it was too geeky, and worst, it only applied to the value directly following
+it, NOT to the rest of the CPU information. It also could not be shortened or
+abbreviated since then it would have made no actual sense, like topo:, and the
+same issue with value being used for key in -b, and wrong word for line starter
+in -C would have existed. Besides, someone might think I was trying to make a
+subtle reference to the great Jodorowsky film 'El Topo', which would be silly,
+because that's art, and this is just some system specs that are reasonably
+readable...
+
+2. Was using opendns for WAN dig IP address, but apparently cysco bought that
+company, and now I've noticed the old opendns dig queries were failing more and
+more, so replaced that with akamai dig requests.
+Also made the WAN IP fallback to HTTP IP method if dig failed. New option:
+--no-http-wan and config item NO_HTTP_WAN with override --http-wan added to
+let you switch off http wan IP requests if you want. Note that if dig fails,
+you will get no wan ip address.
+Updated/improved error messages to handle this more complex set of wan ip
+options, so hopefully the error alert message will in most cases be right.
+
+3. To future proof inxi, switched debugger upload location to ftp.smxi.org/incoming
+from the old techpatterns.com/incoming. Updated man/help to remove those urls too.
+
+
+-----------------------------------
+-- Harald Hope - Sun, 16 Aug 2020 14:28:58 -0700
+
+=====================================================================================
Version: 3.1.05
Patch: 00
Date: 2020-07-26