✘✘ GRAYBYTE WORDPRESS FILE MANAGER ✘✘

​🇳​​🇦​​🇲​​🇪♯➤ server.blackpussy.asia ​🇻​♯➤ 5.14.0-611.20.1.el9_7.x86_64 #1 SMP 🇾​♯➤ 2026

𝗛𝗢𝗠𝗘 𝗜𝗗 ♯➤ 163.245.207.76 ♯➤ 𝗔𝗗𝗠𝗜𝗡 𝗜𝗗 216.73.216.243
𝗢𝗣𝗧𝗜𝗢𝗡𝗦 ♯ CRL ♯➤ 𝗢𝗞 ┃ WGT ♯➤ 𝗢𝗞 ┃ SDO ♯➤ 𝗢𝗞 ┃ PKEX ♯➤ 𝗢𝗙𝗙
𝗗𝗘𝗔𝗖𝗧𝗜𝗩𝗔𝗧𝗘𝗗 ♯➤ mail,mb_send_mail
𝗖𝗨𝗥𝗥𝗘𝗡𝗧 𝗙𝗜𝗟𝗘 : /usr/bin//mysqlaccess
#!/usr/bin/perl

# Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; version 2
# of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public
# License along with this library; if not, write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1335  USA

# ****************************
package MySQLaccess;
#use strict;
use File::Temp qw(tempfile tmpnam);
use Fcntl;

BEGIN {
	# ****************************
	# static information...
	$VERSION     = "2.10, 13 Sep 2019";
	$0           =~ m%/([^/]+)$%o;
	$script      = $1;
        $script      = 'MySQLAccess' unless $script;
	$script_conf = "$script.conf";
	$script_log  = $ENV{'HOME'}."/$script.log";

	# ****************************
	# information on MariaDB
	$MYSQL     = '/usr/bin/mariadb';    # path to mariadb executable
	$SERVER    = '3.21';
	$MYSQL_OPT = ' --batch --unbuffered';
	$ACCESS_DB = 'mysql';		 # name of DB with grant-tables
	$ACCESS_H  = 'host';		 # 
	$ACCESS_U  = 'user';	         # 
	$ACCESS_D  = 'db';               #
	# Add/Edit privileges
	$ACCESS_H_TMP = 'host_tmp';      
	$ACCESS_U_TMP = 'user_tmp';      
	$ACCESS_D_TMP = 'db_tmp';        
	$ACCESS_H_BCK = 'host_backup';   
	$ACCESS_U_BCK = 'user_backup';   
	$ACCESS_D_BCK = 'db_backup';     
        $DIFF      = '/usr/bin/diff'; 
        $MYSQLDUMP = '/usr/bin/mariadb-dump';
                                         #path to mariadb-dump executable

        $MYSQLADMIN= 'http://foobar.com/MySQLadmin';
                                         #URL of CGI for manipulating
                                         #the temporary grant-tables
}

END {
	unlink $MYSQL_CNF if defined $MYSQL_CNF and not $DEBUG;
}

$INFO = <<"_INFO";
--------------------------------------------------------------------------
   mysqlaccess (Version $VERSION)
   ~~~~~~~~~~~
   Copyright (C) 1997,1998 Yves.Carlier\@rug.ac.be
                           University of Ghent (RUG), Belgium
                           Administratieve Informatieverwerking (AIV)

   report the access-privileges for a USER from a HOST to a DB

   Many thanks go to <monty\@mysql.com> and <psmith\@BayNetworks.COM>
   for their suggestions, debugging and patches. 

   use `$script -?' to get more information on available options.

   From version 2.0x, $script can also be used through a WEB-browser
   if it is ran as a CGI-script.  (See the release-notes)

--------------------------------------------------------------------------
_INFO

$OPTIONS = <<_OPTIONS;

Usage: $script [host [user [db]]] OPTIONS

  -?, --help           display this helpscreen and exit
  -v, --version        print information on the program `$script'

  -u, --user=#         username for logging in to the db
  -p, --password=#     validate password for user
  -h, --host=#         name or IP-number of the host
  -d, --db=#           name of the database

  -U, --superuser=#    connect as superuser
  -P, --spassword=#    password for superuser
  -H, --rhost=#        remote MariaDB-server to connect to
      --old_server     connect to old MariaDB-server (before v3.21) which 
                       does not yet know how to handle full where clauses.

  -b, --brief          single-line tabular report
  -t, --table          report in table-format

  --relnotes           print release-notes
  --plan               print suggestions/ideas for future releases
  --howto              some examples of how to run `$script'
  --debug=N            enter debuglevel N (0..3)

  --copy               reload temporary grant-tables from original ones
  --preview            show differences in privileges after making
                       changes in (temporary) grant-tables
  --commit             copy grant-rules from temporary tables to grant-tables
                       (!don't forget to do an mysqladmin reload)
  --rollback           undo the last changes to the grant-tables.

  Note:
    At least the user and the db must be given (even with wildcards)
    If no host is given, `localhost' is assumed
    Wilcards (*,?,%,_) are allowed for host, user and db, but be sure 
    to escape them from your shell!! (ie type \\* or '*')
_OPTIONS

$RELEASE = <<'_RELEASE';
 
Release Notes:
-------------
  0.1-beta1: internal
  - first trial.
 
  0.1-beta2: (1997-02-27)
  - complete rewrite of the granting-rules, based on the documentation
    found in de FAQ.
  - IP-number and name for a host are equiv.
 
  0.1-beta3: (1997-03-10)
  - more information
  - 'localhost' and the name/ip of the local machine are now equiv.

  0.1-beta4: (1997-03-11)
  - inform the user if he has not enough priv. to read the mysql db

  1.0-beta1: (1997-03-12)
  suggestions by Monty:
  - connect as superuser with superpassword.
  - mysqlaccess could also notice if all tables are empty. This means
    that all user have full access!
  - It would be nice if one could optionally start mysqlaccess without
    any options just the arguments 'user db' or 'host user db', where
    host is 'localhost' if one uses only two arguments.

  1.0-beta2: (1997-03-14)
  - bugfix: translation to reg.expr of \_ and \%.
  - bugfix: error in matching regular expression and string given
            by user which resulted in
            'test_123' being matched with 'test'

  1.0-beta3: (1997-03-14)
  - bugfix: the user-field should not be treated as a sql-regexpr,
            but as a plain string.
  - bugfix: the host-table should not be used if the host isn't empty in db
                                          or  if the host isn't emty in user
            (Monty)
 
  1.0-beta4: (1997-03-14)
  - bugfix: in an expression "$i = $j or $k", the '=' binds tighter than the or
            which results in problems...
            (by Monty)
  - running mysqlaccess with "perl -w" gives less warnings...   ;-)

  1.0-beta5: (1997-04-04)
  - bugfix: The table sorting was only being applied to the "user" table; all
            the tables need to be sorted.  Rewrote the sort algorithm, and
            the table walk algorithm (no temp file anymore), and various
            other cleanups.  I believe the access calculation is 100% correct.
            (by Paul D. Smith <psmith\@baynetworks.com>)
  - Allow the debug level to be set on the cmd line with --debug=N.
            (by Paul D. Smith <psmith\@baynetworks.com>)
  - More -w cleanups; should be totally -w-clean.
            (by Paul D. Smith <psmith\@baynetworks.com>)
 
  1.1-beta1: (1997-04-xx) 
  1.1-beta2: (1997-04-11)
  - new options:
             --all_users : report access-rights for all possible users
             --all_dbs   : report access-rights for all possible dbs
             --all_hosts : report access-rights for all possible hosts
             --brief     : as brief as possible, don't mention notes,warnings and rules
             --password  : validate password for user 
  - layout: long messages are wrapped on the report.
  - functionality:
            more descriptive notes and warnings
            wildcards (*,?) are allowed in the user,host and db options
            setting xxxx=* is equiv to using option --all_xxxx
            note: make sure you escape your wildcards, so they don't get
                  interpreted by the shell.  use \* or '*'
  - bugfix: Fieldnames which should be skipped on the output can now have
            a first capital letter.
  - bugfix: any option with a '.' (eg ip-number) was interpreted as
            a wildcard-expression.
  - bugfix: When no entry was found in the db-table, the default accessrights are
            N, instead of the faulty Y in a previous version.
 
  1.1-beta-3  : (1997-04-xx)
  1.1-beta-4  : (1997-04-xx)
  1.1-beta-5  : (1997-04-xx)
  1.1         : (1997-04-28)
  - new options:
            --rhost     : name of mysql-server to connect to
            --plan      : print suggestions/ideas for future releases
            --relnotes  : display release-notes
            --howto     : display examples on how to use mysqlaccess
            --brief     : single-line tabular output
  - functionality/bugfix:
    *      removed options --all_users,--all_dbs,--all_hosts, which 
           were redundant with the wildcard-expressions for the corresponding
           options. They made the processing of the commandline too painful 
           and confusing ;-)
           (suggested by psmith)
    *      redefined the option --brief, which now gives a single-line 
           tabular output
    *      Now we check if the right version of the mysql-client is used,
           since we might use an option not yet implemented in an
           older version (--unbuffered, since 3.0.18)
           Also the error-messages the mysql-client reports are 
           better interpreted ;-)  
    *      Wildcards can now be given following the SQL-expression 
           (%,_) and the Regular-expression (*,?) syntax.
  - speed: we now open a bidirectional pipe to the mysql-client, and keep 
           it open throughout the whole run. Queries are written to,
           and the answers read from the pipe.
           (suggested by monty)
  - bugfixes:
    *      the Rules were not properly reset over iterations 
    *      when in different tables the field-names were not identical, 
           eg. Select_priv and select_priv, they were considered as 
           definitions of 2 different access-rights.
    *      the IP-number of a host with a name containing wildcards should
           not be searched for in Name2IP and IP2Name.
    *      various other small things, pointed out by <monty> and <psmith>

  1.2         : (1997-05-13)
  - bugfix:
    * Fixed bug in acl with anonymous user:  Now if one gets accepted by the
      user table as a empty user name, the user name is set to '' when 
      checking against the 'db' and 'host' tables. (Bug fixed in MySQL3.20.19)

  1.2-1       : (1997-xx-xx)
  - bugfix:
    * hashes should  be initialized with () instead of {} <psmith>
    * "my" variable $name masks earlier declaration in same scope,
      using perl 5.004 <????>

  1.2-2       : (1997-06-10)
    
  2.0p1-3     : (1997-10-xx)
  - new
    * packages
    * log-file for debug-output : /tmp/mysqlaccess.log
    * default values are read from a configuration file $script.conf
      first this file is looked for in the current directory; if not
      found it is looked for in /etc
      Note that when default-values are given, these can't get overridden
      by empty (blanc) values!
    * CGI-BIN version with HTML and forms interface.  Simply place the
      script in an ScriptAliased directory, make the configuration file
      available in the that directory or in /etc, and point your browser
      to the right URL. 
    * copy the grant-rules to temporary tables, where you are safe to
      play with them.
    * preview changes in privileges after changing grant-rules,
      before taking them into production
    * copy the new grant-rules from the temporary tables back to the
      grant-tables.
    * Undo all changes made in the grant-tables (1-level undo).
  -new options:
    * --table   : as opposite of the --brief option.
    * --copy    : (re)load temporary grant-tables from original ones.
    * --preview : preview changes in privileges after changing
                  some or more entries in the grant-tables.
    * --commit  : copy grant-rules from temporary tables to grant-tables
                  (!don't forget to do an mysqladmin reload)
    * --rollback: undo the last changes to the grant-tables.

  - bugfix:
    * if the table db is empty, mysqlaccess freezed 
      (by X Zhu <X.Zhu@Bradford.ac.uk>)

  2.0         : (1997-10-09)
  - fixed some "-w" warnings.
  - complain when certain programs and paths can't be found.

  2.01        : (1997-12-12)
  - bugfix:
    * rules for db-table where not calculated and reported correctly.
  2.02        : (1998-01-xx)
  - bugfix:
    * Privileges of the user-table were not AND-ed properly with the
      other privileges. (reported by monty)
  - new option:
    * --old_server: mysqlaccess will now use a full where clause when
                    retrieving information from the MySQL-server.  If
                    you are connecting to an old server (before v3.21)
                    then use the option --old_server.
  2.03         : (1998-02-27)
  - bugfix:
    * in Host::MatchTemplate: incorrect match if host-field was left empty.

  2.04-alpha1  : (2000-02-11)
  Closes vulnerability due to former implementation requiring passwords
  to be passed on the command line.
  - functionality
    Option values for --password -p -spassword -P  may now be omitted from
    command line, in which case the values will be prompted for.
      (fix supplied by Steve Harvey <sgh@vex.net>)

   2.05: (2000-02-17)   Monty
   Moved the log file from /tmp to ~

   2.06:  Don't print '+++USING FULL WHERE CLAUSE+++'

_RELEASE

$TODO = <<_TODO;

 Plans:
 -----
  -a full where clause is use now.  How can we handle older servers?
  -add some more functionality for DNS.
  -select the warnings more carefuly.
  >>  I think that the warnings should either be enhanced to _really_
  >>  understand and report real problems accurately, or restricted to
  >>  only printing things that it knows with 100% certainty. <psmith)
  >>  Why do I have both '%' and 'any_other_host' in there?  Isn't that
  >>  the same thing?  I think it's because I have an actual host '%' in
  >>  one of my tables.  Probably the script should catch that and not
  >>  duplicate output. <psmith>

_TODO

# From the FAQ: the Grant-algorithm
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# The host table is mainly to maintain a list of "secure" servers.
# At TCX hosts contain a list of all machines on local network. These are granted
# all privileges.
# Technically the user grant is calculated by:
#
#    1.First sort all entries by host by putting host without wildcards first,
#      after this host with wildcards and entries with host = ".
#      Under each host sort user by the same criterias.
#    2.Get grant for user from the "db" table.
#    3.If hostname is "empty" for the found entry, AND the privileges with
#      the privileges for the host in "host" table.
#      (Remove all which is not "Y" in both)
#    4.OR (add) the privileges for the user from the "user" table.
#     (add all privileges which is "Y" in "user")
#
#    When matching, use the first found match.
#
# -----------------------------------------------------------------------------------

$HOWTO = <<_HOWTO;

Examples of how to call $script:
~~~~~~~~
1)Calling $script with 2 arguments:

  \$ $script root mysql
     ->report rights of user root logged on at the local host in db mysql

  Access-rights
  for USER 'root', from HOST 'localhost', to DB 'mysql'
          +-----------------+---+ +-----------------+---+
          | select_priv     | Y | | drop_priv       | Y |
          | insert_priv     | Y | | reload_priv     | Y |
          | update_priv     | Y | | shutdown_priv   | Y |
          | delete_priv     | Y | | process_priv    | Y |
          | create_priv     | Y | | file_priv       | Y |
          +-----------------+---+ +-----------------+---+
  BEWARE:  Everybody can access your DB as user 'root'
        :  WITHOUT supplying a password.  Be very careful about it!!

  The following rules are used:
   db    : 'No matching rule'
   host  : 'Not processed: host-field is not empty in db-table.'
   user  : 'localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'

2)Calling $script with 3 arguments:

  \$ $script foo.bar nobody Foo 
     ->report rights of user root logged in at machine foobar to db Foo

  Access-rights
  for USER 'nobody', from HOST 'foo.bar', to DB 'Foo'
          +-----------------+---+ +-----------------+---+
          | select_priv     | Y | | drop_priv       | N |
          | insert_priv     | Y | | reload_priv     | N |
          | update_priv     | Y | | shutdown_priv   | N |
          | delete_priv     | Y | | process_priv    | N |
          | create_priv     | N | | file_priv       | N |
          +-----------------+---+ +-----------------+---+
  BEWARE:  Everybody can access your DB as user 'nobody'
        :  WITHOUT supplying a password.  Be very careful about it!!

  The following rules are used:
   db    : 'foo.bar','Foo','nobody','Y','Y','Y','N','N','N'
   host  : 'Not processed: host-field is not empty in db-table.'
   user  : 'foo.bar','nobody','','N','N','N','Y','N','N','N','N','N','N'

3)Using wildcards:

  \$ $script  \\* nobody Foo --brief
     ->report access-rights of user nobody from all machines to db Foo,
       and use a matrix-report.

  Sel  Ins  Upd  Del  Crea Drop Reld Shut Proc File Host,User,DB        
  ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --------------------
   Y    Y    Y    Y    N    N    N    N    N    N   localhost,nobody,Foo
   N    N    N    N    N    N    N    N    N    N   %,nobody,Foo  
   N    N    N    N    N    N    N    N    N    N   any_other_host,nobody,Foo

_HOWTO


# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
#                       START OF THE PROGRAM                            #
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #

use Getopt::Long;
use Sys::Hostname;
use IPC::Open3;


# ****************************
# debugging flag
# can be set to 0,1,2,3
# a higher value gives more info
# ! this can also be set on the command-line
	$DEBUG   = 0;

# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>8
#  Normally nothing should be changed beneeth this line


# ****************************
# no caching on STDOUT
	$|=1;

	$MYSQL_CNF = tmpnam();
	%MYSQL_CNF = (client    => { },
                      mysql     => { },
                      mysqldump => { },
	);



$NEW_USER = 'ANY_NEW_USER';
$NEW_DB   = 'ANY_NEW_DB'  ;


# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #
#  mysqlaccess:                                              #
#  ~~~~~~~~~~~                                               #
#  Lets get to it,                                           #
#  and start the program by processing the parameters        #
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #

($CMD,$CGI) = GetMode();

# ****************************
# the copyright message should
# always be printed (once)
MySQLaccess::Report::Print_Header();

# *****************************
# Read configuration-file
  MySQLaccess::Debug::Print(1, "Reading configuration file...");
  if (-f "/etc/$script_conf") {
     print "Configuration file '$script_conf' is found in '/etc/'\n";
     require "/etc/$script_conf";
  }
  elsif (-f "/usr/$script_conf") {
     print "Configuration file '$script_conf' is found in '/usr/'\n";
     require "/usr/$script_conf";
  }
  elsif (-f "./$script_conf") {
     print "\nERROR! Configuration file '$script_conf' is found in the current ";
     print "directory.\nThe permissible locations for this file are either ";
     print "/etc/ or /usr/\n";
     print "Please move it to one of these locations and retry.\n\n";
     exit 0;
  }


# ****************************
# Read in all parameters
if ($MySQLaccess::CMD) { #command-line version
	# ----------------------------
	# Get options from commandline
	$Getopt::Long::ignorecase=0; #case sensitive options
	if ( grep(/\-\?/,@ARGV) ) { MySQLaccess::Report::Print_Usage(); exit 0; }
	GetOptions("help"          => \$Param{'help'}
	          ,"host|h=s"      => \$Param{'host'}
	          ,"user|u=s"      => \$Param{'user'}
	          ,"password|p:s"  => \$Param{'password'}
	          ,"db|d=s"        => \$Param{'db'}
	          ,"superuser|U=s" => \$Param{'superuser'}
	          ,"spassword|P:s" => \$Param{'spassword'}
	          ,"rhost|H=s"     => \$Param{'rhost'}
                  ,"old_server"    => \$Param{'old_server'}
	          ,"debug=i"       => \$Param{'DEBUG'}
	          ,"brief|b"       => \$Param{'brief'}
	          ,"table|t"       => \$Param{'table'}
	          ,"relnotes"      => \$Param{'relnotes'}
	          ,"plan"          => \$Param{'plan'}
	          ,"howto"         => \$Param{'howto'}
	          ,"version|v"     => \$Param{'version'}
                  ,"preview"       => \$Param{'preview'}
                  ,"copy"          => \$Param{'copy'}
                  ,"commit"        => \$Param{'commit'}
                  ,'rollback'      => \$Param{'rollback'}
		  );

        # -----------------------------
        # set DEBUG
        $DEBUG = $Param{'DEBUG'} if ($Param{'DEBUG'}>=$DEBUG);

	# -----------------------------
	# check for things which aren't
	# declared as options:
	# 2 arguments: (user,db) -> ('localhost','user','db')
	if ($#ARGV == 1) {
	   MySQLaccess::Debug::Print(2,"$script called with 2 arguments:");
	   $Param{'host'} = $Param{'host'} || 'localhost'; 
	   $Param{'user'} = $ARGV[0] || $Param{'user'};
           $Param{'db'}   = $ARGV[1] || $Param{'db'}; 
	}
	# 3 arguments: (host,user,db)
	if ($#ARGV == 2) {
	   MySQLaccess::Debug::Print(2,"$script called with 3 arguments:");
	   $Param{'host'} = $ARGV[0] || $Param{'host'};
	   $Param{'user'} = $ARGV[1] || $Param{'user'};
	   $Param{'db'}   = $ARGV[2] || $Param{'db'};
	}

	# -------------------------------------
	# prompt for user password if requested
	if ( defined($Param{'password'}) && length($Param{'password'}) == 0 ) {
           $Param{'password'} = PromptPass(
	                        "Password for MySQL user $Param{'user'}: ");
	}
}
if ($MySQLaccess::CGI) { #CGI-version
	require CGI;
 	$Q = new CGI;
	$Param{'help'} = $Q->param('help') ;
	$Param{'host'} = $Q->param('host') || $Q->param('h') || $Param{'host'};
	$Param{'user'} = $Q->param('user') || $Q->param('u') || $Param{'user'};
	$Param{'db'}   = $Q->param('db')   || $Q->param('d') || $Param{'db'};
	$Param{'password'}  = $Q->param('password')  || $Q->param('p') || $Param{'password'};
	$Param{'superuser'} = $Q->param('superuser') || $Q->param('U') || $Param{'superuser'};
	$Param{'spassword'} = $Q->param('spassword') || $Q->param('P') || $Param{'spassword'};
	$Param{'rhost'}     = $Q->param('rhost')     || $Q->param('H') || $Param{'rhost'};
	$Param{'old_server'}= $Q->param('old_server')|| $Param{'old_server'};
	$Param{'debug'}     = $Q->param('debug')     || $Param{'debug'};
	$Param{'brief'}     = $Q->param('brief')     || $Param{'brief'}; 
	$Param{'table'}     = $Q->param('table')     || $Param{'table'}; 
	$Param{'relnotes'}  = $Q->param('relnotes');
	$Param{'plan'}      = $Q->param('plan');
	$Param{'howto'}     = $Q->param('howto'); 
	$Param{'version'}   = $Q->param('version') ? $Q->param('version') : $Q->param('v');
	$Param{'edit'}      = $Q->param('edit'); 
	$Param{'preview'}   = $Q->param('preview'); 
	$Param{'copy'}      = $Q->param('copy'); 
	$Param{'commit'}    = $Q->param('commit'); 
	$Param{'rollback'}  = $Q->param('rollback'); 
        # -----------------------------
        # set DEBUG
        $DEBUG = $Q->param('debug') if ($Q->param('debug')>=$DEBUG);
}

# ----------------------
# brief and table-format 
# exclude each-other
# table-format is preferred
if (defined($Param{'table'})) { undef($Param{'brief'}); }
if (defined($Param{'preview'}) or
    defined($Param{'copy'}) or
    defined($Param{'commit'}) or
    defined($Param{'rollback'}) ) { $Param{'edit'}='on'; }


# ----------------------
# if no host is given
# assume we mean 'localhost'
if (!defined($Param{'host'}))      { $Param{'host'}='localhost'; }

# ----------------------
# perform some checks
# -> eliminate 'broken pipe' error
push(@MySQLaccess::Grant::Error,'not_found_mysql')     if !(-x $MYSQL);
push(@MySQLaccess::Grant::Error,'not_found_diff')      if !(-x $DIFF);
push(@MySQLaccess::Grant::Error,'not_found_mysqldump') if !(-x $MYSQLDUMP);
if (@MySQLaccess::Grant::Error) {
   MySQLaccess::Report::Print_Error_Messages() ;
   exit 0;
}

#-----------------------
# get info/help if necc.
$print_usage=1;
if ( defined($Param{'version'}) ) {
   MySQLaccess::Report::Print_Version();
   $print_usage=0;
   MySQLaccess::Report::Print_Footer();
   MySQLaccess::DB::CloseConnection();
   exit 0;
#   exit 0;
}
if ( defined($Param{'relnotes'}) ) {
   MySQLaccess::Report::Print_Relnotes();
   $print_usage=0;
   MySQLaccess::Report::Print_Footer();
   MySQLaccess::DB::CloseConnection();
   exit 0;
#   exit 0;
}
if ( defined($Param{'plan'}) ) {
   MySQLaccess::Report::Print_Plans();
   $print_usage=0;
   MySQLaccess::Report::Print_Footer();
   MySQLaccess::DB::CloseConnection();
   exit 0;
#   exit 0;
}
if ( defined($Param{'howto'}) ) {
   MySQLaccess::Report::Print_HowTo();
   $print_usage=0;
   MySQLaccess::Report::Print_Footer();
   MySQLaccess::DB::CloseConnection();
   exit 0;
#   exit 0;
}

# -----------------------------
# generate a help-screen in CMD-mode
# or a blanc form in CGI-mode 
if ( defined($Param{'help'}) 
     or !defined($Param{'user'}) 
     or !defined($Param{'host'})
     or !defined($Param{'db'}) 
   ) {
   push(@MySQLaccess::Grant::Error,'user_required') unless defined($Param{'user'});
   push(@MySQLaccess::Grant::Error,'db_required') unless defined($Param{'db'});
   push(@MySQLaccess::Grant::Error,'host_required') unless defined($Param{'host'});
   MySQLaccess::Report::Print_Usage() if $print_usage;
   exit 0;
}


# ----------------------------
# get hostname and local-ip
# for localhost
$localhost = MySQLaccess::Host::LocalHost();
$local_ip  = MySQLaccess::Host::Name2IP($localhost);
$MySQLaccess::Host::localhost = MySQLaccess::Host::LocalHost();
$MySQLaccess::Host::local_ip  = MySQLaccess::Host::Name2IP($localhost);
MySQLaccess::Debug::Print(3, "localhost name=$localhost, ip=$local_ip");

#-----------------------------------
# version of MySQL-server to connect
# to determine use of full where clause
$MySQLaccess::Host::SERVER = $Param{'old_server'} ? '3.20' : $SERVER;

#---------------------------------
# create the config file for mysql and mysqldump
# to avoid passing authentication info on the command line
#
MergeConfigFiles();
die "Unsafe config file found: $unsafeConfig\n"  if $unsafeConfig;
if (defined($Param{'superuser'})) {
   $MYSQL_CNF{'mysql'}{'user'} = $Param{'superuser'};
   $MYSQL_CNF{'mysqldump'}{'user'} = $Param{'superuser'};
}
if (defined($Param{'spassword'})) {
   if ( $CMD && length($Param{'spassword'}) == 0 ) {
      $Param{'spassword'} =
           PromptPass("Password for MySQL superuser $Param{'superuser'}: ");
   }
   if ( length($Param{'spassword'}) > 0 ) {
      $MYSQL_CNF{'mysql'}{'password'} = $Param{'spassword'};
      $MYSQL_CNF{'mysqldump'}{'password'} = $Param{'spassword'};
   }
}
WriteTempConfigFile();

#---------------------------------
# Inform user if he has not enough
# privileges to read the access-db
if ( $nerror=MySQLaccess::DB::OpenConnection() ) {
    MySQLaccess::Report::Print_Error_Access($nerror);
    exit 0;
}

# -----------------------
# Read MySQL ACL-files
if ($nerror=MySQLaccess::Grant::ReadTables()) {
    MySQLaccess::Report::Print_Error_Access($nerror);
    exit 0;
};
if ($Param{'edit'} and $nerror=MySQLaccess::Grant::ReadTables('tmp')) {
    MySQLaccess::Report::Print_Error_Access($nerror);
    exit 0;
}

#---------------------------------
# reload temporay grant-tables 
# with data from original ones
if ( defined($Param{'copy'}) ) {
   $nerror=MySQLaccess::DB::LoadTmpTables();
   if ($nerror) {
      MySQLaccess::Report::Print_Error_Access($nerror);
      exit 0;
   }
   my $msg = "The grant-rules are copied from the grant-tables to\n"
           . "the temporary tables.";
   MySQLaccess::Report::Print_Message([$msg]);
#   MySQLaccess::Report::Print_Footer();
#   MySQLaccess::DB::CloseConnection();
#   exit 0;
}


#---------------------------------
# preview result of changes in the 
# grant-tables
if ( defined($Param{'preview'}) ) {
   $aref=MySQLaccess::Grant::Diff_Privileges();
   MySQLaccess::Report::Print_Diff_ACL($aref);
#   MySQLaccess::Report::Print_Footer();
#   MySQLaccess::DB::CloseConnection();
#   exit 0;
}


#---------------------------------
# reload grant-tables 
# with data from temporary tables
if ( defined($Param{'commit'}) ) {
   if ($nerror = MySQLaccess::DB::CommitGrantTables()) {
      MySQLaccess::Report::Print_Error_Access($nerror);
      exit 0;
   }
   my $msg = "The grant-rules have been copied from the temporary tables\n"
           . "to the grant-tables.";
   my $msg1= "Don't forget to do an 'mysqladmin reload' before these\n"
           . "changes take effect.";
   my $msg2= "A backup-version of your original grant-rules are saved in the\n"
           . "backup-tables, so you can always perform a 1-level rollback.";
   MySQLaccess::Report::Print_Message([$msg,$msg1,$msg2]);
#   MySQLaccess::Report::Print_Footer();
#   MySQLaccess::DB::CloseConnection();
#   exit 0;
}

#---------------------------------
# restore previous grant-rules
# with data from backup tables
if ( defined($Param{'rollback'}) ) {
   if ($nerror = MySQLaccess::DB::RollbackGrantTables()) {
      MySQLaccess::Report::Print_Error_Access($nerror);
      exit 0;
   }
   my $msg = "The old grant-rules have been copied back from the backup tables\n"
           . "to the grant-tables.";
   my $msg1= "Don't forget to do an 'mysqladmin reload' before these\n"
           . "changes take effect.";
   MySQLaccess::Report::Print_Message([$msg,$msg1]);
#   MySQLaccess::Report::Print_Footer();
#   MySQLaccess::DB::CloseConnection();
#   exit 0;
}
#----------------------------------
# show edit-taskbar
if ( defined($Param{'edit'})) {
   if ($MySQLaccess::CGI ) {
   MySQLaccess::Report::Print_Edit();
   $print_usage=0;
   MySQLaccess::Report::Print_Footer();
   MySQLaccess::DB::CloseConnection();
   exit 0;
   }
   else {
   MySQLaccess::Report::Print_Edit();
   $print_usage=0;
   MySQLaccess::Report::Print_Footer();
   MySQLaccess::DB::CloseConnection();
   exit 0;
   }
}


# -----------------------------
# Build list of users,dbs,hosts
# to process...
@all_dbs   = @{MySQLaccess::DB::Get_All_dbs($Param{'db'})};
@all_users = @{MySQLaccess::DB::Get_All_users($Param{'user'})};
@all_hosts = @{MySQLaccess::DB::Get_All_hosts($Param{'host'})};
#if EDIT-mode
#@all_dbs_tmp   = @{MySQLaccess::DB::Get_All_dbs($Param{'db'},'tmp')};
#@all_users_tmp = @{MySQLaccess::DB::Get_All_users($Param{'user'},'tmp')};
#@all_hosts_tmp = @{MySQLaccess::DB::Get_All_hosts($Param{'host'},'tmp')};

# -----------------------------
# Report access-rights for each
# tuple (host,user,db)
#$headers=0;
my %Access = ();
foreach $host (@all_hosts) {
  foreach $user (@all_users) {
    foreach $db (@all_dbs) {
      MySQLaccess::Grant::Initialize();
      %Access = MySQLaccess::Grant::Get_Access_Rights($host,$user,$db);	
      MySQLaccess::Report::Print_Access_rights($host,$user,$db,\%Access);
    }
  }
}

# -----------------------------
# End script
MySQLaccess::Report::Print_Footer();
MySQLaccess::DB::CloseConnection();
exit 0;

#############################################################
#  FUNCTIONS  #
###############
sub GetMode {
   my $cmd=0;
   my $cgi=0;
   if (defined($ENV{'HTTP_HOST'})) { $cmd=0; $cgi=1; }
   else                            { $cmd=1; $cgi=0; } 
   return ($cmd,$cgi);
}

# ================================
# sub PromptPass
#  prompt tty for a password
# ================================
sub PromptPass {
    my ($prompt) = @_;
    my $password;
    $ENV{PATH} = "/bin:/usr/bin";
    $ENV{IFS} = " \t\n";
    $ENV{SHELL} = "/bin/sh";
    system "stty -echo";
    print $prompt;
    chomp($password = <STDIN>);
    print "\n";
    system "stty echo";
    $password;
}

# =================================
# sub CheckUnsafeFile
#  tell if a config file containing a password is unsafe
# =================================
sub CheckUnsafeFile {
    my ($fname) = @_;
    my ($dev, $ino, $mode, $nlink,
        $uid, $gid, $rdev, $size,
        $atime, $mtime, $ctime, $blksize, $blocks) = stat($fname);

    if ( $uid != $< ) {   # unsafe if owned by other than current user
        return 1;
    }
    if ( $mode & 066 ) {  # unsafe if accessible by other
        return 1;
    }
    $fname =~ s#/[^/]+$##;
    if ( (length $fname) > 0 ) {
        return CheckUnsafeDir($fname);
    }
    return 0;
}

# =================================
# sub CheckUnsafeDir
#  tell if a directory is unsafe
# =================================
sub CheckUnsafeDir {
    my ($fname) = @_;
    my ($dev, $ino, $mode, $nlink,
        $uid, $gid, $rdev, $size,
        $atime, $mtime, $ctime, $blksize, $blocks) = stat($fname);

    # not owned by me or root
    if ( ($uid != $<) && ($uid != 0) ) {
        return 1;
    }
    if ( $mode & 022 ) {  # unsafe if writable by other
        return 1  unless $mode & 01000;  # but sticky bit ok
    }
    $fname =~ s#/[^/]+$##;
    if ( (length $fname) > 0 ) {
        return CheckUnsafeDir($fname);
    }
    return 0;
}

# =================================
# sub MergeConfigFile
#  merge data from .cnf file
# =================================
sub MergeConfigFile {
    my ($fname) = @_;
    my ($group, $item, $value);
    if ( open CNF, $fname ) {
         while (<CNF>) {
             s/^\s+//;
             next if /^[#;]/;
             if ( /\[\s*(\w+)\s*]/ ) {
                 $group = $1;
                 $group =~ tr/A-Z/a-z/;
                 if ( !exists $MYSQL_CNF{$group} ) {
                     undef $group;
                 }
             } elsif ( defined $group ) {
                 ($item, $value) = /((?:\w|-)+)\s*=\s*(\S+)/;
                 # don't unquote backslashes as we just write it back out
                 if ( defined $item ) {
                     if ( $item =~ /^password$/ ) {
                         if ( CheckUnsafeFile($fname) ) {
                             $unsafeConfig = $fname;
                         }
                     }
                     if ( $group eq 'client' || $group eq "client-server") {
                         $MYSQL_CNF{'mysql'}{$item} = $value;
                         $MYSQL_CNF{'mysqldump'}{$item} = $value;
                     } else {
                         $MYSQL_CNF{$group}{$item} = $value;
                     }
                 }
             }
         }
         close(CNF);
    }
}

# =================================
# sub MergeConfigFiles
#  merge options from config files
#  NOTE: really should do two separate merges for each
#    client to exactly duplicate order of resulting argument lists
# =================================
sub MergeConfigFiles {
    my ($name,$pass,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwuid $<;
    MergeConfigFile("/usr/my.cnf");
    MergeConfigFile("/etc/my.cnf");
    MergeConfigFile("$dir/.my.cnf");
}

# =================================
# sub WriteTempConfigFile
#  write 
# =================================
sub WriteTempConfigFile {
   sysopen CNFFILE, $MYSQL_CNF, O_RDWR|O_CREAT|O_EXCL, 0700
      or die "sysopen $MYSQL_CNF: $!";
   
   # groups may be in any order, generic groups such as [client] assumed
   # here to be empty
   foreach $group (keys %MYSQL_CNF) {
      print CNFFILE "[$group]\n";
      foreach $item (keys %{$MYSQL_CNF{$group}}) {
         if ( defined $MYSQL_CNF{$group}{$item} ) {
            print CNFFILE "$item=$MYSQL_CNF{$group}{$item}\n";
         } else {
            print CNFFILE "$item\n";
         }
      }
      print CNFFILE "\n";
   }
   close(CNFFILE);
}

######################################################################
package MySQLaccess::DB;
###########
BEGIN {
    $DEBUG     = 2;
    $DEBUG     = $MySQLaccess::DEBUG unless ($DEBUG);
    # Error-messages from the MySQL client
    %ACCESS_ERR= ('Access_denied'       => 'Access denied' 
                 ,'Dbaccess_denied'     => 'Access to database denied'
                 ,'Unrecognized_option' => 'unrecognized option' 
                 ,'Unknown_table'       => "Can't find file:"
                 ,'unknown_error'       => '^ERROR:'
                 );
}
# ######################################
#  Connecting to the MYSQL DB
# ======================================
# sub OpenConnection
#  Open an connection to the mysql-db
#  questions to MYSQL_Q
#  answers from MYSQL_A
# ======================================
sub OpenConnection {
    my $pid;
    MySQLaccess::Debug::Print(2,"OpenConnection:");

    # check path to mysql-client executable
    if (! -f $MySQLaccess::MYSQL) {
       if ($MySQLaccess::CMD) { die "Could not find MySQL-client '$MySQLaccess::MYSQL'"; }
       if ($MySQLaccess::CGI) { 
          print "<center>\n<font color=Red>\n";
          print "ERROR: Could not find MySQL-client '$MySQLaccess::MYSQL'";
          print "</center>\n</font>\n";
          exit 0;
       }
    }

    # path to mysql executable
    my $connect = "$MySQLaccess::MYSQL --defaults-file=$MySQLaccess::MYSQL_CNF";
    $connect .= " $MySQLaccess::MYSQL_OPT";
    # superuser, spassword transmitted via defaults-file
    if (defined($MySQLaccess::Param{'rhost'}))     { $connect .= " --host=$MySQLaccess::Param{'rhost'}"; }
    # other options??

    # grant-database
    $connect .= " $MySQLaccess::ACCESS_DB";

    # open connection (not using /bin/sh -c)
    MySQLaccess::Debug::Print(2,"Connecting to: $connect");
    $pid=IPC::Open3::open3(\*MYSQL_Q,\*MYSQL_A,"",split /\s+/,$connect);
    MySQLaccess::Debug::Print(2,"PID of open pipe: $pid");
    
    # check connection 
    print MYSQL_Q "select 'ok';\n";
    $answer = <MYSQL_A>; #answer from mysql
    MySQLaccess::Debug::Print(2,"Answer: $answer\n");
    foreach $nerror (sort(keys(%ACCESS_ERR))) {
      MySQLaccess::Debug::Print(3,"check answer for error $ACCESS_ERR{$nerror}");
      if (grep(/$ACCESS_ERR{$nerror}/i,$answer)) { 
         MySQLaccess::Debug::Print(2,"Answer contain error [$nerror]");
         return $nerror; 
      }
    }

if (0) {
    # check server-version 
    print MYSQL_Q "select 'ok';\n";
    $answer = <MYSQL_A>; #answer from mysql
    MySQLaccess::Debug::Print(2,"Answer: $answer\n");
    foreach $nerror (sort(keys(%ACCESS_ERR))) {
      MySQLaccess::Debug::Print(3,"check answer for error $ACCESS_ERR{$nerror}");
      if (grep(/$ACCESS_ERR{$nerror}/i,$answer)) { 
         MySQLaccess::Debug::Print(2,"Answer contain error [$nerror]");
         return $nerror; 
      }
    }
}

    my $skip=<MYSQL_A>; 
    return 0; 
}

# ======================================
# sub CloseConnection
#  Close the connection to the mysql-db
# ======================================
sub CloseConnection {
    close MYSQL_Q;
    close MYSQL_A;
}

# ===========================================================
# sub CreateTable($table)
#  Create temporary/backup table
# ===========================================================
sub CreateTable {
    my $pid;
    my ($table,$force) = @_;
    my %tables = ( $MySQLaccess::ACCESS_U_TMP => $MySQLaccess::ACCESS_U,
                   $MySQLaccess::ACCESS_H_TMP => $MySQLaccess::ACCESS_H,
                   $MySQLaccess::ACCESS_D_TMP => $MySQLaccess::ACCESS_D,
                   $MySQLaccess::ACCESS_U_BCK => $MySQLaccess::ACCESS_U,
                   $MySQLaccess::ACCESS_H_BCK => $MySQLaccess::ACCESS_H,
                   $MySQLaccess::ACCESS_D_BCK => $MySQLaccess::ACCESS_D,
                   $MySQLaccess::ACCESS_U => $MySQLaccess::ACCESS_U_BCK,
                   $MySQLaccess::ACCESS_H => $MySQLaccess::ACCESS_H_BCK,
                   $MySQLaccess::ACCESS_D => $MySQLaccess::ACCESS_D_BCK,
                 ); 
    my $tbl;
    my $query="";
    my $delim;
    my $skip;
    my $create;
    my @known_tables=();

#    print STDERR "CreateTable($table)\n";
    MySQLaccess::Debug::Print(1,"CreateTable($table):");

    ## error-handling
    return 'Unknown_table' unless defined($tables{$table});

    ## build list of known/existing tables;
    ## if 'force' existing table is dropped first
    if (defined($force) and $force) {
       @known_tables = Show_Tables();
       if (grep(/^$table$/,@known_tables)) {
       $query = "DROP TABLE $table;";
       }
    }

    ## path to mysqldump executable
    my $connect = $MySQLaccess::MYSQLDUMP;
    $connect .= " --defaults-file=$MySQLaccess::MYSQL_CNF --no-data";
    # superuser, spassword transmitted via defaults-file
    if (defined($MySQLaccess::Param{'rhost'}))     { $connect .= " --host=$MySQLaccess::Param{'rhost'}"; }
    $connect .= " $MySQLaccess::ACCESS_DB";
    $connect .= " $tables{$table}";


    ## get creation-data for original table
    $create = '';
    my $mysqldump = $connect;
    $mysqldump =~ s/ \$TABLE / $tbl /;

    # open connection (not using /bin/sh -c)
    MySQLaccess::Debug::Print(2,"Connecting to: $connect");
    $pid=IPC::Open3::open3(\*DONTCARE,\*CREATE,"",split /\s+/,$mysqldump);
    MySQLaccess::Debug::Print(2,"PID of open pipe: $pid");
    #open(CREATE,"$mysqldump");
    @create = <CREATE>;
    $create = "@create";
    foreach $nerror (sort(keys(%ACCESS_ERR))) {
       MySQLaccess::Debug::Print(3,"check answer for error $ACCESS_ERR{$nerror}");
       if (grep(/$ACCESS_ERR{$nerror}/i,$create)) { 
          MySQLaccess::Debug::Print(2,"Answer contain error [$nerror]");
          return $nerror; 
       }
    }
    close(CREATE);
    close(DONTCARE);

    ## manipulate result for creation-data for temporary table
    $create =~ s/CREATE TABLE $tables{$table} \(/CREATE TABLE $table \(/;

    ## recreate temporary table
    $query .= "$create\n";
    $query .= "select 'ok';";

    ## execute query
    print MYSQL_Q "$query\n";
#    print STDERR $query;

    $answer = <MYSQL_A>; #answer from mysql
#    print STDERR "A>",$answer;
    MySQLaccess::Debug::Print(2,"Answer: $answer\n");
    foreach $nerror (sort(keys(%ACCESS_ERR))) {
#       print STDERR "->$nerror?";
       MySQLaccess::Debug::Print(3,"check answer for error $ACCESS_ERR{$nerror}");
       if (grep(/$ACCESS_ERR{$nerror}/i,$answer)) { 
#          print STDERR "Yes!";
          MySQLaccess::Debug::Print(2,"Answer contain error [$nerror]");
          return $nerror; 
       }
    }

    $delim = <MYSQL_A>; # read header
    if ($delim ne "ok\n") {
       while (($line=<MYSQL_A>) ne "ok\n")
       { MySQLaccess::Debug::Print(3," A> $line"); }
        $skip = <MYSQL_A>; # skip result 'ok'
    }
#    print STDERR "CreateTable done\n";
    return 0;
}


# ===========================================================
# sub CopyTable()
#  Copy the structure and the data of a table to another table
# ===========================================================
sub CopyTable {
    my ($from,$to,$force) = @_;
    my @known_tables  = Show_Tables();    
    my $query = "";
    my $nerror= 0;
    my $skip;

#    print STDERR "CopyTable($from,$to)\n";
    MySQLaccess::Debug::Print(1,"MySQLaccess::DB::CopyTable($from,$to)");

    ## error-handling
    if (!grep(/^$from$/,@known_tables)) { return 'Unknown_table'; }

    ## copy structure 
    ## if forced
    if (defined($force) and $force) {
       return $nerror if ($nerror=CreateTable($to,$force)); 
#       print STDERR "Structure copied\n";
    }

    ## copy data
    $query .= "DELETE FROM $to;";
    $query .= "INSERT INTO $to SELECT * FROM $from;";
    $query .= "SELECT 'ok';\n";
    MySQLaccess::Debug::Print(2,"Query: $query");
       
    ## execute query
    print MYSQL_Q "$query\n";
#    print STDERR $query;

    ## check for errors...
    my $answer = <MYSQL_A>; #answer from mysql
#    print STDERR $answer;
    MySQLaccess::Debug::Print(2,"Answer: $answer\n");
    foreach $nerror (sort(keys(%ACCESS_ERR))) {
       MySQLaccess::Debug::Print(3,"check answer for error $ACCESS_ERR{$nerror}");
       if (grep(/$ACCESS_ERR{$nerror}/i,$answer)) { 
          MySQLaccess::Debug::Print(2,"Answer contain error [$nerror]");
          return $nerror; 
       }
    }

    my $delim = <MYSQL_A>; # read header
#    print STDERR $delim;
    if ($delim ne "ok\n") {
       while (($line=<MYSQL_A>) ne "ok\n")
       { MySQLaccess::Debug::Print(3," A> $line"); }
       $skip = <MYSQL_A>; # skip result 'ok'
    }

    return 0;
}

# ===========================================================
# sub LoadTmpTables()
#  (Re)load temporary tables with entries of ACL-tables
# ===========================================================
sub LoadTmpTables {
    my %tables = ( $MySQLaccess::ACCESS_U => $MySQLaccess::ACCESS_U_TMP,
                   $MySQLaccess::ACCESS_H => $MySQLaccess::ACCESS_H_TMP,
                   $MySQLaccess::ACCESS_D => $MySQLaccess::ACCESS_D_TMP,
                 ); 
    my $tbl;
    my $nerror;
    
#    print STDERR "LoadTmpTables:\n";
    MySQLaccess::Debug::Print(1,"LoadTmpTables():");
    foreach $tbl (keys(%tables)) {
#       print STDERR "$tbl -> $tables{$tbl}\n";
       MySQLaccess::Debug::Print(2,"Loading table $tbl -> $tables{$tbl}.");
       return $nerror if ($nerror=CopyTable($tbl,$tables{$tbl},'force'));
    }
    return 0;
}

# ===========================================================
# sub BackupGrantTables()
#  Make a backup of the original grant-tables
# ===========================================================
sub BackupGrantTables {
    my %tables = ( $MySQLaccess::ACCESS_U => $MySQLaccess::ACCESS_U_BCK,
                   $MySQLaccess::ACCESS_H => $MySQLaccess::ACCESS_H_BCK,
                   $MySQLaccess::ACCESS_D => $MySQLaccess::ACCESS_D_BCK,
                 ); 
    my $tbl;
    my $nerror;
    
#    print STDERR "BackupGrantTables:\n";
    MySQLaccess::Debug::Print(1,"BackupGrantTables():");
    foreach $tbl (keys(%tables)) {
#       print STDERR "$tbl -> $tables{$tbl}\n";
       MySQLaccess::Debug::Print(2,"Backup table $tbl -> $tables{$tbl}.");
       return $nerror if ($nerror=CopyTable($tbl,$tables{$tbl},'force'));
    }
    return 0;
}

# ===========================================================
# sub RollbackGrantTables()
#  Rollback the backup of the grant-tables
# ===========================================================
sub RollbackGrantTables {
    my %tables = ( $MySQLaccess::ACCESS_U_BCK => $MySQLaccess::ACCESS_U,
                   $MySQLaccess::ACCESS_H_BCK => $MySQLaccess::ACCESS_H,
                   $MySQLaccess::ACCESS_D_BCK => $MySQLaccess::ACCESS_D,
                 ); 
    my $tbl;
    my $nerror;
    
#    print STDERR "RollbackGrantTables:\n";
    MySQLaccess::Debug::Print(1,"RollbackGrantTables():");
    foreach $tbl (keys(%tables)) {
#       print STDERR "$tbl -> $tables{$tbl}\n";
       MySQLaccess::Debug::Print(2,"Rollback table $tbl -> $tables{$tbl}.");
       return $nerror if ($nerror=CopyTable($tbl,$tables{$tbl},'force'));
    }
    return 0;
}


# ===========================================================
# sub CommitGrantTables()
#  Copy grant-rules from temporary tables to the ACL-tables
# ===========================================================
sub CommitGrantTables {
    my %tables = ( $MySQLaccess::ACCESS_U => $MySQLaccess::ACCESS_U_TMP,
                   $MySQLaccess::ACCESS_H => $MySQLaccess::ACCESS_H_TMP,
                   $MySQLaccess::ACCESS_D => $MySQLaccess::ACCESS_D_TMP,
                 ); 
    my $tbl;
    my $query;
    my $delim;
    my $skip;
    my $create;

    print STDERR "CommitGrantTables()\n";
    MySQLaccess::Debug::Print(1,"CommitGrantTables():");
    
    ## Make backup of original grant-tables
    MySQLaccess::Debug::Print(2,"Making backup of original grant-tables...");
    BackupGrantTables();

    ## Copy data from temporay tables to grant-tables
    foreach $tbl (keys(%tables)) {
       print STDERR "$tbl -> $tables{$tbl}\n";
       MySQLaccess::Debug::Print(2,"Loading data $tables{$tbl} -> $tbl.");
       return $nerror if ($nerror=CopyTable($tables{$tbl},$tbl));
    }
    return 0;
}


# ===========================================================
# sub Show_Fields($table): 
#  return (a reference to) a hash which holds the names
#  of all relevant grant-fields, with their index in the record,
#  and (a reference to) an array which holds the fieldnames.
# ===========================================================
sub Show_Fields {
    my ($table) = @_;
    my %skip = ('host' => [0,1]
               ,'user' => [0,1,2]
               ,'db'   => [0,1,2]
               );
    my %Struct = ();
    my @Struct = ();
    my $query = "show fields from $table;select 'ok';\n";
    my $i=0;
    my $line;

#print STDERR $query;
    MySQLaccess::Debug::Print(1,"Show_Fields($table):");
    MySQLaccess::Debug::Print(2,"SQL: $query");

    print MYSQL_Q "$query";
    my $skip = <MYSQL_A>;  #skip header
    while (($line=<MYSQL_A>) ne "ok\n")
    {
#print STDERR ">",$line;
	chop($line);
	MySQLaccess::Debug::Print(2," $table>: $line");
	my ($field,$type,$null,$key,$default,$extra) = split(' ',$line);
        $field = ucfirst($field); 
	MySQLaccess::Debug::Print(3, " <split: $field - $type - $null - $key - $default - $extra");
	if (! grep(/$i/,@{$skip{$table}}) ){
	   $Struct{$field} = $i; #hash
	   push(@Struct,$field); #array
	   MySQLaccess::Debug::Print(3," ==> added column[$i]: $field ($Struct{$field})");
	} 
        else {
           MySQLaccess::Debug::Print(3," ==> skipped column[$i], value=[$field]");
        }
	$i++;
    }

    $skip=<MYSQL_A>;  # Get ok row (found already ok header)

    MySQLaccess::Debug::Print(2, "Array:");
    foreach $field (@Struct) { MySQLaccess::Debug::Print(2,"+ $field"); }
    MySQLaccess::Debug::Print(2,"Hash:");
    foreach $field (keys(%Struct)) { MySQLaccess::Debug::Print(2,"+ $field -> $Struct{$field}"); }

    return  (\%Struct,\@Struct); 
}

# ===========================================================
# sub Show_Tables(): 
#  return (a reference to) an array which holds all 
#  known tables.
# ===========================================================
sub Show_Tables {
    my @Tables = ();
    my $query = "show tables;select 'ok';\n";
    my $i=0;
    my $line;

    MySQLaccess::Debug::Print(1,"Show_Tables():");
    MySQLaccess::Debug::Print(2,"SQL: $query");

    print MYSQL_Q "$query";
    my $skip = <MYSQL_A>;  #skip header
    while (($line=<MYSQL_A>) ne "ok\n")
    {
	chop($line);
	push(@Tables,$line); #array
	MySQLaccess::Debug::Print(3," ==> added table: $line");
    }

    $skip=<MYSQL_A>;  # Get ok row (found already ok header)

    MySQLaccess::Debug::Print(2, "Array:");
    foreach $tbl (@Tables) { MySQLaccess::Debug::Print(2,"+ $tbl"); }

    return @Tables; 
}

# ======================================
# sub Validate_Password($passwd,$host,$user,$encpw)
#  Validate the given password 
#  for user '$user' 
#  connecting from host '$host'
# ======================================
sub Validate_Password {
    my ($password,$host,$user,$encpw) = @_;
    my $valid=0;

    MySQLaccess::Debug::Print(1,"Validate_Password($password,$host,$user,$encpw)");
    my $sql = "select host,user,password from user having "
             ."host='$host' and user='$user' and password='$encpw' "
             ."and password=PASSWORD('$password');\n";
    $sql .= "select 'ok';\n";
    MySQLaccess::Debug::Print(2,"SQL = $sql");
    print MYSQL_Q "$sql";
    
    # if password is valid, at least 1 row returns before we read 'ok'
    while ( ($line=<MYSQL_A>) ne "ok\n") {
      MySQLaccess::Debug::Print(2," A> $line");
      $valid = defined($line); 
    }
    my $skip = <MYSQL_A>; # read 'ok'

    return $valid;
}


# ==========================================================
# sub Sort_fields: (rewritten by psmith)
#  Build the query for an ordered list of entries
# ==========================================================
sub Sort_fields {
  my ($start, $end, $sofar, $this, @rest) = (@_);
  my @where = ("((FIELD not like '\\%') AND (FIELD <> ''))",
               "((FIELD like '%\\%%') OR (FIELD like '%\\_%'))",
               "(FIELD = '')");
  my $res = '';

  $this or return ("$start $sofar $end");

  $sofar .= ' AND ' if $sofar;

  foreach $w (@where) {
    my $f = $w;
    $f =~ s/FIELD/$this/g;

    $res .= Sort_fields($start, $end, "$sofar$f", @rest);
  }

  return ($res);
}

# ===========================================================
# sub Sort_table: (rewritten by psmith)
#  return all entries in the given table,
#  in an ordered fashion
# ===========================================================
sub Sort_table {
    my ($tbl, @order) = @_;
    my @res=();

    # as long as there's no full where clause (Distrib 3.20)...
    # use having :-(
    # NOTE: this clause WILL NOT work on 3.21, because of the
    # order of 'ORDER BY' and 'HAVING'
    my $start = "SELECT *,UCASE(host) as ucase_host FROM $tbl ";
    $start   .= 'ORDER BY ' . join(',', @order) ." HAVING ";
    my $end   = ";\n";

    # server version 3.21 has a full where clause :-)
    if ($MySQLaccess::Host::SERVER >= '3.21') {
    # print "+++USING FULL WHERE CLAUSE+++\n";
       $start = "SELECT *,UCASE(host) as ucase_host FROM $tbl WHERE ";
       $end = ' ORDER BY ' . join(',', @order) . ";\n";
    }

    MySQLaccess::Debug::Print(1,"Sort_table():");
    MySQLaccess::Debug::Print(2,"Sorting table $tbl by `@order'");

    my $tmp;
    foreach $tmp (@order)
    {
      $tmp="UCASE(host)" if ($tmp eq "ucase_host");
    }
    my $query  = Sort_fields($start, $end, '', @order);
    $query    .= "select 'ok';\n";
    MySQLaccess::Debug::Print(2,"Query: $query");

    print MYSQL_Q "$query\n";

    my $delim = <MYSQL_A>; # read header
    MySQLaccess::Debug::Print(3," A> $delim");
    if ($delim ne "ok\n") {
       if ($delim =~ /^ERROR/) {
       push(@MySQLaccess::Grant::Error,'use_old_server');
       MySQLaccess::Report::Print_Error_Messages() ;
       exit 1;
       }
       while (($line=<MYSQL_A>) ne "ok\n")
       {
           MySQLaccess::Debug::Print(3," A> $line");
           push(@res,$line);
       }
    }
    my $skip = <MYSQL_A>; # skip result 'ok'

    # remove columnheaders from output
    @res = grep(!/^\Q$delim\E$/, @res);
    # remove trailing \n from each returned record
    chomp(@res); 
    # each record has 1 field to much : ucase_host
    @res = grep { /(.*)\t.*$/; $_ = $1; } @res;

    MySQLaccess::Debug::Print(2,"Result of sorted table $tbl:");
    foreach $line (@res) { MySQLaccess::Debug::Print(2," >>$line"); }
    return @res;
}

# ===========================================================
# sub Get_All_db(template): 
#  return all db the grant-tables are working on,
#  which conform to the template
# ===========================================================
sub Get_All_dbs {
   my ($template,$tmp) = @_;
   my @db=();
   my $aref;

   # working with  temporary tables or production tables
   if (defined($tmp) and $tmp) {
      $aref = \@MySQLaccess::Grant::sorted_db_tmp_table ;
   }
   else {
      $aref = \@MySQLaccess::Grant::sorted_db_table;
   }

   MySQLaccess::Debug::Print(1," template=[$template]");

   # get all db for which access-rights can be calculated,
   # which conform to the template.
   # !! these db's don't have to exist yet, so it's not
   #    enough to look which db already exist on the system
   $reg_expr = $template;
   if ($template =~ /[\*\?]/) {
      $reg_expr =~ tr/*?/%_/;
      #$reg_expr = MySQLaccess::Wildcards::Wild2Reg($template);
   }
   $reg_expr = MySQLaccess::Wildcards::SQL2Reg("$reg_expr");

   if ( ! ($template =~ /[\*\?%_]/) ) {
      push(@db,$template);
      return \@db;
   }

   MySQLaccess::Debug::Print(2,"#Reading db-table...");
   foreach $record (@{$aref}) { #MySQLaccess::Grant::sorted_db_table) {
    my @record=split(/\t/,$record);
    my $db = $record[1];
    MySQLaccess::Debug::Print(2,"> $db ");
    if ( (!grep(/$db/i,@db)) and ($db =~/$reg_expr/i) ) {
       push(@db,$db);
       MySQLaccess::Debug::Print(2,"added");
    } 
    else {
       MySQLaccess::Debug::Print(2,"skipped");
    }
   }
   # if no rule is found for a certain db in the db-table,
   # the rights of the user are used, so we should inform
   # the user for
   if (!grep(/^%$/,@db)) { push(@db,"$MySQLaccess::NEW_DB"); }
   return \@db;
}

# ===========================================================
# sub Get_All_users(template): 
#  return all users the grant-tables are working on,
#  which conform to the template
# ===========================================================
sub Get_All_users {
   ($template,$tmp) = @_; # nog verder uitwerken!!!
   my @user=();
   my $aref;

   # working with  temporary tables or production tables
   if (defined($tmp) and $tmp) {
      $aref = \@MySQLaccess::Grant::sorted_user_tmp_table ;
   }
   else {
      $aref = \@MySQLaccess::Grant::sorted_user_table;
   }

   MySQLaccess::Debug::Print(1,"Debug Get_All_users:");
   # get all db for which access-rights can be calculated.
   # !! these db's don't have to exist yet, so it's not
   #    enough to look which db already exist on the system
   $reg_expr = $template;
   if ($template =~ /[\*\?]/) {
      $reg_expr =~ tr/*?/%_/;
      #$reg_expr = MySQLaccess::Wildcards::Wild2Reg($template);
   }
   $reg_expr = MySQLaccess::Wildcards::SQL2Reg("$reg_expr");

   if ( ! ($template =~ /[\*\?%_]/) ) {
      push(@user,$template);
      return \@user;
   }

   MySQLaccess::Debug::Print(2,"#Reading user-table...");
   foreach $record (@{$aref}) { #MySQLaccess::Grant::sorted_user_table) {
    my @record=split(/\t/,$record);
    my $user = $record[1];
    MySQLaccess::Debug::Print(2,"> $user ");
    if ( (!grep(/$user/,@user)) and ($user=~/$reg_expr/)) {
       push(@user,$user);
       MySQLaccess::Debug::Print(2, "added");
    } 
    else {
       MySQLaccess::Debug::Print(2, "skipped");
    }
   }
   # Any user means also:
   # - the 'empty' user, ie without supplying a username
   # - any user still to be defined/created
   #push(@user,'');               #without_suplying_a_username
   push(@user,"$MySQLaccess::NEW_USER");
   #push(@Warnings,'minimum_priv');
   return \@user;
}

# ===========================================================
# sub Get_All_hosts(template): 
#  return all hosts the grant-tables are working on,
#  which conform to the template
# ===========================================================
sub Get_All_hosts {
   my ($template,$tmp) = @_;
   my @host=();
   my $aref;
   my $aref1;

   # working with  temporary tables or production tables
   if (defined($tmp) and $tmp) {
      $aref = \@MySQLaccess::Grant::sorted_host_tmp_table ;
      $aref1= \@MySQLaccess::Grant::sorted_db_tmp_table ;
   }
   else {
      $aref = \@MySQLaccess::Grant::sorted_host_table;
      $aref1= \@MySQLaccess::Grant::sorted_db_table ;
   }

   MySQLaccess::Debug::Print(1, "Debug Get_All_hosts:");
   # get all db for which access-rights can be calculated.
   # !! these db's don't have to exist yet, so it's not
   #    enough to look which db already exist on the system
   $reg_expr = $template;
   if ($template =~ /[\*\?]/) {
      $reg_expr =~ tr/*?/%_/;
      #$reg_expr = MySQLaccess::Wildcards::Wild2Reg($template);
   }
   $reg_expr = MySQLaccess::Wildcards::SQL2Reg("$reg_expr");

   if ( ! ($template =~ /[\*\?%_]/) ) {
      push(@host,$template);
      return \@host;
   }

   MySQLaccess::Debug::Print(1, "#Reading db-table...");
   foreach $record (@{$aref1}) { #MySQLaccess::Grant::sorted_db_table) {
    my @record=split(/\t/,$record);
    my $host = $record[0];
    MySQLaccess::Debug::Print(2, "> $host ");
    if (! grep(/$host/i,@host)) {
       push(@host,$host);
       MySQLaccess::Debug::Print(2, "added");
    } 
    else {
       MySQLaccess::Debug::Print(2, "skipped");
    }
   }
   MySQLaccess::Debug::Print(1, "#Reading host-table...");
   foreach $record (@{$aref}) {
    my @record=split(/\t/,$record);
    my $host = $record[0];
    MySQLaccess::Debug::Print(2, "> $host ");
    if ( (!grep(/$host/,@host)) and ($host=~/$reg_expr/)) {
       push(@host,$host);
       MySQLaccess::Debug::Print(2, "added");
    } 
    else {
       MySQLaccess::Debug::Print(2, "skipped");
    }
   }
   # DOUBT:
   #print "#Reading user-table...\n" if ($DEBUG>1);
   #foreach $record (@MySQLaccess::Grant::sorted_user_table) {
   # my @record=split(/\t/,$record);
   # my $host = $record[0];
   # print "> $host " if ($DEBUG>2);
   # if ( (!grep(/$host/,@host)) and ($host=~/$reg_expr/)) {
   #    push(@host,$host);
   #    print "added\n" if ($DEBUG>2);
   # } 
   # else {
   #    print "skipped\n" if ($DEBUG>2);
   # }
   #}
   # Any host also means:
   # - any host still to be defined/created
   #push(@host,"any_other_host");

   @host = sort(@host);
   return \@host;
}


##########################################################################
package MySQLaccess::Grant;
##############
BEGIN {
    $DEBUG     = 0;
    $DEBUG     = $MySQLaccess::DEBUG unless ($DEBUG);
}



# ===========================================================
# sub Diff_Privileges()
#  Calculate diff between temporary and original grant-tables
# ===========================================================
sub Diff_Privileges {
   my @before=();
   my @after =();
   my @diffs =();

   # -----------------------------
   # Build list of users,dbs,hosts
   # to process...
   my @all_dbs   = @{MySQLaccess::DB::Get_All_dbs('*')};
   my @all_users = @{MySQLaccess::DB::Get_All_users('*')};
   my @all_hosts = @{MySQLaccess::DB::Get_All_hosts('*')};
   #if EDIT-mode
   my @all_dbs_tmp   = @{MySQLaccess::DB::Get_All_dbs('*','tmp')};
   my @all_users_tmp = @{MySQLaccess::DB::Get_All_users('*','tmp')};
   my @all_hosts_tmp = @{MySQLaccess::DB::Get_All_hosts('*','tmp')};


   my %Access;
   # ------------------------------------
   # Build list of priv. for grant-tables
   foreach $host (@all_hosts) {
     foreach $user (@all_users) {
       foreach $db (@all_dbs) {
         MySQLaccess::Grant::Initialize();
         %Access = MySQLaccess::Grant::Get_Access_Rights($host,$user,$db);	
         push(@before,MySQLaccess::Report::Raw_Report($host,$user,$db,\%Access));
       }
     }
   }

   # ----------------------------------
   # Build list of priv. for tmp-tables
   foreach $host (@all_hosts_tmp) {
     foreach $user (@all_users_tmp) {
       foreach $db (@all_dbs_tmp) {
         MySQLaccess::Grant::Initialize('tmp');
         %Access = MySQLaccess::Grant::Get_Access_Rights($host,$user,$db,'tmp');	
         push(@after,MySQLaccess::Report::Raw_Report($host,$user,$db,\%Access));
       }
     }
   }

   # ----------------------------------
   # Write results to temp-file to make
   # DIFF
   @before = sort(@before);
   @after  = sort(@after);

   ($hb, $before) = tempfile("$MySQLaccess::script.XXXXXX") or
    push(@MySQLaccess::Report::Errors,"Can't create temporary file: $!");
   ($ha, $after)  = tempfile("$MySQLaccess::script.XXXXXX") or
    push(@MySQLaccess::Report::Errors,"Can't create temporary file: $!");

   print $hb join("\n",@before);
   print $ha join("\n",@after);
   close $hb;
   close $ha;

   # ----------------------------------
   # compute difference
   my $cmd="$MySQLaccess::DIFF $before $after |";
   open(DIFF,"$cmd");
   @diffs = <DIFF>;
   @diffs = grep(/[<>]/,@diffs);
   chomp(@diffs);
   close(DIFF);

   # ----------------------------------
   # cleanup temp. files
   unlink($before);
   unlink($after);

   return \@diffs;
}

# ===========================================================
# sub Initialize()
#
# ===========================================================
sub Initialize {
    %MySQLaccess::Grant::Access       = %{Default_Access_Rights()};
    @MySQLaccess::Grant::Errors       = ();
    @MySQLaccess::Grant::Warnings     = ();
    @MySQLaccess::Grant::Notes        = ();
    # -----
    # rules
    $MySQLaccess::Grant::Rules{'user'} = 'no_rule_found';
    $MySQLaccess::Grant::Rules{'db'}   = 'no_rule_found';
    $MySQLaccess::Grant::Rules{'host'} = 'no_equiv_host';
    $MySQLaccess::Grant::full_access   = 1;

    $MySQLaccess::Grant::process_host_table = 0;
    return 1;
}

# ===========================================================
# sub ReadTables()
#  
# ===========================================================
sub ReadTables {
    my ($tmp) = @_;
    my ($HOST,$DB,$USER);
    my @tables;

    # build list of available tables
    @tables = MySQLaccess::DB::Show_Tables();

    # reading production grant-tables or temporary tables?
    $tmp = (defined($tmp) and $tmp) ? 1 : 0;
    if ($tmp) { #reading temporary tables
       $HOST=$MySQLaccess::ACCESS_H_TMP;
       $DB  =$MySQLaccess::ACCESS_D_TMP;
       $USER=$MySQLaccess::ACCESS_U_TMP;

       # ----------------------------
       # do tables exist?
       if (!grep(/$HOST/,@tables)) { MySQLaccess::DB::CreateTable($HOST); }
       if (!grep(/$USER/,@tables)) { MySQLaccess::DB::CreateTable($USER); }
       if (!grep(/$DB/,@tables))   { MySQLaccess::DB::CreateTable($DB); }

       MySQLaccess::Debug::Print(1,"Finding fields in tmp-ACL files:");
       # -----------------------------
       # Get record-layout 
       my ($h1,$h2) = MySQLaccess::DB::Show_Fields($HOST);
       my ($d1,$d2) = MySQLaccess::DB::Show_Fields($DB);
       my ($u1,$u2) = MySQLaccess::DB::Show_Fields($USER);
       %MySQLaccess::Grant::H_tmp = %{$h1}; @MySQLaccess::Grant::H_tmp = @{$h2};
       %MySQLaccess::Grant::D_tmp = %{$d1}; @MySQLaccess::Grant::D_tmp = @{$d2};
       %MySQLaccess::Grant::U_tmp = %{$u1}; @MySQLaccess::Grant::U_tmp = @{$u2};

#       @MySQLaccess::Grant::Privileges_tmp=@{Make_Privlist()};
#
       MySQLaccess::Debug::Print(1, "Reading sorted temp-tables:");
       @MySQLaccess::Grant::sorted_db_tmp_table  = MySQLaccess::DB::Sort_table($DB, 'ucase_host', 'user', 'db');
       @MySQLaccess::Grant::sorted_host_tmp_table= MySQLaccess::DB::Sort_table($HOST, 'ucase_host', 'db');
       @MySQLaccess::Grant::sorted_user_tmp_table= defined($MySQLaccess::Param{'password'}) ?
                           MySQLaccess::DB::Sort_table($USER, 'ucase_host', 'user', 'password'):
                           MySQLaccess::DB::Sort_table($USER, 'ucase_host', 'user');
    }
    else {      #reading production grant-tables
       $HOST=$MySQLaccess::ACCESS_H;
       $DB  =$MySQLaccess::ACCESS_D;
       $USER=$MySQLaccess::ACCESS_U;

       MySQLaccess::Debug::Print(1,"Finding fields in ACL files:");
       # -----------------------------
       # Get record-layout 
       my ($h1,$h2) = MySQLaccess::DB::Show_Fields($HOST);
       my ($d1,$d2) = MySQLaccess::DB::Show_Fields($DB);
       my ($u1,$u2) = MySQLaccess::DB::Show_Fields($USER);
       %MySQLaccess::Grant::H = %{$h1}; @MySQLaccess::Grant::H = @{$h2};
       %MySQLaccess::Grant::D = %{$d1}; @MySQLaccess::Grant::D = @{$d2};
       %MySQLaccess::Grant::U = %{$u1}; @MySQLaccess::Grant::U = @{$u2};

       @MySQLaccess::Grant::Privileges=@{Make_Privlist()};

       MySQLaccess::Debug::Print(1, "Reading sorted tables:");
       @MySQLaccess::Grant::sorted_db_table  = MySQLaccess::DB::Sort_table($DB, 'ucase_host', 'user', 'db');
       @MySQLaccess::Grant::sorted_host_table= MySQLaccess::DB::Sort_table($HOST, 'ucase_host', 'db');
       @MySQLaccess::Grant::sorted_user_table= defined($MySQLaccess::Param{'password'}) ?
                           MySQLaccess::DB::Sort_table($USER, 'ucase_host', 'user', 'password'):
                           MySQLaccess::DB::Sort_table($USER, 'ucase_host', 'user');
    }

    return 0;
}

# ===========================================================
# sub Get_Access_Rights(host,user,db)
#  report the access_rights for the tuple ($host,$user,$db).
# ===========================================================
sub Get_Access_Rights {
  local ($host,$user,$db,$tmp) = @_;

   my $aref_user;
   my $aref_host;
   my $aref_db;
   # working with  temporary tables or production tables
   if (defined($tmp) and $tmp) {
      $aref_user = \@MySQLaccess::Grant::sorted_user_tmp_table;
      $aref_host = \@MySQLaccess::Grant::sorted_host_tmp_table;
      $aref_db   = \@MySQLaccess::Grant::sorted_db_tmp_table;   
   }
   else {
      $aref_user = \@MySQLaccess::Grant::sorted_user_table;
      $aref_host = \@MySQLaccess::Grant::sorted_host_table;
      $aref_db   = \@MySQLaccess::Grant::sorted_db_table; 
   }


  my ($refrecord,$refgrant);
  my ($_host_,$_user_,$encpw_);
  my %_Access_;

  MySQLaccess::Debug::Print(1, "for ($host,$user,$db):");  

  # ******************************************************************************
  # Create default access-rights
  #   default access-rights are no access at all!!


  # ******************************************************************************
  # get hostname for IP-address
  # get IP-address for hostname
  local $host_name = MySQLaccess::Host::IP2Name($host);
  local $host_ip   = MySQLaccess::Host::Name2IP($host);

  MySQLaccess::Debug::Print(3,"host=$host, hostname=$host_name, host-ip =$host_ip");
  MySQLaccess::Debug::Print(3,"user=$user");
  MySQLaccess::Debug::Print(3,"db  =$db");

  # ***********************************************************************
  # retrieve information on USER
  #  check all records in mysql::user for matches with the tuple (host,user)
  # ***********************************************************************
  #    4.OR (add) the privileges for the user from the "user" table.
  #     (add all privileges which is "Y" in "user")
  ($refrecord,$refgrant)    = Get_grant_from_user($host,$user,$aref_user);
  ($_host_,$_user_,$encpw_) = @{$refrecord};
  %_access_                 = %{$refgrant};

  foreach $field (keys(%U)) { ##only priv. set in user-table
    $MySQLaccess::Grant::Access{$field} = ($MySQLaccess::Grant::Access{$field} or $_access_{$field});
  }

  if ($_user_ eq $MySQLaccess::NEW_USER) { 
     push(@Warnings,'minimum_priv');
  }
  if ($_user_ ne $user) {
     $user=$_user_;
     push(@Warnings,'anonymous_access');
  }

  # *******************************************************
  #  Validate password if this has been asked to do
  # *******************************************************
  if (defined($password)) {
     $valid = Validate_Password($password,$_host_,$_user_,$_encpw_,$aref_user);
     if (!$valid) { push(@Errors,'invalid_password'); }
     else         { push(@Notes,'valid_password'); }
  }

  # ******************************************************************************
  # retrieve information on DB
  #  check all records in mysql::db for matches with the triple (host,db,user)
  #  first match is used.
  # ******************************************************************************
  #    2.Get grant for user from the "db" table.

  ($refrecord,$refgrant)=Get_grant_from_db($host,$db,$user,$aref_db); #set process_host_table
  ($_host_,$_user_,$encpw_) = @{$refrecord};
  %_access_                 = %{$refgrant};

  foreach $field (keys(%D)) { ##only priv. set in db-table
    $MySQLaccess::Grant::Access{$field} = ($MySQLaccess::Grant::Access{$field} or $_access_{$field});
  }

  # ***********************************************************************
  # retrieve information on HOST
  #  check all records in mysql::host for matches with the tuple (host,db)
  #
  #  ' The host table is mainly to maintain a list of "secure" servers. '
  # ***********************************************************************
  #    3.If hostname is "empty" for the found entry, AND the privileges with
  #      the privileges for the host in "host" table.
  #      (Remove all which is not "Y" in both)

  if ($MySQLaccess::Grant::process_host_table) {
     ($refrecord,$refgrant)=Get_grant_from_host($host,$db,$aref_host);
     ($_host_,$_user_,$encpw_) = @{$refrecord};
     %_access_                 = %{$refgrant};

     foreach $field (keys(%H)) {  ##only priv. set in host-table 
       $MySQLaccess::Grant::Access{$field} = ($MySQLaccess::Grant::Access{$field} and $_access_{$field});
     } 
  }

  MySQLaccess::Debug::Print(1,"done for ($host,$user,$db)");
  return %MySQLaccess::Grant::Access;
}

# ####################################
# FINDING THE RIGHT GRANT-RULE
# ==========================================================
# sub Get_grant_from_user:
# ==========================================================
sub Get_grant_from_user {
  my ($host,$user,$aref) = @_;

  MySQLaccess::Debug::Print(1, "");
  MySQLaccess::Debug::Print(1, "(host=$host,user=$user)");

  my %Access_user = %{Default_Access_Rights()}; 

  my $rule_found=0;
  my @record = ();
  my $record;

  foreach $record (@{$aref}) {
    $MySQLaccess::Grant::full_access=0;
    MySQLaccess::Debug::Print(3, "Record= $record");
    @record=split(/\t/,$record);

    # check host and db
    # with possible wildcards in field
    # replace mysql-wildcards by reg-wildcards
    my $host_tpl = MySQLaccess::Wildcards::SQL2Reg($record[0]);
    my $user_tpl = $record[1]; #user field isn't pattern-matched!!
    my $passwd   = $record[2];

    MySQLaccess::Debug::Print(3, "=>host_tpl : read=$record[0] -> converted=$host_tpl");
    MySQLaccess::Debug::Print(3, "=>user_tpl : read=$record[1] -> $user_tpl");
    MySQLaccess::Debug::Print(3, "=>password : read=$record[2] -> $passwd");


    if ( MySQLaccess::Host::MatchTemplate($host,$host_tpl) and
         MySQLaccess::Wildcards::MatchTemplate($user_tpl,$user)
       ) 
    {
  MySQLaccess::Debug::Print(2, "FOUND!!");
        if ($passwd eq '') { push(@Warnings,'insecure_user');  }
        else               { push(@Notes,'password_required'); }

        foreach $field (keys(%U)) {
          $Access_user{$field} = $MySQLaccess::Report::Answer{$record[$U{$field}]};
        }
        #print "\n" if $DEBUG;
        $MySQLaccess::Grant::Rules{'user'} = $record;
        $rule_found=1;
        last;
    }
  }

  # -------------------------------
  #  setting privileges to user-priv
  MySQLaccess::Debug::Print(2, "Rights after parsing user-table..:");
  if (! $rule_found ) {
     @record=();
     MySQLaccess::Debug::Print(2, "NO record found in the user-table!!");
  }
  else {
     MySQLaccess::Debug::Print(2, "Selected record=@record");
     MySQLaccess::Debug::Print(2, "<=?=> $record");
  }
 
  MySQLaccess::Debug::Print(1, "returning @record");

  return (\@record,\%Access_user); #matching record in user-table
}

# ==========================================================
# sub Get_grant_from_db:
# ==========================================================
sub Get_grant_from_db {
  my ($host,$db,$user,$aref) = @_;

  MySQLaccess::Debug::Print(1, "(host=$host,user=$user,db=$db)");

  my %Access_db    = %{Default_Access_Rights()};
  my $rule_found=0;

  foreach $record (@{$aref}) {
    $full_access=0;
    MySQLaccess::Debug::Print(2, "Read db: $record");
    @record=split(/\t/,$record);

    # check host and db
    # with possible wildcards in field
    # replace mysql-wildcards by reg-wildcards
    my $host_tpl = MySQLaccess::Wildcards::SQL2Reg($record[0]);
    my $db_tpl   = MySQLaccess::Wildcards::SQL2Reg($record[1]);
    my $user_tpl = $record[2]; #user field isn't pattern matched!!
    MySQLaccess::Debug::Print(3, "=>host_tpl : read=$record[0] -> converted=$host_tpl");
    MySQLaccess::Debug::Print(3, "=>db_tpl   : read=$record[1] -> $db_tpl");
    MySQLaccess::Debug::Print(3, "=>user_tpl : read=$record[2] -> $user_tpl");

    if ( ( MySQLaccess::Host::Is_localhost($host_tpl)
           or  MySQLaccess::Wildcards::MatchTemplate($host_tpl,$host_name)
           or  MySQLaccess::Wildcards::MatchTemplate($host_tpl,$host_ip) )
         and ( MySQLaccess::Wildcards::MatchTemplate($db_tpl,$db) )
         and ( MySQLaccess::Wildcards::MatchTemplate($user_tpl,$user) ) ) {
 
      $MySQLaccess::Grant::process_host_table = ($record[0] eq '');

      if ($user_tpl eq '') { push(@Warnings,'public_database'); }

      foreach $field (keys(%D)) {
        $Access_db{$field} = $MySQLaccess::Report::Answer{$record[$D{$field}]};
      }
      $rule_found=1;
      $MySQLaccess::Grant::Rules{'db'} = $record;
      last;
    }
  }

  # -------------------------------
  #  setting privileges to db-priv
  MySQLaccess::Debug::Print(2, "Rights after parsing db-table..:");
  if (! $rule_found ) {
    MySQLaccess::Debug::Print(2, "NO rule found in db-table => no access granted!!");
  }

  return (\@record,\%Access_db);
}

# ==========================================================
# sub Get_grant_from_host:
# ==========================================================
sub Get_grant_from_host {
  my ($host,$db,$aref) = @_;

  MySQLaccess::Debug::Print(1, "Get_grant_from_host()");

  my %Access_host = %{Default_Access_Rights()};

  # the host-table doesn't have to be processed if the host-field
  # in the db-table isn't empty
  if (!$MySQLaccess::Grant::process_host_table) {
    MySQLaccess::Debug::Print(2, ">> Host-table doesn't have to be processed!!");
    $MySQLaccess::Grant::Rules{'host'} = 'no_equiv_host';
    return ([],\%Access_host);
  }

  my $rule_found=0;
  my @record = ();

  foreach $record (@{$aref}) {
    $full_access=0;
    MySQLaccess::Debug::Print(2, "host: $record");
    @record=split(/\t/,$record);

    # check host and db
    # with possible wildcards in field
    # replace mysql-wildcards by reg-wildcards
    my $host_tpl = MySQLaccess::Wildcards::SQL2Reg($record[0]);
    my $db_tpl   = MySQLaccess::Wildcards::SQL2Reg($record[1]);
    MySQLaccess::Debug::Print(3, "=>host_tpl : $record[0] -> $host_tpl");
    MySQLaccess::Debug::Print(3, "=>db_tpl   : $record[1] -> $db_tpl");

    if ( ( MySQLaccess::Host::Is_localhost($host_tpl)
           or MySQLaccess::Wildcards::MatchTemplate($host_tpl,$host_name)
           or MySQLaccess::Wildcards::MatchTemplate($host_tpl,$host_ip) )
         and ( MySQLaccess::Wildcards::MatchTemplate($db_tpl,$db) ) ) {

      $MySQLaccess::Grant::Rules{'host'} = $record;
      $rule_found=1;
      foreach $field (keys(%H)) {
        $Access_host{$field} = $MySQLaccess::Report::Answer{$record[$H{$field}]};
      }
      last;
    }
  }

  # -------------------------------
  #  setting privileges to host-priv
  MySQLaccess::Debug::Print(2, "Rights after parsing host-table..:");
  if (! $rule_found ) {
     @record=();
     MySQLaccess::Debug::Print(2, "NO restrictions found in the host-table!!");
  }

  # --------------------------------
  # debugging access-rights in db 

  return (\@record,\%Access_host); #matching record in host-table
}



# ===========================================================
# sub Default_Access_Rights():
#  return (a reference to) a hash which holds all default
#  priviliges currently defined in the grant-tables.
# ===========================================================
sub Default_Access_Rights {
    my %right = ();

    MySQLaccess::Debug::Print(2, "Debug Default_Access_Rights():");
    # add entry for all fields in the HOST-table
    foreach $field (keys(%MySQLaccess::Grant::H)) {
	$right{$field}='0' unless (defined($right{$field}));
    }
    # add entry for all fields in the DB-table
    foreach $field (keys(%MySQLaccess::Grant::D)) {
	$right{$field}='0' unless (defined($right{$field}));
    }
    # add entry for all fields in the USER-table
    foreach $field (keys(%MySQLaccess::Grant::U)) {
	$right{$field}='0' unless (defined($right{$field}));
    }
    # --------------
    # debugging info
    foreach $field (keys(%right)) { MySQLaccess::Debug::Print(3, sprintf("> %15s : %1s",$field,$right{$field})); }

    return \%right;
}

# ======================================
# sub Make_Privlist
#  Make an ordered list of the privileges
#  that should be reported
# ======================================
sub Make_Privlist {
    # layout:
    #'select_priv',     'create_priv',
    #'insert_priv',     'drop_priv',
    #'update_priv',     'reload_priv',
    #'delete_priv',     'process_priv',
    #'file_priv',       'shutdown_priv');
    my $right;
    my @privlist=();
    foreach $right (@U) {
	if (! grep(/$right/,@privlist)) { push(@privlist,$right); }
    };
    foreach $right (@D) {
	if (! grep(/$right/,@privlist)) { push(@privlist,$right); }
    };
    foreach $right (@H) {
	if (! grep(/$right/,@privlist)) { push(@privlist,$right); }
    };
#       print "Privileges:\n";
#       foreach $field (@privlist) { print " > $field\n"; }
    return \@privlist;
}



########################################################################
package MySQLaccess::Report;
use Exporter ();
@EXPORT = qw(&Print_Header());
BEGIN {
    $FORM = $ENV{'SCRIPT_NAME'};
    $DEBUG     = 0;
    $DEBUG     = $MySQLaccess::DEBUG unless ($DEBUG);

    # translation-table for poss. answers
    %Answer =  ('Y' =>  1 , 'N' =>  0
               , 1  => 'Y',  0  => 'N'
               ,'?' => '?', ''  => '?'
               );
    $headers   = 0;
    $separator = 0;

# ****************************
# Notes and warnings
%MESSAGES = ( 
  'insecure_user' 
   => "Everybody can access your DB as user `\$user' from host `\$host'\n"
     ."WITHOUT supplying a password.\n"
     ."Be very careful about it!!"
 ,'password_required' 
   => "A password is required for user `\$user' :-("
 ,'invalid_password'
   => "The password '\$password' for user `\$user' is invalid :-P"
 , 'valid_password'
   => "You supplied the right password for user `\$user' :-)"
 ,'public_database' 
   => "Any user with the appropriate permissions has access to your DB!\n"
     ."Check your users!"
 ,'full_access' 
   => "All grant-tables are empty, which gives full access to ALL users !!"
 ,'no_rule_found'
   => "No matching rule"
 ,'no_equiv_host' 
   => "Not processed: host-field is not empty in db-table."
 ,'least_priv'
   => "If the final priveliges of the user are more then you gave the user,\n"
     ."check the priveliges in the db-table `\$db'."
 ,'minimum_priv'
   => "The privileges for any new user are AT LEAST\n"
     ."the ones shown in the table above,\n"
     ."since these are the privileges of the db `\$db'.\n"
 ,'not_found_mysql'
   => "The MySQL client program <$MySQLaccess::MYSQL> could not be found.\n"
     ."+ Check your path, or\n"
     ."+ edit the source of this script to point \$MYSQL to the mysql client.\n"
 ,'not_found_mysqldump'
   => "The MySQL dump program <$MySQLaccess::MYSQLDUMP> could not be found.\n"
     ."+ Check your path, or\n"
     ."+ edit the source of this script to point \$MYSQLDUMP to the mysqldump program.\n"
 ,'not_found_diff'
   => "The diff program <$MySQLaccess::DIFF> could not be found.\n"
     ."+ Check your path, or\n"
     ."+ edit the source of this script to point \$DIFF to the diff program.\n"
 ,'Unrecognized_option'
   => "Sorry,\n"
     ."You are using an old version of the mysql-program,\n"
     ."which does not yet implement a neccessary option.\n"
     ."\n"
     ."You need at least Version 6.2 of the mysql-client,\n"
     ."which was build in MySQL v3.0.18, to use this version\n"
     ."of `$MySQLaccess::script'."
 ,'Access_denied'
   => "Sorry,\n"
     ."An error occurred when trying to connect to the database\n"
     ."with the grant-tables:\n"
     ."* Maybe YOU do not have READ-access to this database?\n"
     ."* If you used the -U option, you may have supplied an invalid username?\n"
     ."  for the superuser?\n"
     ."* If you used the -U option, it may be possible you have to supply\n"
     ."  a superuser-password to, with the -P option?\n"
     ."* If you used the -P option, you may have supplied an invalid password?\n"
 ,'Dbaccess_denied'
   => "Sorry,\n"
     ."An error occurred when trying to connect to the database\n"
     ."with the grant-tables. (dbaccess denied)\n"
 ,'Unknown_tmp_table'
   => "Sorry,\n"
     ."An error occurred when trying to work with the temporary tables in the database\n"
     ."with the grant-tables. (One of the temporary tables does not exist)\n"
 ,'Unknown_table'
   => "Sorry,\n"
     ."An error occurred when trying to work with some tables in the database\n"
     ."with the grant-tables. (table does not exist)\n"
 ,'use_old_server'
   => "Sorry,\n"
     ."An error occurred when executing an SQL statement.\n"
     ."You might consider altering the use of the parameter `--old_server' when \n"
     ."calling `$MySQLaccess::script'."
 ,'unknown_error'
   => "Sorry,\n"
     ."An error occurred when trying to connect to the database\n"
     ."with the grant-tables. (unknown error)\n"
 ,'anonymous_access'
   => "Accessing the db as an anonymous user.\n"
     ."Your username has no relevance\n"
 ,'user_required'
   => "You have to supply a userid."
 ,'db_required'
   => "You have to supply the name of a database."
 ,'host_required'
   => "You have to supply the name of a host."
 );


} 
# =====================================
# sub Print_Header:
#  print header info
# =====================================
sub Print_Header {
    if ($MySQLaccess::CMD) { #command-line mode
    print "$MySQLaccess::script Version $MySQLaccess::VERSION\n"
         ."By RUG-AIV, by Yves Carlier (Yves.Carlier\@rug.ac.be)\n"
         ."Changes by Steve Harvey (sgh\@vex.net)\n"
         ."This software comes with ABSOLUTELY NO WARRANTY.\n";
    }
    if ($MySQLaccess::CGI) { #CGI-BIN mode
    print "content-type: text/html\n\n" 
       . "<HTML>\n"
         ."<HEAD>\n"
         ."<TITLE>MySQLaccess</TITLE>\n"
         ."</HEAD>\n"
         ."<BODY>\n"
         ."<H1>$MySQLaccess::script Version $MySQLaccess::VERSION</H1>\n" 
         ."<CENTER>\n<ADDRESS>\n"
         ."By RUG-AIV, by Yves Carlier (<a href=mailto:Yves.Carlier\@rug.ac.be>Yves.Carlier\@rug.ac.be</a>)<BR>\n"
         ."Changes by Steve Harvey (<a href=mailto:sgh\@vex.net>sgh\@vex.net</a>)<BR>\n"
         ."This software comes with ABSOLUTELY NO WARRANTY.<BR>\n"
         ."</ADDRESS>\n</CENTER>\n"
         ."<HR>\n";
    Print_Taskbar();
    print "<HR>\n";
    }
    return 1;
}

# =====================================
# sub Print_Footer:
#  print footer info
# =====================================
sub Print_Footer {
    if ($MySQLaccess::CMD) { #command-line mode
    print "\n"
         ."BUGs can be reported at https://jira.mariadb.org\n";
    }
    if ($MySQLaccess::CGI) { #CGI-BIN mode
    if ($MySQLaccess::Param{'brief'}) {
    print "</table>\n";  #close table in brief-output
    }
    print "<HR>\n"
         ."<ADDRESS>\n"
         ."BUGs can be reported at <a href=\"https://jira.mariadb.org\">MariaDB JIRA</a><BR>\n"
#         ."Don't forget to mention the version $VERSION!<BR>\n"
         ."</ADDRESS>\n"
         ."</BODY>\n"
         ."</HTML>\n";
    }
    return 1;
}

# =====================================
# sub Print_Taskbar:
#  print taskbar on STDOUT
# =====================================
sub Print_Taskbar {
    print "<CENTER>\n"
         ."[<a href=$FORM?relnotes=on>Release&nbsp;Notes</a>] \n"
         ."[<a href=$FORM?version=on>Version</a>] \n"
         ."[<a href=$FORM?plan=on>Future&nbsp;Plans</a>] \n"
         ."[<a href=$FORM?howto=on>Examples</a>] \n"
         ."[<a href=$FORM?help=on>New check</a>] \n"
         ."[<a href=$FORM?edit=on>Change/edit ACL</a>] \n"
         ."</CENTER>\n";
    return 1;
}

# =====================================
# sub Print_Form:
#  print CGI-form
# =====================================
sub Print_Form {
print <<EOForm;
<center>
<!-- Quering -->
<FORM method=POST action=$FORM>

<table border width="100%" >
<tr>
  <th>MySQL server</th>
  <th>User information</th>
  <th>Reports</th>
  </tr>

<tr>
  <td valign=top>
  <table>
  <tr>
    <td halign=right><b>Host</b><br><font size=-2>(Host on which MySQL-server resides.)</font></td>
    <td valign=top><INPUT name=rhost type=text size=15 maxlength=15 value="$MySQLaccess::Param{'rhost'}"></td>
    </tr>
  <tr>
    <td halign=right><b>Superuser</b><br><font size=-2>(User which has <font color="Red">read-access</font> to grant-tables.)</font></td>
    <td valign=top><INPUT name=superuser type=text size=15 maxlength=15 value="$MySQLaccess::Param{'superuser'}"></td>
    </tr>
  <tr>
    <td halign=right><b>Password</b><br><font size=-2>(of Superuser.)</font></td>
    <td valign=top><INPUT name=spassword type=password size=15 maxlength=15 value="$MySQLaccess::Param{'spassword'}"></td>
    </tr>
  </table>
  </td>

  <td valign=top>
  <table>
  <tr>
    <td halign=right><b><font color=Red>User</font></b><br><font size=-2>(Userid used to connect to MySQL-database.)</font></td>
    <td halign=top><INPUT name=user type=text size=15 maxlength=15 value="$MySQLaccess::Param{'user'}"></td>
    </tr>
  <tr>
    <td halign=right><b>Password</b><br><font size=-2>(Password user has to give to get access to MySQL-database.)</font></td>
    <td valign=top><INPUT name=password type=password size=15 maxlength=15 value="$MySQLaccess::Param{'password'}"></td>
    </tr>
  <tr>
    <td halign=right><b><font color=Red>Database</font></b><br><font size=-2>(Name of MySQL-database user tries to connect to.</font><br><font size=-2>Wildcards <font color="Green">(*,?,%,_)</font> are allowed.)</font></td>
    <td valign=top><INPUT name=db type=text size=15 maxlength=15 value="$MySQLaccess::Param{'db'}"></td>
    </tr>
  <tr>
    <td halign=right><b>Host</b><br><font size=-2>(Host from where the user is trying to connect to MySQL-database.</font><br><font size=-2>Wildcards <font color="Green">(*,?,%,_)</font> are allowed.)</font></td>
    <td valign=top><INPUT name=host type=text size=15 maxlength=15 value="$MySQLaccess::Param{'host'}"></td>
    </tr>
  </table>
  </td>

  <td valign=center>
  <table cellspacing=5 cellpadding=2 cols=1 height="100%">
  <tr align=center>
    <td halign=right><INPUT type=submit name=brief value="Brief"><br>
                     <INPUT type=submit name=table value="Tabular"></td>
    </tr>
  <tr align=center>
    <td></td>
    </tr>
  <tr align=center>
    <td halign=right><INPUT type=reset value="Clear"></td>
    </tr>
  </table>
  </td>
  </tr>

</table>
</form>


</BODY>
</HTML>
EOForm
    return 1;
}

# =====================================
# sub Print_Usage:
#  print some information on STDOUT
# =====================================
sub Print_Usage {
    Print_Error_Messages();
    if ($MySQLaccess::CMD) { #command-line mode
        Print_Options();
    }
    if ($MySQLaccess::CGI) { #CGI-BIN mode
        Print_Form();
    }    
    return 1;
}

# ======================================
# sub Print_Version:
# ======================================
sub Print_Version {
    if ($MySQLaccess::CMD) {
       print $MySQLaccess::INFO;
    }
    if ($MySQLaccess::CGI) { 
       print "<PRE>\n"; 
       print $MySQLaccess::INFO;
       print "</PRE>\n"; 
    }
    return 1;
}

# ======================================
# sub Print_Relnotes:
# ======================================
sub Print_Relnotes {
    if ($MySQLaccess::CMD) {
       print $MySQLaccess::RELEASE;
    }
    if ($MySQLaccess::CGI) { 
       print "<PRE>\n";
       print $MySQLaccess::RELEASE;
       print "</PRE>\n"; 
    }
    return 1;
}

# ======================================
# sub Print_Plans:
# ======================================
sub Print_Plans {
    if ($MySQLaccess::CMD) {
       print $MySQLaccess::TODO;
    }
    if ($MySQLaccess::CGI) { 
       print "<PRE>\n";
       print $MySQLaccess::TODO;
       print "</PRE>\n"; 
    }
    return 1;
}

# ======================================
# sub Print_HowTo:
# ======================================
sub Print_HowTo {
    if ($MySQLaccess::CMD) {
       print $MySQLaccess::HOWTO;
    }
    if ($MySQLaccess::CGI) { 
       print "<PRE>\n"; 
       print $MySQLaccess::HOWTO;
       print "</PRE>\n"; 
    }
    return 1;
}

# ======================================
# sub Print_Options:
# ======================================
sub Print_Options {
    if ($MySQLaccess::CGI) { print "<PRE>\n"; }
    print $MySQLaccess::OPTIONS;
    if ($MySQLaccess::CGI) { print "</PRE>\n"; }
    return 1;
}

# ======================================
# sub Print_Error_Access:
# ======================================
sub Print_Error_Access {
    my ($error) = @_;
    print "\n";
    if ($MySQLaccess::CGI) { print "<font color=Red>\n<PRE>\n"; }
    print $MESSAGES{$error};
    if ($MySQLaccess::CGI) { print "</PRE>\n</font>\n"; }
    print "\n";
    return 1;
}

# ======================================
# sub Print_Error_Messages:
# ======================================
sub Print_Error_Messages {
#    my ($error) = @_;
    print "\n";
    if ($MySQLaccess::CGI) { print "<font color=Red>\n<center>\n"; }
    foreach $error (@MySQLaccess::Grant::Error) {
       print $MESSAGES{$error};
       print $MySQLaccess::CGI ? "<br>\n" : "\n";
    }
    if ($MySQLaccess::CGI) { print "</center>\n</font>\n"; }
    print "\n";
    return 1;
}

# ======================================
# sub Print_Message:
# ======================================
sub Print_Message {
    my ($aref) = @_;
    my @messages = @{$aref};
    print "\n";
    if ($MySQLaccess::CGI) { print "<font color=DarkGreen>\n<center>\n"; }
    foreach $msg (@messages) {
       print $msg;
       print $MySQLaccess::CGI ? "<br>\n" : "\n";
    }
    if ($MySQLaccess::CGI) { print "</center>\n</font>\n"; }
    print "\n";
    return 1;
}

# ======================================
# sub Print_Edit:
# ======================================
sub Print_Edit {
    print "\n";
    if (!$MySQLaccess::CGI) { 
       print "Note: Editing the temporary tables is NOT supported in CMD-line mode!\n";
       return 0;
    }
    print "<CENTER>\n"
         ."<form action=$FORM method=GET>\n"
         ."<table width=90% border>\n"
         ."<tr>\n"
         ." <td><input type=checkbox name=copy value=on> Copy grant-rules to temporary tables<br></td>\n"
         ." <td rowspan=5 align=center valign=center><input type=submit value=Go></td>\n"
         ."</tr>\n"
         ."<tr>\n"
         ." <td> Edit temporary tables with external application:<br>"
         ." <a href=\"$MySQLaccess::MYSQLADMIN\">$MySQLaccess::MYSQLADMIN</a></td>\n"
         ."</tr>\n"
         ."<tr>\n"
         ." <td><input type=checkbox name=preview value=on> Preview changes made in temporary tables</td>\n"
         ."</tr>\n"
         ."<tr>\n"
         ." <td><input type=checkbox name=commit value=on> Make changes permanent</td>\n"
         ."</tr>\n"
         ."<tr>\n"
         ." <td><input type=checkbox name=rollback value=on> Restore previous grand-rules</td>\n"
         ."</tr>\n"
         ."<tr>\n"
         ." <td colspan=2 align=center><font size=-2 color=Red>You need write,delete and drop-privileges to perform the above actions</font></td>\n"
         ."</tr>\n"
         ."</table>\n"
         ."</form>\n"
         ."</CENTER>\n";

    return 1;
}


# ======================================
# sub Print_Access_rights:
#  print the access-rights on STDOUT
# ======================================
sub Print_Access_rights {
    my ($host,$user,$db,$refhash) = @_;

    if (defined($MySQLaccess::Param{'brief'})) { 
#       if ($MySQLaccess::CGI) { print "<PRE>\n"; }
       Matrix_Report($host,$user,$db,$refhash);  
#       if ($MySQLaccess::CGI) { print "</PRE>\n"; }
    }
    else { 
       Tabular_Report($host,$user,$db,$refhash); 
       $MySQLaccess::Report::separator = $MySQLaccess::CGI ? "<hr>" : "-"x80;
    }
    return 1;
}

# ======================================
# sub Print_Diff_ACL:
#  print the diff. in the grants before and after
# ======================================
sub Print_Diff_ACL {
    my ($aref) = @_;
    my @diffs = @{$aref};
    my %block = ( '<' => 'Before',
                  '>' => 'After',
                );
    my %color = ( '<' => 'Green',
                  '>' => 'Red',
                ); 
    my $curblock = '';

    # -----------------------------
    # create column-headers
    foreach $field (@MySQLaccess::Grant::Privileges) {
      push(@headers,substr($field,0,4));
    }

    if ($MySQLaccess::CMD) {
    print "\n";
    print "Differences in access-rights BEFORE and AFTER changes in grant-tables\n";
#    print "---------------------------------------------------------------------\n";
      my $line1="";
      my $line2="";
      $line1 .= sprintf("| %-30s|",'Host,User,DB');
      $line2 .= sprintf("+-%-30s+",'-' x 30);
      foreach $header (@headers) {
        $line1 .= sprintf("%-4s|",$header);
        $line2 .= sprintf("%s+",'----');
      }
      print "$line2\n";
      print "$line1\n";
      print "$line2\n";

      $format = "format STDOUT = \n"
              . "^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< " . " @|||" x 10 ."\n"
              . '$host_user_db,@priv' . "\n"
              . ".\n";
#print $format;
      eval $format;
    }
    if ($MySQLaccess::CGI) {
    print "<table border width=100%>\n";
    print "<tr>\n";
    print "<th colspan=11>";
    print "Differences in access-rights <font color=$color{'<'}>BEFORE</font> "
         ."and <font color=$color{'>'}>AFTER</font> changes to grant-tables</font>\n";
    print "</th>";
    print "</tr>\n";
    print "<tr>\n";    
    $line1 .= sprintf("<th>%-20s</th>",'Host, User, DB');
    foreach $header (@headers) {
      $line1 .= sprintf("<th>%-4s</th>",$header);
    }
    print "$line1</tr>\n";
    }

    foreach $line (@diffs) {
        $type = substr($line,0,1);
        $line = substr($line,1);
        ($host,$user,$db,@priv) = split(/,/,$line);
        if ($MySQLaccess::CMD) {
           if ($type ne $curblock) {
              $curblock = $type;
              print $block{$curblock},":\n";
           }
           #print "$line\n";
           write;
        }
        if ($MySQLaccess::CGI) {
           if ($type ne $curblock) {
              $curblock = $type;
              print "<tr><td><b>$block{$curblock}<b></td></tr>\n";
           }
           $line1="<td><font color=$color{$type}>$host, $user, $db</font></td>";
           foreach $field (@priv) {
              $line1 .= sprintf("<td align=center><font color=$color{$type}>%-4s</font></td>",$field);
           }
           print "<tr>$line1</tr>\n";
        }
    }
    print      "\n";
    if ($MySQLaccess::CMD) {
    print "---------------------------------------------------------------------\n";
    }
    if ($MySQLaccess::CGI) {
    print      "</table><br>";
    }


    return 1;
}

# ======================================
# sub Tabular_Report
#  Tabular report,
#  suitable for 1 triple (host,db,user)
# ======================================
sub Tabular_Report {
    my ($host,$user,$db,$a) = @_;
    my $column=2;

    # -----------------------------
    # separator
    if ($MySQLaccess::Report::separator) { print "$MySQLaccess::Report::separator\n"; }
    
    # -----------------------------
    # print table of access-rights
    my $rows = int(@MySQLaccess::Grant::Privileges/2);  #round up
    my @table=();
    $j=0;
    for $i (0 .. $rows-1) {
      $table[$j]=$MySQLaccess::Grant::Privileges[$i];
      $j = $j+2;
    }
    $j=1;
    for $i ($rows .. $#MySQLaccess::Grant::Privileges) {
      $table[$j]=$MySQLaccess::Grant::Privileges[$i];
      $j = $j+2;
    }
    if ($MySQLaccess::CMD) {
    print "\n";
    print "Access-rights\n";
    print "for USER '$user', from HOST '$host', to DB '$db'\n";
    }
    if ($MySQLaccess::CGI) {
    print "<table border width=100%>\n";
    print "<tr>\n";
    }
    if ($MySQLaccess::CGI) {
    print "<th colspan=5>";
    print "<font color=Red>Access-rights</font>\n";
    print "for USER '<font color=Green>$user</font>', from HOST '<font color=Green>$host</font>', to DB '<font color=Green>$db</font>'\n";
    print "</th>";
    print "</tr>\n";
    print "<tr>\n";
    }
    if ($MySQLaccess::CMD) {
    print      "\t+-----------------+---+\t+-----------------+---+";
    }
    foreach $field (@table) {
        if ($MySQLaccess::CMD) {
          if ($column==2) { print "\n\t"; $column=1;}
          else            { print "\t";   $column=2;}
          printf "| %-15s | %s |",$field,$Answer{$a->{$field}}; 
        }
        if ($MySQLaccess::CGI) {
          if ($column==2) { print "</tr>\n<tr>\n"; $column=1;}
          else            { print "<td width=10%></td>";   $column=2;}
          printf " <td width=35%><b>%-15s</b></td><td width=10%>%s</td>\n",$field,$Answer{$a->{$field}}; 
        }
    }
    print      "\n";
    if ($MySQLaccess::CMD) {
    print      "\t+-----------------+---+\t+-----------------+---+\n";
    }
    if ($MySQLaccess::CGI) {
    print      "</tr>\n</table><br>";
    }

    # ---------------
    # print notes:
    foreach $note (@MySQLaccess::Grant::Notes) {
      my $message = $MESSAGES{$note};
      $message =~ s/\$user/$user/g; 
      $message =~ s/\$db/$db/g;
      $message =~ s/\$host/$host/g;
      $message =~ s/\$password/$password/g;
      $PREFIX='NOTE';
      if ($MySQLaccess::CMD) {
      my @lines = split(/\n/,$message);
      foreach $line (@lines) { 
        print "$PREFIX:\t $line\n"; 
        $PREFIX='    ';
      }
      }
      if ($MySQLaccess::CGI) {
      print "<b>$PREFIX:</b> $message<br>\n";
      }
    } 

    # ---------------
    # print warnings:
    foreach $warning (@MySQLaccess::Grant::Warnings) {
      my $message = $MESSAGES{$warning};
      $message =~ s/\$user/$user/g;
      $message =~ s/\$db/$db/g;
      $message =~ s/\$host/$host/g;
      $message =~ s/\$password/$password/g;
      $PREFIX='BEWARE';
      if ($MySQLaccess::CMD) {
      my @lines = split(/\n/,$message);
      foreach $line (@lines) { 
        print "$PREFIX:\t $line\n"; 
        $PREFIX='      ';
      }
      }
      if ($MySQLaccess::CGI) {
      print "<b>$PREFIX:</b> $message<br>\n";
      }
    }

    # ---------------
    # print errors:
    foreach $error (@MySQLaccess::Grant::Errors) {
      my $message = $MESSAGES{$error};
      $message =~ s/\$user/$user/g;
      $message =~ s/\$db/$db/g;
      $message =~ s/\$host/$host/g;
      $message =~ s/\$password/$password/g;
      $PREFIX='ERROR';
      if ($MySQLaccess::CMD) {
      my @lines = split(/\n/,$message);
      foreach $line (@lines) { 
        print "$PREFIX:\t $line\n"; 
        $PREFIX='    ';
      }
      }
      if ($MySQLaccess::CGI) {
      print "<b>$PREFIX:</b> $message<br>\n";
      }
    }

    # ---------------
    # inform if there are no rules ==> full access for everyone.
    if ($MySQLaccess::Grant::full_access) { print "$MESSAGES{'full_access'}\n"; }

    # ---------------
    # print the rules used
    print "\n";
    if ($MySQLaccess::CMD) {
    print "The following rules are used:\n";
    foreach $field (sort(keys(%MySQLaccess::Grant::Rules))) {
      my $rule = (defined($MESSAGES{$MySQLaccess::Grant::Rules{$field}}) ? $MESSAGES{$MySQLaccess::Grant::Rules{$field}} : $MySQLaccess::Grant::Rules{$field});
      $rule =~ s/\t/','/g;
      printf " %-5s : '%s'\n",$field,$rule;
    }
    }
    if ($MySQLaccess::CGI) {
    print "<br>\n";
    print "<table border width=100%>\n";
    print "<tr><th colspan=2>The following rules are used:</th></tr>\n";
    foreach $field (sort(keys(%MySQLaccess::Grant::Rules))) {
      my $rule = (defined($MESSAGES{$MySQLaccess::Grant::Rules{$field}}) ? $MESSAGES{$MySQLaccess::Grant::Rules{$field}} : $MySQLaccess::Grant::Rules{$field});
      $rule =~ s/\t/','/g;
      printf "<tr><th>%-5s</th><td>'%s'</td></tr>\n",$field,$rule;
    }
    print "</table>\n";
    }
 
    return 1;
}

# ======================================
# sub Matrix_Report:
#  single-line output foreach triple,
#  no notes,warnings,...
# ======================================
sub Matrix_Report {
    my ($host,$user,$db,$a) = @_;
    my @headers = ();
    
    if (! $headers) {
       # -----------------------------
       # create column-headers
       foreach $field (@MySQLaccess::Grant::Privileges) {
         push(@headers,substr($field,0,4));
       }
    
       # -----------------------------
       # print column-headers
       print "\n";
       if ($MySQLaccess::CMD) {
         my $line1="";
         my $line2="";
         foreach $header (@headers) {
           $line1 .= sprintf("%-4s ",$header);
           $line2 .= sprintf("%s ",'----');
         }
         $line1 .= sprintf("| %-20s",'Host,User,DB');
         $line2 .= sprintf("+ %-20s",'-' x 20);
         print "$line1\n";
         print "$line2\n";
       }
       if ($MySQLaccess::CGI) {
         print "<table width=100% border>\n";
         my $line1="<tr>";
         foreach $header (@headers) {
           $line1 .= sprintf("<th>%-4s</th>",$header);
         }
         $line1 .= sprintf("<th>%-20s</th>",'Host, User, DB');
         print "$line1</tr>\n";
       }

       # ----------------------------
       # column-headers should only be 
       # printed once.
       $MySQLaccess::Report::headers=1;
    }

    # ------------------------
    # print access-information
    if ($MySQLaccess::CMD) {
      foreach $field (@MySQLaccess::Grant::Privileges) {
  	  printf " %-2s  ",$Answer{$a->{$field}}; 
      }
      printf "| %-20s",join(',',$host,$user,$db);
      print "\n";
    }
    if ($MySQLaccess::CGI) {
      print "<tr>";
      foreach $field (@MySQLaccess::Grant::Privileges) {
  	  printf "<td align=center>%-2s</td>",$Answer{$a->{$field}}; 
      }
      printf "<td><b>%-20s</b></td>",join(', ',$host,$user,$db);
      print "</tr>\n";
    }

    return 1;
}


# ======================================
# sub Raw_Report:
#  single-line output foreach triple,
#  no notes,warnings,...
# ======================================
sub Raw_Report {
    my ($host,$user,$db,$a) = @_;
    my @headers = ();
    my $string = "";
    
    # ------------------------
    # print access-information
    $string = "$host,$user,$db,";
    foreach $field (@MySQLaccess::Grant::Privileges) {
	  $string .= $Answer{$a->{$field}} . ","; 
    }
    return $string;
}


#######################################################################
package MySQLaccess::Wildcards;
BEGIN {
    $DEBUG     = 0;
    $DEBUG     = $MySQLaccess::DEBUG unless ($DEBUG);
}
# ############################################
# SQL, WILDCARDS and REGULAR EXPRESSIONS 
# ============================================
# translage SQL-expressions to Reg-expressions
# ============================================
sub SQL2Reg {
    my ($expr) = @_;
    my $expr_o = $expr;
    $expr  =~ s/\./\\./g;
    $expr  =~ s/\\%/\002/g;
    $expr  =~ s/%/.*/g;
    $expr  =~ s/\002/%/g;
    $expr  =~ s/\\_/\002/g;
    $expr  =~ s/_/.+/g;
    $expr  =~ s/\002/_/g;
    MySQLaccess::Debug::Print(2,"$expr_o --> $expr");
    return $expr;
}

# translage WILDcards to Reg-expressions
# ============================================
sub Wild2Reg {
    my ($expr) = @_;
    my $expr_o = $expr;
    $expr  =~ s/\./\\./g;
    $expr  =~ s/\\\*/\002/g;
    $expr  =~ s/\*/.*/g;
    $expr  =~ s/\002/*/g;
    $expr  =~ s/\\\?/\002/g;
    $expr  =~ s/\?/.+/g;
    $expr  =~ s/\002/?/g;
    MySQLaccess::Debug::Print(2,"$expr_o --> $expr");
    return $expr;
}

# =============================================
# match a given string with a template
# =============================================
sub MatchTemplate {
    my ($tpl,$string) = @_;
    my $match=0;
    if ($string=~ /^$tpl$/ or $tpl eq '') { $match=1; }
    else                                  { $match=0;}
    MySQLaccess::Debug::Print(2,"($tpl,$string) --> $match");
    return $match;
}

#######################################################################
package MySQLaccess::Host;
BEGIN {
    $localhost = undef;
    $DEBUG     = 2;
    $DEBUG     = $MySQLaccess::DEBUG unless ($DEBUG);
}
# ======================================
# sub IP2Name
#  return the Name with the corr. IP-nmbr
#  (no aliases yet!!)
# ======================================
sub IP2Name {
    my ($ip) = @_;
    my $ip_o = $ip;
    if ($ip !~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/o) {
       MySQLaccess::Debug::Print(3,"'$ip' is not an ip-number, returning IP=$ip");
       return $ip;
    }
    MySQLaccess::Debug::Print(4,"IP=$ip split up => $1.$2.$3.$4");
    $ip = pack "C4",$1,$2,$3,$4;
    MySQLaccess::Debug::Print(4,"IP packed -> >>$ip<<\n");
    my ($name,$aliases,$addrtype,$length,@addrs) = gethostbyaddr($ip, AF_INET);
    MySQLaccess::Debug::Print(3,"IP=$ip_o => hostname=$name");
    MySQLaccess::Debug::Print(4,"aliases=$aliases");
    MySQLaccess::Debug::Print(4,"addrtype=$addrtype - length=$length");
    return ($name || $ip);
    #return ($name || undef);
}

# ======================================
# sub Name2IP
#  return the IP-number of the host
# ======================================
sub Name2IP {
    my ($name) = @_;
    if ($name =~ /[%_]/) { 
       MySQLaccess::Debug::Print(3,"'$name' contains SQL-wildcards, returning name=$name");
       return $name; 
    }
    my ($_name,$aliases,$addrtype,$length,@addrs) = gethostbyname($name);
    my ($a,$b,$c,$d) = unpack('C4',$addrs[0]);
    my $ip = "$a.$b.$c.$d";
    MySQLaccess::Debug::Print(3,"hostname=$name => IP=$ip");
    MySQLaccess::Debug::Print(4,"aliases=$aliases");
    MySQLaccess::Debug::Print(4,"addrtype=$addrtype - length=$length");
    #if ($ip ne "") { return "$ip"; }
    #else           { return undef; }
    return ($ip || $name);
}

# ========================================
# sub LocalHost
#  some special action has to be taken for
#  the localhost
# ========================================
sub LocalHost {
    if (!defined($MySQLaccess::Host::localhost)) {
       $MySQLaccess::Host::localhost = Sys::Hostname::hostname();
       MySQLaccess::Debug::Print(3,"Setting package variable \$localhost=$MySQLaccess::Host::localhost");
    }
    my $host = $localhost;
    MySQLaccess::Debug::Print(3,"localhost = $host");
    return $host;
}

# ========================================
# check if the given hostname (or ip)
# corresponds with the localhost
# ========================================
sub Is_localhost {
    my ($host_tpl) = @_;
    my $isit = 0;
    if (($MySQLaccess::host_name eq $localhost) or ($MySQLaccess::host_ip eq $local_ip)) {
	MySQLaccess::Debug::Print(2,"Checking for localhost");
      MySQLaccess::Debug::Print(3,"because ($MySQLaccess::host_name EQ $localhost) AND ($MySQLaccess::host_ip EQ $local_ip)");
      $isit = ( 'localhost' =~ /$host_tpl/ ) ? 1 : 0;
      MySQLaccess::Debug::Print(3," 'localhost' =?= $host_tpl  -> $isit");
      return $isit;
    }
    else {
      MySQLaccess::Debug::Print(4,"Not checking for localhost");
      MySQLaccess::Debug::Print(4,"because ($MySQLaccess::host_name != $localhost) AND ($MySQLaccess::host_ip != $local_ip)");
      return 0;
    }
}


# =========================================
# check if host (IP or name) can be matched
# on the template.
# =========================================
sub MatchTemplate {
    my ($host,$tpl) = @_;
    my $match = 0;
   
    MySQLaccess::Debug::Print(1, "($host) =?= ($tpl)");

    my $host_name = IP2Name($host);
    my $host_ip   = Name2IP($host);

    MySQLaccess::Debug::Print(2, "name=$host_name ; ip=$host_ip");
    $match = (MySQLaccess::Wildcards::MatchTemplate($tpl,$host_name) or
             MySQLaccess::Wildcards::MatchTemplate($tpl,$host_ip));

    MySQLaccess::Debug::Print(2, "($host_name,$host_ip) =?= ($tpl): $ncount");

    return $match;
}

########################################################################
package MySQLaccess::Debug;
BEGIN {
   my $dbg_file = "$MySQLaccess::script_log";
   open(DEBUG,"> $dbg_file") or warn "Could not open outputfile $dbg_file for debugging-info\n";
   select DEBUG;
   $| = 1;
   select STDOUT;
}
# =========================================
# Print debugging information on STDERR
# =========================================
sub Print {
    my ($level,$mesg) = @_;
    my ($pack,$file,$line,$subname,$hasargs,$wantarray) = caller(1);
    my ($PACK)  = split('::',$subname); 
    my $DEBUG = ${$PACK."::DEBUG"} ? ${$PACK."::DEBUG"} : $MySQLaccess::DEBUG ;
    my ($sec,$min,$hour) = localtime();
    print DEBUG "[$hour:$min:$sec $subname] $mesg\n" if ($DEBUG>=$level);
}


Current_dir [ 𝗡𝗢𝗧 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ] Document_root [ 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ]

Current_dir [ 𝗡𝗢𝗧 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ] Document_root [ 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ]


[ Back ]
𝗡𝗔𝗠𝗘
𝗦𝗜𝗭𝗘
𝗟𝗔𝗦𝗧 𝗧𝗢𝗨𝗖𝗛
𝗨𝗦𝗘𝗥
𝗦𝗧𝗔𝗧𝗨𝗦
𝗙𝗨𝗡𝗖𝗧𝗜𝗢𝗡𝗦
..
--
20 Aug 2026 6.54 PM
root / root
0755
2to3
0.093 KB
12 Aug 2026 3.51 PM
root / root
0755
7z
639.227 KB
1 Jul 2026 5.24 PM
root / root
0755
7za
1.53 MB
1 Jul 2026 5.24 PM
root / root
0755
GET
15.82 KB
25 Mar 2022 8.00 AM
root / root
0755
HEAD
15.82 KB
25 Mar 2022 8.00 AM
root / root
0755
Mail
1013.25 KB
17 Dec 2025 11.27 AM
root / root
0755
POST
15.82 KB
25 Mar 2022 8.00 AM
root / root
0755
[
51.633 KB
10 Sep 2026 5.32 PM
root / root
0755
ab
81.461 KB
8 Sep 2026 10.56 PM
root / root
0755
aclocal
35.523 KB
27 Sep 2023 12.16 PM
root / root
0755
aclocal-1.16
35.523 KB
27 Sep 2023 12.16 PM
root / root
0755
acyclic
15.297 KB
3 Apr 2024 11.16 AM
root / root
0755
addr2line
27.742 KB
4 Apr 2026 9.15 PM
root / root
0755
alias
0.032 KB
30 Apr 2024 2.33 PM
root / root
0755
animate
15.094 KB
22 Jul 2026 8.31 AM
root / root
0755
appstream-compose
31.469 KB
13 Jun 2024 8.53 AM
root / root
0755
appstream-util
116.57 KB
13 Jun 2024 8.53 AM
root / root
0755
apropos
48.523 KB
21 Sep 2025 12.57 PM
root / root
0755
apropos.man-db
48.523 KB
21 Sep 2025 12.57 PM
root / root
0755
ar
55.984 KB
4 Apr 2026 9.15 PM
root / root
0755
arch
31.469 KB
10 Sep 2026 5.32 PM
root / root
0755
aria_chk
5.36 MB
19 Aug 2026 10.03 AM
root / root
0755
aria_dump_log
5.17 MB
19 Aug 2026 10.03 AM
root / root
0755
aria_ftdump
5.18 MB
19 Aug 2026 10.03 AM
root / root
0755
aria_pack
5.2 MB
19 Aug 2026 10.03 AM
root / root
0755
aria_read_log
5.32 MB
19 Aug 2026 10.03 AM
root / root
0755
arpaname
15.109 KB
13 Aug 2026 11.36 AM
root / root
0755
arping
27.25 KB
20 Oct 2025 12.44 PM
root / root
0755
as
710.313 KB
4 Apr 2026 9.15 PM
root / root
0755
aserver
39.469 KB
31 Mar 2026 10.28 AM
root / root
0755
aspell
151.117 KB
26 Jan 2022 9.47 PM
root / root
0755
at
55.492 KB
12 Nov 2025 12.38 AM
root / root
0755
atq
55.492 KB
12 Nov 2025 12.38 AM
root / root
0755
atrm
55.492 KB
12 Nov 2025 12.38 AM
root / root
0755
attr
15.133 KB
26 Aug 2026 4.52 PM
root / root
0755
audit2allow
14.711 KB
5 Apr 2026 11.05 AM
root / root
0755
audit2why
14.711 KB
5 Apr 2026 11.05 AM
root / root
0755
aulast
19.203 KB
4 Apr 2026 8.12 PM
root / root
0755
aulastlog
15.125 KB
4 Apr 2026 8.12 PM
root / root
0755
ausyscall
15.117 KB
4 Apr 2026 8.12 PM
root / root
0755
authselect
43.68 KB
12 Mar 2025 2.22 PM
root / root
0755
autoconf
14.425 KB
21 Sep 2025 12.23 PM
root / root
0755
autoheader
8.334 KB
21 Sep 2025 12.23 PM
root / root
0755
autom4te
31.427 KB
21 Sep 2025 12.23 PM
root / root
0755
automake
251.935 KB
27 Sep 2023 12.16 PM
root / root
0755
automake-1.16
251.935 KB
27 Sep 2023 12.16 PM
root / root
0755
autopoint
26.364 KB
27 Sep 2023 6.51 AM
root / root
0755
autoreconf
20.572 KB
21 Sep 2025 12.23 PM
root / root
0755
autoscan
16.723 KB
21 Sep 2025 12.23 PM
root / root
0755
autoupdate
33.078 KB
21 Sep 2025 12.23 PM
root / root
0755
auvirt
35.305 KB
4 Apr 2026 8.12 PM
root / root
0755
avinfo
23.367 KB
26 Aug 2026 12.13 PM
root / root
0755
awk
698.172 KB
30 Mar 2022 10.25 PM
root / root
0755
b2sum
51.594 KB
10 Sep 2026 5.32 PM
root / root
0755
base32
35.492 KB
10 Sep 2026 5.32 PM
root / root
0755
base64
35.492 KB
10 Sep 2026 5.32 PM
root / root
0755
basename
31.484 KB
10 Sep 2026 5.32 PM
root / root
0755
basenc
47.828 KB
10 Sep 2026 5.32 PM
root / root
0755
bash
1.32 MB
30 Apr 2024 2.33 PM
root / root
0755
bashbug
6.913 KB
30 Apr 2024 2.33 PM
root / root
0755
bashbug-64
6.913 KB
30 Apr 2024 2.33 PM
root / root
0755
batch
0.137 KB
12 Nov 2025 12.38 AM
root / root
0755
bc
89.242 KB
26 Jan 2022 8.50 PM
root / root
0755
bcomps
23.367 KB
3 Apr 2024 11.16 AM
root / root
0755
bg
0.029 KB
30 Apr 2024 2.33 PM
root / root
0755
bison
494.758 KB
27 Jan 2022 12.15 AM
root / root
0755
bluemoon
43.758 KB
26 Aug 2026 12.13 PM
root / root
0755
bluetoothctl
634.234 KB
26 Aug 2026 12.13 PM
root / root
0755
bond2team
22.747 KB
20 Jul 2020 10.00 AM
root / root
0755
bootconfig
30.289 KB
11 Sep 2026 1.34 PM
root / root
0755
bootctl
100.539 KB
25 Jun 2026 12.28 AM
root / root
0755
brotli
753.297 KB
5 Feb 2026 11.07 AM
root / root
0755
bsqldb
35.289 KB
11 Aug 2026 8.13 PM
root / root
0755
bsqlodbc
31.188 KB
11 Aug 2026 8.13 PM
root / root
0755
btattach
31.516 KB
26 Aug 2026 12.13 PM
root / root
0755
btmgmt
194.242 KB
26 Aug 2026 12.13 PM
root / root
0755
btmon
1.19 MB
26 Aug 2026 12.13 PM
root / root
0755
bunzip2
39.445 KB
4 Apr 2026 9.34 PM
root / root
0755
busctl
100.156 KB
25 Jun 2026 12.28 AM
root / root
0755
bwrap
72.219 KB
21 Sep 2025 1.44 PM
root / root
0755
bzcat
39.445 KB
4 Apr 2026 9.34 PM
root / root
0755
bzcmp
2.094 KB
4 Apr 2026 9.34 PM
root / root
0755
bzdiff
2.094 KB
4 Apr 2026 9.34 PM
root / root
0755
bzegrep
2.01 KB
4 Apr 2026 9.34 PM
root / root
0755
bzfgrep
2.01 KB
4 Apr 2026 9.34 PM
root / root
0755
bzgrep
2.01 KB
4 Apr 2026 9.34 PM
root / root
0755
bzip2
39.445 KB
4 Apr 2026 9.34 PM
root / root
0755
bzip2recover
15.227 KB
4 Apr 2026 9.34 PM
root / root
0755
bzless
1.233 KB
4 Apr 2026 9.34 PM
root / root
0755
bzmore
1.233 KB
4 Apr 2026 9.34 PM
root / root
0755
c++
1.05 MB
4 Apr 2026 10.27 PM
root / root
0755
c++filt
27.188 KB
4 Apr 2026 9.15 PM
root / root
0755
c89
0.223 KB
4 Apr 2026 10.18 PM
root / root
0755
c99
0.214 KB
4 Apr 2026 10.18 PM
root / root
0755
ca-legacy
1.609 KB
19 Nov 2025 9.34 AM
root / root
0755
cal
51.82 KB
4 Apr 2026 10.15 PM
root / root
0755
canberra-boot
19.07 KB
25 Sep 2023 7.08 PM
root / root
0755
canberra-gtk-play
19.18 KB
25 Sep 2023 7.08 PM
root / root
0755
captoinfo
87.789 KB
21 Sep 2025 9.23 AM
root / root
0755
cat
35.461 KB
10 Sep 2026 5.32 PM
root / root
0755
catchsegv
3.212 KB
3 Aug 2026 10.12 AM
root / root
0755
catman
35.859 KB
21 Sep 2025 12.57 PM
root / root
0755
cc
1.04 MB
4 Apr 2026 10.27 PM
root / root
0755
ccomps
27.469 KB
3 Apr 2024 11.16 AM
root / root
0755
cd
0.029 KB
30 Apr 2024 2.33 PM
root / root
0755
centrino-decode
14.125 KB
11 Sep 2026 1.34 PM
root / root
0755
certutil
172.594 KB
20 Aug 2026 2.11 AM
root / root
0755
chacl
19.148 KB
21 Jul 2026 3.58 PM
root / root
0755
chage
71.977 KB
8 Apr 2026 7.49 PM
root / root
4755
chattr
15.188 KB
21 Sep 2025 3.03 PM
root / root
0755
chcat
13.63 KB
5 Apr 2026 11.05 AM
root / root
0755
chcon
60.047 KB
10 Sep 2026 5.32 PM
root / root
0755
checkmodule
450.883 KB
3 Apr 2024 10.07 AM
root / root
0755
checkpolicy
527.523 KB
3 Apr 2024 10.07 AM
root / root
0755
checksctp
15.219 KB
30 Apr 2024 8.27 PM
root / root
0755
chfn
31.281 KB
4 Apr 2026 10.15 PM
root / root
4711
chgrp
55.977 KB
10 Sep 2026 5.32 PM
root / root
0755
chmem
35.398 KB
4 Apr 2026 10.15 PM
root / root
0755
chmod
55.961 KB
10 Sep 2026 5.32 PM
root / root
0755
choom
23.297 KB
4 Apr 2026 10.15 PM
root / root
0755
chown
59.992 KB
10 Sep 2026 5.32 PM
root / root
0755
chronyc
104.742 KB
9 Apr 2026 12.49 AM
root / root
0755
chrt
27.305 KB
4 Apr 2026 10.15 PM
root / root
0755
chsh
23.227 KB
4 Apr 2026 10.15 PM
root / root
0711
chvt
15.18 KB
20 Aug 2026 6.48 PM
root / root
0755
cifsiostat
23.359 KB
15 Apr 2026 10.16 AM
root / root
0755
circo
15.234 KB
3 Apr 2024 11.16 AM
root / root
0755
cksum
31.383 KB
10 Sep 2026 5.32 PM
root / root
0755
clear
15.148 KB
21 Sep 2025 9.23 AM
root / root
0755
clockdiff
23.195 KB
20 Oct 2025 12.44 PM
root / root
0755
cluster
47.695 KB
3 Apr 2024 11.16 AM
root / root
0755
cmp
40.133 KB
29 Jan 2022 6.15 PM
root / root
0755
cmsutil
47.359 KB
20 Aug 2026 2.11 AM
root / root
0755
col
23.234 KB
4 Apr 2026 10.15 PM
root / root
0755
colcrt
15.188 KB
4 Apr 2026 10.15 PM
root / root
0755
colrm
15.164 KB
4 Apr 2026 10.15 PM
root / root
0755
column
35.336 KB
4 Apr 2026 10.15 PM
root / root
0755
comm
35.555 KB
10 Sep 2026 5.32 PM
root / root
0755
command
0.034 KB
30 Apr 2024 2.33 PM
root / root
0755
compare
15.094 KB
22 Jul 2026 8.31 AM
root / root
0755
compile_et
1.314 KB
21 Sep 2025 3.02 PM
root / root
0755
composite
15.094 KB
22 Jul 2026 8.31 AM
root / root
0755
config_data
6.971 KB
16 Feb 2022 11.46 AM
root / root
0755
conjure
15.102 KB
22 Jul 2026 8.31 AM
root / root
0755
convert
15.102 KB
22 Jul 2026 8.31 AM
root / root
0755
coredumpctl
59.844 KB
25 Jun 2026 12.28 AM
root / root
0755
corelist
14.921 KB
12 Mar 2025 11.43 PM
root / root
0755
cp
141.016 KB
10 Sep 2026 5.32 PM
root / root
0755
cpan
8.37 KB
13 May 2025 9.00 PM
root / root
0755
cpan-mirrors
4.188 KB
13 May 2025 9.00 PM
root / root
0755
cpansign
1.984 KB
29 Mar 2022 9.13 PM
root / root
0755
cpapi1
3.32 MB
18 Aug 2026 4.57 AM
root / root
0755
cpapi2
3.32 MB
18 Aug 2026 4.57 AM
root / root
0755
cpapi3
3.32 MB
18 Aug 2026 4.57 AM
root / root
0755
cpio
145.523 KB
29 Jan 2022 8.51 PM
root / root
0755
cpp
1.05 MB
4 Apr 2026 10.27 PM
root / root
0755
cpupower
80.016 KB
11 Sep 2026 1.33 PM
root / root
0755
crb
2.592 KB
23 Jun 2026 10.05 PM
root / root
0744
crc32
1.019 KB
24 Mar 2022 10.30 PM
root / root
0755
crlutil
91.992 KB
20 Aug 2026 2.11 AM
root / root
0755
cronnext
39.75 KB
9 Apr 2026 5.59 AM
root / root
0755
crontab
55.773 KB
9 Apr 2026 5.59 AM
root / root
4755
csplit
108.664 KB
10 Sep 2026 5.32 PM
root / root
0755
curl
248.484 KB
17 Aug 2026 8.54 AM
root / root
0755
cut
43.609 KB
10 Sep 2026 5.32 PM
root / root
0755
cvtsudoers
352.227 KB
21 May 2026 1.23 AM
root / root
0755
cxpm
27.414 KB
1 Apr 2024 6.32 PM
root / root
0755
cyrusbdb2current
1.58 MB
25 Sep 2025 11.46 AM
root / root
0755
datacopy
31.242 KB
11 Aug 2026 8.13 PM
root / root
0755
date
103.844 KB
10 Sep 2026 5.32 PM
root / root
0755
dbilogstrip
1.348 KB
9 Sep 2026 9.31 PM
root / root
0755
dbiprof
6.061 KB
9 Sep 2026 9.31 PM
root / root
0755
dbus-broker
230.828 KB
31 Aug 2026 4.10 PM
root / root
0755
dbus-broker-launch
128.813 KB
31 Aug 2026 4.10 PM
root / root
0755
dbus-monitor
27.266 KB
26 Sep 2023 9.51 PM
root / root
0755
dbus-send
27.219 KB
26 Sep 2023 9.51 PM
root / root
0755
dbus-update-activation-environment
15.172 KB
26 Sep 2023 9.51 PM
root / root
0755
dbus-uuidgen
15.141 KB
26 Sep 2023 9.51 PM
root / root
0755
dbxtool
23.336 KB
13 Apr 2026 8.36 AM
root / root
0755
dc
48.422 KB
26 Jan 2022 8.50 PM
root / root
0755
dconf
64.711 KB
29 Jan 2022 7.03 PM
root / root
0755
dd
67.945 KB
10 Sep 2026 5.32 PM
root / root
0755
deallocvt
15.188 KB
20 Aug 2026 6.48 PM
root / root
0755
debuginfo-install
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
debuginfod-find
19.273 KB
5 Apr 2026 12.39 AM
root / root
0755
defncopy
31.266 KB
11 Aug 2026 8.13 PM
root / root
0755
delv
45.383 KB
13 Aug 2026 11.36 AM
root / root
0755
df
80.531 KB
10 Sep 2026 5.32 PM
root / root
0755
diff
194.695 KB
29 Jan 2022 6.15 PM
root / root
0755
diff3
52.305 KB
29 Jan 2022 6.15 PM
root / root
0755
diffimg
15.258 KB
3 Apr 2024 11.16 AM
root / root
0755
dig
136.594 KB
13 Aug 2026 11.36 AM
root / root
0755
dijkstra
19.438 KB
3 Apr 2024 11.16 AM
root / root
0755
dir
137.453 KB
10 Sep 2026 5.32 PM
root / root
0755
dircolors
39.617 KB
10 Sep 2026 5.32 PM
root / root
0755
dirmngr
439.969 KB
15 Jan 2026 9.34 PM
root / root
0755
dirmngr-client
56.125 KB
15 Jan 2026 9.34 PM
root / root
0755
dirname
27.297 KB
10 Sep 2026 5.32 PM
root / root
0755
display
15.094 KB
22 Jul 2026 8.31 AM
root / root
0755
distro
0.931 KB
25 Mar 2022 7.52 AM
root / root
0755
dltest
15.102 KB
9 Sep 2026 8.12 AM
root / root
0755
dmesg
71.773 KB
4 Apr 2026 10.15 PM
root / root
0755
dnf
2.045 KB
20 May 2026 7.48 PM
root / root
0755
dnf-3
2.045 KB
20 May 2026 7.48 PM
root / root
0755
dnf4
2.045 KB
20 May 2026 7.48 PM
root / root
0755
dnsdomainname
23.836 KB
14 Feb 2022 11.22 AM
root / root
0755
dnstap-read
23.188 KB
13 Aug 2026 11.36 AM
root / root
0755
domainname
23.836 KB
14 Feb 2022 11.22 AM
root / root
0755
dot
15.234 KB
3 Apr 2024 11.16 AM
root / root
0755
dot2gxl
39.93 KB
3 Apr 2024 11.16 AM
root / root
0755
dotty
2.04 KB
3 Apr 2024 11.16 AM
root / root
0755
doveadm
820.766 KB
31 Aug 2026 4.03 PM
root / root
0755
doveconf
375.242 KB
31 Aug 2026 4.03 PM
root / root
0755
dovecot-sysreport
6.28 KB
31 Aug 2026 4.01 PM
root / root
0755
dpkg
320.523 KB
23 Mar 2026 1.44 PM
root / root
0755
dpkg-deb
153.711 KB
23 Mar 2026 1.44 PM
root / root
0755
dpkg-divert
129.773 KB
23 Mar 2026 1.44 PM
root / root
0755
dpkg-maintscript-helper
20.633 KB
23 Mar 2026 1.44 PM
root / root
0755
dpkg-query
146.164 KB
23 Mar 2026 1.44 PM
root / root
0755
dpkg-realpath
35.633 KB
23 Mar 2026 1.44 PM
root / root
0755
dpkg-split
104.758 KB
23 Mar 2026 1.44 PM
root / root
0755
dpkg-statoverride
56.055 KB
23 Mar 2026 1.44 PM
root / root
0755
dpkg-trigger
48.078 KB
23 Mar 2026 1.44 PM
root / root
0755
dracut
98.552 KB
14 Aug 2026 12.41 AM
root / root
0755
dtrace
17.379 KB
4 Apr 2026 9.42 PM
root / root
0755
du
149.266 KB
10 Sep 2026 5.32 PM
root / root
0755
dumpkeys
163.867 KB
20 Aug 2026 6.48 PM
root / root
0755
dwp
851.594 KB
4 Apr 2026 9.15 PM
root / root
0755
dwz
227.992 KB
21 Sep 2025 2.45 PM
root / root
0755
ea-php82
10.88 MB
4 Aug 2026 11.08 PM
root / root
0755
ea-php82-pear
0.374 KB
4 Aug 2026 11.26 PM
root / root
0755
ea-php82-pecl
0.292 KB
4 Aug 2026 11.26 PM
root / root
0755
ea-php83
10.93 MB
4 Aug 2026 11.15 PM
root / root
0755
ea-php83-pear
0.374 KB
4 Aug 2026 11.27 PM
root / root
0755
ea-php83-pecl
0.292 KB
4 Aug 2026 11.27 PM
root / root
0755
ea-wappspector
0.102 KB
18 May 2026 7.31 PM
root / root
0755
echo
27.289 KB
10 Sep 2026 5.32 PM
root / root
0755
ed
52.508 KB
30 Jan 2022 5.02 AM
root / root
0755
edgepaint
2.46 MB
3 Apr 2024 11.16 AM
root / root
0755
egrep
0.031 KB
31 Jan 2022 8.22 PM
root / root
0755
eject
43.609 KB
4 Apr 2026 10.15 PM
root / root
0755
elfedit
35.836 KB
4 Apr 2026 9.15 PM
root / root
0755
enc2xs
40.687 KB
11 Feb 2022 4.42 PM
root / root
0755
encguess
2.919 KB
11 Feb 2022 4.42 PM
root / root
0755
env
44.031 KB
10 Sep 2026 5.32 PM
root / root
0755
envml
4.106 KB
14 May 2023 5.11 PM
root / root
0755
envsubst
35.391 KB
27 Sep 2023 6.53 AM
root / root
0755
eps2eps
0.628 KB
14 May 2025 4.03 PM
root / root
0755
eqn
189.516 KB
1 Feb 2022 10.44 AM
root / root
0755
event_rpcgen.py
53.648 KB
5 Jul 2020 12.01 PM
root / root
0755
evmctl
69.594 KB
21 Sep 2025 9.11 AM
root / root
0755
ex
1.38 MB
10 Sep 2026 5.27 PM
root / root
0755
exempi
28.18 KB
30 Jan 2022 11.19 PM
root / root
0755
exiv2
199.82 KB
14 Apr 2022 10.43 AM
root / root
0755
expand
39.539 KB
10 Sep 2026 5.32 PM
root / root
0755
expr
108.438 KB
10 Sep 2026 5.32 PM
root / root
0755
factor
71.867 KB
10 Sep 2026 5.32 PM
root / root
0755
fallocate
23.203 KB
4 Apr 2026 10.15 PM
root / root
0755
false
27.281 KB
10 Sep 2026 5.32 PM
root / root
0755
fc
0.029 KB
30 Apr 2024 2.33 PM
root / root
0755
fc-cache
0.136 KB
23 Jan 2023 3.48 PM
root / root
0755
fc-cache-64
23.172 KB
23 Jan 2023 7.48 PM
root / root
0755
fc-cat
19.156 KB
23 Jan 2023 7.48 PM
root / root
0755
fc-conflist
15.133 KB
23 Jan 2023 7.48 PM
root / root
0755
fc-list
15.133 KB
23 Jan 2023 7.48 PM
root / root
0755
fc-match
15.133 KB
23 Jan 2023 7.48 PM
root / root
0755
fc-pattern
15.141 KB
23 Jan 2023 7.48 PM
root / root
0755
fc-query
15.133 KB
23 Jan 2023 7.48 PM
root / root
0755
fc-scan
15.141 KB
23 Jan 2023 7.48 PM
root / root
0755
fc-validate
15.141 KB
23 Jan 2023 7.48 PM
root / root
0755
fdp
15.234 KB
3 Apr 2024 11.16 AM
root / root
0755
fg
0.029 KB
30 Apr 2024 2.33 PM
root / root
0755
fgconsole
15.172 KB
20 Aug 2026 6.48 PM
root / root
0755
fgrep
0.031 KB
31 Jan 2022 8.22 PM
root / root
0755
filan
47.633 KB
12 Feb 2026 6.05 PM
root / root
0755
file
27.625 KB
5 Apr 2026 12.57 AM
root / root
0755
fincore
23.297 KB
4 Apr 2026 10.15 PM
root / root
0755
find
284.953 KB
2 Oct 2024 9.04 PM
root / root
0755
find-repos-of-install
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
findmnt
64.75 KB
4 Apr 2026 10.15 PM
root / root
0755
fio
1.64 MB
26 Sep 2023 10.57 PM
root / root
0755
fio-btrace2fio
31.406 KB
26 Sep 2023 10.57 PM
root / root
0755
fio-dedupe
56.07 KB
26 Sep 2023 10.57 PM
root / root
0755
fio-genzipf
35.453 KB
26 Sep 2023 10.57 PM
root / root
0755
fio-histo-log-pctiles.py
31.701 KB
23 May 2023 6.33 PM
root / root
0755
fio-verify-state
15.203 KB
26 Sep 2023 10.57 PM
root / root
0755
fio2gnuplot
21.727 KB
23 May 2023 6.33 PM
root / root
0755
fio_generate_plots
4.099 KB
23 May 2023 6.33 PM
root / root
0755
fio_jsonplus_clat2csv
12.914 KB
23 May 2023 6.33 PM
root / root
0755
fiologparser.py
7.078 KB
23 May 2023 6.33 PM
root / root
0755
fiologparser_hist.py
22.028 KB
23 May 2023 6.33 PM
root / root
0755
fips-finish-install
1.723 KB
24 Feb 2026 11.47 AM
root / root
0755
fips-mode-setup
8.021 KB
24 Feb 2026 11.47 AM
root / root
0755
firewall-cmd
140.242 KB
4 Aug 2026 8.19 PM
root / root
0755
firewall-offline-cmd
121.047 KB
4 Aug 2026 8.19 PM
root / root
0755
fisql
35.289 KB
11 Aug 2026 8.13 PM
root / root
0755
flatpak
1.77 MB
28 May 2026 9.34 PM
root / root
0755
flatpak-bisect
7.66 KB
17 Apr 2024 5.19 PM
root / root
0755
flatpak-coredumpctl
3.353 KB
17 Apr 2024 5.19 PM
root / root
0755
flex
412.641 KB
30 Jan 2022 8.23 AM
root / root
0755
flex++
412.641 KB
30 Jan 2022 8.23 AM
root / root
0755
flock
23.367 KB
4 Apr 2026 10.15 PM
root / root
0755
fmt
39.578 KB
10 Sep 2026 5.32 PM
root / root
0755
fold
39.508 KB
10 Sep 2026 5.32 PM
root / root
0755
free
23.359 KB
30 Apr 2024 4.43 PM
root / root
0755
freebcp
23.188 KB
11 Aug 2026 8.13 PM
root / root
0755
freetype-config
4.319 KB
31 Mar 2025 3.40 PM
root / root
0755
fribidi
28.586 KB
14 Oct 2022 5.30 PM
root / root
0755
ftp
100.656 KB
30 Jan 2022 11.49 PM
root / root
0755
funzip
31.25 KB
9 Apr 2026 11.24 AM
root / root
0755
fuse2fs
72.68 KB
21 Sep 2025 3.03 PM
root / root
0755
fusermount
35.516 KB
12 Mar 2025 7.30 PM
root / root
4755
fwupdmgr
157.016 KB
13 Apr 2026 8.36 AM
root / root
0755
fwupdtool
177.203 KB
13 Apr 2026 8.36 AM
root / root
0755
g++
1.05 MB
4 Apr 2026 10.27 PM
root / root
0755
g13
110.289 KB
15 Jan 2026 9.34 PM
root / root
0755
galera_new_cluster
1.242 KB
19 Aug 2026 9.01 AM
root / root
0755
galera_recovery
3.291 KB
19 Aug 2026 9.01 AM
root / root
0755
gapplication
23.211 KB
8 Sep 2026 9.56 AM
root / root
0755
garb-systemd
1.317 KB
22 May 2026 3.36 AM
root / root
0755
garbd
1.63 MB
22 May 2026 3.37 AM
root / root
0755
gawk
698.172 KB
30 Mar 2022 10.25 PM
root / root
0755
gc
19.391 KB
3 Apr 2024 11.16 AM
root / root
0755
gcc
1.04 MB
4 Apr 2026 10.27 PM
root / root
0755
gcc-ar
27.672 KB
4 Apr 2026 10.27 PM
root / root
0755
gcc-nm
27.648 KB
4 Apr 2026 10.27 PM
root / root
0755
gcc-ranlib
27.672 KB
4 Apr 2026 10.27 PM
root / root
0755
gcov
477.125 KB
4 Apr 2026 10.27 PM
root / root
0755
gcov-dump
291.766 KB
4 Apr 2026 10.28 PM
root / root
0755
gcov-tool
320.469 KB
4 Apr 2026 10.27 PM
root / root
0755
gdbm_dump
28.219 KB
2 Oct 2024 9.50 PM
root / root
0755
gdbm_load
36.477 KB
2 Oct 2024 9.50 PM
root / root
0755
gdbmtool
149.258 KB
2 Oct 2024 9.50 PM
root / root
0755
gdbus
51.5 KB
8 Sep 2026 9.56 AM
root / root
0755
gdbus-codegen
1.99 KB
8 Sep 2026 9.52 AM
root / root
0755
gdk-pixbuf-query-loaders-64
15.164 KB
21 May 2026 11.01 AM
root / root
0755
gdk-pixbuf-thumbnailer
19.148 KB
21 May 2026 11.01 AM
root / root
0755
gen_grub_cfgstub
0.645 KB
6 Apr 2026 12.55 PM
root / root
0700
gencat
27.445 KB
3 Aug 2026 10.14 AM
root / root
0755
genfio
8.631 KB
23 May 2023 6.33 PM
root / root
0755
genl-ctrl-list
15.477 KB
17 Mar 2025 12.12 PM
root / root
0755
geqn
189.516 KB
1 Feb 2022 10.44 AM
root / root
0755
getconf
35.234 KB
3 Aug 2026 10.14 AM
root / root
0755
getent
35.859 KB
3 Aug 2026 10.14 AM
root / root
0755
getfacl
31.281 KB
21 Jul 2026 3.58 PM
root / root
0755
getfattr
27.266 KB
26 Aug 2026 4.52 PM
root / root
0755
getkeycodes
15.164 KB
20 Aug 2026 6.48 PM
root / root
0755
getopt
23.266 KB
4 Apr 2026 10.15 PM
root / root
0755
getopts
0.034 KB
30 Apr 2024 2.33 PM
root / root
0755
gettext
35.352 KB
27 Sep 2023 6.53 AM
root / root
0755
gettext.sh
5.069 KB
27 Sep 2023 6.50 AM
root / root
0755
gettextize
41.246 KB
27 Sep 2023 6.51 AM
root / root
0755
ghostscript
15.125 KB
14 May 2025 4.03 PM
root / root
0755
gio
91.82 KB
8 Sep 2026 9.56 AM
root / root
0755
gio-querymodules-64
15.133 KB
8 Sep 2026 9.56 AM
root / root
0755
git
22.29 MB
9 Jul 2025 9.55 PM
root / root
0755
git-receive-pack
22.29 MB
9 Jul 2025 9.55 PM
root / root
0755
git-shell
6.26 MB
9 Jul 2025 9.55 PM
root / root
0755
git-upload-archive
22.29 MB
9 Jul 2025 9.55 PM
root / root
0755
git-upload-pack
22.29 MB
9 Jul 2025 9.55 PM
root / root
0755
glib-compile-resources
43.344 KB
8 Sep 2026 9.56 AM
root / root
0755
glib-compile-schemas
51.469 KB
8 Sep 2026 9.56 AM
root / root
0755
glib-genmarshal
40.142 KB
8 Sep 2026 9.52 AM
root / root
0755
glib-gettextize
5.264 KB
8 Sep 2026 9.52 AM
root / root
0755
glib-mkenums
30.075 KB
8 Sep 2026 9.52 AM
root / root
0755
gmake
249.797 KB
2 Apr 2024 12.55 PM
root / root
0755
gml2gv
47.781 KB
3 Apr 2024 11.16 AM
root / root
0755
gneqn
0.895 KB
1 Feb 2022 10.44 AM
root / root
0755
gnroff
3.208 KB
1 Feb 2022 10.44 AM
root / root
0755
gobject-query
15.164 KB
8 Sep 2026 9.56 AM
root / root
0755
gpasswd
76.188 KB
8 Apr 2026 7.49 PM
root / root
4755
gpg
1.07 MB
15 Jan 2026 9.34 PM
root / root
0755
gpg-agent
342.273 KB
15 Jan 2026 9.34 PM
root / root
0755
gpg-card
170.133 KB
15 Jan 2026 9.34 PM
root / root
0755
gpg-connect-agent
84.75 KB
15 Jan 2026 9.34 PM
root / root
0755
gpg-error
36.102 KB
9 Feb 2022 11.24 PM
root / root
0755
gpg-error-config
1.977 KB
9 Feb 2022 11.24 PM
root / root
0755
gpg-wks-client
129.547 KB
15 Jan 2026 9.34 PM
root / root
0755
gpg-wks-server
113.328 KB
15 Jan 2026 9.34 PM
root / root
0755
gpg2
1.07 MB
15 Jan 2026 9.34 PM
root / root
0755
gpgconf
100.984 KB
15 Jan 2026 9.34 PM
root / root
0755
gpgme-json
84.625 KB
30 Mar 2022 7.37 PM
root / root
0755
gpgparsemail
35.328 KB
15 Jan 2026 9.34 PM
root / root
0755
gpgrt-config
13.135 KB
9 Feb 2022 11.24 PM
root / root
0755
gpgsplit
27.5 KB
15 Jan 2026 9.34 PM
root / root
0755
gpgtar
64.867 KB
15 Jan 2026 9.34 PM
root / root
0755
gpgv
295.43 KB
15 Jan 2026 9.34 PM
root / root
0755
gpgv2
295.43 KB
15 Jan 2026 9.34 PM
root / root
0755
gpic
201.719 KB
1 Feb 2022 10.44 AM
root / root
0755
gpio-event-mon
18.125 KB
11 Sep 2026 1.34 PM
root / root
0755
gpio-hammer
14.117 KB
11 Sep 2026 1.34 PM
root / root
0755
gpio-watch
14.117 KB
11 Sep 2026 1.34 PM
root / root
0755
gprof
101.484 KB
4 Apr 2026 9.15 PM
root / root
0755
gr2fonttest
28 KB
31 Jan 2022 1.10 PM
root / root
0755
graphml2gv
23.547 KB
3 Apr 2024 11.16 AM
root / root
0755
grep
154.492 KB
31 Jan 2022 8.22 PM
root / root
0755
gresource
23.281 KB
8 Sep 2026 9.56 AM
root / root
0755
groff
96.766 KB
1 Feb 2022 10.44 AM
root / root
0755
grops
167.258 KB
1 Feb 2022 10.44 AM
root / root
0755
grotty
122.195 KB
1 Feb 2022 10.44 AM
root / root
0755
groups
35.477 KB
10 Sep 2026 5.32 PM
root / root
0755
grub2-editenv
486.734 KB
6 Apr 2026 12.55 PM
root / root
0755
grub2-file
1.11 MB
6 Apr 2026 12.55 PM
root / root
0755
grub2-fstest
1.67 MB
6 Apr 2026 12.55 PM
root / root
0755
grub2-glue-efi
301.344 KB
6 Apr 2026 12.55 PM
root / root
0755
grub2-kbdcomp
1.633 KB
6 Apr 2026 12.55 PM
root / root
0755
grub2-menulst2cfg
284.516 KB
6 Apr 2026 12.55 PM
root / root
0755
grub2-mkfont
334.023 KB
6 Apr 2026 12.55 PM
root / root
0755
grub2-mkimage
465.641 KB
6 Apr 2026 12.55 PM
root / root
0755
grub2-mklayout
311.445 KB
6 Apr 2026 12.55 PM
root / root
0755
grub2-mknetdir
532.594 KB
6 Apr 2026 12.55 PM
root / root
0755
grub2-mkpasswd-pbkdf2
314.008 KB
6 Apr 2026 12.55 PM
root / root
0755
grub2-mkrelpath
301.164 KB
6 Apr 2026 12.55 PM
root / root
0755
grub2-mkrescue
1.34 MB
6 Apr 2026 12.55 PM
root / root
0755
grub2-mkstandalone
636.961 KB
6 Apr 2026 12.55 PM
root / root
0755
grub2-mount
1.02 MB
6 Apr 2026 12.55 PM
root / root
0755
grub2-render-label
1.11 MB
6 Apr 2026 12.55 PM
root / root
0755
grub2-script-check
333.945 KB
6 Apr 2026 12.55 PM
root / root
0755
grub2-syslinux2cfg
1.04 MB
6 Apr 2026 12.55 PM
root / root
0755
gs
15.125 KB
14 May 2025 4.03 PM
root / root
0755
gsbj
0.346 KB
14 May 2025 4.03 PM
root / root
0755
gsdj
0.348 KB
14 May 2025 4.03 PM
root / root
0755
gsdj500
0.348 KB
14 May 2025 4.03 PM
root / root
0755
gsettings
31.383 KB
8 Sep 2026 9.56 AM
root / root
0755
gsf-office-thumbnailer
20.07 KB
9 Feb 2022 11.44 PM
root / root
0755
gslj
0.349 KB
14 May 2025 4.03 PM
root / root
0755
gslp
0.346 KB
14 May 2025 4.03 PM
root / root
0755
gsnd
0.274 KB
14 May 2025 4.03 PM
root / root
0755
gsoelim
32.18 KB
1 Feb 2022 10.44 AM
root / root
0755
gst-inspect-1.0
71.75 KB
13 Mar 2025 9.20 AM
root / root
0755
gst-launch-1.0
39.477 KB
13 Mar 2025 9.20 AM
root / root
0755
gst-stats-1.0
35.641 KB
13 Mar 2025 9.20 AM
root / root
0755
gst-typefind-1.0
19.336 KB
13 Mar 2025 9.20 AM
root / root
0755
gtar
522.289 KB
31 Aug 2026 2.49 PM
root / root
0755
gtbl
130.859 KB
1 Feb 2022 10.44 AM
root / root
0755
gtester
31.289 KB
8 Sep 2026 9.56 AM
root / root
0755
gtester-report
18.643 KB
8 Sep 2026 9.52 AM
root / root
0755
gtk-launch
19.281 KB
26 Aug 2026 1.29 PM
root / root
0755
gtk-query-immodules-2.0-64
19.172 KB
7 Apr 2023 7.55 AM
root / root
0755
gtk-query-immodules-3.0-64
23.273 KB
26 Aug 2026 1.29 PM
root / root
0755
gtk-update-icon-cache
39.828 KB
26 Aug 2026 1.29 PM
root / root
0755
gtroff
732.07 KB
1 Feb 2022 10.44 AM
root / root
0755
gunzip
2.295 KB
31 Aug 2026 4.16 PM
root / root
0755
gv2gml
23.406 KB
3 Apr 2024 11.16 AM
root / root
0755
gv2gxl
39.93 KB
3 Apr 2024 11.16 AM
root / root
0755
gvcolor
49.586 KB
3 Apr 2024 11.16 AM
root / root
0755
gvgen
23.414 KB
3 Apr 2024 11.16 AM
root / root
0755
gvmap
2.75 MB
3 Apr 2024 11.16 AM
root / root
0755
gvmap.sh
2.143 KB
3 Apr 2024 11.16 AM
root / root
0755
gvpack
398.141 KB
3 Apr 2024 11.16 AM
root / root
0755
gvpr
15.203 KB
3 Apr 2024 11.16 AM
root / root
0755
gxl2dot
39.93 KB
3 Apr 2024 11.16 AM
root / root
0755
gxl2gv
39.93 KB
3 Apr 2024 11.16 AM
root / root
0755
gzexe
6.332 KB
31 Aug 2026 4.16 PM
root / root
0755
gzip
88.953 KB
31 Aug 2026 4.16 PM
root / root
0755
h2ph
28.693 KB
28 Jul 2025 3.54 AM
root / root
0755
h2xs
59.503 KB
28 Jul 2025 3.53 AM
root / root
0755
hardlink
35.43 KB
4 Apr 2026 10.15 PM
root / root
0755
hash
0.031 KB
30 Apr 2024 2.33 PM
root / root
0755
hb-ot-shape-closure
43.656 KB
2 Apr 2024 5.02 PM
root / root
0755
hb-shape
47.906 KB
2 Apr 2024 5.02 PM
root / root
0755
hb-subset
39.656 KB
2 Apr 2024 5.02 PM
root / root
0755
hb-view
64.008 KB
2 Apr 2024 5.02 PM
root / root
0755
head
39.609 KB
10 Sep 2026 5.32 PM
root / root
0755
hex2hcd
19.078 KB
26 Aug 2026 12.13 PM
root / root
0755
hexdump
51.406 KB
4 Apr 2026 10.15 PM
root / root
0755
host
108.57 KB
13 Aug 2026 11.36 AM
root / root
0755
hostid
31.469 KB
10 Sep 2026 5.32 PM
root / root
0755
hostname
23.836 KB
14 Feb 2022 11.22 AM
root / root
0755
hostnamectl
31.492 KB
25 Jun 2026 12.28 AM
root / root
0755
htdbm
38.531 KB
8 Sep 2026 10.56 PM
root / root
0755
htdigest
25.711 KB
8 Sep 2026 10.56 PM
root / root
0755
html2text
0.957 KB
26 Mar 2022 2.11 PM
root / root
0755
htpasswd
38.656 KB
8 Sep 2026 10.56 PM
root / root
0755
httxt2dbm
24.727 KB
8 Sep 2026 10.56 PM
root / root
0755
hunspell
102.672 KB
31 Jan 2022 8.22 PM
root / root
0755
i386
27.477 KB
4 Apr 2026 10.15 PM
root / root
0755
iconv
64.086 KB
3 Aug 2026 10.14 AM
root / root
0755
icu-config
0.2 KB
29 Jul 2025 4.13 PM
root / root
0755
icu-config-64
21.669 KB
29 Jul 2025 4.16 PM
root / root
0755
icuinfo
15.492 KB
29 Jul 2025 4.17 PM
root / root
0755
id
39.523 KB
10 Sep 2026 5.32 PM
root / root
0755
identify
15.102 KB
22 Jul 2026 8.31 AM
root / root
0755
idiag-socket-details
15.516 KB
17 Mar 2025 12.12 PM
root / root
0755
idn
36.461 KB
14 Feb 2022 3.33 PM
root / root
0755
ifnames
4.031 KB
21 Sep 2025 12.23 PM
root / root
0755
iio_event_monitor
30.133 KB
11 Sep 2026 1.34 PM
root / root
0755
iio_generic_buffer
34.141 KB
11 Sep 2026 1.34 PM
root / root
0755
ima-add-sigs
3.675 KB
21 Sep 2025 9.11 AM
root / root
0755
ima-setup
3.711 KB
21 Sep 2025 9.11 AM
root / root
0755
import
15.094 KB
22 Jul 2026 8.31 AM
root / root
0755
imunify-agent-proxy
13.14 MB
19 Aug 2026 7.51 AM
root / root
0755
imunify-antivirus
1 KB
5 Aug 2026 11.19 AM
root / root
0755
imunify-fgw-dump
7.8 MB
21 Aug 2026 2.07 PM
root / root
0755
imunify-service
0.996 KB
5 Aug 2026 11.19 AM
root / root
0755
imunify360-agent
1 KB
5 Aug 2026 11.19 AM
root / root
0755
imunify360-command-wrapper
11.924 KB
12 Aug 2026 7.44 AM
root / root
0755
info
312.734 KB
1 May 2022 1.12 PM
root / root
0755
infocmp
63.68 KB
21 Sep 2025 9.23 AM
root / root
0755
infotocap
87.789 KB
21 Sep 2025 9.23 AM
root / root
0755
innochecksum
4.52 MB
19 Aug 2026 10.03 AM
root / root
0755
install
149.078 KB
10 Sep 2026 5.32 PM
root / root
0755
instmodsh
4.096 KB
24 Feb 2022 9.56 AM
root / root
0755
intel-speed-select
116.664 KB
11 Sep 2026 1.34 PM
root / root
0755
ionice
15.211 KB
4 Apr 2026 10.15 PM
root / root
0755
iostat
55.695 KB
15 Apr 2026 10.16 AM
root / root
0755
ipcalc
56.086 KB
25 Mar 2022 10.49 AM
root / root
0755
ipcmk
23.289 KB
4 Apr 2026 10.15 PM
root / root
0755
ipcrm
19.227 KB
4 Apr 2026 10.15 PM
root / root
0755
ipcs
39.336 KB
4 Apr 2026 10.15 PM
root / root
0755
iperf3
15.125 KB
31 Aug 2026 4.12 PM
root / root
0755
ipmitool
915.305 KB
26 Sep 2023 5.44 PM
root / root
0755
iptc
29.305 KB
1 Oct 2024 4.48 PM
root / root
0755
irqtop
35.273 KB
4 Apr 2026 10.15 PM
root / root
0755
isosize
15.148 KB
4 Apr 2026 10.15 PM
root / root
0755
ispell
0.969 KB
8 Oct 2019 12.15 AM
root / root
0755
isql
39.344 KB
9 Sep 2026 8.12 AM
root / root
0755
iusql
31.305 KB
9 Sep 2026 8.12 AM
root / root
0755
jcat-tool
44.211 KB
11 Feb 2022 8.37 PM
root / root
0755
jobs
0.031 KB
30 Apr 2024 2.33 PM
root / root
0755
join
51.688 KB
10 Sep 2026 5.32 PM
root / root
0755
journalctl
88.109 KB
25 Jun 2026 12.28 AM
root / root
0755
jq
31.18 KB
20 May 2026 9.55 AM
root / root
0755
json_pp
4.781 KB
16 Feb 2022 1.39 PM
root / root
0755
json_reformat
19.516 KB
12 Mar 2025 8.01 PM
root / root
0755
json_verify
15.305 KB
12 Mar 2025 8.01 PM
root / root
0755
json_xs
6.849 KB
2 Oct 2025 11.42 AM
root / root
0755
kbd_mode
15.508 KB
20 Aug 2026 6.48 PM
root / root
0755
kbdinfo
19.195 KB
20 Aug 2026 6.48 PM
root / root
0755
kbdrate
19.203 KB
20 Aug 2026 6.48 PM
root / root
0755
kdumpctl
59.84 KB
8 Apr 2026 6.11 PM
root / root
0755
kernel-install
13.701 KB
25 Jun 2026 12.27 AM
root / root
0755
keyctl
64.023 KB
5 Apr 2023 7.15 PM
root / root
0755
kill
31.281 KB
4 Apr 2026 10.15 PM
root / root
0755
killall
32.945 KB
25 Mar 2022 3.53 PM
root / root
0755
kmod
165.57 KB
18 Sep 2025 11.41 AM
root / root
0755
krb5-config
6.588 KB
20 May 2026 11.47 PM
root / root
0755
kvm_stat
62.917 KB
3 Sep 2026 2.18 PM
root / root
0755
l2ping
15.18 KB
26 Aug 2026 12.13 PM
root / root
0755
last
35.289 KB
4 Apr 2026 10.15 PM
root / root
0755
lastb
35.289 KB
4 Apr 2026 10.15 PM
root / root
0755
lastlog
28.633 KB
8 Apr 2026 7.49 PM
root / root
0755
lchfn
23.125 KB
21 Sep 2025 10.53 AM
root / root
0755
lchsh
23.125 KB
21 Sep 2025 10.53 AM
root / root
0755
ld
1.71 MB
4 Apr 2026 9.15 PM
root / root
0755
ld.bfd
1.71 MB
4 Apr 2026 9.15 PM
root / root
0755
ld.gold
2.03 MB
4 Apr 2026 9.15 PM
root / root
0755
ld.so
916.789 KB
3 Aug 2026 10.14 AM
root / root
0755
ldd
5.318 KB
3 Aug 2026 10.12 AM
root / root
0755
lefty
300.445 KB
3 Apr 2024 11.16 AM
root / root
0755
less
197.695 KB
21 Sep 2025 12.35 PM
root / root
0755
lessecho
15.172 KB
21 Sep 2025 12.35 PM
root / root
0755
lesskey
24.609 KB
21 Sep 2025 12.35 PM
root / root
0755
lesspipe.sh
3.496 KB
21 Sep 2025 11.44 AM
root / root
0755
lex
412.641 KB
30 Jan 2022 8.23 AM
root / root
0755
lexgrog
88.188 KB
21 Sep 2025 12.57 PM
root / root
0755
libnetcfg
15.405 KB
28 Jul 2025 3.54 AM
root / root
0755
libpng-config
2.383 KB
25 Jun 2026 12.19 AM
root / root
0755
libpng16-config
2.383 KB
25 Jun 2026 12.19 AM
root / root
0755
libtool
359.182 KB
1 Oct 2024 5.49 PM
root / root
0755
libtoolize
126.172 KB
1 Oct 2024 5.49 PM
root / root
0755
libwmf-fontmap
13.031 KB
15 Oct 2022 12.42 PM
root / root
0755
link
31.477 KB
10 Sep 2026 5.32 PM
root / root
0755
linux-boot-prober
5.856 KB
4 Feb 2025 9.32 AM
root / root
0755
linux32
27.477 KB
4 Apr 2026 10.15 PM
root / root
0755
linux64
27.477 KB
4 Apr 2026 10.15 PM
root / root
0755
ln
55.945 KB
10 Sep 2026 5.32 PM
root / root
0755
lneato
1.515 KB
3 Apr 2024 11.16 AM
root / root
0755
loadkeys
200.367 KB
20 Aug 2026 6.48 PM
root / root
0755
loadunimap
31.43 KB
20 Aug 2026 6.48 PM
root / root
0755
locale
59.078 KB
3 Aug 2026 10.14 AM
root / root
0755
localectl
31.445 KB
25 Jun 2026 12.28 AM
root / root
0755
localedef
314.047 KB
3 Aug 2026 10.14 AM
root / root
0755
logger
35.977 KB
4 Apr 2026 10.15 PM
root / root
0755
login
43.461 KB
4 Apr 2026 10.15 PM
root / root
0755
loginctl
67.961 KB
25 Jun 2026 12.28 AM
root / root
0755
logname
31.469 KB
10 Sep 2026 5.32 PM
root / root
0755
logresolve
25.063 KB
8 Sep 2026 10.56 PM
root / root
0755
look
19.172 KB
4 Apr 2026 10.15 PM
root / root
0755
ls
137.445 KB
10 Sep 2026 5.32 PM
root / root
0755
lsattr
15.18 KB
21 Sep 2025 3.03 PM
root / root
0755
lsblk
124.367 KB
4 Apr 2026 10.15 PM
root / root
0755
lscpu
108.234 KB
4 Apr 2026 10.15 PM
root / root
0755
lsgpio
14.297 KB
11 Sep 2026 1.34 PM
root / root
0755
lsiio
22.141 KB
11 Sep 2026 1.34 PM
root / root
0755
lsinitrd
11.853 KB
14 Aug 2026 12.41 AM
root / root
0755
lsipc
51.5 KB
4 Apr 2026 10.15 PM
root / root
0755
lsirq
23.234 KB
4 Apr 2026 10.15 PM
root / root
0755
lslocks
31.594 KB
4 Apr 2026 10.15 PM
root / root
0755
lslogins
51.5 KB
4 Apr 2026 10.15 PM
root / root
0755
lsmem
35.523 KB
4 Apr 2026 10.15 PM
root / root
0755
lsns
39.328 KB
4 Apr 2026 10.15 PM
root / root
0755
lsof
175.063 KB
10 Feb 2022 6.42 AM
root / root
0755
lsphp
0.915 KB
18 May 2026 4.41 PM
root / root
0755
lsscsi
89.438 KB
11 Feb 2022 8.15 AM
root / root
0755
lto-dump
26.59 MB
4 Apr 2026 10.27 PM
root / root
0755
lua
23.227 KB
26 Sep 2023 6.28 PM
root / root
0755
luac
157.688 KB
26 Sep 2023 6.28 PM
root / root
0755
lwp-download
10.051 KB
25 Mar 2022 8.00 AM
root / root
0755
lwp-dump
2.647 KB
25 Mar 2022 8.00 AM
root / root
0755
lwp-mirror
2.356 KB
25 Mar 2022 8.00 AM
root / root
0755
lwp-request
15.82 KB
25 Mar 2022 8.00 AM
root / root
0755
m4
240.398 KB
31 Mar 2022 7.28 AM
root / root
0755
mail
1013.25 KB
17 Dec 2025 11.27 AM
root / root
0755
mailx
1013.25 KB
17 Dec 2025 11.27 AM
root / root
0755
mailx.s-nail
1013.25 KB
17 Dec 2025 11.27 AM
root / root
0755
make
249.797 KB
2 Apr 2024 12.55 PM
root / root
0755
make-dummy-cert
0.6 KB
27 Jul 2026 6.12 PM
root / root
0755
man
114.914 KB
21 Sep 2025 12.57 PM
root / root
0755
man-recode
28.008 KB
21 Sep 2025 12.57 PM
root / root
0755
man.man-db
114.914 KB
21 Sep 2025 12.57 PM
root / root
0755
mandb
133.008 KB
21 Sep 2025 12.57 PM
root / root
0755
manpath
31.82 KB
21 Sep 2025 12.57 PM
root / root
0755
mapscrn
31.391 KB
20 Aug 2026 6.48 PM
root / root
0755
mariadb
5 MB
19 Aug 2026 9.49 AM
root / root
0755
mariadb-access
109.337 KB
19 Aug 2026 9.01 AM
root / root
0755
mariadb-admin
4.78 MB
19 Aug 2026 9.49 AM
root / root
0755
mariadb-binlog
5.06 MB
19 Aug 2026 9.49 AM
root / root
0755
mariadb-check
4.78 MB
19 Aug 2026 9.49 AM
root / root
0755
mariadb-config
15.641 KB
19 Aug 2026 9.55 AM
root / root
0755
mariadb-conv
4.51 MB
19 Aug 2026 9.49 AM
root / root
0755
mariadb-convert-table-format
4.121 KB
19 Aug 2026 9.01 AM
root / root
0755
mariadb-dump
4.87 MB
19 Aug 2026 9.49 AM
root / root
0755
mariadb-dumpslow
8.049 KB
19 Aug 2026 9.01 AM
root / root
0755
mariadb-embedded
23.28 MB
19 Aug 2026 9.49 AM
root / root
0755
mariadb-find-rows
3.213 KB
19 Aug 2026 9.01 AM
root / root
0755
mariadb-fix-extensions
1.221 KB
19 Aug 2026 9.01 AM
root / root
0755
mariadb-hotcopy
34.53 KB
19 Aug 2026 9.01 AM
root / root
0755
mariadb-import
4.77 MB
19 Aug 2026 9.49 AM
root / root
0755
mariadb-install-db
22.164 KB
19 Aug 2026 9.01 AM
root / root
0755
mariadb-plugin
4.49 MB
19 Aug 2026 9.49 AM
root / root
0755
mariadb-secure-installation
13.479 KB
19 Aug 2026 9.01 AM
root / root
0755
mariadb-service-convert
2.451 KB
19 Aug 2026 6.22 AM
root / root
0755
mariadb-setpermission
17.556 KB
19 Aug 2026 9.01 AM
root / root
0755
mariadb-show
4.77 MB
19 Aug 2026 9.49 AM
root / root
0755
mariadb-slap
4.79 MB
19 Aug 2026 9.49 AM
root / root
0755
mariadb-tzinfo-to-sql
4.49 MB
19 Aug 2026 9.49 AM
root / root
0755
mariadb-upgrade
4.93 MB
19 Aug 2026 10.03 AM
root / root
0755
mariadb-waitpid
4.48 MB
19 Aug 2026 9.49 AM
root / root
0755
mariadb_config
15.641 KB
19 Aug 2026 9.55 AM
root / root
0755
mariadbd-multi
26.782 KB
19 Aug 2026 9.01 AM
root / root
0755
mariadbd-safe
30.486 KB
19 Aug 2026 9.01 AM
root / root
0755
mariadbd-safe-helper
4.45 MB
19 Aug 2026 10.03 AM
root / root
0755
mcookie
27.305 KB
4 Apr 2026 10.15 PM
root / root
0755
md5sum
39.445 KB
10 Sep 2026 5.32 PM
root / root
0755
mdb_copy
15.703 KB
10 Feb 2022 7.49 AM
root / root
0755
mdb_dump
15.836 KB
10 Feb 2022 7.49 AM
root / root
0755
mdb_load
23.836 KB
10 Feb 2022 7.49 AM
root / root
0755
mdb_stat
15.805 KB
10 Feb 2022 7.49 AM
root / root
0755
mdig
51.305 KB
13 Aug 2026 11.36 AM
root / root
0755
memtester
27.867 KB
24 Jan 2025 9.25 AM
root / root
0755
mesg
15.141 KB
4 Apr 2026 10.15 PM
root / root
0755
mkdir
68.125 KB
10 Sep 2026 5.32 PM
root / root
0755
mkfifo
39.641 KB
10 Sep 2026 5.32 PM
root / root
0755
mkfontdir
0.067 KB
11 Feb 2022 10.35 PM
root / root
0755
mkfontscale
44.773 KB
11 Feb 2022 10.35 PM
root / root
0755
mknod
43.68 KB
10 Sep 2026 5.32 PM
root / root
0755
mktemp
39.617 KB
10 Sep 2026 5.32 PM
root / root
0755
mm2gv
39.445 KB
3 Apr 2024 11.16 AM
root / root
0755
mmdblookup
27.719 KB
1 Oct 2024 4.54 PM
root / root
0755
modulecmd
654.006 KB
21 Sep 2025 9.06 AM
root / root
0755
modulemd-validator
28.391 KB
9 Feb 2022 11.30 PM
root / root
0755
modutil
91.906 KB
20 Aug 2026 2.11 AM
root / root
0755
mogrify
15.102 KB
22 Jul 2026 8.31 AM
root / root
0755
mokutil
61.219 KB
9 Apr 2026 10.34 PM
root / root
0755
montage
15.102 KB
22 Jul 2026 8.31 AM
root / root
0755
more
43.422 KB
4 Apr 2026 10.15 PM
root / root
0755
mount
47.344 KB
4 Apr 2026 10.15 PM
root / root
4755
mountpoint
19.18 KB
4 Apr 2026 10.15 PM
root / root
0755
mpris-proxy
101.156 KB
26 Aug 2026 12.13 PM
root / root
0755
mpstat
51.594 KB
15 Apr 2026 10.16 AM
root / root
0755
msgattrib
27.172 KB
27 Sep 2023 6.53 AM
root / root
0755
msgcat
27.141 KB
27 Sep 2023 6.53 AM
root / root
0755
msgcmp
27.266 KB
27 Sep 2023 6.53 AM
root / root
0755
msgcomm
27.156 KB
27 Sep 2023 6.53 AM
root / root
0755
msgconv
23.148 KB
27 Sep 2023 6.53 AM
root / root
0755
msgen
23.148 KB
27 Sep 2023 6.53 AM
root / root
0755
msgexec
23.148 KB
27 Sep 2023 6.53 AM
root / root
0755
msgfilter
35.313 KB
27 Sep 2023 6.53 AM
root / root
0755
msgfmt
84.094 KB
27 Sep 2023 6.53 AM
root / root
0755
msgfmt.py
7.412 KB
31 Oct 2025 6.40 PM
root / root
0755
msgfmt3.9.py
7.412 KB
31 Oct 2025 6.40 PM
root / root
0755
msgfmt3.py
7.412 KB
31 Oct 2025 6.40 PM
root / root
0755
msggrep
116.406 KB
27 Sep 2023 6.53 AM
root / root
0755
msginit
67.438 KB
27 Sep 2023 6.53 AM
root / root
0755
msgmerge
75.484 KB
27 Sep 2023 6.53 AM
root / root
0755
msgunfmt
35.328 KB
27 Sep 2023 6.53 AM
root / root
0755
msguniq
23.148 KB
27 Sep 2023 6.53 AM
root / root
0755
msql2mysql
1.416 KB
19 Aug 2026 9.01 AM
root / root
0755
mv
140.945 KB
10 Sep 2026 5.32 PM
root / root
0755
my_print_defaults
4.48 MB
19 Aug 2026 9.49 AM
root / root
0755
myisam_ftdump
4.77 MB
19 Aug 2026 10.03 AM
root / root
0755
myisamchk
4.88 MB
19 Aug 2026 10.03 AM
root / root
0755
myisamlog
4.75 MB
19 Aug 2026 10.03 AM
root / root
0755
myisampack
4.79 MB
19 Aug 2026 10.03 AM
root / root
0755
mysql
5 MB
19 Aug 2026 9.49 AM
root / root
0755
mysql_config
4.5 KB
19 Aug 2026 9.01 AM
root / root
0755
mysql_embedded
23.28 MB
19 Aug 2026 9.49 AM
root / root
0755
mysql_find_rows
3.213 KB
19 Aug 2026 9.01 AM
root / root
0755
mysql_fix_extensions
1.221 KB
19 Aug 2026 9.01 AM
root / root
0755
mysql_install_db
22.164 KB
19 Aug 2026 9.01 AM
root / root
0755
mysql_plugin
4.49 MB
19 Aug 2026 9.49 AM
root / root
0755
mysql_tzinfo_to_sql
4.49 MB
19 Aug 2026 9.49 AM
root / root
0755
mysql_upgrade
4.93 MB
19 Aug 2026 10.03 AM
root / root
0755
mysql_waitpid
4.48 MB
19 Aug 2026 9.49 AM
root / root
0755
mysqlaccess
109.337 KB
19 Aug 2026 9.01 AM
root / root
0755
mysqladmin
4.78 MB
19 Aug 2026 9.49 AM
root / root
0755
mysqlbinlog
5.06 MB
19 Aug 2026 9.49 AM
root / root
0755
mysqlcheck
4.78 MB
19 Aug 2026 9.49 AM
root / root
0755
mysqld_multi
26.782 KB
19 Aug 2026 9.01 AM
root / root
0755
mysqld_safe
30.486 KB
19 Aug 2026 9.01 AM
root / root
0755
mysqld_safe_helper
4.45 MB
19 Aug 2026 10.03 AM
root / root
0755
mysqldump
4.87 MB
19 Aug 2026 9.49 AM
root / root
0755
mysqlimport
4.77 MB
19 Aug 2026 9.49 AM
root / root
0755
mysqlshow
4.77 MB
19 Aug 2026 9.49 AM
root / root
0755
mysqlslap
4.79 MB
19 Aug 2026 9.49 AM
root / root
0755
mytop
72.028 KB
19 Aug 2026 9.01 AM
root / root
0755
nail
1013.25 KB
17 Dec 2025 11.27 AM
root / root
0755
named-rrchecker
23.141 KB
13 Aug 2026 11.36 AM
root / root
0755
namei
23.227 KB
4 Apr 2026 10.15 PM
root / root
0755
nano
346.195 KB
13 Mar 2025 3.12 AM
root / root
0755
nbdcopy
56.883 KB
21 Sep 2025 2.33 PM
root / root
0755
nbddump
23.219 KB
21 Sep 2025 2.33 PM
root / root
0755
nbdinfo
39.367 KB
21 Sep 2025 2.33 PM
root / root
0755
nc
51.859 KB
20 May 2026 9.15 AM
root / root
0755
ncurses6-config
8.126 KB
21 Sep 2025 9.23 AM
root / root
0755
ncursesw6-config
8.129 KB
21 Sep 2025 9.23 AM
root / root
0755
ndptool
27.422 KB
1 Oct 2024 5.03 PM
root / root
0755
neato
15.234 KB
3 Apr 2024 11.16 AM
root / root
0755
needs-restarting
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
neqn
0.895 KB
1 Feb 2022 10.44 AM
root / root
0755
netcat
51.859 KB
20 May 2026 9.15 AM
root / root
0755
netstat
156.852 KB
2 Oct 2024 7.02 PM
root / root
0755
newgidmap
41.953 KB
8 Apr 2026 7.49 PM
root / root
0755
newgrp
40.766 KB
8 Apr 2026 7.49 PM
root / root
4755
newuidmap
37.93 KB
8 Apr 2026 7.49 PM
root / root
0755
nf-ct-add
15.891 KB
17 Mar 2025 12.12 PM
root / root
0755
nf-ct-events
15.328 KB
17 Mar 2025 12.12 PM
root / root
0755
nf-ct-list
15.93 KB
17 Mar 2025 12.12 PM
root / root
0755
nf-exp-add
20.305 KB
17 Mar 2025 12.12 PM
root / root
0755
nf-exp-delete
16.086 KB
17 Mar 2025 12.12 PM
root / root
0755
nf-exp-list
15.93 KB
17 Mar 2025 12.12 PM
root / root
0755
nf-log
15.313 KB
17 Mar 2025 12.12 PM
root / root
0755
nf-monitor
15.328 KB
17 Mar 2025 12.12 PM
root / root
0755
nf-queue
15.32 KB
17 Mar 2025 12.12 PM
root / root
0755
ngettext
35.344 KB
27 Sep 2023 6.53 AM
root / root
0755
nice
35.484 KB
10 Sep 2026 5.32 PM
root / root
0755
nisdomainname
23.836 KB
14 Feb 2022 11.22 AM
root / root
0755
nl
100.508 KB
10 Sep 2026 5.32 PM
root / root
0755
nl-addr-add
15.766 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-addr-delete
15.82 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-addr-list
19.836 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-class-add
15.75 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-class-delete
15.664 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-class-list
15.633 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-classid-lookup
15.5 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-cls-add
19.813 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-cls-delete
15.734 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-cls-list
15.688 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-fib-lookup
15.523 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-link-enslave
15.289 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-link-ifindex2name
15.289 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-link-list
15.672 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-link-name2ifindex
15.289 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-link-release
15.289 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-link-set
15.742 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-link-stats
15.531 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-list-caches
15.305 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-list-sockets
15.289 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-monitor
15.484 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-neigh-add
15.664 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-neigh-delete
15.695 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-neigh-list
15.609 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-neightbl-list
15.445 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-nh-list
15.477 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-pktloc-lookup
15.531 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-qdisc-add
15.695 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-qdisc-delete
15.664 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-qdisc-list
19.688 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-route-add
19.836 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-route-delete
19.914 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-route-get
15.313 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-route-list
15.859 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-rule-list
15.477 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-tctree-list
15.602 KB
17 Mar 2025 12.12 PM
root / root
0755
nl-util-addr
15.289 KB
17 Mar 2025 12.12 PM
root / root
0755
nm
44.719 KB
4 Apr 2026 9.15 PM
root / root
0755
nm-online
23.383 KB
24 Aug 2026 11.56 AM
root / root
0755
nmcli
1.03 MB
24 Aug 2026 11.56 AM
root / root
0755
nmtui
842.438 KB
24 Aug 2026 11.56 AM
root / root
0755
nmtui-connect
842.438 KB
24 Aug 2026 11.56 AM
root / root
0755
nmtui-edit
842.438 KB
24 Aug 2026 11.56 AM
root / root
0755
nmtui-hostname
842.438 KB
24 Aug 2026 11.56 AM
root / root
0755
nohup
35.398 KB
10 Sep 2026 5.32 PM
root / root
0755
nop
15.328 KB
3 Apr 2024 11.16 AM
root / root
0755
notify-send
19.75 KB
10 Feb 2022 2.06 AM
root / root
0755
nproc
35.5 KB
10 Sep 2026 5.32 PM
root / root
0755
nroff
3.208 KB
1 Feb 2022 10.44 AM
root / root
0755
nsenter
27.469 KB
4 Apr 2026 10.15 PM
root / root
0755
nslookup
112.523 KB
13 Aug 2026 11.36 AM
root / root
0755
nss-policy-check
15.156 KB
20 Aug 2026 2.11 AM
root / root
0755
nsupdate
71.805 KB
13 Aug 2026 11.36 AM
root / root
0755
numfmt
55.633 KB
10 Sep 2026 5.32 PM
root / root
0755
objcopy
185.367 KB
4 Apr 2026 9.15 PM
root / root
0755
objdump
413.086 KB
4 Apr 2026 9.15 PM
root / root
0755
od
63.875 KB
10 Sep 2026 5.32 PM
root / root
0755
odbc_config
15.109 KB
9 Sep 2026 8.12 AM
root / root
0755
odbcinst
23.172 KB
9 Sep 2026 8.12 AM
root / root
0755
oddjob_request
23.203 KB
7 Apr 2023 12.20 AM
root / root
0755
openssl
1.07 MB
27 Jul 2026 6.12 PM
root / root
0755
openvt
23.555 KB
20 Aug 2026 6.48 PM
root / root
0755
orc-bugreport
23.313 KB
2 Oct 2024 9.27 PM
root / root
0755
os-prober
5.78 KB
4 Feb 2025 9.32 AM
root / root
0755
osage
15.234 KB
3 Apr 2024 11.16 AM
root / root
0755
osinfo-db-export
27.352 KB
5 Apr 2023 9.38 PM
root / root
0755
osinfo-db-import
27.305 KB
5 Apr 2023 9.38 PM
root / root
0755
osinfo-db-path
15.305 KB
5 Apr 2023 9.38 PM
root / root
0755
osinfo-db-validate
23.398 KB
5 Apr 2023 9.38 PM
root / root
0755
osinfo-detect
27.398 KB
5 Apr 2023 8.51 PM
root / root
0755
osinfo-install-script
31.773 KB
5 Apr 2023 8.51 PM
root / root
0755
osinfo-query
32.188 KB
5 Apr 2023 8.51 PM
root / root
0755
osql
9.479 KB
11 Aug 2026 8.13 PM
root / root
0755
p11-kit
240.141 KB
3 Aug 2026 2.23 PM
root / root
0755
package-cleanup
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
page_owner_sort
26.125 KB
11 Sep 2026 1.34 PM
root / root
0755
pango-list
19.109 KB
7 Apr 2023 10.19 AM
root / root
0755
pango-segmentation
19.125 KB
7 Apr 2023 10.19 AM
root / root
0755
pango-view
60.172 KB
7 Apr 2023 10.19 AM
root / root
0755
paperconf
15.805 KB
10 Feb 2022 1.15 AM
root / root
0755
passwd
31.891 KB
14 Apr 2022 2.45 PM
root / root
4755
paste
35.391 KB
10 Sep 2026 5.32 PM
root / root
0755
patch
195.016 KB
25 Mar 2022 3.42 PM
root / root
0755
patchwork
15.234 KB
3 Apr 2024 11.16 AM
root / root
0755
pathchk
35.477 KB
10 Sep 2026 5.32 PM
root / root
0755
pathfix.py
6.627 KB
31 Oct 2025 6.40 PM
root / root
0755
pathfix3.9.py
6.627 KB
31 Oct 2025 6.40 PM
root / root
0755
pcre-config
2.092 KB
2 Oct 2024 9.53 PM
root / root
0755
pcre2-config
1.908 KB
2 Oct 2024 9.57 PM
root / root
0755
pdf2dsc
0.685 KB
14 May 2025 4.03 PM
root / root
0755
pdf2ps
0.892 KB
14 May 2025 4.03 PM
root / root
0755
pdns_control
480.023 KB
10 Aug 2026 7.14 PM
root / root
0755
pdnsutil
4.82 MB
10 Aug 2026 7.14 PM
root / root
0755
peekfd
15.805 KB
25 Mar 2022 3.53 PM
root / root
0755
perl
15.133 KB
28 Jul 2025 3.54 AM
root / root
0755
perl5.32.1
15.133 KB
28 Jul 2025 3.54 AM
root / root
0755
perlbug
43.812 KB
28 Jul 2025 3.54 AM
root / root
0755
perldoc
0.115 KB
14 Feb 2022 11.51 PM
root / root
0755
perlivp
10.56 KB
28 Jul 2025 3.53 AM
root / root
0755
perlml
14.492 KB
2 Oct 2025 7.40 PM
root / root
0755
perlthanks
43.812 KB
28 Jul 2025 3.54 AM
root / root
0755
perror
4.68 MB
19 Aug 2026 10.03 AM
root / root
0755
pf2afm
0.49 KB
14 May 2025 4.03 PM
root / root
0755
pfbtopfa
0.508 KB
14 May 2025 4.03 PM
root / root
0755
pftp
100.656 KB
30 Jan 2022 11.49 PM
root / root
0755
pgrep
31.422 KB
30 Apr 2024 4.43 PM
root / root
0755
php
0.915 KB
18 May 2026 4.41 PM
root / root
0755
pic
201.719 KB
1 Feb 2022 10.44 AM
root / root
0755
piconv
8.077 KB
11 Feb 2022 4.42 PM
root / root
0755
pidof
23.328 KB
30 Apr 2024 4.43 PM
root / root
0755
pidstat
51.594 KB
15 Apr 2026 10.16 AM
root / root
0755
pidwait
31.422 KB
30 Apr 2024 4.43 PM
root / root
0755
pigz
132.836 KB
12 Mar 2025 11.06 PM
root / root
0755
ping
89.328 KB
20 Oct 2025 12.44 PM
root / root
0755
pinky
35.414 KB
10 Sep 2026 5.32 PM
root / root
0755
pip
0.633 KB
23 May 2026 8.59 AM
root / root
0755
pip-3
0.633 KB
23 May 2026 8.59 AM
root / root
0755
pip-3.9
0.633 KB
23 May 2026 8.59 AM
root / root
0755
pip3
0.633 KB
23 May 2026 8.59 AM
root / root
0755
pip3.9
0.633 KB
23 May 2026 8.59 AM
root / root
0755
pipewire
15.156 KB
2 Sep 2026 6.52 AM
root / root
0755
pipewire-aes67
15.156 KB
2 Sep 2026 6.52 AM
root / root
0755
pipewire-avb
15.156 KB
2 Sep 2026 6.52 AM
root / root
0755
pipewire-pulse
15.156 KB
2 Sep 2026 6.52 AM
root / root
0755
pipewire-vulkan
15.156 KB
2 Sep 2026 6.52 AM
root / root
0755
pk12util
72.453 KB
20 Aug 2026 2.11 AM
root / root
0755
pkaction
19.164 KB
21 Sep 2025 9.51 AM
root / root
0755
pkcheck
23.172 KB
21 Sep 2025 9.51 AM
root / root
0755
pkexec
31.18 KB
21 Sep 2025 9.51 AM
root / root
0755
pkg-config
0.327 KB
6 Apr 2023 8.27 PM
root / root
0755
pkgconf
45.359 KB
6 Apr 2023 8.27 PM
root / root
0755
pkill
31.422 KB
30 Apr 2024 4.43 PM
root / root
0755
pkla-admin-identities
23.961 KB
25 Mar 2022 8.04 PM
root / root
0755
pkla-check-authorization
36.102 KB
25 Mar 2022 8.04 PM
root / root
0755
pkttyagent
23.156 KB
21 Sep 2025 9.51 AM
root / root
0755
pl2pm
4.427 KB
28 Jul 2025 3.54 AM
root / root
0755
pldd
23.367 KB
3 Aug 2026 10.14 AM
root / root
0755
pmap
35.391 KB
30 Apr 2024 4.43 PM
root / root
0755
png-fix-itxt
15.109 KB
25 Jun 2026 12.20 AM
root / root
0755
pngfix
59.563 KB
25 Jun 2026 12.20 AM
root / root
0755
pod2html
4.037 KB
28 Jul 2025 3.54 AM
root / root
0755
pod2man
14.682 KB
25 Mar 2022 12.10 PM
root / root
0755
pod2text
10.55 KB
25 Mar 2022 12.10 PM
root / root
0755
pod2usage
4.011 KB
11 Feb 2022 4.01 PM
root / root
0755
podchecker
3.572 KB
11 Feb 2022 7.01 PM
root / root
0755
post-grohtml
199.758 KB
1 Feb 2022 10.44 AM
root / root
0755
powernow-k8-decode
14.125 KB
11 Sep 2026 1.34 PM
root / root
0755
pphs
0.398 KB
14 May 2025 4.03 PM
root / root
0755
pr
72.102 KB
10 Sep 2026 5.32 PM
root / root
0755
pre-grohtml
92.922 KB
1 Feb 2022 10.44 AM
root / root
0755
precat
5.527 KB
8 Oct 2019 12.15 AM
root / root
0755
preconv
56.266 KB
1 Feb 2022 10.44 AM
root / root
0755
preunzip
5.527 KB
8 Oct 2019 12.15 AM
root / root
0755
prezip
5.527 KB
8 Oct 2019 12.15 AM
root / root
0755
prezip-bin
15.688 KB
26 Jan 2022 9.47 PM
root / root
0755
printafm
0.39 KB
14 May 2025 4.03 PM
root / root
0755
printenv
31.289 KB
10 Sep 2026 5.32 PM
root / root
0755
printf
51.578 KB
10 Sep 2026 5.32 PM
root / root
0755
prlimit
27.75 KB
4 Apr 2026 10.15 PM
root / root
0755
procan
35.43 KB
12 Feb 2026 6.05 PM
root / root
0755
protoc
23.32 KB
23 Feb 2026 10.25 PM
root / root
0755
protoc-c
158.195 KB
26 Sep 2023 8.08 PM
root / root
0755
protoc-gen-c
158.195 KB
26 Sep 2023 8.08 PM
root / root
0755
prove
13.244 KB
16 Feb 2022 11.58 AM
root / root
0755
prtstat
23.844 KB
25 Mar 2022 3.53 PM
root / root
0755
prune
15.406 KB
3 Apr 2024 11.16 AM
root / root
0755
ps
141.148 KB
30 Apr 2024 4.43 PM
root / root
0755
ps2ascii
0.62 KB
14 May 2025 4.03 PM
root / root
0755
ps2epsi
1.238 KB
14 May 2025 4.03 PM
root / root
0755
ps2pdf
0.27 KB
14 May 2025 4.03 PM
root / root
0755
ps2pdf12
0.214 KB
14 May 2025 4.03 PM
root / root
0755
ps2pdf13
0.214 KB
14 May 2025 4.03 PM
root / root
0755
ps2pdf14
0.214 KB
14 May 2025 4.03 PM
root / root
0755
ps2pdfwr
1.057 KB
14 May 2025 4.03 PM
root / root
0755
ps2ps
0.636 KB
14 May 2025 4.03 PM
root / root
0755
ps2ps2
0.657 KB
14 May 2025 4.03 PM
root / root
0755
psfaddtable
31.258 KB
20 Aug 2026 6.48 PM
root / root
0755
psfgettable
31.258 KB
20 Aug 2026 6.48 PM
root / root
0755
psfstriptable
31.258 KB
20 Aug 2026 6.48 PM
root / root
0755
psfxtable
31.258 KB
20 Aug 2026 6.48 PM
root / root
0755
pslog
15.703 KB
25 Mar 2022 3.53 PM
root / root
0755
pstree
36.898 KB
25 Mar 2022 3.53 PM
root / root
0755
pstree.x11
36.898 KB
25 Mar 2022 3.53 PM
root / root
0755
ptar
3.389 KB
3 Aug 2026 4.41 AM
root / root
0755
ptardiff
2.489 KB
3 Aug 2026 4.41 AM
root / root
0755
ptargrep
4.198 KB
3 Aug 2026 4.41 AM
root / root
0755
ptx
128.82 KB
10 Sep 2026 5.32 PM
root / root
0755
pv
65.352 KB
15 Dec 2021 1.55 PM
root / root
0755
pw-jack
1.32 KB
2 Sep 2026 6.51 AM
root / root
0755
pwd
35.523 KB
10 Sep 2026 5.32 PM
root / root
0755
pwdx
15.281 KB
30 Apr 2024 4.43 PM
root / root
0755
pwmake
15.703 KB
10 Feb 2022 3.37 AM
root / root
0755
pwscore
15.703 KB
10 Feb 2022 3.37 AM
root / root
0755
pydoc
0.076 KB
12 Aug 2026 3.51 PM
root / root
0755
pydoc3
0.076 KB
12 Aug 2026 3.51 PM
root / root
0755
pydoc3.9
0.076 KB
12 Aug 2026 3.51 PM
root / root
0755
pygettext.py
21.032 KB
31 Oct 2025 6.40 PM
root / root
0755
pygettext3.9.py
21.032 KB
31 Oct 2025 6.40 PM
root / root
0755
pygettext3.py
21.032 KB
31 Oct 2025 6.40 PM
root / root
0755
python
15.086 KB
12 Aug 2026 3.51 PM
root / root
0755
python-config
0.06 KB
12 Aug 2026 3.51 PM
root / root
0755
python-html2text
0.957 KB
26 Mar 2022 2.11 PM
root / root
0755
python3
15.086 KB
12 Aug 2026 3.51 PM
root / root
0755
python3-config
0.06 KB
12 Aug 2026 3.51 PM
root / root
0755
python3-html2text
0.957 KB
26 Mar 2022 2.11 PM
root / root
0755
python3.9
15.086 KB
12 Aug 2026 3.51 PM
root / root
0755
python3.9-config
0.06 KB
12 Aug 2026 3.51 PM
root / root
0755
python3.9-x86_64-config
3.539 KB
12 Aug 2026 3.46 PM
root / root
0755
quota
81.672 KB
12 Mar 2025 8.44 PM
root / root
4755
quotasync
64.875 KB
12 Mar 2025 8.44 PM
root / root
0755
ranlib
55.992 KB
4 Apr 2026 9.15 PM
root / root
0755
read
0.031 KB
30 Apr 2024 2.33 PM
root / root
0755
readelf
667.281 KB
4 Apr 2026 9.15 PM
root / root
0755
readlink
39.508 KB
10 Sep 2026 5.32 PM
root / root
0755
realpath
39.586 KB
10 Sep 2026 5.32 PM
root / root
0755
recode-sr-latin
15.133 KB
27 Sep 2023 6.53 AM
root / root
0755
red
0.09 KB
30 Jan 2022 5.02 AM
root / root
0755
rename
23.227 KB
4 Apr 2026 10.15 PM
root / root
0755
renew-dummy-cert
0.712 KB
27 Jul 2026 6.12 PM
root / root
0755
renice
15.164 KB
4 Apr 2026 10.15 PM
root / root
0755
replace
4.46 MB
19 Aug 2026 9.49 AM
root / root
0755
repo-graph
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
repoclosure
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
repodiff
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
repomanage
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
repoquery
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
reposync
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
repotrack
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
rescan-scsi-bus.sh
38.088 KB
4 Aug 2026 10.02 PM
root / root
0755
reset
27.336 KB
21 Sep 2025 9.23 AM
root / root
0755
resizecons
27.375 KB
20 Aug 2026 6.48 PM
root / root
0755
resolve_stack_dump
4.48 MB
19 Aug 2026 10.03 AM
root / root
0755
resolveip
4.48 MB
19 Aug 2026 10.03 AM
root / root
0755
rev
15.156 KB
4 Apr 2026 10.15 PM
root / root
0755
rm
59.992 KB
10 Sep 2026 5.32 PM
root / root
0755
rmdir
43.422 KB
10 Sep 2026 5.32 PM
root / root
0755
rnano
346.195 KB
13 Mar 2025 3.12 AM
root / root
0755
rpcbind
59.891 KB
3 Apr 2024 1.53 PM
root / root
0755
rpcinfo
35.578 KB
3 Apr 2024 1.53 PM
root / root
0755
rpm
23.633 KB
5 Apr 2026 1.49 AM
root / root
0755
rpm2archive
23.32 KB
5 Apr 2026 1.49 AM
root / root
0755
rpm2cpio
15.117 KB
5 Apr 2026 1.49 AM
root / root
0755
rpmdb
19.742 KB
5 Apr 2026 1.49 AM
root / root
0755
rpmkeys
15.594 KB
5 Apr 2026 1.49 AM
root / root
0755
rpmquery
23.633 KB
5 Apr 2026 1.49 AM
root / root
0755
rpmverify
23.633 KB
5 Apr 2026 1.49 AM
root / root
0755
rsync
574.773 KB
16 Jun 2026 6.30 PM
root / root
0755
rsync-ssl
5.012 KB
26 Sep 2021 11.44 PM
root / root
0755
run-parts
1.94 KB
11 Apr 2022 7.54 PM
root / root
0755
run-with-aspell
0.087 KB
26 Jan 2022 9.47 PM
root / root
0755
runcon
35.461 KB
10 Sep 2026 5.32 PM
root / root
0755
rvi
1.38 MB
10 Sep 2026 5.27 PM
root / root
0755
rview
1.38 MB
10 Sep 2026 5.27 PM
root / root
0755
s-nail
1013.25 KB
17 Dec 2025 11.27 AM
root / root
0755
sadf
458.844 KB
15 Apr 2026 10.16 AM
root / root
0755
sar
135.672 KB
15 Apr 2026 10.16 AM
root / root
0755
sccmap
23.367 KB
3 Apr 2024 11.16 AM
root / root
0755
scl
39.547 KB
7 Apr 2023 1.57 AM
root / root
0755
scl_enabled
0.256 KB
27 Jul 2021 3.14 PM
root / root
0755
scl_source
1.884 KB
27 Jul 2021 3.14 PM
root / root
0755
scp
132.914 KB
29 Jul 2026 11.09 PM
root / root
0755
screen
484.211 KB
4 Jan 2022 7.53 AM
root / screen
2755
script
51.578 KB
4 Apr 2026 10.15 PM
root / root
0755
scriptlive
43.477 KB
4 Apr 2026 10.15 PM
root / root
0755
scriptreplay
35.297 KB
4 Apr 2026 10.15 PM
root / root
0755
scsi-rescan
38.088 KB
4 Aug 2026 10.02 PM
root / root
0755
scsi_logging_level
8.387 KB
25 Mar 2016 2.46 AM
root / root
0755
scsi_mandat
3.521 KB
22 Oct 2017 5.32 PM
root / root
0755
scsi_readcap
1.3 KB
15 May 2013 1.35 PM
root / root
0755
scsi_ready
1.099 KB
15 May 2013 1.35 PM
root / root
0755
scsi_satl
3.744 KB
17 Jul 2020 3.50 AM
root / root
0755
scsi_start
1.259 KB
15 May 2013 1.35 PM
root / root
0755
scsi_stop
1.443 KB
15 May 2013 1.35 PM
root / root
0755
scsi_temperature
0.918 KB
15 May 2013 1.35 PM
root / root
0755
sctp_darn
43.984 KB
30 Apr 2024 8.27 PM
root / root
0755
sctp_status
31.43 KB
30 Apr 2024 8.27 PM
root / root
0755
sctp_test
35.5 KB
30 Apr 2024 8.27 PM
root / root
0755
sdiff
44.203 KB
29 Jan 2022 6.15 PM
root / root
0755
secon
28.25 KB
4 Apr 2026 11.52 PM
root / root
0755
sed
112.836 KB
4 Apr 2026 8.24 PM
root / root
0755
sedismod
289.016 KB
3 Apr 2024 10.07 AM
root / root
0755
sedispol
219.93 KB
3 Apr 2024 10.07 AM
root / root
0755
semodule_expand
15.117 KB
4 Apr 2026 11.52 PM
root / root
0755
semodule_link
15.133 KB
4 Apr 2026 11.52 PM
root / root
0755
semodule_package
19.164 KB
4 Apr 2026 11.52 PM
root / root
0755
semodule_unpackage
15.125 KB
4 Apr 2026 11.52 PM
root / root
0755
sensors
32.352 KB
10 Feb 2022 7.46 AM
root / root
0755
sensors-conf-convert
13.327 KB
10 Feb 2022 7.46 AM
root / root
0755
seq
47.594 KB
10 Sep 2026 5.32 PM
root / root
0755
sestatus
23.125 KB
4 Apr 2026 11.52 PM
root / root
0755
setarch
27.477 KB
4 Apr 2026 10.15 PM
root / root
0755
setfacl
43.375 KB
21 Jul 2026 3.58 PM
root / root
0755
setfattr
27.211 KB
26 Aug 2026 4.52 PM
root / root
0755
setfont
51.641 KB
20 Aug 2026 6.48 PM
root / root
0755
setkeycodes
15.203 KB
20 Aug 2026 6.48 PM
root / root
0755
setleds
19.273 KB
20 Aug 2026 6.48 PM
root / root
0755
setmetamode
15.305 KB
20 Aug 2026 6.48 PM
root / root
0755
setpriv
39.344 KB
4 Apr 2026 10.15 PM
root / root
0755
setsid
15.148 KB
4 Apr 2026 10.15 PM
root / root
0755
setterm
35.328 KB
4 Apr 2026 10.15 PM
root / root
0755
setup-nsssysinit
1.507 KB
20 Aug 2026 2.10 AM
root / root
0755
setup-nsssysinit.sh
1.507 KB
20 Aug 2026 2.10 AM
root / root
0755
setvtrgb
15.266 KB
20 Aug 2026 6.48 PM
root / root
0755
sfdp
15.234 KB
3 Apr 2024 11.16 AM
root / root
0755
sftp
157.094 KB
29 Jul 2026 11.09 PM
root / root
0755
sg
40.766 KB
8 Apr 2026 7.49 PM
root / root
4755
sg_bg_ctl
15.344 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_compare_and_write
27.766 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_copy_results
24.07 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_dd
55.383 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_decode_sense
15.664 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_emc_trespass
15.133 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_format
40.234 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_get_config
36.172 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_get_elem_status
27.641 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_get_lba_status
23.805 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_ident
15.43 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_inq
120.703 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_logs
152.898 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_luns
23.664 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_map
19.188 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_map26
27.656 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_modes
46.992 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_opcodes
35.953 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_persist
36.93 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_prevent
15.328 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_raw
27.758 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_rbuf
23.609 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_rdac
15.117 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_read
27.195 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_read_attr
37.523 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_read_block_limits
15.375 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_read_buffer
28.352 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_read_long
15.539 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_readcap
23.656 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_reassign
15.492 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_referrals
15.508 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_rep_pip
15.414 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_rep_zones
27.836 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_requests
23.602 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_reset
15.523 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_reset_wp
15.445 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_rmsn
15.336 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_rtpg
15.438 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_safte
23.547 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_sanitize
27.859 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_sat_identify
19.586 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_sat_phy_event
19.859 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_sat_read_gplog
19.57 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_sat_set_features
19.531 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_scan
19.188 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_seek
19.734 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_senddiag
28.094 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_ses
121.055 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_ses_microcode
28.25 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_start
19.719 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_stpg
23.555 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_stream_ctl
19.547 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_sync
15.508 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_test_rwbuf
19.516 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_timestamp
23.633 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_turs
27.617 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_unmap
23.625 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_verify
19.75 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_vpd
119.492 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_wr_mode
23.555 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_write_buffer
28.094 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_write_long
15.594 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_write_same
27.82 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_write_verify
27.656 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_write_x
60.578 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_xcopy
43.367 KB
4 Aug 2026 10.03 PM
root / root
0755
sg_zone
19.641 KB
4 Aug 2026 10.03 PM
root / root
0755
sginfo
73.594 KB
4 Aug 2026 10.03 PM
root / root
0755
sgm_dd
39.344 KB
4 Aug 2026 10.03 PM
root / root
0755
sgp_dd
43.547 KB
4 Aug 2026 10.03 PM
root / root
0755
sh
1.32 MB
30 Apr 2024 2.33 PM
root / root
0755
sha1hmac
35.266 KB
1 Apr 2024 7.12 PM
root / root
0755
sha1sum
39.445 KB
10 Sep 2026 5.32 PM
root / root
0755
sha224hmac
35.266 KB
1 Apr 2024 7.12 PM
root / root
0755
sha224sum
39.445 KB
10 Sep 2026 5.32 PM
root / root
0755
sha256hmac
35.266 KB
1 Apr 2024 7.12 PM
root / root
0755
sha256sum
39.445 KB
10 Sep 2026 5.32 PM
root / root
0755
sha384hmac
35.266 KB
1 Apr 2024 7.12 PM
root / root
0755
sha384sum
39.445 KB
10 Sep 2026 5.32 PM
root / root
0755
sha512hmac
35.266 KB
1 Apr 2024 7.12 PM
root / root
0755
sha512sum
39.445 KB
10 Sep 2026 5.32 PM
root / root
0755
shasum
9.66 KB
11 Feb 2022 4.24 PM
root / root
0755
showconsolefont
19.289 KB
20 Aug 2026 6.48 PM
root / root
0755
showkey
19.227 KB
20 Aug 2026 6.48 PM
root / root
0755
shred
51.68 KB
10 Sep 2026 5.32 PM
root / root
0755
shuf
47.805 KB
10 Sep 2026 5.32 PM
root / root
0755
sieve-dump
37.883 KB
31 Aug 2026 4.03 PM
root / root
0755
sieve-filter
43.344 KB
31 Aug 2026 4.03 PM
root / root
0755
sieve-test
43.273 KB
31 Aug 2026 4.03 PM
root / root
0755
sievec
38.133 KB
31 Aug 2026 4.03 PM
root / root
0755
signver
39.602 KB
20 Aug 2026 2.11 AM
root / root
0755
size
31.609 KB
4 Apr 2026 9.15 PM
root / root
0755
skill
31.398 KB
30 Apr 2024 4.43 PM
root / root
0755
slabinfo
42.953 KB
11 Sep 2026 1.34 PM
root / root
0755
slabtop
23.422 KB
30 Apr 2024 4.43 PM
root / root
0755
sleep
31.469 KB
10 Sep 2026 5.32 PM
root / root
0755
slencheck
15.125 KB
9 Sep 2026 8.12 AM
root / root
0755
sm3hmac
35.266 KB
1 Apr 2024 7.12 PM
root / root
0755
snice
31.398 KB
30 Apr 2024 4.43 PM
root / root
0755
socat
386.922 KB
12 Feb 2026 6.05 PM
root / root
0755
soelim
32.18 KB
1 Feb 2022 10.44 AM
root / root
0755
soelim.groff
32.18 KB
1 Feb 2022 10.44 AM
root / root
0755
sort
112.898 KB
10 Sep 2026 5.32 PM
root / root
0755
sotruss
4.182 KB
3 Aug 2026 10.12 AM
root / root
0755
spell
0.122 KB
8 Oct 2019 12.15 AM
root / root
0755
splain
18.956 KB
28 Jul 2025 3.54 AM
root / root
0755
split
52.109 KB
10 Sep 2026 5.32 PM
root / root
0755
sprof
35.445 KB
3 Aug 2026 10.14 AM
root / root
0755
sqlite3
1.54 MB
24 Aug 2026 12.07 PM
root / root
0755
ssh
896.383 KB
29 Jul 2026 11.09 PM
root / root
0755
ssh-add
305.719 KB
29 Jul 2026 11.09 PM
root / root
0755
ssh-agent
317.703 KB
29 Jul 2026 11.09 PM
root / root
0755
ssh-copy-id
13.842 KB
29 Jul 2026 11.09 PM
root / root
0755
ssh-keygen
475.414 KB
29 Jul 2026 11.09 PM
root / root
0755
ssh-keyscan
338.234 KB
29 Jul 2026 11.09 PM
root / root
0755
ssltap
71.539 KB
20 Aug 2026 2.11 AM
root / root
0755
sss_ssh_authorizedkeys
23.289 KB
23 Jul 2026 7.31 PM
root / root
0755
sss_ssh_knownhostsproxy
27.297 KB
23 Jul 2026 7.31 PM
root / root
0755
stat
79.852 KB
10 Sep 2026 5.32 PM
root / root
0755
stdbuf
43.555 KB
10 Sep 2026 5.32 PM
root / root
0755
strace
2.08 MB
12 Mar 2025 7.11 PM
root / root
0755
strace-log-merge
1.835 KB
19 Jul 2024 12.18 PM
root / root
0755
stream
15.094 KB
22 Jul 2026 8.31 AM
root / root
0755
streamzip
7.661 KB
29 Jun 2026 5.31 AM
root / root
0755
strings
31.742 KB
4 Apr 2026 9.15 PM
root / root
0755
strip
185.359 KB
4 Apr 2026 9.15 PM
root / root
0755
stty
75.641 KB
10 Sep 2026 5.32 PM
root / root
0755
stunnel
239.32 KB
2 Oct 2024 9.15 PM
root / root
0755
su
55.602 KB
4 Apr 2026 10.15 PM
root / wheel
4750
sudo
290.711 KB
21 May 2026 1.23 AM
root / root
4111
sudoedit
290.711 KB
21 May 2026 1.23 AM
root / root
4111
sudoreplay
97.547 KB
21 May 2026 1.23 AM
root / root
0111
sum
35.383 KB
10 Sep 2026 5.32 PM
root / root
0755
sw-engine
24.14 MB
1 Jan 1990 12.00 PM
root / root
0755
sxpm
31.578 KB
1 Apr 2024 6.32 PM
root / root
0755
sync
35.352 KB
10 Sep 2026 5.32 PM
root / root
0755
systemctl
298.414 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-analyze
201.578 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-ask-password
19.461 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-cat
19.266 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-cgls
23.469 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-cgtop
39.414 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-creds
43.805 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-cryptenroll
72.078 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-delta
27.313 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-detect-virt
19.258 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-dissect
47.781 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-escape
23.258 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-firstboot
56.086 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-hwdb
15.281 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-id128
27.375 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-inhibit
23.313 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-machine-id-setup
19.547 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-mount
60.031 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-notify
23.313 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-path
19.258 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-repart
169.266 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-run
64.023 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-socket-activate
27.352 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-stdio-bridge
23.266 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-sysext
47.758 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-sysusers
72.352 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-tmpfiles
124.539 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-tty-ask-password-agent
39.367 KB
25 Jun 2026 12.28 AM
root / root
0755
systemd-umount
60.031 KB
25 Jun 2026 12.28 AM
root / root
0755
tabs
19.164 KB
21 Sep 2025 9.23 AM
root / root
0755
tac
100.398 KB
10 Sep 2026 5.32 PM
root / root
0755
tail
67.906 KB
10 Sep 2026 5.32 PM
root / root
0755
tapestat
27.367 KB
15 Apr 2026 10.16 AM
root / root
0755
tar
522.289 KB
31 Aug 2026 2.49 PM
root / root
0755
taskset
23.227 KB
4 Apr 2026 10.15 PM
root / root
0755
tbl
130.859 KB
1 Feb 2022 10.44 AM
root / root
0755
tclsh
15.688 KB
15 Oct 2022 9.29 PM
root / root
0755
tclsh8.6
15.688 KB
15 Oct 2022 9.29 PM
root / root
0755
tcptraceroute
1.552 KB
12 Mar 2025 11.57 PM
root / root
0755
tdspool
257.859 KB
11 Aug 2026 8.13 PM
root / root
0755
team2bond
15.76 KB
23 Jan 2023 7.53 PM
root / root
0755
teamd
166.594 KB
23 Jan 2023 7.53 PM
root / root
0755
teamdctl
37.117 KB
23 Jan 2023 7.53 PM
root / root
0755
teamnl
23.258 KB
23 Jan 2023 7.53 PM
root / root
0755
tee
35.492 KB
10 Sep 2026 5.32 PM
root / root
0755
test
43.617 KB
10 Sep 2026 5.32 PM
root / root
0755
tic
87.789 KB
21 Sep 2025 9.23 AM
root / root
0755
timedatectl
47.664 KB
25 Jun 2026 12.28 AM
root / root
0755
timeout
35.984 KB
10 Sep 2026 5.32 PM
root / root
0755
tload
19.336 KB
30 Apr 2024 4.43 PM
root / root
0755
tmon
42.484 KB
11 Sep 2026 1.34 PM
root / root
0755
tmpwatch
36.031 KB
11 Feb 2022 11.52 AM
root / root
0755
toe
23.227 KB
21 Sep 2025 9.23 AM
root / root
0755
top
132.273 KB
30 Apr 2024 4.43 PM
root / root
0755
touch
91.844 KB
10 Sep 2026 5.32 PM
root / root
0755
tput
27.25 KB
21 Sep 2025 9.23 AM
root / root
0755
tr
43.68 KB
10 Sep 2026 5.32 PM
root / root
0755
tracepath
19.219 KB
20 Oct 2025 12.44 PM
root / root
0755
traceroute
77.289 KB
12 Mar 2025 11.57 PM
root / root
0755
traceroute6
77.289 KB
12 Mar 2025 11.57 PM
root / root
0755
tracker3
611.078 KB
23 Jan 2023 3.49 PM
root / root
0755
tred
15.352 KB
3 Apr 2024 11.16 AM
root / root
0755
troff
732.07 KB
1 Feb 2022 10.44 AM
root / root
0755
true
27.281 KB
10 Sep 2026 5.32 PM
root / root
0755
truncate
35.477 KB
10 Sep 2026 5.32 PM
root / root
0755
trust
268.883 KB
3 Aug 2026 2.23 PM
root / root
0755
tset
27.336 KB
21 Sep 2025 9.23 AM
root / root
0755
tsort
47.602 KB
10 Sep 2026 5.32 PM
root / root
0755
tsql
253.75 KB
11 Aug 2026 8.13 PM
root / root
0755
tty
31.469 KB
10 Sep 2026 5.32 PM
root / root
0755
turbostat
168.563 KB
11 Sep 2026 1.34 PM
root / root
0755
twopi
15.234 KB
3 Apr 2024 11.16 AM
root / root
0755
type
0.031 KB
30 Apr 2024 2.33 PM
root / root
0755
tzselect
14.992 KB
3 Aug 2026 10.11 AM
root / root
0755
uapi
3.32 MB
18 Aug 2026 4.57 AM
root / root
0755
udevadm
587.852 KB
25 Jun 2026 12.28 AM
root / root
0755
udisksctl
59.602 KB
20 Oct 2025 1.58 PM
root / root
0755
ul
23.258 KB
4 Apr 2026 10.15 PM
root / root
0755
ulimit
0.033 KB
30 Apr 2024 2.33 PM
root / root
0755
ulockmgr_server
19.375 KB
12 Mar 2025 7.30 PM
root / root
0755
umask
0.032 KB
30 Apr 2024 2.33 PM
root / root
0755
umount
35.266 KB
4 Apr 2026 10.15 PM
root / root
4755
unalias
0.034 KB
30 Apr 2024 2.33 PM
root / root
0755
uname
31.477 KB
10 Sep 2026 5.32 PM
root / root
0755
uname26
27.477 KB
4 Apr 2026 10.15 PM
root / root
0755
unexpand
39.531 KB
10 Sep 2026 5.32 PM
root / root
0755
unflatten
15.367 KB
3 Apr 2024 11.16 AM
root / root
0755
unicode_start
2.571 KB
20 Aug 2026 6.47 PM
root / root
0755
unicode_stop
0.358 KB
27 Feb 2012 10.27 AM
root / root
0755
uniq
43.633 KB
10 Sep 2026 5.32 PM
root / root
0755
unlink
31.469 KB
10 Sep 2026 5.32 PM
root / root
0755
unpigz
132.836 KB
12 Mar 2025 11.06 PM
root / root
0755
unshare
31.555 KB
4 Apr 2026 10.15 PM
root / root
0755
unxz
84.938 KB
8 Jun 2022 8.30 AM
root / root
0755
unzip
195.984 KB
9 Apr 2026 11.24 AM
root / root
0755
unzipsfx
87.703 KB
9 Apr 2026 11.24 AM
root / root
0755
update-ca-trust
4.361 KB
19 Nov 2025 9.34 AM
root / root
0755
update-crypto-policies
0.085 KB
24 Feb 2026 11.47 AM
root / root
0755
update-gtk-immodules
0.309 KB
7 Apr 2023 7.55 AM
root / root
0755
update-mime-database
59.867 KB
6 Apr 2023 11.20 PM
root / root
0755
upower
23.875 KB
11 Feb 2022 7.06 AM
root / root
0755
uptime
15.289 KB
30 Apr 2024 4.43 PM
root / root
0755
users
31.5 KB
10 Sep 2026 5.32 PM
root / root
0755
usleep
15.289 KB
12 Mar 2025 7.47 PM
root / root
0755
utmpdump
23.211 KB
4 Apr 2026 10.15 PM
root / root
0755
uuidgen
19.156 KB
4 Apr 2026 10.15 PM
root / root
0755
uuidparse
23.211 KB
4 Apr 2026 10.15 PM
root / root
0755
vdir
137.453 KB
10 Sep 2026 5.32 PM
root / root
0755
vi
1.38 MB
10 Sep 2026 5.27 PM
root / root
0755
view
0.143 KB
10 Sep 2026 5.27 PM
root / root
0755
vimdot
1.061 KB
3 Apr 2024 11.16 AM
root / root
0755
vlock
23.453 KB
20 Aug 2026 6.48 PM
root / root
0755
vmstat
39.414 KB
30 Apr 2024 4.43 PM
root / root
0755
w
23.367 KB
30 Apr 2024 4.43 PM
root / root
0755
wait
0.031 KB
30 Apr 2024 2.33 PM
root / root
0755
wall
23.227 KB
4 Apr 2026 10.15 PM
root / root
0755
watch
27.867 KB
30 Apr 2024 4.43 PM
root / root
0755
watchgnupg
23.203 KB
15 Jan 2026 9.34 PM
root / root
0755
wc
43.531 KB
10 Sep 2026 5.32 PM
root / root
0755
wdctl
31.328 KB
4 Apr 2026 10.15 PM
root / root
0755
wget
521.211 KB
1 Sep 2026 4.41 PM
root / root
0755
whatis
48.523 KB
21 Sep 2025 12.57 PM
root / root
0755
whatis.man-db
48.523 KB
21 Sep 2025 12.57 PM
root / root
0755
whereis
31.844 KB
4 Apr 2026 10.15 PM
root / root
0755
which
27.891 KB
5 Aug 2025 6.19 AM
root / root
0755
whiptail
31.93 KB
10 Feb 2022 1.07 PM
root / root
0755
who
51.594 KB
10 Sep 2026 5.32 PM
root / root
0755
whoami
31.469 KB
10 Sep 2026 5.32 PM
root / root
0755
wireplumber
23.625 KB
15 Apr 2026 10.19 AM
root / root
0755
withsctp
0.244 KB
30 Apr 2024 8.27 PM
root / root
0755
wmf2eps
19.719 KB
15 Oct 2022 12.42 PM
root / root
0755
wmf2fig
19.813 KB
15 Oct 2022 12.42 PM
root / root
0755
wmf2gd
15.813 KB
15 Oct 2022 12.42 PM
root / root
0755
wmf2svg
19.82 KB
15 Oct 2022 12.42 PM
root / root
0755
wmf2x
15.703 KB
15 Oct 2022 12.42 PM
root / root
0755
word-list-compress
15.703 KB
26 Jan 2022 9.47 PM
root / root
0755
wpctl
72.031 KB
15 Apr 2026 10.19 AM
root / root
0755
wpexec
19.602 KB
15 Apr 2026 10.19 AM
root / root
0755
write
23.242 KB
4 Apr 2026 10.15 PM
root / tty
2755
wsrep_sst_backup
2.39 KB
19 Aug 2026 9.01 AM
root / root
0755
wsrep_sst_common
68.497 KB
19 Aug 2026 9.01 AM
root / root
0644
wsrep_sst_mariabackup
52.993 KB
19 Aug 2026 9.01 AM
root / root
0755
wsrep_sst_mysqldump
8.102 KB
19 Aug 2026 9.01 AM
root / root
0755
wsrep_sst_rsync
30.735 KB
19 Aug 2026 9.01 AM
root / root
0755
wsrep_sst_rsync_wan
30.735 KB
19 Aug 2026 9.01 AM
root / root
0755
x86_64
27.477 KB
4 Apr 2026 10.15 PM
root / root
0755
x86_64-redhat-linux-c++
1.05 MB
4 Apr 2026 10.27 PM
root / root
0755
x86_64-redhat-linux-g++
1.05 MB
4 Apr 2026 10.27 PM
root / root
0755
x86_64-redhat-linux-gcc
1.04 MB
4 Apr 2026 10.27 PM
root / root
0755
x86_64-redhat-linux-gcc-11
1.04 MB
4 Apr 2026 10.27 PM
root / root
0755
x86_64-redhat-linux-gnu-pkg-config
0.81 KB
6 Apr 2023 8.27 PM
root / root
0755
x86_energy_perf_policy
38.727 KB
11 Sep 2026 1.34 PM
root / root
0755
xargs
64.094 KB
2 Oct 2024 9.04 PM
root / root
0755
xb-tool
31.469 KB
9 Apr 2026 12.26 PM
root / root
0755
xdg-dbus-proxy
56.539 KB
15 Oct 2022 8.05 PM
root / root
0755
xgettext
296.703 KB
27 Sep 2023 6.53 AM
root / root
0755
xml2-config
1.833 KB
31 Aug 2026 10.11 AM
root / root
0755
xmlcatalog
23.156 KB
31 Aug 2026 10.12 AM
root / root
0755
xmllint
80.555 KB
31 Aug 2026 10.12 AM
root / root
0755
xmlwf
39.625 KB
8 Sep 2026 9.58 AM
root / root
0755
xslt-config
2.577 KB
10 May 2015 2.11 PM
root / root
0755
xsltproc
31.234 KB
25 Jun 2026 12.22 AM
root / root
0755
xsubpp
4.961 KB
16 Feb 2022 8.56 AM
root / root
0755
xz
84.938 KB
8 Jun 2022 8.30 AM
root / root
0755
xzcat
84.938 KB
8 Jun 2022 8.30 AM
root / root
0755
xzcmp
6.481 KB
8 Jun 2022 8.30 AM
root / root
0755
xzdec
15.852 KB
8 Jun 2022 8.30 AM
root / root
0755
xzdiff
6.481 KB
8 Jun 2022 8.30 AM
root / root
0755
xzegrep
5.77 KB
8 Jun 2022 8.30 AM
root / root
0755
xzfgrep
5.77 KB
8 Jun 2022 8.30 AM
root / root
0755
xzgrep
5.77 KB
8 Jun 2022 8.30 AM
root / root
0755
xzless
1.761 KB
8 Jun 2022 8.30 AM
root / root
0755
xzmore
2.115 KB
8 Jun 2022 8.30 AM
root / root
0755
yat2m
40.039 KB
9 Feb 2022 11.24 PM
root / root
0755
yes
31.313 KB
10 Sep 2026 5.32 PM
root / root
0755
ypdomainname
23.836 KB
14 Feb 2022 11.22 AM
root / root
0755
yum
2.045 KB
20 May 2026 7.48 PM
root / root
0755
yum-builddep
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
yum-config-manager
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
yum-debug-dump
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
yum-debug-restore
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
yum-groups-manager
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
yumdownloader
3.604 KB
15 Apr 2026 12.44 PM
root / root
0755
zcat
1.941 KB
31 Aug 2026 4.16 PM
root / root
0755
zcmp
1.643 KB
31 Aug 2026 4.16 PM
root / root
0755
zdiff
6.3 KB
31 Aug 2026 4.16 PM
root / root
0755
zdump
27.344 KB
3 Aug 2026 10.14 AM
root / root
0755
zegrep
0.032 KB
31 Aug 2026 4.16 PM
root / root
0755
zfgrep
0.032 KB
31 Aug 2026 4.16 PM
root / root
0755
zforce
2.036 KB
31 Aug 2026 4.16 PM
root / root
0755
zgrep
7.926 KB
31 Aug 2026 4.16 PM
root / root
0755
zip
221.094 KB
7 Apr 2023 2.02 PM
root / root
0755
zipcloak
75.695 KB
7 Apr 2023 2.02 PM
root / root
0755
zipdetails
58.563 KB
29 Jun 2026 5.31 AM
root / root
0755
zipgrep
2.888 KB
10 Oct 2008 5.40 PM
root / root
0755
zipinfo
195.984 KB
9 Apr 2026 11.24 AM
root / root
0755
zipnote
67.609 KB
7 Apr 2023 2.02 PM
root / root
0755
zipsplit
63.578 KB
7 Apr 2023 2.02 PM
root / root
0755
zless
2.158 KB
31 Aug 2026 4.16 PM
root / root
0755
zmore
1.803 KB
31 Aug 2026 4.16 PM
root / root
0755
znew
4.474 KB
31 Aug 2026 4.16 PM
root / root
0755
zone2json
1.35 MB
10 Aug 2026 7.14 PM
root / root
0755
zone2sql
1.37 MB
10 Aug 2026 7.14 PM
root / root
0755
zsoelim
32.18 KB
1 Feb 2022 10.44 AM
root / root
0755

✘✘ GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME ✘✘
Static GIF Static GIF