summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2018-07-16 21:12:17 -0400
committerLibravatarUnit 193 <unit193@ubuntu.com>2018-07-16 21:12:17 -0400
commita167eef729ad9265284ae976b17bbab0748bd496 (patch)
treeb0cfb672c725b4b3a99c0dda6c53bc4a87f3a484
parent165e3efb98a0aabd33e6b406f3168ae2a665a036 (diff)
downloadinxi-a167eef729ad9265284ae976b17bbab0748bd496.tar.bz2
inxi-a167eef729ad9265284ae976b17bbab0748bd496.tar.xz
inxi-a167eef729ad9265284ae976b17bbab0748bd496.tar.zst
New upstream version 3.0.18-1upstream/3.0.18-1
-rwxr-xr-xinxi1502
-rw-r--r--inxi.160
-rw-r--r--inxi.changelog226
3 files changed, 1249 insertions, 539 deletions
diff --git a/inxi b/inxi
index 5776907..a444e66 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.15';
-my $self_date='2018-07-03';
+my $self_version='3.0.18';
+my $self_date='2018-07-16';
my $self_patch='00';
## END INXI INFO ##
@@ -55,9 +55,9 @@ if (eval {require Time::HiRes}){
my ( %alerts,%client,%colors,%dl,%files,%rows,%system_files,%use );
## Arrays
-# ps_aux is full output, ps_cmd is only the last 10 to last
+# ps_aux is full output, ps_cmd is only the last 10 columns to last
my (@app,@dmesg_boot,@dmi,@gpudata,@ifs,@ifs_bsd,@paths,@pci,@ps_aux,
-@ps_cmd,@sysctl,@sysctl_battery,@sysctl_sensors,@sysctl_machine,
+@ps_cmd,@ps_gui,@sysctl,@sysctl_battery,@sysctl_sensors,@sysctl_machine,
@uname,@usb);
## Disk arrays
my (@dm_boot_disk,@dm_boot_optical,@glabel,@gpart,@hardware_raid,@labels,
@@ -65,12 +65,13 @@ my (@dm_boot_disk,@dm_boot_optical,@glabel,@gpart,@hardware_raid,@labels,
my @test = (0,0,0,0,0);
## Booleans
-my ($b_admin,$b_arm,$b_arm_audio,$b_arm_gfx,$b_arm_net,$b_console_irc,
-$b_debug_gz,$b_display,$b_dmesg_boot_check,$b_dmi,$b_dmidecode_force,
-$b_fake_bsd,$b_fake_dboot,$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_pci,$b_pci_tool,$b_proc_debug,$b_root,
-$b_running_in_display,$b_slot_tool,$b_sudo,$b_sysctl,$b_usb_check);
+my ($b_admin,$b_arm,$b_console_irc,$b_debug_gz,$b_debug_timers,
+$b_display,$b_dmesg_boot_check,
+$b_dmi,$b_dmidecode_force,$b_fake_bsd,$b_fake_dboot,$b_fake_pciconf,
+$b_fake_sysctl,$b_fake_usbdevs,$b_force_display,$b_gpudata,$b_irc,
+$b_log,$b_log_colors,$b_log_full,$b_man,$b_mem,$b_mips,$b_pci,$b_pci_tool,
+$b_proc_debug,$b_ps_gui,$b_root,$b_running_in_display,$b_slot_tool,
+$b_soc_audio,$b_soc_gfx,$b_soc_net,$b_sudo,$b_sysctl,$b_usb_check,$b_wmctrl);
## Disk checks
my ($b_dm_boot_disk,$b_dm_boot_optical,$b_glabel,$b_hardware_raid,
$b_label_uuid,$b_lsblk,$b_partitions,$b_raid);
@@ -78,7 +79,7 @@ my ($b_sysctl_disk,$b_update,$b_weather) = (1,1,1);
## System
my ($bsd_type,$language,$os) = ('','','');
-my ($bits_sys);
+my ($bits_sys,$cpu_arch);
my ($cpu_sleep,$dl_timeout,$limit,$ps_count,$usb_level) = (0.35,4,10,5,0);
my $sensors_cpu_nu = 0;
my $weather_unit='mi';
@@ -138,7 +139,7 @@ sub main {
eval $start if $b_log;
initialize();
## use for start client debugging
- # $debug = 10;
+ # $debug = 3; # 3 prints timers
# set_debugger(); # for debugging of konvi issues
#my $ob_start = StartClient->new();
#$ob_start->get_client_data();
@@ -410,12 +411,14 @@ sub set_fake_tools {
sub set_os {
@uname = uname();
$os = lc($uname[0]);
- my $type = lc($uname[-1]);
- $b_arm = 1 if $type =~ /arm|aarch/;
- if ($type =~ /(armv[1-7]|aarch32|sparc_v9)/){
+ $cpu_arch = lc($uname[-1]);
+ if ($cpu_arch =~ /arm|aarch/){$b_arm = 1}
+ elsif ($cpu_arch =~ /mips/) {$b_mips = 1}
+ # aarch32 mips32 intel/amd handled in cpu
+ if ($cpu_arch =~ /(armv[1-7]|32|sparc_v9)/){
$bits_sys = 32;
}
- elsif ($type =~ /(alpha|64)/){
+ elsif ($cpu_arch =~ /(alpha|64)/){
$bits_sys = 64;
}
if ( $os =~ /(bsd|dragonfly|darwin)/ ){
@@ -1089,9 +1092,10 @@ sub begin_logging {
$end='main::log_data("fe", (caller(1))[3], "");';
$start='main::log_data("fs", (caller(1))[3], \@_);';
#$t3 = tv_interval ($t0, [gettimeofday]);
- $t3 = eval 'Time::HiRes::tv_interval (\@t0, [Time::HiRes::gettimeofday()]);' if $b_hires;
+ $t3 = eval 'Time::HiRes::tv_interval (\@t0, [Time::HiRes::gettimeofday()]);' if $b_hires;
#print Dumper $@;
my $now = strftime "%Y-%m-%d %H:%M:%S", localtime;
+ return if $b_debug_timers;
# do the rotation if logfile exists
if ( -f $log_file ){
# copy if present second to third
@@ -1127,8 +1131,7 @@ sub begin_logging {
sub log_data {
return if ! $b_log;
my ($one, $two, $three) = @_;
- my $args = '';
- my $data = '';
+ my ($args,$data,$timer) = ('','','');
my $spacer = ' ';
# print "1: $one 2: $two 3: $three\n";
if ($one eq 'fs') {
@@ -1146,6 +1149,7 @@ sub log_data {
#print Dumper $@;
$data = "Start: Function: $two$args\n${spacer}Elapsed: $t3\n";
$spacer='';
+ $timer = $data if $b_debug_timers;
}
elsif ( $one eq 'fe') {
# print 'timer:', Time::HiRes::tv_interval(\@t0, [Time::HiRes::gettimeofday()]),"\n";
@@ -1154,6 +1158,7 @@ sub log_data {
#print Dumper $t3;
$data = "${spacer}Elapsed: $t3\nEnd: Function: $two\n";
$spacer='';
+ $timer = $data if $b_debug_timers;
}
elsif ( $one eq 'cat') {
if ( $b_log_full ){
@@ -1195,25 +1200,24 @@ sub log_data {
else {
$data = "$two\n";
}
- # print "d: $data";
- if ($data){
+ if ($b_debug_timers){
+ print $timer if $timer;
+ }
+ #print "d: $data";
+ elsif ($data){
print $fh_l "$spacer$data";
}
}
sub set_debugger {
- if ( $debug < 10 || $debug > 12){
- $end = '';
- $start = '';
- if ( $debug >= 20 ){
- error_handler('not-in-irc', 'debug data generator') if $b_irc;
- my $option = ( $debug > 22 ) ? 'main-full' : 'main';
- $b_debug_gz = 1 if ($debug == 22 || $debug == 24);
- my $ob_sys = SystemDebugger->new($option);
- $ob_sys->run_debugger();
- $ob_sys->upload_file($ftp_alt) if $debug > 20;
- exit 0;
- }
+ if ( $debug >= 20){
+ error_handler('not-in-irc', 'debug data generator') if $b_irc;
+ my $option = ( $debug > 22 ) ? 'main-full' : 'main';
+ $b_debug_gz = 1 if ($debug == 22 || $debug == 24);
+ my $ob_sys = SystemDebugger->new($option);
+ $ob_sys->run_debugger();
+ $ob_sys->upload_file($ftp_alt) if $debug > 20;
+ exit 0;
}
elsif ($debug >= 10 && $debug <= 12){
$b_log = 1;
@@ -1225,6 +1229,17 @@ sub set_debugger {
}
begin_logging();
}
+ elsif ($debug <= 3){
+ if ($debug == 3){
+ $b_log = 1;
+ $b_debug_timers = 1;
+ begin_logging();
+ }
+ else {
+ $end = '';
+ $start = '';
+ }
+ }
}
## SystemDebugger
@@ -1302,7 +1317,7 @@ sub create_debug_directory {
my $host = main::get_hostname();
$host =~ s/ /-/g;
$host = 'no-host' if !$host || $host eq 'N/A';
- my ($arm_string,$bsd_string,$root_string) = ('','','');
+ my ($alt_string,$bsd_string,$root_string) = ('','','');
# note: Time::Piece was introduced in perl 5.9.5
my ($sec,$min,$hour,$mday,$mon,$year) = localtime;
$year = $year+1900;
@@ -1319,8 +1334,9 @@ sub create_debug_directory {
$root_string = '-root';
}
$bsd_string = "-BSD-$bsd_type" if $bsd_type;
- $arm_string = '-ARM' if $b_arm;
- $debug_dir = "$self_name$arm_string$bsd_string-$host-$today$root_string-$self_version";
+ if ($b_arm ){$alt_string = '-ARM'}
+ elsif ($b_mips) {$alt_string = '-MIPS'}
+ $debug_dir = "$self_name$alt_string$bsd_string-$host-$today$root_string-$self_version";
$debug_gz = "$debug_dir.tar.gz";
$data_dir = "$user_data_dir/$debug_dir";
if ( -d $data_dir ){
@@ -1488,11 +1504,12 @@ sub display_data {
'desktop-session' => $ENV{'DESKTOP_SESSION'},
'gdmsession' => $ENV{'GDMSESSION'},
'gnome-desktop-session-id' => $ENV{'GNOME_DESKTOP_SESSION_ID'},
- 'kde3-full-session' => $ENV{'KDE_FULL_SESSION'},
- 'kde-gte-4-session-version' => $ENV{'KDE_SESSION_VERSION'},
+ 'kde-full-session' => $ENV{'KDE_FULL_SESSION'},
+ 'kde-session-version' => $ENV{'KDE_SESSION_VERSION'},
'vdpau-driver' => $ENV{'VDPAU_DRIVER'},
'xdg-current-desktop' => $ENV{'XDG_CURRENT_DESKTOP'},
'xdg-session-desktop' => $ENV{'XDG_SESSION_DESKTOP'},
+ 'xdg-vtnr' => $ENV{'XDG_VTNR'},
# wayland data collectors:
'xdg-session-type' => $ENV{'XDG_SESSION_TYPE'},
'wayland-display' => $ENV{'WAYLAND_DISPLAY'},
@@ -1705,6 +1722,8 @@ sub system_files {
push (@files, '/etc/lsb-release');
push (@files, '/etc/os-release');
copy_files(\@files,'system-distro');
+ @files = main::globber('/etc/upstream[-_]{[rR]elease,[vV]ersion}/*');
+ copy_files(\@files,'system-distro');
@files = (
'/proc/1/comm',
'/proc/cpuinfo',
@@ -1993,7 +2012,7 @@ sub wanted {
elsif ($parse_src eq 'proc') {
return if $File::Find::name =~ /^\/proc\/[0-9]+\//;
return if $File::Find::name =~ /^\/proc\/bus\/pci\//;
- return if $File::Find::name =~ /^\/proc\/(irq|sys)\//;
+ return if $File::Find::name =~ /^\/proc\/(irq|spl|sys)\//;
# these choke on sudo/root: kmsg kcore kpage and we don't want keys or kallsyms
return if $File::Find::name =~ /^\/proc\/k/;
return if $File::Find::name =~ /(\/mb_groups|debug)$/;
@@ -2809,8 +2828,8 @@ sub item_data {
'rpm' => 'glx-utils (openSUSE 12.3 and later Mesa-demo-x)',
}),
'wmctrl' => ({
- 'info' => '-S active window manager (not all wm)',
- 'info-bsd' => '-S active window managerr (not all wm)',
+ 'info' => '-S active window manager (fallback)',
+ 'info-bsd' => '-S active window managerr (fallback)',
'apt' => 'wmctrl',
'pacman' => 'wmctrl',
'rpm' => 'wmctrl',
@@ -3053,6 +3072,7 @@ sub joiner {
sub program_values {
my ($app) = @_;
my (@client_data);
+ # note: setting index 1 and 2 to 0 will trip flags to not do version
my %data = (
## Clients
'bitchx' => ['bitchx',2,'','BitchX',1,0,0],# special
@@ -3075,20 +3095,28 @@ sub program_values {
'weechat-curses' => ['[0-9.]+',1,'-v','WeeChat',1,0,0],
'xchat-gnome' => ['[0-9.]+',2,'-v','X-Chat-Gnome',1,1,0],
'xchat' => ['[0-9.]+',2,'-v','X-Chat',1,1,0],
- ## Desktops
+ ## Desktops / wm
+ '3dwm' => ['^3dwm',0,'0','3dwm',0,1,0], # unknown syntax
+ '9wm' => ['^9wm',3,'-version','9wm',0,1,0],
'afterstep' => ['^afterstep',3,'--version','AfterStep',0,1,0],
+ 'amiwm' => ['^amiwm',0,'0','AmiWM',0,1,0],
'awesome' => ['^awesome',2,'--version','Awesome',0,1,0],
'blackbox' => ['^Blackbox',2,'--version','Blackbox',0,1,0],
'budgie' => ['^budgie-desktop',2,'--version','Budgie',0,1,0],
'cinnamon' => ['^cinnamon',2,'--version','Cinnamon',0,1,0],
- 'dwm' => ['^dwm',1,'-v','dwm',0,1,1],
+ 'compiz' => ['^compiz',2,'--version','Compiz',0,1,0],
+ 'dwm' => ['^dwm',1,'-v','Dwm',0,1,1],
'fluxbox' => ['^fluxbox',2,'--version','Fluxbox',0,1,0],
+ 'flwm' => ['^flwm',0,'0','FLWM',0,0,1],
'fvwm' => ['^fvwm',2,'--version','FVWM',0,0,1],
+ 'fvwm2' => ['^fvwm',2,'--version','FVWM2',0,0,1],
# command: fvwm
'fvwm-crystal' => ['^fvwm',2,'--version','FVWM-Crystal',0,0,0],
+ 'gala' => ['^gala',2,'--version','gala',0,1,0], # super slow result
'gnome-about' => ['gnome',3,'--version','Gnome',0,1,0],
'gnome-shell' => ['gnome',3,'--version','Gnome',0,1,0],
- 'herbstluftwm' => ['^herbstluftwm',-1,'--version','herbstluftwm',0,1,0],
+ # fails to return version when in wm, but outside does. weird.
+ 'herbstluftwm' => ['^herbstluftwm',2,'--version','herbstluftwm',0,1,0],
'jwm' => ['^jwm',2,'--version','JWM',0,1,0],
# i3 version 4.13 (2016-11-08) © 2009 Michael Stapelberg and contributors
'i3' => ['^i3',3,'--version','i3',0,1,0],
@@ -3098,28 +3126,41 @@ sub program_values {
'kded2' => ['^KDE Development Platform:',4,'--version','KDE',0,1,0],
'kded3' => ['^KDE Development Platform:',4,'--version','KDE',0,1,0],
'kded4' => ['^KDE Development Platform:',4,'--version','KDE',0,1,0],
- # command: lxqt-about
- 'lxqt' => ['^lxqt-about',2,'--version','LXQT',0,1,0],
+ 'lxde' => ['^lxpanel',2,'--version','LXDE',0,1,0],
+ # command: lxqt-panel
+ 'lxqt' => ['^lxqt-panel',2,'--version','LXQt',0,1,0],
+ 'marco' => ['^marco',2,'--version','marco',0,1,0],
+ 'matchbox' => ['^matchbox',0,'0','Matchbox',0,1,0],
+ 'matchbox-window-manager' => ['^matchbox',2,'--help','Matchbox',0,0,0],
'mate-about' => ['^MATE[[:space:]]DESKTOP',-1,'--version','MATE',0,1,0],
# note, mate-session when launched with full path returns full path in version string
'mate-session' => ['mate-session',-1,'--version','MATE',0,1,0],
+ 'metacity' => ['^metacity',2,'--version','Metacity',0,1,0],
+ 'muffin' => ['^muffin',2,'--version','muffin',0,1,0],
+ 'mwm' => ['^mwm',0,'0','mwm',0,1,0],
+ 'notion' => ['^.',1,'--version','notion',0,1,0],
'openbox' => ['^openbox',2,'--version','Openbox',0,1,0],
- 'pekwm' => ['^pekwm',3,'--version','pekwm',0,1,0],
+ 'pantheon' => ['^pantheon',0,'0','Pantheon',0,1,0],
+ 'pekwm' => ['^pekwm',3,'--version','PekWM',0,1,0],
'plasmashell' => ['^plasmashell',2,'--version','KDE Plasma',0,1,0],
'qtdiag' => ['^qt',2,'--version','Qt',0,1,0],
+ 'ratpoison' => ['^ratpoison',2,'--version','Ratpoison',0,1,0],
'sawfish' => ['^sawfish',3,'--version','Sawfish',0,1,0],
- 'scrotwm' => ['^welcome.*scrotwm',4,'-v','Scrotwm',0,1,1],
- 'spectrwm' => ['^spectrwm.*welcome.*spectrwm',5,'-v','Spectrwm',0,1,0],
+ 'scrotwm' => ['^scrotwm.*welcome.*',5,'-v','Scrotwm',0,1,1],
+ 'spectrwm' => ['^spectrwm.*welcome.*wm',5,'-v','Spectrwm',0,1,0],
+ 'twm' => ['^twm',0,'0','twm',0,1,0],
'unity' => ['^unity',2,'--version','Unity',0,1,0],
- 'wm2' => ['^wm2',-1,'--version','WM2',0,1,0],
+ 'windowlab' => ['^windowlab',2,'-about','WindowLab',0,1,0],
+ 'wm2' => ['^wm2',0,'0','wm2',0,1,0],
'wmaker' => ['^Window[[:space:]]*Maker',-1,'--version','WindowMaker',0,1,0],
- 'wmii' => ['^wmii',1,'--version','wmii',0,1,0], # note: in debian, wmii is wmii3
+ 'wmii' => ['^wmii',0,'0','wmii',0,1,0], # note: in debian, wmii is wmii3
'wmii2' => ['^wmii2',1,'--version','wmii2',0,1,0],
'xfce4-panel' => ['^xfce4-panel',2,'--version','Xfce',0,1,0],
'xfce5-panel' => ['^xfce5-panel',2,'--version','Xfce',0,1,0],
'xfdesktop' => ['xfdesktop[[:space:]]version',5,'--version','Xfce',0,1,0],
# command: xfdesktop
'xfdesktop-toolkit' => ['Built[[:space:]]with[[:space:]]GTK',4,'--version','Gtk',0,1,0],
+ 'xmonad' => ['^xmonad',2,'--version','XMonad',0,1,0],
## Shells
'bash' => ['^GNU[[:space:]]bash,[[:space:]]version',4,'--version','Bash',1,0,0],
'csh' => ['^tcsh',2,'--version','csh',1,0,0],
@@ -3157,6 +3198,7 @@ sub program_version {
my ($cmd,$line,$output);
my $version_nu = '';
my $count = 0;
+ #print "app:$app\n";
$exit ||= 100; # basically don't exit ever
$version ||= '--version';
# adjust to array index, not human readable
@@ -3282,6 +3324,7 @@ sub uniq {
grep !$seen{$_}++, @_;
}
+
# arg: 1 file full path to write to; 2 - arrayof data to write.
# note: turning off strict refs so we can pass it a scalar or an array reference.
sub writer {
@@ -3861,7 +3904,7 @@ sub get_options{
}},
'debug:i' => sub {
my ($opt,$arg) = @_;
- if ($arg =~ /^[1-3]|1[0-2]|2[0-4]$/){
+ if ($arg =~ /^[1-3]|1[0-3]|2[0-4]$/){
$debug=$arg;
}
else {
@@ -4004,6 +4047,8 @@ sub get_options{
} },
'V|version' => sub {
$b_version = 1 },
+ 'wm' => sub {
+ $b_wmctrl = 1 },
'<>' => sub {
my ($opt) = @_;
error_handler('unknown-option', "$opt", "" ); }
@@ -4078,7 +4123,7 @@ sub show_options {
Examples:^$self_name^-v4^-c6 OR
$self_name^-bDc^6. If you start $self_name with no arguments, it will display
a short system summary." ],
- [0, '', '', '' ],
+ ['0', '', '', '' ],
['0', '', '', "The following options, if used without -F, -b, or -v, will
show option line(s): A, B, C, D, G, I, M, N, P, R, S, W, d, f, i, l, m, n,
o, p, r, s, t, u, w, --slots, --usb - you can use these alone or together
@@ -4156,7 +4201,7 @@ sub show_options {
(memory), cm (CPU+memory). If followed by numbers 1-x, shows that number
of processes for each type (default: 5; if in IRC, max: 5). " ],
['1', '', '', "Make sure that there is no space between letters and
- numbers (e.g. write as^-t^cm10)." ],
+ numbers (e.g.^-t^cm10)." ],
['1', '', '--usb', "Show USB data: Hubs and Devices." ],
['1', '-u', '--uuid', "$partition_string_u UUIDs. Triggers -P. For full -p
output, use -pu." ],
@@ -4186,11 +4231,11 @@ sub show_options {
@rows = (
['1', '-w', '--weather', "Local weather data/time. To check an alternate
location, see -W."],
- ['1', '-W', '--weather-location', "<location> Supported options for
- <location>: postal code; city, state/country; latitude, longitude.
+ ['1', '-W', '--weather-location', "[location] Supported options for
+ [location]: postal code; city, state/country; latitude, longitude.
Only use if you want the weather somewhere other than the machine running
- $self_name. Use only ASCII characters, replace spaces in city/state/country names with '+'.
- Example:^$self_name^-W^new+york,ny"],
+ $self_name. Use only ASCII characters, replace spaces in city/state/country
+ names with '+'. Example:^$self_name^-W^new+york,ny"],
['1', '', '--weather-unit', "Set weather units to metric (m), imperial (i),
metric/imperial (mi), or imperial/metric (im)."],
);
@@ -4222,8 +4267,8 @@ sub show_options {
blocks, chunk size, bitmap (if present). Resync line, shows blocks
synced/total blocks. Hardware RAID driver version, bus ID." ],
['2', '-s', '', "Basic voltages (ipmi, lm-sensors if present): 12v, 5v, 3.3v, vbat." ],
- ['2', '-S', '', "Desktop toolkit, if available (GNOME/Xfce/KDE only);
- Kernel gcc version; system base of distro (if relevant and detected)" ],
+ ['2', '-S', '', "Kernel gcc version; system base of distro (if relevant
+ and detected)" ],
['2', '-t', '', "Adds memory use output to CPU (-xt c), and CPU use to
memory (-xt m)." ],
['2', '--usb', '', "For Devices, shows USB version/speed." ],
@@ -4254,8 +4299,9 @@ sub show_options {
['2', '-R', '', "md-raid: Superblock (if present), algorithm. If resync,
shows progress bar. Hardware RAID Chip vendor:product ID." ],
['2', '-s', '', "DIMM/SOC voltages (ipmi only)." ],
- ['2', '-S', '', "Display manager (dm) in desktop output if in X (e.g. kdm,
- gdm3, lightdm)." ],
+ ['2', '-S', '', "Display manager (dm) in desktop output (e.g. kdm,
+ gdm3, lightdm); active window manager if detected; desktop toolkit,
+ if available (Xfce/KDE/Trinity only)." ],
['2', '--slots', '', "Slot length." ],
['2', '--usb', '', "Vendor:chip ID." ],
);
@@ -4267,18 +4313,23 @@ sub show_options {
@rows = (
['1', '-xxx', '--extra 3', "Show extra, extra, extra data (only works
with verbose or line output, not short form):" ],
+ ['2', '-A', '', "Specific vendor/product information (if relevant)." ],
['2', '-B', '', "Chemistry, cycles, location (if available)." ],
+ ['2', '-C', '', "CPU boost (turbo) enabled/disabled, if present." ],
['2', '-D', '', "Firmware rev. if available; partition scheme, in some cases; disk
rotation speed (if detected)." ],
+ ['2', '-G', '', "Specific vendor/product information (if relevant)." ],
['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
- than data); Detail for Type, if present; module voltage, if available; serial number." ],
+ than data); Detail for Type, if present; module voltage, if available; serial
+ number." ],
['2', '-R', '', "zfs-raid: portion allocated (used) by RAID devices/arrays.
md-raid: system md-raid support types (kernel support, read ahead, RAID events).
- Hardware RAID rev, ports." ],
- ['2', '-S', '', "Panel/shell info in desktop output, if in X (like gnome-shell,
- cinnamon, mate-panel); (if available) dm version number, active window manager." ]
+ Hardware RAID rev, ports, specific vendor/product information." ],
+ ['2', '-S', '', "Panel/shell info in desktop output, if in X (like lxpanel,
+ xfce4-panel, mate-panel); (if available) dm version number, window manager
+ version number." ]
);
push @data, @rows;
if ( $b_weather ){
@@ -4322,28 +4373,9 @@ sub show_options {
}
@rows = (
['1', '-V', '--version', "Prints $self_name version info then exits." ],
- [0, '', '', "$line" ],
- [0, '', '', "Debugging Options:" ],
- ['1', '', '--debug', "Triggers debugging modes." ],
- ['2', '1-3', '', "On screen debugger output." ],
- ['2', '10', '', "Basic logging." ],
- ['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" ],
- ['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." ],
- ['2', '21', '', "Upload debugger dataset to $self_name debugger server
- automatically, removes debugger data directory, leaves tar.gz debugger file." ],
- ['2', '22', '', "Upload debugger dataset to $self_name debugger server
- automatically, removes debugger data directory and debugger tar.gz file." ],
- ['1', '', '--ftp', "Use with --debugger 21 to trigger an alternate FTP server for upload.
- Format:^[ftp.xx.xx/yy]. Must include a remote directory to upload to.
- Example:^$self_name^--debug^21^--ftp^ftp.myserver.com/incoming" ],
- [0, '', '', "$line" ],
- [0, '', '', "Advanced Options:" ],
- [1, '', '--alt', "Trigger for various advanced options:" ],
+ ['0', '', '', "$line" ],
+ ['0', '', '', "Advanced Options:" ],
+ ['1', '', '--alt', "Trigger for various advanced options:" ],
['2', '40', '', "Bypass Perl as a downloader option." ],
['2', '41', '', "Bypass Curl as a downloader option." ],
['2', '42', '', "Bypass Fetch as a downloader option." ],
@@ -4386,7 +4418,27 @@ sub show_options {
['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" ],
+ ['1', '', '--wm', "Force wm: to use wmctrl as data source. Default uses ps." ],
['0', '', '', $line ],
+ ['0', '', '', "Debugging Options:" ],
+ ['1', '', '--debug', "Triggers debugging modes." ],
+ ['2', '1-3', '', "On screen debugger output." ],
+ ['2', '10', '', "Basic logging." ],
+ ['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" ],
+ ['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." ],
+ ['2', '21', '', "Upload debugger dataset to $self_name debugger server
+ automatically, removes debugger data directory, leaves tar.gz debugger file." ],
+ ['2', '22', '', "Upload debugger dataset to $self_name debugger server
+ automatically, removes debugger data directory and debugger tar.gz file." ],
+ ['1', '', '--ftp', "Use with --debugger 21 to trigger an alternate FTP server for upload.
+ Format:^[ftp.xx.xx/yy]. Must include a remote directory to upload to.
+ Example:^$self_name^--debug^21^--ftp^ftp.myserver.com/incoming" ],
+ ['0', '', '', "$line" ],
);
push @data, @rows;
print_basic(@data);
@@ -4813,6 +4865,13 @@ sub apply_filter {
}
return $string;
}
+sub arm_cleaner {
+ my ($item) = @_;
+ $item =~ s/(\(?Device Tree\)?)//gi;
+ $item =~ s/\s\s+/ /g;
+ $item =~ s/^\s+|\s+$//g;
+ return $item;
+}
sub clean_characters {
my ($data) = @_;
@@ -4930,21 +4989,27 @@ sub memory_data_full {
my ($source) = @_;
my $num = 0;
my ($memory,@rows);
- my ($percent,$total,$used) = ('','','');
+ my ($gpu_ram,$percent,$total,$used) = (0,'','','');
if (!$show{'info'}){
$memory = get_memory_data('splits');
if ($memory){
my @temp = split /:/, $memory;
my @temp2 = get_size($temp[0]);
+ $gpu_ram = $temp[3] if $temp[3];
$total = ($temp2[1]) ? $temp2[0] . ' ' . $temp2[1] : $temp2[0];
@temp2 = get_size($temp[1]);
$used = ($temp2[1]) ? $temp2[0] . ' ' . $temp2[1] : $temp2[0];
$used .= " ($temp[2]%)" if $temp[2];
+ if ($gpu_ram){
+ @temp2 = get_size($gpu_ram);
+ $gpu_ram = $temp2[0] . ' ' . $temp2[1] if $temp2[1];
+ }
}
my $key = ($source eq 'process') ? 'System RAM': 'RAM';
$rows[0]{main::key($num++,$key)} = '';
$rows[0]{main::key($num++,'total')} = $total;
$rows[0]{main::key($num++,'used')} = $used;
+ $rows[0]{main::key($num++,'gpu')} = $gpu_ram if $gpu_ram;
}
$b_mem = 1;
eval $end if $b_log;
@@ -4954,7 +5019,7 @@ sub memory_data_full {
sub pci_cleaner {
my ($string,$type) = @_;
#print "st1 $type:$string\n";
- my $filter = 'compatible\scontroller|\b(device|controller|multimedia)\b|\([^)]+\)';
+ my $filter = 'compatible\scontroller|\b(device|controller|connection|multimedia)\b|\([^)]+\)';
# \[[^\]]+\]$| not trimming off ending [...] initial type filters removes end
$filter = '\[[^\]]+\]$|' . $filter if $type eq 'pci';
$string =~ s/$filter//ig;
@@ -4964,6 +5029,17 @@ sub pci_cleaner {
$string = remove_duplicates($string) if $string;
return $string;
}
+sub pci_cleaner_subsystem {
+ my ($string) = @_;
+ # we only need filters for features that might use vendor, -AGN
+ my $filter = 'adapter|(hd\s)?audio|definition|desktop|ethernet|gigabit|graphics|';
+ $filter .= 'hdmi(\/[\S]+)?|high|integrated|motherboard|network|onboard|';
+ $filter .= 'raid|pci\s?express';
+ $string =~ s/\b($filter)\b//gi;
+ $string =~ s/\s\s+/ /g;
+ $string =~ s/^\s+|\s+$//g;
+ return $string;
+}
sub pci_long_filter {
my ($string) = @_;
@@ -4982,7 +5058,7 @@ sub row_defaults {
'battery-data' => "No system battery data found. Is one present?",
'battery-data-sys' => "No /sys data found. Old system?",
'cpu-model-null' => "Model N/A",
- 'cpu-speeds' => "No non 0 speed data found for $id cores.",
+ 'cpu-speeds' => "No speed data found for $id cores.",
'darwin-feature' => "Feature not supported iu Darwin/OSX.",
'disk-data-bsd' => "No disk data found for this BSD system.",
'disk-data' => "No Disk data was found.",
@@ -5002,6 +5078,7 @@ sub row_defaults {
'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.",
'machine-data-force-dmidecode' => "No machine data: try newer kernel. Is dmidecode installed? Try -M --dmidecode.",
+ 'mips-pci' => "No MIPS data found for this feature.",
'optical-data' => "No Optical or Floppy data was found.",
'optical-data-bsd' => "No floppy or optical data found for this BSD system.",
'output-limit' => "Output throttled. IPs: $id; Limit: $limit; Override: --limit [1-x;-1 all]",
@@ -5495,10 +5572,10 @@ sub get {
eval $start if $b_log;
my (@data,@rows);
my $num = 0;
- if ($b_arm && !$b_arm_audio && !$b_pci_tool){
- my $key = 'ARM';
+ if (($b_arm || $b_mips) && !$b_soc_audio && !$b_pci_tool){
+ my $key = ($b_arm) ? 'ARM' : 'MIPS';
@data = ({
- main::key($num++,$key) => main::row_defaults('arm-pci',''),
+ main::key($num++,$key) => main::row_defaults(lc($key) . '-pci',''),
},);
@rows = (@rows,@data);
}
@@ -5506,7 +5583,8 @@ sub get {
@data = card_data();
@rows = (@rows,@data);
}
- if ( ( ($b_arm && !$b_arm_audio && !$b_pci_tool) || !@rows ) && (my $file = main::system_files('asound-cards') ) ){
+ if ( ( (($b_arm || $b_mips) && !$b_soc_audio && !$b_pci_tool) || !@rows ) &&
+ (my $file = main::system_files('asound-cards') ) ){
@data = asound_data($file);
@rows = (@rows,@data);
}
@@ -5532,7 +5610,7 @@ sub card_data {
foreach (@pci){
$num = 1;
my @row = @$_;
- if ($row[0] =~ /^(audio|multimedia|hdmi)$/){
+ if ($row[0] =~ /^(audio|daudio|hdmi|multimedia)$/){
$j = scalar @rows;
my $driver = $row[9];
$driver ||= 'N/A';
@@ -5544,9 +5622,13 @@ sub card_data {
}
@data = ({
main::key($num++,'Card') => $card,
- main::key($num++,'driver') => $driver,
},);
@rows = (@rows,@data);
+ if ($extra > 2 && $b_pci_tool && $row[11]){
+ my $item = main::get_pci_vendor($row[4],$row[11]);
+ $rows[$j]{main::key($num++,'vendor')} = $item if $item;
+ }
+ $rows[$j]{main::key($num++,'driver')} = $driver;
if ($extra > 0 && !$bsd_type){
if ($row[9] ){
my $version = main::get_module_version($row[9]);
@@ -6274,9 +6356,13 @@ sub create_output_full {
@data = ({
main::key($num++,$speed_key) => $speed,
main::key($num++,$min_max_key) => $min_max,
- main::key($num++,$core_key) => $core_speeds_value,
- }, );
+ });
@rows = (@rows,@data);
+ if ($extra > 2){
+ my $boost = get_boost_status();
+ $rows[$j]{main::key($num++,'boost')} = $boost if $boost;
+ }
+ $rows[$j]{main::key($num++,$core_key)} = $core_speeds_value;
my $i = 1;
# if say 96 0 speed cores, no need to print all those 0s
if ($b_speeds){
@@ -6427,6 +6513,7 @@ sub data_cpuinfo {
# $file = "$ENV{'HOME'}/bin/scripts/inxi/data/cpu/intel/2-1-core-xeon-vm-vs2017.txt";
# $file = "$ENV{'HOME'}/bin/scripts/inxi/data/cpu/intel/4-1-core-xeon-vps-frodo1.txt";
# $file = "$ENV{'HOME'}/bin/scripts/inxi/data/cpu/intel/4-6-core-xeon-no-mt-lathander.txt";
+ #$file = "$ENV{'HOME'}/bin/scripts/inxi/data/cpu/mips/mips-mainusg-cpuinfo.txt";
my %speeds = set_cpu_speeds_sys();
my @cpuinfo = main::reader($file);
my @phys_cpus = (0);# start with 1 always
@@ -6517,7 +6604,7 @@ sub data_cpuinfo {
$cpu{'model_id'} =~ s/^0X//;
}
# cpu can show in arm
- elsif (!$cpu{'model_name'} &&( $line[0] eq 'model name' || $line[0] eq 'cpu' )){
+ elsif (!$cpu{'model_name'} && ( $line[0] eq 'model name' || $line[0] eq 'cpu' || $line[0] eq 'cpu model' )){
$cpu{'model_name'} = main::cleaner($line[1]);
$cpu{'model_name'} = cpu_cleaner($cpu{'model_name'});
if ( $b_arm || $line[1] =~ /ARM|AArch/i){
@@ -6533,6 +6620,10 @@ sub data_cpuinfo {
#$cpu{'processors'}[$proc_count] = 0;
}
}
+ elsif ($b_mips || $line[1] =~ /mips/i){
+ $b_mips = 1;
+ $cpu{'type'} = 'mips';
+ }
}
elsif ( $line[0] eq 'cpu mhz' ){
$speed = speed_cleaner($line[1]);
@@ -6634,6 +6725,7 @@ sub data_cpuinfo {
$cpu{'ids'} = (\@ids);
if ( $extra > 0 && !$cpu{'arch'} && $type ne 'short' ){
$cpu{'arch'} = cpu_arch($cpu{'type'},$cpu{'family'},$cpu{'model_id'});
+ $cpu{'arch'} = $cpu_arch if (!$cpu{'arch'} && $cpu_arch && ($b_mips || $b_arm))
#print "$cpu{'type'},$cpu{'family'},$cpu{'model_id'},$cpu{'arch'}\n";
}
if (!$speeds{'cur-freq'}){
@@ -7088,7 +7180,7 @@ sub set_cpu_speeds_sys {
if ($b_arm){
@arm = main::globber('/sys/devices/system/cpu/cpufreq/policy*/');
# there are arm chips with two dies, that run at different min max speeds!!
- # see: https://github.com/smxi/inxi/issues/128.
+ # see: https://github.com/smxi/inxi/issues/128
# it would be slick to show both die min/max/cur speeds, but this is
# ok for now.
if (scalar @arm > 1){
@@ -7197,7 +7289,19 @@ sub cpu_vendor {
eval $end if $b_log;
return $vendor;
}
-
+sub get_boost_status {
+ eval $start if $b_log;
+ my ($boost);
+ my $path = '/sys/devices/system/cpu/cpufreq/boost';
+ if (-f $path){
+ $boost = (main::reader($path))[0];
+ if (defined $boost && $boost =~/^[01]$/){
+ $boost = ($boost) ? 'enabled' : 'disabled';
+ }
+ }
+ eval $end if $b_log;
+ return $boost;
+}
sub arm_cpu_name {
eval $start if $b_log;
my (%cpus,$compat);
@@ -7523,7 +7627,8 @@ sub create_output {
}
$used ||= 'N/A';
@data = ({
- main::key($num++,'HDD Total Size') => $size,
+ main::key($num++,'Local Storage') => '',
+ main::key($num++,'total') => $size,
main::key($num++,'used') => $used,
});
@rows = (@rows,@data);
@@ -8097,9 +8202,7 @@ sub device_vendor {
my (@data);
return if !$model;
# 0 - match pattern; 1 - replace pattern; 2 - vendor print; 3 - serial pattern
- # https://elinux.org/RPi_SD_cards
- # https://sd2snes.de/blog/card-list
- # https://www.superbiiz.com # lists by real part numbers
+ # Data URLs: inxi-resources.txt Section: DiskData device_vendor()
my @vendors = (
## These go first because they are the most likely and common ##
['(Crucial|^CT|-CT|^M4-)','Crucial','Crucial',''],
@@ -8110,8 +8213,8 @@ sub device_vendor {
# MU = Multiple_Flash_Reader too risky: |M[UZ][^L]
['(SAMSUNG|^MCG[0-9]+GC)','SAMSUNG','Samsung',''], # maybe ^SM
['(SanDisk|^SDS[S]?[DQ]|^SL([0-9]+)G|^AFGCE|ULTRA\sFIT|Cruzer)','SanDisk','SanDisk',''],
- ['(^ST[^T]|[S]?SEAGATE|^X[AFP])','[S]?SEAGATE','Seagate',''], # real, SSEAGATE Backup+; XP1600HE30002
- ['^(WD|Western Digital|My Passport|00LPCX|Elements)','(^WDC|Western Digital)','Western Digital',''],
+ ['(^ST[^T]|[S]?SEAGATE|^X[AFP]|^BUP|Expansion Desk)','[S]?SEAGATE','Seagate',''], # real, SSEAGATE Backup+; XP1600HE30002
+ ['^(WD|Western Digital|My (Book|Passport)|00LPCX|Elements)','(^WDC|Western Digital)','Western Digital',''],
## Then better known ones ##
['^(A-DATA|ADATA|AXN)','^(A-DATA|ADATA)','A-Data',''],
['^ADTRON','^(ADTRON)','Adtron',''],
@@ -8120,7 +8223,9 @@ sub device_vendor {
['^Corsair','^Corsair','Corsair',''],
['^(FUJITSU|MP)','^FUJITSU','Fujitsu',''],
# note: 2012: wdc bought hgst
- ['^(Hitachi|HGST|IC|HT|HU)','^Hitachi','Hitachi',''], # HGST HUA
+ ['^(HGST)','^HGST','HGST (Hitachi)',''], # HGST HUA
+ ['^(Hitachi|HDS|IC|HT|HU)','^Hitachi','Hitachi',''],
+ ['^Hoodisk','^Hoodisk','Hoodisk',''],
['^(HP\b)','^HP','HP',''], # vb: VB0250EAVER but clashes with vbox; HP_SSD_S700_120G
['^(LSD|Lexar)','^Lexar','Lexar',''], # mmc-LEXAR_0xb016546c
# OCZSSD2-2VTXE120G is OCZ-VERTEX2_3.5
@@ -8135,10 +8240,11 @@ sub device_vendor {
## These go last because they are short and could lead to false ID, or are unlikely ##
['^Android','^Android','Android',''],
# must come before AP|Apacer
- ['^APPLE','','^APPLE','Apple'],
+ ['^APPLE','^APPLE','Apple',''],
['^(AP|Apacer)','^Apacer','Apacer',''],
['^BUFFALO','^BUFFALO','Buffalo',''],
['^CHN\b','','Zheino',''],
+ ['^Colorful\b','^Colorful','Colorful',''],
['^DREVO\b','','Drevo',''],
['^EXCELSTOR','^EXCELSTOR( TECHNOLOGY)?','Excelstor',''],
['^FASTDISK','^FASTDISK','FASTDISK',''],
@@ -8154,6 +8260,7 @@ sub device_vendor {
['^(InnoDisk|Innolite)','^InnoDisk( Corp.)?','InnoDisk',''],
['^Innostor','^Innostor','Innostor',''],
['^Intenso','^Intenso','Intenso',''],
+ ['^KingDian','^KingDian','KingDian',''],
['^(LITE[\-]?ON[\s\-]?IT)','^LITE[\-]?ON[\s\-]?IT','LITE-ON IT',''], # LITEONIT_LSS-24L6G
['^(LITE[\-]?ON|PH6)','^LITE[\-]?ON','LITE-ON',''], # PH6-CE240-L
['^M-Systems','^M-Systems','M-Systems',''],
@@ -8171,7 +8278,8 @@ sub device_vendor {
['^RIM[\s]','^RIM','RIM',''],
['^SigmaTel','^SigmaTel','SigmaTel',''],
['^SPPC','','Silicon Power',''],
- ['^(SK HYNIX|SKHYNIX|HFS)','^(SK HYNIX|SKHYNIX)','SK Hynix',''], # HFS128G39TND-N210A
+ ['^(SK\s?HYNIX|HFS)','^SK\s?HYNIX','SK Hynix',''], # HFS128G39TND-N210A
+ ['^hynix','hynix','Hynix',''],# nvme middle of string, must be after sk hynix
['^SH','','Smart Modular Tech.',''],
['^(SMART( Storage Systems)?|TX)','^(SMART( Storage Systems)?)','Smart Storage Systems',''],
['^(S[FR]-|Sony)','^Sony','Sony',''],
@@ -8186,6 +8294,7 @@ sub device_vendor {
['^TEAC','^TEAC','TEAC',''],
['^(TS|Transcend|JetFlash)','^Transcend','Transcend',''],
['^TrekStor','^TrekStor','TrekStor',''],
+ ['^UDinfo','^UDinfo','UDinfo',''],
['^(UG|Unigen)','^Unigen','Unigen',''],
['^VBOX','','VirtualBox',''],
['^(Verbatim|STORE N GO)','^Verbatim','Verbatim',''],
@@ -8354,10 +8463,10 @@ sub get {
eval $start if $b_log;
my (@data,@rows);
my $num = 0;
- if ($b_arm && !$b_arm_gfx && !$b_pci_tool){
- my $key = 'ARM';
+ if (($b_arm || $b_mips) && !$b_soc_gfx && !$b_pci_tool){
+ my $key = ($b_arm) ? 'ARM' : 'MIPS';
@data = ({
- main::key($num++,$key) => main::row_defaults('arm-pci',''),
+ main::key($num++,$key) => main::row_defaults(lc($key) . '-pci',''),
},);
@rows = (@rows,@data);
}
@@ -8403,7 +8512,7 @@ sub card_data {
$num = 1;
my @row = @$_;
#print "$row[0] $row[3]\n";
- if ($row[3] == 0 && ( $row[0] =~ /^(vga|display|3d|fb|gpu|hdmi)$/ ) ){
+ if ($row[3] == 0 && ( $row[0] =~ /^(vga|disp|display|3d|fb|gpu|hdmi)$/ ) ){
#print "$row[0] $row[3]\n";
$j = scalar @rows;
$driver = $row[9];
@@ -8415,13 +8524,15 @@ sub card_data {
if (length($card) > 85 || $size{'max'} < 110){
$card = main::pci_long_filter($card);
}
- @data = (
- {
+ @data = ({
main::key($num++,'Card') => $card,
- main::key($num++,'driver') => $driver,
- },
- );
+ },);
@rows = (@rows,@data);
+ if ($extra > 2 && $b_pci_tool && $row[11]){
+ my $item = main::get_pci_vendor($row[4],$row[11]);
+ $rows[$j]{main::key($num++,'vendor')} = $item if $item;
+ }
+ $rows[$j]{main::key($num++,'driver')} = $driver;
if ($row[9] && !$bsd_type){
my $version = main::get_module_version($row[9]);
$version ||= 'N/A';
@@ -8754,7 +8865,7 @@ sub tty_data(){
$tty = "$size{'term-cols'}x$size{'term-lines'}";
}
elsif ($b_irc && $client{'console-irc'}){
- my $tty_working = main::get_tty_console_irc();
+ my $tty_working = main::get_tty_console_irc('tty');
if (my $program = main::check_program('stty')){
my $tty_arg = ($bsd_type) ? '-f' : '-F';
$tty = (main::grabber("$program $tty_arg /dev/pts/$tty_working size 2>/dev/null"))[0];
@@ -8891,73 +9002,49 @@ sub display_compositor {
eval $start if $b_log;
my ($protocol) = @_;
my ($compositor) = ('');
- # NOTE: chains of greps of ps data are VERY expensive, so check for program presence
- if (main::check_program('mutter') && (grep {/mutter/} @ps_cmd ) ) {
- $compositor = 'mutter';
- }
- elsif (main::check_program('kwin_wayland') && (grep {/\bkwin_wayland\b/} @ps_cmd ) ) {
- $compositor = 'kwin_wayland';
- }
- elsif (main::check_program('kwin') && (grep {/\bkwin\b/} @ps_cmd ) ) {
- $compositor = 'kwin';
- }
- elsif (main::check_program('muffin') && (grep {/muffin/} @ps_cmd ) ) {
- $compositor = 'muffin';
- }
- # Note: other strings have gnome-shell in them, so important to get exact one. Since we
- # can't fully trust how this will appear, the pattern should tighten it
- elsif (main::check_program('gnome-shell') && (grep {/^(\/[\S]+\/)?gnome-shell(\s|$)/} @ps_cmd ) ) {
- $compositor = 'gnome-shell';
- }
- elsif (main::check_program('weston') && (grep {/weston/} @ps_cmd ) ) {
- $compositor = 'weston';
- }
- elsif (main::check_program('compton') && (grep {/compton/} @ps_cmd ) ) {
- $compositor = 'compton';
- }
- # owned by: compiz-core in debian
- elsif (main::check_program('compiz') && (grep {/compiz/} @ps_cmd ) ) {
- $compositor = 'compiz';
- }
- # did not find in debian apt
- elsif (main::check_program('moblin') && (grep {/moblin/} @ps_cmd ) ) {
- $compositor = 'moblin';
- }
- # did not find in debian apt
- elsif (main::check_program('kmscon') && (grep {/kmscon/} @ps_cmd ) ) {
- $compositor = 'kmscon';
- }
- # did not find in debian apt
- elsif (main::check_program('sway') && (grep {/\bsway\b/} @ps_cmd ) ) {
- $compositor = 'sway';
- }
- # did not find in debian apt
- elsif (main::check_program('grefson') && (grep {/grefson/} @ps_cmd ) ) {
- $compositor = 'grefson';
- }
- # did not find in debian apt
- elsif (main::check_program('westford') && (grep {/westford/} @ps_cmd ) ) {
- $compositor = 'westford';
- }
- # did not find in debian apt
- elsif (main::check_program('rustland') && (grep {/rustland/} @ps_cmd ) ) {
- $compositor = 'rustland';
- }
- # did not find in debian apt
- elsif (main::check_program('ireplace') && (grep {/fireplace/} @ps_cmd ) ) {
- $compositor = 'fireplace';
- }
- # did not find in debian apt
- elsif (main::check_program('wayhouse') && (grep {/wayhouse/} @ps_cmd ) ) {
- $compositor = 'wayhouse';
- }
- # did not find in debian apt
- elsif (main::check_program('swc') && (grep {/\bswc\b/} @ps_cmd ) ) {
- $compositor = 'swc';
- }
- # did not find in debian apt
- elsif (main::check_program('dwc') && (grep {/\bdwc\b/} @ps_cmd ) ) {
- $compositor = 'dwc';
+ main::set_ps_gui() if ! $b_ps_gui;
+ if (@ps_gui){
+ # 1 check program; 2 search; 3 unused version; 4 print
+ my @compositors = (
+ ['budgie-wm','budgie-wm','','budgie-wm'],
+ ['compton','compton','','compton'],
+ ['enlightenment','enlightenment','','enlightenment'],
+ ['gnome-shell','gnome-shell','','gnome-shell'],
+ ['kwin_wayland','kwin_wayland','','kwin wayland'],
+ ['kwin_x11','kwin_x11','','kwin x11'],
+ #['kwin','kwin','','kwin'],
+ ['marco','marco','','marco'],
+ ['muffin','muffin','','muffin'],
+ ['mutter','mutter','','mutter'],
+ ['weston','weston','','weston'],
+ # owned by: compiz-core in debian
+ ['compiz','compiz','','compiz'],
+ # did not find follwing in debian apt
+ ['3dwm','3dwm','','3dwm'],
+ ['dwc','dwc','','dwc'],
+ ['grefson','grefson','','grefson'],
+ ['ireplace','ireplace','','ireplace'],
+ ['kmscon','kmscon','','kmscon'],
+ ['metisse','metisse','','metisse'],
+ ['mir','mir','','mir'],
+ ['moblin','moblin','','moblin'],
+ ['rustland','rustland','','rustland'],
+ ['sway','sway','','sway'],
+ ['swc','swc','','swc'],
+ ['unagi','unagi','','unagi'],
+ ['wayhouse','wayhouse','','wayhouse'],
+ ['westford','westford','','westford'],
+ ['xcompmgr','xcompmgr','','xcompmgr'],
+ );
+ foreach my $ref (@compositors){
+ my @item = @$ref;
+ # no need to use check program with short list of ps_gui
+ # if (main::check_program($item[0]) && (grep {/^$item[1]$/} @ps_gui ) ){
+ if (grep {/^$item[1]$/} @ps_gui){
+ $compositor = $item[3];
+ last;
+ }
+ }
}
main::log_data('data',"compositor: $compositor") if $b_log;
eval $end if $b_log;
@@ -8971,7 +9058,7 @@ package MachineData;
sub get {
eval $start if $b_log;
- my (%arm_machine,@data,@rows,$key1,$val1,$which);
+ my (%soc_machine,@data,@rows,$key1,$val1,$which);
my $num = 0;
if ($bsd_type && @sysctl_machine && !$b_dmidecode_force ){
@data = machine_data_sysctl();
@@ -9004,11 +9091,9 @@ sub get {
}
elsif (!$bsd_type) {
# this uses /proc/cpuinfo so only GNU/Linux
- if ($b_arm){
- %arm_machine = machine_data_arm();
- if (%arm_machine){
- @data = create_output_arm(%arm_machine);
- }
+ if ($b_arm || $b_mips){
+ %soc_machine = machine_data_soc();
+ @data = create_output_soc(%soc_machine) if %soc_machine;
}
if (!@data){
$key1 = 'Message';
@@ -9154,37 +9239,38 @@ sub create_output {
eval $end if $b_log;
return @rows;
}
-sub create_output_arm {
+sub create_output_soc {
my (%data,@row,@rows);
- my (%arm_machine) = @_;
+ my (%soc_machine) = @_;
my $num = 0;
my $j = 0;
- #print Data::Dumper::Dumper \%arm_machine;
+ #print Data::Dumper::Dumper \%soc_machine;
# this is sketchy, /proc/device-tree/model may be similar to Hardware value from /proc/cpuinfo
# raspi: Hardware : BCM2835 model: Raspberry Pi Model B Rev 2
- if ($arm_machine{'device'} || $arm_machine{'model'}){
- $rows[$j]{main::key($num++,'Type')} = 'ARM Device';
+ if ($soc_machine{'device'} || $soc_machine{'model'}){
+ my $key = ($b_arm) ? 'ARM Device': 'MIPS Device';
+ $rows[$j]{main::key($num++,'Type')} = $key;
my $system = 'System';
- if (defined $arm_machine{'model'}){
- $rows[$j]{main::key($num++,'System')} = $arm_machine{'model'};
+ if (defined $soc_machine{'model'}){
+ $rows[$j]{main::key($num++,'System')} = $soc_machine{'model'};
$system = 'details';
}
- my $device = $arm_machine{'device'};
+ my $device = $soc_machine{'device'};
$device ||= 'N/A';
$rows[$j]{main::key($num++,$system)} = $device;
}
# we're going to print N/A for 0000 values sine the item was there.
- if ($arm_machine{'firmware'}){
+ if ($soc_machine{'firmware'}){
# most samples I've seen are like: 0000
- $arm_machine{'firmware'} =~ s/^[0]+$//;
- $arm_machine{'firmware'} ||= 'N/A';
- $rows[$j]{main::key($num++,'rev')} = $arm_machine{'firmware'};
+ $soc_machine{'firmware'} =~ s/^[0]+$//;
+ $soc_machine{'firmware'} ||= 'N/A';
+ $rows[$j]{main::key($num++,'rev')} = $soc_machine{'firmware'};
}
# sometimes has value like: 0000
- if (defined $arm_machine{'serial'}){
+ if (defined $soc_machine{'serial'}){
# most samples I've seen are like: 0000
- $arm_machine{'serial'} =~ s/^[0]+$//;
- $rows[$j]{main::key($num++,'serial')} = main::apply_filter($arm_machine{'serial'});
+ $soc_machine{'serial'} =~ s/^[0]+$//;
+ $rows[$j]{main::key($num++,'serial')} = main::apply_filter($soc_machine{'serial'});
}
eval $end if $b_log;
return @rows;
@@ -9253,48 +9339,58 @@ sub machine_data_sys {
# which will be used for alt ARM machine data in cases
# where no dmi data present, or by cpu data to guess at
# certain actions for arm only.
-sub machine_data_arm {
+sub machine_data_soc {
eval $end if $b_log;
- my (%arm_machine,@temp);
+ my (%soc_machine,@temp);
if (my $file = main::system_files('cpuinfo')){
#$file = "$ENV{'HOME'}/bin/scripts/inxi/data/cpu/arm/arm-shevaplug-1.2ghz.txt";
my @data = main::reader($file);
foreach (@data){
- if (/^Hardware/i){
+ if (/^(Hardware|machine)\s*:/i){
+ @temp = split /\s*:\s*/, $_;
+ $temp[1] = main::arm_cleaner($temp[1]);
+ $temp[1] = main::dmi_cleaner($temp[1]);
+ $soc_machine{'device'} = main::cleaner($temp[1]);
+ }
+ elsif (/^(system type)\s*:/i){
@temp = split /\s*:\s*/, $_;
- $arm_machine{'device'} = main::cleaner($temp[1]);
+ $temp[1] = main::dmi_cleaner($temp[1]);
+ $soc_machine{'model'} = main::cleaner($temp[1]);
}
elsif (/^Revision/i){
@temp = split /\s*:\s*/, $_;
- $arm_machine{'firmware'} = $temp[1];
+ $soc_machine{'firmware'} = $temp[1];
}
elsif (/^Serial/i){
@temp = split /\s*:\s*/, $_;
- $arm_machine{'serial'} = $temp[1];
+ $soc_machine{'serial'} = $temp[1];
}
}
}
- if (-f '/proc/device-tree/model'){
+ if (!$soc_machine{'model'} && -f '/proc/device-tree/model'){
my $model = (main::reader('/proc/device-tree/model'))[0];
main::log_data('data',"device-tree-model: $model") if $b_log;
if ( $model ){
$model = main::dmi_cleaner($model);
+ $model = (split /\x01|\x02|\x03|\x00/, $model)[0] if $model;
# idea was to use only first part of string, but now try using all
#my (@result) = ();
- #@result = split(/\s+/, $arm_machine{'device'}) if $arm_machine{'device'};
- if ( !$arm_machine{'device'} || ($model && $model !~ /$arm_machine{'device'}/i) ){
- $arm_machine{'model'} = $model;
+ #@result = split(/\s+/, $soc_machine{'device'}) if $soc_machine{'device'};
+ if ( !$soc_machine{'device'} || ($model && $model !~ /$soc_machine{'device'}/i) ){
+ $model = main::arm_cleaner($model);
+ $soc_machine{'model'} = $model;
}
}
}
- if (!$arm_machine{'serial'} && -f '/proc/device-tree/serial-number'){
+ if (!$soc_machine{'serial'} && -f '/proc/device-tree/serial-number'){
my $serial = (main::reader('/proc/device-tree/serial-number'))[0];
+ $serial = (split /\x01|\x02|\x03|\x00/, $serial)[0] if $serial;
main::log_data('data',"device-tree-serial: $serial") if $b_log;
- $arm_machine{'serial'} = $serial if $serial;
+ $soc_machine{'serial'} = $serial if $serial;
}
- #print Data::Dumper::Dumper \%arm_machine;
+ #print Data::Dumper::Dumper \%soc_machine;
eval $end if $b_log;
- return %arm_machine;
+ return %soc_machine;
}
# bios_date: 09/07/2010
@@ -9595,12 +9691,9 @@ sub get {
eval $start if $b_log;
my (@data,@rows);
my $num = 0;
- if ($b_arm && !$b_arm_net && !$b_pci_tool){
- my $key = 'ARM';
- @data = ({
- main::key($num++,$key) => main::row_defaults('arm-pci',''),
- },);
- @rows = (@rows,@data);
+ if (($b_arm || $b_mips) && !$b_soc_net && !$b_pci_tool){
+ # do nothing, but keep the test conditions to force
+ # the non arm case to always run
}
else {
@data = card_data();
@@ -9608,6 +9701,14 @@ sub get {
}
@data = usb_data();
@rows = (@rows,@data) if @data;
+ # note: rasberry pi uses usb networking only
+ if (!@rows && ($b_arm || $b_mips)){
+ my $key = ($b_arm) ? 'ARM' : 'MIPS';
+ @data = ({
+ main::key($num++,$key) => main::row_defaults(lc($key) . '-pci',''),
+ },);
+ @rows = (@rows,@data);
+ }
if ($show{'network-advanced'}){
# @ifs_found = ();
# shift @ifs_found;
@@ -9649,7 +9750,7 @@ sub card_data {
#print "$row[0] $row[3]\n";
# NOTE: class 06 subclass 80
# https://www-s.acm.illinois.edu/sigops/2007/roll_your_own/7.c.1.html
- if ($row[0] eq 'network' || $row[0] eq 'ethernet' || $row[1] eq '0680' ){
+ if (($row[0] && $row[0] =~ /^(eth|ethernet|ethernet-phy|network|wifi|wlan)$/ )|| ($row[1] && $row[1] eq '0680' ) ){
#print "$row[0] $row[3]\n";
$j = scalar @rows;
my $driver = $row[9];
@@ -9669,9 +9770,16 @@ sub card_data {
$driver ||= 'N/A';
@data = ({
main::key($num++,'Card') => $card,
- main::key($num++,'driver') => $driver,
},);
@rows = (@rows,@data);
+ #if ($extra > 2 && $b_pci_tool && $row[11]){
+ # my $item = main::get_pci_vendor($row[4],$row[11]);
+ # $rows[$j]{main::key($num++,'model')} = $item if $item;
+ #}
+ if ($row[1] eq '0680'){
+ $rows[$j]{main::key($num++,'type')} = 'network bridge';
+ }
+ $rows[$j]{main::key($num++,'driver')} = $driver;
if ($extra > 0){
if ($row[9] && !$bsd_type){
my $version = main::get_module_version($row[9]);
@@ -9681,7 +9789,12 @@ sub card_data {
$row[8] ||= 'N/A';
# as far as I know, wifi has no port, but in case it does in future, use it
$rows[$j]{main::key($num++,'port')} = $row[8] if (!$b_wifi || ( $b_wifi && $row[8] ne 'N/A') );
- $rows[$j]{main::key($num++,'bus ID')} = (!$row[2] && !$row[3]) ? 'N/A' : "$row[2].$row[3]";
+ my $bus_id = 'N/A';
+ # note: for arm/mips we want to see the single item bus id, why not?
+ if ($row[2] && $row[3]){$bus_id = "$row[2].$row[3]"}
+ elsif ($row[2]){$bus_id = $row[2]}
+ elsif ($row[3]){$bus_id = $row[3]}
+ $rows[$j]{main::key($num++,'bus ID')} = $bus_id;
}
if ($extra > 1){
$rows[$j]{main::key($num++,'chip ID')} = $chip_id;
@@ -9699,7 +9812,8 @@ sub card_data {
#print "$row[0]\n";
}
# @rows = ();
- if (!@rows){
+ # we want to handle ARM errors in main get
+ if (!@rows && !$b_arm){
my $key = 'Message';
@data = ({
main::key($num++,$key) => main::row_defaults('pci-card-data',''),
@@ -9785,7 +9899,6 @@ sub usb_data {
if ($extra > 1){
$rows[$j]{main::key($num++,'chip ID')} = $row[2];
}
- $j = scalar @rows;
if ($show{'network-advanced'}){
if (!$bsd_type){
my (@temp,$vendor,$chip);
@@ -9801,6 +9914,7 @@ sub usb_data {
#}
@rows = (@rows,@data) if @data;
}
+ $j = scalar @rows;
}
}
}
@@ -10597,13 +10711,14 @@ sub partition_data {
$b_fake_map = 1;
($back_size,$back_used) = (7,6);
}
- if (!@partitions_working){
- @partitions_working = main::grabber("df -k 2>/dev/null");
- $b_fs = 0;
- $cols = 5 if $bsd_type ne 'darwin';
- if (my $path = main::check_program('mount')){
- @mount = main::grabber("$path 2>/dev/null");
- }
+ }
+ # busybox only supports -k and -P, openbsd, darwin
+ if (!@partitions_working){
+ @partitions_working = main::grabber("df -k 2>/dev/null");
+ $b_fs = 0;
+ $cols = 5 if !$bsd_type || $bsd_type ne 'darwin';
+ if (my $path = main::check_program('mount')){
+ @mount = main::grabber("$path 2>/dev/null");
}
}
# determine positions
@@ -10675,7 +10790,12 @@ sub partition_data {
}
if ($b_load){
if (!$bsd_type){
- $fs = (%part && $part{'fs'}) ? $part{'fs'} : $row[1];
+ if ($b_fs){
+ $fs = (%part && $part{'fs'}) ? $part{'fs'} : $row[1];
+ }
+ else {
+ $fs = get_mounts_fs($row[0],@mount);
+ }
if ($show{'label'}) {
if (%part && $part{'label'}) {
$label = $part{'label'};
@@ -10694,7 +10814,7 @@ sub partition_data {
}
}
else {
- $fs = ($b_fs) ? $row[1]: get_bsd_fs($row[0],@mount);
+ $fs = ($b_fs) ? $row[1]: get_mounts_fs($row[0],@mount);
if (@gpart && ($show{'label'} || $show{'uuid'} ) ){
my @extra = get_bsd_label_uuid("$dev_base");
if (@extra){
@@ -10755,7 +10875,7 @@ sub swap_data {
# though this can include /dev/ramzswap0. Note: you can also use /proc/swaps for this
# data, it's the same exact output as swapon -s
foreach (@working){
- next if ! /^\/dev/;
+ next if ! /^\/dev/ || /^\/dev\/(ramzwap|zram)/;
my @data = split /\s+/, $_;
my $dev_base = $data[0];
$dev_base =~ s/^\/dev\///;
@@ -10792,16 +10912,21 @@ sub swap_data {
eval $end if $b_log;
return @swap;
}
-sub get_bsd_fs {
+sub get_mounts_fs {
eval $start if $b_log;
my ($item,@mount) = @_;
- $item =~ s/map:\/(\S+)/map $1/ if $bsd_type eq 'darwin';
+ $item =~ s/map:\/(\S+)/map $1/ if $bsd_type && $bsd_type eq 'darwin';
return 'N/A' if ! @mount;
my ($fs) = ('');
# linux: /dev/sdb6 on /var/www/m type ext4 (rw,relatime,data=ordered)
+ # /dev/sda3 on /root.dev/ugw type ext3 (rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=journal)
# bsd: /dev/ada0s1a on / (ufs, local, soft-updates)
foreach (@mount){
- if ($_ =~ /^$item\son.*\(([^,\s\)]+)[,\s]*.*\)/){
+ if ($bsd_type && $_ =~ /^$item\son.*\(([^,\s\)]+)[,\s]*.*\)/){
+ $fs = $1;
+ last;
+ }
+ elsif (!$bsd_type && $_ =~ /^$item\son.*\stype\s([\S]+)\s\([^\)]+\)/){
$fs = $1;
last;
}
@@ -10950,8 +11075,8 @@ sub get_root {
my $temp = Cwd::abs_path($path);
$path = $temp if $temp;
# note: it's a kernel config option to have /dev/root be a sym link
- # or not, if it isn't, path will be empty, if so, then try mount
- if (!$path && (my $program = main::check_program('mount'))){
+ # or not, if it isn't, path will remain /dev/root, if so, then try mount
+ if ($path eq '/dev/root' && (my $program = main::check_program('mount'))){
my @data = main::grabber("$program 2>/dev/null");
# /dev/sda2 on / type ext4 (rw,noatime,data=ordered)
foreach (@data){
@@ -11175,10 +11300,11 @@ sub create_output {
my $driver = ($row{'driver'}) ? $row{'driver'}: 'N/A';
@data = ({
main::key($num++,'Hardware') => $device,
- main::key($num++,'driver') => $driver,
});
@rows = (@rows,@data);
$j = scalar @rows - 1;
+ $rows[$j]{main::key($num++,'vendor')} = $row{'vendor'} if $row{'vendor'};
+ $rows[$j]{main::key($num++,'driver')} = $driver;
if ($extra > 0){
my $driver_version = ($row{'driver-version'}) ? $row{'driver-version'}: 'N/A' ;
$rows[$j]{main::key($num++,'v')} = $driver_version;
@@ -11417,13 +11543,16 @@ sub raid_data {
# 10 modules
sub hardware_raid {
eval $start if $b_log;
- my ($driver,@data,@working);
+ my ($driver,$vendor,@data,@working);
foreach my $ref (@pci){
@working = @$ref;
next if $working[1] ne '0104';
$driver = ($working[9]) ? lc($working[9]): '';
$driver =~ s/-/_/g if $driver;
my $driver_version = ($driver) ? main::get_module_version($driver): '';
+ if ($extra > 2 && $b_pci_tool && $working[11]){
+ $vendor = main::get_pci_vendor($working[4],$working[11]);
+ }
@data = ({
'bus-id' => $working[2],
'chip-id' => $working[6],
@@ -11434,6 +11563,7 @@ sub hardware_raid {
'rev' => $working[7],
'sub-id' => $working[3],
'vendor-id' => $working[5],
+ 'vendor' => $vendor,
});
@hardware_raid = (@hardware_raid,@data);
}
@@ -12327,7 +12457,8 @@ sub get_repos_linux {
push @files, $apt;
main::log_data('data',"apt repo files:\n" . main::joiner(\@files, "\n", 'unset') ) if $b_log;
foreach ( sort @files){
- @data = repo_builder($_,'apt','^\s*deb') if -r $_;
+ # altlinux uses rpms in apt files!
+ @data = repo_builder($_,'apt','^\s*(deb|rpm)') if -r $_;
@rows = (@rows,@data);
}
#@files = main::globber("$ENV{'HOME'}/bin/scripts/inxi/data/repo/apt/*.sources");
@@ -13010,7 +13141,7 @@ sub get {
@rows = (@rows,@data);
}
else {
- %sensors = sensors_data();
+ %sensors = lm_sensors_data();
@data = create_output($source,%sensors);
#print "here 2\n";
if (!@data) {
@@ -13063,6 +13194,10 @@ sub create_output {
my $psu_temp = $sensors{'psu-temp'} . $temp_unit;
$rows[$j]{main::key($num++,'psu')} = $psu_temp;
}
+ if (defined $sensors{'ambient-temp'}){
+ my $ambient_temp = $sensors{'ambient-temp'} . $temp_unit;
+ $rows[$j]{main::key($num++,'ambient')} = $ambient_temp;
+ }
if (scalar @gpu == 1){
my $gpu_temp = $gpu[0]{'temp'};
my $gpu_type = $gpu[0]{'type'};
@@ -13109,6 +13244,9 @@ sub create_output {
$rows[$j]{main::key($num++,"fan-$i")} = $fan_default[$i];
}
}
+ $rows[$j]{main::key($num++,'psu')} = $sensors{'fan-psu'} if defined $sensors{'fan-psu'};
+ $rows[$j]{main::key($num++,'psu-1')} = $sensors{'fan-psu1'} if defined $sensors{'fan-psu1'};
+ $rows[$j]{main::key($num++,'psu-2')} = $sensors{'fan-psu2'} if defined $sensors{'fan-psu2'};
# note: so far, only nvidia-settings returns speed, and that's in percent
if (scalar @gpu == 1 && defined $gpu[0]{'fan-speed'}){
my $gpu_fan = $gpu[0]{'fan-speed'} . $gpu[0]{'speed-unit'};
@@ -13165,7 +13303,7 @@ sub ipmi_data {
my ($program) = @_;
my ($b_cpu_0,$cmd,$file,@data,$fan_working,%sensors,@row,$sys_fan_nu,
$temp_working,$working_unit);
- $program ||= 'ipmi-xx'; # only for debugging, will always exist if reaches here
+ $program ||= 'ipmi-sensors'; # only for debugging, will always exist if reaches here
my ($b_ipmitool,$i_key,$i_value,$i_unit);
if ($program =~ /ipmi-sensors$/){
$cmd = $program;
@@ -13180,30 +13318,39 @@ sub ipmi_data {
#$file = "$ENV{'HOME'}/bin/scripts/inxi/data/ipmitool/ipmitool-sensors-crazy-epyc-1.txt";
#$file = "$ENV{'HOME'}/bin/scripts/inxi/data/ipmitool/ipmi-sensors-crazy-epyc-1.txt";$program='ipmi-sensors';
#$file = "$ENV{'HOME'}/bin/scripts/inxi/data/ipmitool/ipmitool-sensors-RK016013.txt";$program='ipmi-sensors';
+ #$file = "$ENV{'HOME'}/bin/scripts/inxi/data/ipmitool/ipmi-sensors-lathander.txt";
+ #$file = "$ENV{'HOME'}/bin/scripts/inxi/data/ipmitool/ipmi-sensors-zwerg.txt";
#@data = main::reader($file);
return if ! @data;
foreach (@data){
next if /^\s*$/;
- #print "$_\n";
+ # print "$_\n";
@row = split /\s*\|\s*/, $_;
- # print "$row[$i_key] $row[$i_value]\n";
- if ($row[$i_key] =~ /^System[\s_]Temp/i){
+ next if $row[$i_value] !~ /^[0-9\.]+$/i;
+ # print "$row[$i_key] - $row[$i_value]\n";
+ if ($row[$i_key] =~ /^(System[\s_]Temp|System[\s_]?Board)$/i){
$sensors{'mobo-temp'} = int($row[$i_value]);
$working_unit = $row[$i_unit];
$working_unit =~ s/degrees\s// if $b_ipmitool;
$sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
}
+ elsif ($row[$i_key] =~ /^(Ambient)$/i){
+ $sensors{'ambient-temp'} = int($row[$i_value]);
+ $working_unit = $row[$i_unit];
+ $working_unit =~ s/degrees\s// if $b_ipmitool;
+ $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
+ }
# Platform Control Hub (PCH), it is the X370 chip on the Crosshair VI Hero.
# VRM: voltage regulator module
- # NOTE: CPU0_TEMP CPU1_TEMP is possible, unfortunately
- elsif ( !$sensors{'cpu-temp'} && $row[$i_key] =~ /^CPU([01])?[\s_]Temp/i) {
+ # NOTE: CPU0_TEMP CPU1_TEMP is possible, unfortunately; CPU Temp Interf
+ elsif ( !$sensors{'cpu-temp'} && $row[$i_key] =~ /^CPU([01])?([\s_]Temp)?$/i) {
$b_cpu_0 = 1 if defined $1 && $1 == 0;
$sensors{'cpu-temp'} = int($row[$i_value]);
$working_unit = $row[$i_unit];
$working_unit =~ s/degrees\s// if $b_ipmitool;
$sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
}
- elsif ($row[$i_key] =~ /^CPU([1-4])[\s_]Temp/i) {
+ elsif ($row[$i_key] =~ /^CPU([1-4])([\s_]Temp)?$/i) {
$temp_working = $1;
$temp_working++ if $b_cpu_0;
$sensors{"cpu${temp_working}-temp"} = int($row[$i_value]);
@@ -13240,6 +13387,12 @@ sub ipmi_data {
}
$sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
}
+ elsif (!$sensors{'sodimm-temp'} && $row[$i_key] =~ /^(DIMM-[0-9][A-Z]?)$/i){
+ $sensors{'sodimm-temp'} = int($row[$i_value]);
+ $working_unit = $row[$i_unit];
+ $working_unit =~ s/degrees\s// if $b_ipmitool;
+ $sensors{'temp-unit'} = set_temp_unit($sensors{'temp-unit'},$working_unit) if $working_unit;
+ }
# note: can be cpu fan:, cpu fan speed:, etc.
elsif ($row[$i_key] =~ /^(CPU|Processor)[\s_]Fan/i) {
$sensors{'fan-main'} = () if !$sensors{'fan-main'};
@@ -13248,7 +13401,7 @@ sub ipmi_data {
# 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 are 1/2/3
- elsif ($row[$i_key] =~ /^(SYS[\s_])?FAN([0-9A-F]+)/i) {
+ elsif ($row[$i_key] =~ /^(SYS[\s_])?FAN[\s_]?([0-9A-F]+)/i) {
$sys_fan_nu = hex($2);
next if $row[$i_value] !~ /^[0-9\.]+$/;
$fan_working = int($row[$i_value]);
@@ -13265,24 +13418,33 @@ sub ipmi_data {
}
}
}
+ elsif ($row[$i_key] =~ /^(FAN PSU|PSU FAN)$/i) {
+ $sensors{'fan-psu'} = int($row[$i_value]);
+ }
+ elsif ($row[$i_key] =~ /^(FAN PSU1|PSU1 FAN)$/i) {
+ $sensors{'fan-psu-1'} = int($row[$i_value]);
+ }
+ elsif ($row[$i_key] =~ /^(FAN PSU2|PSU2 FAN)$/i) {
+ $sensors{'fan-psu-2'} = int($row[$i_value]);
+ }
if ($extra > 0){
- if ($row[$i_key] =~ /^(P[_]?)?12V$/i) {
+ if ($row[$i_key] =~ /^(MAIN\s|P[_]?)?12V$/i) {
$sensors{'volts-12'} = $row[$i_value];
}
- elsif ($row[$i_key] =~ /^(P5V|5VCC)$/i) {
+ elsif ($row[$i_key] =~ /^(MAIN\s5V|P5V|5VCC|5V PG)$/i) {
$sensors{'volts-5'} = $row[$i_value];
}
- elsif ($row[$i_key] =~ /^(P3V3|3.3VCC)$/i) {
+ elsif ($row[$i_key] =~ /^(MAIN\s3.3V|P3V3|3.3VCC|3.3V PG)$/i) {
$sensors{'volts-3.3'} = $row[$i_value];
}
- elsif ($row[$i_key] =~ /^(P_)?VBAT$/i) {
+ elsif ($row[$i_key] =~ /^((P_)?VBAT|CMOS Battery|BATT 3.0V)$/i) {
$sensors{'volts-vbat'} = $row[$i_value];
}
# NOTE: VDimmP1ABC VDimmP1DEF
- elsif (!$sensors{'volts-dimm-p1'} && $row[$i_key] =~ /^(P1_VMEM|VDimmP1)/i) {
+ elsif (!$sensors{'volts-dimm-p1'} && $row[$i_key] =~ /^(P1_VMEM|VDimmP1|MEM RSR A PG)/i) {
$sensors{'volts-dimm-p1'} = $row[$i_value];
}
- elsif (! $sensors{'volts-dimm-p2'} && $row[$i_key] =~ /^(P2_VMEM|VDimmP2)/i) {
+ elsif (! $sensors{'volts-dimm-p2'} && $row[$i_key] =~ /^(P2_VMEM|VDimmP2|MEM RSR B PG)/i) {
$sensors{'volts-dimm-p2'} = $row[$i_value];
}
elsif (!$sensors{'volts-soc-p1'} && $row[$i_key] =~ /^(P1_SOC_RUN$)/i) {
@@ -13300,27 +13462,28 @@ sub ipmi_data {
# print Data::Dumper::Dumper \%sensors;
return %sensors;
}
-sub sensors_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";
#@sensors_data = main::reader($file);
- @sensors_data = main::grabber(main::check_program('sensors') . " 2>/dev/null");
#print @sensors_data;
@sensors_data = map {$_ =~ s/\s*:\s*\+?/:/;$_} @sensors_data;
foreach (@sensors_data){
# we get this from gpu_data()
- if (/^(amdgpu|intel|nouveau|radeon)-pci/){
+ if (/^(amdgpu|intel|nouveau|radeon|.*hwmon)-pci/){
$b_valid = 0;
$adapter = '';
next;
}
- if (/^(?:(?!amdgpu|intel|nouveau|radeon).)*-(isa|pci|virtual)-/){
+ if (/^(?:(?!amdgpu|intel|nouveau|radeon|.*hwmon).)*-(isa|pci|virtual)-/){
$b_valid = 1;
$adapter = $1;
next;
@@ -13710,13 +13873,18 @@ sub data_processor {
%sensors = ();
}
else {
- my ($psu_temp,$sodimm_temp,$v_12,$v_5,$v_3_3,$v_dimm_p1,$v_dimm_p2,$v_soc_p1,$v_soc_p2,$v_vbat);
+ my ($ambient_temp,$psu_fan,$psu1_fan,$psu2_fan,$psu_temp,$sodimm_temp,
+ $v_12,$v_5,$v_3_3,$v_dimm_p1,$v_dimm_p2,$v_soc_p1,$v_soc_p2,$v_vbat);
$psu_temp = $sensors{'psu-temp'} if $sensors{'psu-temp'};
# sodimm fan is fan_main[4]
$sodimm_temp = $sensors{'sodimm-temp'} if $sensors{'sodimm-temp'};
$cpu2_temp = $sensors{'cpu2-temp'} if $sensors{'cpu2-temp'};
$cpu3_temp = $sensors{'cpu3-temp'} if $sensors{'cpu3-temp'};
$cpu4_temp = $sensors{'cpu4-temp'} if $sensors{'cpu4-temp'};
+ $ambient_temp = $sensors{'ambient-temp'} if $sensors{'ambient-temp'};
+ $psu_fan = $sensors{'fan-psu'} if $sensors{'fan-psu'};
+ $psu1_fan = $sensors{'fan-psu-1'} if $sensors{'fan-psu-1'};
+ $psu2_fan = $sensors{'fan-psu-2'} if $sensors{'fan-psu-2'};
# so far only for ipmi, sensors data is junk for volts
if ($extra > 0 &&
($sensors{'volts-12'} || $sensors{'volts-5'} || $sensors{'volts-3.3'} || $sensors{'volts-vbat'}) ){
@@ -13730,6 +13898,7 @@ sub data_processor {
$v_soc_p2 = $sensors{'volts-soc-p2'} if $sensors{'volts-soc-p2'};
}
%sensors = (
+ 'ambient-temp' => $ambient_temp,
'cpu-temp' => $cpu_temp,
'cpu2-temp' => $cpu2_temp,
'cpu3-temp' => $cpu3_temp,
@@ -13739,6 +13908,9 @@ sub data_processor {
'temp-unit' => $sensors{'temp-unit'},
'fan-main' => \@fan_main,
'fan-default' => \@fan_default,
+ 'fan-psu' => $psu_fan,
+ 'fan-psu1' => $psu1_fan,
+ 'fan-psu2' => $psu2_fan,
);
if ($psu_temp){
$sensors{'psu-temp'} = $psu_temp;
@@ -13857,6 +14029,10 @@ sub gpu_data {
$holder = $1;
$j = scalar @gpudata;
}
+ if (/^(?:(?!amdgpu|.*hwmon|intel|nouveau|radeon).)*-(pci|virtual|isa)-(.*)/){
+ $b_found = 0;
+ $holder = '';
+ }
if ($b_found){
if (/^temp.*:([0-9]+).*(C|F)/){
$gpudata[$j]{'temp'} = $1;
@@ -13870,10 +14046,6 @@ sub gpu_data {
}
main::log_data('dump','sensors output: video: @gpudata',\@gpudata);
}
- if (/^(?:(?!amdgpu|intel|nouveau|radeon).)*-(pci|virtual|isa)-(.*)/){
- $b_found = 0;
- $holder = '';
- }
}
}
# we'll probably use this data elsewhere so make it a one time call
@@ -14067,7 +14239,7 @@ sub unmounted_data {
# need to exclude loop type file systems, squashfs for example
# NOTE: nvme needs special treatment because the main device is: nvme0n1
# note: $working[2] != 1 is wrong, it's not related
- if ( $working[-1] !~ /^(nvme[0-9]+n|mmcblk)[0-9]+$/ &&
+ if ( $working[-1] !~ /^(nvme[0-9]+n|mmcblk|mtdblk|mtdblock)[0-9]+$/ &&
$working[-1] =~ /[a-z][0-9]+$|dm-[0-9]+$/ && $working[-1] !~ /loop/ &&
!(grep {$working[-1] =~ /$_/} @mounted)){
%part = PartitionData::check_lsblk($working[-1],0) if (@lsblk && $working[-1]);
@@ -14881,12 +15053,14 @@ sub get_compiler_version_linux {
# 3 - toolkit version
# 4 - info extra desktop data
# 5 - wm
+# 6 - wm version
{
package DesktopEnvironment;
-my ($b_xprop,$kde_session_version,$xdg_desktop,@desktop,@data,@xprop);
+my ($b_xprop,$desktop_session,$kde_session_version,$xdg_desktop,@desktop,@data,@xprop);
sub get {
# NOTE $XDG_CURRENT_DESKTOP envvar is not reliable, but it shows certain desktops better.
# most desktops are not using it as of 2014-01-13 (KDE, UNITY, LXDE. Not Gnome)
+ $desktop_session = ( $ENV{'DESKTOP_SESSION'} ) ? lc($ENV{'DESKTOP_SESSION'}) : '';
$xdg_desktop = ( $ENV{'XDG_CURRENT_DESKTOP'} ) ? lc($ENV{'XDG_CURRENT_DESKTOP'}) : '';
$kde_session_version = ($ENV{'KDE_SESSION_VERSION'}) ? $ENV{'KDE_SESSION_VERSION'} : '';
get_kde_data();
@@ -14905,7 +15079,7 @@ sub get {
if ($extra > 2 && @desktop){
set_info_data();
}
- if ($b_display && !$b_force_display && $extra > 2){
+ if ($b_display && !$b_force_display && $extra > 1){
get_wm();
}
main::log_data('dump','@desktop', \@desktop) if $b_log;
@@ -14958,9 +15132,19 @@ sub get_kde_data {
$desktop[1] = ($kde_session_version) ? $kde_session_version: main::row_defaults('unknown-desktop-version');
}
# print Data::Dumper::Dumper \@version_data;
- if ($extra > 0 && @version_data){
+ if ($extra > 1){
+ if (@version_data){
+ $desktop[3] = main::awk(\@version_data,'^Qt:', 2,'\s+');
+ }
+ # qmake can have variants, qt4-qmake, qt5-qmake, also qt5-default but not tested
+ if (!$desktop[3] && ($program = main::check_program("qmake"))){
+ # note: this program has issues, it may appear to be in /usr/bin, but it
+ # often fails to execute, so the below will have null output, but use as a
+ # fall back test anyway.
+ @version_data = main::grabber("$program --version 2>/dev/null");
+ $desktop[3] = main::awk(\@version_data,'^Using Qt version',4) if @version_data;
+ }
$desktop[2] = 'Qt';
- $desktop[3] = main::awk(\@version_data,'^Qt:', 2,'\s+');
}
}
# KDE_FULL_SESSION property is only available since KDE 3.5.5.
@@ -14971,7 +15155,7 @@ sub get_kde_data {
if (!$desktop[1]){
$desktop[1] = '3.5';
}
- if ($extra > 0 && @version_data){
+ if ($extra > 1 && @version_data){
$desktop[2] = 'Qt';
$desktop[3] = main::awk(\@version_data,'^Qt:',2,'\s+') if @version_data;
}
@@ -14981,36 +15165,54 @@ sub get_kde_data {
sub get_env_de_data {
eval $start if $b_log;
my ($program,@version_data);
-
- if ($xdg_desktop eq 'unity'){
+ main::set_ps_gui() if ! $b_ps_gui;
+ if ($desktop_session eq 'trinity' || $xdg_desktop eq 'trinity' || (grep {/^tde/} @ps_gui) ){
+ $desktop[0] = 'Trinity';
+ if ($program = main::check_program('kdesktop')){
+ @version_data = main::grabber("$program --version 2>/dev/null");
+ $desktop[1] = main::awk(\@version_data,'^TDE:',2,'\s+') if @version_data;
+ }
+ if ($extra > 1 && @version_data){
+ $desktop[2] = 'Qt';
+ $desktop[3] = main::awk(\@version_data,'^Qt:',2,'\s+') if @version_data;
+ }
+ }
+ elsif ($xdg_desktop eq 'unity'){
@data = main::program_values('unity');
$desktop[0] = $data[3];
$desktop[0] ||= 'Unity';
$desktop[1] = main::program_version('cinnamon',$data[0],$data[1],$data[2],$data[5],$data[6]);
- set_gtk_data() if $extra > 0;
+ #set_gtk_data() if $extra > 1;
}
elsif ( $xdg_desktop =~ /budgie/ ){
@data = main::program_values('budgie');
$desktop[0] = $data[3];
$desktop[1] = main::program_version('budgie-desktop',$data[0],$data[1],$data[2],$data[5],$data[6]);
- set_gtk_data() if $extra > 0;
}
- elsif ( $xdg_desktop eq 'lxqt' ){
- @data = main::program_values('lxqt');
- $desktop[0] = $data[3];
- $desktop[0] ||= 'LXQT';
- $desktop[1] = main::program_version('lxqt-about',$data[0],$data[1],$data[2],$data[5],$data[6]);
- if ( $extra > 0 ){
- if ($program = main::check_program("kded$kde_session_version") ){
- @version_data = main::grabber("$program --version 2>/dev/null");
- $desktop[2] = 'Qt';
- $desktop[3] = main::awk(\@version_data,'^Qt:',2);
+ # debian package: lxde-core.
+ # NOTE: some distros fail to set XDG data for root
+ elsif ( $xdg_desktop =~ /^(lxde|razor|lxqt)$/ || (grep {/^(razor-session|lxsession|lxqt-session)$/} @ps_gui)){
+ # note: openbox-lxde --version may be present, but returns openbox data
+ if ($xdg_desktop eq 'lxde' || (grep {/^lxsession$/} @ps_gui )){
+ @data = main::program_values('lxde');
+ $desktop[0] = $data[3];
+ $desktop[1] = main::program_version('lxpanel',$data[0],$data[1],$data[2],$data[5],$data[6]);
+ }
+ # NOTE: lxqt-about opens a gui dialog
+ elsif ($xdg_desktop eq 'razor' || $xdg_desktop eq 'lxqt' || (grep {/^(razor-desktop|lxqt-session)$/} @ps_gui)) {
+ if (grep {/^lxqt-session$/} @ps_gui){
+ @data = main::program_values('lxqt');
+ $desktop[0] = $data[3];
+ # BAD: lxqt-about opens dialogue, sigh
+ $desktop[1] = main::program_version('lxqt-panel',$data[0],$data[1],$data[2],$data[5],$data[6]);
}
- elsif ($program = main::check_program("qtdiag") ){
- @data = main::program_values('qtdiag');
- $desktop[3] = main::program_version($program,$data[0],$data[1],$data[2],$data[5],$data[6]);
- $desktop[2] = $data[3];
+ elsif (grep {/^razor-session$/} @ps_gui){
+ $desktop[0] = 'Razor-Qt';
+ }
+ else {
+ $desktop[0] = 'LX-Qt-Variant';
}
+ set_qt_data() if $extra > 1;
}
}
# note, X-Cinnamon value strikes me as highly likely to change, so just
@@ -15019,7 +15221,13 @@ sub get_env_de_data {
@data = main::program_values('cinnamon');
$desktop[0] = $data[3];
$desktop[1] = main::program_version('cinnamon',$data[0],$data[1],$data[2],$data[5],$data[6]);
- set_gtk_data() if $extra > 0;
+ #set_gtk_data() if $extra > 1;
+ }
+ elsif ($xdg_desktop eq 'pantheon' || $desktop_session eq 'pantheon'){
+ @data = main::program_values('pantheon');
+ $desktop[0] = $data[3];
+ #$desktop[1] = main::program_version('pantheon',$data[0],$data[1],$data[2],$data[5],$data[6]);
+ #set_gtk_data() if $extra > 1;
}
eval $end if $b_log;
}
@@ -15038,7 +15246,7 @@ sub get_env_xprop_de_data {
@data = main::program_values('cinnamon');
$desktop[0] = $data[3];
$desktop[1] = main::program_version('cinnamon',$data[0],$data[1],$data[2],$data[5],$data[6]);
- set_gtk_data() if $extra > 0;
+ #set_gtk_data() if $extra > 1;
$desktop[0] ||= 'Cinnamon';
}
elsif ($xdg_desktop eq 'mate' || ( $b_xprop && main::awk(\@xprop,'_marco') )){
@@ -15046,15 +15254,12 @@ sub get_env_xprop_de_data {
if ($program = main::check_program('mate-session') ) {
$value = 'mate-session';
}
- elsif ($program = main::check_program('mate-about')) {
- $value = 'mate-about';
- }
if ($value){
@data = main::program_values($value);
$desktop[0] = $data[3];
$desktop[1] = main::program_version($program,$data[0],$data[1],$data[2],$data[5],$data[6]);
}
- set_gtk_data() if $extra > 0;
+ #set_gtk_data() if $extra > 1;
$desktop[0] ||= 'MATE';
}
# note, GNOME_DESKTOP_SESSION_ID is deprecated so we'll see how that works out
@@ -15070,7 +15275,7 @@ sub get_env_xprop_de_data {
@data = main::program_values('gnome-shell');
$desktop[1] = main::program_version('gnome-shell',$data[0],$data[1],$data[2],$data[5],$data[6]);
}
- set_gtk_data() if $extra > 0;
+ # set_gtk_data() if $extra > 1;
$desktop[0] = ( $data[3] ) ? $data[3] : 'Gnome';
}
eval $end if $b_log;
@@ -15081,7 +15286,12 @@ sub get_xprop_de_data {
#print join "\n", @xprop, "\n";
# String: "This is xfdesktop version 4.2.12"
# alternate: xfce4-about --version > xfce4-about 4.10.0 (Xfce 4.10)
- if ($xdg_desktop eq 'xfce' || main::awk(\@xprop,'xfce' )){
+ # note: some distros/wm (e.g. bunsen) set xdg to xfce to solve some other
+ # issues so don't test for that. $xdg_desktop eq 'xfce'
+ # the sequence here matters, some desktops like icewm, razor, let you set different
+ # wm, so we want to get the main controlling desktop first, then fall back to the wm
+ # detections. get_wm() will handle alternate wm detections.
+ if ((main::check_program('xfdesktop')) && main::awk(\@xprop,'^(xfdesktop|xfce)' )){
# this is a very expensive test that doesn't usually result in a find
# talk to xfce to see what id they will be using for xfce 5
# if (main::awk(\@xprop, 'xfce4')){
@@ -15111,56 +15321,13 @@ sub get_xprop_de_data {
}
$desktop[0] ||= 'Xfce';
$desktop[1] ||= ''; # xfce isn't going to be 4 forever
- if ($extra > 0){
+ if ($extra > 1){
@data = main::program_values('xfdesktop-toolkit');
#$desktop[3] = main::program_version('xfdesktop',$data[0],$data[1],$data[2],$data[5],$data[6]);
$desktop[3] = main::awk(\@version_data,$data[0],$data[1],'\s+');
$desktop[2] = $data[3];
}
}
- elsif ( (main::check_program('blackbox') || main::check_program('fluxbox')) && main::awk(\@xprop,'blackbox_pid' )){
- if (grep {/fluxbox/} @ps_cmd){
- @data = main::program_values('fluxbox');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('fluxbox',$data[0],$data[1],$data[2],$data[5],$data[6]);
- }
- else {
- @data = main::program_values('blackbox');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('blackbox',$data[0],$data[1],$data[2],$data[5],$data[6]);
- }
- }
- # debian package: lxde-core
- elsif ( (main::check_program('lxpanel') || main::check_program('lxqt-session') ||
- main::check_program('razor-session')) && main::awk(\@xprop,'openbox_pid' )){
- # note: openbox-lxde --version may be present, but returns openbox data
- @data = main::program_values('openbox');
- $desktop[1] = main::program_version('openbox',$data[0],$data[1],$data[2],$data[5],$data[6]);
- if ($xdg_desktop eq 'lxde' || main::awk(\@ps_cmd, 'lxsession')){
- $desktop[1] = "(Openbox $desktop[1])" if $desktop[1];
- $desktop[0] = 'LXDE';
- }
- elsif ($xdg_desktop eq 'razor' || $xdg_desktop eq 'lxqt' || main::awk(\@ps_cmd, 'razor-desktop|lxqt-session')) {
- if (main::awk(\@ps_cmd,'lxqt-session' )){
- $desktop[0] = 'LXQt';
- }
- elsif (main::awk(\@ps_cmd, 'razor-desktop')){
- $desktop[0] = 'Razor-Qt';
- }
- else {
- $desktop[0] = 'LX-Qt-Variant';
- }
- $desktop[1] = "(Openbox $desktop[1])" if $desktop[1];
- }
- else {
- $desktop[0] = 'Openbox';
- }
- }
- elsif (main::check_program('icewm') && main::awk(\@xprop,'icewm' )){
- @data = main::program_values('icewm');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('icewm',$data[0],$data[1],$data[2],$data[5],$data[6]);
- }
elsif (main::check_program('enlightenment') && main::awk(\@xprop,'enlightenment' )){
$desktop[0] = 'Enlightenment';
# no -v or --version but version is in xprop -root
@@ -15169,14 +15336,25 @@ sub get_xprop_de_data {
$desktop[1] = (split /"/, $desktop[1])[1] if $desktop[1];
$desktop[1] = (split /\s+/, $desktop[1])[1] if $desktop[1];
}
+ # must come right after xfce
+ elsif (main::check_program('icewm') && main::awk(\@xprop,'icewm' )){
+ @data = main::program_values('icewm');
+ $desktop[0] = $data[3];
+ $desktop[1] = main::program_version('icewm',$data[0],$data[1],$data[2],$data[5],$data[6]);
+ }
# debian package: i3-wm
elsif (main::check_program('i3') && main::awk(\@xprop,'^i3_' )){
@data = main::program_values('i3');
$desktop[0] = $data[3];
$desktop[1] = main::program_version('i3',$data[0],$data[1],$data[2],$data[5],$data[6]);
}
+ elsif (main::check_program('mwm') && main::awk(\@xprop,'^_motif' )){
+ @data = main::program_values('mwm');
+ $desktop[0] = $data[3];
+ # $desktop[1] = main::program_version('mwm',$data[0],$data[1],$data[2],$data[5],$data[6]);
+ }
# debian package name: wmaker
- elsif (main::check_program('WindowMaker') && main::awk(\@xprop,'^windowmaker' )){
+ elsif (main::check_program('WindowMaker') && main::awk(\@xprop,'^_?windowmaker' )){
@data = main::program_values('wmaker');
$desktop[0] = $data[3];
$desktop[1] = main::program_version('wmaker',$data[0],$data[1],$data[2],$data[5],$data[6]);
@@ -15191,114 +15369,208 @@ sub get_xprop_de_data {
$desktop[0] = $data[3];
$desktop[1] = main::program_version('herbstluftwm',$data[0],$data[1],$data[2],$data[5],$data[6]);
}
+ elsif ( (main::check_program('blackbox') || main::check_program('fluxbox')) && main::awk(\@xprop,'blackbox_pid' )){
+ if (@ps_gui && (grep {/^fluxbox$/} @ps_gui )){
+ @data = main::program_values('fluxbox');
+ $desktop[0] = $data[3];
+ $desktop[1] = main::program_version('fluxbox',$data[0],$data[1],$data[2],$data[5],$data[6]);
+ }
+ else {
+ @data = main::program_values('blackbox');
+ $desktop[0] = $data[3];
+ $desktop[1] = main::program_version('blackbox',$data[0],$data[1],$data[2],$data[5],$data[6]);
+ }
+ }
elsif (main::check_program('openbox') && main::awk(\@xprop,'openbox_pid' )){
@data = main::program_values('openbox');
$desktop[0] = $data[3];
$desktop[1] = main::program_version('openbox',$data[0],$data[1],$data[2],$data[5],$data[6]);
}
+ elsif (main::check_program('amiwm') && main::awk(\@xprop,'amiwm' )){
+ @data = main::program_values('amiwm');
+ $desktop[0] = $data[3];
+ #$desktop[1] = main::program_version('openbox',$data[0],$data[1],$data[2],$data[5],$data[6]);
+ }
# need to check starts line because it's so short
eval $end if $b_log;
}
sub get_ps_de_data {
eval $start if $b_log;
my ($program,@version_data);
- if ( main::check_program('fvwm-crystal') && main::awk(\@ps_cmd,'fvwm-crystal' )){
- @data = main::program_values('fvwm-crystal');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('fvwm',$data[0],$data[1],$data[2],$data[5],$data[6]);
- }
- elsif ((main::check_program('fvwm2') || main::check_program('fvwm')) && main::awk(\@ps_cmd,'fvwm' )){
- @data = main::program_values('fvwm');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('fvwm',$data[0],$data[1],$data[2],$data[5],$data[6]);
- }
- elsif (main::check_program('pekwm') && main::awk(\@ps_cmd,'pekwm' )){
- @data = main::program_values('pekwm');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('pekwm',$data[0],$data[1],$data[2],$data[5],$data[6]);
- }
- elsif (main::check_program('awesome') && main::awk(\@ps_cmd,'awesome' )){
- @data = main::program_values('awesome');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('awesome',$data[0],$data[1],$data[2],$data[5],$data[6]);
- }
- elsif (main::check_program('blackbox') && main::awk(\@ps_cmd,'blackbox' )){
- @data = main::program_values('blackbox');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('blackbox',$data[0],$data[1],$data[2],$data[5],$data[6]);
- }
- # not in debian apt
- elsif (main::check_program('scrotwm') && main::awk(\@ps_cmd,'scrotwm' )){
- @data = main::program_values('scrotwm');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('scrotwm',$data[0],$data[1],$data[2],$data[5],$data[6]);
- }
- elsif (main::check_program('spectrwm') && main::awk(\@ps_cmd,'spectrwm' )){
- @data = main::program_values('spectrwm');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('spectrwm',$data[0],$data[1],$data[2],$data[5],$data[6]);
- }
- elsif (main::check_program('twm') && main::awk(\@ps_cmd,'(\s|\/)twm' )){
- # no version
- $desktop[0] = 'Twm';
+ main::set_ps_gui() if !$b_ps_gui;
+ if (@ps_gui){
+ # 1 check program; 2 search; 3 values; 4 version; 5 -optional: print value
+ my @desktops =(
+ ['fluxbox','fluxbox','fluxbox','fluxbox'],
+ ['fvwm-crystal','fvwm-crystal','fvwm-crystal','fvwm'],
+ ['fvwm2','fvwm2','fvwm2','fvwm2'],
+ ['fvwm','fvwm','fvwm','fvwm'],
+ ['pekwm','pekwm','pekwm','pekwm'],
+ ['awesome','awesome','awesome','awesome'],
+ ['blackbox','blackbox','blackbox','blackbox'],
+ ['openbox','openbox','openbox','openbox'],
+ # not in debian apt
+ ['scrotwm','scrotwm','scrotwm','scrotwm'],
+ ['spectrwm','spectrwm','spectrwm','spectrwm'],
+ ['twm','twm','twm','twm'],
+ # note: built from source, but I assume it will show: /usr/bin/dwm
+ ['dwm','dwm','dwm','dwm'],
+ # not in debian apt, current is wmii, version 3
+ ['wmii2','wmii2','wmii2','wmii2'],
+ ['wmii','wmii','wmii','wmii'],
+ ['9wm','9wm','9wm','9wm'],
+ ['amiwm','amiwm','amiwm','amiwm'],
+ ['flwm','flwm','flwm','flwm'],
+ ['jwm','jwm','jwm','jwm'],
+ ['mwm','mwm','mwm','mwm'],
+ ['notion','notion','notion','notion'],
+ ['ratpoison','ratpoison','ratpoison','ratpoison'],
+ ['sawfish','sawfish','sawfish','sawfish'],
+ ['matchbox-window-manager','matchbox-window-manager',
+ 'matchbox-window-manager','matchbox-window-manager'],
+ ['afterstep','afterstep','afterstep','afterstep'],
+ ['WindowMaker','WindowMaker','wmaker','wmaker'],
+ ['windowlab','windowlab','windowlab','windowlab'],
+ ['xmonad','xmonad','xmonad','xmonad'],
+ );
+ foreach my $ref (@desktops){
+ my @item = @$ref;
+ # no need to use check program with short list of ps_gui
+ # if ( main::check_program($item[0]) && (grep {/^$item[1]$/} @ps_gui)){
+ if (grep {/^$item[1]$/} @ps_gui){
+ @data = main::program_values($item[2]);
+ $desktop[0] = $data[3];
+ if ($data[1] && $data[2]){
+ $desktop[1] = main::program_version($item[3],$data[0],$data[1],$data[2],$data[5],$data[6]);
+ }
+ last;
+ }
+ }
}
- # note: built from source, but I assume it will show: /usr/bin/dwm
- elsif (main::check_program('dwm') && main::awk(\@ps_cmd,'(\s|\/)dwm' )){
- @data = main::program_values('dwm');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('dwm',$data[0],$data[1],$data[2],$data[5],$data[6]);
+ eval $end if $b_log;
+}
+
+sub set_qt_data {
+ eval $start if $b_log;
+ my ($program,@data,@version_data);
+ my $kde_version = $kde_session_version;
+ $program = '';
+ if (!$kde_version){
+ if ($program = main::check_program("kded6") ){$kde_version = 6;}
+ elsif ($program = main::check_program("kded5") ){$kde_version = 5;}
+ elsif ($program = main::check_program("kded4") ){$kde_version = 4;}
+ elsif ($program = main::check_program("kded") ){$kde_version = '';}
+ }
+ # alternate: qt4-default, qt4-qmake or qt5-default, qt5-qmake
+ if (!$desktop[3] && ($program = main::check_program("qmake"))){
+ @version_data = main::grabber("$program --version 2>/dev/null");
+ $desktop[2] = 'Qt';
+ $desktop[3] = main::awk(\@version_data,'^Using Qt version',4) if @version_data;
+ }
+ if (!$desktop[3] && ($program = main::check_program("qtdiag") )){
+ @data = main::program_values('qtdiag');
+ $desktop[3] = main::program_version($program,$data[0],$data[1],$data[2],$data[5],$data[6]);
+ $desktop[2] = $data[3];
+ }
+ if (!$desktop[3] && ($program = main::check_program("kf$kde_version-config") )){
+ @version_data = main::grabber("$program --version 2>/dev/null");
+ $desktop[2] = 'Qt';
+ $desktop[3] = main::awk(\@version_data,'^Qt:',2) if @version_data;
+ }
+ # note: qt 5 does not show qt version in kded5, sigh
+ if (!$desktop[3] && ($program = main::check_program("kded$kde_version"))){
+ @version_data = main::grabber("$program --version 2>/dev/null");
+ $desktop[2] = 'Qt';
+ $desktop[3] = main::awk(\@version_data,'^Qt:',2) if @version_data;
}
- # not in debian apt, current is wmii, version 3
- elsif (main::check_program('wmii2') && main::awk(\@ps_cmd,'wmii2' )){
- @data = main::program_values('wmii2');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('wmii2',$data[0],$data[1],$data[2],$data[5],$data[6]);
+ eval $end if $b_log;
+}
+
+sub get_wm {
+ eval $start if $b_log;
+ if (!$b_wmctrl) {
+ get_wm_main();
}
- elsif (main::check_program('wmii') && main::awk(\@ps_cmd,'wmii' )){
- @data = main::program_values('wmii');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('wmii',$data[0],$data[1],$data[2],$data[5],$data[6]);
+ if ( (!$desktop[5] || $b_wmctrl) && (my $program = main::check_program('wmctrl'))){
+ get_wm_wmctrl($program);
}
- elsif (main::check_program('jwm') && main::awk(\@ps_cmd,'(\s|\/)jwm' )){
- @data = main::program_values('jwm');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('jwm',$data[0],$data[1],$data[2],$data[5],$data[6]);
+ eval $end if $b_log;
+}
+sub get_wm_main {
+ eval $start if $b_log;
+ my ($wms,$working);
+ # xprop is set only if not kde/gnome/cinnamon/mate/budgie/lx..
+ if ($b_xprop){
+ #KWIN_RUNNING
+ $wms = 'blackbox|compiz|kwin_wayland|kwin_x11|kwin|marco|muffin|';
+ $wms .= 'openbox|herbstluftwm|twin|wm2|windowmaker|i3';
+ foreach (@xprop){
+ if (/\b($wms)\b/){
+ $working = $1;
+ $working = 'wmaker' if $working eq 'windowmaker';
+ last;
+ }
+ }
}
- elsif (main::check_program('sawfish') && main::awk(\@ps_cmd,'sawfish' )){
- @data = main::program_values('sawfish');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('sawfish',$data[0],$data[1],$data[2],$data[5],$data[6]);
+ if (!$desktop[5]){
+ main::set_ps_gui() if ! $b_ps_gui;
+ # order matters, see above logic
+ $wms = '9wm|afterstep|amiwm|awesome|budgie-wm|compiz|fluxbox|blackbox|dwm|';
+ $wms .= 'flwm|fvwm-crystal|fvwm2|fvwm|gala|gnome-shell|i3|jwm|';
+ $wms .= 'twin|kwin_wayland|kwin_x11|kwin|matchbox-window-manager|marco|';
+ $wms .= 'muffin|mutter|metacity|mwm|notion|openbox|ratpoison|sawfish|scrotwm|spectrwm|';
+ $wms .= 'twm|windowlab|WindowMaker|wm2|wmii2|wmii|xfwm4|xfwm5|xmonad';
+ foreach (@ps_gui){
+ if (/^($wms)$/){
+ $working = $1;
+ last;
+ }
+ }
}
- elsif ( main::check_program('afterstep') && grep {/afterstep/} @ps_cmd){
- @data = main::program_values('afterstep');
- $desktop[0] = $data[3];
- $desktop[1] = main::program_version('afterstep',$data[0],$data[1],$data[2],$data[5],$data[6]);
+ get_wm_version('manual',$working) if $working;
+ $desktop[5] = $working if !$desktop[5] && $working;
+ eval $end if $b_log;
+}
+sub get_wm_wmctrl {
+ eval $start if $b_log;
+ my ($program) = @_;
+ my $cmd = "$program -m 2>/dev/null";
+ my @data = main::grabber($cmd,'','strip');
+ main::log_data('dump','@data',\@data) if $b_log;
+ $desktop[5] = main::awk(\@data,'^Name',2,'\s*:\s*');
+ $desktop[5] = '' if $desktop[5] && $desktop[5] eq 'N/A';
+ if ($desktop[5]){
+ # variants: gnome shell;
+ # IceWM 1.3.8 (Linux 3.2.0-4-amd64/i686) ; Metacity (Marco) ; Xfwm4
+ $desktop[5] =~ s/\d+\.\d\S+|[\[\(].*\d+\.\d.*[\)\]]//g;
+ $desktop[5] = main::trimmer($desktop[5]);
+ # change Metacity (Marco) to marco
+ if ($desktop[5] =~ /marco/i) {$desktop[5] = 'marco'}
+ elsif (lc($desktop[5]) eq 'gnome shell') {$desktop[5] = 'gnome-shell'}
+ elsif ($desktop_session eq 'trinity' && lc($desktop[5]) eq 'kwin') {$desktop[5] = 'Twin'}
+ get_wm_version('wmctrl',$desktop[5]);
}
eval $end if $b_log;
}
-
-sub get_wm {
+sub get_wm_version {
eval $start if $b_log;
- if ( my $program = main::check_program('wmctrl') ){
- my $cmd = "$program -m 2>/dev/null";
- my @data = main::grabber($cmd,'','strip');
- main::log_data('dump','@data',\@data) if $b_log;
- $desktop[5] = main::awk(\@data,'^Name',2,'\s*:\s*');
- if ($desktop[5]){
- # variants: gnome shell;
- # IceWM 1.3.8 (Linux 3.2.0-4-amd64/i686) ; Metacity (Marco) ; Xfwm4
- $desktop[5] =~ s/\d+\.\d\S+|[\[\(].*\d+\.\d.*[\)\]]//g;
- $desktop[5] = main::trimmer($desktop[5]);
-# my $temp = (split /\s+/, $desktop[5])[0];
-# if ($temp){
-# $temp = lc($temp);
-# @data = main::program_values($temp);
-# # print Data::Dumper::Dumper \@data;
-# if (@data){
-# my $version = main::program_version($temp,$data[0],$data[1],$data[2],$data[5],$data[6]);
-# $desktop[5] .= ' ' . $version if $version;
-# }
-# }
+ my ($type,$wm) = @_;
+ # we don't want the gnome-shell version, and the others have no --version
+ # we also don't want to run --version again on stuff we already have tested
+ return if ! $wm || $wm =~ /^(budgie-wm|gnome-shell)$/ || ($desktop[0] && lc($desktop[0]) eq lc($wm) );
+ my $temp = (split /\s+/, $wm)[0];
+ if ($temp){
+ $temp = (split /\s+/, $temp)[0];
+ $temp = lc($temp);
+ $temp = 'wmaker' if $temp eq 'windowmaker';
+ my @data = main::program_values($temp);
+ return if !@data;
+ # print Data::Dumper::Dumper \@data;
+ $desktop[5] = $data[3] if $type eq 'manual';
+ # note: if values returns 0 for 1 and 2, it doesn't support versioning
+ if ($extra > 2 && $data[1] && $data[2]){
+ my $version = main::program_version($temp,$data[0],$data[1],$data[2],$data[5],$data[6]);
+ $desktop[6] = $version if $version;
}
}
eval $end if $b_log;
@@ -15373,9 +15645,10 @@ sub set_gtk_data {
sub set_info_data {
eval $start if $b_log;
my (@data,@info,$item);
- my $pattern = 'gnome-shell|gnome-panel|kicker|lxpanel|mate-panel|';
- $pattern .= 'plasma-desktop|plasma-netbook|xfce4-panel';
- if (@data = grep {/($pattern)(\s|$)/} @ps_cmd ) {
+ my $pattern = 'gnome-panel|kicker|lxpanel|lxqt-panel|matchbox-panel|';
+ $pattern .= 'mate-panel|plasma-desktop|plasma-netbook|razor-panel|razorqt-panel|';
+ $pattern .= 'wingpanel|xfce4-panel|xfce5-panel';
+ if (@data = grep {/^($pattern)$/} @ps_gui ) {
# only one entry per type, can be multiple
foreach $item (@data){
if (! grep {$item =~ /$_/} @info){
@@ -15395,8 +15668,10 @@ sub set_xprop {
@xprop = main::grabber("xprop -root $display_opt 2>/dev/null");
if (@xprop){
# add wm / de as required, but only add what is really tested for above
- my $pattern = 'blackbox_pid|enlightenment|^_gnome|herbstluftwm|';
- $pattern .= '^i3_|icewm|_marco|_muffin|openbox_pid|^windowmaker|^_wm2|xfce';
+ # XFDESKTOP_IMAGE_FILE; XFCE_DESKTOP
+ my $pattern = '^amiwm|blackbox_pid|compiz|enlightenment|^_gnome|herbstluftwm|';
+ $pattern .= '^kwin_|^i3_|icewm|_marco|^_motif|_muffin|openbox_pid|';
+ $pattern .= '^_?windowmaker|^_wm2|^(xfdesktop|xfce)';
# let's only do these searches once
@xprop = grep {/^\S/ && /($pattern)/i} @xprop;
$_ = lc for @xprop;
@@ -15461,7 +15736,7 @@ sub get_display_manager {
# unknown dm, so we'll keep output to N/A
log_data('dump','display manager: @found',\@found) if $b_log;
eval $end if $b_log;
- return join ',', @found if @found;
+ return join ', ', @found if @found;
}
## Get DistroData
@@ -15504,17 +15779,19 @@ sub get_linux_distro {
eval $start if $b_log;
my ($distro,$distro_id,$distro_file,$system_base) = ('','','','');
my ($b_issue,$b_osr,$b_use_issue,@working);
+ # order matters!
my @derived = qw(antix-version aptosid-version kanotix-version knoppix-version
- mandrake-release manjaro-release mx-version pardus-release porteus-version sabayon-release
- siduction-version sidux-version slitaz-release solusos-release turbolinux-release
- zenwalk-version);
+ pclinuxos-release mandrake-release manjaro-release mx-version pardus-release
+ porteus-version sabayon-release siduction-version sidux-version slitaz-release
+ solusos-release turbolinux-release zenwalk-version);
my $derived_s = join "|", @derived;
- my @primary = qw(arch-release gentoo-release redhat-release slackware-version
+ my @primary = qw(altlinux-release arch-release gentoo-release redhat-release slackware-version
SuSE-release);
my $primary_s = join "|", @primary;
my $exclude_s = 'debian_version|devuan_version|ubuntu_version';
+ # note, pclinuxos has all these mandrake/mandriva files, careful!
my $lsb_good_s = 'mandrake-release|mandriva-release|mandrakelinux-release|manjaro-release';
- my $os_release_good_s = 'arch-release|rpi-issue|SuSE-release';
+ my $os_release_good_s = 'altlinux-release|arch-release|pclinuxos-release|rpi-issue|SuSE-release';
# note: always exceptions, so wild card after release/version:
# /etc/lsb-release-crunchbang
# wait to handle since crunchbang file is one of the few in the world that
@@ -15522,38 +15799,34 @@ sub get_linux_distro {
my @distro_files = main::globber('/etc/*[-_]{[rR]elease,[vV]ersion,issue}*');
my $lsb_release = '/etc/lsb-release';
my $b_lsb = 1 if -f $lsb_release;
- my ($etc_issue,$issue) = ('','/etc/issue');
+ my ($etc_issue,$issue,$lc_issue) = ('','/etc/issue','');
$b_issue = 1 if -f $issue;
# note: OpenSuse Tumbleweed 2018-05 has made /etc/issue created by sym link to /run/issue
# and then made that resulting file 700 permissions, which is obviously a mistake
$etc_issue = (main::reader($issue))[0] if -r $issue;
+ $etc_issue = main::clean_characters($etc_issue);
my $os_release = '/etc/os-release';
@osr = main::reader($os_release) if -r $os_release;
# debian issue can end with weird escapes like \n \l
# antergos: Antergos Linux \r (\l)
if ($etc_issue){
- $etc_issue = main::clean_characters($etc_issue);
- if ($etc_issue =~ /antergos/i){
- $distro_id = 'antergos';
+ $lc_issue = lc($etc_issue) if $etc_issue;
+ if ($lc_issue =~ /(antergos|grml|linux lite)/){
+ $distro_id = $1;
$b_use_issue = 1;
}
- if (lc($etc_issue) =~ /(raspbian|peppermint)/){
+ elsif ($lc_issue =~ /(raspbian|peppermint)/){
$distro_id = $1;
$distro_file = $os_release if @osr;
}
- elsif (lc($etc_issue) =~ /(grml)/){
- $distro_id = $1;
- $b_use_issue = 1;
- }
}
# Note that antergos changed this around # 2018-05, and now lists
# antergos in os-release, sigh... We want these distros to use os-release
# if it contains their names. Last check below
- if ( @osr && (grep {/manjaro|antergos|chakra/i} @osr ) ){
+ if ( @osr && (grep {/manjaro|antergos|chakra|pclinuxos/i} @osr ) ){
$distro_file = $os_release;
#$system_base = 'Arch Linux';
}
-
$distro_id = 'armbian' if grep {/armbian/} @distro_files;
main::log_data('dump','@distro_files',\@distro_files) if $b_log;
main::log_data('data',"distro_file-1: $distro_file") if $b_log;
@@ -15577,12 +15850,12 @@ sub get_linux_distro {
# if so, use lsb-release, if not, then just use the found file
# this is for only those distro's with self named release/version files
# because Mint does not use such, it must be done as below
- if ($b_lsb && $file =~ /$lsb_good_s/){
- $distro_file = $lsb_release;
- }
- elsif (@osr && $file =~ /($os_release_good_s)$/){
+ if (@osr && $file =~ /($os_release_good_s)$/){
$distro_file = $os_release;
}
+ elsif ($b_lsb && $file =~ /$lsb_good_s/){
+ $distro_file = $lsb_release;
+ }
else {
$distro_file = "/etc/$file";
}
@@ -15629,7 +15902,7 @@ sub get_linux_distro {
}
# otherwise try the default debian/ubuntu /etc/issue file
elsif ($b_issue){
- if ( !$distro_id && $etc_issue && lc($etc_issue) =~ /(mint|lmde)/ ){
+ if ( !$distro_id && $etc_issue && $lc_issue =~ /(mint|lmde)/ ){
$distro_id = $1;
$b_use_issue = 1;
}
@@ -15684,22 +15957,34 @@ sub get_linux_distro {
}
}
if ($extra > 0){
- my $base_default = 'antix-version|mx-version';
- my $base_issue = 'bunsen';
- my $base_manual = 'kali';
- my $base_osr = 'aptosid|grml|siduction';
- if (@osr){
+ my $base_default = 'antix-version|mx-version'; # osr has base ids
+ my $base_issue = 'bunsen'; # base only found in issue
+ my $base_manual = 'kali'; # synthesize, no direct data available
+ my $base_osr = 'aptosid|grml|siduction'; # osr base, distro id in list of distro files
+ my $base_osr_issue = 'grml|linux lite'; # osr base, distro id in issue
+ my $base_upstream_lsb = '/etc/upstream-release/lsb-release';
+ my $base_upstream_osr = '/etc/upstream-release/os-release';
+ # first: try, some distros have upstream-release, elementary, new mint
+ # and anyone else who uses this method for fallback ID
+ if ( -r $base_upstream_osr){
+ my @osr_working = main::reader($base_upstream_osr);
+ if ( @osr_working){
+ my (@osr_temp);
+ @osr_temp = @osr;
+ @osr = @osr_working;
+ $system_base = get_os_release();
+ @osr = @osr_temp if !$system_base;
+ (@osr_temp,@osr_working) = (undef,undef);
+ }
+ }
+ elsif ( -r $base_upstream_lsb){
+ $system_base = get_lsb_release($base_upstream_lsb);
+ }
+ if (!$system_base && @osr){
my ($base_type) = ('');
if ($etc_issue && (grep {/($base_issue)/i} @osr)){
$system_base = $etc_issue;
}
- elsif ($etc_issue && lc($etc_issue) =~ /($base_manual)/){
- my $id = $1;
- my %manual = (
- 'kali' => 'Debian testing',
- );
- $system_base = $manual{$id};
- }
# more tests added here for other ubuntu derived distros
elsif ( @distro_files && (grep {/($base_default)/} @distro_files) ){
$base_type = 'default';
@@ -15707,13 +15992,22 @@ sub get_linux_distro {
elsif ($distro_id && $distro_id =~ /(mint)/){
$base_type = 'ubuntu';
}
- elsif (@distro_files && (grep {/($base_osr)/} @distro_files) && !(grep {/($base_osr)/i} @osr)){
+ elsif ( ( ($distro_id && $distro_id =~ /($base_osr_issue)/ ) ||
+ (@distro_files && (grep {/($base_osr)/} @distro_files)) ) &&
+ !(grep {/($base_osr)/i} @osr)){
$system_base = get_os_release();
}
if (!$system_base && $base_type){
$system_base = get_os_release($base_type);
}
}
+ if (!$system_base && $lc_issue && $lc_issue =~ /($base_manual)/){
+ my $id = $1;
+ my %manual = (
+ 'kali' => 'Debian testing',
+ );
+ $system_base = $manual{$id};
+ }
}
$distro =~ s/Debian/Armbian/ if ($distro && $distro_id eq 'armbian');
## finally, if all else has failed, give up
@@ -15724,8 +16018,10 @@ sub get_linux_distro {
sub get_lsb_release {
eval $start if $b_log;
+ my ($lsb_file) = @_;
+ $lsb_file ||= '/etc/lsb-release';
my ($distro,$id,$release,$codename,$description) = ('','','','','');
- my @content = main::reader('/etc/lsb-release');
+ my @content = main::reader($lsb_file);
main::log_data('dump','@content',\@content) if $b_log;
@content = map {s/,|\*|\\||\"|[:\47]|^\s+|\s+$|n\/a//ig; $_} @content if @content;
foreach (@content){
@@ -15906,6 +16202,28 @@ sub get_gcc_data {
eval $end if $b_log;
return @gccs;
}
+# rasberry pi only
+sub get_gpu_ram_arm {
+ eval $start if $b_log;
+ my ($gpu_ram) = (0);
+ if (my $program = check_program('vcgencmd')){
+ # gpu=128M
+ # "VCHI initialization failed" - you need to add video group to your user
+ my $working = (grabber("$program get_mem gpu 2>/dev/null"))[0];
+ $working = (split /\s*=\s*/, $working)[1] if $working;
+ $gpu_ram = translate_size($working) if $working;
+ }
+ log_data('data',"gpu ram: $gpu_ram") if $b_log;
+ eval $end if $b_log;
+ return $gpu_ram;
+}
+# standard systems
+sub get_gpu_ram {
+ eval $start if $b_log;
+ my ($gpu_ram) = (0);
+ eval $end if $b_log;
+ return $gpu_ram;
+}
sub get_hostname {
eval $start if $b_log;
@@ -16066,9 +16384,7 @@ sub get_memory_data {
sub get_memory_data_linux {
eval $start if $b_log;
my ($type,$file) = @_;
- my $memory = '';
- my $total = 0;
- my $not_used = 0;
+ my ($gpu,$memory,$not_used,$total) = (0,'',0,0);
my @data = reader($file);
foreach (@data){
if ($_ =~ /^MemTotal:/){
@@ -16078,14 +16394,17 @@ sub get_memory_data_linux {
$not_used += get_piece($_,2);
}
}
- my $used = $total - $not_used;
+ $gpu = get_gpu_ram_arm() if $b_arm;
+ #$gpu = translate_size('128M');
+ $total += $gpu;
+ my $used = $total - ($not_used);
my $percent = ($used && $total) ? sprintf("%.1f", ($used/$total)*100) : '';
if ($type eq 'string'){
$percent = " ($percent%)" if $percent;
$memory = sprintf("%.1f/%.1f MiB", $used/1024, $total/1024) . $percent;
}
else {
- $memory = "$total:$used:$percent";
+ $memory = "$total:$used:$percent:$gpu";
}
log_data('data',"memory: $memory") if $b_log;
eval $end if $b_log;
@@ -16181,7 +16500,7 @@ sub get_memory_data_bsd {
$memory = "$used/$real_mem MB" . $percent;
}
else {
- $memory = "$real_mem:$used:$percent";
+ $memory = "$real_mem:$used:$percent:0";
}
}
eval $end if $b_log;
@@ -16212,6 +16531,26 @@ sub get_module_version {
return $version;
}
+# args: 1 - pci device string; 2 - pci cleaned subsystem string
+sub get_pci_vendor {
+ eval $start if $b_log;
+ my ($device, $subsystem) = @_;
+ return if !$subsystem;
+ my ($vendor,$sep) = ('','');
+ my @data = split /\s+/, $subsystem;
+ foreach (@data){
+ if ($device !~ !/\b$_\b/){
+ $vendor .= $sep . $_;
+ $sep = ' ';
+ }
+ else {
+ last;
+ }
+ }
+ eval $end if $b_log;
+ return $vendor;
+}
+
# # check? /var/run/nologin for bsds?
sub get_runlevel_data {
eval $start if $b_log;
@@ -16420,10 +16759,16 @@ sub get_ssh_status {
sub get_tty_console_irc {
eval $start if $b_log;
- return $tty_session if $tty_session;
- my $ppid = getppid();
- $tty_session = awk(\@ps_aux,".*$ppid.*$client{'name'}",7,'\s+');
- $tty_session =~ s/^[^[0-9]+// if $tty_session;
+ my ($type) = @_;
+ return $tty_session if defined $tty_session;
+ if ( $type eq 'vtrn' && defined $ENV{'XDG_VTNR'} ){
+ $tty_session = $ENV{'XDG_VTNR'};
+ }
+ else {
+ my $ppid = getppid();
+ $tty_session = awk(\@ps_aux,".*$ppid.*$client{'name'}",7,'\s+');
+ $tty_session =~ s/^[^[0-9]+// if $tty_session;
+ }
$tty_session = '' if ! defined $tty_session;
log_data('data',"conole-irc-tty:$tty_session") if $b_log;
eval $end if $b_log;
@@ -16432,9 +16777,15 @@ sub get_tty_console_irc {
sub get_tty_number {
eval $start if $b_log;
- my $tty = POSIX::ttyname(1);
- #variants: /dev/pts/1 /dev/tty1 /dev/ttyp2 /dev/ttyra [hex number a]
- $tty =~ s/.*\/[^0-9]*//g if defined $tty;
+ my ($tty);
+ if ( defined $ENV{'XDG_VTNR'} ){
+ $tty = $ENV{'XDG_VTNR'};
+ }
+ else {
+ $tty = POSIX::ttyname(1);
+ #variants: /dev/pts/1 /dev/tty1 /dev/ttyp2 /dev/ttyra [hex number a]
+ $tty =~ s/.*\/[^0-9]*//g if defined $tty;
+ }
$tty = '' if ! defined $tty;
log_data('data',"tty:$tty") if $b_log;
eval $end if $b_log;
@@ -16549,8 +16900,9 @@ sub get_usb_path {
return $path
}
+
#### -------------------------------------------------------------------
-#### INITIALIZE DATA VALUES
+#### SET DATA VALUES
#### -------------------------------------------------------------------
sub set_dmesg_boot_data {
@@ -16857,8 +17209,8 @@ sub set_pci_data {
# ! -d '/proc/bus/pci'
# this is sketchy, a sbc won't have pci, but a non sbc arm may have it, so
# build up both and see what happens
- if ($b_arm ){
- set_arm_soc_data();
+ if ($b_arm || $b_mips){
+ set_soc_data();
}
}
else {
@@ -16883,10 +17235,12 @@ sub set_pci_data {
# 9 driver
# 10 modules
# 11 driver_nu [bsd, like: em0 - driver em; nu 0. Used to match IF in -n
+# 12 subsystem/vendor
+# 13 subsystem vendor:chip id
sub set_lspci_data {
eval $start if $b_log;
my ($busid,$busid_nu,$content,$port,$driver,$modules,$device,$vendor_id,$chip_id,$rev,
- $type,$type_id,@pcis,@temp,@working);
+ $subsystem,$subsystem_id,$type,$type_id,@pcis,@temp,@working);
# my @pcis = grabber('lspci -nnv','\n','strip');
my $path = check_program('lspci');
$content = qx($path -nnv 2>/dev/null) if $path;
@@ -16902,11 +17256,20 @@ sub set_lspci_data {
if ($device){
if ($_ =~ /^\s*$/) {
@temp = ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,
- $rev,$port,$driver,$modules);
+ $rev,$port,$driver,$modules,$subsystem,$subsystem_id);
@pci = (@pci,[@temp]);
$device = '';
#print "$busid $device_id r:$rev p: $port\n$type\n$device\n";
}
+ elsif ($_ =~ /^Subsystem.*\[([a-f0-9]{4}:[a-f0-9]{4})\]/){
+ $subsystem_id = $1;
+ $subsystem = (split /^Subsystem:\s*/,$_)[1];
+ $subsystem =~ s/(\s?\[[^\]]+\])+$//g;
+ $subsystem = cleaner($subsystem);
+ $subsystem = pci_cleaner($subsystem,'pci');
+ $subsystem = pci_cleaner_subsystem($subsystem);
+ #print "ss:$subsystem\n";
+ }
elsif ($_ =~ /^I\/O\sports/){
$port = (split /\s+/,$_)[3];
#print "p:$port\n";
@@ -16917,7 +17280,6 @@ sub set_lspci_data {
elsif ($_ =~ /^Kernel\smodules/i){
$modules = (split /:\s*/,$_)[1];
}
-
}
# note: arm servers can have more complicated patterns
# 0002:01:02.0 Ethernet controller [0200]: Cavium, Inc. THUNDERX Network Interface Controller virtual function [177d:a034] (rev 08)
@@ -16940,10 +17302,13 @@ sub set_lspci_data {
$port = '';
$driver = '';
$modules = '';
+ $subsystem = '';
+ $subsystem_id = '';
}
}
if ($device && $busid){
- @temp = ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,$rev,$port,$driver,$modules);
+ @temp = ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,
+ $rev,$port,$driver,$modules,$subsystem,$subsystem_id);
@pci = (@pci,[@temp]);
$device = '';
}
@@ -17050,19 +17415,44 @@ sub set_pciconf_data {
# "OF_COMPATIBLE_0=allwinner,sun8i-h3-mali", "OF_COMPATIBLE_1=allwinner,sun7i-a20-mali",
# "OF_COMPATIBLE_2=arm,mali-400", "OF_COMPATIBLE_N=3",
# "MODALIAS=of:NgpuT<NULL>Callwinner,sun8i-h3-maliCallwinner,sun7i-a20-maliCarm,mali-400"]
-sub set_arm_soc_data {
+## 5
+# /sys/devices/platform/soc/soc:internal-regs/d0018180.gpio/uevent
+## 6
+# /sys/devices/soc.0/1180000001800.mdio/8001180000001800:05/uevent
+# ["DRIVER=AR8035", "OF_NAME=ethernet-phy"
+## 7
+# /sys/devices/soc.0/1c30000.eth/uevent
+## 8
+# /sys/devices/wlan.26/uevent [from pine64]
+sub set_soc_data {
eval $start if $b_log;
my ($content,@files,@temp2,@temp3,@working);
- @files = globber("/sys/devices/platform/soc*/*/uevent");
+ if (-d '/sys/devices/platform/'){
+ @files = globber('/sys/devices/platform/soc*/*/uevent');
+ @temp2 = globber('/sys/devices/platform/soc*/*/*/uevent');
+ @files = (@files,@temp2) if @temp2;
+ }
+ if (globber('/sys/devices/soc*')){
+ @temp2 = globber('/sys/devices/soc*/*/uevent');
+ @files = (@files,@temp2) if @temp2;
+ @temp2 = globber('/sys/devices/soc*/*/*/uevent');
+ @files = (@files,@temp2) if @temp2;
+ }
+ @temp2 = globber('/sys/devices/*/uevent'); # see case 8
+ @files = (@files,@temp2) if @temp2;
+ @temp2 = undef;
# not sure why, but even as root/sudo, /subsystem/uevent is unreadable with -r test true
@files = grep {!/subsystem/} @files if @files;
foreach my $file (@files){
+ next if -z $file;
my ($busid,$busid_nu,$chip_id,$device,$driver,$modules,$port,$rev,
- $type,$type_id,$vendor_id,@working);
+ $temp,$type,$type_id,$vendor_id,@working);
$chip_id = $file;
# variants: /soc/20100000.ethernet /soc/soc:audio /soc:/ /soc@0/
- $chip_id =~ /\/sys\/devices\/platform\/soc[^\/]*\/([^\/]+)[\.:][^\/]+\/uevent/;
- $chip_id = $1;
+ # mips: /sys/devices/soc.0/1180000001800.mdio/8001180000001800:07/
+ $chip_id =~ /\/sys\/devices\/(platform\/)?(soc[^\/]*\/)?([^\/]+\/)?([^\/]+\/)?([^\/]+)[\.:]([^\/]+)\/uevent$/;
+ $chip_id = $5;
+ $temp = $6;
@working = reader($file, 'strip') if -r $file;
foreach my $data (@working){
@temp2 = split /=/, $data;
@@ -17079,17 +17469,19 @@ sub set_arm_soc_data {
$vendor_id = $temp3[0];
}
}
- $type = '' if ! defined $type;
+ # it's worthless, we can't use it
+ next if ! defined $type;
$driver = '' if ! defined $driver;
- $busid = '';
+ $busid = (defined $temp && $temp =~ /^[0-9]+$/) ? $temp: 0;
$busid_nu = 0;
$type_id = '';
$port = '';
$rev = '';
$modules = '';
- $b_arm_audio = 1 if ($type eq 'audio' || $type eq 'hdmi' );
- $b_arm_gfx = 1 if ($type eq 'gpu' || $type eq 'fb' || $type eq 'hdmi');
- $b_arm_net = 1 if $type eq 'ethernet' || $type =~ /wifi/;
+ # note: use these for main Card match for -AGN
+ $b_soc_audio = 1 if $type =~ /^(audio|daudio|hdmi|multimedia)$/;
+ $b_soc_gfx = 1 if $type =~ /^(vga|disp|display|3d|fb|gpu|hdmi)$/;
+ $b_soc_net = 1 if $type =~ /^(eth|ethernet|ethernet-phy|network|wifi|wlan)$/;
@temp3 = ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,$rev,$port,$driver,$modules);
@pci = (@pci,[@temp3]);
}
@@ -17097,7 +17489,6 @@ sub set_arm_soc_data {
main::log_data('dump','@pci',\@pci) if $b_log;
eval $end if $b_log;
}
-
sub set_ps_aux {
eval $start if $b_log;
@ps_aux = split "\n",qx(ps aux);;
@@ -17107,7 +17498,7 @@ sub set_ps_aux {
# for pinxi, we want to see the useage data for cpu/ram
@ps_aux = grep {!/\/$self_name\b/} @ps_aux if $self_name eq 'inxi';
# this is for testing for the presence of the command
- @ps_cmd = map {
+ @ps_cmd = grep {!/^\[/} map {
my @split = split /\s+/, $_;
# slice out 10th to last elements of ps aux rows
my $final = $#split;
@@ -17116,7 +17507,59 @@ sub set_ps_aux {
@split = @split[10 .. $final ];
join " ", @split;
} @ps_aux;
- print Dumper \@ps_aux if $test[5];
+ #@ps_cmd = grep {!/^\[/} @ps_cmd;
+ # never, because ps loaded before option handler
+ print Dumper \@ps_cmd if $test[5];
+ eval $end if $b_log;
+}
+sub set_ps_gui {
+ eval $start if $b_log;
+ $b_ps_gui = 1;
+ my ($working,@match,@temp);
+ # desktops
+ if ($show{'system'}){
+ @temp=qw(razor-desktop razor-session lxsession lxqt-session tdelauncher tdeinit_phase1);
+ @match = (@match,@temp);
+ @temp=qw(afterstep awesome blackbox 3dwm dwm fluxbox flwm
+ fvwm-crystal fvwm2 fvwm i3 jwm matchbox-panel openbox sawfish
+ scrotwm spectrwm twm WindowMaker wm2 wmii2 wmii);
+ @match = (@match,@temp);
+ }
+ # wm:
+ if ($show{'system'} && $extra > 1){
+ @temp=qw(9wm 3dwm afterstep amiwm awesome blackbox budgie-wm compiz
+ dwm fluxbox flwm fvwm-crystal fvwm2 fvwm gala gnome-shell i3 jwm
+ twin kwin_wayland kwin_x11 kwin marco matchbox-window-manager metacity
+ metisse mir muffin mutter mwm notion openbox ratpoison sawfish
+ scrotwm spectrwm twm windowlab WindowMaker wm2 wmii2 wmii xfwm4
+ xfwm5 xmonad);
+ @match = (@match,@temp);
+ }
+ # info:
+ if ($show{'system'} && $extra > 2){
+ @temp=qw(budgie-panel gnome-panel kicker lxpanel lxqt-panel
+ matchbox-panel mate-panel plasma-desktop plasma-netbook razor-panel
+ razorqt-panel wingpanel xfce4-panel xfce5-panel);
+ @match = (@match,@temp);
+ }
+ # compositors (for wayland these are also the server, note
+ if ($show{'graphic'} && $extra > 1){
+ @temp=qw(budgie-wm compiz compton dwc dcompmgr enlightenment
+ grefson ireplace kmscon kwin_wayland kwin_x11 metisse mir moblin
+ rustland sway swc unagi wayhouse westford weston xcompmgr);
+ @match = (@match,@temp);
+ }
+ @match = uniq(@match);
+ my $matches = join '|', @match;
+ foreach (@ps_cmd){
+ if (/^[\S]*\b($matches)(\s|$)/){
+ $working = $1;
+ push @ps_gui, $working; # deal with duplicates with uniq
+ }
+ }
+ @ps_gui = uniq(@ps_gui) if @ps_gui;
+ print Dumper \@ps_gui if $test[5];
+ log_data('dump','@ps_gui',\@ps_gui) if $b_log;
eval $end if $b_log;
}
@@ -17627,7 +18070,7 @@ sub generate_short_data {
main::key($num++,$kernel_os) => &get_kernel_data(),
main::key($num++,'Up') => &get_uptime(),
main::key($num++,'Mem') => $memory,
- main::key($num++,'HDD') => $disk_string,
+ main::key($num++,'Storage') => $disk_string,
# could make -1 for ps aux itself, -2 for ps aux and self
main::key($num++,'Procs') => scalar @ps_aux,
main::key($num++,$client_shell) => $client,
@@ -17651,7 +18094,7 @@ sub generate_info_data {
my $running_in = '';
my $data_name = main::key($prefix++,'Info');
my ($b_gcc,%row,$gcc,$index,$ref);
- my ($parent,$percent,$total,$used) = ('','','','');
+ my ($gpu_ram,$parent,$percent,$total,$used) = (0,'','','','');
my $client_shell = ($b_irc) ? 'Client' : 'Shell';
my $client = $client{'name-print'};
my @gccs = get_gcc_data();
@@ -17686,10 +18129,15 @@ sub generate_info_data {
if ($memory){
my @temp = split /:/, $memory;
my @temp2 = get_size($temp[0]);
+ $gpu_ram = $temp[3] if $temp[3];
$total = ($temp2[1]) ? $temp2[0] . ' ' . $temp2[1] : $temp2[0];
@temp2 = get_size($temp[1]);
$used = ($temp2[1]) ? $temp2[0] . ' ' . $temp2[1] : $temp2[0];
$used .= " ($temp[2]%)" if $temp[2];
+ if ($gpu_ram){
+ @temp2 = get_size($gpu_ram);
+ $gpu_ram = $temp2[0] . ' ' . $temp2[1] if $temp2[1];
+ }
}
$memory ||= 'N/A';
my %data = (
@@ -17697,10 +18145,13 @@ sub generate_info_data {
main::key($num++,'Processes') => scalar @ps_aux,
main::key($num++,'Uptime') => &get_uptime(),
main::key($num++,'Memory') => $total,
- main::key($num++,'used') => $used,
},],
);
$index = scalar(@{ $data{$data_name} } ) - 1;
+ $data{$data_name}[$index]{main::key($num++,'used')} = $used;
+ if ($gpu_ram){
+ $data{$data_name}[$index]{main::key($num++,'gpu')} = $gpu_ram;
+ }
if ( (!$b_display || $b_force_display) || $extra > 0 ){
my %init = get_init_data();
my $init_type = ($init{'init-type'}) ? $init{'init-type'}: 'N/A';
@@ -17806,18 +18257,21 @@ sub generate_system_data {
$desktop_info = $desktop_data[4];
}
# don't print the desktop if it's a wm and the same
- if ($desktop_data[5] && (!$desktop_data[0] || index(lc($desktop_data[5]),lc($desktop_data[0])) == -1 )){
+ if ($extra > 1 && $desktop_data[5] &&
+ (!$desktop_data[0] || $desktop_data[5] =~ /^(gnome[\s\-_]shell|budgie-wm)$/i ||
+ index(lc($desktop_data[5]),lc($desktop_data[0])) == -1 )){
$wm = $desktop_data[5];
+ $wm .= ' ' . $desktop_data[6] if $extra > 2 && $desktop_data[6];
}
}
- if (!$b_display || ( ! $desktop && $b_root)) {
+ if (!$b_display || ( !$desktop && $b_root)) {
my $tty = get_tty_number();
if (!$desktop){
$desktop_info = '';
}
# it is defined, as ''
if ( $tty eq '' && $client{'console-irc'}){
- $tty = get_tty_console_irc();
+ $tty = get_tty_console_irc('vtnr');
}
$desktop = "tty $tty" if $tty ne '';
$desktop_key = 'Console';
@@ -17831,15 +18285,17 @@ sub generate_system_data {
if ($desktop_info){
$data{$data_name}[$index]{main::key($num++,'info')} = $desktop_info;
}
- if ($wm){
- $data{$data_name}[$index]{main::key($num++,'wm')} = $wm;
- }
}
if ($extra > 1){
+ $data{$data_name}[$index]{main::key($num++,'wm')} = $wm if $wm;
my $dms = get_display_manager();
$dms ||= 'N/A';
$data{$data_name}[$index]{main::key($num++,'dm')} = $dms;
}
+ #if ($extra > 2 && $desktop_key ne 'Console'){
+ # my $tty = get_tty_number();
+ # $data{$data_name}[$index]{main::key($num++,'vc')} = $tty if $tty ne '';
+ #}
my $distro_key = ($bsd_type) ? 'OS': 'Distro';
my @distro_data = DistroData::get();
my $distro = $distro_data[0];
diff --git a/inxi.1 b/inxi.1
index e40ced9..5360446 100644
--- a/inxi.1
+++ b/inxi.1
@@ -1,4 +1,4 @@
-.TH INXI 1 "2018\-07\-03" inxi "inxi manual"
+.TH INXI 1 "2018\-07\-16" inxi "inxi manual"
.SH NAME
inxi \- Command line system information script for console and IRC
.SH SYNOPSIS
@@ -197,7 +197,11 @@ local/WAN IP. Shows both IPv4 and IPv6 link IP addresses.
.B \-I\fR,\fB \-\-info\fR
Show Information: processes, uptime, memory, IRC client (or shell type if run in
shell, not IRC), inxi version. See \fB\-x\fR and \fB\-xx\fR for extra information
-(init type/version, runlevel).
+(init type/version, runlevel).
+
+Rasberry Pi only: uses \fBvcgencmd get_mem gpu\fR to get gpu RAM amount,
+if user is in video group and \fBvcgencmd\fR is installed. Uses
+this result to increase the \fBMemory:\fR amount and \fBused:\fR amounts.
.TP
.B \-l\fR,\fB \-\-label\fR
Show partition labels. Default: main partitions \fB\-P\fR. For full \fB\-p\fR output,
@@ -277,7 +281,8 @@ Show distro repository data. Currently supported repo types:
\fBAPK\fR (Alpine Linux + derived versions)
-\fBAPT\fR (Debian, Ubuntu + derived versions)
+\fBAPT\fR (Debian, Ubuntu + derived versions, as well as RPM based
+APT distros like PCLinuxOS or Alt-Linux)
\fBEOPKG\fR (Solus)
@@ -573,8 +578,6 @@ bitmap (if present). Resync line, shows blocks synced/total blocks.
\- Adds basic voltages: 12v, 5v, 3.3v, vbat (\fBipmi\fR, \fBlm-sensors\fR if present).
.TP
.B \-x \-S\fR
-\- Adds desktop toolkit (\fBtk\fR), if available (GNOME/Xfce/KDE only).
-
\- Adds Kernel gcc version.
\- Adds to \fBDistro:\fR \fBbase:\fR if detected. System base will only be seen on
@@ -682,9 +685,17 @@ shows progress bar.
\- Adds DIMM/SOC voltages, if present (\fBipmi\fR only).
.TP
.B \-xx \-S\fR
-\- Adds, if run in X, display manager (\fBdm\fR) type, if present.q
-If none, shows N/A. Supports most known display managers, including gdm, gdm3,
+\- Adds display manager (\fBdm\fR) type, if present. If none, shows N/A.
+Supports most known display managers, including gdm, gdm3,
idm, kdm, lightdm, lxdm, mdm, nodm, sddm, slim, tint, wdm, and xdm.
+
+\- Adds, if run in X, window manager type (\fBwm\fR), if available.
+Not all window managers are supported. Some desktops support using more than one
+window manager, so this can be useful to see what window manager is actually running.
+If none found, shows nothing. Uses a less accurate fallback tool \fBwmctrl\fR
+if \fBps\fR tests fail to find data.
+
+\- Adds desktop toolkit (\fBtk\fR), if available (Xfce/KDE/Trinity).
.TP
.B \-xx \-\-slots\fR
\- Adds slot length.
@@ -695,6 +706,10 @@ idm, kdm, lightdm, lxdm, mdm, nodm, sddm, slim, tint, wdm, and xdm.
.B \-xx \-w\fR,\fB \-W\fR
\- Adds wind chill, heat index, and dew point if any of these are available.
.TP
+.B \-xxx \-A\fR
+\- Adds (if available and/or relevant) \fBvendor:\fR item, which shows
+specific vendor [product] information.
+.TP
.B \-xxx \-B\fR
\- Adds battery chemistry (e.g. \fBLi\-ion\fR), cycles (NOTE: there appears to
be a problem with the Linux kernel obtaining the cycle count, so this almost
@@ -704,6 +719,10 @@ data is simply not available as of 2018\-04\-03), location (only available from
\- Adds attached device \fBrechargeable: [yes|no]\fR information.
.TP
+.B \-xxx \-C\fR
+\- Adds \fBboost: [enabled|disabled]\fR if detected, aka \fBturbo\fR. Not all CPUs
+have this feature.
+.TP
.B \-xxx \-D\fR
\- Adds disk firmware revision number (if available).
@@ -715,6 +734,10 @@ Only appears if detected (SSD drives do not have rotation speeds, for example).
found, nothing shows. Not all disks report this speed, so even if they are spinnning,
no data will show.
.TP
+.B \-xxx \-G\fR
+\- Adds (if available and/or relevant) \fBvendor:\fR item, which shows
+specific vendor [product] information.
+.TP
.B \-xxx \-I\fR
\- For \fBShell:\fR adds \fB(su|sudo|login)\fR to shell name if present.
@@ -729,7 +752,7 @@ present. If no total width data is found, then inxi will not show that item.
\- Adds device Type Detail, e.g. \fBdetail: DDR3 (Synchronous)\fR.
-\- If present, adds memory module voltage. Only some systems will have this
+\- Adds, if present, memory module voltage. Only some systems will have this
data available.
\- Adds device serial number.
@@ -739,17 +762,16 @@ data available.
\- zfs\-raid: Adds portion allocated (used) by RAID array/device.
-\- Hardware RAID: Adds rev, ports.
+\- Hardware RAID: Adds rev, ports, and (if available and/or relevant)
+\fBvendor:\fR item, which shows specific vendor [product] information.
.TP
.B \-xxx \-S\fR
-\- Adds, if run in X, shell/panel type (\fBinfo\fR), if present.
+\- Adds, if run in X and present, shell/panel type (\fBinfo\fR).
If none, shows nothing. Supports some current desktop extras like gnome\-panel,
-lxde\-panel, and others. Added mainly for Mint support.
+lxpanel, xfce4\-panel, lxqt\-panel, and others (Mint feature request).
+
+\- Adds (if present), window manager (\fBwm\fR) version number.
-\- Adds, if run in X, window manager type (\fBwm\fR), if available.
-Not all window managers are supported. Some desktops support using more than one
-window manager, so this can be useful to see what windom manager is actually running.
-If none found, shows nothing.
.TP
.B \-xxx \-w\fR,\fB \-W\fR
\- Adds location (city state country), altitude, weather observation time.
@@ -887,11 +909,17 @@ Overrides default internal value and user configuration value:
\fBCPU_SLEEP=0.25\fR
+.TP
+.B \-\-wm\fR
+Force \fBSystem\fR item \fBwm\fR to use \fBwmctrl\fR as data source,
+override default \fBps\fR source.
+
.SH DEBUGGING OPTIONS
.TP
.B \-\-debug [1\-3]\fR
-\- On screen debugger output (currently not used).
+\- On screen debugger output. Output varies depending on current needs
+Usually nothing changes.
.TP
.B \-\-debug 10\fR
diff --git a/inxi.changelog b/inxi.changelog
index 91dc64c..020173c 100644
--- a/inxi.changelog
+++ b/inxi.changelog
@@ -1,4 +1,230 @@
=====================================================================================
+Version: 3.0.18
+Patch Version: 00
+Script Date: 2018-07-16
+-----------------------------------
+Changes:
+-----------------------------------
+New version, new man. Fixes, a few changes, enhancements.
+
+Fixes:
+1. Removed /dev/zram type data from swap partitions, since that's ram, it's
+not a partition, obviously.
+2. More alternate IPMI syntax found, that's clearly going to take a while to have
+most syntaxes handled.
+3. Small lm-sensors adjustment, fringe cases might scramble up hwmon and gpu
+temps, this is now handled.
+
+Enhancements:
+1. Added disk vendors, udinfo.
+2. Exciting! New Architecture: MIPS! First datasets, confirmed working. This led to
+more abstracting of the previously ARM specific logic to be for SOC in general.
+3. Related to 2, added in fallback busybox cases for partition data without fs.
+4. Added window managers, xmonad, ratpoison, 9dm, gala (for Pantheon), notion,
+windowlab
+5. Added Pantheon desktop detection. Note, unable to find a way to get version
+number.
+6. IMPI sensors: added in psu fans, dimm temp.
+7. New -Cxxx option: cpu boost (aka turbo), state enabled / disabled, only shows
+if system has that option.
+
+Changes:
+1. Made toolkit for -S be -xx instead of -x, only Trinity/KDE and XFCE have that
+data.
+-----------------------------------
+-- Harald Hope - Mon, 16 Jul 2018 17:31:30 -0700
+
+=====================================================================================
+Version: 3.0.17
+Patch Version: 00
+Script Date: 2018-07-12
+-----------------------------------
+Changes:
+-----------------------------------
+New version, new man. Changes, bug fixes, enhancements! Don't delay!
+
+Bugs:
+1. A real bug, the detection for true path of /dev/root had a mistake in it and
+would only have worked in half the cases. This was an easy fix, but a significant
+one since it also would lead to the actual root / partition showing in Unmounted.
+2. Related to the item Fixes-2, if two USB networking devices were attached,
+the second one's bus and chip ID would go on the wrong line of data if -n or -i
+option were used. Since that would be the line belonging to the previous device,
+that obviously was weird and wrong.
+3. NEW: latest kernel can show hwmon data in sensors, for example from wifi chip.
+This broke CPU temp detection and showed way too high cpu temp, so this fix is
+fairly important since new kernels may have this new sensors hwmon syntax.
+4. Sensors: IPMI alternate syntax found, also case with no data in expected columns,
+just N/A, so now the ipmi sensor logic skips all lines with non numeric values in
+the values column. This is what it should have done all along, it was trusting
+that values would always exist for the field names it looks for.
+
+Fixes:
+1. ARM networking fix. ARM devices like rasberry pi that use usb bus for networking
+showed the no data message even though usb networking was right below it. This is
+corrected, and now that only shows if both main and usb networking failed for ARM.
+2. Big repo fix: while testing distro and Trinity live cds, I discovered that apt is
+sometimes used with rpms, which made PCLinuxOS and ALT-Linux Repos item show the
+apt files but no data since the pattern was looking for start with deb. Added rpm
+to pattern, so all distros that use apt running rpms should now 'just work'.
+3. Fixed more distro id things, PCLinuxOS should now show its full distro string.
+4. Debugger: Filtered out more blocks of /proc, that data is bloated and messy, found
+another case where it collected a vast amount of junk system data from zfs in that
+case, just blocked the entire range. I had no idea /proc had so much junk data in it!
+5. As noted above, IPMI, yet another alternate syntax for field names. My hope that
+IPMI software and sensors will be more logical and consistent than lm-sensors output
+is proving to be merely wishful thinking, I think now out of 3 datasets I've gotten,
+I've seen 3 variants for syntax, not to mention the ipmi-tool vs ipmi-sensors
+differences. So IPMI will be like all sensors stuff, a work in progress, to
+be updated with every newly discovered alternate syntax and data set.
+
+Enhancements:
+1. Disk vendors, added some, improved pattern detections for others. This feature
+is getting better all the time. Thanks linuxlite hw db, easy to scan for missing
+vendors in their inxi data.
+2. Added more wm, budgie-wm, mwm, variants of kwin and Trinity's Twin, several others,
+more refactoring of core wm/desktop code.
+3. Added gpu ram and reworked memory logic for rasberry pi, which is the only SBC
+I am aware of that uses that tool. Now reports the actual total, and also gpu: for
+ram data, so you can tell that the gpu is using part of the total. Again, this comes
+from issue #153. Also added that info to man page for -I part.
+4. Added more ARM and PCI cleaners for neater and more concise ARM/PCI output.
+5. Added Trinity support to Desktop section, this had at least two different detection
+methods, but since the first just shows KDE original data, only the second one proved
+to be Trinity specific. Happily, the full data is available, toolkit, desktop version,
+and wm (Twin).
+6. New -G,-A,-R -xxx feature: vendor:. Note that vendor data is very bloated and
+messy so it's trimmed down substantially, using a series of filters and rules, and
+thus it can contain the following: the actual vendor, like Dell, nothing, the
+motherboard vendor/product for board based PCI items, or a complete vendor/product
+string if it's unique. I couldn't think of a clean field name that meant:
+vendor OR vendor + basic product info OR motherboard + board version OR full
+product name, including vendor, so in the end, I just used vendor: but it's not
+quite the right term, but nothing else seemed to work better. Testers responded
+very enthusiastically about this feature so I guess the vendor: feature is ok.
+
+Changes:
+1. Biggest change: Drives: HDD: total: the HDD: is now changed to: Local Storage:
+This was part of issue #153 and is a good suggestion because HDD generally was used to
+refer to hard disks, spinning, but with nvme, m.2, ssd, mmc, etc, that term is a bit
+dated. 'Local' is because inxi does not include detected remote storage in the totals.
+2. The recent --wm option which forced ps as data source for window manager detection
+has been reversed, now --wm forces wmctrl and ps aux is preferred. Still falls back
+to wmctrl in case the ps test is null, this is better because I have to add the wm
+data manually for each one, whereas wmctrl has an unknown set and probably variable
+set of wm. Note that I reversed this because I saw several cases where wmctrl was
+wrong, and reported a generic source wm instead of the real one. Since most users are
+not going to even be aware of the wm: feature as enhanced with --wm switch, this
+should have no impact on users in general. Since the detected wm name needs to be
+known and handled to get assigned to wm: and wm version data, I think it will work
+better to have the known variants match with the wm data values, then just fallback to
+unknown ones that can get filled in over time as we find wm that people actually
+use and that you can get version info on and detect.
+3. Moved help menu debugging options to bottom of help, which makes the option set
+more logical as you go down the list:
+Output Control Options:
+Additional Options:
+Advanced Options:
+Debugging Options:
+
+Removed:
+1. Got rid of tests for GTK compiled with version for many desktops, that test
+was always wrong because it did not have any necessary relation to the actual
+gtk version the desktop was built out of, and it also almost always returned no
+data. Since this is an expensive and slow test, and is always going to be wrong
+or empty anyway, I've removed it. My tests showed it taking about 300ms or so
+to generate no data, heh. That's the tk: feature in -S.
+Note I also found that gnome-shell takes an absurdly long time to give --version
+info, the slowest of all such things, 300ms again, just to show version? Someone
+should fix that, there's no possible reason why it should take 300 milliseconds
+to give a simple version string. Note that this returns tk: to only returning
+real data, which in this case means only xfce, kde, and trinity, which are the
+only desktops that actually report their toolkit data. I'll probably remove
+that code in the future unless I can think of some real use for gtk version
+elsewhere, but it's just junk data which doesn't even work.
+
+In the future, I will not try to emulate or guess at desktop toolkits, either they
+show the data in a direct form like XFCE or Trinity or KDE do, or I won't waste
+resources and execution time making bad guesses using inefficient code and logic.
+QT desktops like LXQt I'm leaving in because I believe those will tend to track
+more closely the QT version on the system, and the tests for QT version aren't
+huge ugly hacks the way they are for GTK, so they aren't as slow or intrusive, but
+those may also get removed since they almost never work either. But they are also
+slowing down the -Sx process so maybe they should be removed as well, I'll think
+about it. Since they only are used on LXQt and razer-qt, it probably isn't a big
+deal overall.
+
+-----------------------------------
+-- Harald Hope - Thu, 12 Jul 2018 13:44:34 -0700
+
+=====================================================================================
+Version: 3.0.16
+Patch Version: 00
+Script Date: 2018-07-08
+-----------------------------------
+Changes:
+-----------------------------------
+
+New version, new man. Several bug fixes, enhancements, options.
+
+Bugs:
+1. In some cases, -S Desktop showed xfce when it wasn't xfce. This should be largely
+corrected now.
+2. Big bug: using lxqt-about for lxqt --version, now opens a dialog box, gui,
+so removed that, and now checking lxqt-session for version info instead.
+
+Fixes:
+1. Now calling hitachi hgst drives vendor: HGST (Hitachi) to differentiate between
+regular Hitachi and HGST hitachi. Added a few more disk vendors.
+2. Distro base and core: added linuxlite, elementary. Some distros use:
+/etc/upstream-release/lsb-release so testing for that and os-release now too.
+3. Extended qt detections, may catch a few stray ones now in non kde qt
+desktops.
+4. Complete refactor of desktop, desktop info, wm, and -G compositor, now much
+easier to extend each feature and add detections, move order around, etc.
+Also moved wm to -Sxx now that I use fallback ps aux tests, which were themselves
+also totally refactored and optimized. Fixed WindowMaker id, which is made more
+annoying because they are the only upper/lower case program name, but in at least
+debian, the actual program name is wmaker internally.
+Also tightened in particular gnome-shell, which was failing to show due to too
+restrictive filtering of desktop/vm repeats. Most wm do not contain the desktop
+name in the string, gnome-shell does, only one I'm aware of.
+5. Removed N/A from wmctrl output, which just means null, which is what we want.
+6. Removed gnome-shell from info: since it will now appear in wm: if found. Added
+a few -panel items to info:
+
+Enhancements:
+1. Showing type: network bridge for -N when it's type 0680, which is an odd pci
+type, generally it's a network bridge, but I figured it's best to show that
+explicitly to avoid confusion. This extends the 'type:' from just USB.
+2. Added more window managers to wm, matchbox, flwm, fvwm2 (used to just use fvwm,
+this was wrong, it's its own thing), a few others.
+3. Added a few more compositors to -Gxx. kwin_x11 should be the most noticeable,
+but added some more obscure ones too. This feature requires more work.
+4. Extended ARM syntax to support a new one, path to /sys/device... has an extra
+/soc/ in it, that is now handled, all are tested for. Confirmed working. Note that
+ARM has to be confirmed fixed on a device by device basis, since there are key
+syntax differences in the paths, but it will get easier the more variants that are
+discovered. Added another trimmer to cut off \x00|01|02|03 special non printing
+characters which show as weird jibbberish in output, for model/serial number.
+5. Refactored wm, info, desktop, compositor, now all use @ps_gui, which is all that
+is tested against, not the entire ps_cmd array. This drops the possible tests down
+massively since the only things in ps_gui will be the actual stuff found that matches
+all the patterns required for that system, not all ps items. Added marco, muffin
+fixes. Was showing wm: Metacity (Marco) that is not correct, now shows marco, which
+then allows to get version too.
+5. -Sxxx now shows wm: version as well, which can be of use now and then.
+6. --wm added to trip force using of ps data for wm, this can be useful because
+I don't know all variants of wmctrl output, so that makes it easier to test.
+7. Added finally support for --debug 3, which now shows timers, functions, and args
+printed to screen.
+8. Added qmake --version to fallback qt detection.
+
+
+-----------------------------------
+-- Harald Hope - Sun, 08 Jul 2018 15:57:58 -0700
+
+=====================================================================================
Version: 3.0.15
Patch Version: 00
Script Date: 2018-07-03