diff options
| -rw-r--r-- | README.txt | 162 | ||||
| -rwxr-xr-x | inxi | 1736 | ||||
| -rw-r--r-- | inxi.1 | 139 | ||||
| -rw-r--r-- | inxi.changelog | 207 |
4 files changed, 1782 insertions, 462 deletions
@@ -9,6 +9,46 @@ issue reports. The code in pre 2.9 versions literally no longer exists in inxi the pre 2.9 and the 2.9 and later versions are completely different internally. -------------------------------------------------------------------------------- +CODEBERG SOURCE REPO +-------------------------------------------------------------------------------- + +Packagers: Make sure to change your package URLs and repos to use codeberg.org. + +The previous inxi-perl, tarballs, and docs branches are now standalone repos +on codeberg.org: + +docs > https://codeberg.org/smxi/inxi-docs master +inxi-perl > https://codeberg.org/smxi/pinxi master +master > https://codeberg.org/smxi/inxi master +tarballs > https://codeberg.org/smxi/inxi-tarballs master + +inxi-perl has been rebuilt and now only contains the pinxi, pinxi.1 files, plus +a minimal README.txt for github users. docs and tarballs have been deleted. The +inxi-perl branch should not be used, and exists only so that current pinxi users +can update from there to get the new version with new URLs. + +inxi master and inxi-perl/pinxi will be mirrored until late 2023, then they will +no longer get updates. + +The inxi repo only contains master, plus the one, two branches, which are +obsolete. + +-------------------------------------------------------------------------------- + +Please file issue reports or feature requests at: + +https://codeberg.org/smxi/inxi + +Please take the time to read this helpful article from the Software Freedom +Conservancy: + +https://sfconservancy.org/GiveUpGitHub/ + +Any use of this project's code by GitHub Copilot, past or present, is done +without my permission. I do not consent to GitHub's use of this project's code +in Copilot. + +-------------------------------------------------------------------------------- DONATE -------------------------------------------------------------------------------- @@ -68,32 +108,41 @@ See BSD/UNIX below for qualifications re BSDs, and OSX in particular. SOURCE VERSION CONTROL -------------------------------------------------------------------------------- -https://github.com/smxi/inxi +inxi: +REPO: https://codeberg.org/smxi/inxi +MAIN BRANCH: master +DEVELOPMENT BRANCHES [not used]: one, two + +pinxi [development version for inxi]: +REPO: https://codeberg.org/smxi/pinxi MAIN BRANCH: master -DEVELOPMENT BRANCHES: inxi-perl, one, two -inxi-perl is the dev branch, the others are rarely if ever used. inxi itself has -the built in feature to be able to update itself from anywhere, including these -branches, which is very useful for development and debugging on various user -systems. +pinxi is the standalone development version of inxi. inxi branches one, two are +rarely if ever used. inxi has the built in feature to be able to update itself +from anywhere, including these branches, which is very useful for development +and debugging on various user systems. + +Please: NEVER even think about looking at or using previous inxi commits, +previous to the current master version, as a base for a patch. If you do, your +patch / pull request will probably be rejected. PULL REQUESTS: Please talk to me before starting to work on patches of any reasonable complexity. inxi is hard to work on, and you have to understand how -it works before submitting patches, unless it's a trivial bug fix. Please: NEVER -even think about looking at or using previous inxi commits, previous to the -current master version, as a base for a patch. If you do, your patch / pull -request will probably be rejected. Developers, get your version from the -inxi-perl branch, pinxi, otherwise you may not be current to actual development -versions. inxi-perl pinxi is always equal to or ahead of master branch inxi. - -Man page updates, doc page updates, etc, of course, are easy and will probably +it works before submitting patches, unless it's a trivial bug fix. Never work +with inxi master, always work with pinxi master, since it can be quite far ahead +of inxi. inxi master has only one purpose, to get updated to next inxi when +pinxi is ready to be copied over to inxi. pinxi is always equal to or ahead of +master branch inxi. + +Man page updates, doc pages updates, etc, of course, are easy and will probably be accepted, as long as they are properly formatted and logically coherent. -When under active development, inxi releases early, and releases often. +When under active development, pinxi releases early, and releases often. inxi +is stable and is generally only updated when a new tagged version is completed. -PACKAGERS: inxi has one and only one 'release', and that is the current -commit/version in the master branch (plus pinxi inxi-perl branch, of course, but -those should never be packaged). +PACKAGERS: inxi has one and only one 'release', and that is the current tagged +version in the master branch (plus pinxi repo, of course, but pinxi should in +general not be packaged). -------------------------------------------------------------------------------- MASTER BRANCH @@ -103,48 +152,66 @@ This is the only supported branch, and the current latest commit/version is the only supported 'release'. There are no 'releases' of inxi beyond the current commit/version in master. All past versions are not supported. -git clone https://github.com/smxi/inxi --branch master --single-branch +git clone https://codeberg.org/smxi/inxi --branch master --single-branch OR direct fast and easy install: -wget -O inxi https://github.com/smxi/inxi/raw/master/inxi +wget -O inxi https://codeberg.org/smxi/inxi/raw/master/inxi -OR easy to remember shortcut (which redirects to github): +OR easy to remember shortcut (which redirects to codeberg.org): wget -O inxi https://smxi.org/inxi wget -O inxi smxi.org/inxi -NOTE: Just because github calls tagged commits 'Releases' does not mean they are -releases! I can't change the words on the tag page. They are tagged commits, -period. A tag is a pointer to a commit, and has no further meaning. +NOTE: There are no 'Releases' per se. There are only tagged commits, period. A +tag is a pointer to a commit, and has no further meaning. A tagged commit +however is the target for packagers. If your distribution has blocked -U self updater and you want a newer version: Open /etc/inxi.conf and change false to true: B_ALLOW_UPDATE=true -------------------------------------------------------------------------------- -DEVELOPMENT BRANCH + +SPECIAL NOTE FOR LEGACY OPERATING SYSTEMS WITH NO TLS 1.2 OR GREATER: Modern web +servers are dropping support for TLS 1.0, 1.1, and so has smxi.org, this means +to install inxi onto an older system with only TLS 1.0 or 1.1 available, you +will need to do this to install inxi onto the old system: + +wget -O /usr/local/bin/inxi ftp://ftp.smxi.org/outgoing/inxi + +then update inxi/man pages after that with inxi -U 4, which uses FTP, not HTTP, +to download the file. + +For pinxi, just change inxi to pinxi above (add --man to get the man page), and +it will work the same. + +-------------------------------------------------------------------------------- +DEVELOPMENT VERSION (in pinxi repo) -------------------------------------------------------------------------------- -All active development is now done on the inxi-perl branch (pinxi): +All active development is done in the pinxi repo master branch.: -git clone https://github.com/smxi/inxi --branch inxi-perl --single-branch +git clone https://codeberg.org/smxi/pinxi OR direct fast and easy install: -wget -O pinxi https://github.com/smxi/inxi/raw/inxi-perl/pinxi +wget -O pinxi https://codeberg.org/smxi/pinxi/raw/master/pinxi -OR easy to remember shortcut (which redirects to github): +OR easy to remember shortcut (which redirects to codeberg.org): wget -O pinxi https://smxi.org/pinxi wget -O pinxi smxi.org/pinxi Once new features have been debugged, tested, and are reasonably stable, pinxi -is copied to inxi in the master branch. +is copied to inxi in the inxi master branch. It's a good idea to check with pinxi if you want to make sure your issue has not been corrected, since pinxi is always equal to or ahead of inxi. +See SPECIAL NOTE FOR LEGACY OPERATING SYSTEMS above to install pinxi on very old +operating systems with out of date TLS version. + -------------------------------------------------------------------------------- LEGACY INXI (in inxi-legacy repo) -------------------------------------------------------------------------------- @@ -154,9 +221,9 @@ inxi-legacy repo, as binxi in the /inxi-legacy directory: Direct fast and easy install: -wget -O binxi https://github.com/smxi/inxi-legacy/raw/master/inxi-legacy/binxi +wget -O binxi https://codeberg.org/smxi/inxi-legacy/raw/master/binxi -OR easy to remember shortcut (which redirects to github): +OR easy to remember shortcut (which redirects to codeberg.org): wget -O binxi https://smxi.org/binxi @@ -182,9 +249,9 @@ DOCUMENTATION https://smxi.org/docs/inxi.htm (smxi.org/docs/ is easier to remember, and is one click away from inxi.htm). The -one page wiki on github is only a pointer to the real resources. +one page wiki on codeberg.org is only a pointer to the real resources. -https://github.com/smxi/inxi/tree/inxi-perl/docs +https://codeberg.org/smxi/pinxi/src/branch/master/docs Contains specific Perl inxi documentation, of interest mostly to developers. Includes internal inxi tools, values, configuration items. Also has useful @@ -200,27 +267,30 @@ NOTE: Check the inxi version number on each doc page to see which version will support the options listed. The man and options page also link to a legacy version, pre 2.9. -https://github.com/smxi/inxi/wiki +https://codeberg.org/smxi/inxi/wiki This is simply a page with links to actual inxi resources, which can be useful -for developers and people with technical questions. No attempt will be made -to reproduce those external resources here on github. You'll find stuff like +for developers and people with technical questions. No attempt will be made to +reproduce those external resources on codeberg.org. You'll find stuff like how to export to json/xml there, and basic core philosophies, etc. -------------------------------------------------------------------------------- IRC -------------------------------------------------------------------------------- -You can go to: irc.oftc.net or irc.libera.chat channel #smxi +You can go to: + +irc.oftc.net or irc.libera.chat channel #smxi but be prepared to wait around for a while to get a response. Generally it's -better to use github issues. +better to use codeberg.org issues. -------------------------------------------------------------------------------- ISSUES -------------------------------------------------------------------------------- -https://github.com/smxi/inxi/issues +https://codeberg.org/smxi/inxi/issues + No issues accepted for non current inxi versions. See below for more on that. Unfortunately as of 2.9, no support or issues can be accepted for older inxi's because inxi 2.9 (Perl) and newer is a full rewrite, and legacy inxi is not @@ -317,10 +387,14 @@ SUPPORTED VERSIONS / DISTRO VERSIONS Important: the only version of inxi that is supported is the latest current master branch version/commit. No issue reports or bug reports will be accepted for anything other than current master branch. No merges, attempts to patch old -code from old versions, will be considered or accepted. If you are not updated -to the latest inxi, do not file a bug report since it's probably been fixed ages -ago. If your distro isn't packaging a current inxi, then file a bug report with -your packager, not here. +code from old versions, will be considered or accepted on the master branch of +inxi. If you are not updated to the latest inxi, do not file a bug report since +it's probably been fixed ages ago. If your distro isn't packaging a current +inxi, then file a bug report with your packager, not here. + +The development branch inxi-perl/pinxi has been moved to its own standalone +repo, pinxi, at https://codeberg.org/smxi/pinxi - this is the only place +development happens. inxi is 'rolling release' software, just like Debian Sid, Gentoo, or Arch Linux are rolling release GNU/Linux distributions, with no 'release points'. @@ -49,8 +49,8 @@ use POSIX qw(ceil uname strftime ttyname); ## INXI INFO ## my $self_name='inxi'; -my $self_version='3.3.29'; -my $self_date='2023-08-15'; +my $self_version='3.3.30'; +my $self_date='2023-09-25'; my $self_patch='00'; ## END INXI INFO ## @@ -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' => { @@ -4541,17 +4571,14 @@ sub get_defaults { my ($type) = @_; my %defaults = ( 'ftp-upload' => 'ftp.smxi.org/incoming', - 'inxi-branch-1' => 'https://github.com/smxi/inxi/raw/one/', - 'inxi-branch-2' => 'https://github.com/smxi/inxi/raw/two/', - 'inxi-dev' => 'https://smxi.org/in/', - 'inxi-main' => 'https://github.com/smxi/inxi/raw/master/', - 'inxi-pinxi' => 'https://github.com/smxi/inxi/raw/inxi-perl/', - 'inxi-man' => "https://smxi.org/in/$self_name.1", - 'inxi-man-gh' => "https://github.com/smxi/inxi/raw/master/$self_name.1", - 'pinxi-man' => "https://smxi.org/in/$self_name.1", - 'pinxi-man-gh' => "https://github.com/smxi/inxi/raw/inxi-perl/$self_name.1", + 'inxi-branch-1' => 'https://codeberg.org/smxi/inxi/raw/one/', + 'inxi-branch-2' => 'https://codeberg.org/smxi/inxi/raw/two/', + "$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', '<http>', '', "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', '<http|https|ftp>', '', "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, @@ -6305,7 +6339,7 @@ sub show_version { } push(@$rows, [ 0, '', '', '' ], - [ 0, '', '', "Website:^https://github.com/smxi/inxi^or^https://smxi.org/" ], + [ 0, '', '', "Website:^https://codeberg.org/smxi/inxi^or^https://smxi.org/" ], [ 0, '', '', "IRC:^irc.oftc.net channel:^#smxi" ], [ 0, '', '', "Forums:^https://techpatterns.com/forums/forum-33.html" ], [ 0, '', '', '' ], @@ -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'; } - } - else { - if ($graphics{'protocol'} eq 'wayland'){ - $api = 'EGL/GBM'; - $type = 'egl-wayland-console'; + elsif (!$b_egl && main::check_program('Xwayland')){ + $api = 'EGL'; + $type = 'egl-missing'; } - elsif (main::check_program('glxinfo')){ - $api = 'OpenGL'; - $type = ($b_root) ? 'gl-console-root' : 'gl-console-try'; + elsif (!$b_egl && !$b_glx && !$b_vulkan) { + $api = 'N/A'; + $type = 'gfx-api'; } - elsif (main::check_program('X') || main::check_program('Xorg')){ + } + else { + if (!$b_glx && + (main::check_program('X') || main::check_program('Xorg'))){ $api = 'OpenGL'; - $type = 'gl-console-glxinfo-missing'; + $type = 'glx-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 egl_output { +sub no_data_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 ($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 opengl_output { +sub egl_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 $type; - if ($b_root){ - $type = 'gl-display-root'; + 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 { - $type = 'gl-null'; + $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; } - push(@$rows, { - main::key($$num++,1,1,'API') => 'OpenGL', - main::key($$num++,0,2,'Message') => main::message($type) - }); - return; } - # 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]); + 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'}); + } } - # note: seen cases where gl drivers are missing, with empty field value. else { - $b_nogl = 1; - $working[1] = main::message('gl-value-empty'); + $rows->[$j]{main::key($num++,1,3,$key)} = ''; + $ref = $plat->{$key}{'egl'}; + egl_advanced_output($rows,$ref,\$num,$j,4,$data->{'version'}); } - 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]); - } + if (!$data->{'platforms'}{'active'}){ + $rows->[$j]{main::key($num++,0,3,'active')} = 'N/A'; } - elsif (/direct rendering/){ - @working = split(/:\s*/, $_, 2); - push(@direct_render, $working[1]); + if ($data->{'platforms'}{'inactive'}){ + $rows->[$j]{main::key($num++,0,3,'inactive')} = join(',',@{$data->{'platforms'}{'inactive'}}); } - # if -B was always available, we could skip this, but it is not - elsif (/GLX Visuals/){ - last; + } + 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'; } - 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; + $rows->[$j]{main::key($$num++,0,$ind,'drv')} = $value; +} + +sub opengl_output { + eval $start if $b_log; + my ($rows,$gl) = @_; + # egl will have set $glx if present + if (!$gl->{'glx'}){ + my $api = 'OpenGL'; + my $type; + if ($b_display){ + $type = ($b_root) ? 'glx-display-root': 'glx-null'; + } + else { + $type = ($b_root) ? 'glx-console-root' : 'glx-console-try'; + } + no_data_output($api,$type,$rows); + return 0; } - $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'); } @@ -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\-08\-15" "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. + +\- 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. -\fBv: 3.3 Mesa 11.2.0 compat\-v: 3.0\fR +\- 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: <filter> 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: <filter> - 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: <filter> 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 @@ -2704,7 +2759,7 @@ color codes in the output, use the \fB\-c [color ID]\fR flag. The sign you need to use this is extra numbers before the key/value pairs of the output of your program. These are IRC, not TTY, color codes. Please post a -github issue if you find you need to use \fB\-\-tty\fR (including the full +codeberg.org issue if you find you need to use \fB\-\-tty\fR (including the full \fB\-Ixxx\fR line) so we can figure out how to add your program to the list of whitelisted programs. @@ -2753,8 +2808,8 @@ Accepts one or more comma separated dbg specific debugging numbers. and fetch. Shows more downloader action information. Shows some more information for Perl downloader. -\fB1\-xx\fR \- See github \fBinxi\-perl/docs/inxi\-values.txt\fR for specific -specialized debugging options. There are a lot. +\fB1\-xx\fR \- See codeberg.org \fBinxi\-perl/docs/inxi\-values.txt\fR for +specific specialized debugging options. There are a lot. .TP .B \-\-debug [1\-3]\fR @@ -3071,7 +3126,7 @@ data inxi uses to parse out its report. .TP .B Issue Report File an issue report: -.I https://github.com/smxi/inxi/issues +.I https://codeberg.org/smxi/inxi/issues .TP .B Forums Post on inxi forums: @@ -3081,7 +3136,7 @@ Post on inxi forums: You can also visit \fRchannel:\fI #smxi\fR to post issues on either network. .SH HOMEPAGE -.I https://github.com/smxi/inxi +.I https://codeberg.org/smxi/inxi \fR \- Home of the source code, and tech docs (\fIinxi\-perl/docs\fR). diff --git a/inxi.changelog b/inxi.changelog index 685da62..8f480c2 100644 --- a/inxi.changelog +++ b/inxi.changelog @@ -1,4 +1,211 @@ ================================================================================ +Version: 3.3.30 +Patch: 00 +Date: 2023-09-25 +-------------------------------------------------------------------------------- +RELEASE NOTES: +-------------------------------------------------------------------------------- + +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. + +-------------------------------------------------------------------------------- +-- Harald Hope - Mon, 25 Sep 2023 15:03:45 -0700 + +================================================================================ Version: 3.3.29 Patch: 00 Date: 2023-08-15 |
