aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2019-08-15 00:52:13 -0400
committerLibravatarUnit 193 <unit193@ubuntu.com>2019-08-15 00:52:13 -0400
commit8b210a19d6537828afba4c77d30578c95746a1ab (patch)
tree8d890627cbf05708da1f094329d6304148e04c0f
parent48aa3f2efe213e6b1696dd971947dd2b2d3c44d9 (diff)
downloadinxi-8b210a19d6537828afba4c77d30578c95746a1ab.tar.bz2
inxi-8b210a19d6537828afba4c77d30578c95746a1ab.tar.xz
inxi-8b210a19d6537828afba4c77d30578c95746a1ab.tar.zst
New upstream version 3.0.36-1upstream/3.0.36-1upstream
-rwxr-xr-xinxi380
-rw-r--r--inxi.128
-rw-r--r--inxi.changelog83
3 files changed, 341 insertions, 150 deletions
diff --git a/inxi b/inxi
index de2c665..04c48e4 100755
--- a/inxi
+++ b/inxi
@@ -31,8 +31,8 @@ use POSIX qw(uname strftime ttyname);
## INXI INFO ##
my $self_name='inxi';
-my $self_version='3.0.35';
-my $self_date='2019-07-15';
+my $self_version='3.0.36';
+my $self_date='2019-08-14';
my $self_patch='00';
## END INXI INFO ##
@@ -3907,6 +3907,14 @@ sub get_options{
'm|memory' => sub {
$show{'short'} = 0;
$show{'ram'} = 1; },
+ 'memory-modules' => sub {
+ $show{'short'} = 0;
+ $show{'ram'} = 1;
+ $show{'ram-modules'} = 1;},
+ 'memory-short' => sub {
+ $show{'short'} = 0;
+ $show{'ram'} = 1;
+ $show{'ram-short'} = 1;},
'M|machine' => sub {
$show{'short'} = 0;
$show{'machine'} = 1; },
@@ -4502,6 +4510,9 @@ sub show_options {
devices (slots) supported and individual memory devices (sticks of memory etc).
For devices, shows device locator, size, speed, type (e.g. DDR3).
If neither -I nor -tm are selected, also shows RAM used/total." ],
+ ['1', '', '--memory-modules', "Memory (RAM) data. Exclude empty module slots." ],
+ ['1', '', '--memory-short', "Memory (RAM) data. Show only short Memory RAM report,
+ number of arrays, slots, modules, and RAM type." ],
['1', '-M', '--machine', "Machine data. Device type (desktop, server, laptop,
VM etc.), motherboard, BIOS and, if present, system builder (e.g. Lenovo).
Shows UEFI/BIOS/UEFI [Legacy]. Older systems/kernels without the required /sys
@@ -4600,7 +4611,7 @@ sub show_options {
['2', '-I', '', "Default system GCC. With -xx, also shows other installed
GCC versions. If running in shell, not in IRC client, shows shell version
number, if detected. Init/RC type and runlevel (if available)." ],
- ['2', '-m', '', "Max memory module size (if available), device type." ],
+ ['2', '-m,--memory-modules', '', "Max memory module size (if available), device type." ],
['2', '-N', '', "Specific vendor/product information (if relevant);
PCI Bus ID/USB ID number of card; Version/port(s)/driver version (if available)." ],
['2', '-R', '', "md-raid: second RAID Info line with extra data:
@@ -4633,7 +4644,7 @@ sub show_options {
['2', '-I', '', "Other detected installed gcc versions (if present). System
default runlevel. Adds parent program (or tty) for shell info if not in
IRC. Adds Init version number, RC (if found)." ],
- ['2', '-m', '', "Manufacturer, part number; single/double bank (if found)." ],
+ ['2', '-m,--memory-modules', '', "Manufacturer, part number; single/double bank (if found)." ],
['2', '-M', '', "Chassis info, BIOS ROM size (dmidecode only), if available." ],
['2', '-N', '', "Chip vendor:product ID." ],
['2', '-R', '', "md-raid: Superblock (if present), algorithm. If resync,
@@ -4662,7 +4673,7 @@ sub show_options {
['2', '-G', '', "Compositor version (if detectable)." ],
['2', '-I', '', "For 'Shell:' adds ([su|sudo|login]) to shell name if present;
for 'running in:' adds (SSH) if SSH session." ],
- ['2', '-m', '', "Width of memory bus, data and total (if present and greater
+ ['2', '-m,--memory-modules', '', "Width of memory bus, data and total (if present and greater
than data); Detail for Type, if present; module voltage, if available; serial
number." ],
['2', '-N', '', "Serial number." ],
@@ -5402,6 +5413,8 @@ sub pci_long_filter {
return $string;
}
+# Use sparingly, but when we need regex type stuff
+# stripped out for reliable string compares, it's better.
# sometimes the pattern comes from unknown strings
# which can contain regex characters, get rid of those
sub regex_cleaner {
@@ -5434,6 +5447,7 @@ sub row_defaults {
'display-root-x' => 'Advanced graphics data unavailable for root.',
'display-server' => "No display server data found. Headless machine?",
'glxinfo-missing' => "Unable to show advanced data. Required tool glxinfo missing.",
+ 'gl-empty' => 'Unset. Missing GL driver?',
'display-try' => 'Advanced graphics data unavailable in console. Try -G --display',
'dev' => 'Feature under development',
'dmesg-boot-permissions' => 'dmesg.boot permissions',
@@ -8746,24 +8760,25 @@ sub device_vendor {
# HM320II HM320II
['(SAMSUNG|^MCG[0-9]+GC|^MCC|^[GS]2 Portable|^DUO\b|^P3|^(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|ULTRA\sFIT|Clip Sport|Cruzer|^Extreme)','SanDisk','SanDisk',''],
+ ['(SanDisk|^SDS[S]?[DQ]|^SL([0-9]+)G|^AFGCE|^U3\b|ULTRA\sFIT|Clip Sport|Cruzer|^Extreme)','SanDisk','SanDisk',''],
['^STEC\b','^STEC\b','STEC',''], # ssd drive, must come before seagate ST test
# real, SSEAGATE Backup+; XP1600HE30002 | 024 HN (spinpoint)
['(^ST[^T]|[S]?SEAGATE|^X[AFP]|^5AS|^BUP|Expansion Desk|FreeAgent|GoFlex|Backup(\+|\s?Plus)\s?(Hub)?|OneTouch)','[S]?SEAGATE','Seagate',''],
- ['^(WD|WL[0]9]|Western Digital|My (Book|Passport)|\d*LPCX|Elements|M000|EARX|EFRX|\d*EAVS|0JD|JPVX|[0-9]+(BEV|(00)?AAK|AAV|AZL|EA[CD]S))','(^WDC|Western\s?Digital)','Western Digital',''],
+ ['^(WD|WL[0]9]|Western Digital|My (Book|Passport)|\d*LPCX|Elements|easystore|MD0|M000|EARX|EFRX|\d*EAVS|0JD|JPVX|[0-9]+(BEV|(00)?AAK|AAV|AZL|EA[CD]S))','(^WDC|Western\s?Digital)','Western Digital',''],
## Then better known ones ##
- ['^(A-DATA|ADATA|AXN|CH11|HV[1-9])','^(A-DATA|ADATA)','A-Data',''],
+ ['^(A-DATA|ADATA|AXN|CH11|HV[1-9]|IM2)','^(A-DATA|ADATA)','A-Data',''],
['^ADTRON','^(ADTRON)','Adtron',''],
['^ASUS','^ASUS','ASUS',''],
+ # ATCS05 can be hitachi travelstar but not sure
['^ATP','^ATP[\s\-]','ATP',''],
# Force MP500
['^(Corsair|Force\s|(Flash\s*)?Voyager)','^Corsair','Corsair',''],
- ['^(FUJITSU|MH[TVWYZ][0-9]|MP|MAP[0-9])','^FUJITSU','Fujitsu',''],
+ ['^(FUJITSU|MJA|MH[TVWYZ][0-9]|MP|MAP[0-9])','^FUJITSU','Fujitsu',''],
# note: 2012: wdc bought hgst
['^(HGST|Touro|5450)','^HGST','HGST (Hitachi)',''], # HGST HUA
['^(Hitachi|HD[ST]|DK[0-9]|IC|HT|HU)','^Hitachi','Hitachi',''],
# vb: VB0250EAVER but clashes with vbox; HP_SSD_S700_120G ;GB0500EAFYL GB starter too generic?
- ['^(HP\b|MB0|G[BJ]0|v[0-9]{3}[bgorw]$|x[0-9]{3}[w]$)','^HP','HP',''],
+ ['^(HP\b|MB[0-6]|G[BJ]0|v[0-9]{3}[bgorw]$|x[0-9]{3}[w]$)','^HP','HP',''],
['^(LSD|Lexar|JumpDrive|JD\s?Firefly)','^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',''],
@@ -8787,14 +8802,16 @@ sub device_vendor {
['^(APPLE|iPod)','^APPLE','Apple',''],
['^(AP|Apacer)','^Apacer','Apacer',''],
['^(A-?RAM|ARSSD)','^A-?RAM','A-RAM',''],
+ ['^Asgard','^Asgard','Asgard',''],
['^(ASM|2115)','^ASM','ASMedia',''],#asm1153e
['^Bell\b','^Bell','Packard Bell',''],
['^BHT','^BHT','BHT',''],
['^BIOSTAR','^BIOSTAR','Biostar',''],
['^BIWIN','^BIWIN','BIWIN',''],
['^BUFFALO','^BUFFALO','Buffalo',''],
+ ['^Bulldozer','^Bulldozer','Bulldozer',''],
['^Centerm','^Centerm','Centerm',''],
- ['^Centon','^Centon','Centonm',''],
+ ['^Centon','^Centon','Centon',''],
['^CHN\b','','Zheino',''],
['^Clover','^Clover','Clover',''],
['^Colorful\b','^Colorful','Colorful',''],
@@ -8808,9 +8825,10 @@ sub device_vendor {
['^Dogfish','^Dogfish','Dogfish',''],
['^DragonDiamond','^DragonDiamond','DragonDiamond',''],
['^DREVO\b','^DREVO','Drevo',''],
+ # DX1100 is probably sandisk, but could be HP, or it could be hp branded sandisk
['^(Eaget|V8$)','^Eaget','Eaget',''],
['^EDGE','^EDGE','EDGE',''],
- ['^Elecom','^ElecomE','Elecom',''],
+ ['^Elecom','^Elecom','Elecom',''],
['^EXCELSTOR','^EXCELSTOR( TECHNO(LOGY)?)?','ExcelStor',''],
['^EZLINK','^EZLINK','EZLINK',''],
['^Fantom','^Fantom( Drive[s]?)?','Fantom Drives',''],
@@ -8818,7 +8836,7 @@ sub device_vendor {
['^FASTDISK','^FASTDISK','FASTDISK',''],
# FK0032CAAZP/FB160C4081 FK or FV can be HP but can be other things
['^FORESEE','^FORESEE','Foresee',''],
- ['^GALAX\b','^GALAX','GALAX',''],
+ ['^(GALAX\b|Gamer\s?L)','^GALAX','GALAX',''],
['^Galaxy\b','^Galaxy','Galaxy',''],
['^(Garmin|Fenix)','^Garmin','Garmin',''],
['^Geil','^Geil','Geil',''],
@@ -8845,7 +8863,7 @@ sub device_vendor {
['^(Iomega|ZIP\b)','^Iomega','Iomega',''],
['^JingX','^JingX','JingX',''], #JingX 120G SSD - not confirmed, but guessing
# NOTE: ITY2 120GB hard to find
- ['^JMicron','^JMicron','JMicron',''], #JMicron H/W raid
+ ['^JMicron','^JMicron(\s?Tech(nology)?)?','JMicron Tech',''], #JMicron H/W raid
['^KingDian','^KingDian','KingDian',''],
['^Kingfast','^Kingfast','Kingfast',''],
['^KingMAX','^KingMAX','KingMAX',''],
@@ -8856,14 +8874,16 @@ sub device_vendor {
['^KLEVV','^KLEVV','KLEVV',''],
['^(Lacie|P92)','^Lacie','Lacie',''],
['^LDLC','^LDLC','LDLC',''],
- ['^Lenovo','^Lenovo','Lenovo',''],
+ # LENSE30512GMSP34MEAT3TA
+ ['^LEN','^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
['^(LITE[\-\s]?ON|PH[1-9])','^LITE[\-]?ON','LITE-ON',''], # PH6-CE240-L
['^M-Systems','^M-Systems','M-Systems',''],
+ ['^(Mach\s*Xtreme|MXSSD)','^Mach\s*Xtreme','Mach Xtreme',''],
['^(MAXTOR|Atlas|TM[0-9]{4})','^MAXTOR','Maxtor',''], # note M2 M3 is usually maxtor, but can be samsung
- ['^(Memorex|TravelDrive)','^Memorex','Memorex',''],
+ ['^(Memorex|TravelDrive|TD\s?Classic)','^Memorex','Memorex',''],
# note: C300/400 can be either micron or crucial, but C400 is M4 from crucial
['(^MT|^M5|^Micron|00-MT|C[34]00)','^Micron','Micron',''],# C400-MTFDDAK128MAM
['^MARSHAL\b','^MARSHAL','Marshal',''],
@@ -8871,10 +8891,10 @@ sub device_vendor {
['^MDT\b','^MDT','MDT (rebuilt WD/Seagate)',''], # mdt rebuilds wd/seagate hdd
['^Medion','^Medion','Medion',''],
['^(MEDIAMAX|WL[0-9]{2})','^MEDIAMAX','MediaMax',''],
+ ['^Monster\s?Digital','^Monster\s?Digital','Monster Digital',''],
['^Morebeck','^Morebeck','Morebeck',''],
['^Motorola','^Motorola','Motorola',''],
['^MTRON','^MTRON','MTRON',''],
- ['^MXSSD','^Mach\s*Xtreme','Mach Xtreme',''],
['^Netac','^Netac','Netac',''],
['^OOS[1-9]','','Utania',''],
['^OWC','^OWC\b','OWC',''],
@@ -8943,7 +8963,15 @@ sub device_vendor {
foreach my $row (@vendors){
if ($model =~ /$row->[0]/i || ($row->[3] && $serial && $serial =~ /$row->[3]/)){
$vendor = $row->[2];
- $model =~ s/$row->[1]//i if $row->[1] && lc($model) ne lc($row->[1]);
+ # Usually we want to assign N/A at output phase, maybe do this logic there?
+ if ($row->[1]){
+ if ($model !~ m/$row->[1]$/i){
+ $model =~ s/$row->[1]//i;
+ }
+ else {
+ $model = 'N/A';
+ }
+ }
$model =~ s/^[\s\-_]+|[\s\-_]+$//g;
$model =~ s/\s\s/ /g;
@data = ($vendor,$model);
@@ -8954,6 +8982,7 @@ sub device_vendor {
return @data;
}
# Normally hddtemp requires root, but you can set user rights in /etc/sudoers.
+
# args: $1 - /dev/<disk> to be tested for
sub hdd_temp {
eval $start if $b_log;
@@ -9215,6 +9244,8 @@ sub display_data(){
# note: these may not always be set, they won't be out of X, for example
$protocol = $ENV{'XDG_SESSION_TYPE'} if $ENV{'XDG_SESSION_TYPE'};
$protocol = $ENV{'WAYLAND_DISPLAY'} if (!$protocol && $ENV{'WAYLAND_DISPLAY'});
+ # yes, I've seen this in 2019 distros, sigh
+ $protocol = '' if $protocol eq 'tty';
# need to confirm that there's a point to this test, I believe no, fails out of x
# loginctl also results in the session id
if (!$protocol && $b_display && $b_force_display){
@@ -9293,16 +9324,24 @@ sub display_data(){
my $ref = $graphics{'dimensions'};
if (defined $ref){
my @screens = @$ref;
+ my $resolution;
if (scalar @screens == 1){
if (my $program = main::check_program('xrandr')){
+ my $counter = 0;
my @xrandr = main::grabber("$program $display_opt 2>/dev/null",'','strip');
foreach (@xrandr){
+ $counter++;
+ if (/^[^\s]+\sconnected\s(primary\s)?([0-9]+)\s*x\s*([0-9]+)\+/){
+ $resolution = $2 . 'x' . $3 if $2 && $3;
+ }
my @working = split /\s+/,$_;
# print join "$_\n";
if ($working[1] =~ /\*/){
$working[1] =~ s/\*|\+//g;
$working[1] = sprintf("%.0f",$working[1]);
$working[1] = ($working[1]) ? "$working[1]Hz" : 'N/A';
+ # case where 0 is 'preferred, sigh.
+ $working[0] = ($working[0] !~ /[0-9]\s*x\s*[0-9]/ && $resolution) ? $resolution : $working[0];
my $screen = "$working[0]~$working[1]";
if ($graphics{'screens'}){
$graphics{'screens'} = ([@{$graphics{'screens'}},$screen]);
@@ -9411,8 +9450,10 @@ sub gl_data(){
#print ("$b_display : $b_root\n");
if ( $b_display){
if (my $program = main::check_program('glxinfo')){
- # NOTE: glxinfo -B is not always available, unforunately
+ # NOTE: glxinfo -B is not always available, unfortunately
my @glxinfo = main::grabber("$program $display_opt 2>/dev/null");
+ #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/graphics/glxinfo/glxinfo-ssh-centos.txt";
+ #my @glxinfo = main::reader($file);
if (!@glxinfo){
my $type = 'display-console';
if ($b_root){
@@ -9428,41 +9469,60 @@ sub gl_data(){
}
#print join "\n",@glxinfo,"\n";
my $compat_version = '';
- my ($b_compat,@core_profile_version,@direct_render,@renderer,@opengl_version,@working);
+ my ($b_compat,$b_nogl,@core_profile_version,@direct_render,@renderer,
+ @opengl_version,@working);
foreach (@glxinfo){
next if /^\s/;
if (/^opengl renderer/i){
@working = split /:\s*/, $_;
- $working[1] = main::cleaner($working[1]);
- # Allow all mesas
- #if ($working[1] =~ /mesa/i){
- #
- #}
+ if ($working[1]){
+ $working[1] = main::cleaner($working[1]);
+ # Allow all mesas
+ #if ($working[1] =~ /mesa/i){
+ #
+ #}
+ }
+ # note: there are cases where gl drivers are missing and empty
+ # field value occurs.
+ else {
+ $b_nogl = 1;
+ $working[1] = main::row_defaults('gl-empty');
+ }
push @renderer, $working[1];
}
# dropping all conditions from this test to just show full mesa information
# there is a user case where not f and mesa apply, atom mobo
# /opengl version/ && ( f || $2 !~ /mesa/ ) {
elsif (/^opengl version/i){
- # fglrx started appearing with this extra string, does not appear
- # to communicate anything of value
@working = split /:\s*/, $_;
- $working[1] =~ s/(Compatibility Profile Context|\(Compatibility Profile\))//;
- $working[1] =~ s/\s\s/ /g;
- $working[1] =~ s/^\s+|\s+$//;
- push @opengl_version, $working[1];
- # note: this is going to be off if ever multi opengl versions appear, never seen one
- @working = split /\s+/, $working[1];
- $compat_version = $working[0];
+ if ($working[1]){
+ # fglrx started appearing with this extra string, does not appear
+ # to communicate anything of value
+ $working[1] =~ s/(Compatibility Profile Context|\(Compatibility Profile\))//;
+ $working[1] =~ s/\s\s/ /g;
+ $working[1] =~ s/^\s+|\s+$//;
+ push @opengl_version, $working[1];
+ # note: this is going to be off if ever multi opengl versions appear,
+ # never seen one
+ @working = split /\s+/, $working[1];
+ $compat_version = $working[0];
+ }
+ elsif (!$b_nogl) {
+ push @opengl_version, main::row_defaults('gl-empty');
+ }
}
elsif (/^opengl core profile version/i){
- # fglrx started appearing with this extra string, does not appear
- # to communicate anything of value
@working = split /:\s*/, $_;
- $working[1] =~ s/(Compatibility Profile Context|\((Compatibility|Core) Profile\))//;
- $working[1] =~ s/\s\s/ /g;
- $working[1] =~ s/^\s+|\s+$//;
- push @core_profile_version, $working[1];
+ # note: no need to apply empty message here since we don't have the data
+ # anyway
+ if ($working[1]){
+ # fglrx started appearing with this extra string, does not appear
+ # to communicate anything of value
+ $working[1] =~ s/(Compatibility Profile Context|\((Compatibility|Core) Profile\))//;
+ $working[1] =~ s/\s\s/ /g;
+ $working[1] =~ s/^\s+|\s+$//;
+ push @core_profile_version, $working[1];
+ }
}
elsif (/direct rendering/){
@working = split /:\s*/, $_;
@@ -9487,10 +9547,9 @@ sub gl_data(){
$renderer = join ', ', @renderer if @renderer;
@row = ({
main::key($num++,'OpenGL') => '',
- main::key($num++,'renderer') => $renderer,
- main::key($num++,'v') => $version,
+ main::key($num++,'renderer') => ($renderer) ? $renderer : 'N/A',
+ main::key($num++,'v') => ($version) ? $version : 'N/A',
});
-
if ($b_compat && $extra > 1 && $compat_version){
$row[0]{main::key($num++,'compat-v')} = $compat_version;
}
@@ -9562,7 +9621,8 @@ sub x_drivers {
neomagic newport nouveau nsc nvidia nv openchrome r128 radeonhd radeon
rendition s3virge s3 savage siliconmotion sisimedia sisusb sis
sunbw2 suncg14 suncg3 suncg6 sunffb sunleo suntcx
- tdfx tga trident tseng unichrome v4l vboxvideo vesa vga via vmware voodoo);
+ tdfx tga trident tseng unichrome v4l vboxvideo vesa vga via vmware vmwgfx
+ voodoo);
# it's much cheaper to grab the simple pattern match then do the expensive one
# in the main loop.
#@xorg = grep {/Failed|Unload|Loading/} @xorg;
@@ -10071,7 +10131,7 @@ sub machine_data_soc {
$model = main::dmi_cleaner($model);
$model = (split /\x01|\x02|\x03|\x00/, $model)[0] if $model;
my $device_temp = main::regex_cleaner($soc_machine{'device'});
- if ( !$soc_machine{'device'} || ($model && $model !~ /$device_temp/i) ){
+ if ( !$soc_machine{'device'} || ($model && $model !~ /\Q$device_temp\E/i) ){
$model = main::arm_cleaner($model);
$soc_machine{'model'} = $model;
}
@@ -12783,30 +12843,37 @@ sub create_output {
my $num = 0;
my $j = 0;
my (@data,@rows,$b_non_system);
+ my ($arrays,$modules,$slots,$type_holder) = (0,0,0,'');
foreach (@ram){
$j = scalar @rows;
my %ref = %$_;
- $b_non_system = ($ref{'use'} && lc($ref{'use'}) ne 'system memory') ? 1:0 ;
- $num = 1;
- @data = ({
- main::key($num++,'Array') => '',
- main::key($num++,'capacity') => process_size($ref{'capacity'}),
- });
- @rows = (@rows,@data);
- if ($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'};
- $ref{'eec'} ||= 'N/A';
- $rows[$j]{main::key($num++,'EC')} = $ref{'eec'};
- 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'});
- if ($ref{'mod-qualifier'}){
- $rows[$j]{main::key($num++,'note')} = $ref{'mod-qualifier'};
+ if (!$show{'ram-short'}){
+ $b_non_system = ($ref{'use'} && lc($ref{'use'}) ne 'system memory') ? 1:0 ;
+ $num = 1;
+ @data = ({
+ main::key($num++,'Array') => '',
+ main::key($num++,'capacity') => process_size($ref{'capacity'}),
+ });
+ @rows = (@rows,@data);
+ if ($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'};
+ $ref{'eec'} ||= 'N/A';
+ $rows[$j]{main::key($num++,'EC')} = $ref{'eec'};
+ 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'});
+ if ($ref{'mod-qualifier'}){
+ $rows[$j]{main::key($num++,'note')} = $ref{'mod-qualifier'};
+ }
}
}
+ else {
+ $slots += $ref{'slots'} if $ref{'slots'};
+ $arrays++;
+ }
foreach my $ref2 ($ref{'modules'}){
next if ref $ref2 ne 'ARRAY';
my @modules = @$ref2;
@@ -12817,6 +12884,12 @@ sub create_output {
# multi array setups will start index at next from previous array
next if ref $ref3 ne 'HASH';
my %mod = %$ref3;
+ if ($show{'ram-short'}){
+ $modules++ if ($mod{'size'} =~ /^\d/);
+ $type_holder = $mod{'device-type'} if $mod{'device-type'};
+ next;
+ }
+ next if ($show{'ram-modules'} && $mod{'size'} =~ /\D/);
$mod{'locator'} ||= 'N/A';
@data = ({
main::key($num++,'Device') => $mod{'locator'},
@@ -12855,6 +12928,18 @@ sub create_output {
}
}
}
+ if ($show{'ram-short'}){
+ $num = 1;
+ $type_holder ||= 'N/A';
+ @data = ({
+ main::key($num++,'Report') => '',
+ main::key($num++,'arrays') => $arrays,
+ main::key($num++,'slots') => $slots,
+ main::key($num++,'modules') => $modules,
+ main::key($num++,'type') => $type_holder,
+ });
+ @rows = (@rows,@data);
+ }
eval $end if $b_log;
return @rows;
}
@@ -13445,11 +13530,11 @@ sub get_repos_linux {
}
}
if (@apt_urls){
- $key = repo_builder('active','apt');
+ $key = repo_data('active','apt');
@apt_urls = url_cleaner(@apt_urls);
}
else {
- $key = repo_builder('missing','apt');
+ $key = repo_data('missing','apt');
}
@data = (
{main::key($num++,$key) => $file},
@@ -13497,7 +13582,7 @@ sub get_repos_linux {
}
if (!@rows){
@data = (
- {main::key($num++,repo_builder('missing','no-files')) => $pacman },
+ {main::key($num++,repo_data('missing','files')) => $pacman },
);
@rows = (@rows,@data);
}
@@ -13540,11 +13625,11 @@ sub get_repos_linux {
}
}
if (! @content){
- $key = repo_builder('missing','slackpkg+');
+ $key = repo_data('missing','slackpkg+');
}
else {
@content = url_cleaner(@content);
- $key = repo_builder('active','slackpkg+');
+ $key = repo_data('active','slackpkg+');
}
@data = (
{main::key($num++,$key) => $slackpkg_plus},
@@ -13612,11 +13697,11 @@ sub get_repos_linux {
push @content, "$title ~ $url";
}
if (! @content){
- $key = repo_builder('missing',$repo);
+ $key = repo_data('missing',$repo);
}
else {
@content = url_cleaner(@content);
- $key = repo_builder('active',$repo);
+ $key = repo_data('active',$repo);
}
@data = (
{main::key($num++,$key) => $_},
@@ -13676,11 +13761,11 @@ sub get_repos_linux {
push @content, "$title ~ $url";
}
if (! @content){
- $key = repo_builder('missing','portage');
+ $key = repo_data('missing','portage');
}
else {
@content = url_cleaner(@content);
- $key = repo_builder('active','portage');
+ $key = repo_data('active','portage');
}
@data = (
{main::key($num++,$key) => $_},
@@ -13707,11 +13792,11 @@ sub get_repos_linux {
}
}
if (! @content){
- $key = repo_builder('missing','cards');
+ $key = repo_data('missing','cards');
}
else {
@content = url_cleaner(@content);
- $key = repo_builder('active','cards');
+ $key = repo_data('active','cards');
}
@data = (
{main::key($num++,$key) => $cards},
@@ -13810,7 +13895,7 @@ sub get_repos_linux {
}
if ($repo && @content){
@content = url_cleaner(@content);
- $key = repo_builder('active',$which);
+ $key = repo_data('active',$which);
@data = (
{main::key($num++,$key) => $repo},
[@content],
@@ -13823,7 +13908,7 @@ sub get_repos_linux {
# last one if present
if ($repo && @content){
@content = url_cleaner(@content);
- $key = repo_builder('active',$which);
+ $key = repo_data('active',$which);
@data = (
{main::key($num++,$key) => $repo},
[@content],
@@ -13891,11 +13976,11 @@ sub get_repos_bsd {
}
}
if (! @data3){
- $key = repo_builder('missing','bsd-package');
+ $key = repo_data('missing','bsd-package');
}
else {
@data3 = url_cleaner(@data3);
- $key = repo_builder('active','bsd-package');
+ $key = repo_data('active','bsd-package');
}
@data = (
{main::key($num++,$key) => $_},
@@ -13926,16 +14011,16 @@ sub get_repos_bsd {
# mesage in that case
if (!@rows){
if ($bsd_type eq 'freebsd'){
- $key = repo_builder('missing','freebsd-nf');
+ $key = repo_data('missing','freebsd-files');
}
elsif ($bsd_type eq 'openbsd'){
- $key = repo_builder('missing','openbsd-nf');
+ $key = repo_data('missing','openbsd-files');
}
elsif ($bsd_type eq 'netbsd'){
- $key = repo_builder('missing','netbsd-nf');
+ $key = repo_data('missing','netbsd-files');
}
else {
- $key = repo_builder('missing','bsd-nf');
+ $key = repo_data('missing','bsd-files');
}
@data = (
{main::key($num++,'Message') => $key},
@@ -13946,65 +14031,65 @@ sub get_repos_bsd {
eval $start if $b_log;
return @rows;
}
-sub repo_builder {
+sub repo_data {
eval $start if $b_log;
- my ($file,$type,$search,$split,$count) = @_;
- my (@content,@data,$missing,$key);
- my %unfound = (
- 'apk' => 'No active APK repos in',
- 'apt' => 'No active apt repos in',
- 'bsd-package' => 'No enabled BSD pkg servers in',
- 'bsd-nf' => 'No BSD pkg server files found',
- 'cards' => 'No active CARDS collections in',
- 'eopkg' => 'No active eopkg repos found',
- 'pacman' => 'No active pacman repos in',
- 'pacman-g2' => 'No active pacman-g2 repos in',
- 'pisi' => 'No active pisi repos found',
- 'portage' => 'No enabled portage sources in',
- 'portsnap' => 'No ports servers in',
- 'freebsd' => 'No FreeBSD update servers in',
- 'freebsd-nf' => 'No FreeBSD update server files found',
- 'freebsd-pkg' => 'No FreeBSD default pkg server in',
- 'openbsd' => 'No OpenBSD pkg mirrors in',
- 'openbsd-nf' => 'No OpenBSD pkg mirror files found',
- 'netbsd' => 'No NetBSD pkg servers in',
- 'netbsd-nf' => 'No NetBSD pkg server files found',
- 'no-files' => 'No repo files found in',
- 'slackpkg' => 'No active slackpkg repos in',
- 'slackpkg+' => 'No active slackpkg+ repos in',
- 'slaptget' => 'No active slapt-get repos in',
- 'tce' => 'No tce mirrors in',
- 'xbps' => 'No active xbps repos in',
- 'yum' => 'No active yum repos in',
- 'zypp' => 'No active zypp repos in',
- );
- $missing = $unfound{$type};
- return $missing if $file eq 'missing';
+ my ($status,$type) = @_;
my %keys = (
- 'apk' => 'APK repo',
- 'apt' => 'Active apt repos in',
- 'bsd-package' => 'BSD enabled pkg servers in',
- 'cards' => 'Active CARDS collections in',
- 'eopkg' => 'Active eopkg repo',
- 'freebsd' => 'FreeBSD update server',
- 'freebsd-pkg' => 'FreeBSD default pkg server',
- 'pacman' => 'Active pacman repo servers in',
- 'pacman-g2' => 'Active pacman-g2 repo servers in',
- 'pisi' => 'Active pisi repo',
- 'portage' => 'Enabled portage sources in',
- 'portsnap' => 'BSD ports server',
- 'openbsd' => 'OpenBSD pkg mirror',
- 'netbsd' => 'NetBSD pkg servers',
- 'slackpkg' => 'slackpkg repos in',
- 'slackpkg+' => 'slackpkg+ repos in',
- 'slaptget' => 'slapt-get repos in',
- 'tce' => 'tce mirrors in',
- 'xbps' => 'Active xbps repos in',
- 'yum' => 'Active yum repos in',
- 'zypp' => 'Active zypp repos in',
+ 'apk-active' => 'APK repo',
+ 'apk-missing' => 'No active APK repos in',
+ 'apt-active' => 'Active apt repos in',
+ 'apt-missing' => 'No active apt repos in',
+ 'bsd-files-missing' => 'No BSD pkg server files found',
+ 'bsd-package-active' => 'BSD enabled pkg servers in',
+ 'bsd-package-missing' => 'No enabled BSD pkg servers in',
+ 'cards-active' => 'Active CARDS collections in',
+ 'cards-missing' => 'No active CARDS collections in',
+ 'eopkg-active' => 'Active eopkg repo',
+ 'eopkg-missing' => 'No active eopkg repos found',
+ 'files-missing' => 'No repo files found in',
+ 'freebsd-active' => 'FreeBSD update server',
+ 'freebsd-files-missing' => 'No FreeBSD update server files found',
+ 'freebsd-missing' => 'No FreeBSD update servers in',
+ 'freebsd-pkg-active' => 'FreeBSD default pkg server',
+ 'freebsd-pkg-missing' => 'No FreeBSD default pkg server in',
+ 'netbsd-active' => 'NetBSD pkg servers',
+ 'netbsd-files-missing' => 'No NetBSD pkg server files found',
+ 'netbsd-missing' => 'No NetBSD pkg servers in',
+ 'openbsd-active' => 'OpenBSD pkg mirror',
+ 'openbsd-files-missing' => 'No OpenBSD pkg mirror files found',
+ 'openbsd-missing' => 'No OpenBSD pkg mirrors in',
+ 'pacman-active' => 'Active pacman repo servers in',
+ 'pacman-missing' => 'No active pacman repos in',
+ 'pacman-g2-active' => 'Active pacman-g2 repo servers in',
+ 'pacman-g2-missing' => 'No active pacman-g2 repos in',
+ 'pisi-active' => 'Active pisi repo',
+ 'pisi-missing' => 'No active pisi repos found',
+ 'portage-active' => 'Enabled portage sources in',
+ 'portage-missing' => 'No enabled portage sources in',
+ 'portsnap-active' => 'BSD ports server',
+ 'portsnap-missing' => 'No ports servers in',
+ 'slackpkg-active' => 'slackpkg repos in',
+ 'slackpkg-missing' => 'No active slackpkg repos in',
+ 'slackpkg+-active' => 'slackpkg+ repos in',
+ 'slackpkg+-missing' => 'No active slackpkg+ repos in',
+ 'slaptget-active' => 'slapt-get repos in',
+ 'slaptget-missing' => 'No active slapt-get repos in',
+ 'tce-active' => 'tce mirrors in',
+ 'tce-missing' => 'No tce mirrors in',
+ 'xbps-active' => 'Active xbps repos in',
+ 'xbps-missing' => 'No active xbps repos in',
+ 'yum-active' => 'Active yum repos in',
+ 'yum-missing' => 'No active yum repos in',
+ 'zypp-active' => 'Active zypp repos in',
+ 'zypp-missing' => 'No active zypp repos in',
);
- $key = $keys{$type};
- return $key if $file eq 'active';
+ eval $end if $b_log;
+ return $keys{$type . '-' . $status};
+}
+sub repo_builder {
+ eval $start if $b_log;
+ my ($file,$type,$search,$split,$count) = @_;
+ my (@content,@data,$key);
push @dbg_files, $file if $debugger_dir;
if (-r $file){
@content = main::reader($file);
@@ -14018,9 +14103,10 @@ sub repo_builder {
} @content;
}
if (!@content){
- $key = $missing;
+ $key = repo_data('missing',$type);
}
else {
+ $key = repo_data('active',$type);
@content = url_cleaner(@content);
}
@data = (
@@ -16477,6 +16563,8 @@ sub get_ps_de_data {
['windowlab','windowlab','windowlab','windowlab'],
['wmx','wmx','wmx','wmx'],
['xmonad','xmonad','xmonad','xmonad'],
+ ## fallback for xfce in case no xprop
+ ['xfdesktop','xfdesktop','xfdesktop','xfdesktop'],
);
foreach my $item (@desktops){
# no need to use check program with short list of ps_gui
@@ -16485,6 +16573,11 @@ sub get_ps_de_data {
@data = main::program_data($item->[2],$item->[3],0);
$desktop[0] = $data[0];
$desktop[1] = $data[1];
+ if ($extra > 1 && $item->[0] eq 'xfdesktop'){
+ @version_data = main::program_data('xfdesktop-toolkit',$item->[0],1);
+ $desktop[2] = $version_data[0] if $version_data[0];
+ $desktop[3] = $version_data[1] if $version_data[1];
+ }
last;
}
}
@@ -17692,6 +17785,7 @@ sub get_pci_vendor {
return if !$subsystem;
my ($vendor,$sep,$temp) = ('','','');
# get rid of any [({ type characters that will make regex fail
+ # and similar matches show as non-match
$subsystem = regex_cleaner($subsystem);
my @data = split /\s+/, $subsystem;
# when using strings in patterns for regex have to escape them
@@ -18133,9 +18227,10 @@ sub pciconf_data {
$vendor = main::cleaner($vendor);
$device = main::cleaner($device);
# handle possible regex in device name, like [ConnectX-3]
+ # and which could make matches fail
my $device_temp = main::regex_cleaner($device);
if ($vendor && $device){
- if (main::regex_cleaner($vendor) !~ /$device_temp/i){
+ if (main::regex_cleaner($vendor) !~ /\Q$device_temp\E/i){
$device = "$vendor $device";
}
}
@@ -18864,7 +18959,8 @@ sub set_ps_gui {
dwm fluxbox flwm flwm_topside fvwm.*-crystal fvwm2 fvwm i3 ion jwm lwm
matchbox-window-manager mwm nawm openbox notion orbital pekwm perceptia
qtile ratpoison sawfish scrotwm spectrwm sway tvtwm twm
- waycooler way-cooler windowlab WindowMaker wm2 wmii2 wmii wmx xmonad);
+ waycooler way-cooler windowlab WindowMaker wm2 wmii2 wmii wmx
+ xfdesktop xmonad);
@match = (@match,@temp);
}
# wm:
diff --git a/inxi.1 b/inxi.1
index 3896091..344cc42 100644
--- a/inxi.1
+++ b/inxi.1
@@ -1,4 +1,4 @@
-.TH INXI 1 "2019\-07\-15" inxi "inxi manual"
+.TH INXI 1 "2019\-08\-14" inxi "inxi manual"
.SH NAME
inxi \- Command line system information script for console and IRC
.SH SYNOPSIS
@@ -6,11 +6,12 @@ inxi \- Command line system information script for console and IRC
\fBinxi\fR [\fB\-AbBCdDfFGhiIlmMnNopPrRsSuUVwzZ\fR]
-\fBinxi\fR [\fB\-c NUMBER\fR] [\fB\-t\fR [\fBc\fR|\fBm\fR|\fBcm\fR|\fBmc\fR]
-[\fBNUMBER\fR]] [\fB\-v NUMBER\fR] [\fB\-W LOCATION\fR]
+\fBinxi\fR [\fB\-c NUMBER\fR] [\fB\-t\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\-\-recommends\fR] \fR[\fB\-\-slots\fR] \fR[\fB\-\-usb\fR]
+\fBinxi\fR [\fB\-\-memory\-modules\fR] [\fB\-\-memory\-short\fR]
+[\fB\-\-recommends\fR] [\fB\-\-slots\fR] [\fB\-\-usb\fR]
\fBinxi\fB [\fB\-x\fR|\fB\-xx\fR|\fB\-xxx\fR|\fB\-a\fR|\fB\-\-admin\fR] \fB\-OPTION(s)\fR
@@ -238,6 +239,17 @@ can do to get truly reliable data about the system RAM; maybe one day the kernel
will put this data into \fB/sys\fR, and make it real data, taken from the actual system,
not dmi data. For most people, the data will be right, but a significant percentage of
users will have either a wrong max module size, if present, or max capacity.
+
+See \fB\-\-memory\-modules\fR and \fB\-\-memory\-short\fR if you want a shorter report.
+.TP
+.B \-\-memory\-modules\fR
+Memory (RAM) data. Show only RAM arrays and modules in Memory report.
+Skip empty slots. See \fB\-m\fR.
+.TP
+.B \-\-memory\-short\fR
+Memory (RAM) data. Show a one line RAM report in Memory, e.g.
+\fBReport: arrays: 1 slots: 4 modules: 2 type: DDR4\fR
+See \fB\-m\fR.
.TP
.B \-M\fR,\fB \-\-machine\fR
Show machine data. Device, Motherboard, BIOS, and if present, System Builder (Like Lenovo).
@@ -622,7 +634,7 @@ versions.
\- If in shell (i.e. not in IRC client), adds shell version number, if available.
.TP
-.B \-x \-m\fR
+.B \-x \-m\fR, \fB\-\-memory\-modules\fR
\- If present, adds maximum memory module/device size in the Array line.
Only some systems will have this data available. Shows estimate if it can
generate one.
@@ -729,7 +741,7 @@ type defaults.
\- Adds parent program (or tty) that started shell, if not IRC client.
.TP
-.B \-xx \-m\fR
+.B \-xx \-m\fR, \fB\-\-memory\-modules\fR
\- Adds memory device Manufacturer.
\- Adds memory device Part Number (\fBpart\-no:\fR). Useful for ordering new or
@@ -818,7 +830,7 @@ no data will show.
\- For \fBrunning in:\fR adds \fB(SSH)\fR to parent, if present. SSH detection
uses the \fBwho am i\fR test.
.TP
-.B \-xxx \-m\fR
+.B \-xxx \-m\fR, \fB\-\-memory\-modules\fR
\- Adds memory bus width: primary bus width, and if present, total width. e.g.
\fBbus width: 64 bit (total: 72 bits)\fR. Note that total / data widths are mixed up
sometimes in dmidecode output, so inxi will take the larger value as the total if
diff --git a/inxi.changelog b/inxi.changelog
index a602bf9..b76d11e 100644
--- a/inxi.changelog
+++ b/inxi.changelog
@@ -1,4 +1,87 @@
=====================================================================================
+Version: 3.0.36
+Patch: 00
+Date: 2019-08-14
+-----------------------------------
+Changes:
+-----------------------------------
+New version, many small fixes. And a hall of shame, LOL.
+
+Bugs:
+1. Issue #188 exposed a situation in glxinfo where the required opengl fields are
+present but contain null data. This happens when a system does not have the required
+opengl drivers, which was the case here. inxi failed to handle that. Thanks
+LinuxMonger for posting the required data to figure this corner case out.
+
+2. Fixed a long time bug in Disk vendor ID, there was an eq (string equals)
+where it was supposed to use regex pattern match. Oops. Would have led to
+disk vendor id failures in several cases.
+
+Fixes:
+1. help, man updates for RAM/Memory data, more clarifications.
+
+2. Refactored RepoData class/package, to make it easier to handle repo string
+data, and make it all overall cleaner internally, and enable future extensions
+to certain features in inxi that may or may not one day become active.
+
+3. Added to some regex compares \Q$VAR\E to disable regex characters in strings.
+I should have used that a long time ago, oh well, better late than never!
+
+4. Found a horrible case were xdpyinfo uses 'preferred' instead of the actual
+pixel dimensions, shame on whoever allowed that output!!! shame! Had to add
+a workaround to make sure numeric values are present, if not, then use the
+fallback, which means, 2x more data parsing to get data that should not
+require that, but in this example, it did (an Arch derivative, but it could
+be xdpyinfo itself, don't know).
+
+Enhancements:
+1. More fixes on issue #185. Thanks tubecleaner for finding and provding required
+data to really solve a set of RAM issues that apply particularly in production
+systems. This issue report led to 2 new options: --memory-short, which only
+shows a basic RAM report.
+
+Memory: RAM: total: 31.43 GiB used: 14.98 GiB (47.7%)
+ Report: arrays: 1 slots: 4 modules: 2 type: DDR4
+
+And a 2nd, --memory-modules, only shows the occupied slots. This can be
+useful in situations where it's a server or vm with a lot of slots, most empty:
+
+Memory: RAM: total: 31.43 GiB used: 15.44 GiB (49.1%)
+ Array-1: capacity: 256 GiB slots: 4 EC: None
+ Device-1: DIMM 1 size: 16 GiB speed: 2400 MT/s
+ Device-2: DIMM 1 size: 16 GiB speed: 2400 MT/s
+
+Note that both of these options trigger -m, so -m itself is not required.
+
+2. More disk vendors!! The list never ends! Thanks linux-lite hardware database
+and users for supplying, and buying/obtaining, apparently every disk known to
+mankind.
+
+3. Added fallback XFCE detection, in cases were the system does not have xprop
+installed, it's still possible to do a full detection of xfce, including toolkit,
+so now inxi does that, one less dependency to detect one more desktop.
+
+4. Added vmwgfx driver to xorg drivers list. Note, I've never actually seen this
+in the wild, but I did see it as the kernel reported driver from lspci, so it
+may exist.
+
+Unfixed:
+1. Issue #187 EnochTheWise (?) did not supply the required debugger data so there
+is a RAID ZFS issue that will not get fixed until the required debugger data is
+supplied. Please do not waste all our time filing an issue if you have no
+intention of actually following through so we can get it fixed.
+
+Note that a key way we get issues here is from Perl errors on the screen, which are
+a frequent cause of someone realizing something is wrong. This is why I'm not going
+to do a hack fix for the RAID ZFS issue, then the error messages will go away, and
+it will likely never get handled. For examples of good, useful, productive issue
+reports, and how to do them right: #188 and #185, both of which led to good
+improvements in how inxi handles corner cases in those areas.
+
+-----------------------------------
+-- Harald Hope - Wed, 14 Aug 2019 10:47:47 -0700
+
+=====================================================================================
Version: 3.0.35
Patch: 00
Date: 2019-07-15