From cb15f8d88a2256cd4c6149ddde1b676d53e1a827 Mon Sep 17 00:00:00 2001 From: Harald Hope Date: Mon, 25 Sep 2023 15:11:51 -0700 Subject: [PATCH] PACKAGERS! inxi repos are moved to https://codeberg.org/smxi/inxi The repos will mirror to github for a short amount of time, until after 3.3.30 is released, then I am probably going to do some big changes in the structure of the inxi repo. Make sure to update your packaging tools and scripts for this change. -------------------------------------------------------------------------------- Finally, a huge upgrade for Wayland future proofing, and other futures that are maybe coming, by adding EGL API, and Vulkan for good measure. This should handle wayland finally, that's been a stub forever, but finally realized eglinfo was a thing, and that vulkan as well could be a contender to replace OpenGL, at least that's what Mesa says on their site, and they should know. This handles one of the longest standing weak points of inxi graphics, being completely X11-centric, even though wayland support exists fairly extensively, but this glxinfo dependent feature was a niggling annoyance, now it's fairly ambivalent about which api tool you throw at it, the hardest is to give the right message for no data, or incomplete data. Note that eglinfo supplies at least software rendering out of X11 or Wayland, so we can now get some API data in console, including if supported, OpenGL data. Not all of it, but some of it. Also since now all the docs are split and granular, with the Graphics API upgrades, added data sample files from glxinfo, eglinfo, vulkaninfo, and vainfo for good measure, just to have some of the latter. This is one of the first time all the data used to develope a feature, docs for that feature, and the feature itself, are being shared and released at the same time. -------------------------------------------------------------------------------- SPECIAL THANKS: 1a. GRAPHICS: API: Arch user Chrome30 on github for requesting vulkan data, and providing the initial datasamples that made it possible to think about this new API feature. 1b. CheckRecommends: Display packages: mrmazda, a frequent helper, checked and updated OpenSUSE and Fedora vulkan/egl/glx API tool package names. Those have been a bit fluid and many of the names I had were not right. -------------------------------------------------------------------------------- KNOWN ISSUES: 1a. GRAPHICS: nothing is perfect, for sudo/root the detections fail for OpenGL API messages, but fallbacks will make it a bit nicer than it was, with some data, instead of none as before. 1b. GRAPHICS: API: I'm assuming that the greatest EGL version number found is the actual version, and lower versions are what that platform supports. This is an assumption, not a known fact, but finding this stuff clearly documented tends towards near impossibility, or takes forever to determine, so that's the assumption that is being used. Correct via issue and clear explanation with links to resources if this is incorrect. -------------------------------------------------------------------------------- BUGS: 1. Nothing to speak of. -------------------------------------------------------------------------------- FIXES: 1. PARTITIONS: had wekafs as a zfs type fs, it's not, it's more like NAS, cloud. Added to distributed list, and removed from zfs|btrfs|hammer list. I know, I know, will it ever matter? Probably not. But just in case, wouldn't want your local machine to report with petabytes of storage now would we! 2. CheckRecommends: corrected some Fedora, SUSE package names. -------------------------------------------------------------------------------- ENHANCEMENTS: 1a. SYSTEM: DistroData: added Bodhi id method, /etc/bodhi/info file which is similar to /etc/lsb_release, updated system base detection as well. System base comes from /etc/os-release. 1b. SYSTEM: DistroData: Added Nitrux system base (debian). Why they try hide this is beyond me. Maybe because they are not using a real PM, and don't include apt, who knows. 2a. GRAPHICS: new nvidia gpu ids. 2b. Graphics: EGL API data: * Shows eglinfo missing if appropriate, no data messages if appropriate. * -G shows EGL version(s), drivers, active platforms. * -Gx adds active/inactive platforms as sub items of platforms. * -Gxx shows platforms by platform, with egl version, driver. EGL version only shows if there were more than 1 detected, otherwise it shows with EGL v: * -Gxxx shows hw based on driver, if found, like vulkan. To avoid excess verbosity, does not show renderer OpenGL name per platform because it would be way too long and repetetive. And besides, that would show in OpenGL anyway, more or less, unless there are two different GPUs, which is a case that is not fully handled. 2c. GRAPHICS: OpenGL data: * If glxinfo not present, or with null output due to root/no display, and if eglinfo available, and has OpenGL items, will populate most of OpenGL API with data, except for Direct Rendering and GLX version. Shows appropriate messages indicating it's EGL sourced for console, root, no data, or glxinfo missing. * -Gx adds GLX version, if detected. * -Gxx add: ES version, if detected; device-ID, if available. Also adds display-ID, if Display-ID was not found in the Display line (which probably means that xdpyinfo or xrandr were not installed). Does not always show since it already appeared in Display line if it was discovered. * -Ga adds device memory, and unified memory status (yes/no). 2d. GRAPHICS: Vulkan API data: * Shows appropriate messages if vulkaninfo present, but no data found. * -G shows Vulkan version, drivers, and surfaces. * -Gx device counts. * -Gxx adds device by id, type, driver report. * -Gxxx adds layer count; adds device hardware vendor, based on mesa driver. Not for nvidia driver, since that is self evident. Goes away with -Ga if device name exists. * -Ga adds full device report, including per device names, ids, drivers, driver versions, surfaces. 3. UPDATE: Because the smxi.org server no longer accepts TSL 1.1 based HTTP requests, added for extreme legacy systems a new update option, -U 4, which uses direct FTP download from smxi.org ftp server. If system set to default to perl downloader HTTP::Tiny it switches to using a non perl downloader automatically, like wget or curl. 4. CPU: Microarch: got early zen5 possible IDs. Both Intel/AMD may have rough ID working well before they ship in public. CPU stuff has slowed down a lot, the 4,3n nodes are not easy, obviously. 5. DRIVES: Many more drive vendors and drive IDs. 6. RAM: More RAM vendors. Note that it's not unusual for a Drive vendor to also make RAM, and vice versa. -------------------------------------------------------------------------------- CHANGES: 1a. GRAPHICS: For API, show OpenGL mesa-v: x.x.x separate from main API v: string. Also only shows the actual API version with v: now, like v: 4.5. Also shows vendor: nvidia v: 340.23 for nvidia, without mesa. Falls back for unhandled cases or syntaxes to the whole version string for v:. 1b. GRAPHICS: For OpenGL, shows compat-v: always if present, that was a mistake not to show it unless -Gx, since otherwise you'd think you are running a different version. Not a common situation, but on legacy hardware, can happen. -------------------------------------------------------------------------------- DOCUMENTATION: 1a. DOCS: docs/inxi-cpu.txt - reorganized into more coherent sections, like with like, etc. Added better top Sections navigation since there is so much data. 1b. DOCS: docs/inxi-resources.txt - moved last code tricks to docs/tips-tricks.txt. 1c. DOCS: new docs/ files inxi-battery.txt, inxi-debuggers.txt, inxi-devices.txt, inxi-kernel.txt, inxi-machine.txt, inxi-network.txt, inxi-raid-logical.txt, inxi-start-client.txt, inxi-tty.txt, inxi-weather. These new files cleaned out docs/inxi-data.txt and docs/inxi-resources.txt, which are now merely placeholder files, and have no data in them beyond pointers to the actual data files. 1d. DOCS: docs/inxi-custom-recommends.txt updated for SUSE/Fedora packag name fixes and new eglinfo and vulkaninfo items. 2a. DATA: moved more data from non public data to shared. Refactored directories to be better organized, and to follow the overall inxi data structures better. 2b. DATA: added many more eglinfo, glxinfo, vulkaninfo to data/graphics. Also added some clinfo, vainfo just in case decide to support those APIs. 3a. MAN/OPTIONS: updated for new graphics API features, new verbsity features, etc. 3b. MAN/OPTIONS: added -U arguments for man, for some reason I'd left those out. Also removed options references to -U 1, 2, because those should never be used, if those versions of inxi even exist, they are ancient. Added -U 4 option, and explanation of when/why to use it. -------------------------------------------------------------------------------- CODE: 1a. FAKE DATA: updated paths for fake data to reflect data reorganization. 1b. FAKE DATA: Added --fake egl,glx,vulkan for GRAPHICS API. 2. GRAPHICS: Fully refactored opengl_output, moved to gl_data/opengl_output. Added egl_data, egl_output, and vulkan_data, vulkan_output, and some other tools. 3. UPDATE: if downloader is set to 'perl', aka, Tiny::HTTP, and -U 4 is used, which is a direct FTP download of the inxi/pinxi files, tiny is disabled, and the next available downloader (wget/curl/fetch) is used instead. 4. DEBUGGER: added clinfo, eglinfo, es2_info, vainfo, vdpauinfo, vulkaninfo. --- inxi | 1744 +++++++++++++++++++++++++++++++++++++----------- inxi.1 | 129 +++- inxi.changelog | 211 +++++- 3 files changed, 1654 insertions(+), 430 deletions(-) diff --git a/inxi b/inxi index 5325d40..edc3633 100755 --- a/inxi +++ b/inxi @@ -49,9 +49,9 @@ use POSIX qw(ceil uname strftime ttyname); ## INXI INFO ## my $self_name='inxi'; -my $self_version='3.3.29'; -my $self_date='2023-09-17'; -my $self_patch='01'; +my $self_version='3.3.30'; +my $self_date='2023-09-25'; +my $self_patch='00'; ## END INXI INFO ## my ($b_pledge,@pledges); @@ -1953,6 +1953,12 @@ sub display_data { # kde 5/plasma desktop 5, this is maybe an extra package and won't be used ['about-distro',''], ['aticonfig','--adapter=all --od-gettemperature'], + ['clinfo',''], + ['clinfo','--list'], + ['clinfo','--raw'], # machine friendly + ['eglinfo',''], + ['eglinfo','-B'], + ['es2_info',''], ['glxinfo',''], ['glxinfo','-B'], ['kded','--version'], @@ -1987,6 +1993,8 @@ sub display_data { ['vainfo',''], ['vdpauinfo',''], ['vulkaninfo',''], + ['vulkaninfo','--summary'], + # ['vulkaninfo','--json'], # outputs to file, not sure how to output to stdout ['wayland-info',''], # not packaged as far as I know yet ['weston-info',''], ['wmctrl','-m'], @@ -2667,7 +2675,7 @@ sub download_file { ## NOTE: 1 is success, 0 false for Perl if ($dl{'dl'} eq 'tiny'){ $cmd = "Using tiny: type: $type \nurl: $url \nfile: $file"; - $result = get_file($type, $url, $file); + $result = get_file_tiny_http($type, $url, $file); $debug_data = ($type ne 'stdout') ? $result : 'Success: stdout data not null.'; } # But: 0 is success, and 1 is false for these @@ -2699,7 +2707,7 @@ sub download_file { return $result; } -sub get_file { +sub get_file_tiny_http { my ($type, $url, $file) = @_; my $tiny = HTTP::Tiny->new; # note: default is no verify, so default here actually is to verify unless overridden @@ -2755,7 +2763,11 @@ sub set_downloader { # It is NOT part of core modules. IO::Socket::SSL is also required # For some https connections so only use tiny as option if both present if ($dl{'tiny'}){ - if (check_perl_module('HTTP::Tiny') && check_perl_module('IO::Socket::SSL')){ + # this only for -U 4, grab file with ftp to avoid unsupported SSL issues + if ($use{'ftp-download'}){ + $dl{'tiny'} = 0; + } + elsif (check_perl_module('HTTP::Tiny') && check_perl_module('IO::Socket::SSL')){ HTTP::Tiny->import; IO::Socket::SSL->import; $dl{'tiny'} = 1; @@ -3034,11 +3046,13 @@ sub check_items { } elsif ($type eq 'recommended display information programs'){ if ($bsd_type){ - @data = qw(glxinfo wmctrl xdpyinfo xprop xdriinfo xrandr); + @data = qw(eglinfo glxinfo vulkaninfo wmctrl xdpyinfo xprop xdriinfo + xrandr); $info_os = 'info-bsd'; } else { - @data = qw(glxinfo wmctrl xdpyinfo xprop xdriinfo xrandr); + @data = qw(eglinfo glxinfo vulkaninfo wmctrl xdpyinfo xprop xdriinfo + xrandr); } $b_program = 1; $item = 'Program'; @@ -3555,17 +3569,33 @@ sub set_item_data { 'rpm' => 'wget', }, ## Programs-Display ## + 'eglinfo' => { + 'info' => '-G X11/Wayland EGL info', + 'info-bsd' => '-G X11/Wayland EGL info', + 'apt' => 'mesa-utils (or: mesa-utils-extra)', + 'pacman' => 'mesa-demos', + 'pkgtool' => 'mesa', + 'rpm' => 'egl-utils (SUSE: Mesa-demo-egl)', + }, 'glxinfo' => { - 'info' => '-G (X) glx info', - 'info-bsd' => '-G (X) glx info', + 'info' => '-G X11 GLX info', + 'info-bsd' => '-G X11 GLX info', 'apt' => 'mesa-utils', 'pacman' => 'mesa-demos', 'pkgtool' => 'mesa', - 'rpm' => 'glx-utils (SUSE: Mesa-demo-x)', + 'rpm' => 'glx-utils (Fedora: glx-utils; SUSE: Mesa-demo-x)', + }, + 'vulkaninfo' => { + 'info' => '-G Vulkan API info', + 'info-bsd' => '-G Vulkan API info', + 'apt' => 'vulkan-tools', + 'pacman' => 'vulkan-tools', + 'pkgtool' => 'vulkan-tools', + 'rpm' => 'vulkan-demos (Fedora: vulkan-tools; SUSE: vulkan-demos)', }, 'wmctrl' => { 'info' => '-S active window manager (fallback)', - 'info-bsd' => '-S active window managerr (fallback)', + 'info-bsd' => '-S active window manager (fallback)', 'apt' => 'wmctrl', 'pacman' => 'wmctrl', 'pkgtool' => 'wmctrl', @@ -3577,7 +3607,7 @@ sub set_item_data { 'apt' => 'X11-utils', 'pacman' => 'xorg-xdpyinfo', 'pkgtool' => 'xdpyinfo', - 'rpm' => 'xorg-x11-utils (SUSE/Fedora?: xdpyinfo)', + 'rpm' => 'xorg-x11-utils (SUSE/Fedora: xdpyinfo)', }, 'xdriinfo' => { 'info' => '-G (X) DRI driver (if missing, fallback to Xorg log)', @@ -3585,7 +3615,7 @@ sub set_item_data { 'apt' => 'X11-utils', 'pacman' => 'xorg-xdriinfo', 'pkgtool' => 'xdriinfo', - 'rpm' => 'xorg-x11-utils (SUSE/Fedora?: xdriinfo)', + 'rpm' => 'xorg-x11-utils (SUSE/Fedora: xdriinfo)', }, 'xprop' => { 'info' => '-S (X) desktop data', @@ -3593,7 +3623,7 @@ sub set_item_data { 'apt' => 'X11-utils', 'pacman' => 'xorg-xprop', 'pkgtool' => 'xprop', - 'rpm' => 'x11-utils', + 'rpm' => 'x11-utils (Fedora/SUSE: xprop)', }, 'xrandr' => { 'info' => '-G (X) monitors(s) resolution; -Ga monitor data', @@ -3601,7 +3631,7 @@ sub set_item_data { 'apt' => 'x11-xserver-utils', 'pacman' => 'xrandr', 'pkgtool' => 'xrandr', - 'rpm' => 'x11-server-utils (Fedora: xrandr)', + 'rpm' => 'x11-server-utils (SUSE/Fedora: xrandr)', }, ## Perl Modules ## 'Cpanel::JSON::XS' => { @@ -4543,15 +4573,12 @@ sub get_defaults { 'ftp-upload' => 'ftp.smxi.org/incoming', 'inxi-branch-1' => 'https://codeberg.org/smxi/inxi/raw/one/', 'inxi-branch-2' => 'https://codeberg.org/smxi/inxi/raw/two/', - 'inxi-dev' => 'https://smxi.org/in/', - 'inxi-main' => 'https://codeberg.org/smxi/inxi/raw/master/', - 'inxi-pinxi' => 'https://codeberg.org/smxi/inxi/raw/inxi-perl/', - 'inxi-man' => "https://smxi.org/in/$self_name.1", - 'inxi-man-gh' => "https://codeberg.org/smxi/inxi/raw/master/$self_name.1", - 'pinxi-man' => "https://smxi.org/in/$self_name.1", - 'pinxi-man-gh' => "https://codeberg.org/smxi/inxi/raw/inxi-perl/$self_name.1", + "$self_name-dev" => 'https://smxi.org/in/', + "$self_name-dev-ftp" => 'ftp://ftp.smxi.org/outgoing/', + "inxi-main" => 'https://codeberg.org/smxi/inxi/raw/master/', + 'pinxi-main' => 'https://codeberg.org/smxi/pinxi/raw/master/', ); - if (exists $defaults{$type}){ + if ($defaults{$type}){ return $defaults{$type}; } else { @@ -4571,7 +4598,6 @@ sub update_me { $self_path =~ s/\/$//; # dirname sometimes ends with /, sometimes not $self_download =~ s/\/$//; # dirname sometimes ends with /, sometimes not my $full_self_path = "$self_path/$self_name"; - if ($b_irc){ error_handler('not-in-irc', "-U/--update") } @@ -4588,7 +4614,6 @@ sub update_me { $output = ''; $self_download = "$self_download/$self_name"; $file_contents = download_file('stdout', $self_download); - # then do the actual download if ($file_contents){ # make sure the whole file got downloaded and is in the variable @@ -4607,7 +4632,7 @@ sub update_me { print $output; $output = ''; if ($use{'man'}){ - update_man($download_id); + update_man($self_download,$download_id); } else { print "Skipping man download because branch version is being used.\n"; @@ -4627,7 +4652,7 @@ sub update_me { sub update_man { eval $start if $b_log; - my ($download_id) = @_; + my ($self_download,$download_id) = @_; my $man_file_location = set_man_location(); my $man_file_path = "$man_file_location/$self_name.1" ; my ($file_contents,$man_file_url,$output,$program) = ('','','',''); @@ -4653,13 +4678,8 @@ sub update_man { print "Required program gzip not found. Unable to install man page.\n"; return 0; } - # first choice is inxi.1/pinxi.1 from gh, second from smxi.org - if ($download_id ne 'dev server'){ - $man_file_url = get_defaults($self_name . '-man-gh'); - } - else { - $man_file_url = get_defaults($self_name . '-man'); - } + # first choice is inxi.1/pinxi.1 from gh, second from smxi.org + $man_file_url = $self_download . '.1'; print "Updating $self_name.1 in $man_file_location\n"; print "using $download_id branch as download source\n"; print "Downloading man page file...\n"; @@ -5343,11 +5363,11 @@ sub get { 'fake:s' => sub { my ($opt,$arg) = @_; if ($arg){ - my $wl = 'bluetooth|compiler|cpu|dboot|dmidecode|elbrus|iomem|ip-if|ipmi|'; - $wl .= 'logical|lspci|partitions|pciconf|pcictl|pcidump|'; + my $wl = 'bluetooth|compiler|cpu|dboot|dmidecode|egl|elbrus|glx|'; + $wl .= 'iomem|ip-if|ipmi|logical|lspci|partitions|pciconf|pcictl|pcidump|'; $wl .= 'raid-btrfs|raid-hw|raid-lvm|raid-md|raid-soft|raid-zfs|'; $wl .= 'sensors|sensors-sys|swaymsg|sys-mem|sysctl|uptime|usbconfig|'; - $wl .= 'usbdevs|vmstat|wl-info|wlr-randr|xdpyinfo|xorg-log|xrandr'; + $wl .= 'usbdevs|vmstat|vulkan|wl-info|wlr-randr|xdpyinfo|xorg-log|xrandr'; for (split(',',$arg)){ if ($_ =~ /\b($wl)\b/){ $fake{lc($1)} = 1; @@ -5513,7 +5533,7 @@ sub get { $debugger{'sys-force'} = 1;}, 'tty' => sub { # workaround for ansible/scripts running this $b_irc = 0;}, - 'U|update:s' => sub { # 1,2,3 OR http://myserver/path/inxi + 'U|update:s' => sub { # 1,2,3,4 OR http://myserver/path/inxi my ($opt,$arg) = @_; process_updater($opt,$arg);}, 'usb-sys' => sub { @@ -5556,7 +5576,7 @@ sub post_process { main::set_downloader(); } $use{'man'} = 0 if (!$use{'yes-man'} || $use{'no-man'}); - main::update_me($self_download, $download_id) if $use{'update-trigger'}; + main::update_me($self_download,$download_id) if $use{'update-trigger'}; main::set_xorg_log() if $show{'graphic'}; if ($b_pledge){ my $b_update; @@ -5587,7 +5607,10 @@ sub post_process { main::error_handler('bad-arg', '-l/-u', 'missing required option(s) -j, -o, -p, -P'); } $extra = 3 if $b_admin; - $show{'graphic-basic'} = 0 if $show{'graphic-full'} && $extra > 1; + # this turns off basic for F/v graphic output levels. + if ($show{'graphic-basic'} && $show{'graphic-full'} && $extra > 1){ + $show{'graphic-basic'} = 0; + } if ($force{'rpm'}){ $force{'pkg'} = 1; delete $force{'rpm'}; @@ -5685,32 +5708,39 @@ sub process_updater { $use{'downloader'} = 1; if ($use{'update'}){ $use{'update-trigger'} = 1; - if (!$arg && $self_name eq 'pinxi'){ + if (!$arg){ $use{'man'} = 1; - $download_id = 'inxi-perl branch'; - $self_download = main::get_defaults('inxi-pinxi'); + $download_id = "$self_name main branch"; + $self_download = main::get_defaults("$self_name-main"); } elsif ($arg && $arg eq '3'){ $use{'man'} = 1; $download_id = 'dev server'; - $self_download = main::get_defaults('inxi-dev'); + $self_download = main::get_defaults("$self_name-dev"); } - else { - if (!$arg){ - $download_id = 'main branch'; - $self_download = main::get_defaults('inxi-main'); - $use{'man'} = 1; - $use{'yes-man'} = 1; - } - elsif ($arg =~ /^[12]$/){ + elsif ($arg && $arg eq '4'){ + $use{'man'} = 1; + $use{'ftp-download'} = 1; + $download_id = 'dev server ftp'; + $self_download = main::get_defaults("$self_name-dev-ftp"); + } + elsif ($arg =~ /^[12]$/){ + if ($self_name eq 'inxi'){ $download_id = "branch $arg"; $self_download = main::get_defaults("inxi-branch-$arg"); } - elsif ($arg =~ /^http/){ - $download_id = 'alt server'; - $self_download = $arg; + else { + main::error_handler('bad-arg', $opt, $arg); } } + elsif ($arg =~ /^(ftp|https?):/){ + $download_id = 'alt server'; + $self_download = $arg; + } + if ($self_download && $self_name eq 'inxi'){ + $use{'man'} = 1; + $use{'yes-man'} = 1; + } if (!$self_download){ main::error_handler('bad-arg', $opt, $arg); } @@ -5778,7 +5808,7 @@ sub show_options { ['1', '', '--gpu', "Deprecated. Triggers -Ga."], ['1', '-G', '--graphics', "Graphics info (devices(s), drivers, display protocol (if available), display server/Wayland compositor, resolution, X.org: - renderer, OpenGL version; Xvesa: VBE info."], + renderer, basic EGL, OpenGL, Vulkan API data; Xvesa API: VBE info."], ['1', '-i', '--ip', "WAN IP address and local interfaces (requires ifconfig or ip network tool). Triggers -n. Not shown with -F for user security reasons. You shouldn't paste your local/WAN IP."], @@ -5956,9 +5986,9 @@ sub show_options { ['2', '-E', '', "PCI/USB Bus ID of device, driver version, LMP version."], ['2', '-G', '', "GPU arch (AMD/Intel/Nvidia only); Specific vendor/product - information (if relevant); PCI/USB ID of device; Direct rendering status - (in X); Screen number GPU is running on (Nvidia only); device temp (Linux, - if found)."], + information (if relevant); PCI/USB ID of device; Screen number GPU is running + on (Nvidia only); device temp (Linux, if found); APIs: EGL: active/inactive + platforms; OpenGL: direct rendering status (in X); Vulkan device counts."], ['2', '-i', '', "For IPv6, show additional scope addresses: Global, Site, Temporary, Unknown. See --limit for large counts of IP addresses."], ['2', '-I', '', "Default system GCC. With -xx, also shows other installed @@ -6005,11 +6035,12 @@ sub show_options { (if found); USB rev, speed, lanes (if found)."], ['2', '-G', '', "Chip vendor:product ID for each video device; Output ports, used and empty; PCIe speed, lanes (if found); USB rev, speed, lanes (if - found); Xorg: OpenGL compatibility version, if free drivers and available; - Xorg compositor; alternate Xorg drivers (if available. Alternate means driver - is on automatic driver check list of Xorg for the device vendor, but is not - installed on system); Xorg Screen data: ID, s-res, dpi; Monitors: ID, - position (if > 1), resolution, dpi, model, diagonal."], + found); Xorg: Xorg compositor; alternate Xorg drivers (if available. Alternate + means driver is on automatic driver check list of Xorg for the device vendor, + but is not installed on system); Xorg Screen data: ID, s-res, dpi; Monitors: + ID, position (if > 1), resolution, dpi, model, diagonal; APIs: EGL: per + platform report; OpenGL: ES version, device-ID, display-ID (if not found in + Display line); Vulkan: per device report."], ['2', '-I', '', "Other detected installed gcc versions (if present). System default target/runlevel. Adds parent program (or pty/tty) for shell info if not in IRC. Adds Init version number, RC (if found). Adds per package manager @@ -6053,7 +6084,8 @@ sub show_options { ['2', '-E', '', "Serial number, class ID, bluetooth device class ID, HCI version and revision."], ['2', '-G', '', "Device serial number, class ID; Xorg Screen size, diag; - Monitors: hz, size, modes, serial, scale, modes (max/min)."], + Monitors: hz, size, modes, serial, scale, modes (max/min); APIs: EGL: hardware + driver info; Vulkan: layer count, device hardware vendor."], ['2', '-I', '', "For 'Shell:' adds ([doas|su|sudo|login]) to shell name if present; adds default shell+version if different; for 'running in:' adds (SSH) if SSH session; adds wakeups: (from suspend) to Uptime."], @@ -6099,7 +6131,8 @@ sub show_options { non-free driver info (Nvidia only); PCIe lanes-max: gen, speed, lanes (if relevant); USB mode (if found); list of alternate kernel modules/drivers for device(s) (if available); Monitor built year, gamma, screen ratio (if - available)."], + available); APIs: OpenGL: device memory, unified memory status; Vulkan: adds + full device report, device name, driver version, surfaces."], ['2', '-I', '', "Adds to Packages total number of lib files found for each package manager and pm tools (if not -r); adds init service tool."], ['2', '-j,-p,-P', '', "For swap (if available): swappiness and vfs cache @@ -6140,11 +6173,12 @@ sub show_options { otherwise user is fine. Man page installs require root. No arguments downloads from main $self_name git repo."], ['1', '', '', "Use alternate sources for updating $self_name"], - ['2', '1', '', "Get the git branch one version."], - ['2', '2', '', "Get the git branch two version."], ['3', '3', '', "Get the dev server (smxi.org) version."], - ['2', '', '', "Get a version of $self_name from your own server. - Use the full download path, e.g.^$self_name^-U^https://myserver.com/inxi"], + ['3', '4', '', "Get the dev server (smxi.org) FTP version. Use if SSL issues + and --no-ssl doesn't work."], + ['2', '', '', "Get a version of $self_name from your own + server. Use the full download path, e.g. + ^$self_name^-U ^https://myserver.com/inxi"], ); } push(@$rows, @@ -6951,19 +6985,21 @@ sub message { 'edid-revision' => "invalid EDID revision: $id", 'edid-sync' => "bad sync value: $id", 'edid-version' => "invalid EDID version: $id", - 'egl-wayland' => 'No known Wayland EGL/GBM data sources.', - 'egl-wayland-console' => 'No known Wayland EGL/GBM data sources.', + 'egl-null' => 'No EGL data available.', + 'egl-missing' => 'EGL data requires eglinfo. Check --recommends.', 'file-unreadable' => 'File not readable (permissions?)', - 'gfx-api' => 'No display API data. No known data sources.', - 'gfx-api-console' => 'No display API data available in console. Headless machine?', - 'gfx-api-xvesa' => 'No Xvesa VBE/GOP data found.', - 'gl-console-glxinfo-missing' => 'GL data unavailable in console and glxinfo missing.', - 'gl-console-root' => 'GL data unavailable in console for root.', - 'gl-console-try' => 'GL data unavailable in console. Try -G --display', - 'gl-display-root' => 'GL data unavailable for root.', - 'gl-null' => 'No GL data found on this system.', - 'gl-value-empty' => 'Unset. Missing GL driver?', - 'glxinfo-missing' => 'Unable to show GL data. Required tool glxinfo missing.', + 'gfx-api' => 'No display API data available.', + 'gfx-api-console' => 'No API data available in console. Headless machine?', + 'glx-console-glxinfo-missing' => 'GL data unavailable in console, glxinfo missing.', + 'glx-console-root' => 'GL data unavailable in console for root.', + 'glx-console-try' => 'GL data unavailable in console. Try -G --display', + 'glx-display-root' => 'GL data unavailable for root.', + 'glx-egl' => 'incomplete (EGL sourced)', + 'glx-egl-console' => 'console (EGL sourced)', + 'glx-egl-missing' => 'glxinfo missing (EGL sourced)', + 'glx-null' => 'No GL data available.', + 'glx-value-empty' => 'Unset. Missing GL driver?', + 'glxinfo-missing' => 'Unable to show GL data. glxinfo is missing.', 'IP' => "No $id found. Connected to web? SSL issues?", 'IP-dig' => "No $id found. Connected to web? SSL issues? Try --no-dig", 'IP-no-dig' => "No $id found. Connected to web? SSL issues? Try enabling dig", @@ -7050,8 +7086,10 @@ sub message { 'unknown-dev' => 'ERR-102', 'unknown-device-id' => 'unknown device ID', 'unknown-shell' => 'ERR-100', + 'vulkan-null' => 'No Vulkan data available.', 'weather-error' => "Error: $id", 'weather-null' => "No $id found. Internet connection working?", + 'xvesa-null' => 'No Xvesa VBE/GOP data found.', ); return $message{$type}; } @@ -11467,6 +11505,8 @@ sub cp_cpu_arch { my $check = main::message('note-check'); # See: docs/inxi-cpu.txt # print "type:$type fam:$family model:$model step:$stepping\n"; + # Note: AMD family is not Ext fam . fam but rather Ext-fam + fam. + # But model is Ext model . model... if ($type eq 'amd'){ if ($family eq '3'){ $arch = 'Am386'; @@ -11702,6 +11742,7 @@ sub cp_cpu_arch { elsif ($family eq '19'){ # AF # zen 4 raphael, phoenix 1 use n5 I believe # Epyc Bergamo zen4c 4nm, only few full model IDs, update when appear + # zen4c is for cloud hyperscale if ($model =~ /^(78)$/){ $arch = 'Zen 4c'; $gen = '5'; @@ -11731,9 +11772,26 @@ sub cp_cpu_arch { $note = $check; $process = 'TSMC n5 (5nm)'; $year = '2021-22';} - # Zen 5: TSMC n3 } - ## Roadmap: check to verify, AMD is usually closer to target than Intel + # Zen 5: TSMC n3/n4, epyc turin / granite ridge? / turin dense zen 5c 3nm + elsif ($family eq '20'){ # BF + if ($model =~ /^(0)$/){ + $arch = 'Zen 5'; + $gen = '5'; + $process = 'TSMC n3 (3nm)'; # turin could be 4nm, need more data + $year = '2023+';} + elsif ($model =~ /^(20|40)$/){ + $arch = 'Zen 5'; + $gen = '5'; + $process = 'TSMC n3 (3nm)'; # desktop, granite ridge, confirm 2024 + $year = '2024+';} + else { + $arch = 'Zen 5'; + $note = $check; + $process = 'TSMC n3/n4 (3,4nm)'; + $year = '2024+';} + } + # Roadmap: check to verify, AMD is usually closer to target than Intel # Epyc 4 genoa: zen 4, nm, 2022+ (dec 2022), cxl-1.1,pcie-5, ddr-5 } # we have no advanced data for ARM cpus, this is an area that could be improved? @@ -12217,13 +12275,13 @@ sub cp_cpu_arch { $arch = 'Raptor Lake'; # 13 gen, socket LG 1700,1800 $process = 'Intel 7 (10nm)'; $year = '2022+';} - elsif ($model =~ /^(BD)$/){ - $arch = 'Lunar Lake'; # 16 gn + elsif ($model =~ /^(BC|BD)$/){ + $arch = 'Lunar Lake'; # 15 gn $process = 'Intel 18a (1.8nm)'; $year = '2024+';} # check when actually in production # Meteor Lake-S maybe cancelled, replaced by arrow - elsif ($model =~ /^(C6)$/){ - $arch = 'Arrow Lake'; # 15 gn + elsif ($model =~ /^(C5|C6)$/){ + $arch = 'Arrow Lake'; # 14 gn # gfx tile is TSMC 3nm $process = 'Intel 20a (2nm)';# TSMC 3nm (corei3-5)/Intel 20A 2nm (core i5-9) $year = '2024+';} # check when actually in production @@ -12238,11 +12296,11 @@ sub cp_cpu_arch { # Diamond Rapids: Intel 3 (7nm+), 2025 # Raptor Lake: 13 gen, Intel 7 (10nm), 2022 # Meteor Lake: 14 gen, Intel 4 (7nm+) - # Arrow Lake - 15 gen, TSMC 3nm (corei3-5)/Intel 20A 2nm (core i5-9), 2024 - # Panther Lake - 15 gen, ? - # Beast Lake - 15 gen, ? - # Lunar Lake - 16 gen, Intel 18A (1.8nm), 2024-5 - # Nova Lake - 17 gen, Intel 18A (1.8nm), 2026 + # Arrow Lake - 14 gen, TSMC 3nm (corei3-5)/Intel 20A 2nm (core i5-9), 2024 + # Lunar Lake - 15 gen, Intel 18A (1.8nm), 2024-5 + # Panther Lake - 15 gen, ?, late 2025, cougar cove Xe3 Celestial GPU architecture + # Beast Lake - 16 gen, ?, 2026? + # Nova Lake - 16 gen, Intel 18A (1.8nm), 2026 } # itanium 1 family 7 all recalled elsif ($family eq 'B'){ @@ -14127,18 +14185,19 @@ sub set_disk_vendors { ['(^MKN|Mushkin)','Mushkin','Mushkin',''], # MKNS # MU = Multiple_Flash_Reader too risky: |M[UZ][^L] HD103SI HD start risky # HM320II HM320II HM - ['(SAMSUNG|^(AWMB|[BC]DS20|[BC]WB|BJ[NT]|[BC]GND|CJ[NT]|CUT|[DG]3 Station|DUO\b|DUT|CKT|[GS]2 Portable|GN|HD\d{3}[A-Z]{2}$|(HM|SP)\d{2}|HS\d|M[AB]G\d[FG]|MCC|MCBOE|MCG\d+GC|[CD]JN|MZ|^G[CD][1-9][QS]|P[BM]\d|(SSD\s?)?SM\s?841)|^SSD\s?[89]\d{2}\s(DCT|PRO|QVD|\d+[GT]B)|\bEVO\b|SV\d|[BE][A-Z][1-9]QT|YP\b|[CH]N-M|MMC[QR]E)','SAMSUNG','Samsung',''], # maybe ^SM, ^HM + ['(SAMSUNG|^(AWMB|[BC]DS20|[BC]WB|BJ[NT]|[BC]GND|CJ[NT]|CKT|CUT|[DG]3 Station|DUO\b|DUT|EB\dMW|GE4S5|[GS]2 Portable|GN|HD\d{3}[A-Z]{2}$|(HM|SP)\d{2}|HS\d|M[AB]G\d[FG]|MCC|MCBOE|MCG\d+GC|[CD]JN|MZ|^G[CD][1-9][QS]|P[BM]\d|(SSD\s?)?SM\s?841)|^SSD\s?[89]\d{2}\s(DCT|PRO|QVD|\d+[GT]B)|\bEVO\b|SV\d|[BE][A-Z][1-9]QT|YP\b|[CH]N-M|MMC[QR]E)','SAMSUNG','Samsung',''], # maybe ^SM, ^HM # Android UMS Composite?U1 - ['(SanDisk|0781|^(A[BCD]LC[DE]|AFGCE|D[AB]4|DX[1-9]|Extreme|Firebird|S[CD]\d{2}G|SD(S[S]?[ADQ]|SL\d+G|SU\d|\sUltra)|SDW[1-9]|SE\d{2}|SEM[1-9]|\d[STU]|U(3\b|1\d0))|Clip Sport|Cruzer|iXpand|SSD (Plus|U1[01]0) [1-9]|ULTRA\s(FIT|trek|II)|X[1-6]\d{2})','(SanDisk|0781)','SanDisk',''], + ['(SanDisk|0781|^(A[BCD]LC[DE]|AFGCE|D[AB]4|DX[1-9]|Extreme|Firebird|S[CD]\d{2}G|SD(S[S]?[ADQ]|SL\d+G|SU\d|\sUltra)|SDW[1-9]|SE\d{2}|SEM[1-9]|\d[STU]|U(3\b|1\d0))|Clip Sport|Cruzer|iXpand|SN(\d+G|128|256)|SSD (Plus|U1[01]0) [1-9]|ULTRA\s(FIT|trek|II)|X[1-6]\d{2})','(SanDisk|0781)','SanDisk',''], # these are HP/Sandisk cobranded. DX110064A5xnNMRI ids as HP and Sandisc ['(^DX[1-9])','^(HP\b|SANDDISK)','Sandisk/HP',''], # ssd drive, must come before seagate ST test # real, SSEAGATE Backup+; XP1600HE30002 | 024 HN (spinpoint) ; possible usb: 24AS # ST[numbers] excludes other ST starting devices ['([S]?SEAGATE|^((Barra|Fire)Cuda|BUP|EM\d{3}|Expansion|(ATA\s|HDD\s)?ST\d{2}|5AS|X[AFP])|Backup(\+|\s?Plus)\s?(Hub)?|DS2\d|Expansion Desk|FreeAgent|GoFlex|INIC|IronWolf|OneTouch|Slim\s?BK)','[S]?SEAGATE','Seagate',''], - ['^(WD|WL[0]9]|Western Digital|My (Book|Passport)|\d*LPCX|Elements|easystore|EA[A-Z]S|EARX|EFRX|EZRX|\d*EAVS|G[\s-]Drive|i HTS|0JD|JP[CV]|MD0|M000|\d+(BEV|(00)?AAK|AAV|AZL|EA[CD]S)|PC\sSN|SPZX|3200[AB]|2500[BJ]|20G2|5000[AB]|6400[AB]|7500[AB]|00[ABL][A-Z]{2}|SSC\b)','(^WDC|Western\s?Digital)','Western Digital',''], + ['^(WD|WL[0]9]|Western Digital|My (Book|Passport)|\d*LPCX|Elements|easystore|EA[A-Z]S|EARX|EFRX|EZRX|\d*EAVS|G[\s-]Drive|i HTS|0JD|JP[CV]|MD0|M000|\d+(BEV|(00)?AAK|AAV|AZL|EA[CD]S)|PC\sSN|SN530|SPZX|3200[AB]|2500[BJ]|20G2|5000[AB]|6400[AB]|7500[AB]|00[ABL][A-Z]{2}|SSC\b)','(^WDC|Western\s?Digital)','Western Digital',''], # rare cases WDC is in middle of string ['(\bWDC\b|1002FAEX)','','Western Digital',''], - ## THEN BETTER KNOWN ONESs ## + + ## THEN BETTER KNOWN ONES ## ['^Acer','^Acer','Acer',''], # A-Data can be in middle of string ['^(.*\bA-?DATA|ASP\d|AX[MN]|CH11|FX63|HV[1-9]|IM2|HD[1-9]|HDD\s?CH|IUM|SX\d|Swordfish)','A-?DATA','A-Data',''], @@ -14147,7 +14206,7 @@ sub set_disk_vendors { ['^ATP','^ATP\b','ATP',''], # Force MP500 ['^(Corsair|Force\s|(Flash\s*)?(Survivor|Voyager)|Neutron|Padlock)','^Corsair','Corsair',''], - ['^(FUJITSU|MJA|MH[TVWYZ]\d|MP|MAP\d|F\d00s?-)','^FUJITSU','Fujitsu',''], + ['^(FUJITSU|MJA|MH[RTVWYZ]\d|MP|MAP\d|F\d00s?-)','^FUJITSU','Fujitsu',''], # MAB3045SP shows as HP or Fujitsu, probably HP branded fujitsu ['^(MAB\d)','^(HP\b|FUJITSU)','Fujitsu/HP',''], # note: 2012: wdc bought hgst @@ -14170,6 +14229,7 @@ sub set_disk_vendors { # note: get rid of: M[DGK] becasue mushkin starts with MK # note: seen: KXG50ZNV512G NVMe TOSHIBA 512GB | THNSN51T02DUK NVMe TOSHIBA 1024GB ['(TOSHIBA|TransMemory|KBG4|^((A\s)?DT01A|M[GKQ]\d|HDW|SA\d{2}G$|(008|016|032|064|128)G[379E][0-9A]$|[S]?TOS|THN)|0930|KSG\d)','S?(TOSHIBA|0930)','Toshiba',''], # scsi-STOSHIBA_STOR.E_EDITION_ + ## LAST: THEY ARE SHORT AND COULD LEAD TO FALSE ID, OR ARE UNLIKELY ## # unknown: AL25744_12345678; ADP may be usb 2.5" adapter; udisk unknown: Z1E6FTKJ 00AAKS # SSD2SC240G726A10 MRS020A128GTS25C EHSAJM0016GB @@ -14188,12 +14248,15 @@ sub set_disk_vendors { ['^(Advantech|SQF)','^Advantech','Advantech',''], ['^AEGO','^AEGO','AEGO',''], ['^AFOX','^AFOX','AFOX',''], + ['^AFTERSHOCK','^AFTERSHOCK','AFTERSHOCK',''], ['^(Agile|AGI)','^(AGI|Agile\s?Gear\s?Int[a-z]*)','AGI',''], ['^Aigo','^Aigo','Aigo',''], + ['^AirDisk','^AirDisk','AirDisk',''], ['^Aireye','^Aireye','Aireye',''], ['^Alcatel','^Alcatel','Alcatel',''], ['^(Alcor(\s?Micro)?|058F)','^(Alcor(\s?Micro)?|058F)','Alcor Micro',''], ['^Alfawise','^Alfawise','Alfawise',''], + ['(^ALKETRON|FireWizard)','^ALKETRON','ALKETRON',''], ['^Android','^Android','Android',''], ['^ANACOMDA','^ANACOMDA','ANACOMDA',''], ['^Ant[\s_-]?Esports','^Ant[\s_-]?Esports','Ant Esports',''], @@ -14240,12 +14303,14 @@ sub set_disk_vendors { ['^Clover','^Clover','Clover',''], ['^CODi','^CODi','CODi',''], ['^Colorful\b','^Colorful','Colorful',''], + ['^CONSISTENT','^CONSISTENT','Consistent',''], # note: www.cornbuy.com is both a brand and also sells other brands, like newegg # addlink; colorful; goldenfir; kodkak; maxson; netac; teclast; vaseky ['^Corn','^Corn','Corn',''], ['^CnMemory|Spaceloop','^CnMemory','CnMemory',''], ['^(Creative|(Nomad\s?)?MuVo)','^Creative','Creative',''], ['^CSD','^CSD','CSD',''], + ['^CYX\b','^CYX','CYX',''], ['^(Dane-?Elec|Z Mate)','^Dane-?Elec','DaneElec',''], ['^DATABAR','^DATABAR','DataBar',''], # Daplink vfs is an ARM software thing @@ -14257,6 +14322,7 @@ sub set_disk_vendors { ['^DeLOCK','^Delock(\s?products)?','Delock',''], ['^Derler','^Derler','Derler',''], ['^detech','^detech','DETech',''], + ['^DEXP','^DEXP','DEXP',''], ['^DGM','^DGM\b','DGM',''], ['^(DICOM|MAESTRO)','^DICOM','DICOM',''], ['^Digifast','^Digifast','Digifast',''], @@ -14290,8 +14356,11 @@ sub set_disk_vendors { ['^(Shenzhen\s)?Etopso(\sTechnology)?','^(Shenzhen\s)?Etopso(\sTechnology)?','Etopso',''], ['^EURS','^EURS','EURS',''], ['^eVAULT','^eVAULT','eVAULT',''], + ['^EVM','^EVM','EVM',''], + ['^eVtran','^eVtran','eVtran',''], # NOTE: ESA3... may be IBM PCIe SAD card/drives ['^(EXCELSTOR|r technology)','^EXCELSTOR( TECHNO(LOGY)?)?','ExcelStor',''], + ['^EXRAM','^EXRAM','EXRAM',''], ['^EYOTA','^EYOTA','EYOTA',''], ['^EZCOOL','^EZCOOL','EZCOOL',''], ['^EZLINK','^EZLINK','EZLINK',''], @@ -14324,6 +14393,7 @@ sub set_disk_vendors { ['^(Gigabyte|GP-G)','^Gigabyte','Gigabyte',''], # SSD ['^Gigastone','^Gigastone','Gigastone',''], ['^Gigaware','^Gigaware','Gigaware',''], + ['^GJN','^GJN\b','GJN',''], ['^(Gloway|FER\d)','^Gloway','Gloway',''], ['^GLOWY','^GLOWY','Glowy',''], ['^Goldendisk','^Goldendisk','Goldendisk',''], @@ -14350,6 +14420,7 @@ sub set_disk_vendors { ['^HEMA','^HEMA','HEMA',''], ['(HEORIADY|^HX-0)','^HEORIADY','HEORIADY',''], ['^(Hikvision|HKVSN|HS-SSD)','^Hikvision','Hikvision',''], + ['^Hi[\s-]?Level ','^Hi[\s-]?Level ','Hi-Level',''], # ^HI\b with no Level? ['^(Hisense|H8G)','^Hisense','Hisense',''], ['^Hoodisk','^Hoodisk','Hoodisk',''], ['^HUAWEI','^HUAWEI','Huawei',''], @@ -14400,6 +14471,7 @@ sub set_disk_vendors { ['^KimMIDI','^KimMIDI','KimMIDI',''], ['^Kimtigo','^Kimtigo','Kimtigo',''], ['^Kingbank','^Kingbank','Kingbank',''], + ['^(KingCell|KC\b)','^KingCell','KingCell',''], ['^Kingchux[\s-]?ing','^Kingchux[\s-]?ing','Kingchuxing',''], ['^KINGCOMP','^KINGCOMP','KingComp',''], ['(KingDian|^NGF|S(280|400))','KingDian','KingDian',''], @@ -14408,7 +14480,7 @@ sub set_disk_vendors { ['^Kingrich','^Kingrich','Kingrich',''], ['^Kingsand','^Kingsand','Kingsand',''], ['KING\s?SHA\s?RE','KING\s?SHA\s?RE','KingShare',''], - ['^(KingSpec|ACSC|C3000|KS[DQ]|N[ET]-\d|P3$|P4\b|PA[_-]?(18|25)|Q-180|T-(3260|64|128)|Z(\d\s|F\d))','^KingSpec','KingSpec',''], + ['^(KingSpec|ACSC|C3000|KS[DQ]|MSH|N[ET]-\d|P3$|P4\b|PA[_-]?(18|25)|Q-180|T-(3260|64|128)|Z(\d\s|F\d))','^KingSpec','KingSpec',''], ['^KingSSD','^KingSSD','KingSSD',''], # kingwin docking, not actual drive ['^(EZD|EZ-Dock)','','Kingwin Docking Station',''], @@ -14429,7 +14501,7 @@ sub set_disk_vendors { ['^(Lazos|L-?ISS)','^Lazos','Lazos',''], ['^LDLC','^LDLC','LDLC',''], # LENSE30512GMSP34MEAT3TA / UMIS RPITJ256PED2MWX - ['^(LEN|UMIS)','^Lenovo','Lenovo',''], + ['^(LEN|UMIS|Think)','^Lenovo','Lenovo',''], ['^RPFT','','Lenovo O.E.M.',''], # JAJS300M120C JAJM600M256C JAJS600M1024C JAJS600M256C JAJMS600M128G ['^(Leven|JAJ[MS])','^Leven','Leven',''], @@ -14444,13 +14516,13 @@ sub set_disk_vendors { ['^(LSI|MegaRAID)','^LSI\b','LSI',''], ['^(M-Systems|DiskOnKey)','^M-Systems','M-Systems',''], ['^(Mach\s*Xtreme|MXSSD|MXU|MX[\s-])','^Mach\s*Xtreme','Mach Xtreme',''], - ['^(MacroVIP|MV\d)','^MacroVIP','MacroVIP',''], + ['^(MacroVIP|MV(\d|GLD))','^MacroVIP','MacroVIP',''], # maybe MV alone ['^Mainic','^Mainic','Mainic',''], + ['^(MARSHAL\b|MAL\d)','^MARSHAL','Marshal',''], ['^Maxell','^Maxell','Maxell',''], ['^Maximus','^Maximus','Maximus',''], + ['^MAXIO','^MAXIO','Maxio',''], ['^Maxone','^Maxone','Maxone',''], - ['^(Memorex|TravelDrive|TD\s?Classic)','^Memorex','Memorex',''], - ['^(MARSHAL\b|MAL\d)','^MARSHAL','Marshal',''], ['^MARVELL','^MARVELL','Marvell',''], ['^Maxsun','^Maxsun','Maxsun',''], ['^MDT\b','^MDT','MDT (rebuilt WD/Seagate)',''], # mdt rebuilds wd/seagate hdd @@ -14458,7 +14530,9 @@ sub set_disk_vendors { ['^MD[1-9]','^Max\s*Digital','MaxDigital',''], ['^Medion','^Medion','Medion',''], ['^(MEDIAMAX|WL\d{2})','^MEDIAMAX','MediaMax',''], + ['^(Memorex|TravelDrive|TD\s?Classic)','^Memorex','Memorex',''], ['^Mengmi','^Mengmi','Mengmi',''], + ['^MicroFrom','^MicroFrom','MicroFrom',''], ['^MGTEC','^MGTEC','MGTEC',''], # must come before micron ['^(Mtron|MSP)','^Mtron','Mtron',''], @@ -14477,8 +14551,9 @@ sub set_disk_vendors { ['^Morebeck','^Morebeck','Morebeck',''], ['^(Moser\s?Bear|MBIL)','^Moser\s?Bear','Moser Bear',''], ['^(Motile|SSM\d)','^Motile','Motile',''], - ['^(Motorola|XT\d{4})','^Motorola','Motorola',''], + ['^(Motorola|XT\d{4}|Moto[\s-]?[EG])','^Motorola','Motorola',''], ['^Moweek','^Moweek','Moweek',''], + ['^Move[\s-]?Speed','^Move[\s-]?Speed','Move Speed',''], #MRMAD4B128GC9M2C ['^(MRMA|Memoright)','^Memoright','Memoright',''], ['^MSI\b','^MSI\b','MSI',''], @@ -14488,11 +14563,13 @@ sub set_disk_vendors { ['^(Myson)','^Myson([\s-]?Century)?([\s-]?Inc\.?)?','Myson Century',''], ['^(Natusun|i-flashdisk)','^Natusun','Natusun',''], ['^(Neo\s*Forza|NFS\d)','^Neo\s*Forza','Neo Forza',''], - ['^(Netac|OnlyDisk|S535N)','^Netac','Netac',''], + ['^(Netac|NS\d{3}|OnlyDisk|S535N)','^Netac','Netac',''], + ['^Newsmy','^Newsmy','Newsmy',''], ['^NFHK','^NFHK','NFHK',''], # NGFF is a type, like msata, sata ['^Nik','^Nikimi','Nikimi',''], ['^NOREL','^NOREL(SYS)?','NorelSys',''], + ['^(N[\s-]?Tech|NT\d)','^N[\s-]?Tec','N Tech',''], # coudl be ^NT alone ['^ODYS','^ODYS','ODYS',''], ['^Olympus','^Olympus','Olympus',''], ['^Orico','^Orico','Orico',''], @@ -14516,15 +14593,17 @@ sub set_disk_vendors { ['^(Premiertek|QSSD|Quaroni)','^Premiertek','Premiertek',''], ['^(-?Pretec|UltimateGuard)','-?Pretec','Pretec',''], ['^(Prolific)','^Prolific( Technolgy Inc\.)?','Prolific',''], - # PS3109S9 is the result of an error condition with ssd drive + # PS3109S9 is the result of an error condition with ssd controller: Phison PS3109 ['^PUSKILL','^PUSKILL','Puskill',''], ['QEMU','^\d*QEMU( QEMU)?','QEMU',''], # 0QUEMU QEMU HARDDISK ['(^Quantum|Fireball)','^Quantum','Quantum',''], ['(^QOOTEC|QMT)','^QOOTEC','QOOTEC',''], - ['^QUMO','^QUMO','Qumo',''], + ['^(QUMO|Q\dDT)','^QUMO','Qumo',''], + ['^QOPP','^QOPP','Qopp',''], ['^Qunion','^Qunion','Qunion',''], ['^(R[3-9]|AMD\s?(RADEON)?|Radeon)','AMD\s?(RADEON)?','AMD Radeon',''], # ssd ['^(Ramaxel|RT|RM|RPF|RDM)','^Ramaxel','Ramaxel',''], + ['^RAMOS','^RAMOS','RAmos',''], ['^(Ramsta|R[1-9])','^Ramsta','Ramsta',''], ['^RCESSD','^RCESSD','RCESSD',''], ['^(Realtek|RTL)','^Realtek','Realtek',''], @@ -14537,6 +14616,7 @@ sub set_disk_vendors { #RTDMA008RAV2BWL comes with lenovo but don't know brand ['^Runcore','^Runcore','Runcore',''], ['^Rundisk','^Rundisk','RunDisk',''], + ['^RZX','^RZX\b','RZX',''], ['^(S3Plus|S3\s?SSD)','^S3Plus','S3Plus',''], ['^(Sabrent|Rocket)','^Sabrent','Sabrent',''], ['^Sage','^Sage(\s?Micro)?','Sage Micro',''], @@ -14553,6 +14633,7 @@ sub set_disk_vendors { ['(Silicon[\s-]?Power|^SP[CP]C|^Silicon|^Diamond|^HasTopSunlightpeed)','Silicon[\s-]?Power','Silicon Power',''], # simple drive could also maybe be hgst ['^(Simple\s?Tech|Simple[\s-]?Drive)','^Simple\s?Tech','SimpleTech',''], + ['^(Simmtronics?|S[79]\d{2}|ZipX)','^Simmtronics?','Simmtronics',''], ['^SINTECHI?','^SINTECHI?','SinTech (adapter)',''], ['^SiS\b','^SiS','SiS',''], ['Smartbuy','\s?Smartbuy','Smartbuy',''], # SSD Smartbuy 60GB; mSata Smartbuy 3 @@ -14563,9 +14644,11 @@ sub set_disk_vendors { ['^Skill','^Skill','Skill',''], ['^(SMART( Storage Systems)?|TX)','^(SMART( Storage Systems)?)','Smart Storage Systems',''], ['^Sobetter','^Sobetter','Sobetter',''], + ['^Solidata','^Solidata','Solidata',''], ['^(SOLIDIGM|SSDPFK)','^SOLIDIGM\b','solidgm',''], ['^(Sony|IM9|Microvalut|S[FR]-)','^Sony','Sony',''], ['^(SSSTC|CL1-)','^SSSTC','SSSTC',''], + ['^(SST|SG[AN])','^SST\b','SST',''], ['^STE[CK]','^STE[CK]','sTec',''], # wd bought this one ['^STORFLY','^STORFLY','StorFly',''], ['\dSUN\d','^SUN(\sMicrosystems)?','Sun Microsystems',''], @@ -14587,7 +14670,7 @@ sub set_disk_vendors { ['^(TC[\s-]*SUNBOW|X3\s\d+[GT])','^TC[\s-]*SUNBOW','TCSunBow',''], ['^(TDK|TF[1-9]\d|LoR)','^TDK','TDK',''], ['^TEAC','^TEAC','TEAC',''], - ['^(TEAM|T[\s-]?Create|L\d\s?Lite|T\d{3,}[A-Z]|TM\d|(Dark\s?)?L3\b|T[\s-]?Force)','^TEAM(\s*Group)?','TeamGroup',''], + ['^(TEAM|T[\s-]?Create|CX[12]\b|L\d\s?Lite|T\d{3,}[A-Z]|TM\d|(Dark\s?)?L3\b|T[\s-]?Force)','^TEAM(\s*Group)?','TeamGroup',''], ['^(Teclast|CoolFlash)','^Teclast','Teclast',''], ['^(tecmiyo)','^tecmiyo','TECMIYO',''], ['^Teelkoou','^Teelkoou','Teelkoou',''], @@ -14635,7 +14718,7 @@ sub set_disk_vendors { ['^Walton','^Walton','Walton',''], ['^(Wearable|Air-?Stash)','^Wearable','Wearable',''], ['^Wellcomm','^Wellcomm','Wellcomm',''], - ['^(wicgtyp|N900)','^wicgtyp','wicgtyp',''], + ['^(wicgtyp|N[V]?900)','^wicgtyp','wicgtyp',''], ['^Wilk','^Wilk','Wilk',''], ['^(WinMemory|SWG\d)','^WinMemory','WinMemory',''], ['^(Winton|WT\d{2})','^Winton','Winton',''], @@ -14662,6 +14745,7 @@ sub set_disk_vendors { ['^Zenfast','^Zenfast','Zenfast',''], ['^Zenith','^Zenith','Zenith',''], ['^ZEUSLAP','^ZEUSLAP','ZEUSLAP',''], + ['^ZEUSS','^ZEUSS','Zeuss',''], ['^(Zheino|CHN|CNM)','^Zheino','Zheino',''], ['^(Zotac|ZTSSD)','^Zotac','Zotac',''], ['^ZSPEED','^ZSPEED','ZSpeed',''], @@ -14918,7 +15002,8 @@ sub drive_speed { ## GraphicItem { package GraphicItem; -my ($b_primary,$b_wayland_data,%graphics,$monitor_ids,$monitor_map); +my ($b_primary,$b_wayland_data,%graphics,%mesa_drivers, +$monitor_ids,$monitor_map); my ($gpu_amd,$gpu_intel,$gpu_nv); sub get { @@ -14955,7 +15040,7 @@ sub get { # note: not perfect, but we need usb gfx to show for all types, soc, pci, etc usb_output($rows); display_output($rows); - display_api_output($rows); + display_api($rows); (%graphics,$monitor_ids,$monitor_map) = (); eval $end if $b_log; return $rows; @@ -15605,205 +15690,375 @@ sub monitors_output_full { eval $end if $b_log; } -## DISPLAY API OUTPUT ## -# as soon as EGL data source for Wayland appears add it! -sub display_api_output { +## DISPLAY API ## + +# API Output # + +# GLX/OpenGL EGL Vulkan XVesa +sub display_api { eval $start if $b_log; my $rows = $_[0]; - my $num = 0; - my ($api,$program,$type); # print ("$b_display : $b_root\n"); # xvesa is absolute, if it's there, it works in or out of display if ($graphics{'xvesa'}){ - xvesa_output($rows,\$num); + xvesa_output($rows); + return; } - else { + my ($b_egl,$b_egl_print,$b_glx,$b_glx_print,$b_vulkan,$api,$program,$type); + my $gl = {}; + if ($fake{'egl'} || ($program = main::check_program('eglinfo'))){ + gl_data('egl',$program,$rows,$gl); + $b_egl = 1; + } + if ($fake{'glx'} || ($program = main::check_program('glxinfo'))){ + gl_data('glx',$program,$rows,$gl) if $b_display; + $b_glx = 1; + } + # Note: we let gl/egl output handle null or root null data issues + if ($gl->{'glx'}){ + process_glx_data($gl->{'glx'},$b_glx); + } + # egl/vulkan give data out of display, and for root + # if ($b_egl}){ + if ($b_egl && ($show{'graphic-full'} || !$gl->{'glx'})){ + egl_output($rows,$gl); + $b_egl_print = 1; + } + # fill in whatever was missing from eglinfo, or if legacy system/no eglinfo + # if ($b_glx || $gl->{'glx'}){ + if (($show{'graphic-full'} && ($b_glx || $gl->{'glx'})) || + (!$show{'graphic-full'} && !$b_egl_print && ($b_glx || $gl->{'glx'}))){ + opengl_output($rows,$gl); + $b_glx = 1; + $b_glx_print = 1; + } + # if ($fake{'vulkan'} || ($program = main::check_program('vulkaninfo'))){ + if (($fake{'vulkan'} || ($program = main::check_program('vulkaninfo'))) && + ($show{'graphic-full'} || (!$b_egl_print && !$b_glx_print))){ + vulkan_output($program,$rows); + $b_vulkan = 1; + } + if ($show{'graphic-full'} || (!$b_egl_print && !$b_glx_print)){ + # remember, sudo/root usually has empty $DISPLAY as well if ($b_display){ - if (!$force{'wayland'} && ($program = main::check_program('glxinfo'))){ - opengl_output($program,$rows,\$num); + # first do positive tests, won't be set for sudo/root + if (!$b_glx && $graphics{'protocol'} eq 'x11'){ + $api = 'OpenGL'; + $type = 'glxinfo-missing'; } - # handles no data until we find one for wayland egl data - elsif ($graphics{'protocol'} eq 'wayland'){ - egl_output($rows,\$num); + elsif (!$b_egl && $graphics{'protocol'} eq 'wayland'){ + $api = 'EGL'; # /GBM + $type = 'egl-missing'; } - else { - if (main::check_program('X') || main::check_program('Xorg')){ - $api = 'OpenGL'; - $type = 'glxinfo-missing'; - } - # has to come after X tests, since X can have Xwayland installed. - elsif (main::check_program('Xwayland')){ - $api = 'EGL/GBM'; - $type = 'egl-wayland'; - } - else { - $api = 'N/A'; - $type = 'gfx-api'; - } - push(@$rows,{ - main::key($num++,1,1,'API') => $api, - main::key($num++,0,2,'Message') => main::message($type) - }); + elsif (!$b_glx && + (main::check_program('X') || main::check_program('Xorg'))){ + $api = 'OpenGL'; + $type = 'glxinfo-missing'; + } + elsif (!$b_egl && main::check_program('Xwayland')){ + $api = 'EGL'; + $type = 'egl-missing'; + } + elsif (!$b_egl && !$b_glx && !$b_vulkan) { + $api = 'N/A'; + $type = 'gfx-api'; } } else { - if ($graphics{'protocol'} eq 'wayland'){ - $api = 'EGL/GBM'; - $type = 'egl-wayland-console'; - } - elsif (main::check_program('glxinfo')){ + if (!$b_glx && + (main::check_program('X') || main::check_program('Xorg'))){ $api = 'OpenGL'; - $type = ($b_root) ? 'gl-console-root' : 'gl-console-try'; + $type = 'glx-console-glxinfo-missing'; } - elsif (main::check_program('X') || main::check_program('Xorg')){ - $api = 'OpenGL'; - $type = 'gl-console-glxinfo-missing'; - } - # has to come after X tests, since X can have Xwayland installed. - elsif (main::check_program('Xwayland')){ - $api = 'EGL/GBM'; - $type = 'egl-wayland-console'; + elsif (!$b_egl && main::check_program('Xwayland')){ + $api = 'EGL'; + $type = 'egl-console-missing'; } # we don't know what it is, headless system, non xwayland wayland - else { + elsif (!$b_egl && !$b_glx && !$b_vulkan) { $api = 'N/A'; $type = 'gfx-api-console'; } - push(@$rows,{ - main::key($num++,1,1,'API') => $api, - main::key($num++,0,2,'Message') => main::message($type) - }); } + no_data_output($api,$type,$rows) if $type; } eval $end if $b_log; } +sub no_data_output { + eval $start if $b_log; + my ($api,$type,$rows) = @_; + my $num = 0; + push(@$rows, { + main::key($num++,1,1,'API') => $api, + main::key($num++,0,2,'Message') => main::message($type) + }); + eval $end if $b_log; +} + sub egl_output { eval $start if $b_log; - my ($rows,$num) = @_; - push(@$rows,{ - main::key($num++,1,1,'API') => 'EGL/GBM', - main::key($num++,0,2,'Message') => main::message('egl-wayland') + my ($rows,$gl) = @_; + if (!$gl->{'egl'}){ + my $api = 'EGL'; + my $type = 'egl-null'; + no_data_output($api,$type,$rows); + return 0; + } + my ($i,$j,$num) = (0,scalar @$rows,0); + my ($value); + my $ref; + my $data = $gl->{'egl'}{'data'}; + my $plat = $gl->{'egl'}{'platforms'}; + push(@$rows, { + main::key($num++,1,1,'API') => 'EGL', }); + if ($extra < 2){ + $value = ($data->{'versions'}) ? join(',',sort keys %{$data->{'versions'}}): 'N/A'; + } + else { + $value = ($data->{'version'}) ? $data->{'version'}: 'N/A'; + } + $rows->[$j]{main::key($num++,0,2,'v')} = $value; + if ($extra < 2){ + $value = ($data->{'drivers'}) ? join(',',sort keys %{$data->{'drivers'}}): 'N/A'; + $rows->[$j]{main::key($num++,0,2,'drivers')} = $value; + $value = ($data->{'platforms'}{'active'}) ? join(',',@{$data->{'platforms'}{'active'}}) : 'N/A'; + if ($extra < 1){ + $rows->[$j]{main::key($num++,0,2,'platforms')} = $value; + } + else { + $rows->[$j]{main::key($num++,1,2,'platforms')} = ''; + $rows->[$j]{main::key($num++,0,3,'active')} = $value; + $value = ($data->{'platforms'}{'inactive'}) ? join(',',@{$data->{'platforms'}{'inactive'}}) : 'N/A'; + $rows->[$j]{main::key($num++,0,3,'inactive')} = $value; + } + } + else { + if ($extra > 2 && $data->{'hw'}){ + $i = 0; + $rows->[$j]{main::key($num++,1,2,'hw')} = ''; + foreach my $key (sort keys %{$data->{'hw'}}){ + $value = ($key ne $data->{'hw'}{$key}) ? $data->{'hw'}{$key} . ' ' . $key: $key; + $rows->[$j]{main::key($num++,0,3,'drv')} = $value; + } + } + $rows->[$j]{main::key($num++,1,2,'platforms')} = ''; + $data->{'version'} ||= 0; + $i = 0; + foreach my $key (sort keys %$plat){ + next if !$plat->{$key}{'status'} || $plat->{$key}{'status'} eq 'inactive'; + if ($key eq 'device'){ + foreach my $id (sort keys %{$plat->{$key}}){ + next if ref $plat->{$key}{$id} ne 'HASH'; + $rows->[$j]{main::key($num++,1,3,$key)} = $id; + $ref = $plat->{$key}{$id}{'egl'}; + egl_advanced_output($rows,$ref,\$num,$j,4,$data->{'version'}); + } + } + else { + $rows->[$j]{main::key($num++,1,3,$key)} = ''; + $ref = $plat->{$key}{'egl'}; + egl_advanced_output($rows,$ref,\$num,$j,4,$data->{'version'}); + } + } + if (!$data->{'platforms'}{'active'}){ + $rows->[$j]{main::key($num++,0,3,'active')} = 'N/A'; + } + if ($data->{'platforms'}{'inactive'}){ + $rows->[$j]{main::key($num++,0,3,'inactive')} = join(',',@{$data->{'platforms'}{'inactive'}}); + } + } eval $end if $b_log; } +# args: 0: $rows; 1: data ref; 2: \$num; 3: $j; 4: indent; 5: $b_plat_v +sub egl_advanced_output { + my ($rows,$ref,$num,$j,$ind,$version) = @_; + my $value; + # version is set to 0 for math + if ($version && (!$ref->{'version'} || $version != $ref->{'version'})){ + $value = ($ref->{'version'}) ? $ref->{'version'} : 'N/A'; + $rows->[$j]{main::key($$num++,0,$ind,'egl')} = $value; + undef $value; + } + if ($ref->{'driver'}){ + $value = $ref->{'driver'}; + } + else { + if ($ref->{'vendor'} && $ref->{'vendor'} ne 'mesa'){ + $value = $ref->{'vendor'}; + } + $value ||= 'N/A'; + } + $rows->[$j]{main::key($$num++,0,$ind,'drv')} = $value; +} + sub opengl_output { eval $start if $b_log; - my ($program,$rows,$num) = @_; - # NOTE: glxinfo -B is not always available, unfortunately - my $glxinfo = main::grabber("$program $display_opt 2>/dev/null",'','','ref'); - # my $file = "$fake_data_dir/graphics/glxinfo/glxinfo-ssh-centos.txt"; - # my @glxinfo = main::reader($file); - if (!@$glxinfo){ + my ($rows,$gl) = @_; + # egl will have set $glx if present + if (!$gl->{'glx'}){ + my $api = 'OpenGL'; my $type; - if ($b_root){ - $type = 'gl-display-root'; + if ($b_display){ + $type = ($b_root) ? 'glx-display-root': 'glx-null'; } else { - $type = 'gl-null'; + $type = ($b_root) ? 'glx-console-root' : 'glx-console-try'; } - push(@$rows, { - main::key($$num++,1,1,'API') => 'OpenGL', - main::key($$num++,0,2,'Message') => main::message($type) - }); - return; + no_data_output($api,$type,$rows); + return 0; } - # print join("\n", @$glxinfo),"\n"; - my $compat_version = ''; - my ($b_compat,$b_nogl,@core_profile_version,@direct_render,@renderer, - @opengl_version,@working); - foreach (@$glxinfo){ - next if /^\s/; - if (/^opengl renderer/i){ - @working = split(/:\s*/, $_, 2); - if ($working[1]){ - $working[1] = main::clean($working[1]); - } - # note: seen cases where gl drivers are missing, with empty field value. - else { - $b_nogl = 1; - $working[1] = main::message('gl-value-empty'); - } - push(@renderer, $working[1]); - } - # dropping all conditions from this test to just show full mesa information - # there is a user case where not f and mesa apply, atom mobo - # /opengl version/ && ( f || $2 !~ /mesa/){ - elsif (/^opengl version/i){ - @working = split(/:\s*/, $_, 2); - if ($working[1]){ - # fglrx started appearing with this extra string, does not appear - # to communicate anything of value - $working[1] =~ s/(Compatibility Profile Context|\(Compatibility Profile\))//; - $working[1] =~ s/\s\s/ /g; - $working[1] =~ s/^\s+|\s+$//; - push(@opengl_version, $working[1]); - # note: this is going to be off if ever multi opengl versions appear, - # never seen one - @working = split(/\s+/, $working[1]); - $compat_version = $working[0]; - } - elsif (!$b_nogl){ - push(@opengl_version, main::message('gl-value-empty')); - } - } - elsif (/^opengl core profile version/i){ - @working = split(/:\s*/, $_, 2); - # note: no need to apply empty message here since we don't have the data - # anyway - if ($working[1]){ - # fglrx started appearing with this extra string, does not appear - # to communicate anything of value - $working[1] =~ s/(Compatibility Profile Context|\((Compatibility|Core) Profile\))//; - $working[1] =~ s/\s\s/ /g; - $working[1] =~ s/^\s+|\s+$//; - push(@core_profile_version, $working[1]); - } - } - elsif (/direct rendering/){ - @working = split(/:\s*/, $_, 2); - push(@direct_render, $working[1]); - } - # if -B was always available, we could skip this, but it is not - elsif (/GLX Visuals/){ - last; - } - } - my ($direct_render,$renderer,$version) = ('N/A','N/A','N/A'); - $direct_render = join(', ', @direct_render) if @direct_render; - # non free drivers once filtered and cleaned show the same for core and compat - # but this stopped for some reason at 4.5/4.6 nvidia - if (@core_profile_version && @opengl_version && - join('', @core_profile_version) ne join('', @opengl_version) && - !(grep {/nvidia/i} @opengl_version)){ - @opengl_version = @core_profile_version; - $b_compat = 1; - } - $version = join(', ', @opengl_version) if @opengl_version; - $renderer = join(', ', @renderer) if @renderer; - my $j = scalar @$rows; + my ($j,$num) = (scalar @$rows,0); + my $value; + # print join("\n", %$gl),"\n"; + my $glx = $gl->{'glx'}; + $glx->{'opengl'}{'version'} ||= 'N/A'; push(@$rows, { - main::key($$num++,1,1,'API') => 'OpenGL', - main::key($$num++,0,2,'v') => ($version) ? $version : 'N/A', - main::key($$num++,1,2,'renderer') => ($renderer) ? $renderer : 'N/A', + main::key($num++,1,1,'API') => 'OpenGL', + main::key($num++,0,2,'v') => $glx->{'opengl'}{'version'}, }); - if ($b_compat && $extra > 1 && $compat_version){ - $rows->[$j]{main::key($$num++,0,2,'compat-v')} = $compat_version; + if ($glx->{'opengl'}{'compatibility'}{'version'}){ + $rows->[$j]{main::key($num++,0,2,'compat-v')} = $glx->{'opengl'}{'compatibility'}{'version'}; + } + if ($glx->{'opengl'}{'vendor'}){ + $rows->[$j]{main::key($num++,1,2,'vendor')} = $glx->{'opengl'}{'vendor'}; + $glx->{'opengl'}{'driver'}{'version'} ||= 'N/A'; + $rows->[$j]{main::key($num++,0,3,'v')} = $glx->{'opengl'}{'driver'}{'version'}; + } + if ($extra > 0 && $glx->{'glx-version'}){ + $rows->[$j]{main::key($num++,0,2,'glx-v')} = $glx->{'glx-version'}; + } + if ($extra > 1 && $glx->{'es'}{'version'}){ + $rows->[$j]{main::key($num++,0,2,'es-v')} = $glx->{'es'}{'version'};; + } + if ($glx->{'note'}){ + $rows->[$j]{main::key($num++,0,2,'note')} = $glx->{'note'}; + } + if ($extra > 0 && (!$glx->{'note'} || $glx->{'direct-render'})){ + $glx->{'direct-render'} ||= 'N/A'; + $rows->[$j]{main::key($num++,0,2,'direct-render')} = $glx->{'direct-render'}; + } + if (!$glx->{'note'} || $glx->{'opengl'}{'renderer'}){ + $glx->{'opengl'}{'renderer'} ||= 'N/A'; + $rows->[$j]{main::key($num++,0,2,'renderer')} = $glx->{'opengl'}{'renderer'}; + } + if ($extra > 1 && $glx->{'info'}){ + if ($glx->{'info'}{'vendor-id'} && $glx->{'info'}{'device-id'}){ + $value = $glx->{'info'}{'vendor-id'} . ':' . $glx->{'info'}{'device-id'}; + $rows->[$j]{main::key($num++,0,2,'device-ID')} = $value; + } + if ($b_admin && $glx->{'info'}{'device-memory'}){ + $rows->[$j]{main::key($num++,1,2,'memory')} = $glx->{'info'}{'device-memory'}; + if ($glx->{'info'}{'unified-memory'}){ + $rows->[$j]{main::key($num++,0,3,'unified')} = $glx->{'info'}{'unified-memory'}; + } + } + # display id depends on xdpyinfo in Display line, which may not be present, + if (!$graphics{'display-id'} && $glx->{'display-id'} && $extra > 1){ + $rows->[$j]{main::key($num++,0,2,'display-ID')} = $glx->{'display-id'}; + } + } + eval $end if $b_log; +} + +sub vulkan_output { + eval $start if $b_log; + my ($program,$rows) = @_; + my $vulkan = {}; + vulkan_data($program,$vulkan); + if (!%$vulkan){ + my $api = 'Vulkan'; + my $type = 'vulkan-null'; + no_data_output($api,$type,$rows); + return 0; + } + my $num = 0; + my $j = scalar @$rows; + my ($value); + my $data = $vulkan->{'data'}; + my $devices = $vulkan->{'devices'}; + $data->{'version'} ||= 'N/A'; + push(@$rows,{ + main::key($num++,1,1,'API') => 'Vulkan', + main::key($num++,0,2,'v') => $data->{'version'}, + }); + # this will be expanded with -a to a full device report + if ($extra < 2){ + $value = ($data->{'drivers'}) ? join(',',@{$data->{'drivers'}}): 'N/A'; + $rows->[$j]{main::key($num++,0,2,'drivers')} = $value; + } + if ($extra > 2){ + $data->{'layers'} ||= 'N/A'; + $rows->[$j]{main::key($num++,0,2,'layers')} = $data->{'layers'}; + } + if (!$b_admin){ + $value = ($data->{'surfaces'}) ? join(',',@{$data->{'surfaces'}}) : 'N/A'; + $rows->[$j]{main::key($num++,0,2,'surfaces')} = $value; } if ($extra > 0){ - $rows->[$j]{main::key($$num++,0,2,'direct-render')} = $direct_render; + if (!$devices){ + $rows->[$j]{main::key($num++,0,2,'devices')} = 'N/A'; + } + else { + if ($extra < 2){ + $value = scalar keys %{$devices}; + $rows->[$j]{main::key($num++,0,2,'devices')} = $value; + } + else { + foreach my $id (sort keys %$devices){ + $rows->[$j]{main::key($num++,1,2,'device')} = $id; + $devices->{$id}{'device-type'} ||= 'N/A'; + $rows->[$j]{main::key($num++,0,3,'type')} = $devices->{$id}{'device-type'}; + if ((($extra == 3 && !$b_admin) || + ($extra > 2 && !$devices->{$id}{'device-name'})) && + $devices->{$id}{'hw'} && $devices->{$id}{'hw'} ne 'nvidia'){ + $rows->[$j]{main::key($num++,0,3,'hw')} = $devices->{$id}{'hw'}; + } + if ($b_admin){ + $value = ($devices->{$id}{'device-name'}) ? + $devices->{$id}{'device-name'}: 'N/A'; + $rows->[$j]{main::key($num++,0,3,'name')} = $value; + } + if ($extra > 1){ + if ($devices->{$id}{'driver-name'}){ + $value = $devices->{$id}{'driver-name'}; + if ($devices->{$id}{'mesa'} && $value ne 'mesa'){ + $value = 'mesa ' . $value; + } + $rows->[$j]{main::key($num++,1,3,'driver')} = $value; + if ($b_admin && $devices->{$id}{'driver-info'}){ + $rows->[$j]{main::key($num++,0,4,'v')} = $devices->{$id}{'driver-info'}; + } + } + else { + $rows->[$j]{main::key($num++,0,3,'driver')} = 'N/A'; + } + $value = ($devices->{$id}{'device-id'} && $devices->{$id}{'vendor-id'}) ? + $devices->{$id}{'vendor-id'} . ':' . $devices->{$id}{'device-id'} : 'N/A'; + $rows->[$j]{main::key($num++,0,3,'device-ID')} = $value; + if ($b_admin){ + $value = ($devices->{$id}{'surfaces'}) ? + join(',',@{$devices->{$id}{'surfaces'}}): 'N/A'; + $rows->[$j]{main::key($num++,0,3,'surfaces')} = $value; + } + } + } + } + } } eval $end if $b_log; } sub xvesa_output { eval $start if $b_log; - my ($rows,$num) = @_; + my ($rows) = @_; my ($controller,$dac,$interface,$ram,$source,$version); # note: goes to stderr, not stdout my @data = main::grabber($graphics{'xvesa'} . ' -listmodes 2>&1'); my $j = scalar @$rows; + my $num = 0; # gop replaced uga, both for uefi # WARNING! Never seen a GOP type UEFI, needs more data if ($data[0] && $data[0] =~ /^(VBE|GOP|UGA)\s+version\s+(\S+)\s\(([^)]+)\)/i){ @@ -15820,24 +16075,706 @@ sub xvesa_output { $ram = main::get_size($ram,'string'); } if (!$interface){ - $rows->[$j]{main::key($$num++,1,1,'API')} = 'VBE/GOP'; - $rows->[$j]{main::key($$num++,0,2,'Message')} = main::message('gfx-api-xvesa'); + $rows->[$j]{main::key($num++,1,1,'API')} = 'VBE/GOP'; + $rows->[$j]{main::key($num++,0,2,'Message')} = main::message('xvesa-null'); } else { - $rows->[$j]{main::key($$num++,1,1,'API')} = $interface; - $rows->[$j]{main::key($$num++,0,2,'v')} = ($version) ? $version : 'N/A'; - $rows->[$j]{main::key($$num++,0,2,'source')} = ($source) ? $source : 'N/A'; + $rows->[$j]{main::key($num++,1,1,'API')} = $interface; + $rows->[$j]{main::key($num++,0,2,'v')} = ($version) ? $version : 'N/A'; + $rows->[$j]{main::key($num++,0,2,'source')} = ($source) ? $source : 'N/A'; if ($dac){ - $rows->[$j]{main::key($$num++,0,2,'dac')} = $dac; - $rows->[$j]{main::key($$num++,0,2,'controller')} = $controller; + $rows->[$j]{main::key($num++,0,2,'dac')} = $dac; + $rows->[$j]{main::key($num++,0,2,'controller')} = $controller; } if ($ram){ - $rows->[$j]{main::key($$num++,0,2,'ram')} = $ram; + $rows->[$j]{main::key($num++,0,2,'ram')} = $ram; } } eval $end if $b_log; } +# API Data # +sub gl_data { + eval $start if $b_log; + my ($source,$program,$rows,$gl) = @_; + my ($b_opengl,$msg); + my ($gl_data,$results) = ([],[]); + # only check these if no eglinfo or eglinfo had no opengl data + $b_opengl = 1 if ($source eq 'egl' || !$gl->{'glx'}); + # NOTE: glxinfo -B is not always available, unfortunately + if ($dbg[56] || $b_log){ + $msg = "${line1}GL Source: $source\n${line3}"; + print $msg if $dbg[56]; + push(@$results,$msg) if $b_log; + } + if ($source eq 'glx'){ + if (!$fake{'glx'}){ + $gl_data = main::grabber("$program $display_opt 2>/dev/null",'','','ref'); + } + else { + my $file; + # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-2012-nvidia-glx1.4.txt"; + # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-ssh-centos.txt"; + # $file = "$fake_data_dir/graphics/glxinfo/glxiinfo-t420-intel-1.txt"; + # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-mali-allwinner-lima-1.txt"; + # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-partial-intel-5500-1.txt"; + # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-vbox-debian-etch-1.txt"; + $file = "$fake_data_dir/graphics/glxinfo/glxinfo-x11-neomagic-lenny-1.txt"; + $file = "$fake_data_dir/graphics/glxinfo/glxinfo-nvidia-gl4.6-chr.txt"; + $file = "$fake_data_dir/graphics/glxinfo/glxinfo-intel-atom-dell_studio-bm.txt"; + $file = "$fake_data_dir/graphics/glxinfo/glxinfo-asus_1025c-atom-bm.txt"; + $gl_data= main::reader($file,'','ref'); + } + } + else { + if (!$fake{'egl'}){ + $gl_data = main::grabber("$program 2>/dev/null",'','','ref'); + } + else { + my $file; + $file = "$fake_data_dir/graphics/egl-es/eglinfo-x11-3.txt"; + # $file = "$fake_data_dir/graphics/egl-es/eglinfo-wayland-intel-c30.txt"; + # $file = "$fake_data_dir/grapOhics/egl-es/eglinfo-2022-x11-nvidia-egl1.5.txt"; + # $file = "$fake_data_dir/graphics/egl-es/eglinfo-wayland-intel-nvidia-radu.txt"; + $file = "$fake_data_dir/graphics/egl-es/eglinfo-intel-atom-dell_studio-bm.txt"; + $file = "$fake_data_dir/graphics/egl-es/eglinfo-asus_1025c-atom-bm.txt"; + $gl_data = main::reader($file,'','ref'); + } + } + # print join("\n", @$gl_data),"\n"; + if (!$gl_data || !@$gl_data){ + if ($dbg[56] || $b_log){ + $msg = "No data found for GL Source: $source" if $dbg[56]; + print "$msg\n" if $dbg[56]; + push(@$results,$msg) if $b_log; + } + return 0; + } + # some error cases have only a few top value but not empty + elsif ($source eq 'glx' && scalar @$gl_data > 5){ + $gl->{'glx'}{'source'} = $source; + } + set_mesa_drivers() if $source eq 'egl' && !%mesa_drivers; + my ($b_device,$b_platform,$b_mem_info,$b_rend_info,$device,$platform, + $value,$value2,@working); + foreach my $line (@$gl_data){ + next if (!$b_rend_info && !$b_mem_info) && $line =~ /^(\s|0x)/; + if (($b_rend_info || $b_mem_info) && $line =~ /^\S/){ + ($b_mem_info,$b_rend_info) = (); + } + @working = split(/\s*:\s*/,$line,2); + next if !@working; + if ($dbg[56] || $b_log){ + $msg = $line; + print "$msg\n" if $dbg[56]; + push(@$results,$msg) if $b_log; + } + if ($source eq 'egl'){ + # eglinfo: eglInitialize failed + # This is first line after platform fail for devices, but for Device + # it would be the second or later line. The Device platform can fail, or + # specific device can fail + if ($b_platform){ + $value = ($line =~ /Initialize failed/) ? 'inactive': 'active'; + push(@{$gl->{'egl'}{'data'}{'platforms'}{$value}},$platform); + $gl->{'egl'}{'platforms'}{$platform}{'status'} = $value; + $b_platform = 0; + } + # note: can be sub item: Platform Device platform:; Platform Device: + elsif ($working[0] =~ /^(\S+) platform/i){ + $platform = lc($1); + undef $device; + $b_platform = 1; + } + if ($platform && defined $device && $working[0] eq 'eglinfo'){ + push(@{$gl->{'egl'}{'data'}{'platforms'}{'inactive'}},"$platform-$device"); + undef $device; + } + if ($platform && $platform eq 'device' && $working[0] =~ /^Device #(\d+)/){ + $device = $1; + } + if ($working[0] eq 'EGL API version'){ + if (!defined $platform){ + $gl->{'egl'}{'data'}{'api-version'} = $working[1]; + } + elsif (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'api-version'} = $working[1]; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'api-version'} = $working[1]; + } + } + elsif ($working[0] eq 'EGL version string'){ + if (!defined $platform){ + $gl->{'egl'}{'data'}{'version'} = $working[1]; + } + elsif (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'version'} = $working[1]; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'version'} = $working[1]; + } + $value = (defined $device) ? "$platform-$device": $platform; + push(@{$gl->{'egl'}{'data'}{'versions'}{$working[1]}},$value); + if (!$gl->{'egl'}{'data'}{'version'} || + $working[1] > $gl->{'egl'}{'data'}{'version'}){ + $gl->{'egl'}{'data'}{'version'} = $working[1]; + } + } + elsif ($working[0] eq 'EGL vendor string'){ + $working[1] = lc($working[1]); + $working[1] =~ s/^(\S+)(\s.+|$)/$1/; + if (!defined $platform){ + $gl->{'egl'}{'data'}{'vendor'} = $working[1]; + } + elsif (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'vendor'} = $working[1]; + if ($working[1] eq 'nvidia'){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'driver'} = $working[1]; + } + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'vendor'} = $working[1]; + if ($working[1] eq 'nvidia'){ + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'driver'} = $working[1]; + } + } + push(@{$gl->{'egl'}{'data'}{'vendors'}},$working[1]); + if ($working[1] eq 'nvidia'){ + $value = (defined $device) ? "$platform-$device": $platform; + push(@{$gl->{'egl'}{'data'}{'drivers'}{$working[1]}},$value); + $gl->{'egl'}{'data'}{'hw'}{$working[1]} = $working[1]; + } + } + elsif ($working[0] eq 'EGL driver name'){ + if (!defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'driver'} = $working[1]; + if ($mesa_drivers{$working[1]}){ + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'hw'} = $mesa_drivers{$working[1]}; + } + } + else { + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'driver'} = $working[1]; + if ($mesa_drivers{$working[1]}){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'hw'} = $mesa_drivers{$working[1]}; + } + } + $value = (defined $device) ? "$platform-$device": $platform; + push(@{$gl->{'egl'}{'data'}{'drivers'}{$working[1]}},$value); + if ($mesa_drivers{$working[1]}){ + $gl->{'egl'}{'data'}{'hw'}{$working[1]} = $mesa_drivers{$working[1]}; + } + } + if ($working[0] eq 'EGL client APIs'){ + if (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'client-apis'} = [split(/\s+/,$working[1])]; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'client-apis'} = [split(/\s+/,$working[1])]; + } + } + } + # glx specific values, only found in glxinfo + else { + if (lc($working[0]) eq 'direct rendering'){ + $working[1] = lc($working[1]); + if (!$gl->{'glx'}{'direct-renderers'} || + !(grep {$_ eq $working[1]} @{$gl->{'glx'}{'direct-renders'}})){ + push(@{$gl->{'glx'}{'direct-renders'}}, $working[1]); + } + } + # name of display: does not always list the screen number + elsif (lc($working[0]) eq 'display'){ + if ($working[1] =~ /^(:\d+)\s+screen:\s+(\d+)/){ + $gl->{'glx'}{'display-id'} = $1 . '.' . $2; + } + } + elsif (lc($working[0]) eq 'glx version'){ + if (!$gl->{'glx'}{'glx-version'}){ + $gl->{'glx'}{'glx-version'} = $working[1]; + } + } + elsif (!$b_rend_info && $working[0] =~ /^Extended renderer info/i){ + $b_rend_info = 1; + } + # only check Memory info if no prior device memory found + elsif (!$b_mem_info && $working[0] =~ /^Memory info/i){ + $b_mem_info = (!$gl->{'glx'}{'info'} || !$gl->{'glx'}{'info'}{'device-memory'}) ? 1 : 0; + } + elsif ($b_rend_info){ + if ($line =~ /^\s+Vendor:\s+.*?\(0x([\da-f]+)\)$/){ + $gl->{'glx'}{'info'}{'vendor-id'} = sprintf("%04s",$1); + } + elsif ($line =~ /^\s+Device:\s+.*?\(0x([\da-f]+)\)$/){ + $gl->{'glx'}{'info'}{'device-id'} = sprintf("%04s",$1); + } + elsif ($line =~ /^\s+Video memory:\s+(\d+\s?[MG]B)$/){ + my $size = main::translate_size($1); + $gl->{'glx'}{'info'}{'device-memory'} = main::get_size($size,'string'); + } + elsif ($line =~ /^\s+Unified memory:\s+(\S+)$/){ + $gl->{'glx'}{'info'}{'unified-memory'} = lc($1); + } + } + elsif ($b_mem_info){ + # fallback, nvidia does not seem to have Extended renderer info + if ($line =~ /^\s+Dedicated video memory:\s+(\d+\s?[MG]B)$/){ + my $size = main::translate_size($1); + $gl->{'glx'}{'info'}{'device-memory'} = main::get_size($size,'string'); + $b_mem_info = 0; + } + # we're in the wrong memory block! + elsif ($line =~ /^\s+(VBO|Texture)/){ + $b_mem_info = 0; + } + } + elsif (lc($working[0]) eq 'opengl vendor string'){ + if ($working[1] =~ /^([^\s]+)(\s+\S+)?/){ + my $vendor = lc($1); + $vendor =~ s/(^mesa\/|[\.,]$)//; # Seen Mesa/X.org + if (!$gl->{'glx'}{'opengl'}{'vendor'}){ + $gl->{'glx'}{'opengl'}{'vendor'} = $vendor; + } + } + } + elsif (lc($working[0]) eq 'opengl renderer string'){ + if ($working[1]){ + $working[1] = main::clean($working[1]); + } + # note: seen cases where gl drivers are missing, with empty field value. + else { + $gl->{'glx'}{'no-gl'} = 1; + $working[1] = main::message('glx-value-empty'); + } + if (!$gl->{'glx'}{'opengl'}{'renderers'} || + !(grep {$_ eq $working[1]} @{$gl->{'glx'}{'opengl'}{'renderers'}})){ + push(@{$gl->{'glx'}{'opengl'}{'renderers'}}, $working[1]) ; + } + } + # Dropping all conditions from this test to just show full mesa information + # there is a user case where not f and mesa apply, atom mobo + # This can be the compatibility version, or just the version the hardware + # supports. Core version will override always if present. + elsif (lc($working[0]) eq 'opengl version string'){ + if ($working[1]){ + # first grab the actual gl version + # non free drivers like nvidia may only show their driver version info + if ($working[1] =~ /^(\S+)(\s|$)/){ + push(@{$gl->{'glx'}{'opengl'}{'versions'}}, $1); + } + # handle legacy format: 1.2 (1.5 Mesa 6.5.1) as well as more current: + # 4.5 (Compatibility Profile) Mesa 22.3.6 + # Note: legacy: fglrx starting adding compat strings but they don't + # change this result: + # 4.5 Compatibility Profile Context Mesa 15.3.6 + if ($working[1] =~ /(Mesa|NVIDIA)\s(\S+?)\)?$/i){ + if ($1 && $2 && !$gl->{'glx'}{'opengl'}{'driver'}){ + $gl->{'glx'}{'opengl'}{'driver'}{'vendor'} = lc($1); + $gl->{'glx'}{'opengl'}{'driver'}{'version'} = $2; + } + } + } + elsif (!$gl->{'glx'}{'no-gl'}){ + $gl->{'glx'}{'no-gl'} = 1; + push(@{$gl->{'glx'}{'opengl'}{'versions'}},main::message('glx-value-empty')); + } + } + # if -B was always available, we could skip this, but it is not + elsif ($line =~ /GLX Visuals/){ + last; + } + } + # eglinfo/glxinfo share these + if ($b_opengl){ + if ($working[0] =~ /^OpenGL (compatibility|core) profile version( string)?$/){ + $value = lc($1); + # note: no need to apply empty message here since we don't have the data + # anyway + if ($working[1]){ + # non free drivers like nvidia only show their driver version info + if ($working[1] =~ /^(\S+)(\s|$)/){ + push(@{$gl->{'glx'}{'opengl'}{$value}{'versions'}}, $1); + } + # fglrx started appearing with this extra string, does not appear + # to communicate anything of value + if ($working[1] =~ /\s+(Mesa|NVIDIA)\s+(\S+)$/){ + if ($1 && $2 && !$gl->{'glx'}{'opengl'}{$value}{'vendor'}){ + $gl->{'glx'}{'opengl'}{$value}{'driver'}{'vendor'} = lc($1); + $gl->{'glx'}{'opengl'}{$value}{'driver'}{'version'} = $2; + } + if ($source eq 'egl' && $platform){ + if (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{$value}{'vendor'} = lc($1); + $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{$value}{'version'} = $2; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{$value}{'vendor'} = lc($1); + $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{$value}{'version'} = $2; + } + } + } + } + } + elsif ($working[0] =~ /^OpenGL (compatibility|core) profile renderer?$/){ + $value = lc($1); + if ($working[1]){ + $working[1] = main::clean($working[1]); + } + # note: seen cases where gl drivers are missing, with empty field value. + else { + $gl->{'glx'}{'no-gl'} = 1; + $working[1] = main::message('glx-value-empty'); + } + if (!$gl->{'glx'}{'opengl'}{$value}{'renderers'} || + !(grep {$_ eq $working[1]} @{$gl->{'glx'}{'opengl'}{$value}{'renderers'}})){ + push(@{$gl->{'glx'}{'opengl'}{$value}{'renderers'}}, $working[1]) ; + } + if ($source eq 'egl' && $platform){ + if ($value eq 'core'){ + $value2 = (defined $device) ? "$platform-$device": $platform; + push(@{$gl->{'egl'}{'data'}{'renderers'}{$working[1]}},$value2); + } + if (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{$value}{'renderer'} = $working[1]; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{$value}{'renderer'} = $working[1]; + } + } + } + elsif ($working[0] =~ /^OpenGL (compatibility|core) profile vendor$/){ + $value = lc($1); + if (!$gl->{'glx'}{'opengl'}{$value}{'vendors'} || + !(grep {$_ eq $working[1]} @{$gl->{'glx'}{'opengl'}{$value}{'vendors'}})){ + push(@{$gl->{'glx'}{'opengl'}{$value}{'vendors'}}, $working[1]) ; + } + if ($source eq 'egl' && $platform){ + if (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{$value}{'vendor'} = $working[1]; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{$value}{'vendor'} = $working[1]; + } + + } + } + elsif (lc($working[0]) eq 'opengl es profile version string'){ + if ($working[1] && !$gl->{'glx'}{'es-version'}){ + # OpenGL ES 3.2 Mesa 23.0.3 + if ($working[1] =~ /^OpenGL ES (\S+) Mesa (\S+)/){ + $gl->{'glx'}{'es'}{'version'} = $1; + if ($2 && !$gl->{'glx'}{'es'}{'mesa-version'}){ + $gl->{'glx'}{'es'}{'mesa-version'} = $2; + } + if ($source eq 'egl' && $platform){ + if (defined $device){ + $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{'es'}{'vendor'} = 'mesa'; + $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{'es'}{'version'} = $working[1]; + } + else { + $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{'es'}{'vendor'} = 'mesa'; + $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{'es'}{'version'} = $working[1]; + } + } + } + } + } + } + } + main::log_data('dump',"$source \$results",$results) if $b_log; + if ($source eq 'egl'){ + print "GL Data: $source: ", Data::Dumper::Dumper $gl if $dbg[57]; + main::log_data('dump',"GL data: $source:",$gl) if $b_log; + } + else { + print "GL Data: $source: ", Data::Dumper::Dumper $gl->{'glx'} if $dbg[57]; + main::log_data('dump',"GLX data: $source:",$gl->{'glx'}) if $b_log; + } + eval $end if $b_log; +} + +sub process_glx_data { + eval $start if $b_log; + my ($glx,$b_glx) = @_; + my $value; + # Remember: if you test for a hash ref hash ref, you create the first hash ref! + if ($glx->{'direct-renders'}){ + $glx->{'direct-render'} = join(', ', @{$glx->{'direct-renders'}}); + } + if (!$glx->{'opengl'}{'renderers'} && $glx->{'opengl'}{'compatibility'} && + $glx->{'opengl'}{'compatibility'}{'renderers'}){ + $glx->{'opengl'}{'renderers'} = $glx->{'opengl'}{'compatibility'}{'renderers'}; + } + # This is tricky, GLX OpenGL version string can be compatibility version, + # but usually they are the same. Just in case, try this. Note these are + # x.y.z type numbering formats generally so use string compare + if ($glx->{'opengl'}{'core'} && $glx->{'opengl'}{'core'}{'versions'}){ + $glx->{'opengl'}{'version'} = (sort @{$glx->{'opengl'}{'core'}{'versions'}})[-1]; + } + elsif ($glx->{'opengl'}{'versions'}){ + $glx->{'opengl'}{'version'} = (sort @{$glx->{'opengl'}{'versions'}})[-1]; + } + if ($glx->{'opengl'}{'version'} && + ($glx->{'opengl'}{'compatibility'} || $glx->{'opengl'}{'versions'})){ + # print "v: $glx->{'opengl'}{'version'}\n"; + # print Data::Dumper::Dumper $glx->{'opengl'}{'versions'}; + # print 'v1: ', (sort @{$glx->{'opengl'}{'versions'}})[0], "\n"; + # here we look for different versions, and determine most likely compat one + if ($glx->{'opengl'}{'compatibility'} && + $glx->{'opengl'}{'compatibility'}{'versions'} && + (sort @{$glx->{'opengl'}{'compatibility'}{'versions'}})[0] ne $glx->{'opengl'}{'version'}){ + $value = (sort @{$glx->{'opengl'}{'compatibility'}{'versions'}})[0]; + $glx->{'opengl'}{'compatibility'}{'version'} = $value; + } + elsif ($glx->{'opengl'}{'versions'} && + (sort @{$glx->{'opengl'}{'versions'}})[0] ne $glx->{'opengl'}{'version'}){ + $value = (sort @{$glx->{'opengl'}{'versions'}})[0]; + $glx->{'opengl'}{'compatibility'}{'version'} = $value; + } + } + if ($glx->{'opengl'}{'renderers'}){ + $glx->{'opengl'}{'renderer'} = join(', ', @{$glx->{'opengl'}{'renderers'}}); + } + # likely eglinfo or advanced glxinfo + if ($glx->{'opengl'}{'vendor'} && + $glx->{'opengl'}{'core'} && + $glx->{'opengl'}{'core'}{'driver'} && + $glx->{'opengl'}{'core'}{'driver'}{'vendor'} && + $glx->{'opengl'}{'core'}{'driver'}{'vendor'} eq 'mesa' && + $glx->{'opengl'}{'vendor'} ne $glx->{'opengl'}{'core'}{'driver'}{'vendor'}){ + $value = $glx->{'opengl'}{'vendor'} . ' '; + $value .= $glx->{'opengl'}{'core'}{'driver'}{'vendor'}; + $glx->{'opengl'}{'vendor'} = $value; + } + # this can be glxinfo only case, no eglinfo + elsif ($glx->{'opengl'}{'vendor'} && + $glx->{'opengl'}{'driver'} && + $glx->{'opengl'}{'driver'}{'vendor'} && + $glx->{'opengl'}{'driver'}{'vendor'} eq 'mesa' && + $glx->{'opengl'}{'vendor'} ne $glx->{'opengl'}{'driver'}{'vendor'}){ + $value = $glx->{'opengl'}{'vendor'} . ' '; + $value .= $glx->{'opengl'}{'driver'}{'vendor'}; + $glx->{'opengl'}{'vendor'} = $value; + } + elsif (!$glx->{'opengl'}{'vendor'} && + $glx->{'opengl'}{'core'} && $glx->{'opengl'}{'core'}{'driver'} && + $glx->{'opengl'}{'core'}{'driver'}{'vendor'}){ + $glx->{'opengl'}{'vendor'} = $glx->{'opengl'}{'core'}{'driver'}{'vendor'}; + } + if ((!$glx->{'opengl'}{'driver'} || + !$glx->{'opengl'}{'driver'}{'version'}) && + $glx->{'opengl'}{'core'} && + $glx->{'opengl'}{'core'}{'driver'} && + $glx->{'opengl'}{'core'}{'driver'}{'version'}){ + $value = $glx->{'opengl'}{'core'}{'driver'}{'version'}; + $glx->{'opengl'}{'driver'}{'version'} = $value; + } + # only tripped when glx filled by eglinfo + if (!$glx->{'source'}){ + my $type; + if (!$b_glx){ + $type = 'glx-egl-missing'; + } + elsif ($b_display){ + $type = 'glx-egl'; + } + else { + $type = 'glx-egl-console'; + } + $glx->{'note'} = main::message($type); + } + print "GLX Data: ", Data::Dumper::Dumper $glx if $dbg[57]; + main::log_data('dump',"GLX data:",$glx) if $b_log; + eval $end if $b_log; +} + +sub vulkan_data { + eval $start if $b_log; + my ($program,$vulkan) = @_; + my ($data,$msg,@working); + my ($results) = ([]); + if ($dbg[56] || $b_log){ + $msg = "${line1}Vulkan Data\n${line3}"; + print $msg if $dbg[56]; + push(@$results,$msg) if $b_log; + } + if (!$fake{'vulkan'}){ + $data = main::grabber("$program 2>/dev/null",'','','ref'); + } + else { + my $file; + $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-intel-llvm-1.txt"; + $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-nvidia-1.txt"; + $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-intel-1.txt"; + $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-amd-dz.txt"; + $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-mali-3.txt"; + $data = main::reader($file,'','ref'); + } + if (!$data){ + if ($dbg[56] || $b_log){ + $msg = "No Vulkan data found" if $dbg[56]; + print "$msg\n" if $dbg[56]; + push(@$results,$msg) if $b_log; + } + return 0; + } + set_mesa_drivers() if !%mesa_drivers; + my ($id,%active); + foreach my $line (@$data){ + next if $line =~ /^(\s*|-+|=+)$/; + @working = split(/\s*:\s*/,$line,2); + next if !@working; + if ($line =~ /^\S/){ + if ($active{'start'}){undef $active{'start'}} + if ($active{'layers'}){undef $active{'layers'}} + if ($active{'groups'}){undef $active{'groups'}} + if ($active{'limits'}){undef $active{'limits'}} + if ($active{'features'}){undef $active{'features'}} + if ($active{'extensions'}){undef $active{'extensions'}} + if ($active{'format'}){undef $active{'format'}} + if ($active{'driver'}){($active{'driver'},$id) = ()} + } + next if $active{'start'}; + next if $active{'groups'}; + next if $active{'limits'}; + next if $active{'features'}; + next if $active{'extensions'}; + next if $active{'format'}; + if ($dbg[56] || $b_log){ + $msg = $line; + print "$msg\n" if $dbg[56]; + push(@$results,$msg) if $b_log; + } + if ($working[0] eq 'Vulkan Instance Version'){ + $vulkan->{'data'}{'version'} = $working[1]; + $active{'start'} = 1; + } + elsif ($working[0] eq 'Layers'){ + if ($working[1] =~ /count\s*=\s*(\d+)/){ + $vulkan->{'data'}{'layers'} = $1; + } + $active{'layers'} = 1; + } + # note: can't close this because Intel didn't use proper indentation + elsif ($working[0] eq 'Presentable Surfaces'){ + $active{'surfaces'} = 1; + } + elsif ($working[0] eq 'Device Groups'){ + $active{'groups'} = 1; + $active{'surfaces'} = 0; + } + elsif ($working[0] eq 'Device Properties and Extensions'){ + $active{'devices'} = 1; + $active{'surfaces'} = 0; + undef $id; + } + elsif ($working[0] eq 'VkPhysicalDeviceProperties'){ + $active{'props'} = 1; + } + elsif ($working[0] eq 'VkPhysicalDeviceDriverProperties'){ + $active{'driver'} = 1; + } + elsif ($working[0] =~ /^\S+Features/i){ + $active{'features'} = 1; + } + # seen as line starter string or inner VkPhysicalDeviceProperties + elsif ($working[0] =~ /^\s*\S+Limits/i){ + $active{'limits'} = 1; + } + elsif ($working[0] =~ /^FORMAT_/){ + $active{'format'} = 1; + } + elsif ($working[0] =~ /^(Device|Instance) Extensions/){ + $active{'extensions'} = 1; + } + if ($active{'surfaces'}){ + if ($working[0] eq 'GPU id'){ + if ($working[1] =~ /^(\d+)\s+\((.*?)\):?$/){ + $id = $1; + $vulkan->{'devices'}{$id}{'model'} = main::clean($2); + } + } + if (defined $id){ + # seen leading space, no leading space + if ($line =~ /^\s*Surface type/){ + $active{'surface-type'} = 1; + } + if ($active{'surface-type'} && $line =~ /\S+_(\S+)_surface$/){ + if (!$vulkan->{'devices'}{$id}{'surfaces'} || + !(grep {$_ eq $1} @{$vulkan->{'devices'}{$id}{'surfaces'}})){ + push(@{$vulkan->{'devices'}{$id}{'surfaces'}},$1); + } + if (!$vulkan->{'data'}{'surfaces'} || + !(grep {$_ eq $1} @{$vulkan->{'data'}{'surfaces'}})){ + push(@{$vulkan->{'data'}{'surfaces'}},$1); + } + } + if ($working[0] =~ /^\s*Formats/){ + undef $active{'surface-type'}; + } + } + } + if ($active{'devices'}){ + if ($working[0] =~ /^GPU(\d+)/){ + $id = $1; + } + elsif (defined $id){ + # apiVersion=4194528 (1.0.224); 1.3.246 (4206838); 79695971 (0x4c01063) + if ($line =~ /^\s+apiVersion\s*=\s*(\S+)(\s+\(([^)]+)\))?/i){ + my ($a,$b) = ($1,$3); + my $api = (!$b || $b =~ /^(0x)?\d+$/) ? $a : $b; + $vulkan->{'devices'}{$id}{'device-api-version'} = $api; + } + elsif ($line =~ /^\s+driverVersion\s*=\s*(\S+)/i){ + $vulkan->{'devices'}{$id}{'device-driver-version'} = $1; + } + elsif ($line =~ /^\s+vendorID\s*=\s*0x(\S+)/i){ + $vulkan->{'devices'}{$id}{'vendor-id'} = $1; + } + elsif ($line =~ /^\s+deviceID\s*=\s*0x(\S+)/i){ + $vulkan->{'devices'}{$id}{'device-id'} = $1; + } + # deviceType=DISCRETE_GPU; PHYSICAL_DEVICE_TYPE_DISCRETE_GPU + elsif ($line =~ /^\s+deviceType\s*=\s*(\S+?_TYPE_)?(\S+)$/i){ + $vulkan->{'devices'}{$id}{'device-type'} = lc($2); + $vulkan->{'devices'}{$id}{'device-type'} =~ s/_/-/g; + } + # deviceName=AMD Radeon RX 6700 XT (RADV NAVI22); AMD RADV HAWAII + # lvmpipe (LLVM 15.0.6, 256 bits); NVIDIA GeForce GTX 1650 Ti + elsif ($line =~ /^\s+deviceName\s*=\s*(\S+)(\s.*|$)/i){ + $vulkan->{'devices'}{$id}{'device-vendor'} = main::clean(lc($1)); + $vulkan->{'devices'}{$id}{'device-name'} = main::clean($1 . $2); + } + } + } + if ($active{'driver'}){ + if (defined $id){ + # driverName=llvmpipe; radv; + if ($line =~ /^\s+driverName\s*=\s*(\S+)(\s|$)/i){ + my $driver = lc($1); + if ($mesa_drivers{$driver}){ + $vulkan->{'devices'}{$id}{'hw'} = $mesa_drivers{$driver}; + } + $vulkan->{'devices'}{$id}{'driver-name'} = $driver; + if (!$vulkan->{'data'}{'drivers'} || + !(grep {$_ eq $driver} @{$vulkan->{'data'}{'drivers'}})){ + push(@{$vulkan->{'data'}{'drivers'}},$driver); + } + } + # driverInfo=Mesa 23.1.3 (LLVM 15.0.7); 525.89.02; Mesa 23.1.3 + elsif ($line =~ /^\s+driverInfo\s*=\s*((Mesa)\s)?(.*)/i){ + $vulkan->{'devices'}{$id}{'mesa'} = lc($2) if $2; + $vulkan->{'devices'}{$id}{'driver-info'} = $3; + } + } + } + } + main::log_data('dump','$results',$results) if $b_log; + print 'Vulkan Data: ', Data::Dumper::Dumper $vulkan if $dbg[57]; + main::log_data('dump','$vulkan',$vulkan) if $b_log; + eval $end if $b_log; +} + ## DISPLAY DATA WAYLAND ## sub display_data_wayland { eval $start if $b_log; @@ -15968,7 +16905,7 @@ sub wlinfo_data { $data = main::grabber("$program 2>/dev/null",'','strip','ref'); } else { - $file = "$fake_data_dir/wayland/weston-info-2-mon-1.txt"; + $file = "$fake_data_dir/graphics/wayland/weston-info-2-mon-1.txt"; $data = main::reader($file,'strip','ref'); } print 'wayland/weston-info raw: ', Data::Dumper::Dumper $data if $dbg[46]; @@ -16103,7 +17040,7 @@ sub swaymsg_data { } else { undef $monitor_ids; - $file = "$fake_data_dir/wayland/swaymsg-2-monitor-1.txt"; + $file = "$fake_data_dir/graphics/wayland/swaymsg-2-monitor-1.txt"; @data = main::reader($file,'strip'); } print 'swaymsg: ', Data::Dumper::Dumper \@data if $dbg[46]; @@ -16217,7 +17154,7 @@ sub wlrrandr_data { } else { undef $monitor_ids; - $file = "$fake_data_dir/wayland/wlr-randr-2-monitor-1.txt"; + $file = "$fake_data_dir/graphics/wayland/wlr-randr-2-monitor-1.txt"; $data = main::reader($file,'strip','ref'); } foreach (@$data){ @@ -16904,6 +17841,29 @@ sub display_drivers_x { # print 'source: ', Data::Dumper::Dumper $driver_data; return $driver_data; } +sub set_mesa_drivers { + %mesa_drivers = ( + 'anv' => 'intel', + 'crocus' => 'intel', + 'etnaviv' => 'vivante', + 'freedreno' => 'qualcomm', + 'i915' => 'intel', + 'i965' => 'intel', + 'iris' => 'intel', + 'lima' => 'mali', + 'nouveau' => 'nvidia', + 'panfrost' => 'mali/bifrost', + 'r200' => 'amd', + 'r300' => 'amd', + 'r600' => 'amd', + 'radeonsi' => 'amd', + 'radv' => 'amd', + 'svga3d' => 'vmware', + 'v3d' => 'broadcom', + 'v3dv' => 'broadcom', + 'vc4' => 'broadcom', + ); +} ## GPU DATA ## sub set_amd_data { @@ -17570,7 +18530,7 @@ sub set_nv_data { '1f07|1f08|1f0a|1f0b|1f10|1f11|1f12|1f14|1f15|1f36|1f42|1f47|1f50|1f51|1f54|' . '1f55|1f76|1f82|1f83|1f91|1f95|1f96|1f97|1f98|1f99|1f9c|1f9d|1f9f|1fa0|1fb0|' . '1fb1|1fb2|1fb6|1fb7|1fb8|1fb9|1fba|1fbb|1fbc|1fdd|1ff0|1ff2|1ff9|2182|2184|' . - '2187|2188|2189|2191|2192|21c4|21d1|25a6|25a7|25a9|25aa|25ad|25ed|28b8', + '2187|2188|2189|2191|2192|21c4|21d1|25a6|25a7|25a9|25aa|25ad|25ed|28b8|28f8', 'code' => 'TUxxx', 'kernel' => '', 'legacy' => 0, @@ -17582,12 +18542,12 @@ sub set_nv_data { 'years' => '2018-22', }, {'arch' => 'Ampere', - 'ids' => '20b0|20b2|20b3|20b5|20b7|20f1|20f3|20f5|2203|2204|2206|2207|2208|' . - '220a|220d|2216|2230|2231|2232|2233|2235|2236|2237|2238|2414|2420|2438|2460|' . - '2482|2484|2486|2487|2488|2489|248a|249c|249d|24a0|24b0|24b1|24b6|24b7|24b8|' . - '24b9|24ba|24bb|24c7|24c9|24dc|24dd|24e0|24fa|2503|2504|2507|2508|2520|2521|' . - '2523|2531|2544|2560|2563|2571|2582|25a0|25a2|25a5|25ab|25ac|25b6|25b8|25b9|' . - '25ba|25bb|25bc|25bd|25e0|25e2|25e5|25ec|25f9|25fa|25fb|2838', + 'ids' => '20b0|20b2|20b3|20b5|20b7|20bd|20f1|20f3|20f5|20f6|2203|2204|2206|' . + '2207|2208|220a|220d|2216|2230|2231|2232|2233|2235|2236|2237|2238|2414|2420|' . + '2438|2460|2482|2484|2486|2487|2488|2489|248a|249c|249d|24a0|24b0|24b1|24b6|' . + '24b7|24b8|24b9|24ba|24bb|24c7|24c9|24dc|24dd|24e0|24fa|2503|2504|2507|2508|' . + '2520|2521|2523|2531|2544|2560|2563|2571|2582|25a0|25a2|25a5|25ab|25ac|25b6|' . + '25b8|25b9|25ba|25bb|25bc|25bd|25e0|25e2|25e5|25ec|25f9|25fa|25fb|2838', 'code' => 'GAxxx', 'kernel' => '', 'legacy' => 0, @@ -17596,10 +18556,10 @@ sub set_nv_data { 'series' => '535.xx+', 'status' => $status_current, 'xorg' => '', - 'years' => '2020-22', + 'years' => '2020-23', }, {'arch' => 'Hopper', - 'ids' => '2330|2331|2339', + 'ids' => '2321|2330|2331|2339', 'code' => 'GH1xx', 'kernel' => '', 'legacy' => 0, @@ -17611,8 +18571,8 @@ sub set_nv_data { 'years' => '2022+', }, {'arch' => 'Lovelace', - 'ids' => '2684|26b1|26b5|2704|2717|2757|2782|2786|27a0|27b8|27e0|2803|2820|' . - '2860|28a0|28a1|28e0|28e1', + 'ids' => '2684|26b1|26b5|2704|2717|2757|2782|2786|27a0|27b8|27e0|2803|2805|' . + '2820|2860|2882|28a0|28a1|28e0|28e1', 'code' => 'AD1xx', 'kernel' => '', 'legacy' => 0, @@ -18406,7 +19366,7 @@ sub lvm_data { PartitionData::set() if !$loaded{'partition-data'}; main::set_mapper() if !$loaded{'mapper'}; if ($fake{'logical'}){ - # my $file = "$fake_data_dir/lvm/lvs-test-1.txt"; + # my $file = "$fake_data_dir/raid-logical/lvm/lvs-test-1.txt"; # @data = main::reader($file,'strip'); } else { @@ -18783,8 +19743,8 @@ sub machine_data_fruid { } else { # my $file; - # $file = "$fake_data_dir/fruid/fruid-e904-1_full.txt"; - # $file = "$fake_data_dir/fruid/fruid-e804-1_full.txt"; + # $file = "$fake_data_dir/machine/fruid/fruid-e904-1_full.txt"; + # $file = "$fake_data_dir/machine/fruid/fruid-e804-1_full.txt"; # @fruid = main::reader($file,'strip'); } # print Data::Dumper::Dumper \@fruid; @@ -20400,9 +21360,9 @@ sub set_partitions { } else { my $file; - # $file = "$fake_data_dir/df/df-kTP-cygwin-1.txt"; - $file = "$fake_data_dir/df/df-kT-wrapped-1.txt"; - @partitions_working = main::reader($file); + # $file = "$fake_data_dir/block-devices/df/df-kTP-cygwin-1.txt"; + # $file = "$fake_data_dir/block-devices/df/df-kT-wrapped-1.txt"; + # @partitions_working = main::reader($file); } # print Data::Dumper::Dumper \@partitions_working; # Determine positions @@ -20569,7 +21529,7 @@ sub set_partitions { $fs = ($b_fs) ? $row[1]: get_mounts_fs($row[0],\@mount); } # assuming that all null/nullfs are parts of a logical fs - $b_logical = 1 if $fs && $fs =~ /^(btrfs|hammer|null|wekafs|zfs)/; + $b_logical = 1 if $fs && $fs =~ /^(btrfs|hammer|null|zfs)/; $id = join(' ', @row[$cols .. $#row]); $size = $row[$cols - $back_size]; if ($b_admin && -e "/sys/block/"){ @@ -20939,7 +21899,7 @@ sub set_filters { # hdfs, httpdirfs, hubicfuse, ipfs, juice, k(osmos)?fs, .*lafs, lizardfs, # lustre, magma, mapr, moosefs, nfs[34], objective, ocfs\d{0,2}, onefs, # orangefs, panfs, pnfs, pvfs\d{0,2}, rclone, restic, rozofs, s3fs, scality, - # sfs, sheepdogfs, spfs, sshfs, smbfs, v9fs, vdfs, vmfs, xtreemfs + # sfs, sheepdogfs, spfs, sshfs, smbfs, v9fs, vdfs, vmfs, wekafs, xtreemfs # Stackable/Union: aufs, e?cryptfs, encfs, erofs, gocryptfs, ifs, lofs, # mergerfs, mhddfs, overla(id|y)(fs)?, squashfs, unionfs; # ISO/Archive: archive(mount)?, atlas, avfs. borg, erofs, fuse-archive, @@ -20960,7 +21920,8 @@ sub set_filters { g gdrive gfarm git gluster gmail gocrypt google-drive-ocaml gp gphoto gv gzip hd httpd hubic ip juice k(osmos)? .*la lizard lustre magma mapr moose .*mtp null p?n objective oc one orange pan .*ptp pv rclone restic rozo - s s3 scality sheepdog sp ssh smb v9 vd vm vram wim(mount)? xb xml xtreem%); + s s3 scality sheepdog sp ssh smb v9 vd vm vram weka wim(mount)? xb xml + xtreem%); # Various RAM based system FS my @partition = (@all,qw%cgroup.* cgm config debug dev devtmp efivar fdesc hugetlb kern linproc linsys lxc none proc pty run security shm swap sys @@ -21979,14 +22940,14 @@ sub md_data { my ($mdstat) = @_; my $j = 0; if ($fake{'raid-md'}){ - #$mdstat = "$fake_data_dir/raid/md-4-device-1.txt"; - #$mdstat = "$fake_data_dir/raid/md-rebuild-1.txt"; - #$mdstat = "$fake_data_dir/raid/md-2-mirror-fserver2-1.txt"; - #$mdstat = "$fake_data_dir/raid/md-2-raid10-abucodonosor.txt"; - #$mdstat = "$fake_data_dir/raid/md-2-raid10-ant.txt"; - #$mdstat = "$fake_data_dir/raid/md-inactive-weird-syntax.txt"; - #$mdstat = "$fake_data_dir/raid/md-inactive-active-syntax.txt"; - #$mdstat = "$fake_data_dir/raid/md-inactive-active-spare-syntax.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-4-device-1.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-rebuild-1.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-2-mirror-fserver2-1.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-2-raid10-abucodonosor.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-2-raid10-ant.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-inactive-weird-syntax.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-inactive-active-syntax.txt"; + #$mdstat = "$fake_data_dir/raid-logical/md/md-inactive-active-spare-syntax.txt"; } my @working = main::reader($mdstat,'strip'); # print Data::Dumper::Dumper \@working; @@ -22271,11 +23232,11 @@ sub zfs_data { my ($i,$j,$k) = (0,0,0); if ($fake{'raid-zfs'}){ # my $file; - # $file = "$fake_data_dir/raid/zpool-list-1-mirror-main-solestar.txt"; - # $file = "$fake_data_dir/raid/zpool-list-2-mirror-main-solestar.txt"; - # $file = "$fake_data_dir/raid/zpool-list-v-tank-1.txt"; - # $file = "$fake_data_dir/raid/zpool-list-v-gojev-1.txt"; - # $file = "$fake_data_dir/raid/zpool-list-v-w-spares-1.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-1-mirror-main-solestar.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-2-mirror-main-solestar.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-v-tank-1.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-v-gojev-1.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-v-w-spares-1.txt"; #@working = main::reader($file);$zpool = ''; } else { @@ -22484,9 +23445,9 @@ sub zfs_status { $k = 0; if ($fake{'raid-zfs'}){ my $file; - # $file = "$fake_data_dir/raid/zpool-status-1-mirror-main-solestar.txt"; - # $file = "$fake_data_dir/raid/zpool-status-2-mirror-main-solestar.txt"; - # $file = "$fake_data_dir/raid/zpool-status-tank-1.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-status-1-mirror-main-solestar.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-status-2-mirror-main-solestar.txt"; + # $file = "$fake_data_dir/raid-logical/zfs/zpool-status-tank-1.txt"; #@pool_status = main::reader($file,'strip'); } else { @@ -23485,6 +24446,7 @@ sub speed_mapper { return ($speeds{$type}) ? $speeds{$type} . ' MT/s' : $type; } + ## START RAM VENDOR ## sub set_ram_vendors { $vendors = [ @@ -23505,6 +24467,7 @@ sub set_ram_vendors { ['^(G[A-Z]|Geil)','Geil','Geil',''], # Note: FA- but make loose FA ['^(F4|G[\s\.-]?Skill)','G[\s\.-]?Skill','G.Skill',''], + ['^(GJN)','GJN','GJN',''], ['^(HP)','','HP',''], # no IDs found ['^(HX|HyperX)','HyperX','HyperX',''], # Qimonda spun out of Infineon, same ids @@ -23521,9 +24484,11 @@ sub set_ram_vendors { # Before patriot just in case ['^(MN\d|PNY)','PNY\s','PNY',''], ['^(P[A-Z]|Patriot)','Patriot','Patriot',''], + ['^RAMOS','^RAMOS','RAmos',''], ['^(K[1-6][ABLT]|K\d|M[\d]{3}[A-Z]|Samsung)','Samsung','Samsung',''], ['^(SP|Silicon[\s-]?Power)','Silicon[\s-]?Power','Silicon Power',''], ['^(STK|Simtek)','Simtek','Simtek',''], + ['^(Simmtronics|Gamex)','^Simmtronics','Simmtronics',''], ['^(HM[ACT]|SK[\s-]?Hynix)','SK[\s-]?Hynix','SK-Hynix',''], # TED TTZD TLRD TDZAD TF4D4 TPD4 TXKD4 seen: HMT but could by skh #['^(T(ED|D[PZ]|F\d|LZ|P[DR]T[CZ]|XK)|Team[\s-]?Group)','Team[\s-]?Group','TeamGroup',''], @@ -24922,19 +25887,19 @@ sub ipmi_data { my $sensors = {}; if ($fake{'ipmi'}){ ## ipmitool ## - # $file = "$fake_data_dir/ipmitool/ipmitool-sensors-archerseven-1.txt";$program='ipmitool'; - # $file = "$fake_data_dir/ipmitool/ipmitool-sensors-epyc-1.txt";$program='ipmitool'; - # $file = "$fake_data_dir/ipmitool/ipmitool-sensors-RK016013.txt";$program='ipmitool'; - # $file = "$fake_data_dir/ipmitool/ipmitool-sensors-freebsd-offsite-backup.txt"; - # $file = "$fake_data_dir/ipmitool/ipmitool-sensor-shom-1.txt";$program='ipmitool'; - # $file = "$fake_data_dir/ipmitool/ipmitool-sensor-shom-2.txt";$program='ipmitool'; - # $file = "$fake_data_dir/ipmitool/ipmitool-sensor-tyan-1.txt";$program='ipmitool'; + # $file = "$fake_data_dir/sensors/ipmitool/ipmitool-sensors-archerseven-1.txt";$program='ipmitool'; + # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensors-epyc-1.txt";$program='ipmitool'; + # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensors-RK016013.txt";$program='ipmitool'; + # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensors-freebsd-offsite-backup.txt"; + # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensor-shom-1.txt";$program='ipmitool'; + # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensor-shom-2.txt";$program='ipmitool'; + # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensor-tyan-1.txt";$program='ipmitool'; # ($b_ipmitool,$i_key,$i_value,$i_unit) = (1,0,1,2); # ipmitool sensors ## ipmi-sensors ## - # $file = "$fake_data_dir/ipmitool/ipmi-sensors-epyc-1.txt";$program='ipmi-sensors'; - # $file = "$fake_data_dir/ipmitool/ipmi-sensors-lathander.txt";$program='ipmi-sensors'; - # $file = "$fake_data_dir/ipmitool/ipmi-sensors-zwerg.txt";$program='ipmi-sensors'; - # $file = "$fake_data_dir/ipmitool/ipmi-sensors-arm-server-1.txt";$program='ipmi-sensors'; + # $file = "$fake_data_dir/sensorsipmitool/ipmi-sensors-epyc-1.txt";$program='ipmi-sensors'; + # $file = "$fake_data_dir/sensorsipmitool/ipmi-sensors-lathander.txt";$program='ipmi-sensors'; + # $file = "$fake_data_dir/sensorsipmitool/ipmi-sensors-zwerg.txt";$program='ipmi-sensors'; + # $file = "$fake_data_dir/sensorsipmitool/ipmi-sensors-arm-server-1.txt";$program='ipmi-sensors'; # ($b_ipmitool,$i_key,$i_value,$i_unit) = (0,1,3,4); # ipmi-sensors # @data = main::reader($file); } @@ -25318,20 +26283,20 @@ sub load_lm_sensors { my ($adapter,$holder,$type) = ('','',''); if ($fake{'sensors'}){ # my $file; - # $file = "$fake_data_dir/sensors/amdgpu-w-fan-speed-stretch-k10.txt"; - # $file = "$fake_data_dir/sensors/peci-tin-geggo.txt"; - # $file = "$fake_data_dir/sensors/sensors-w-other-biker.txt"; - # $file = "$fake_data_dir/sensors/sensors-asus-chassis-1.txt"; - # $file = "$fake_data_dir/sensors/sensors-devnull-1.txt"; - # $file = "$fake_data_dir/sensors/sensors-jammin1.txt"; - # $file = "$fake_data_dir/sensors/sensors-mx-incorrect-1.txt"; - # $file = "$fake_data_dir/sensors/sensors-maximus-arch-1.txt"; - # $file = "$fake_data_dir/sensors/kernel-58-sensors-ant-1.txt"; - # $file = "$fake_data_dir/sensors/sensors-zenpower-nvme-2.txt"; - # $file = "$fake_data_dir/sensors/sensors-pch-intel-1.txt"; - # $file = "$fake_data_dir/sensors/sensors-ppc-sr71.txt"; - # $file = "$fake_data_dir/sensors/sensors-coretemp-acpitz-1.txt"; - # $file = "$fake_data_dir/sensors/sensors-applesmc-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/amdgpu-w-fan-speed-stretch-k10.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/peci-tin-geggo.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-w-other-biker.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-asus-chassis-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-devnull-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-jammin1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-mx-incorrect-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-maximus-arch-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/kernel-58-sensors-ant-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-zenpower-nvme-2.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-pch-intel-1.txt"; + # $file = "$fake_data_dir/sensors/slm-sensors/ensors-ppc-sr71.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-coretemp-acpitz-1.txt"; + # $file = "$fake_data_dir/sensors/lm-sensors/sensors-applesmc-1.txt"; # @sensors_data = main::reader($file); } else { @@ -27761,14 +28726,14 @@ sub set_dboot_data { $file = $system_files{'dmesg-boot'}; } else { - # $file = "$fake_data_dir/dmesg-boot/bsd-disks-diabolus.txt"; - # $file = "$fake_data_dir/dmesg-boot/freebsd-disks-solestar.txt"; - # $file = "$fake_data_dir/dmesg-boot/freebsd-enceladus-1.txt"; + # $file = "$fake_data_dir/bsd/dmesg-boot/bsd-disks-diabolus.txt"; + # $file = "$fake_data_dir/bsd/dmesg-boot/freebsd-disks-solestar.txt"; + # $file = "$fake_data_dir/bsd/dmesg-boot/freebsd-enceladus-1.txt"; ## matches: toshiba: openbsd-5.6-sysctl-2.txt - # $file = "$fake_data_dir/dmesg-boot/openbsd-5.6-dmesg.boot-1.txt"; + # $file = "$fake_data_dir/bsd/dmesg-boot/openbsd-5.6-dmesg.boot-1.txt"; ## matches: compaq: openbsd-5.6-sysctl-1.txt" - # $file = "$fake_data_dir/dmesg-boot/openbsd-dmesg.boot-1.txt"; - $file = "$fake_data_dir/dmesg-boot/openbsd-6.8-battery-sensors-1.txt"; + # $file = "$fake_data_dir/bsd/dmesg-boot/openbsd-dmesg.boot-1.txt"; + # $file = "$fake_data_dir/bsd/dmesg-boot/openbsd-6.8-battery-sensors-1.txt"; } if ($file){ return if ! -r $file; @@ -28793,8 +29758,8 @@ sub lspci_n_data { $b_lspci_n = 1; my (@data); if ($fake{'lspci'}){ - # my $file = "$fake_data_dir/lspci/steve-mint-topaz-lspci-n.txt"; - # my $file = "$fake_data_dir/lspci/ben81-hwraid-lspci-n.txt"; + # my $file = "$fake_data_dir/pci/lspci/steve-mint-topaz-lspci-n.txt"; + # my $file = "$fake_data_dir/pci/lspci/ben81-hwraid-lspci-n.txt"; # @data = main::reader($file,'strip'); } else { @@ -29019,15 +29984,15 @@ sub pci_grabber { $pattern = q/^[0-9a-f:]+:/; # i only added perl 5.14, don't use } if ($fake{'lspci'} || $fake{'pciconf'} || $fake{'pcictl'} || $fake{'pcidump'}){ - # my $file = "$fake_data_dir/pciconf/pci-freebsd-8.2-2"; - # my $file = "$fake_data_dir/pcidump/pci-openbsd-6.1-vm.txt"; - # my $file = "$fake_data_dir/pcictl/pci-netbsd-9.1-vm.txt"; - # my $file = "$fake_data_dir/lspci/racermach-1-knnv.txt"; - # my $file = "$fake_data_dir/lspci/rk016013-knnv.txt"; - # my $file = "$fake_data_dir/lspci/kot--book-lspci-nnv.txt"; - # my $file = "$fake_data_dir/lspci/steve-mint-topaz-lspci-nnkv.txt"; - # my $file = "$fake_data_dir/lspci/ben81-hwraid-lspci-nnv.txt"; - # my $file = "$fake_data_dir/lspci/gx78b-lspci-nnv.txt"; + # my $file = "$fake_data_dir/pci/pciconf/pci-freebsd-8.2-2"; + # my $file = "$fake_data_dir/pci/pcidump/pci-openbsd-6.1-vm.txt"; + # my $file = "$fake_data_dir/pci/pcictl/pci-netbsd-9.1-vm.txt"; + # my $file = "$fake_data_dir/pci/lspci/racermach-1-knnv.txt"; + # my $file = "$fake_data_dir/pci/lspci/rk016013-knnv.txt"; + # my $file = "$fake_data_dir/pci/lspci/kot--book-lspci-nnv.txt"; + # my $file = "$fake_data_dir/pci/lspci/steve-mint-topaz-lspci-nnkv.txt"; + # my $file = "$fake_data_dir/pci/lspci/ben81-hwraid-lspci-nnv.txt"; + # my $file = "$fake_data_dir/pci/lspci/gx78b-lspci-nnv.txt"; # $data = main::reader($file,'strip','ref'); } else { @@ -29871,6 +30836,8 @@ sub get_bsd_os { } sub get_linux_distro { + # NOTE: increasingly no distro release files are present, so this logic is + # deprecated, but still works often. # order matters! my @derived = qw(antix-version aptosid-version bodhibuilder.conf kanotix-version knoppix-version pclinuxos-release mandrake-release manjaro-release mx-version @@ -29893,11 +30860,8 @@ sub get_linux_distro { $osr_good .= 'raspberry pi os|slint|zorin'; # Force use of pretty name because that's only location of derived distro name my $osr_pretty = 'zinc'; - my ($b_issue,$b_lsb,$b_osr_pretty,$b_skip_issue,$b_skip_osr); my ($issue,$lsb_release) = ('/etc/issue','/etc/lsb-release'); - $b_issue = 1 if -f $issue; - $b_lsb = 1 if -f $lsb_release; # 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,'strip',0) if -r $issue; @@ -29909,9 +30873,17 @@ sub get_linux_distro { # Wait to handle since crunchbang file is one of the few in the world that # uses this method @distro_files = main::globber('/etc/*[-_]{[rR]elease,[vV]ersion,issue}*'); - push(@distro_files, '/etc/bodhibuilder.conf') if -r '/etc/bodhibuilder.conf'; + push(@distro_files, '/etc/bodhibuilder.conf') if -r '/etc/bodhibuilder.conf'; # legacy @osr = main::reader($os_release) if -r $os_release; - if ($etc_issue){ + if (-f '/etc/bodhi/info'){ + $lsb_release = '/etc/bodhi/info'; + $distro_file = $lsb_release; + $b_skip_issue = 1; + push(@distro_files, $lsb_release); + } + $b_issue = 1 if -f $issue; + $b_lsb = 1 if -f $lsb_release; + if (!$b_skip_issue && $etc_issue){ $lc_issue = lc($etc_issue); if ($lc_issue =~ /(antergos|grml|linux lite|openmediavault)/){ $distro_id = $1; @@ -29993,7 +30965,8 @@ sub get_linux_distro { # be preferred, but this is a good backup. elsif ($distro_file && $b_lsb && ($distro_file =~ /\/etc\/($lsb_good_s)$/ || $distro_file eq $lsb_release)){ - $distro = get_lsb_release(); + print "df: $distro_file lf: $lsb_release\n"; + $distro = get_lsb_release($lsb_release); } elsif ($distro_file && $distro_file eq $os_release){ $distro = get_os_release($b_osr_pretty); @@ -30171,10 +31144,10 @@ sub system_base { $base_distro_arch .= '|talkingarch|theshell|ubos|velt|xero'; my $base_file_debian_version = 'sidux'; # detect debian steamos before arch steamos - my $base_osr_debian_version = '\belive|lmde|neptune|parrot|pureos|rescatux|'; - $base_osr_debian_version .= 'septor|sparky|steamos|tails'; + my $base_osr_debian_version = '\belive|lmde|neptune|nitrux|parrot|pureos|'; + $base_osr_debian_version .= 'rescatux|septor|sparky|steamos|tails'; # osr has base ids - my $base_default = 'antix-version|mx-version'; + my $base_default = 'antix-version|bodhi|mx-version'; # base only found in issue my $base_issue = 'bunsen'; # synthesize, no direct data available @@ -30270,11 +31243,21 @@ sub system_base { eval $end if $b_log; } +# Note: corner case when parsing the bodhi distro file +# args: 0: file name sub get_lsb_release { eval $start if $b_log; my ($lsb_file) = @_; $lsb_file ||= '/etc/lsb-release'; my ($distro_lsb,$id,$release,$codename,$description) = ('','','','',''); + my ($dist_id,$dist_release,$dist_code,$dist_desc) = ('DISTRIB_ID', + 'DISTRIB_RELEASE','DISTRIB_CODENAME','DISTRIB_DESCRIPTION'); + if ($lsb_file eq '/etc/bodhi/info'){ + $id = 'Bodhi Linux'; + # note: No ID field, hard code + ($dist_id,$dist_release,$dist_code,$dist_desc) = ('ID','RELEASE', + 'CODENAME','DESCRIPTION'); + } 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; @@ -30282,7 +31265,7 @@ sub get_lsb_release { next if /^\s*$/; my @working = split(/\s*=\s*/, $_); next if !$working[0]; - if ($working[0] eq 'DISTRIB_ID' && $working[1]){ + if ($working[0] eq $dist_id && $working[1]){ if ($working[1] =~ /^Manjaro/i){ $id = 'Manjaro Linux'; } @@ -30294,15 +31277,15 @@ sub get_lsb_release { $id = $working[1]; } } - elsif ($working[0] eq 'DISTRIB_RELEASE' && $working[1]){ + elsif ($working[0] eq $dist_release && $working[1]){ $release = $working[1]; } - elsif ($working[0] eq 'DISTRIB_CODENAME' && $working[1]){ + elsif ($working[0] eq $dist_code && $working[1]){ $codename = $working[1]; } # sometimes some distros cannot do their lsb-release files correctly, # so here is one last chance to get it right. - elsif ($working[0] eq 'DISTRIB_DESCRIPTION' && $working[1]){ + elsif ($working[0] eq $dist_desc && $working[1]){ $description = $working[1]; } } @@ -30627,7 +31610,9 @@ sub generate_data { } } -# return all device modules not including driver +# args: 0: driver; 1: modules, comma separated, return only modules +# which do not equal the driver string itself. Sometimes the module +# name is different from the driver name, even though it's the same thing. sub get_driver_modules { eval $start if $b_log; my ($driver,$modules) = @_; @@ -30643,9 +31628,7 @@ sub get_driver_modules { return $modules; } -# args: 0: driver; 1: modules, comma separated, return only modules -# which do not equal the driver string itself. Sometimes the module -# name is different from the driver name, even though it's the same thing. +# Return all detected gcc versions sub get_gcc_data { eval $start if $b_log; my ($gcc,@data,@temp); @@ -30985,9 +31968,9 @@ sub set_ip_addr { if ($fake{'ip-if'}){ # my $file = "$fake_data_dir/if/scope-ipaddr-1.txt"; # my $file = "$fake_data_dir/network/ip-addr-blue-advance.txt"; - # my $file = "$fake_data_dir/network/ppoe-ip-address-1.txt"; - # my $file = "$fake_data_dir/network/ppoe-ip-addr-2.txt"; - # my $file = "$fake_data_dir/network/ppoe-ip-addr-3.txt"; + # my $file = "$fake_data_dir/network/ppoe/ppoe-ip-address-1.txt"; + # my $file = "$fake_data_dir/network/ppoe/ppoe-ip-addr-2.txt"; + # my $file = "$fake_data_dir/network/ppoe/ppoe-ip-addr-3.txt"; # @data = main::reader($file,'strip') or die $!; } my ($b_skip,$broadcast,$if,$if_id,$ip,@ips,$scope,$type,@temp,@temp2); @@ -31038,7 +32021,7 @@ sub set_ifconfig { # whitespace matters!! Don't use strip my @data = main::grabber($alerts{'ifconfig'}->{'path'} . " 2>/dev/null",'\n',''); if ($fake{'ip-if'}){ - # my $file = "$fake_data_dir/network/ppoe-ifconfig-all-1.txt"; + # my $file = "$fake_data_dir/network/ppoe/ppoe-ifconfig-all-1.txt"; # my $file = "$fake_data_dir/network/vps-ifconfig-1.txt"; # @data = main::reader($file) or die $!; } @@ -31952,6 +32935,7 @@ sub gpu_ram_arm { } } +# args: 0: module to get version of sub get_module_version { eval $start if $b_log; my ($module) = @_; @@ -32974,7 +33958,7 @@ sub proc_data { eval $start if $b_log; my $file = $_[0]; if ($fake{'partitions'}){ - # $file = "$fake_data_dir/proc-partitions-1.txt"; + # $file = "$fake_data_dir/block-devices/proc-partitions/proc-partitions-1.txt"; } my @parts = main::reader($file,'strip'); # print Data::Dumper::Dumper \@parts; @@ -33772,14 +34756,14 @@ sub set_sysctl_data { } else { my $file; - # $file = "$fake_data_dir/sysctl/obsd_6.1_sysctl_soekris6501_root.txt"; - # $file = "$fake_data_dir/sysctl/obsd_6.1sysctl_lenovot500_user.txt"; + # $file = "$fake_data_dir/bsd/sysctl/obsd_6.1_sysctl_soekris6501_root.txt"; + # $file = "$fake_data_dir/bsd/sysctl/obsd_6.1sysctl_lenovot500_user.txt"; ## matches: compaq: openbsd-dmesg.boot-1.txt - # $file = "$fake_data_dir/sysctl/openbsd-5.6-sysctl-1.txt"; + # $file = "$fake_data_dir/bsd/sysctl/openbsd-5.6-sysctl-1.txt"; ## matches: toshiba: openbsd-5.6-dmesg.boot-1.txt - # $file = "$fake_data_dir/sysctl/openbsd-5.6-sysctl-2.txt"; - $file = "$fake_data_dir/sysctl/obsd-6.8-sysctl-a-battery-sensor-1.txt"; - @temp = reader($file); + # $file = "$fake_data_dir/bsd/sysctl/openbsd-5.6-sysctl-2.txt"; + # $file = "$fake_data_dir/bsd/sysctl/obsd-6.8-sysctl-a-battery-sensor-1.txt"; + # @temp = reader($file); } foreach (@temp){ $_ =~ s/\s*=\s*|:\s+/:/; @@ -34356,13 +35340,13 @@ sub usb_grabber { else { my $file; if ($fake{'usbdevs'}){ - $file = "$fake_data_dir/lsusb/bsd-usbdevs-v-1.txt"; + $file = "$fake_data_dir/usb/usbdevs/bsd-usbdevs-v-1.txt"; } elsif ($fake{'usbconfig'}){ - $file = "$fake_data_dir/lsusb/bsd-usbconfig-list-v-1.txt"; + $file = "$fake_data_dir/usb/usbconfig/bsd-usbconfig-list-v-1.txt"; } else { - $file = "$fake_data_dir/lsusb/mdmarmer-lsusb.txt"; + $file = "$fake_data_dir/usb/lsusb/mdmarmer-lsusb.txt"; } @data = main::reader($file,'strip'); } diff --git a/inxi.1 b/inxi.1 index e89b5d7..8739392 100644 --- a/inxi.1 +++ b/inxi.1 @@ -15,7 +15,7 @@ .\" with this program; if not, write to the Free Software Foundation, Inc., .\" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. .\" -.TH INXI 1 "2023\-09\-17" "inxi" "inxi manual" +.TH INXI 1 "2023\-09\-25" "inxi" "inxi manual" .SH NAME inxi \- Command line system information script for console and IRC @@ -357,10 +357,11 @@ If protocol is not detected, shows: Adds \fBwith: Xwayland v:...\fR if xwayland server is installed, regardless of protocol. -Also shows screen resolution(s) (per monitor/X screen). Shows graphics API used, -like OpenGL. For X.org: OpenGL renderer, OpenGL core profile version/OpenGL -version; for VESA: data (for Xvesa); for Wayland: GBM/EGL data (not -implemented). +Also shows screen resolution(s) (per monitor/X screen). Shows graphics API +information (if available). EGL: EGL version, drivers, acdtive platforms; +OpenGL: renderer, OpenGL core profile version/OpenGL version (if core/compat +versions different, shows that as well); Vulkan: Vulkan version, drivers, +surfaces;VESA: data (for Xvesa). Compositor information will show if detected using \fB\-xx\fR option or always if detected and Wayland since the compositor is the server with Wayland. @@ -840,14 +841,36 @@ Note \- Maintainer may have disabled this function. If inxi \fB\-h\fR has no listing for \fB\-U\fR then it's disabled. -Auto\-update script. Note: if you installed as root, you must be root to -update, otherwise user is fine. Also installs / updates this man page to: +Auto\-update inxi or pinxi. Note: if you installed as root, you must be root to +update, otherwise user is fine. Also installs / updates current man page to: \fB/usr/local/share/man/man1\fR (if \fB/usr/local/share/man/\fR exists AND there is no inxi man page in \fB/usr/share/man/man1\fR, otherwise it goes to \fB/usr/share/man/man1\fR). This requires that you be root to write to that directory. See \fB\-\-man\fR or \fB\-\-no\-man\fR to force or disable man install. +\fB\-U\fR accepts the following options (inxi and pinxi): + +No arg \- Get from main git branch. + +3 \- Get the dev server (smxi.org) version. Be aware that pinxi when taken from +here can be very unstable during active development! The inxi version is the +stable master branch version. Also useful to update if you have SSL issues and +\fB\-\-no\-ssl\fR works. + +4 \- Get the dev server (smxi.org) FTP version (same as 3 version). Use if SSL +issues and \fB\-\-no\-ssl\fR doesn't work. For very old systems with SSL 1, you +will probably need to use this option, which bypasses HTTP downloading, and uses +straight FTP to get the file from smxi.org server. + +[http|https|ftp] \- Get a version of $self_name from your own server. Use the +full download path, e.g. + +\fB\inxi -U ^https://myserver.com/inxi\fR + +For failed downloads, use the debug option \fB\-\-dbg 1\fR in addition to get +more verbose failure reports. + .TP .B \-\-usb\fR .br @@ -1371,13 +1394,17 @@ HCI ID. \- Adds (if available and/or relevant) \fBvendor:\fR item, which shows specific vendor [product] information. -\- \fBX.org:\fR Adds direct rendering status. - \- \fBX.org:\fR Adds (for single GPU, nvidia driver) screen number that GPU is running on. \- Adds device temperature for each discrete device (Linux only). +\- For EGL, adds active/inactive platform report. + +\- For OpenGL (\fBX.org\fR only) adds direct render status, GLX version. + +\- For Vulkan, adds device count. + .TP .B \-x \-i\fR \- Adds IP v6 additional scope data, like Global, Site, Temporary for @@ -1653,11 +1680,15 @@ grid of monitors that the \fBXorg\fR \fBScreen\fR is composed of. real monitor size, not the Xorg full Screen diagonal size, which can be quite different. -\- For free drivers, adds OpenGL compatibility version number if available. For -nonfree drivers, the core version and compatibility versions are usually the -same. Example: +\- For EGL, shows platform by specific platforms, with driver and egl version if +different from the main one. -\fBv: 3.3 Mesa 11.2.0 compat\-v: 3.0\fR +\- For OpenGL, adds ES version (\fBes\-v\fR) if available. If the Display line +did not find an X11 display ID, the ID (e.g. \fB:0.0\fR) will show here instead. + +\- For OpenGL, Vulkan, adds \fBdevice-\ID\fR, if available. + +\- For Vulkan, adds per Device ID report (type, driver, device\-ID). .TP .B \-xx \-I\fR @@ -1847,6 +1878,12 @@ right. \- \fBWayland:\fR Adds to Monitors \fBscale:\fR (if detected). +\- For EGL, shows hardware based driver(s) (\fBhw:\fR), with the related +hardware, like AMD or Intel. + +\- For Vulkan, adds layer count, per device driver hardware vendor (not +displayed if device name is present with \fB\-a\fR). + .TP .B \-xxx \-I\fR \- For \fBUptime:\fR adds \fBwakeups:\fR to show how many times the machine @@ -2218,36 +2255,50 @@ shown). \- Adds to Monitors \fBbuilt:\fR, \fBgamma:\fR, \fBratio:\fR (if found). +\- Adds to OpenGL device memory and unified status, if present. + +\- Adds to Vulkan full device report, with full device names, ids, drivers, +driver versions, surfaces. + X.org sample (with both \fBxdpyinfo\fR and \fBxrandr\fR data available): .nf \fBinxi \-aGz Graphics: - Device\-1: AMD Cedar [Radeon HD 5000/6000/7350/8350 Series] vendor: XFX Pine - driver: radeon v: kernel alternate: amdgpu arch: TeraScale\-2 - code: Evergreen process: TSMC 32\-40nm built: 2009\-15 pcie: gen: 1 - speed: 2.5 GT/s lanes: 16 link\-max: gen: 2 speed: 5 GT/s ports: - active: DVI\-I\-1,VGA\-1 empty: HDMI\-A\-1 bus\-ID: 0a:00.0 - chip\-ID: 1002:68f9 class\-ID: 0300 - Display: x11 server: X.Org v: 1.21.1.3 with: Xwayland v: 22.1.0 - compositor: xfwm v: 4.16.1 driver: X: loaded: modesetting dri: r600 + Device\-1: AMD Cedar [Radeon HD 5000/6000/7350/8350 Series] + vendor: XFX Pine driver: radeon v: kernel alternate: amdgpu + arch: TeraScale\-2 code: Evergreen process: TSMC 32\-40nm + built: 2009\-15 pcie: gen: 1 speed: 2.5 GT/s lanes: 16 link\-max: + gen: 2 speed: 5 GT/s ports: active: DVI\-I\-1,VGA\-1 empty: HDMI\-A\-1 + bus\-ID: 0a:00.0 chip\-ID: 1002:68f9 class\-ID: 0300 temp: 58.0 C + Display: x11 server: X.Org v: 1.21.1.7 with: Xwayland v: 22.1.9 + compositor: xfwm v: 4.18.0 driver: X: loaded: modesetting dri: r600 gpu: radeon display\-ID: :0.0 screens: 1 - Screen\-1: 0 s-res: 2560x1024 s-dpi: 96 s\-size: 677x270mm (26.65x10.63") - s\-diag: 729mm (28.7") + Screen\-1: 0 s\-res: 2560x1024 s\-dpi: 96 + s\-size: 677x270mm (26.65x10.63") s\-diag: 729mm (28.7") Monitor\-1: DVI\-I\-1 pos: primary,left model: Samsung SyncMaster - serial: built: 2004 res: 1280x1024 hz: 60 dpi: 96 gamma: 1.2 - size: 338x270mm (13.31x10.63") diag: 433mm (17") ratio: 5:4 modes: - max: 1280x1024 min: 720x400 - Monitor\-2: VGA\-1 pos: right model: Dell 1908FP serial: - built: 2008 res: 1280x1024 hz: 60 dpi: 86 gamma: 1.4 - size: 376x301mm (14.8x11.85") diag: 482mm (19") ratio: 5:4 modes: - max: 1280x1024 min: 720x400 - API: OpenGL renderer: AMD CEDAR (DRM 2.50.0 / 5.16.0-11.1\-liquorix-amd64 LLVM - 12.0.1) v: 3.3 Mesa 21.2.6 compat\-v: 3.1 direct-render: Yes - ....\fR + serial: H9NX842662 built: 2004 res: 1280x1024 hz: 60 dpi: 96 + gamma: 1.2 size: 338x270mm (13.31x10.63") diag: 433mm (17") + ratio: 5:4 modes: max: 1280x1024 min: 720x400 + Monitor\-2: VGA\-1 pos: right model: Dell 1908FP + serial: G434H87HRA2D built: 2008 res: 1280x1024 hz: 60 dpi: 86 + gamma: 1.4 size: 376x301mm (14.8x11.85") diag: 482mm (19") + ratio: 5:4 modes: max: 1280x1024 min: 720x400 + API: EGL v: 1.5 hw: drv: amd r600 platforms: device: 0 drv: r600 + device: 1 drv: swrast gbm: egl: 1.4 drv: kms_swrast surfaceless: + drv: r600 x11: drv: r600 inactive: wayland + API: OpenGL v: 4.5 vendor: x.org mesa v: 22.3.6 glx\-v: 1.4 + es\-v: 3.1 direct\-render: yes renderer: AMD CEDAR (DRM 2.50.0 / + 6.4.3\-1\-liquorix\-amd64 LLVM 15.0.6) device\-ID: 1002:68f9 + memory: 1000 MiB unified: no + API: Vulkan v: 1.3.250 layers: 3 device: 0 type: cpu + name: llvmpipe (LLVM 15.0.6 256 bits) driver: mesa llvmpipe + v: 22.3.6 (LLVM 15.0.6) device\-ID: 10005:0000 surfaces: xcb,xlib\fR .fi + Wayland sample, with Sway/swaymsg: .nf -\fBinxi \-aGz +\fB +inxi \-aGz Graphics: Device\-1: AMD Cedar [Radeon HD 5000/6000/7350/8350 Series] vendor: XFX Pine driver: radeon v: kernel alternate: amdgpu arch: TeraScale 2 @@ -2255,7 +2306,7 @@ Graphics: gen: 2 speed: 5 GT/s ports: active: DVI\-I\-1,VGA\-1 empty: HDMI\-A\-1 bus\-ID: 0a:00.0 chip\-ID: 1002:68f9 class\-ID: 0300 Display: wayland server: Xwayland v: 21.1.4 compositor: sway v: 1.6.1 - driver: gpu: radeon d\-rect: 2560x1024 + driver: dri: r600 gpu: radeon d\-rect: 2560x1024 Monitor-1: DVI\-I\-1 pos: right model: SyncMaster serial: built: 2004 res: 1280x1024 hz: 60 dpi: 96 gamma: 1.2 size: 340x270mm (13.4x10.6") diag: 434mm (17.1") ratio: 5:4 modes: @@ -2264,8 +2315,12 @@ Graphics: res: 1280x1024 hz: 60 gamma: 1.4 dpi: 86 gamma: 1.4 size: 380x300mm (15.0x11.8") diag: 484mm (19.1") ratio: 5:4 modes: max: 1280x1024 min: 720x400 - API: GBM/EGL - Message: Wayland GBM/EGL data currently not available. + API: OpenGL v: 4.6 compat\-v: 4.5 vendor: x.org mesa v: 22.3.6 + glx\-v: 1.4 direct\-render: yes renderer: AMD CEDAR (DRM 2.50.0 / + 6.4.3\-1\-liquorix\-amd64 LLVM 15.0.6) device\-ID: 1002:68f9 + API: EGL v: 1.5 hw: drv: amd r600 platforms: device: 0 + drv: r600 device: 1 drv: swrast surfaceless: drv: r600 wayland: + drv: r600 inactive: gbm,x11 .fi .TP diff --git a/inxi.changelog b/inxi.changelog index 525fa0f..8f480c2 100644 --- a/inxi.changelog +++ b/inxi.changelog @@ -1,24 +1,209 @@ ================================================================================ -Version: 3.3.29 -Patch: 01 -Date: 2023-09-17 +Version: 3.3.30 +Patch: 00 +Date: 2023-09-25 -------------------------------------------------------------------------------- RELEASE NOTES: -------------------------------------------------------------------------------- -Packagers: Please update your build tools to build from: +PACKAGERS! inxi repos are moved to https://codeberg.org/smxi/inxi -https://codeberg.org/smxi/inxi +The repos will mirror to github for a short amount of time, until after 3.3.30 +is released, then I am probably going to do some big changes in the structure of +the inxi repo. Make sure to update your packaging tools and scripts for this +change. -repos. Codeberg will mirror to github until after 3.3.30 is released, after that -there will be more fundamental repo changes, but nothing that should impact inxi -packagers. But no attempt will be made to mirror those changes to github when -they are made because it takes too much work. +-------------------------------------------------------------------------------- -This is a transitional patch version, the only change is altering the self -updater URLs to codeberg.org from github.com. Mainly so that the master branch -will give the correct URLs until 3.3.30 is released, which will be in a few -weeks. +Finally, a huge upgrade for Wayland future proofing, and other futures that are +maybe coming, by adding EGL API, and Vulkan for good measure. This should handle +wayland finally, that's been a stub forever, but finally realized eglinfo was a +thing, and that vulkan as well could be a contender to replace OpenGL, at least +that's what Mesa says on their site, and they should know. + +This handles one of the longest standing weak points of inxi graphics, being +completely X11-centric, even though wayland support exists fairly extensively, +but this glxinfo dependent feature was a niggling annoyance, now it's fairly +ambivalent about which api tool you throw at it, the hardest is to give the +right message for no data, or incomplete data. Note that eglinfo supplies at +least software rendering out of X11 or Wayland, so we can now get some API data +in console, including if supported, OpenGL data. Not all of it, but some of it. + +Also since now all the docs are split and granular, with the Graphics API +upgrades, added data sample files from glxinfo, eglinfo, vulkaninfo, and vainfo +for good measure, just to have some of the latter. This is one of the first time +all the data used to develope a feature, docs for that feature, and the feature +itself, are being shared and released at the same time. + +-------------------------------------------------------------------------------- +SPECIAL THANKS: + +1a. GRAPHICS: API: Arch user Chrome30 on github for requesting vulkan data, and +providing the initial datasamples that made it possible to think about this new +API feature. + +1b. CheckRecommends: Display packages: mrmazda, a frequent helper, checked and +updated OpenSUSE and Fedora vulkan/egl/glx API tool package names. Those have +been a bit fluid and many of the names I had were not right. + +-------------------------------------------------------------------------------- +KNOWN ISSUES: + +1a. GRAPHICS: nothing is perfect, for sudo/root the detections fail for OpenGL +API messages, but fallbacks will make it a bit nicer than it was, with some +data, instead of none as before. + +1b. GRAPHICS: API: I'm assuming that the greatest EGL version number found is +the actual version, and lower versions are what that platform supports. This is +an assumption, not a known fact, but finding this stuff clearly documented tends +towards near impossibility, or takes forever to determine, so that's the +assumption that is being used. Correct via issue and clear explanation with +links to resources if this is incorrect. + +-------------------------------------------------------------------------------- +BUGS: + +1. Nothing to speak of. + +-------------------------------------------------------------------------------- +FIXES: + +1. PARTITIONS: had wekafs as a zfs type fs, it's not, it's more like NAS, cloud. +Added to distributed list, and removed from zfs|btrfs|hammer list. I know, I +know, will it ever matter? Probably not. But just in case, wouldn't want your +local machine to report with petabytes of storage now would we! + +2. CheckRecommends: corrected some Fedora, SUSE package names. + +-------------------------------------------------------------------------------- +ENHANCEMENTS: + +1a. SYSTEM: DistroData: added Bodhi id method, /etc/bodhi/info file which is +similar to /etc/lsb_release, updated system base detection as well. System base +comes from /etc/os-release. + +1b. SYSTEM: DistroData: Added Nitrux system base (debian). Why they try hide +this is beyond me. Maybe because they are not using a real PM, and don't include +apt, who knows. + +2a. GRAPHICS: new nvidia gpu ids. + +2b. Graphics: EGL API data: +* Shows eglinfo missing if appropriate, no data messages if appropriate. +* -G shows EGL version(s), drivers, active platforms. +* -Gx adds active/inactive platforms as sub items of platforms. +* -Gxx shows platforms by platform, with egl version, driver. EGL version only +shows if there were more than 1 detected, otherwise it shows with EGL v: +* -Gxxx shows hw based on driver, if found, like vulkan. + +To avoid excess verbosity, does not show renderer OpenGL name per platform +because it would be way too long and repetetive. And besides, that would show +in OpenGL anyway, more or less, unless there are two different GPUs, which is a +case that is not fully handled. + +2c. GRAPHICS: OpenGL data: +* If glxinfo not present, or with null output due to root/no display, and if +eglinfo available, and has OpenGL items, will populate most of OpenGL API with +data, except for Direct Rendering and GLX version. Shows appropriate messages +indicating it's EGL sourced for console, root, no data, or glxinfo missing. +* -Gx adds GLX version, if detected. +* -Gxx add: ES version, if detected; device-ID, if available. Also adds +display-ID, if Display-ID was not found in the Display line (which probably +means that xdpyinfo or xrandr were not installed). Does not always show since it +already appeared in Display line if it was discovered. +* -Ga adds device memory, and unified memory status (yes/no). + +2d. GRAPHICS: Vulkan API data: +* Shows appropriate messages if vulkaninfo present, but no data found. +* -G shows Vulkan version, drivers, and surfaces. +* -Gx device counts. +* -Gxx adds device by id, type, driver report. +* -Gxxx adds layer count; adds device hardware vendor, based on mesa driver. Not +for nvidia driver, since that is self evident. Goes away with -Ga if device name +exists. +* -Ga adds full device report, including per device names, ids, drivers, driver +versions, surfaces. + +3. UPDATE: Because the smxi.org server no longer accepts TSL 1.1 based HTTP +requests, added for extreme legacy systems a new update option, -U 4, which +uses direct FTP download from smxi.org ftp server. If system set to default to +perl downloader HTTP::Tiny it switches to using a non perl downloader +automatically, like wget or curl. + +4. CPU: Microarch: got early zen5 possible IDs. Both Intel/AMD may have rough +ID working well before they ship in public. CPU stuff has slowed down a lot, +the 4,3n nodes are not easy, obviously. + +5. DRIVES: Many more drive vendors and drive IDs. + +6. RAM: More RAM vendors. Note that it's not unusual for a Drive vendor to also +make RAM, and vice versa. + +-------------------------------------------------------------------------------- +CHANGES: + +1a. GRAPHICS: For API, show OpenGL mesa-v: x.x.x separate from main API v: +string. Also only shows the actual API version with v: now, like v: 4.5. Also +shows vendor: nvidia v: 340.23 for nvidia, without mesa. Falls back for +unhandled cases or syntaxes to the whole version string for v:. + +1b. GRAPHICS: For OpenGL, shows compat-v: always if present, that was a mistake +not to show it unless -Gx, since otherwise you'd think you are running a +different version. Not a common situation, but on legacy hardware, can happen. + +-------------------------------------------------------------------------------- +DOCUMENTATION: + +1a. DOCS: docs/inxi-cpu.txt - reorganized into more coherent sections, like with +like, etc. Added better top Sections navigation since there is so much data. + +1b. DOCS: docs/inxi-resources.txt - moved last code tricks to +docs/tips-tricks.txt. + +1c. DOCS: new docs/ files inxi-battery.txt, inxi-debuggers.txt, +inxi-devices.txt, inxi-kernel.txt, inxi-machine.txt, inxi-network.txt, +inxi-raid-logical.txt, inxi-start-client.txt, inxi-tty.txt, inxi-weather. + +These new files cleaned out docs/inxi-data.txt and docs/inxi-resources.txt, +which are now merely placeholder files, and have no data in them beyond pointers +to the actual data files. + +1d. DOCS: docs/inxi-custom-recommends.txt updated for SUSE/Fedora packag name +fixes and new eglinfo and vulkaninfo items. + +2a. DATA: moved more data from non public data to shared. Refactored directories +to be better organized, and to follow the overall inxi data structures better. + +2b. DATA: added many more eglinfo, glxinfo, vulkaninfo to data/graphics. Also +added some clinfo, vainfo just in case decide to support those APIs. + +3a. MAN/OPTIONS: updated for new graphics API features, new verbsity features, +etc. + +3b. MAN/OPTIONS: added -U arguments for man, for some reason I'd left those out. +Also removed options references to -U 1, 2, because those should never be used, +if those versions of inxi even exist, they are ancient. Added -U 4 option, and +explanation of when/why to use it. + +-------------------------------------------------------------------------------- +CODE: + +1a. FAKE DATA: updated paths for fake data to reflect data reorganization. + +1b. FAKE DATA: Added --fake egl,glx,vulkan for GRAPHICS API. + +2. GRAPHICS: Fully refactored opengl_output, moved to gl_data/opengl_output. +Added egl_data, egl_output, and vulkan_data, vulkan_output, and some other +tools. + +3. UPDATE: if downloader is set to 'perl', aka, Tiny::HTTP, and -U 4 is used, +which is a direct FTP download of the inxi/pinxi files, tiny is disabled, and +the next available downloader (wget/curl/fetch) is used instead. + +4. DEBUGGER: added clinfo, eglinfo, es2_info, vainfo, vdpauinfo, vulkaninfo. + +-------------------------------------------------------------------------------- +-- Harald Hope - Mon, 25 Sep 2023 15:03:45 -0700 ================================================================================ Version: 3.3.29