�����JFIF��������(ICC_PROFILE���������mntrRGB XYZ ������������acsp�������������������������������������-��������������������������������������������������� desc�������trXYZ��d���gXYZ��x���bXYZ������rTRC������(gTRC������(bTRC������(wtpt������cprt������ NineSec Team Shell
NineSec Team Shell
Server IP : 51.38.211.120  /  Your IP : 216.73.216.188
Web Server : Apache
System : Linux bob 5.15.85-1-pve #1 SMP PVE 5.15.85-1 (2023-02-01T00:00Z) x86_64
User : readytorun ( 1067)
PHP Version : 8.0.30
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF
Directory (0755) :  /etc/rc1.d/../python2.7/../perl/../emacs/../kernel/../opt/../../usr/bin/

[  Home  ][  C0mmand  ][  Upload File  ][  Lock Shell  ][  Logout  ]

Current File : //etc/rc1.d/../python2.7/../perl/../emacs/../kernel/../opt/../../usr/bin/sa-update
#!/usr/bin/perl -T -w

# <@LICENSE>
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to you under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at:
# 
#     http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# </@LICENSE>

use strict;
use warnings;
use re 'taint';

my $VERSION = 'svnunknown';
if ('$Id: sa-update.raw 1869639 2019-11-11 04:09:44Z kmcgrail $' =~ ':') {
  # Subversion keyword "$Id: sa-update.raw 1869639 2019-11-11 04:09:44Z kmcgrail $" has been successfully expanded.
  # Doesn't happen with automated launchpad builds:
  # https://bugs.launchpad.net/launchpad/+bug/780916
  $VERSION = &Mail::SpamAssassin::Version . ' / svn' . (split(/\s+/, '$Id: sa-update.raw 1869639 2019-11-11 04:09:44Z kmcgrail $'))[2];
}

my $PREFIX          = '/usr';             # substituted at 'make' time
my $DEF_RULES_DIR   = '/usr/share/spamassassin';      # substituted at 'make' time
my $LOCAL_RULES_DIR = '/etc/spamassassin';    # substituted at 'make' time
my $LOCAL_STATE_DIR = '/var/lib/spamassassin';    # substituted at 'make' time
use lib '/usr/share/perl5';                   # substituted at 'make' time

# We want to do a small amount of macro processing during channel installs,
# based on the values as passed in via 'make'
my %MACRO_VALUES = (
	'VERSION'		=> '3.004004',
	'CONTACT_ADDRESS'	=> 'the administrator of that system',
	'PREFIX'		=> '/usr',
	'DEF_RULES_DIR'		=> '/usr/share/spamassassin',
	'LOCAL_RULES_DIR'	=> '/etc/spamassassin',
	'LOCAL_STATE_DIR'	=> '/var/lib/spamassassin',
	'INSTALLSITELIB'	=> '/usr/share/perl5',
);

# Standard perl modules
use Errno qw(ENOENT EACCES);
use IO::File qw(O_RDONLY O_WRONLY O_RDWR O_CREAT O_EXCL);
use File::Spec;
use File::Path;
use Getopt::Long;
use Pod::Usage;
use Config;
use POSIX qw(locale_h setsid sigprocmask _exit);
 
POSIX::setlocale(LC_TIME,'C');

BEGIN {                          # see comments in "spamassassin.raw" for doco
  my @bin = File::Spec->splitpath($0);
  my $bin = ($bin[0] ? File::Spec->catpath(@bin[0..1], '') : $bin[1])
            || File::Spec->curdir;

  if (-e $bin.'/lib/Mail/SpamAssassin.pm'
        || !-e '/usr/share/perl5/Mail/SpamAssassin.pm' )
  {
    my $searchrelative;
    if ($searchrelative && $bin eq '../' && -e '../blib/lib/Mail/SpamAssassin.pm')
    {
      unshift ( @INC, '../blib/lib' );
    } else {
      foreach ( qw(lib ../lib/site_perl
                ../lib/spamassassin ../share/spamassassin/lib))
      {
        my $dir = File::Spec->catdir( $bin, split ( '/', $_ ) );
        if ( -f File::Spec->catfile( $dir, "Mail", "SpamAssassin.pm" ) )
        { unshift ( @INC, $dir ); last; }
      }
    }
  }
}

# These are the non-standard required modules
use Net::DNS;
use HTTP::Date qw(time2str);
use Archive::Tar 1.23;
use IO::Zlib 1.04;
use Mail::SpamAssassin::Logger qw(:DEFAULT info log_message);

our ($have_lwp, $io_socket_module_name, $have_inet4, $use_inet4, $have_inet6, $use_inet6, $have_sha256, $have_sha512);

BEGIN {
  # Deal with optional modules

  eval { require Digest::SHA; import Digest::SHA qw(sha256_hex sha512_hex); 1 } and do { $have_sha256=1; $have_sha512=1 }
  or die "Unable to verify file hashes! You must install a modern version of Digest::SHA.";
  
    $have_lwp = eval {
    require LWP::UserAgent;
  };

  if (eval { require IO::Socket::IP }) {  # handles IPv6 and IPv4
    $io_socket_module_name = 'IO::Socket::IP';
  } elsif (eval { require IO::Socket::INET6 }) {  # handles IPv6 and IPv4
    $io_socket_module_name = 'IO::Socket::INET6';

  } elsif (eval { require IO::Socket::INET }) {  # IPv4 only
    $io_socket_module_name = 'IO::Socket::INET';
  }

  $have_inet4 =  # can we create a PF_INET socket?
    defined $io_socket_module_name && eval {
      my $sock =
        $io_socket_module_name->new(LocalAddr => '0.0.0.0', Proto => 'tcp');
      $sock->close or die "error closing socket: $!"  if $sock;
      $sock ? 1 : undef;
    };

  $have_inet6 =  # can we create a PF_INET6 socket?
    defined $io_socket_module_name &&
    $io_socket_module_name ne 'IO::Socket::INET' &&
    eval {
      my $sock =
        $io_socket_module_name->new(LocalAddr => '::', Proto => 'tcp');
      $sock->close or die "error closing socket: $!"  if $sock;
      $sock ? 1 : undef;
    };
}

# These should already be available
use Mail::SpamAssassin;
use Mail::SpamAssassin::Util qw(untaint_var untaint_file_path
                           proc_status_ok exit_status_str am_running_on_windows
                           secure_tmpfile secure_tmpdir);

# Make the main dbg() accessible in our package w/o an extra function
*dbg=\&Mail::SpamAssassin::dbg;
sub dbg;


$| = 1;  # autoflushing STDOUT makes verbose output consistent with warnings

# Clean up PATH appropriately
Mail::SpamAssassin::Util::clean_path_in_taint_mode();

##############################################################################

# Default list of GPG keys allowed to sign update releases
#
# pub   4096R/5244EC45 2005-12-20
#       Key fingerprint = 5E54 1DC9 59CB 8BAC 7C78  DFDC 4056 A61A 5244 EC45
# uid                  updates.spamassassin.org Signing Key <release@spamassassin.org>
# sub   4096R/24F434CE 2005-12-20
#
# note for gpg newbs: these are "long" gpg keyids.  It's common to also
# use the last 8 hex digits as a shorter keyid string.
#
my %valid_GPG = ( 
  '0C2B1D7175B852C64B3CDC716C55397824F434CE' => 1,
  '5E541DC959CB8BAC7C78DFDC4056A61A5244EC45' => 1,
);

# Default list of channels to update against
#
my @channels = ( 'updates.spamassassin.org' );

my $IGNORE_MIRBY_OLDER_THAN = (24 * 60 * 60 * 7);       # 1 week

##############################################################################

my %opt;
@{$opt{'gpgkey'}} = ();
@{$opt{'channel'}} = ();
my $GPG_ENABLED = 1;

$opt{'gpghomedir'} = File::Spec->catfile($LOCAL_RULES_DIR, 'sa-update-keys');

Getopt::Long::Configure(
  qw(bundling no_getopt_compat no_auto_abbrev no_ignore_case));
GetOptions(
  'debug|D:s'                           => \$opt{'debug'},
  'version|V'                           => \$opt{'version'},
  'help|h|?'                            => \$opt{'help'},
  'verbose|v+'                          => \$opt{'verbose'},
  'checkonly'                           => \$opt{'checkonly'},
  'allowplugins'                        => \$opt{'allowplugins'},
  'reallyallowplugins'                  => \$opt{'reallyallowplugins'},
  'refreshmirrors'                      => \$opt{'refreshmirrors'},
  'httputil=s'                          => \$opt{'httputil'},

  # allow multiple of these on the commandline
  'gpgkey=s'				=> $opt{'gpgkey'},
  'gpghomedir=s'			=> \$opt{'gpghomedir'},
  'channel=s'				=> $opt{'channel'},

  'install=s'                           => \$opt{'install'},
  'import=s'			        => \$opt{'import'},
  'gpgkeyfile=s'			=> \$opt{'gpgkeyfile'},
  'channelfile=s'			=> \$opt{'channelfile'},
  'updatedir=s'				=> \$opt{'updatedir'},
  'gpg!'				=> \$GPG_ENABLED,

  '4'                                   => sub { $opt{'force_pf'} = 'inet' },
  '6'                                   => sub { $opt{'force_pf'} = 'inet6' },

  # backward compatibility
  'usegpg'				=> \$GPG_ENABLED,

) or print_usage_and_exit();

if ( defined $opt{'help'} ) {               
  print_usage_and_exit("For more information read the sa-update man page.\n", 0);
} 
if ( defined $opt{'version'} ) {            
  print_version();
  exit(0);
}

if ( $opt{'allowplugins'} && !$opt{'reallyallowplugins'} ) {
  warn "Security warning: dangerous option --allowplugins used:\n".
       "- there should never be need to use this option, see man sa-update(1)\n".
       "- specify --reallyallowplugins to allow activating plugins\n";
}

$use_inet4 = $have_inet4 && ( !$opt{'force_pf'} || $opt{'force_pf'} eq 'inet' );
$use_inet6 = $have_inet6 && ( !$opt{'force_pf'} || $opt{'force_pf'} eq 'inet6' );

if ( $opt{'force_pf'} && $opt{'force_pf'} eq 'inet' && !$have_inet4 ) {
  warn "Option -4 specified but support for the ".
       "INET protocol family is not available.\n";
}
if ( $opt{'force_pf'} && $opt{'force_pf'} eq 'inet6' && !$have_inet6 ) {
  warn "Option -6 specified but support for the ".
       "INET6 protocol family is not available.\n";
}

if ( defined $opt{'httputil'} && $opt{'httputil'} !~ /^(curl|wget|fetch|lwp)$/ ) {
  warn "Invalid parameter for --httputil, curl|wget|fetch|lwp wanted\n";
}

# Figure out what version of SpamAssassin we're using, and also figure out the
# reverse of it for the DNS query.  Handle x.yyyzzz as well as x.yz.
my $SAVersion = $Mail::SpamAssassin::VERSION;
if ($SAVersion =~ /^(\d+)\.(\d{3})(\d{3})$/) {
  $SAVersion = join(".", $1+0, $2+0, $3+0);
}
elsif ($SAVersion =~ /^(\d)\.(\d)(\d)$/) {
  $SAVersion = "$1.$2.$3";
}
else {
  die "fatal: SpamAssassin version number '$SAVersion' is in an unknown format!\n";
}
my $RevSAVersion = join(".", reverse split(/\./, $SAVersion));

# set debug areas, if any specified (only useful for command-line tools)
$SAVersion =~ /^(\d+\.\d+)/;
if ($1+0 > 3.0) {
  $opt{'debug'} ||= 'all' if (defined $opt{'debug'});
}
else {
  $opt{'debug'} = defined $opt{'debug'};
}

# Find the default site rule directory, also setup debugging and other M::SA bits
my $SA = Mail::SpamAssassin->new({
  debug => $opt{'debug'},
  local_tests_only => 1,
  dont_copy_prefs => 1,

  PREFIX          => $PREFIX,
  DEF_RULES_DIR   => $DEF_RULES_DIR,
  LOCAL_RULES_DIR => $LOCAL_RULES_DIR,
  LOCAL_STATE_DIR => $LOCAL_STATE_DIR,
});

if (defined $opt{'updatedir'}) {
  $opt{'updatedir'} = untaint_file_path($opt{'updatedir'});
}
else {
  $opt{'updatedir'} = $SA->sed_path('__local_state_dir__/__version__');
}


# check only disabled gpg
# https://issues.apache.org/SpamAssassin/show_bug.cgi?id=5854
if ( defined $opt{'checkonly'}) {
  $GPG_ENABLED=0;
  dbg("gpg: Disabling gpg requirement due to checkonly flag.");
}


dbg("generic: sa-update version $VERSION");
dbg("generic: using update directory: $opt{'updatedir'}");

# doesn't really display useful things for this script, but we do want
# a module/version listing, etc. sa-update may be used for older versions
# of SA that don't include this function, so eval around it.
eval { $SA->debug_diagnostics(); 1; };

$SA->finish();

# untaint the command-line args; since the root user supplied these, and
# we're not a setuid script, we trust them
foreach my $optkey (keys %opt) {
  next if ref $opt{$optkey};
  untaint_var(\$opt{$optkey});
}

##############################################################################

# Deal with gpg-related options

if (@{$opt{'gpgkey'}}) {
  $GPG_ENABLED = 1;
  foreach my $key (@{$opt{'gpgkey'}}) {
    unless (is_valid_gpg_key_id($key)) {
      dbg("gpg: invalid gpgkey parameter $key");
      next;
    }
    $key = uc $key;
    dbg("gpg: adding key id $key");
    $valid_GPG{$key} = 1;
  }
}

if (defined $opt{'gpgkeyfile'}) {
  $GPG_ENABLED = 1;
  open(GPG, $opt{'gpgkeyfile'})
    or die "cannot open $opt{'gpgkeyfile'} for reading: $!\n";

  dbg("gpg: reading in gpgfile ".$opt{'gpgkeyfile'});
  while(my $key = <GPG>) {
    chomp $key;

    $key =~ s/#.*$//;   # remove comments
    $key =~ s/^\s+//;   # remove leading whitespace
    $key =~ s/\s+$//;   # remove tailing whitespace
    next if $key eq ''; # skip empty lines

    unless (is_valid_gpg_key_id($key)) {
      dbg("gpg: invalid key id $key");
      next;
    }
    $key = uc $key;
    dbg("gpg: adding key id $key");
    $valid_GPG{$key} = 1;
  }
  close(GPG) or die "cannot close $opt{'gpgkeyfile'}: $!";
}

# At this point, we need to know where GPG is ...
my $GPGPath;
if ($GPG_ENABLED || $opt{'import'}) {
  # find GPG in the PATH
  # bug 4958: for *NIX it's "gpg", in Windows it's "gpg.exe"
  $GPGPath = 'gpg' . $Config{_exe};
  dbg("gpg: Searching for '$GPGPath'");

  if ($GPGPath = Mail::SpamAssassin::Util::find_executable_in_env_path($GPGPath)) {
    dbg("gpg: found $GPGPath");

    # bug 5030: if GPGPath has a space, put it in quotes
    if ($GPGPath =~ / /) {
      $GPGPath =~ s/"/\\"/g;
      $GPGPath = qq/"$GPGPath"/;
      dbg("gpg: path changed to $GPGPath");
    }
  }
  else {
    die "error: gpg required but not found!  It is not recommended, but you can use \"sa-update\" with the --no-gpg to skip the verification. \n";
  }

  # GPG was found, and we've been asked to import a key only
  if ( $opt{'import'} ) {
    my $ex = import_gpg_key($opt{'import'});
    exit $ex;
  }

  # does the sa-update keyring exist?  if not, import it
  if(!-f File::Spec->catfile($opt{'gpghomedir'}, "trustdb.gpg")) {
    import_default_keyring();
    # attempt to continue even if this fails, anyway
  }

  # specify which keys are trusted
  dbg("gpg: release trusted key id list: ".join(" ", keys %valid_GPG));

  # convert fingerprint gpg ids to keyids
  foreach (keys %valid_GPG) {
    my $id = substr $_, -8;
    $valid_GPG{$id} = 1;
  }
}

##############################################################################

# Deal with channel-related options
if (defined $opt{'channel'} && scalar @{$opt{'channel'}} > 0) {
  @channels = @{$opt{'channel'}};
}
if (defined $opt{'channelfile'}) {
  open(CHAN, $opt{'channelfile'})
    or die "cannot open $opt{'channelfile'} for reading: $!\n";

  dbg("channel: reading in channelfile ".$opt{'channelfile'});
  @channels = ();
  while(my $chan = <CHAN>) {
    chomp $chan;

    $chan =~ s/#.*$//;   # remove comments
    $chan =~ s/^\s+//;   # remove leading whitespace
    $chan =~ s/\s+$//;   # remove tailing whitespace
    next if $chan eq ''; # skip empty lines

    $chan = lc $chan;
    dbg("channel: adding $chan");
    push(@channels, $chan);
  }
  close(CHAN) or die "cannot close $opt{'channelfile'}: $!";
}

# untaint the channel listing
for(my $ind = 0; $ind < @channels; $ind++) {
  local($1); # bug 5061: prevent random taint flagging of $1
  if ($channels[$ind] =~ /^([a-zA-Z0-9._-]+)$/) {
    untaint_var(\$channels[$ind]);
  }
  else {
    dbg("channel: skipping invalid channel: $channels[$ind]");
    splice @channels, $ind, 1;
    $ind--; # the next element takes the place of the deleted one
  }
}

my ($res, $ua);

if ($opt{'install'}) {
  if (scalar @channels > 1) {
    die "fatal: --install cannot be used with multiple --channel switches.\n";
  }

} else {
  $res = Net::DNS::Resolver->new();
  $res->force_v4(1)  if $have_inet4 &&
                        $opt{'force_pf'} && $opt{'force_pf'} eq 'inet';
}

# Generate a temporary file to put channel content in for later use ...
my ($content_file, $tfh) = secure_tmpfile();
$tfh
  or die "fatal: could not create temporary channel content file: $!\n";
close $tfh
  or die "cannot close temporary channel content file $content_file: $!";
undef $tfh;

my $lint_failures = 0;
my $channel_failures = 0;
my $channel_successes = 0;

# Use a temporary directory for all update channels
my $UPDTmp;

# we only need to lint the site pre files once
my $site_pre_linted = 0;

# Go ahead and loop through all of the channels
foreach my $channel (@channels) {
  dbg("channel: attempting channel $channel");
  my %preserve_files;

  # Convert the channel to a nice-for-filesystem version
  my $nicechannel = $channel;
  $nicechannel =~ tr/A-Za-z0-9-/_/cs;

  my $UPDDir = File::Spec->catfile($opt{'updatedir'}, $nicechannel);
  my $CFFile = "$UPDDir.cf";
  my $PREFile = "$UPDDir.pre";

  if (-d $UPDDir) {
    dbg("channel: using existing directory $UPDDir");
  } else {
    # create the dir, if it doesn't exist
    dbg("channel: creating directory $UPDDir");
    mkpath([$UPDDir], 0, 0777)
      or die "channel: cannot create channel directory $UPDDir: $!\n";
  }
  dbg("channel: channel cf file $CFFile");
  dbg("channel: channel pre file $PREFile");

  my $instfile;
  if ($opt{'install'}) {
    $instfile = $opt{'install'};
    dbg("channel: installing from file $instfile");
  }

  my($mirby, $mirby_force_reload, $mirby_file_is_ok);
  my $mirby_path = File::Spec->catfile($UPDDir, "MIRRORED.BY");

  # try to read metadata from channel.cf file
  my $currentV = -1;
  if (!open(CF, $CFFile)) {
    dbg("channel: error opening file %s: %s",
        $CFFile, $!)  unless $! == ENOENT;
  } else {
    while(<CF>) {
      local($1,$2);
      last unless /^# UPDATE\s+([A-Za-z]+)\s+(\S+)/;
      my($type, $value) = (lc $1,$2);

      dbg("channel: metadata $type = $value, from file $CFFile");

      if ($type eq 'version') {
        $value =~ /^(\d+)/;
        $currentV = $1;
      }
    }
    close(CF) or die "cannot close $CFFile: $!";
  }

  # obtain a version number which should be installed
  my $newV;
  if ($instfile) {
    # the /.*/ ensures we use the 3-digit string nearest to the end of string,
    # otherwise we might pick up something from the middle of the directory path
    local($1);
    if ($instfile !~ /(?:.*\D|^)(\d{3,})/) {        
      # this is a requirement
      die "channel: $channel: --install file $instfile does not contain a 3-digit version number!\n";
    }
    $newV = $1;

    if ( defined $opt{'checkonly'} ) {            
      dbg("channel: $channel: --install and --checkonly, claiming update available");
      $channel_successes++;
      next;
    }

  } else {  # not an install file, get the latest version number from network
    # Setup the channel version DNS query
    my $DNSQ = "$RevSAVersion.$channel";

    my $dnsV = join(' ', do_dns_query($DNSQ));
    local($1);
    if (defined $dnsV && $dnsV =~ /^(\d+)/) {
      $newV = untaint_var($1) if (!defined $newV || $1 > $newV);
      dbg("dns: $DNSQ => $dnsV, parsed as $1");
    }

    # Not getting a response isn't a failure, there may just not be any updates
    # for this SA version yet.
    if (!defined $newV) {
      my @mirs = do_dns_query("mirrors.$channel");
      if (defined shift @mirs) {
        dbg("channel: no updates available, skipping channel");
      } else {
        channel_failed("channel '$channel': no 'mirrors.$channel' record found");
      }
      next;
    }

    # If this channel hasn't been installed before, or it's out of date,
    # keep going.  Otherwise, skip it.
    if ($currentV >= $newV) {
      dbg("channel: current version is $currentV, new version is $newV, ".
          "skipping channel");
      next;
    }

    print "Update available for channel $channel: $currentV -> $newV\n"  if $opt{'verbose'};

    # If we are only checking for update availability, exit now
    if ( defined $opt{'checkonly'} ) {            
      dbg("channel: $channel: update available, not downloading ".
          "in checkonly mode");
      $channel_successes++;
      next;
    }

  }

  # we need a directory we control that we can use to avoid loading any rules
  # when we lint the site pre files, we might as well use the channel temp dir
  dbg("channel: preparing temp directory for new channel");
  if (!$UPDTmp) {
    $UPDTmp = secure_tmpdir();
    dbg("channel: created tmp directory $UPDTmp");
  }
  else {
    dbg("channel: using existing tmp directory $UPDTmp");
    if (!clean_update_dir($UPDTmp)) {
      die "channel: attempt to clean update temp dir failed, aborting";
    }
  }

  # lint the site pre files (that will be used when lint checking the channel)
  # before downloading the channel update
  unless ($site_pre_linted) {
    dbg("generic: lint checking site pre files once before attempting channel updates");
    unless (lint_check_dir(File::Spec->catfile($UPDTmp, "doesnotexist"))) {
      dbg("generic: lint of site pre files failed, cannot continue"); 
      print "Lint of site pre files failed, cannot continue\n"  if $opt{'verbose'};
      $lint_failures++;
      last;
    }
    dbg("generic: lint check of site pre files succeeded, continuing with channel updates");
    $site_pre_linted = 1;
  }

  my $content;
  my $SHA512;
  my $SHA256;
  my $GPG;

  if ($instfile) {
    dbg("channel: using --install files $instfile\{,.sha256,.sha512,.asc\}");
    $content = read_install_file($instfile);
    if ( -s "$instfile.sha512" ) { $SHA512 = read_install_file($instfile.".sha512"); }
    if ( -s "$instfile.sha256" ) { $SHA256 = read_install_file($instfile.".sha256"); }
    $GPG = read_install_file($instfile.".asc") if $GPG_ENABLED;

  } else {  # not an install file, obtain fresh rules from network
    dbg("channel: protocol family available: %s%s",
        join(',', $have_inet4 ? 'inet'  : (),
                  $have_inet6 ? 'inet6' : ()),
        $opt{'force_pf'} ? '; force '.$opt{'force_pf'} : '' );

    # test if the MIRRORED.BY file for this channel exists,
    # is nonempty, and is reasonably fresh

    my(@mirr_stat_list) = stat($mirby_path);
    if (!@mirr_stat_list) {
      if ($! == ENOENT) {
        dbg("channel: no mirror file %s, will fetch it", $mirby_path);
      } else {
        # protection error, misconfiguration, file system error, ...
        warn "error: error accessing mirrors file $mirby_path: $!\n";
        channel_failed("channel '$channel': error accessing mirrors file $mirby_path: $!");
        next;
      }
    } elsif (-z _) {
      dbg("channel: file %s is empty, refreshing mirrors file", $mirby_path);
      $mirby_force_reload = 1;
    } elsif ($opt{'refreshmirrors'}) {
      dbg("channel: --refreshmirrors used, forcing mirrors file refresh ".
          "on channel $channel");
      $mirby_force_reload = 1;
    } elsif (time - $mirr_stat_list[9] > $IGNORE_MIRBY_OLDER_THAN) {
      dbg("channel: file %s is too old, refreshing mirrors file", $mirby_path);
      $mirby_file_is_ok = 1;  # mirrors file seems fine, but is old
      $mirby_force_reload = 1;
    } else {
      # mirror file $mirby_path exists, is nonempty, and is reasonably fresh
      $mirby_file_is_ok = 1;
    }

    if (!$mirby_file_is_ok || $mirby_force_reload) {
      # fetch a fresh list of mirrors
      dbg("channel: DNS lookup on mirrors.$channel");
      my @mirrors = do_dns_query("mirrors.$channel");
      unless (@mirrors) {
        warn "error: no mirror data available for channel $channel\n";
        channel_failed("channel '$channel': MIRRORED.BY file URL was not in DNS");
        next;
      }
      foreach my $mirror (@mirrors) {
        my ($result_fname, $http_ok) =
          http_get($mirror, $UPDDir, $mirby_path, $mirby_force_reload);
        if (!$http_ok) {
          dbg("channel: no mirror data available for channel %s from %s",
              $channel, $mirror);
          next;
        }
        $mirby = read_content($result_fname, 0);
        if ($mirby) {
          dbg("channel: MIRRORED.BY file for channel %s retrieved", $channel);
          $mirby_file_is_ok = 1;
          $mirby_force_reload = 0;
          $preserve_files{$mirby_path} = 1;

          # set file creation time to now, otherwise we'll keep refreshing
          # (N.B.: curl preserves time of a downloaded file)
          my $now = time;
          utime($now, $now, $mirby_path)
            or warn "error: error setting creation time of $mirby_path: $!\n";

          last;
        }
      }
      if ($mirby_force_reload) {  # not refreshed?
        warn "error: unable to refresh mirrors file for channel $channel, ".
             "using old file\n";
      }
    }

    if (!$mirby_file_is_ok) {
      warn "error: no mirror data available for channel $channel\n";
      channel_failed("channel '$channel': MIRRORED.BY file contents were missing");
      next;
    } elsif ($mirby) {
      # file contents already in memory, no need to read it from a file
    } elsif (!open(MIRBY, $mirby_path)) {
      warn "error: error opening mirrors file $mirby_path: $!\n";
      channel_failed("channel '$channel': error opening mirrors file $mirby_path: $!");
      next;
    } else {
      dbg("channel: reading MIRRORED.BY file %s", $mirby_path);
      { local $/ = undef; $mirby = <MIRBY> }
      close(MIRBY) or die "cannot close $mirby_path: $!";
      $preserve_files{$mirby_path} = 1;
    }

    # Parse the list of mirrors
    dbg("channel: parsing MIRRORED.BY file for channel %s", $channel);
    my %mirrors;
    my @mirrors = split(/^/, $mirby);
    while(my $mirror = shift @mirrors) {
      chomp $mirror;

      $mirror =~ s/#.*$//;   # remove comments
      $mirror =~ s/^\s+//;   # remove leading whitespace
      $mirror =~ s/\s+$//;   # remove tailing whitespace
      next if $mirror eq ''; # skip empty lines

      # We only support HTTP (and HTTPS) right now
      if ($mirror !~ m{^https?://}i) {
        dbg("channel: skipping non-HTTP mirror: $mirror");
        next;
      }

      dbg("channel: found mirror $mirror");

      my @data;
      ($mirror,@data) = split(/\s+/, $mirror);
      $mirror =~ s{/+\z}{};  # http://example.com/updates/ -> .../updates
      $mirrors{$mirror}->{weight} = 1;
      foreach (@data) {
        my($k,$v) = split(/=/, $_, 2);
        $mirrors{$mirror}->{$k} = $v;
      }
    }

    unless (%mirrors) {
      warn "error: no mirrors available for channel $channel\n";
      channel_failed("channel '$channel': no mirrors available");
      next;
    }

    # Now that we've laid the foundation, go grab the appropriate files
    #
    my $path_content = File::Spec->catfile($UPDDir, "$newV.tar.gz");
    my $path_sha512 =  File::Spec->catfile($UPDDir, "$newV.tar.gz.sha512");
    my $path_sha256 =  File::Spec->catfile($UPDDir, "$newV.tar.gz.sha256");
    my $path_asc =     File::Spec->catfile($UPDDir, "$newV.tar.gz.asc");

    # Loop through all available mirrors, choose from them randomly
    # if any get fails, choose another mirror to retry _all_ files again
    # sleep few seconds on retries
    my $download_ok = 0;
    while (my $mirror = choose_mirror(\%mirrors)) {
      my ($result_fname, $http_ok);
      # Grab the data hash for this mirror, then remove it from the list
      my $mirror_info = $mirrors{$mirror};
      delete $mirrors{$mirror};

      # Make sure we start without files from existing tries
      unlink($path_content);
      unlink($path_sha512);
      unlink($path_sha256);
      unlink($path_asc);

      my $sleep_sec = 2;

      if (!check_mirror_af($mirror)) {
        my @my_af;
        push(@my_af, "IPv4") if $use_inet4;
        push(@my_af, "IPv6") if $use_inet6;
        push(@my_af, "no IP service") if !@my_af;
        dbg("reject mirror %s: no common address family (%s), %s",
            $mirror, join(" ", @my_af),
            %mirrors ? "sleeping $sleep_sec sec and trying next" : 'no mirrors left');
        sleep($sleep_sec) if %mirrors;
        next;
      }

      dbg("channel: selected mirror $mirror");

      # Actual archive file
      ($result_fname, $http_ok) = http_get("$mirror/$newV.tar.gz", $UPDDir);
      if (!$http_ok || !-s $result_fname) {
        dbg("channel: failed to get $newV.tar.gz from mirror $mirror, %s",
          %mirrors ? "sleeping $sleep_sec sec and trying next" : 'no mirrors left');
        sleep($sleep_sec) if %mirrors;
        next;
      }

      # SHA512 of the archive file
      ($result_fname, $http_ok) = http_get("$mirror/$newV.tar.gz.sha512", $UPDDir);
      if (!$http_ok || !-s $result_fname) {
        # If not found, try SHA256 instead
        ($result_fname, $http_ok) = http_get("$mirror/$newV.tar.gz.sha256", $UPDDir);
        if (!$http_ok || !-s $result_fname) {
          dbg("channel: No sha512 or sha256 file available from $mirror, %s",
            %mirrors ? "sleeping $sleep_sec sec and trying next" : 'no mirrors left');
          sleep($sleep_sec) if %mirrors;
          next;
        }
      }

      # if GPG is enabled, the GPG detached signature of the archive file
      if ($GPG_ENABLED) {
        ($result_fname, $http_ok) = http_get("$mirror/$newV.tar.gz.asc", $UPDDir);
        if (!$http_ok || !-s $result_fname) {
          dbg("channel: No GPG/asc file available from $mirror, %s",
            %mirrors ? "sleeping $sleep_sec sec and trying next" : 'no mirrors left');
          sleep($sleep_sec) if %mirrors;
          next;
        }
      }

      $download_ok = 1;
      last;
    }

    if ($download_ok) {
      if (-s $path_content) {
        $content = read_content($path_content, 1); # binary
        $preserve_files{$path_content} = 1;
      }
      if (-s $path_sha512) {
        $SHA512 = read_content($path_sha512, 0); # ascii
        $preserve_files{$path_sha512} = 1;
      }
      if (-s $path_sha256) {
        $SHA256 = read_content($path_sha256, 0); # ascii
        $preserve_files{$path_sha256} = 1;
      }
      if (-s $path_asc) {
        $GPG = read_content($path_asc, 0); # ascii
        $preserve_files{$path_asc} = 1;
      }
    }
  }

  unless ($content && ( $SHA512 || $SHA256 ) && (!$GPG_ENABLED || $GPG)) {
    channel_failed("channel '$channel': could not find working mirror");
    next;
  }

  if ( $SHA512 ) {
    # Validate the SHA512 signature
    { local($1);
      $SHA512 =~ /^([a-fA-F0-9]{128})\b/;
      $SHA512 = defined $1 ? lc($1) : 'INVALID';
    }
    my $digest = sha512_hex($content);
    dbg("sha512: verification wanted: $SHA512");
    dbg("sha512: verification result: $digest");
    unless ($digest eq $SHA512) {
      channel_failed("channel '$channel': SHA512 verification failed");
      next;
    }
  }

  if ( $SHA256 ) {
    # Validate the SHA256 signature
    { local($1);
      $SHA256 =~ /^([a-fA-F0-9]{64})\b/;
      $SHA256 = defined $1 ? lc($1) : 'INVALID';
    }
    my $digest = sha256_hex($content);
    dbg("sha256: verification wanted: $SHA256");
    dbg("sha256: verification result: $digest");
    unless ($digest eq $SHA256) {
      channel_failed("channel '$channel': SHA256 verification failed");
      next;
    }
  }

  # Write the content out to a temp file for GPG/Archive::Tar interaction
  dbg("channel: populating temp content file %s", $content_file);
  open(TMP, ">$content_file")
    or die "fatal: cannot create content temp file $content_file: $!\n";
  binmode TMP
    or die "fatal: cannot set binmode on content temp file $content_file: $!\n";
  print TMP $content
    or die "fatal: cannot write to content temp file $content_file: $!\n";
  close TMP
    or die "fatal: cannot close content temp file $content_file: $!\n";

  # to sign  : gpg -bas file
  # to verify: gpg --verify --batch --no-tty --status-fd=1 -q --logger-fd=1 file.asc file
  # look for : [GNUPG:] GOODSIG 6C55397824F434CE updates.spamassassin.org [...]
  #            [GNUPG:] VALIDSIG 0C2B1D7175B852C64B3CDC716C55397824F434CE [...]
  #            [GNUPG:] NO_PUBKEY 6C55397824F434CE
  if ($GPG) {
    dbg("gpg: populating temp signature file");
    my $sig_file;
    ($sig_file, $tfh) = secure_tmpfile();
    $tfh
      or die "fatal: couldn't create temp file for GPG signature: $!\n";
    binmode $tfh
      or die "fatal: cannot set binmode on temp file for GPG signature: $!\n";
    print $tfh $GPG
      or die "fatal: cannot write temp file for GPG signature: $!\n";
    close $tfh
      or die "fatal: cannot close temp file for GPG signature: $!\n";
    undef $tfh;

    dbg("gpg: calling gpg");

    my $gpghome = interpolate_gpghomedir();

    # TODO: we could also use "--keyserver pgp.mit.edu" or similar,
    # to autodownload missing keys...
    my $CMD = "$GPGPath $gpghome --verify --batch ".
        "--no-tty --status-fd=1 -q --logger-fd=1";

    unless (open(CMD, "$CMD $sig_file $content_file|")) {
      unlink $sig_file or warn "error: cannot unlink $sig_file: $!\n";
      die "fatal: couldn't execute $GPGPath: $!\n";
    }

    # Determine the fate of the signature
    my $signer = '';
    my $missingkeys = '';
    while(my $GNUPG = <CMD>) {
      chop $GNUPG;
      dbg ("gpg: $GNUPG");

      if ($GNUPG =~ /^gpg: fatal:/) {
        warn $GNUPG."\n";        # report bad news
      }

      local($1);
      if ($GNUPG =~ /^\Q[GNUPG:]\E NO_PUBKEY \S+(\S{8})$/) {
        $missingkeys .= $1." ";
      }

      next unless ($GNUPG =~ /^\Q[GNUPG:]\E (?:VALID|GOOD)SIG (\S{8,40})/);
      my $key = $1;

      # we want either a keyid (8) or a fingerprint (40)
      if (length $key > 8 && length $key < 40) {
        substr($key, 8) = '';
      }

      # use the longest match we can find
      $signer = $key if length $key > length $signer;
    }

    my $errno = 0;  close CMD or $errno = $!;
    proc_status_ok($?,$errno)
      or warn("gpg: process '$GPGPath' finished: ".
              exit_status_str($?,$errno)."\n");

    unlink $sig_file or warn "cannot unlink $sig_file: $!\n";

    if ($signer) {
      my $keyid = substr $signer, -8;
      dbg("gpg: found signature made by key $signer");
      if (exists $valid_GPG{$signer}) {
	dbg("gpg: key id $signer is release trusted");
      }
      elsif (exists $valid_GPG{$keyid}) {
	dbg("gpg: key id $keyid is release trusted");
      }
      else {
	dbg("gpg: key id $keyid is not release trusted");
	$signer = undef;
      }
    }

    unless ($signer) {
      warn "error: GPG validation failed!\n";

      if ($missingkeys) {

        warn <<ENDOFVALIDATIONERR;
The update downloaded successfully, but it was not signed with a trusted GPG
key.  Instead, it was signed with the following keys:

    $missingkeys

Perhaps you need to import the channel's GPG key?  For example:

    wget https://spamassassin.apache.org/updates/GPG.KEY
    sa-update --import GPG.KEY

ENDOFVALIDATIONERR

      } else {

        warn <<ENDOFVALIDATIONERR;
The update downloaded successfully, but the GPG signature verification
failed.
ENDOFVALIDATIONERR

      }

      channel_failed("channel '$channel': GPG validation failed");
      next;
    }
  }

  # OK, we're all validated at this point, install the new version
  dbg("channel: file verification passed, testing update");

  dbg("channel: extracting archive");
  if (!taint_safe_archive_extract($UPDTmp, $content_file)) {
    channel_failed("channel '$channel': archive extraction failed");
    next;
  }

  # check --lint

  if (!lint_check_dir($UPDTmp)) {
    channel_failed("channel '$channel': lint check of update failed");
    next;
  }

  dbg("channel: lint check succeeded, extracting archive to $UPDDir...");

  my @totry = (
    {
      'try' => sub {
        if (-d $UPDDir) {
          # ok that worked, too late to stop now!   At this stage, if there are
          # errors, we have to attempt to carry on regardless, since we've already
          # blown away the old ruleset.
          dbg("channel: point of no return for existing $UPDDir");

          # clean out the previous channel files, if they exist
          if (-f $PREFile && ! unlink $PREFile ) {
            warn("channel: attempt to rm channel pre file failed, attempting to continue anyway: $!");
          }
          if (-f $CFFile && ! unlink $CFFile ) {
            warn("channel: attempt to rm channel cf file failed, attempting to continue anyway: $!");
          }
          if (!clean_update_dir($UPDDir, \%preserve_files)) {
            warn("channel: attempt to rm channel directory failed, attempting to continue anyway");
          }
        }
        else {
          # create the dir, if it doesn't exist
          dbg("channel: creating $UPDDir");
          mkpath([$UPDDir], 0, 0777)
            or die "channel: cannot create channel directory $UPDDir: $!\n";

          # ok, that test worked.  it's now likely that the .cf's will
          # similarly be ok to rename, too.   Too late to stop from here on
          dbg("channel: point of no return for new $UPDDir");
        }

	return 1;
      },

      'rollback' => sub {
	dbg("channel: attempting to remove the channel and update directories");

        # bug 4941: try to get rid of the empty directories to avoid leaving SA
        # with no rules.
        rmdir $UPDDir
          or dbg("channel: error removing dir %s: %s", $UPDDir, $!);
        rmdir $opt{'updatedir'}
          or dbg("channel: error removing dir %s: %s", $opt{'updatedir'}, $!);
      },
    },

    {
      'try' => sub {
        # extract the files again for the last time
        if (!taint_safe_archive_extract($UPDDir, $content_file)) {
          channel_failed("channel '$channel': archive extraction failed");
	  return 0;
        }

	return 1;
      },

      'rollback' => sub {
	dbg("channel: attempting to clean out the channel update directory");

        # bug 4941: try to get rid of the empty directories to avoid leaving SA
        # with no rules.
        if (!clean_update_dir($UPDDir, \%preserve_files)) {
          warn "channel: attempt to clean up failed extraction also failed!\n";
        }
      },
    },

    {
      'try' => sub {
        if ($instfile) {
          dbg("channel: not creating MIRRORED.BY file due to --install");
          return 1;
        }

      # The $mirby_path file should have already been created by http_get
      # and preserved past clean_update_dir()
      #
      # # Write out the mirby file, not fatal if it doesn't work
      # dbg("channel: creating MIRRORED.BY file");
      # open(MBY, ">$mirby_path")
      #   or die "cannot create a new MIRRORED.BY file: $!\n";
      # print MBY $mirby or die "error writing to $mirby_path: $!";
      # close(MBY) or die "cannot close $mirby_path: $!";

	return 1;
      },

      'rollback' => sub {
      },
    },

    {
      'try' => sub {
        # the last step is to create the .cf and .pre files to include the
        # channel files
        my @CF;
        my @PRE;

        dbg("channel: creating update cf/pre files");

        # Put in whatever metadata we need
        push(@CF, "# UPDATE version $newV\n");


        # Find all of the cf and pre files
        opendir(DIR, $UPDDir)
          or die "fatal: cannot access $UPDDir: $!\n";

        my @files;
        while(my $file = readdir(DIR)) {
	  next if $file eq '.' || $file eq '..';
          untaint_var(\$file);
          my $path = File::Spec->catfile($UPDDir, $file);
          next unless (-f $path);   # shouldn't ever happen
          push(@files, $file);
        }

        # bug 5371: ensure files are sorted
        foreach my $file ( sort @files ) {
          if ($file =~ /\.cf$/) {
            push(@CF, "include $nicechannel/$file\n");
          }
          elsif ($file =~ /\.pre$/) {
            push(@PRE, "include $nicechannel/$file\n");
          }
          else {
            next;
          }

          dbg("channel: adding $file");
        }
        closedir(DIR) or die "cannot close directory $UPDDir: $!";

        # Finally, write out the files to include the update files
        if (!write_channel_file($PREFile, \@PRE)) {
          channel_failed("channel '$channel': writing of $PREFile failed");
          return 0;
        }
        if (!write_channel_file($CFFile, \@CF)) {
          channel_failed("channel '$channel': writing of $CFFile failed");
          return 0;
        }

        # if all went fine, remove the .tar.gz, .sha* and .asc files
        delete_files( grep(!m{/\QMIRRORED.BY\E\z}, keys %preserve_files) );

        $channel_successes++;
        dbg("channel: update complete");

	return 1;
      },

      'rollback' => sub {
      },
    },

  );

  my $error;
  my $eval_stat;
  for(my $elem = 0; $elem <= $#totry; $elem++) {
    my $success;
    eval {
      $success = &{$totry[$elem]->{'try'}}();  1;
    } or do {
      $eval_stat = $@ ne '' ? $@ : "errno=$!";  chomp $eval_stat;
    };
    if (!$success) {
      $error = $elem;
      $eval_stat = "step $elem unsuccessful"  if !defined $eval_stat;
      last;
    }
  }
  if (defined $error) {
    dbg("channel: channel failed, attempting rollback: %s", $eval_stat);
    for(my $elem = $error; $elem >= 0; $elem--) {
      &{$totry[$elem]->{'rollback'}}();
    }
  }
}

##############################################################################

# clean out the temp dir
if ($UPDTmp) {
  dbg("generic: cleaning up temporary directory/files");
  if (!clean_update_dir($UPDTmp)) {
    warn "error: unable to clean out the files in $UPDTmp\n";
  }
}

# clear out the temp files if they still exist
foreach ( $content_file, $UPDTmp ) {
  next unless defined $_;
  my $stat_errn = stat($_) ? 0 : 0+$!;
  next if $stat_errn == ENOENT;

  if ($stat_errn != 0) {
    warn "error: cannot access $_: $!\n";
  }
  elsif (-d _) {
    rmdir $_ or warn "error: cannot remove directory $_: $!\n";
  }
  elsif (-f _) {
    unlink $_ or warn "error: cannot remove file $_: $!\n";
  }
  else {
    warn "error: '$_' isn't a file nor a directory, skipping\n";
  }
}

my $exit;
if ($lint_failures) {
  # 2: lint of site pre files failed, cannot continue
  $exit = 2;
}
elsif (!$channel_failures) {
  # 0: updates found and successfully applied
  # 1: no updates were needed (success with nothing to do)
  $exit = $channel_successes ? 0 : 1;
}
else {  # at least some failures
  # 3: some failures, but at least one channel succeeded
  # 4 or higher means all channels failed
  $exit = $channel_successes ? 3 : 4;
}

dbg("diag: updates complete, exiting with code $exit");

if ($opt{'verbose'}) {
  if (!$exit) {
    if (defined $opt{'checkonly'}) {
      print "Update was available, but not installed in checkonly mode\n";
    } else {
      print "Update was available, and was downloaded and installed successfully\n";
    }
  } elsif ($exit == 1) {
    print "Update finished, no fresh updates were available\n";
  } elsif ($exit == 3) {
    print "Update of at least one channel finished, other updates failed\n";
  } else {
    print "Update failed, exiting with code $exit\n";
  }
}

exit $exit;

##############################################################################

sub read_install_file {
  my ($file) = @_;
  open (IN, "<$file") or die "cannot open $file\n";
  my $all;
  { local $/ = undef; $all = <IN> }
  close IN or die "cannot close $file: $!";
  return $all;
}

##############################################################################

sub write_channel_file {
  my ($filename, $contents) = @_;

  return 1 unless @{$contents};

  if (open(FILE, ">$filename")) {
    print FILE @{$contents} or die "cannot write to $filename: $!";
    close FILE or return 0;
    return 1;
  }

  return 0;
}

##############################################################################

sub channel_failed {
  my $reason = shift;
  warn("$reason, channel failed\n");
  $channel_failures++;
}

##############################################################################

sub taint_safe_archive_extract {
  my $todir = shift;
  my $input = shift;

  my $tfh = IO::Zlib->new($input, "rb");
  $tfh or die "fatal: couldn't read content tmpfile $content_file: $!\n";

  my $tar = Archive::Tar->new($tfh);
  $tar or die "fatal: couldn't open tar archive!\n";

  # stupid Archive::Tar is not natively taint-safe! duh.
  # return $tar->extract();
  # instead, get the file list, untaint, and extract one-by-one.

  my @files = $tar->list_files();
  foreach my $file (@files) {
    next if ($file =~ /^\/$/);  # ignore dirs

    local($1);
    $file =~ /^([-\.\,\/a-zA-Z0-9_]+)$/;
    my $outfname = $1;
    $outfname =~ s/\.\.\//__\//gs;      # avoid "../" dir traversal attacks
    $outfname = File::Spec->catfile($todir, $outfname);

    dbg "extracting: $outfname";
    if (!open OUT, ">".$outfname) {
      warn "error: failed to create $outfname: $!";
      goto failed;
    } else {
      my $content = $tar->get_content($file);

      if ($outfname =~ /\.(?:pre|cf)$/) {
        # replace macros in the update files if it's a .pre or .cf
        local($1);
        $content =~ s/\@\@([^\@]+)\@\@/$MACRO_VALUES{$1} || "\@\@$1\@\@"/ge;

        # also, if --allowplugins is not specified, comment out
        # all loadplugin or tryplugin lines (and others that can load code)
        if ( !$opt{'allowplugins'} ) {
          $content =~ s{^\s*((?:load|try)plugin|\S+_modules?|\S+_factory)\s}
            {#(commented by sa-update, no --allowplugins switch specified)# $1}gmx;
        }

        # other stuff never allowed for safety
        $content =~ s/^\s*(dns_server)/#(commented by sa-update, not allowed)# $1/gm;
      }

      print OUT $content
        or do { warn "error writing to $outfname: $!"; goto failed };
      close OUT
        or do { warn "error: write failed to $outfname: $!"; goto failed }
    }
  }

  return @files;

failed:
  return;       # undef = failure
}

##############################################################################

# Do a generic DNS query
sub do_dns_query {
  my($query, $rr_type) = @_;
  $rr_type = 'TXT'  if !defined $rr_type;

  my $RR = $res->query($query, $rr_type);
  my @result;

  # NOTE:  $rr->rdatastr returns the result encoded in a DNS zone file
  # format, i.e. enclosed in double quotes if a result contains whitespace
  # (or other funny characters), and may use \DDD encoding or \X quoting as
  # per RFC 1035.  Using $rr->txtdata instead avoids this unnecessary encoding
  # step and a need for decoding by a caller, returning an unmodified string.
  # Caveat: in case of multiple RDATA <character-string> fields contained
  # in a resource record (TXT, SPF, HINFO), starting with Net::DNS 0.69
  # the $rr->txtdata in a list context returns these strings as a list.
  # The $rr->txtdata in a scalar context always returns a single string
  # with <character-string> fields joined by a single space character as
  # a separator.  The $rr->txtdata in Net::DNS 0.68 and older returned
  # such joined space-separated string even in a list context.
  #
  # From Net::DNS maintainers (Willem Toorop, NLnet Labs):
  #   I encourage you to use txtdata for getting the values of
  # <version>.updates.spamassassin.org and mirros.updates.spamassassin.org.
  # As those records have only a single rdata field, txtdata would return
  # the same value since Net::DNS 0.34.
  #
  if ($RR) {
    foreach my $rr ($RR->answer) {
      next if !$rr;  # no answer records, only rcode
      next if $rr->type ne $rr_type;
      # scalar context!
      my $text = $rr->UNIVERSAL::can('txtdata') ? $rr->txtdata : $rr->rdatastr;
      push(@result,$text)  if defined $text && $text ne '';
    }
    printf("DNS %s query: %s -> %s\n", $rr_type, $query, join(", ",@result))
      if $opt{'verbose'} && $opt{'verbose'} > 1;
  }
  else {
    dbg("dns: query failed: $query => " . $res->errorstring);
    printf("DNS %s query %s failed: %s\n", $rr_type, $query, $res->errorstring)
      if $opt{'verbose'} && $opt{'verbose'} > 1;
  }

  return @result;
}

##############################################################################

sub init_lwp {
  if ($have_inet6 &&
      (!$opt{'force_pf'} || $opt{'force_pf'} eq 'inet6') &&
      ($io_socket_module_name eq 'IO::Socket::IP' ||
       $io_socket_module_name eq 'IO::Socket::INET6') )
  {
    # LWP module has no support for IPv6.  Use hotpatching,
    # copying IO::Socket::IP or IO::Socket::INET6 to IO::Socket::INET.
    # 'Borrowed' from Net::INET6Glue::INET_is_INET6 :

    printf("http: (lwp) hotpatching IO::Socket::INET by module %s\n",
           $io_socket_module_name) if $opt{'verbose'};
    my $io_socket_module_hash_name = $io_socket_module_name . '::';
    my $io_socket_module_path = $io_socket_module_name . '.pm';
    $io_socket_module_path =~ s{::}{/}g;
    $INC{'IO/Socket/INET.pm'} = $INC{$io_socket_module_path};
    no strict 'refs';
    no warnings 'redefine';
    for ( keys %{$io_socket_module_hash_name} ) {
      ref(my $v = $io_socket_module_hash_name->{$_}) and next;
      *{ 'IO::Socket::INET::'.$_ } =
        \&{ $io_socket_module_hash_name . $_ } if *{$v}{CODE};
    }
  }
  my $ua = LWP::UserAgent->new();
  $ua->agent("sa-update/$VERSION/$SAVersion");
  $ua->timeout(60);      # a good long timeout; 10 is too short for Coral!
  $ua->env_proxy;

# if ($opt{'force_pf'}) {
#   # No longer needed and can be harmful as we don't know which address family
#   # will be picked by the IO::Socket::* module in case of multihomed servers.
#   # The IO::Socket::IP should choose the right protocol family automatically.
#   if ($have_inet4 && $opt{'force_pf'} eq 'inet') {
#     $ua->local_address('0.0.0.0');
#   } elsif ($have_inet6 && $opt{'force_pf'} eq 'inet6') {
#     $ua->local_address('::');
#   }
# }

  return $ua;
}

# Do a GET request via HTTP for a certain URL
# Use the optional time_t value to do an IMS GET
sub http_get_lwp {
  my($url, $ims, $dir) = @_;

  $have_lwp  or die "http_get_lwp: module LWP not available";
  $ua = init_lwp()  if !$ua;

  my $response;
  my $text;

  # retry 3 times; this works better with Coral
  foreach my $retries (1 .. 3) {
    my $request = HTTP::Request->new("GET");
    $request->url($url);

    if (defined $ims) {
      my $str = time2str($ims);
      $request->header('If-Modified-Since', $str);
      dbg("http: IMS GET request, $url, $str");
    }
    else {
      dbg("http: GET request, $url");
    }

    $response = $ua->request($request);

    printf("http: (lwp) %sGET %s, %s\n",
           defined $ims ? 'IMS ' : '',  $url,
           !$response ? '(no response)' : $response->status_line )
           if $opt{'verbose'};

    if ($response->is_success) {
      return $response->content;
    }

    # could be a "304 not modified" or similar.
    # TODO: should use a special return type for "not modified" here
    # instead of overloading the failure return type
    if ($ims && $response->status_line =~ /^3/) {
      return;
    }
    if ($response->status_line =~ /^[45]/) {
      # client error or server error, makes no sense retrying
      return;
    }

    # include the text in the debug output; it's useful in some cases,
    # e.g. proxies that require authentication, diagnosing fascist
    # filtering false positives, etc.
    $text = $response->content;
    $text ||= "(no body)";
    $text =~ s/\s+/ /gs;

    dbg ("http: GET $url request failed, retrying: " .
                    $response->status_line.": ".$text);
  }

  # this should be a user-readable warning without --debug
  warn "http: GET $url request failed: " .
                    $response->status_line.": ".$text."\n";
  return;
}

# Do a GET request via HTTP for a given URL using an external program,
# or fall back to LWP if no external downloading program is available.
# Use the optional time_t value to do an IMS GET
sub http_get {
  my($url, $dir, $suggested_out_fname, $force_reload) = @_;
  my $content;

  my $out_fname;
  if (defined $suggested_out_fname) {
    $out_fname = $suggested_out_fname;
  } else {
    local $1;
    $url =~ m{([^/]*)\z}s;
    my $url_fname = $1;
    $out_fname = File::Spec->catfile($dir, $url_fname);
  }
  $out_fname = untaint_var($out_fname);

  # construct a short filename, relative to a current working directory $dir
  my $out_fname_short = $out_fname;
  $out_fname_short =~ s{^\Q$dir\E/*}{};

  printf("fetching %s\n", $url)  if $opt{'verbose'} && $opt{'verbose'} > 1;
  dbg("http: url: %s", $url);

  my $out_fname_exists = -e $out_fname;
  dbg("http: downloading to: %s, %s", $out_fname,
      !$out_fname_exists ? 'new' : $force_reload ? 'replace' : 'update');

  my($ext_prog, $cmd, @args);
  if (defined $opt{'httputil'}) {
    if ($opt{'httputil'} eq 'lwp') {
      if (!$have_lwp) {
        die "http: module LWP not available, download failed";
      }
    } else {
      $ext_prog = $opt{'httputil'};
      $cmd = Mail::SpamAssassin::Util::find_executable_in_env_path($ext_prog);
      if (!defined $cmd || $cmd eq '') {
        die "http: $ext_prog utility not found, download failed";
      }
    }
  } else {
    foreach my $try_prog ('curl', 'wget', 'fetch') {
      $cmd = Mail::SpamAssassin::Util::find_executable_in_env_path($try_prog);
      if (defined $cmd && $cmd ne '') { $ext_prog = $try_prog; last }
    }
  }

  if (defined $ext_prog && $ext_prog eq 'curl') {
    push(@args, qw(-s -L -O --remote-time -g --max-redirs 2
                   --connect-timeout 30 --max-time 300
                   --fail -o), $out_fname_short);
    push(@args, '-z', $out_fname_short)  if $out_fname_exists && !$force_reload;
    push(@args, '-A', "sa-update/$VERSION/$SAVersion");
  } elsif (defined $ext_prog && $ext_prog eq 'wget') {
    push(@args, qw(-q --max-redirect=2 --tries=3
                   --dns-timeout=20 --connect-timeout=30 --read-timeout=300));
    push(@args, defined $suggested_out_fname ? ('-O', $out_fname_short)
                : $force_reload ? () : ('-N') );
    push(@args, '-U', "sa-update/$VERSION/$SAVersion");
  } elsif (defined $ext_prog && $ext_prog eq 'fetch') {
    push(@args, qw(-q -n -a -w 20 -m -o), $out_fname_short);
    push(@args, '-m')  if $out_fname_exists && !$force_reload;
    push(@args, "--user-agent=sa-update/$VERSION/$SAVersion");
  } elsif ($have_lwp) {
    dbg("http: no external tool for download, fallback to using LWP") if !$opt{'httputil'};
    my $ims;
    if ($out_fname_exists && !$force_reload) {
      my @out_fname_stat = stat($out_fname);
      my $size = $out_fname_stat[7];
      $ims = $out_fname_stat[9]  if $size;  # only if nonempty
    }
    my $out_fh = IO::File->new;
    $out_fh->open($out_fname,'>',0640)
      or die "Cannot create a file $out_fname: $!";
    binmode($out_fh) or die "Can't set binmode on $out_fname: $!";
    $content = http_get_lwp($url, $ims, $dir);
    if (!defined $content) {
      dbg("http: (lwp) no content downloaded from %s", $url);
    } else {
      $out_fh->print($content) or die "Error writing to $out_fname: $!";
    }
    $out_fh->close or die "Error closing file $out_fname: $!";
    return ($out_fname, 1);
  } else {
    die "http: no downloading tool available";
  }

  # only reached if invoking an external program is needed (not lwp)
  if ($opt{'force_pf'}) {
    if    ($opt{'force_pf'} eq 'inet')  { push(@args, '-4') }
    elsif ($opt{'force_pf'} eq 'inet6') { push(@args, '-6') }
  }
  push(@args, '--', untaint_var($url));
  dbg("http: %s", join(' ',$cmd,@args));

  # avoid a system() call, use fork/exec to make sure we avoid invoking a shell
  my $pid;
  eval {
    # use eval, the fork() sometimes signals an error
    # instead of returning a failure status
    $pid = fork(); 1;
  } or do { $@ = "errno=$!" if $@ eq ''; chomp $@; die "http fork: $@" };
  defined $pid or die "spawning $cmd failed: $!";
  if (!$pid) {  # child
    chdir($dir) or die "Can't chdir to $dir: $!";
    $cmd = untaint_file_path($cmd);
    exec {$cmd} ($cmd,@args);
    die "failed to exec $cmd: $!";
  }

  # parent
  waitpid($pid,0);
  my $child_stat = $?;
  dbg("http: process [%s], exit status: %s",
      $pid, exit_status_str($child_stat,0));

  if (!$opt{'verbose'}) {
    # silent
  } elsif ($child_stat == 0) {
    printf("http: (%s) GET %s, success\n", $ext_prog, $url);
  } else {
    printf("http: (%s) GET %s, FAILED, status: %s\n",
           $ext_prog, $url, exit_status_str($child_stat,0));
  }

  return ($out_fname, $child_stat == 0);
}

# Read the content of a (downloaded) file. The subroutine expects a file name
# and a boolean value. The boolean value indicates whether the file should be
# opened in "text" mode or in "binary" mode. Pass 0 for text mode, 1 for binary
# mode. Returns the content of the file as a string.
sub read_content {
  my ($file_name, $binary_mode) = @_;

  my $file = IO::File->new;
  if (!$file->open($file_name, '<')) {
    dbg("read_content: Cannot open file $file_name: $!");
    return undef; ## no critic (ProhibitExplicitReturnUndef)
  }
  if ($binary_mode) {
    binmode $file;
  }

  my($number_of_bytes,$buffer);
  my $content = '';
  while (($number_of_bytes = $file->read($buffer, 16384)) > 0) {
    $content .= $buffer;
  }
  if (!defined $number_of_bytes) {
    dbg("read_content: Error reading from file $file_name: $!");
    return undef; ## no critic (ProhibitExplicitReturnUndef)
  }
  $file->close;

  return $content;
}

##############################################################################

# choose a random integer between 0 and the total weight of all mirrors
# loop through the mirrors from largest to smallest weight
# if random number is < largest weight, use it
# otherwise, random number -= largest, remove mirror from list, try again
# eventually, there'll just be 1 mirror left in $mirrors[0] and it'll be used
# 
sub choose_mirror {
  my($mirror_list) = @_;

  # Sort the mirror list by reverse weight (largest first)
  my @mirrors = sort { $mirror_list->{$b}->{weight} <=> $mirror_list->{$a}->{weight} } keys %{$mirror_list};

  return unless @mirrors;

  if (keys %{$mirror_list} > 1) {
    # Figure out the total weight
    my $weight_total = 0;
    foreach (@mirrors) {
      $weight_total += $mirror_list->{$_}->{weight};
    }

    # Pick a random int
    my $value = int(rand($weight_total));

    # loop until we find the right mirror, or there's only 1 left
    while (@mirrors > 1) {
      if ($value < $mirror_list->{$mirrors[0]}->{weight}) {
        last;
      }
      $value -= $mirror_list->{$mirrors[0]}->{weight};
      shift @mirrors;
    }
  }

  return $mirrors[0];
}

##############################################################################

sub check_mirror_af {
    my ($mirror) = @_;
    # RFC 3986:  scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
    $mirror =~ s{^([a-z][a-z0-9.+-]*)://}{}si;  # strip scheme like http://
    my $scheme = lc($1);
    # No DNS check needed for proxied connections (caveat: no_proxy is not checked)
    my $http_proxy = (defined $ENV{"http_proxy"} && $ENV{"http_proxy"} =~ /\S/) ||
                     (defined $ENV{"HTTP_PROXY"} && $ENV{"HTTP_PROXY"} =~ /\S/);
    my $https_proxy = (defined $ENV{"https_proxy"} && $ENV{"https_proxy"} =~ /\S/) ||
                      (defined $ENV{"HTTPS_PROXY"} && $ENV{"HTTPS_PROXY"} =~ /\S/);
    return 1 if $scheme eq "http" && $http_proxy;
    return 1 if $scheme eq "https" && $https_proxy;
    # No DNS check needed for IPv4 or IPv6 address literal
    return 1 if $use_inet4 && $mirror =~ m{^\d+\.\d+\.\d+\.\d+(?:[:/]|$)};
    return 1 if $use_inet6 && $mirror =~ m{^\[};
    $mirror =~ s{[:/].*}{}s;  # strip all starting from :port or /path
    return 1 if $use_inet4 && do_dns_query($mirror, "A");
    return 1 if $use_inet6 && do_dns_query($mirror, "AAAA");
    return 0;
}

##############################################################################

sub print_version {
  printf("sa-update version %s\n  running on Perl version %s\n", $VERSION, 
         join(".", map( 0+($_||0), ( $] =~ /(\d)\.(\d{3})(\d{3})?/ ))));
}

##############################################################################

sub print_usage_and_exit {
  my ( $message, $exitval ) = @_;
  $exitval ||= 64;
  
  if ($exitval == 0) {
    print_version();
    print("\n");
  }
  pod2usage(
    -verbose => 0,
    -message => $message,
    -exitval => $exitval,
  );
}

##############################################################################

sub usage {
  my ( $verbose, $message ) = @_;
  print "sa-update version $VERSION\n";
  pod2usage( -verbose => $verbose, -message => $message, -exitval => 64 );
}

##############################################################################

sub interpolate_gpghomedir {
  my $gpghome = '';
  if ($opt{'gpghomedir'}) {
    $gpghome = $opt{'gpghomedir'};
    if (am_running_on_windows()) {
      # windows is single-quote-phobic; bug 4958 cmt 7
      $gpghome =~ s/\"/\\\"/gs;
      $gpghome = "--homedir=\"$gpghome\"";
    } else {
      $gpghome =~ s/\'/\\\'/gs;
      $gpghome = "--homedir='$gpghome'";
    }
  }
  return $gpghome;
}

##############################################################################

sub check_gpghomedir {
  unless (-d $opt{gpghomedir}) {
    dbg("gpg: creating gpg home dir ".$opt{gpghomedir});
    # use 0700 to avoid "unsafe permissions" warning
    mkpath([$opt{gpghomedir}], 0, 0700)
      or die "cannot mkpath $opt{gpghomedir}: $!";
  } 
}

##############################################################################
sub import_gpg_key {
  my $keyfile = shift;

  my $gpghome = interpolate_gpghomedir();
  check_gpghomedir();

  my $CMD = "$GPGPath $gpghome --batch ".
      "--no-tty --status-fd=1 -q --logger-fd=1 --import";

  unless (open(CMD, "$CMD $keyfile|")) {
    die "fatal: couldn't execute $GPGPath: $!\n";
  }

  # Determine the fate of the signature
  while(my $GNUPG = <CMD>) {
    chop $GNUPG;
    dbg ("gpg: $GNUPG");

    if ($GNUPG =~ /^gpg: /) {
      warn $GNUPG."\n";        # report bad news
    }

    if ($GNUPG =~ /^IMPORTED /) {
      dbg("gpg: gpg key imported successfully");
    }
  }

  my $errno = 0;  close CMD or $errno = $!;
  proc_status_ok($?,$errno)
    or warn("gpg: process '$CMD' finished: ".exit_status_str($?,$errno)."\n");

  return ($? >> 8);
}

##############################################################################

sub import_default_keyring {
  my $defkey = File::Spec->catfile ($DEF_RULES_DIR, "sa-update-pubkey.txt");
  unless (-f $defkey) {
    dbg("gpg: import of default keyring failed, couldn't find sa-update-pubkey.txt");
    return;
  }

  dbg("gpg: importing default keyring to ".$opt{gpghomedir});
  check_gpghomedir();
  import_gpg_key($defkey);
}

##############################################################################

sub is_valid_gpg_key_id {
  # either a keyid (8 bytes) or a fingerprint (40 bytes)
  return ($_[0] =~ /^[a-fA-F0-9]+$/ && (length $_[0] == 8 || length $_[0] == 40));
}

##############################################################################

sub clean_update_dir {
  my($dir, $preserve_files_ref) = @_;

  dbg("generic: cleaning directory %s", $dir);
  unless (opendir(DIR, $dir)) {
    warn "error: cannot opendir $dir: $!\n";
    dbg("generic: attempt to opendir ($dir) failed");
    return;
  }
  while(my $file = readdir(DIR)) {
    next if $file eq '.' || $file eq '..';

    my $path = File::Spec->catfile($dir, $file);
    if ($preserve_files_ref && $preserve_files_ref->{$path}) {
      dbg("generic: preserving $file");
      next;
    }
    untaint_var(\$path);
    next unless -f $path;

    dbg("generic: unlinking $file");
    if (!unlink $path) {
      warn "error: cannot remove file $path: $!\n";
      closedir(DIR) or die "cannot close directory $dir: $!";
      return;
    }
  }
  closedir(DIR) or die "cannot close directory $dir: $!";
  return 1;
}

sub delete_files {
  my(@filenames) = @_;
  foreach my $path (@filenames) {
    dbg("generic: unlinking $path");
    unlink $path  or warn "error: cannot unlink file $path: $!\n";
  }
  return 1;
}

##############################################################################

sub lint_check_dir {
  my $dir = shift;

  # due to the Logger module's globalness (all M::SA objects share the same
  # Logger setup), we can't change the debug level here to only include
  # "config" or otherwise be more terse. :(
  my $spamtest = new Mail::SpamAssassin( {
    rules_filename       => $dir,
    site_rules_filename  => $LOCAL_RULES_DIR,
    ignore_site_cf_files => 1,
    userprefs_filename   => File::Spec->catfile($dir, "doesnotexist"),

    local_tests_only     => 1,
    dont_copy_prefs      => 1,

    PREFIX               => $PREFIX,
    DEF_RULES_DIR        => $DEF_RULES_DIR,
    LOCAL_RULES_DIR      => $LOCAL_RULES_DIR,
    LOCAL_STATE_DIR      => $LOCAL_STATE_DIR,
  });

  # need to kluge disabling bayes since it may try to expire the DB, and
  # without the proper config it's not going to be good.
  $spamtest->{conf}->{use_bayes} = 0;

  my $res = $spamtest->lint_rules();
  $spamtest->finish();

  return $res == 0;
}

##############################################################################

=head1 NAME

sa-update - automate SpamAssassin rule updates

=head1 SYNOPSIS

B<sa-update> [options]

Options:

  --channel channel       Retrieve updates from this channel
                          Use multiple times for multiple channels
  --channelfile file      Retrieve updates from the channels in the file
  --checkonly             Check for update availability, do not install
  --install filename      Install updates directly from this file. Signature
                          verification will use "file.asc", "file.sha256",
                          and "file.sha512".
  --allowplugins          Allow updates to load plugin code (DANGEROUS)
  --gpgkey key            Trust the key id to sign releases
                          Use multiple times for multiple keys
  --gpgkeyfile file       Trust the key ids in the file to sign releases
  --gpghomedir path       Store the GPG keyring in this directory
  --gpg and --nogpg       Use (or do not use) GPG to verify updates
                          (--gpg is assumed by use of the above
                          --gpgkey and --gpgkeyfile options)
  --import file           Import GPG key(s) from file into sa-update's
                          keyring. Use multiple times for multiple files
  --updatedir path        Directory to place updates, defaults to the
                          SpamAssassin site rules directory
                          (default: /var/lib/spamassassin/3.004004)
  --refreshmirrors        Force the MIRRORED.BY file to be updated
  --httputil util         Force used download tool. By default first found
                          from these is used: curl, wget, fetch, lwp
  -D, --debug [area=n,...]  Print debugging messages
  -v, --verbose           Be verbose, like print updated channel names;
                          For more verbosity specify multiple times
  -V, --version           Print version
  -h, --help              Print usage message
  -4                      Force using the inet protocol (IPv4), not inet6
  -6                      Force using the inet6 protocol (IPv6), not inet

=head1 DESCRIPTION

sa-update automates the process of downloading and installing new rules and
configuration, based on channels.  The default channel is
I<updates.spamassassin.org>, which has updated rules since the previous
release.

Update archives are verified using SHA256 and SHA512 hashes and GPG signatures,
by default.

Note that C<sa-update> will not restart C<spamd> or otherwise cause
a scanner to reload the now-updated ruleset automatically.  Instead,
C<sa-update> is typically used in something like the following manner:

        sa-update && /etc/init.d/spamassassin reload

This works because C<sa-update> only returns an exit status of C<0> if
it has successfully downloaded and installed an updated ruleset.

The program sa-update uses the underlying operating system umask for the
updated rule files it installs.  You may wish to run sa-update from a script
that sets the umask prior to calling sa-update.  For example:

	#!/bin/sh
	umask 022
	sa-update

=head1 OPTIONS

=over 4

=item B<--channel>

sa-update can update multiple channels at the same time.  By default, it will
only access "updates.spamassassin.org", but more channels can be specified via
this option.  If there are multiple additional channels, use the option
multiple times, once per channel.  i.e.:

	sa-update --channel foo.example.com --channel bar.example.com

=item B<--channelfile>

Similar to the B<--channel> option, except specify the additional channels in a
file instead of on the commandline.  This is useful when there are a
lot of additional channels.

=item B<--checkonly>

Only check if an update is available, don't actually download and install it.
The exit code will be C<0> or C<1> as described below.

=item B<--install>

Install updates "offline", from the named tar.gz file, instead of performing
DNS lookups and HTTP invocations.

Files named B<file>.sha256, B<file>.sha512, and B<file>.asc will be used for
the SHA256 and SHA512 hashes and the GPG signature, respectively.  The filename
provided must contain a version number of at least 3 digits, which will be used
as the channel's update version number.

Multiple B<--channel> switches cannot be used with B<--install>.  To install
multiple channels from tarballs, run C<sa-update> multiple times with different
B<--channel> and B<--install> switches, e.g.:

        sa-update --channel foo.example.com --install foo-34958.tgz
        sa-update --channel bar.example.com --install bar-938455.tgz

=item B<--allowplugins>

Allow downloaded updates to activate plugins.  The default is not to
activate plugins; any C<loadplugin> or C<tryplugin> lines will be commented
in the downloaded update rules files.

You should never enable this for 3rd party update channels, since plugins
can execute unrestricted code on your system, even possibly as root! This
includes spamassassin official updates, which have no need to include
running code.

Use --reallyallowplugins option to bypass warnings and make it work.

=item B<--gpg>, B<--nogpg>

sa-update by default will verify update archives by use of SHA256 and SHA512
checksums and GPG signature.  SHA* hashes can verify whether or not the
downloaded archive has been corrupted, but it does not offer any form of
security regarding whether or not the downloaded archive is legitimate
(aka: non-modifed by evildoers).  GPG verification of the archive is used to
solve that problem.

If you wish to skip GPG verification, you can use the B<--nogpg> option
to disable its use.  Use of the following gpgkey-related options will
override B<--nogpg> and keep GPG verification enabled.

Note: Currently, only GPG itself is supported (ie: not PGP).  v1.2 has been
tested, although later versions ought to work as well.

=item B<--gpgkey>

sa-update has the concept of "release trusted" GPG keys.  When an archive is
downloaded and the signature verified, sa-update requires that the signature
be from one of these "release trusted" keys or else verification fails.  This
prevents third parties from manipulating the files on a mirror, for instance,
and signing with their own key.

By default, sa-update trusts key ids C<24F434CE> and C<5244EC45>, which are
the standard SpamAssassin release key and its sub-key.  Use this option to
trust additional keys.  See the B<--import> option for how to add keys to
sa-update's keyring.  For sa-update to use a key it must be in sa-update's
keyring and trusted.

For multiple keys, use the option multiple times.  i.e.:

	sa-update --gpgkey E580B363 --gpgkey 298BC7D0

Note: use of this option automatically enables GPG verification.

=item B<--gpgkeyfile>

Similar to the B<--gpgkey> option, except specify the additional keys in a file
instead of on the commandline.  This is extremely useful when there are a lot
of additional keys that you wish to trust.

=item B<--gpghomedir>

Specify a directory path to use as a storage area for the C<sa-update> GPG
keyring.  By default, this is

        /etc/spamassassin/sa-update-keys

=item B<--import>

Use to import GPG key(s) from a file into the sa-update keyring which is
located in the directory specified by B<--gpghomedir>.  Before using channels
from third party sources, you should use this option to import the GPG key(s)
used by those channels.  You must still use the B<--gpgkey> or B<--gpgkeyfile>
options above to get sa-update to trust imported keys.

To import multiple keys, use the option multiple times.  i.e.:

	sa-update --import channel1-GPG.KEY --import channel2-GPG.KEY

Note: use of this option automatically enables GPG verification.

=item B<--refreshmirrors>

Force the list of sa-update mirrors for each channel, stored in the MIRRORED.BY
file, to be updated.  By default, the MIRRORED.BY file will be cached for up to
7 days after each time it is downloaded.

=item B<--updatedir>

By default, C<sa-update> will use the system-wide rules update directory:

        /var/lib/spamassassin/3.004004

If the updates should be stored in another location, specify it here.

Note that use of this option is not recommended; if you're just using sa-update
to download updated rulesets for a scanner, and sa-update is placing updates in
the wrong directory, you probably need to rebuild SpamAssassin with different
C<Makefile.PL> arguments, instead of overriding sa-update's runtime behaviour.

=item B<-D> [I<area,...>], B<--debug> [I<area,...>]

Produce debugging output.  If no areas are listed, all debugging information is
printed.  Diagnostic output can also be enabled for each area individually;
I<area> is the area of the code to instrument. For example, to produce
diagnostic output on channel, gpg, and http, use:

        sa-update -D channel,gpg,http

For more information about which areas (also known as channels) are
available, please see the documentation at
L<http://wiki.apache.org/spamassassin/DebugChannels>.

=item B<-h>, B<--help>

Print help message and exit.

=item B<-V>, B<--version>

Print sa-update version and exit.

=back

=head1 EXIT CODES

In absence of a --checkonly option, an exit code of C<0> means:
an update was available, and was downloaded and installed successfully.
If --checkonly was specified, an exit code of C<0> means: an update was
available.

An exit code of C<1> means no fresh updates were available.

An exit code of C<2> means that at least one update is available but that a
lint check of the site pre files failed.  The site pre files must pass a lint
check before any updates are attempted.

An exit code of C<3> means that at least one update succeeded while 
other channels failed.  If using sa-compile, you should proceed with it.

An exit code of C<4> or higher, indicates that errors occurred while
attempting to download and extract updates, and no channels were updated.

=head1 SEE ALSO

Mail::SpamAssassin(3)
Mail::SpamAssassin::Conf(3)
spamassassin(1)
spamd(1)
<http://wiki.apache.org/spamassassin/RuleUpdates>

=head1 PREREQUISITES

C<Mail::SpamAssassin>

=head1 BUGS

See <http://issues.apache.org/SpamAssassin/>

=head1 AUTHORS

The Apache SpamAssassin(tm) Project <https://spamassassin.apache.org/>

=head1 LICENSE AND COPYRIGHT

SpamAssassin is distributed under the Apache License, Version 2.0, as
described in the file C<LICENSE> included with the distribution.

Copyright (C) 2015 The Apache Software Foundation


=cut


NineSec Team - 2022
Name
Size
Last Modified
Owner
Permissions
Options
..
--
March 29 2022 11:10:06
root
0755
X11
--
April 08 2025 12:08:09
root
0755
7zr
0.039 KB
August 09 2019 9:00:38
root
0755
GET
15.82 KB
November 29 2019 4:16:23
root
0755
HEAD
15.82 KB
November 29 2019 4:16:23
root
0755
Mail
110.242 KB
August 08 2018 11:12:01
root
0755
POST
15.82 KB
November 29 2019 4:16:23
root
0755
[
58.336 KB
September 05 2019 12:38:40
root
0755
ab
58.336 KB
October 26 2023 3:54:09
root
0755
add-apt-repository
7.241 KB
March 21 2023 4:23:10
root
0755
addpart
30.227 KB
May 30 2023 5:42:35
root
0755
addr2line
34.703 KB
January 02 2024 4:48:50
root
0755
appres
14.305 KB
February 29 2020 7:29:50
root
0755
apropos
55.211 KB
February 25 2020 6:13:45
root
0755
apt
18.383 KB
October 06 2023 11:42:30
root
0755
apt-add-repository
7.241 KB
March 21 2023 4:23:10
root
0755
apt-cache
86.461 KB
October 06 2023 11:42:30
root
0755
apt-cdrom
30.461 KB
October 06 2023 11:42:30
root
0755
apt-config
26.383 KB
October 06 2023 11:42:30
root
0755
apt-extracttemplates
26.469 KB
October 06 2023 11:42:30
root
0755
apt-ftparchive
274.469 KB
October 06 2023 11:42:30
root
0755
apt-get
46.461 KB
October 06 2023 11:42:30
root
0755
apt-key
27.276 KB
October 06 2023 11:42:30
root
0755
apt-mark
62.461 KB
October 06 2023 11:42:30
root
0755
apt-sortpkgs
46.391 KB
October 06 2023 11:42:30
root
0755
ar
66.43 KB
January 02 2024 4:48:50
root
0755
arch
38.367 KB
September 05 2019 12:38:40
root
0755
arpaname
14.297 KB
September 19 2023 1:22:19
root
0755
as
680.297 KB
January 02 2024 4:48:50
root
0755
aspell
166.5 KB
July 22 2021 8:20:06
root
0755
aspell-import
1.996 KB
July 22 2021 8:20:06
root
0755
atobm
14.297 KB
February 29 2020 12:10:29
root
0755
atop
290.258 KB
January 25 2019 5:41:25
root
0755
atopconvert
24.156 KB
January 25 2019 5:41:25
root
0755
atopsar
290.258 KB
January 25 2019 5:41:25
root
0755
awk
158.742 KB
February 16 2020 8:41:09
root
0755
awstats
669.616 KB
February 27 2023 9:27:24
root
0755
b2sum
58.367 KB
September 05 2019 12:38:40
root
0755
base32
42.336 KB
September 05 2019 12:38:40
root
0755
base64
42.336 KB
September 05 2019 12:38:40
root
0755
basename
38.336 KB
September 05 2019 12:38:40
root
0755
bashbug
6.635 KB
April 18 2022 11:14:46
root
0755
bitmap
106.391 KB
February 29 2020 12:10:29
root
0755
bmtoa
14.32 KB
February 29 2020 12:10:29
root
0755
bootctl
62.344 KB
November 21 2023 10:10:21
root
0755
broadwayd
118.383 KB
February 15 2022 6:50:52
root
0755
bsd-from
14.148 KB
March 30 2020 11:26:14
root
0755
bsd-mailx
110.242 KB
August 08 2018 11:12:01
root
0755
bsd-write
14.148 KB
March 30 2020 11:26:14
root
2755
bundle2.7
0.517 KB
July 06 2023 12:57:08
root
0755
bundler2.7
0.519 KB
July 06 2023 12:57:08
root
0755
busctl
86.344 KB
November 21 2023 10:10:21
root
0755
c++
1.1 MB
October 24 2022 11:28:06
root
0755
c++filt
30.266 KB
January 02 2024 4:48:50
root
0755
c89
0.418 KB
May 07 2006 11:28:01
root
0755
c89-gcc
0.418 KB
May 07 2006 11:28:01
root
0755
c99
0.443 KB
April 11 2011 9:54:37
root
0755
c99-gcc
0.443 KB
April 11 2011 9:54:37
root
0755
c_rehash
6.646 KB
January 31 2024 9:45:27
root
0755
cal
36.945 KB
March 30 2020 11:26:14
root
0755
calendar
34.633 KB
March 30 2020 11:26:14
root
0755
captoinfo
90.414 KB
May 16 2023 8:47:48
root
0755
catchsegv
3.253 KB
November 22 2023 2:32:50
root
0755
catman
38.688 KB
February 25 2020 6:13:45
root
0755
cautious-launcher
0.833 KB
October 19 2019 1:05:50
root
0755
cc
1.1 MB
October 24 2022 11:28:06
root
0755
cct
30.148 KB
February 13 2020 4:29:49
root
0755
certbot
0.376 KB
October 26 2020 3:42:45
root
0755
cgi-fcgi
18.148 KB
March 22 2020 4:45:46
root
0755
chage
82.531 KB
November 29 2022 12:53:10
root
2755
chardet3
0.38 KB
December 17 2019 1:31:30
root
0755
chardetect3
0.38 KB
December 17 2019 1:31:30
root
0755
chattr
14.313 KB
June 02 2022 2:59:32
root
0755
chcon
70.336 KB
September 05 2019 12:38:40
root
0755
check-language-support
2.706 KB
September 27 2020 10:07:12
root
0755
checkgid
14.148 KB
October 26 2023 3:54:09
root
0755
chfn
83.07 KB
November 29 2022 12:53:10
root
4755
choom
50.227 KB
May 30 2023 5:42:35
root
0755
chrt
38.227 KB
May 30 2023 5:42:35
root
0755
chsh
51.797 KB
November 29 2022 12:53:10
root
4755
ckbcomp
146.391 KB
March 27 2020 11:10:06
root
0755
cksum
38.336 KB
September 05 2019 12:38:40
root
0755
clear
14.313 KB
May 16 2023 8:47:48
root
0755
clear_console
14.227 KB
April 18 2022 11:14:46
root
0755
cmp
50.094 KB
April 08 2019 2:04:00
root
0755
codepage
13.992 KB
May 09 2019 5:22:51
root
0755
col
18.148 KB
March 30 2020 11:26:14
root
0755
colcrt
14.148 KB
March 30 2020 11:26:14
root
0755
colrm
14.148 KB
March 30 2020 11:26:14
root
0755
column
14.164 KB
March 30 2020 11:26:14
root
0755
comm
42.367 KB
September 05 2019 12:38:40
root
0755
compose
18.054 KB
October 19 2019 1:05:50
root
0755
corelist
14.734 KB
November 23 2023 4:02:19
root
0755
corepack
2.08 MB
March 28 2023 10:16:29
root
0755
cpan
7.964 KB
November 23 2023 4:02:19
root
0755
cpan5.30-x86_64-linux-gnu
7.984 KB
November 23 2023 4:02:19
root
0755
cpp
1.1 MB
October 24 2022 11:28:06
root
0755
cpp-9
1.1 MB
October 24 2022 11:28:06
root
0755
crontab
42.695 KB
February 13 2020 9:44:42
root
2755
cs2cs
26.25 KB
February 13 2020 4:29:49
root
0755
csplit
54.367 KB
September 05 2019 12:38:40
root
0755
ctstat
30.508 KB
February 13 2020 6:21:59
root
0755
curl
234.227 KB
November 29 2023 8:26:14
root
0755
cut
46.367 KB
September 05 2019 12:38:40
root
0755
cvtsudoers
266.695 KB
April 04 2023 1:56:28
root
0755
daemon
236.984 KB
September 05 2019 12:47:28
root
0755
db5.3_archive
14.023 KB
March 21 2020 1:26:50
root
0755
db5.3_checkpoint
14.023 KB
March 21 2020 1:26:50
root
0755
db5.3_deadlock
14.023 KB
March 21 2020 1:26:50
root
0755
db5.3_dump
18.023 KB
March 21 2020 1:26:50
root
0755
db5.3_hotbackup
18.023 KB
March 21 2020 1:26:50
root
0755
db5.3_load
34.023 KB
March 21 2020 1:26:50
root
0755
db5.3_log_verify
14.023 KB
March 21 2020 1:26:50
root
0755
db5.3_printlog
34.023 KB
March 21 2020 1:26:50
root
0755
db5.3_recover
14.023 KB
March 21 2020 1:26:50
root
0755
db5.3_replicate
18.023 KB
March 21 2020 1:26:50
root
0755
db5.3_stat
18.023 KB
March 21 2020 1:26:50
root
0755
db5.3_upgrade
14.023 KB
March 21 2020 1:26:50
root
0755
db5.3_verify
14.023 KB
March 21 2020 1:26:50
root
0755
db_archive
14.023 KB
March 21 2020 1:26:50
root
0755
db_checkpoint
14.023 KB
March 21 2020 1:26:50
root
0755
db_deadlock
14.023 KB
March 21 2020 1:26:50
root
0755
db_dump
18.023 KB
March 21 2020 1:26:50
root
0755
db_hotbackup
18.023 KB
March 21 2020 1:26:50
root
0755
db_load
34.023 KB
March 21 2020 1:26:50
root
0755
db_log_verify
14.023 KB
March 21 2020 1:26:50
root
0755
db_printlog
34.023 KB
March 21 2020 1:26:50
root
0755
db_recover
14.023 KB
March 21 2020 1:26:50
root
0755
db_replicate
18.023 KB
March 21 2020 1:26:50
root
0755
db_stat
18.023 KB
March 21 2020 1:26:50
root
0755
db_upgrade
14.023 KB
March 21 2020 1:26:50
root
0755
db_verify
14.023 KB
March 21 2020 1:26:50
root
0755
dbilogstrip
1.348 KB
July 30 2021 1:22:12
root
0755
dbiprof
6.061 KB
July 30 2021 1:22:12
root
0755
dbiproxy
5.268 KB
July 30 2021 1:22:12
root
0755
dbus-cleanup-sockets
14.141 KB
October 25 2022 3:09:26
root
0755
dbus-daemon
243.195 KB
October 25 2022 3:09:26
root
0755
dbus-monitor
30.141 KB
October 25 2022 3:09:26
root
0755
dbus-run-session
14.141 KB
October 25 2022 3:09:26
root
0755
dbus-send
30.141 KB
October 25 2022 3:09:26
root
0755
dbus-update-activation-environment
14.141 KB
October 25 2022 3:09:26
root
0755
dbus-uuidgen
14.141 KB
October 25 2022 3:09:26
root
0755
deallocvt
14.07 KB
May 09 2019 5:22:51
root
0755
deb-systemd-helper
20.828 KB
June 21 2019 8:56:55
root
0755
deb-systemd-invoke
4.326 KB
June 21 2019 8:56:55
root
0755
debconf
2.792 KB
August 03 2019 12:51:13
root
0755
debconf-apt-progress
11.271 KB
August 03 2019 12:51:13
root
0755
debconf-communicate
0.594 KB
August 03 2019 12:51:13
root
0755
debconf-copydb
1.679 KB
August 03 2019 12:51:13
root
0755
debconf-escape
0.632 KB
August 03 2019 12:51:13
root
0755
debconf-set-selections
2.866 KB
August 03 2019 12:51:13
root
0755
debconf-show
1.784 KB
August 03 2019 12:51:13
root
0755
debian-distro-info
22.891 KB
April 25 2023 3:57:38
root
0755
delaunay
22.383 KB
February 03 2017 11:04:42
root
0755
delpart
30.227 KB
May 30 2023 5:42:35
root
0755
delv
48.391 KB
September 19 2023 1:22:19
root
0755
dh_bash-completion
2.389 KB
January 26 2020 4:42:18
root
0755
dh_perl_dbi
1.04 KB
July 30 2021 1:22:12
root
0755
dh_perl_openssl
1.363 KB
February 03 2020 12:05:01
root
0755
dh_python3-ply
2.281 KB
June 01 2021 5:05:04
root
0755
diff
214.336 KB
April 08 2019 2:04:00
root
0755
diff3
66.211 KB
April 08 2019 2:04:00
root
0755
dig
134.797 KB
September 19 2023 1:22:19
root
0755
dircolors
46.344 KB
September 05 2019 12:38:40
root
0755
dirmngr
569.859 KB
July 04 2022 6:20:36
root
0755
dirmngr-client
119.063 KB
July 04 2022 6:20:36
root
0755
dirname
38.336 KB
September 05 2019 12:38:40
root
0755
distro-info
22.891 KB
April 25 2023 3:57:38
root
0755
dkimproxy-sign
3.896 KB
February 08 2020 7:07:01
root
0755
dkimproxy-verify
2.248 KB
February 08 2020 7:07:01
root
0755
do-release-upgrade
9.987 KB
March 14 2023 1:29:22
root
0755
dotlockfile
22.148 KB
October 11 2019 7:55:06
root
2755
doveadm
637.016 KB
July 07 2022 7:17:38
root
0755
doveconf
180.68 KB
July 07 2022 7:17:38
root
0755
dpkg
302.68 KB
May 25 2022 1:14:20
root
0755
dpkg-architecture
12.551 KB
May 25 2022 1:14:20
root
0755
dpkg-buildflags
7.388 KB
May 25 2022 1:14:20
root
0755
dpkg-buildpackage
29.893 KB
May 25 2022 1:14:20
root
0755
dpkg-checkbuilddeps
7.445 KB
May 25 2022 1:14:20
root
0755
dpkg-deb
174.539 KB
May 25 2022 1:14:20
root
0755
dpkg-distaddfile
2.717 KB
May 25 2022 1:14:20
root
0755
dpkg-divert
150.594 KB
May 25 2022 1:14:20
root
0755
dpkg-genbuildinfo
16.401 KB
May 25 2022 1:14:20
root
0755
dpkg-genchanges
17.082 KB
May 25 2022 1:14:20
root
0755
dpkg-gencontrol
13.866 KB
May 25 2022 1:14:20
root
0755
dpkg-gensymbols
10.646 KB
May 25 2022 1:14:20
root
0755
dpkg-maintscript-helper
20.033 KB
May 25 2022 1:14:20
root
0755
dpkg-mergechangelogs
8.347 KB
May 25 2022 1:14:20
root
0755
dpkg-name
6.63 KB
May 25 2022 1:14:20
root
0755
dpkg-parsechangelog
4.46 KB
May 25 2022 1:14:20
root
0755
dpkg-query
162.586 KB
May 25 2022 1:14:20
root
0755
dpkg-scanpackages
8.494 KB
May 25 2022 1:14:20
root
0755
dpkg-scansources
8.952 KB
May 25 2022 1:14:20
root
0755
dpkg-shlibdeps
30.68 KB
May 25 2022 1:14:20
root
0755
dpkg-source
22.482 KB
May 25 2022 1:14:20
root
0755
dpkg-split
122.484 KB
May 25 2022 1:14:20
root
0755
dpkg-statoverride
62.266 KB
May 25 2022 1:14:20
root
0755
dpkg-trigger
82.492 KB
May 25 2022 1:14:20
root
0755
dpkg-vendor
3.186 KB
May 25 2022 1:14:20
root
0755
dsync
637.016 KB
July 07 2022 7:17:38
root
0755
du
106.367 KB
September 05 2019 12:38:40
root
0755
dumpkeys
174.523 KB
May 09 2019 5:22:51
root
0755
dvipdf
0.983 KB
October 12 2023 3:06:46
root
0755
dwp
1.95 MB
January 02 2024 4:48:50
root
0755
edit
18.054 KB
October 19 2019 1:05:50
root
0755
editor
312.633 KB
April 10 2020 4:12:30
root
0755
editres
72.703 KB
February 29 2020 7:29:50
root
0755
eject
34.844 KB
July 08 2019 10:40:51
root
0755
elfedit
42.672 KB
January 02 2024 4:48:50
root
0755
enc2xs
41.124 KB
November 23 2023 4:02:19
root
0755
encguess
2.994 KB
November 23 2023 4:02:19
root
0755
enchant-2
22.375 KB
November 05 2020 3:13:12
root
0755
enchant-lsmod-2
14.305 KB
November 05 2020 3:13:12
root
0755
env
42.336 KB
September 05 2019 12:38:40
root
0755
envsubst
42.227 KB
March 22 2020 4:42:12
root
0755
eps2eps
0.624 KB
October 12 2023 3:06:46
root
0755
eqn
201.5 KB
March 21 2020 1:27:30
root
0755
erb
4.944 KB
July 06 2023 12:57:08
root
0755
erb2.7
4.944 KB
July 06 2023 12:57:08
root
0755
etckeeper
2.806 KB
March 30 2020 12:24:10
root
0755
ex
1.29 MB
December 07 2023 4:42:49
root
0755
expand
42.367 KB
September 05 2019 12:38:40
root
0755
expiry
30.578 KB
November 29 2022 12:53:10
root
2755
expr
54.336 KB
September 05 2019 12:38:40
root
0755
factor
78.367 KB
September 05 2019 12:38:40
root
0755
fail2ban-client
1.386 KB
March 02 2020 2:20:11
root
0755
fail2ban-python
5.21 MB
November 22 2023 11:22:35
root
0755
fail2ban-regex
1.25 KB
March 02 2020 2:20:11
root
0755
fail2ban-server
1.384 KB
March 02 2020 2:20:11
root
0755
fail2ban-testcases
2.231 KB
March 02 2020 2:20:11
root
0755
faillog
22.594 KB
November 29 2022 12:53:10
root
0755
faked-sysv
34.266 KB
September 07 2019 12:48:18
root
0755
faked-tcp
34.25 KB
September 07 2019 12:48:18
root
0755
fakeroot
3.761 KB
September 07 2019 12:48:18
root
0755
fakeroot-sysv
3.761 KB
September 07 2019 12:48:18
root
0755
fakeroot-tcp
3.756 KB
September 07 2019 12:48:18
root
0755
fallocate
34.227 KB
May 30 2023 5:42:35
root
0755
fc-cache
22.227 KB
April 06 2020 12:09:42
root
0755
fc-cat
18.227 KB
April 06 2020 12:09:42
root
0755
fc-conflist
14.227 KB
April 06 2020 12:09:42
root
0755
fc-list
14.227 KB
April 06 2020 12:09:42
root
0755
fc-match
14.227 KB
April 06 2020 12:09:42
root
0755
fc-pattern
14.227 KB
April 06 2020 12:09:42
root
0755
fc-query
14.227 KB
April 06 2020 12:09:42
root
0755
fc-scan
14.227 KB
April 06 2020 12:09:42
root
0755
fc-validate
14.227 KB
April 06 2020 12:09:42
root
0755
fcgistarter
14.148 KB
October 26 2023 3:54:09
root
0755
file
26.469 KB
January 16 2020 9:39:11
root
0755
fincore
34.273 KB
May 30 2023 5:42:35
root
0755
find
312.656 KB
February 18 2020 2:05:59
root
0755
firefox
2.604 KB
February 06 2024 2:59:08
root
0755
firewall-cmd
115.96 KB
April 04 2020 7:50:39
root
0755
firewall-offline-cmd
104.194 KB
April 04 2020 7:50:39
root
0755
flock
34.305 KB
May 30 2023 5:42:35
root
0755
fmt
46.336 KB
September 05 2019 12:38:40
root
0755
fold
42.336 KB
September 05 2019 12:38:40
root
0755
formail
42.148 KB
November 16 2017 11:42:36
root
0755
free
26.234 KB
October 31 2023 12:35:56
root
0755
from
14.148 KB
March 30 2020 11:26:14
root
0755
ftp
106.695 KB
February 24 2019 2:39:21
root
0755
ftpcount
23.445 KB
February 27 2020 8:34:56
root
0755
ftpdctl
98.273 KB
February 27 2020 8:34:56
root
0755
ftptop
27.164 KB
February 27 2020 8:34:56
root
0755
ftpwho
39.586 KB
February 27 2020 8:34:56
root
0755
funzip
26.148 KB
October 07 2022 7:09:47
root
0755
futurize
0.375 KB
January 25 2023 9:33:14
root
0755
g++
1.1 MB
October 24 2022 11:28:06
root
0755
g++-9
1.1 MB
October 24 2022 11:28:06
root
0755
gapplication
22.383 KB
June 08 2023 4:20:31
root
0755
gcc
1.1 MB
October 24 2022 11:28:06
root
0755
gcc-9
1.1 MB
October 24 2022 11:28:06
root
0755
gcc-ar
34.633 KB
October 24 2022 11:28:06
root
0755
gcc-ar-9
34.633 KB
October 24 2022 11:28:06
root
0755
gcc-nm
34.633 KB
October 24 2022 11:28:06
root
0755
gcc-nm-9
34.633 KB
October 24 2022 11:28:06
root
0755
gcc-ranlib
34.633 KB
October 24 2022 11:28:06
root
0755
gcc-ranlib-9
34.633 KB
October 24 2022 11:28:06
root
0755
gcov
656.234 KB
October 24 2022 11:28:06
root
0755
gcov-9
656.234 KB
October 24 2022 11:28:06
root
0755
gcov-dump
528.133 KB
October 24 2022 11:28:06
root
0755
gcov-dump-9
528.133 KB
October 24 2022 11:28:06
root
0755
gcov-tool
544.195 KB
October 24 2022 11:28:06
root
0755
gcov-tool-9
544.195 KB
October 24 2022 11:28:06
root
0755
gdbus
50.383 KB
June 08 2023 4:20:31
root
0755
gdk-pixbuf-csource
14.328 KB
September 07 2022 5:05:42
root
0755
gdk-pixbuf-pixdata
14.313 KB
September 07 2022 5:05:42
root
0755
gdk-pixbuf-thumbnailer
18.391 KB
September 07 2022 5:05:42
root
0755
gem
0.532 KB
July 06 2023 12:57:08
root
0755
gem2.7
0.532 KB
July 06 2023 12:57:08
root
0755
gen-auth
14.428 KB
February 15 2022 9:03:43
root
0755
gencat
26.367 KB
November 22 2023 2:32:50
root
0755
geod
22.164 KB
February 13 2020 4:29:49
root
0755
geqn
201.5 KB
March 21 2020 1:27:30
root
0755
getconf
34.289 KB
November 22 2023 2:32:50
root
0755
getent
38.648 KB
November 22 2023 2:32:50
root
0755
getkeycodes
14.07 KB
May 09 2019 5:22:51
root
0755
getopt
22.227 KB
May 30 2023 5:42:35
root
0755
gettext
42.227 KB
March 22 2020 4:42:12
root
0755
gettext.sh
4.521 KB
March 22 2020 4:42:12
root
0755
ghostscript
14.148 KB
October 12 2023 3:06:46
root
0755
gie
42.375 KB
February 13 2020 4:29:49
root
0755
ginstall-info
115.242 KB
October 11 2019 12:32:01
root
0755
gio
90.398 KB
June 08 2023 4:20:31
root
0755
gio-querymodules
14.305 KB
June 08 2023 4:20:31
root
0755
git
2.98 MB
April 26 2023 2:52:23
root
0755
git-receive-pack
2.98 MB
April 26 2023 2:52:23
root
0755
git-shell
1.71 MB
April 26 2023 2:52:23
root
0755
git-upload-archive
2.98 MB
April 26 2023 2:52:23
root
0755
git-upload-pack
2.98 MB
April 26 2023 2:52:23
root
0755
glib-compile-schemas
50.375 KB
June 08 2023 4:20:31
root
0755
gnome-www-browser
2.604 KB
February 06 2024 2:59:08
root
0755
gold
2.21 MB
January 02 2024 4:48:50
root
0755
gpasswd
86.391 KB
November 29 2022 12:53:10
root
4755
gpg
1.02 MB
July 04 2022 6:20:36
root
0755
gpg-agent
409.039 KB
July 04 2022 6:20:36
root
0755
gpg-connect-agent
163.156 KB
July 04 2022 6:20:36
root
0755
gpg-wks-server
203.195 KB
July 04 2022 6:20:36
root
0755
gpg-zip
3.434 KB
July 04 2022 6:20:36
root
0755
gpgcompose
874.289 KB
July 04 2022 6:20:36
root
0755
gpgconf
174.656 KB
July 04 2022 6:20:36
root
0755
gpgparsemail
34.375 KB
July 04 2022 6:20:36
root
0755
gpgsm
507.242 KB
July 04 2022 6:20:36
root
0755
gpgsplit
86.758 KB
July 04 2022 6:20:36
root
0755
gpgtar
151.625 KB
July 04 2022 6:20:36
root
0755
gpgv
447.148 KB
July 04 2022 6:20:36
root
0755
gpic
216.344 KB
March 21 2020 1:27:30
root
0755
gprof
99.883 KB
January 02 2024 4:48:50
root
0755
gresource
22.305 KB
June 08 2023 4:20:31
root
0755
groff
121.531 KB
March 21 2020 1:27:30
root
0755
grog
2.711 KB
March 21 2020 1:27:30
root
0755
grops
181.938 KB
March 21 2020 1:27:30
root
0755
grotty
129.563 KB
March 21 2020 1:27:30
root
0755
groups
38.336 KB
September 05 2019 12:38:40
root
0755
gs
14.148 KB
October 12 2023 3:06:46
root
0755
gsbj
0.342 KB
October 12 2023 3:06:46
root
0755
gsdj
0.344 KB
October 12 2023 3:06:46
root
0755
gsdj500
0.344 KB
October 12 2023 3:06:46
root
0755
gsettings
30.383 KB
June 08 2023 4:20:31
root
0755
gslj
0.345 KB
October 12 2023 3:06:46
root
0755
gslp
0.342 KB
October 12 2023 3:06:46
root
0755
gsnd
0.271 KB
October 12 2023 3:06:46
root
0755
gtbl
138.508 KB
March 21 2020 1:27:30
root
0755
gtk-builder-tool
34.734 KB
February 15 2022 6:50:52
root
0755
gtk-encode-symbolic-svg
18.414 KB
February 15 2022 6:50:52
root
0755
gtk-launch
18.461 KB
February 15 2022 6:50:52
root
0755
gtk-query-settings
14.305 KB
February 15 2022 6:50:52
root
0755
gtk-update-icon-cache
38.625 KB
February 15 2022 6:50:52
root
0755
gts-config
2.585 KB
February 03 2017 11:04:42
root
0755
gts2dxf
9.867 KB
February 03 2017 11:04:42
root
0755
gts2oogl
26.727 KB
February 03 2017 11:04:42
root
0755
gts2stl
10.008 KB
February 03 2017 11:04:42
root
0755
gts2xyz
9.867 KB
February 03 2017 11:04:42
root
0755
gtscheck
9.977 KB
February 03 2017 11:04:42
root
0755
gtscompare
22.164 KB
February 03 2017 11:04:42
root
0755
gtstemplate
5.967 KB
February 03 2017 11:04:42
root
0755
h2ph
28.539 KB
November 23 2023 4:02:19
root
0755
h2xs
59.439 KB
November 23 2023 4:02:19
root
0755
hd
34.25 KB
March 30 2020 11:26:14
root
0755
head
46.367 KB
September 05 2019 12:38:40
root
0755
helpztags
2.455 KB
January 30 2020 12:11:47
root
0755
hexdump
34.25 KB
March 30 2020 11:26:14
root
0755
host
102.766 KB
September 19 2023 1:22:19
root
0755
hostid
38.336 KB
September 05 2019 12:38:40
root
0755
hostnamectl
26.219 KB
November 21 2023 10:10:21
root
0755
htcacheclean
38.156 KB
October 26 2023 3:54:09
root
0755
htdbm
26.148 KB
October 26 2023 3:54:09
root
0755
htdigest
14.148 KB
October 26 2023 3:54:09
root
0755
htpasswd
26.148 KB
October 26 2023 3:54:09
root
0755
hwe-support-status
10.576 KB
November 15 2023 11:28:54
root
0755
i386
26.5 KB
May 30 2023 5:42:35
root
0755
ibd2sdi
6.48 MB
January 17 2024 9:13:42
root
0755
iceauth
38.117 KB
March 18 2018 11:19:30
root
0755
ico
50.438 KB
February 29 2020 12:10:29
root
0755
iconv
66.406 KB
November 22 2023 2:32:50
root
0755
id
46.367 KB
September 05 2019 12:38:40
root
0755
info
309.742 KB
October 11 2019 12:32:01
root
0755
infobrowser
309.742 KB
October 11 2019 12:32:01
root
0755
infocmp
62.383 KB
May 16 2023 8:47:48
root
0755
infotocap
90.414 KB
May 16 2023 8:47:48
root
0755
innochecksum
6.37 MB
January 17 2024 9:13:42
root
0755
inotifywait
30.305 KB
August 06 2019 6:42:10
root
0755
inotifywatch
30.305 KB
August 06 2019 6:42:10
root
0755
install
154.406 KB
September 05 2019 12:38:40
root
0755
install-info
115.242 KB
October 11 2019 12:32:01
root
0755
instmodsh
4.268 KB
November 23 2023 4:02:19
root
0755
invgeod
22.164 KB
February 13 2020 4:29:49
root
0755
invproj
26.164 KB
February 13 2020 4:29:49
root
0755
ionice
30.227 KB
May 30 2023 5:42:35
root
0755
ipcmk
34.297 KB
May 30 2023 5:42:35
root
0755
ipcrm
34.227 KB
May 30 2023 5:42:35
root
0755
ipcs
66.227 KB
May 30 2023 5:42:35
root
0755
iptables-xml
96.969 KB
May 09 2023 8:39:57
root
0755
irb
0.495 KB
July 06 2023 12:57:08
root
0755
irb2.7
0.495 KB
July 06 2023 12:57:08
root
0755
ischroot
14.195 KB
December 07 2019 3:13:44
root
0755
ispell-wrapper
7.053 KB
November 15 2018 4:24:46
root
0755
jk_uchroot
30.469 KB
November 11 2019 5:23:32
root
4755
join
54.367 KB
September 05 2019 12:38:40
root
0755
json_pp
4.558 KB
November 23 2023 4:02:19
root
0755
json_xs
6.849 KB
October 19 2019 10:04:01
root
0755
kbdinfo
14.07 KB
May 09 2019 5:22:51
root
0755
kbxutil
174.969 KB
July 04 2022 6:20:36
root
0755
kernel-install
5.069 KB
April 01 2020 7:23:42
root
0755
killall
31.273 KB
November 12 2019 12:16:21
root
0755
l4p-tmpl
1.803 KB
August 01 2017 10:39:59
root
0755
last
46.227 KB
May 30 2023 5:42:35
root
0755
lastb
46.227 KB
May 30 2023 5:42:35
root
0755
lastlog
31.656 KB
November 29 2022 12:53:10
root
0755
lcf
7.604 KB
December 14 2018 9:51:14
root
0755
ld
1.66 MB
January 02 2024 4:48:50
root
0755
ld.bfd
1.66 MB
January 02 2024 4:48:50
root
0755
ld.gold
2.21 MB
January 02 2024 4:48:50
root
0755
ldd
5.301 KB
November 22 2023 2:32:50
root
0755
less
175.844 KB
July 02 2020 1:25:13
root
0755
lessecho
14.313 KB
July 02 2020 1:25:13
root
0755
lessfile
8.363 KB
September 03 2019 6:41:52
root
0755
lesskey
23.719 KB
July 02 2020 1:25:13
root
0755
lesspipe
8.363 KB
September 03 2019 6:41:52
root
0755
letsencrypt
0.376 KB
October 26 2020 3:42:45
root
0755
lexgrog
98.945 KB
February 25 2020 6:13:45
root
0755
libnetcfg
15.405 KB
November 23 2023 4:02:19
root
0755
link
38.336 KB
September 05 2019 12:38:40
root
0755
linux32
26.5 KB
May 30 2023 5:42:35
root
0755
linux64
26.5 KB
May 30 2023 5:42:35
root
0755
listres
14.727 KB
February 29 2020 7:29:50
root
0755
lnstat
30.508 KB
February 13 2020 6:21:59
root
0755
loadkeys
210.57 KB
May 09 2019 5:22:51
root
0755
loadunimap
34.133 KB
May 09 2019 5:22:51
root
0755
locale
57.563 KB
November 22 2023 2:32:50
root
0755
locale-check
14.156 KB
January 02 2024 6:12:43
root
0755
localectl
26.219 KB
November 21 2023 10:10:21
root
0755
localedef
326.961 KB
November 22 2023 2:32:50
root
0755
lockfile
17.875 KB
November 16 2017 11:42:36
root
2755
logger
50.82 KB
May 30 2023 5:42:35
root
0755
logname
38.336 KB
September 05 2019 12:38:40
root
0755
logresolve
14.156 KB
October 26 2023 3:54:09
root
0755
look
14.383 KB
March 30 2020 11:26:14
root
0755
lorder
2.817 KB
March 30 2020 11:26:14
root
0755
lsattr
14.313 KB
June 02 2022 2:59:32
root
0755
lsb_release
3.553 KB
August 25 2019 11:11:20
root
0755
lscpu
98.227 KB
May 30 2023 5:42:35
root
0755
lshw
841.195 KB
December 17 2020 10:34:41
root
0755
lsipc
94.227 KB
May 30 2023 5:42:35
root
0755
lslocks
38.555 KB
May 30 2023 5:42:35
root
0755
lslogins
66.227 KB
May 30 2023 5:42:35
root
0755
lsmem
66.227 KB
May 30 2023 5:42:35
root
0755
lsns
50.234 KB
May 30 2023 5:42:35
root
0755
lsof
171.625 KB
December 25 2020 5:57:35
root
0755
lspci
91.953 KB
April 01 2021 12:55:11
root
0755
lspgpot
1.056 KB
August 28 2017 12:22:54
root
0755
lsusb
242.508 KB
October 01 2019 11:03:11
root
0755
ltrace
301.328 KB
February 01 2019 1:10:30
root
0755
luit
52.422 KB
February 29 2020 7:29:50
root
0755
lwp-download
10.051 KB
November 29 2019 4:16:23
root
0755
lwp-dump
2.647 KB
November 29 2019 4:16:23
root
0755
lwp-mirror
2.356 KB
November 29 2019 4:16:23
root
0755
lwp-request
15.82 KB
November 29 2019 4:16:23
root
0755
lynx
1.85 MB
February 28 2020 3:28:01
root
0755
lzcat
78.5 KB
April 08 2022 2:56:10
root
0755
lzcmp
6.477 KB
April 08 2022 2:56:10
root
0755
lzdiff
6.477 KB
April 08 2022 2:56:10
root
0755
lzegrep
5.764 KB
April 08 2022 2:56:10
root
0755
lzfgrep
5.764 KB
April 08 2022 2:56:10
root
0755
lzgrep
5.764 KB
April 08 2022 2:56:10
root
0755
lzless
1.76 KB
April 08 2022 2:56:10
root
0755
lzma
78.5 KB
April 08 2022 2:56:10
root
0755
lzmainfo
14.227 KB
April 08 2022 2:56:10
root
0755
lzmore
2.11 KB
April 08 2022 2:56:10
root
0755
mail
110.242 KB
August 08 2018 11:12:01
root
0755
maildirmake.dovecot
0.509 KB
April 11 2021 5:50:21
root
0755
mailq
34.305 KB
January 29 2024 9:49:03
root
0755
mailstat
5.722 KB
November 16 2017 11:42:36
root
0755
mailx
110.242 KB
August 08 2018 11:12:01
root
0755
make
225.555 KB
July 28 2018 12:07:31
root
0755
make-first-existing-target
4.79 KB
July 28 2018 12:07:31
root
0755
man
116.828 KB
February 25 2020 6:13:45
root
0755
man-recode
26.898 KB
February 25 2020 6:13:45
root
0755
mandb
139.094 KB
February 25 2020 6:13:45
root
0755
manpath
38.703 KB
February 25 2020 6:13:45
root
0755
mapscrn
26.133 KB
May 09 2019 5:22:51
root
0755
mawk
158.742 KB
February 16 2020 8:41:09
root
0755
mcookie
34.297 KB
May 30 2023 5:42:35
root
0755
md5sum
46.367 KB
September 05 2019 12:38:40
root
0755
md5sum.textutils
46.367 KB
September 05 2019 12:38:40
root
0755
mdig
50.398 KB
September 19 2023 1:22:19
root
0755
mesg
14.227 KB
May 30 2023 5:42:35
root
0755
migrate-pubring-from-classic-gpg
2.988 KB
January 06 2021 7:10:35
root
0755
mk_modmap
15.784 KB
May 09 2019 5:22:51
root
0755
mkfifo
66.336 KB
September 05 2019 12:38:40
root
0755
mkpasswd
26.227 KB
February 16 2020 10:25:51
root
0755
mlock
14.148 KB
August 26 2019 10:52:52
root
2755
mtr
80.25 KB
August 20 2019 11:26:21
root
0755
mtr-packet
38.375 KB
August 20 2019 11:26:21
root
0755
mtrace
6.346 KB
November 22 2023 2:32:50
root
0755
my_print_defaults
6.29 MB
January 17 2024 9:13:42
root
0755
myisam_ftdump
6.58 MB
January 17 2024 9:13:42
root
0755
myisamchk
6.69 MB
January 17 2024 9:13:42
root
0755
myisamlog
6.53 MB
January 17 2024 9:13:42
root
0755
myisampack
6.6 MB
January 17 2024 9:13:42
root
0755
mysql
7.33 MB
January 17 2024 9:13:42
root
0755
mysql_config_editor
6.31 MB
January 17 2024 9:13:42
root
0755
mysql_migrate_keyring
7.24 MB
January 17 2024 9:13:42
root
0755
mysql_secure_installation
7.16 MB
January 17 2024 9:13:42
root
0755
mysql_ssl_rsa_setup
6.33 MB
January 17 2024 9:13:42
root
0755
mysql_tzinfo_to_sql
6.23 MB
January 17 2024 9:13:42
root
0755
mysql_upgrade
7.26 MB
January 17 2024 9:13:42
root
0755
mysqladmin
7.17 MB
January 17 2024 9:13:42
root
0755
mysqlanalyze
7.18 MB
January 17 2024 9:13:42
root
0755
mysqlbinlog
7.62 MB
January 17 2024 9:13:42
root
0755
mysqlcheck
7.18 MB
January 17 2024 9:13:42
root
0755
mysqld_multi
26.677 KB
January 17 2024 9:13:42
root
0755
mysqld_safe
28.454 KB
January 17 2024 9:13:42
root
0755
mysqldump
7.25 MB
January 17 2024 9:13:42
root
0755
mysqldumpslow
7.489 KB
January 17 2024 9:13:42
root
0755
mysqlimport
7.17 MB
January 17 2024 9:13:42
root
0755
mysqloptimize
7.18 MB
January 17 2024 9:13:42
root
0755
mysqlpump
7.6 MB
January 17 2024 9:13:42
root
0755
mysqlrepair
7.18 MB
January 17 2024 9:13:42
root
0755
mysqlreport
38.102 KB
June 14 2023 9:23:16
root
0755
mysqlshow
7.17 MB
January 17 2024 9:13:42
root
0755
mysqlslap
7.18 MB
January 17 2024 9:13:42
root
0755
named-rrchecker
22.297 KB
September 19 2023 1:22:19
root
0755
namei
34.227 KB
May 30 2023 5:42:35
root
0755
nawk
158.742 KB
February 16 2020 8:41:09
root
0755
ncal
36.945 KB
March 30 2020 11:26:14
root
0755
neqn
0.892 KB
March 21 2020 1:27:30
root
0755
net-server
3.338 KB
April 03 2020 5:02:06
root
0755
netkit-ftp
106.695 KB
February 24 2019 2:39:21
root
0755
networkd-dispatcher
19.712 KB
May 04 2022 3:49:53
root
0755
newaliases
34.305 KB
January 29 2024 9:49:03
root
0755
newgrp
43.734 KB
November 29 2022 12:53:10
root
4755
ngettext
42.227 KB
March 22 2020 4:42:12
root
0755
nice
42.336 KB
September 05 2019 12:38:40
root
0755
nip2
1.02 MB
September 19 2018 11:30:07
root
0755
nl
42.43 KB
September 05 2019 12:38:40
root
0755
nm
51.43 KB
January 02 2024 4:48:50
root
0755
node
78.78 MB
August 09 2023 12:24:22
root
0755
nohup
42.336 KB
September 05 2019 12:38:40
root
0755
npm
0.053 KB
February 16 2023 4:41:30
root
0755
nproc
42.336 KB
September 05 2019 12:38:40
root
0755
npx
2.77 KB
February 16 2023 4:41:30
root
0755
nroff
3.216 KB
March 21 2020 1:27:30
root
0755
nsenter
34.43 KB
May 30 2023 5:42:35
root
0755
nslookup
106.797 KB
September 19 2023 1:22:19
root
0755
nstat
78.234 KB
February 13 2020 6:21:59
root
0755
nsupdate
70.523 KB
September 19 2023 1:22:19
root
0755
ntfsdecrypt
50.273 KB
November 01 2022 12:56:50
root
0755
numfmt
66.398 KB
September 05 2019 12:38:40
root
0755
objcopy
182.477 KB
January 02 2024 4:48:50
root
0755
objdump
392.828 KB
January 02 2024 4:48:50
root
0755
oclock
27.719 KB
February 29 2020 12:10:29
root
0755
od
70.367 KB
September 05 2019 12:38:40
root
0755
odbcinst
22 KB
January 14 2019 9:05:00
root
0755
on_ac_power
2.176 KB
July 20 2019 5:43:51
root
0755
openssl
735.68 KB
January 31 2024 9:45:27
root
0755
p7zip
4.643 KB
August 09 2019 9:00:38
root
0755
pager
175.844 KB
July 02 2020 1:25:13
root
0755
paperconf
13.992 KB
June 26 2019 12:04:32
root
0755
partx
118.234 KB
May 30 2023 5:42:35
root
0755
passwd
66.609 KB
November 29 2022 12:53:10
root
4755
paste
42.367 KB
September 05 2019 12:38:40
root
0755
pasteurize
0.379 KB
January 25 2023 9:33:14
root
0755
patch
190.523 KB
July 27 2019 12:10:00
root
0755
pathchk
38.336 KB
September 05 2019 12:38:40
root
0755
pbr
0.148 KB
April 09 2020 9:32:59
root
0755
pdb3
61.268 KB
November 22 2023 11:22:35
root
0755
pdb3.8
61.268 KB
November 22 2023 11:22:35
root
0755
pdf2dsc
0.682 KB
October 12 2023 3:06:46
root
0755
pdf2ps
0.888 KB
October 12 2023 3:06:46
root
0755
pear
0.774 KB
March 22 2022 11:59:18
root
0755
peardev
0.795 KB
March 22 2022 11:59:18
root
0755
pecl
0.71 KB
March 22 2022 11:59:18
root
0755
peekfd
14.148 KB
November 12 2019 12:16:21
root
0755
perl
3.32 MB
November 23 2023 4:02:19
root
0755
perl5.30-x86_64-linux-gnu
14.305 KB
November 23 2023 4:02:19
root
0755
perl5.30.0
3.32 MB
November 23 2023 4:02:19
root
0755
perlbug
45.279 KB
November 23 2023 4:02:19
root
0755
perldoc
0.122 KB
October 27 2019 5:52:24
root
0755
perlivp
10.609 KB
November 23 2023 4:02:19
root
0755
perlthanks
45.279 KB
November 23 2023 4:02:19
root
0755
perror
7.62 MB
January 17 2024 9:13:42
root
0755
pf2afm
0.486 KB
October 12 2023 3:06:46
root
0755
pfbtopfa
0.504 KB
October 12 2023 3:06:46
root
0755
pftp
106.695 KB
February 24 2019 2:39:21
root
0755
pgrep
30.242 KB
October 31 2023 12:35:56
root
0755
phar
14.882 KB
January 20 2024 3:16:18
root
0755
phar.default
14.882 KB
January 20 2024 3:16:18
root
0755
phar.phar
14.882 KB
January 20 2024 3:16:18
root
0755
phar.phar.default
14.882 KB
January 20 2024 3:16:18
root
0755
phar.phar5.6
14.479 KB
September 02 2023 9:57:07
root
0755
phar.phar7.4
14.536 KB
September 02 2023 10:03:15
root
0755
phar.phar8.0
15.017 KB
September 02 2023 10:04:32
root
0755
phar.phar8.1
14.887 KB
December 21 2023 9:19:26
root
0755
phar.phar8.2
14.885 KB
January 20 2024 3:16:39
root
0755
phar.phar8.3
14.882 KB
January 20 2024 3:16:18
root
0755
phar5.6
14.479 KB
September 02 2023 9:57:07
root
0755
phar7.4
14.536 KB
September 02 2023 10:03:15
root
0755
phar7.4.phar
14.536 KB
September 02 2023 10:03:15
root
0755
phar8.0
15.017 KB
September 02 2023 10:04:32
root
0755
phar8.0.phar
15.017 KB
September 02 2023 10:04:32
root
0755
phar8.1
14.887 KB
December 21 2023 9:19:26
root
0755
phar8.1.phar
14.887 KB
December 21 2023 9:19:26
root
0755
phar8.2
14.885 KB
January 20 2024 3:16:39
root
0755
phar8.2.phar
14.885 KB
January 20 2024 3:16:39
root
0755
phar8.3
14.882 KB
January 20 2024 3:16:18
root
0755
phar8.3.phar
14.882 KB
January 20 2024 3:16:18
root
0755
php
5.51 MB
January 20 2024 3:16:18
root
0755
php-cgi
5.39 MB
January 20 2024 3:16:18
root
0755
php-cgi.default
5.39 MB
January 20 2024 3:16:18
root
0755
php-cgi5.6
4.29 MB
September 02 2023 9:57:07
root
0755
php-cgi7.4
4.47 MB
September 02 2023 10:03:15
root
0755
php-cgi8.0
4.65 MB
September 02 2023 10:04:32
root
0755
php-cgi8.1
5.2 MB
December 21 2023 9:19:26
root
0755
php-cgi8.2
5.31 MB
January 20 2024 3:16:39
root
0755
php-cgi8.3
5.39 MB
January 20 2024 3:16:18
root
0755
php.default
5.51 MB
January 20 2024 3:16:18
root
0755
php5.6
4.32 MB
September 02 2023 9:57:07
root
0755
php7.4
4.58 MB
September 02 2023 10:03:15
root
0755
php8.0
4.77 MB
September 02 2023 10:04:32
root
0755
php8.1
5.31 MB
December 21 2023 9:19:26
root
0755
php8.2
5.43 MB
January 20 2024 3:16:39
root
0755
php8.3
5.51 MB
January 20 2024 3:16:18
root
0755
pic
216.344 KB
March 21 2020 1:27:30
root
0755
pico
312.633 KB
April 10 2020 4:12:30
root
0755
piconv
8.161 KB
November 23 2023 4:02:19
root
0755
pinentry
66.641 KB
March 22 2020 4:54:08
root
0755
pinentry-curses
66.641 KB
March 22 2020 4:54:08
root
0755
pinky
42.367 KB
September 05 2019 12:38:40
root
0755
pkaction
18.305 KB
February 21 2022 1:58:33
root
0755
pkcheck
22.375 KB
February 21 2022 1:58:33
root
0755
pkcon
74.305 KB
September 23 2020 12:55:22
root
0755
pkexec
30.305 KB
February 21 2022 1:58:33
root
4755
pkill
30.242 KB
October 31 2023 12:35:56
root
0755
pkmon
22.305 KB
September 23 2020 12:55:22
root
0755
pkttyagent
18.305 KB
February 21 2022 1:58:33
root
0755
pl2pm
4.427 KB
November 23 2023 4:02:19
root
0755
pldd
22.367 KB
November 22 2023 2:32:50
root
0755
pmap
34.242 KB
October 31 2023 12:35:56
root
0755
pod2html
4.037 KB
November 23 2023 4:02:19
root
0755
pod2man
14.682 KB
November 23 2023 4:02:19
root
0755
pod2text
10.55 KB
November 23 2023 4:02:19
root
0755
pod2usage
3.855 KB
November 23 2023 4:02:19
root
0755
podchecker
3.572 KB
November 23 2023 4:02:19
root
0755
podselect
2.468 KB
November 23 2023 4:02:19
root
0755
postgreyreport
23.784 KB
May 09 2019 1:35:38
root
0755
pphs
0.395 KB
October 12 2023 3:06:46
root
0755
pr
74.43 KB
September 05 2019 12:38:40
root
0755
precat
5.523 KB
July 22 2021 8:20:06
root
0755
preconv
66.508 KB
March 21 2020 1:27:30
root
0755
preunzip
5.523 KB
July 22 2021 8:20:06
root
0755
prezip
5.523 KB
July 22 2021 8:20:06
root
0755
prezip-bin
14.297 KB
July 22 2021 8:20:06
root
0755
print
18.054 KB
October 19 2019 1:05:50
root
0755
printafm
0.386 KB
October 12 2023 3:06:46
root
0755
printenv
38.336 KB
September 05 2019 12:38:40
root
0755
printerbanner
22.148 KB
March 30 2020 11:26:14
root
0755
printf
58.336 KB
September 05 2019 12:38:40
root
0755
prlimit
38.742 KB
May 30 2023 5:42:35
root
0755
pro
0.432 KB
November 07 2023 3:23:40
root
0755
procmail
94.383 KB
November 16 2017 11:42:36
root
6755
procmail-wrapper
1.35 MB
January 26 2022 8:09:58
root
4755
proj
26.164 KB
February 13 2020 4:29:49
root
0755
projinfo
86.32 KB
February 13 2020 4:29:49
root
0755
prove
13.335 KB
November 23 2023 4:02:19
root
0755
prtstat
22.227 KB
November 12 2019 12:16:21
root
0755
ps2ascii
0.616 KB
October 12 2023 3:06:46
root
0755
ps2epsi
2.688 KB
October 12 2023 3:06:46
root
0755
ps2pdf
0.266 KB
October 12 2023 3:06:46
root
0755
ps2pdf12
0.21 KB
October 12 2023 3:06:46
root
0755
ps2pdf13
0.21 KB
October 12 2023 3:06:46
root
0755
ps2pdf14
0.21 KB
October 12 2023 3:06:46
root
0755
ps2pdfwr
1.053 KB
October 12 2023 3:06:46
root
0755
ps2ps
0.632 KB
October 12 2023 3:06:46
root
0755
ps2ps2
0.653 KB
October 12 2023 3:06:46
root
0755
ps2txt
0.616 KB
October 12 2023 3:06:46
root
0755
psfaddtable
21.992 KB
May 09 2019 5:22:51
root
0755
psfgettable
21.992 KB
May 09 2019 5:22:51
root
0755
psfstriptable
21.992 KB
May 09 2019 5:22:51
root
0755
psfxtable
21.992 KB
May 09 2019 5:22:51
root
0755
pslog
14.148 KB
November 12 2019 12:16:21
root
0755
pstree
35.164 KB
November 12 2019 12:16:21
root
0755
pstree.x11
35.164 KB
November 12 2019 12:16:21
root
0755
ptar
3.466 KB
November 23 2023 4:02:19
root
0755
ptardiff
2.566 KB
November 23 2023 4:02:19
root
0755
ptargrep
4.289 KB
November 23 2023 4:02:19
root
0755
ptx
78.398 KB
September 05 2019 12:38:40
root
0755
pwdx
14.227 KB
October 31 2023 12:35:56
root
0755
py3clean
7.63 KB
March 13 2020 1:20:20
root
0755
py3compile
11.836 KB
March 13 2020 1:20:20
root
0755
py3versions
11.442 KB
March 13 2020 1:20:20
root
0755
pydoc3
0.077 KB
November 22 2023 11:22:35
root
0755
pydoc3.8
0.077 KB
November 22 2023 11:22:35
root
0755
pygettext3
21.03 KB
November 22 2023 11:22:35
root
0755
pygettext3.8
21.03 KB
November 22 2023 11:22:35
root
0755
python3
5.21 MB
November 22 2023 11:22:35
root
0755
python3-futurize
0.375 KB
January 25 2023 9:33:14
root
0755
python3-pasteurize
0.379 KB
January 25 2023 9:33:14
root
0755
python3-pbr
0.148 KB
April 09 2020 9:32:59
root
0755
python3.8
5.21 MB
November 22 2023 11:22:35
root
0755
quota
95.406 KB
April 09 2019 10:12:04
root
0755
quotasync
70.719 KB
April 09 2019 10:12:04
root
0755
racc2.7
0.572 KB
July 06 2023 12:57:08
root
0755
racc2y2.7
0.576 KB
July 06 2023 12:57:08
root
0755
rake
0.498 KB
April 01 2020 9:46:04
root
0755
ranlib
66.461 KB
January 02 2024 4:48:50
root
0755
rcp
114.297 KB
January 02 2024 6:13:02
root
0755
rdma
130.234 KB
February 13 2020 6:21:59
root
0755
rdoc
0.501 KB
July 06 2023 12:57:08
root
0755
rdoc2.7
0.501 KB
July 06 2023 12:57:08
root
0755
re2c
526.398 KB
April 27 2020 2:48:36
root
0755
readelf
642.93 KB
January 02 2024 4:48:50
root
0755
realpath
50.367 KB
September 05 2019 12:38:40
root
0755
rename.ul
22.227 KB
May 30 2023 5:42:35
root
0755
rendercheck
59.953 KB
February 29 2020 12:10:29
root
0755
renice
14.227 KB
May 30 2023 5:42:35
root
0755
reset
30.313 KB
May 16 2023 8:47:48
root
0755
resizecons
22.133 KB
May 09 2019 5:22:51
root
0755
resizepart
62.227 KB
May 30 2023 5:42:35
root
0755
resolvectl
126.375 KB
November 21 2023 10:10:21
root
0755
rev
14.227 KB
May 30 2023 5:42:35
root
0755
rgrep
0.029 KB
January 16 2020 4:27:20
root
0755
ri
0.497 KB
July 06 2023 12:57:08
root
0755
ri2.7
0.497 KB
July 06 2023 12:57:08
root
0755
rlogin
774.945 KB
January 02 2024 6:13:02
root
0755
rmail
18.148 KB
January 29 2024 9:49:03
root
0755
rotatelogs
26.227 KB
October 26 2023 3:54:09
root
0755
routef
0.203 KB
February 13 2020 6:21:59
root
0755
routel
1.617 KB
February 13 2020 6:21:59
root
0755
rpcgen
98.688 KB
November 22 2023 2:32:50
root
0755
rrsync
7.069 KB
September 14 2015 1:23:54
root
0755
rsh
774.945 KB
January 02 2024 6:13:02
root
0755
rstart
2.549 KB
February 29 2020 7:08:03
root
0755
rstartd
1.435 KB
February 29 2020 7:08:03
root
0755
rsync
500.805 KB
September 01 2023 8:38:04
root
0755
rtstat
30.508 KB
February 13 2020 6:21:59
root
0755
ruby
14.148 KB
July 06 2023 12:57:08
root
0755
ruby2.7
14.148 KB
July 06 2023 12:57:08
root
0755
run-mailcap
18.054 KB
October 19 2019 1:05:50
root
0755
run-with-aspell
0.056 KB
July 22 2021 8:20:06
root
0755
runcon
38.336 KB
September 05 2019 12:38:40
root
0755
rview
1.29 MB
December 07 2023 4:42:49
root
0755
sa-awl
4.872 KB
March 24 2023 5:36:49
root
0755
sa-check_spamd
14.617 KB
March 24 2023 5:36:49
root
0755
sa-compile
21.851 KB
March 24 2023 5:36:49
root
0755
sa-learn
44.788 KB
March 24 2023 5:36:49
root
0755
sa-update
72.544 KB
March 24 2023 5:36:49
root
0755
sasl-sample-client
26.469 KB
February 15 2022 9:03:43
root
0755
saslfinger
8.619 KB
February 15 2022 9:03:43
root
0755
savelog
10.235 KB
December 07 2019 3:13:44
root
0755
scp
114.297 KB
January 02 2024 6:13:02
root
0755
screen
463.164 KB
February 23 2021 6:46:21
root
0755
screendump
13.992 KB
May 09 2019 5:22:51
root
0755
script
54.227 KB
May 30 2023 5:42:35
root
0755
scriptreplay
30.227 KB
May 30 2023 5:42:35
root
0755
sdiff
50.094 KB
April 08 2019 2:04:00
root
0755
see
18.054 KB
October 19 2019 1:05:50
root
0755
select-default-iwrap
0.463 KB
November 15 2018 4:24:46
root
0755
select-editor
2.385 KB
November 17 2019 1:21:22
root
0755
sensible-browser
1.201 KB
November 17 2019 1:21:22
root
0755
sensible-editor
1.142 KB
November 17 2019 1:21:22
root
0755
sensible-pager
0.441 KB
November 17 2019 1:21:22
root
0755
sensors
30.5 KB
March 31 2022 10:52:36
root
0755
sensors-conf-convert
13.698 KB
March 31 2022 10:52:36
root
0755
seq
50.336 KB
September 05 2019 12:38:40
root
0755
sessreg
13.992 KB
March 18 2018 11:19:30
root
0755
setarch
26.5 KB
May 30 2023 5:42:35
root
0755
setkeycodes
14.07 KB
May 09 2019 5:22:51
root
0755
setleds
14.055 KB
May 09 2019 5:22:51
root
0755
setlogcons
14.07 KB
May 09 2019 5:22:51
root
0755
setmetamode
14.102 KB
May 09 2019 5:22:51
root
0755
setpci
30.234 KB
April 01 2021 12:55:11
root
0755
setpriv
46.234 KB
May 30 2023 5:42:35
root
0755
setsid
14.227 KB
May 30 2023 5:42:35
root
0755
setterm
46.227 KB
May 30 2023 5:42:35
root
0755
setxkbmap
30.703 KB
February 28 2020 9:13:02
root
0755
sftp
166.508 KB
January 02 2024 6:13:02
root
0755
sg
43.734 KB
November 29 2022 12:53:10
root
4755
sha1sum
50.367 KB
September 05 2019 12:38:40
root
0755
sha224sum
58.367 KB
September 05 2019 12:38:40
root
0755
sha256sum
58.367 KB
September 05 2019 12:38:40
root
0755
sha384sum
66.367 KB
September 05 2019 12:38:40
root
0755
sha512sum
66.367 KB
September 05 2019 12:38:40
root
0755
shasum
9.742 KB
November 23 2023 4:02:19
root
0755
showconsolefont
18.07 KB
May 09 2019 5:22:51
root
0755
showkey
18.07 KB
May 09 2019 5:22:51
root
0755
showrgb
9.992 KB
March 18 2018 11:19:30
root
0755
shred
62.367 KB
September 05 2019 12:38:40
root
0755
shuf
58.336 KB
September 05 2019 12:38:40
root
0755
size
34.453 KB
January 02 2024 4:48:50
root
0755
skill
30.227 KB
October 31 2023 12:35:56
root
0755
slabtop
22.234 KB
October 31 2023 12:35:56
root
0755
slogin
774.945 KB
January 02 2024 6:13:02
root
0755
smproxy
26.313 KB
February 29 2020 7:08:03
root
0755
snice
30.227 KB
October 31 2023 12:35:56
root
0755
soelim
46.508 KB
March 21 2020 1:27:30
root
0755
sort
114.625 KB
September 05 2019 12:38:40
root
0755
sotruss
4.209 KB
November 22 2023 2:32:50
root
0755
spamalyze
5.514 KB
July 15 2016 4:10:30
root
0755
spamassassin
29.197 KB
March 24 2023 5:36:49
root
0755
spamc
47.141 KB
March 24 2023 5:36:49
root
0755
spinner
2.381 KB
August 22 2017 11:23:46
root
0755
splain
18.701 KB
November 23 2023 4:02:19
root
0755
split
58.773 KB
September 05 2019 12:38:40
root
0755
splitfont
13.992 KB
May 09 2019 5:22:51
root
0755
sprof
34.367 KB
November 22 2023 2:32:50
root
0755
ssh
774.945 KB
January 02 2024 6:13:02
root
0755
ssh-add
362.281 KB
January 02 2024 6:13:02
root
0755
ssh-agent
342.289 KB
January 02 2024 6:13:02
root
2755
ssh-argv0
1.421 KB
April 04 2023 12:47:13
root
0755
ssh-copy-id
10.408 KB
February 14 2020 1:40:54
root
0755
ssh-keygen
466.297 KB
January 02 2024 6:13:02
root
0755
ssh-keyscan
454.305 KB
January 02 2024 6:13:02
root
0755
startx
5.39 KB
August 24 2019 11:28:16
root
0755
stat
86.367 KB
September 05 2019 12:38:40
root
0755
stdbuf
50.336 KB
September 05 2019 12:38:40
root
0755
stl2gts
14.039 KB
February 03 2017 11:04:42
root
0755
strace
1.51 MB
April 17 2020 12:23:25
root
0755
strace-log-merge
1.778 KB
March 18 2019 8:06:47
root
0755
strings
34.656 KB
January 02 2024 4:48:50
root
0755
strip
182.477 KB
January 02 2024 4:48:50
root
0755
sudo
162.164 KB
April 04 2023 1:56:28
root
4755
sudoedit
162.164 KB
April 04 2023 1:56:28
root
4755
sudoreplay
63 KB
April 04 2023 1:56:28
root
0755
sum
46.344 KB
September 05 2019 12:38:40
root
0755
symcryptrun
123.031 KB
July 04 2022 6:20:36
root
0755
systemd-analyze
1.51 MB
November 21 2023 10:10:21
root
0755
systemd-cat
18.227 KB
November 21 2023 10:10:21
root
0755
systemd-cgls
22.328 KB
November 21 2023 10:10:21
root
0755
systemd-cgtop
38.242 KB
November 21 2023 10:10:21
root
0755
systemd-delta
26.219 KB
November 21 2023 10:10:21
root
0755
systemd-detect-virt
18.219 KB
November 21 2023 10:10:21
root
0755
systemd-id128
22.219 KB
November 21 2023 10:10:21
root
0755
systemd-mount
50.453 KB
November 21 2023 10:10:21
root
0755
systemd-path
18.219 KB
November 21 2023 10:10:21
root
0755
systemd-resolve
126.375 KB
November 21 2023 10:10:21
root
0755
systemd-run
58.422 KB
November 21 2023 10:10:21
root
0755
systemd-socket-activate
26.219 KB
November 21 2023 10:10:21
root
0755
systemd-stdio-bridge
22.227 KB
November 21 2023 10:10:21
root
0755
systemd-umount
50.453 KB
November 21 2023 10:10:21
root
0755
tabs
18.305 KB
May 16 2023 8:47:48
root
0755
tac
42.336 KB
September 05 2019 12:38:40
root
0755
tail
70.398 KB
September 05 2019 12:38:40
root
0755
taskset
34.227 KB
May 30 2023 5:42:35
root
0755
tbl
138.508 KB
March 21 2020 1:27:30
root
0755
tee
42.367 KB
September 05 2019 12:38:40
root
0755
telnet
112.672 KB
March 23 2020 7:20:39
root
0755
telnet.netkit
112.672 KB
March 23 2020 7:20:39
root
0755
test
54.336 KB
September 05 2019 12:38:40
root
0755
tic
90.414 KB
May 16 2023 8:47:48
root
0755
time
14.375 KB
April 21 2017 10:57:03
root
0755
timedatectl
46.219 KB
November 21 2023 10:10:21
root
0755
timeout
42.773 KB
September 05 2019 12:38:40
root
0755
tload
22.242 KB
October 31 2023 12:35:56
root
0755
toe
22.305 KB
May 16 2023 8:47:48
root
0755
top
126.047 KB
October 31 2023 12:35:56
root
0755
touch
98.367 KB
September 05 2019 12:38:40
root
0755
tput
26.336 KB
May 16 2023 8:47:48
root
0755
tr
50.336 KB
September 05 2019 12:38:40
root
0755
tracepath
18.148 KB
September 13 2022 9:06:15
root
0755
traceroute6
26.148 KB
September 13 2022 9:06:15
root
0755
traceroute6.iputils
26.148 KB
September 13 2022 9:06:15
root
0755
transform
14.352 KB
February 03 2017 11:04:42
root
0755
transset
22.789 KB
February 29 2020 12:10:29
root
0755
troff
735.906 KB
March 21 2020 1:27:30
root
0755
truncate
42.336 KB
September 05 2019 12:38:40
root
0755
tset
30.313 KB
May 16 2023 8:47:48
root
0755
tsort
42.336 KB
September 05 2019 12:38:40
root
0755
tty
38.336 KB
September 05 2019 12:38:40
root
0755
tzselect
15.019 KB
November 22 2023 2:32:50
root
0755
ua
0.432 KB
November 07 2023 3:23:40
root
0755
ubuntu-advantage
0.432 KB
November 07 2023 3:23:40
root
0755
ubuntu-distro-info
22.891 KB
April 25 2023 3:57:38
root
0755
ubuntu-security-status
22.249 KB
November 15 2023 11:28:54
root
0755
ucf
39.731 KB
December 14 2018 9:51:14
root
0755
ucfq
18.913 KB
December 14 2018 9:51:14
root
0755
ucfr
10.471 KB
December 14 2018 9:51:14
root
0755
ul
18.164 KB
March 30 2020 11:26:14
root
0755
unattended-upgrade
96.985 KB
May 19 2022 7:38:48
root
0755
unattended-upgrades
96.985 KB
May 19 2022 7:38:48
root
0755
unexpand
42.367 KB
September 05 2019 12:38:40
root
0755
unicode_stop
0.518 KB
May 09 2019 5:22:51
root
0755
uniq
50.367 KB
September 05 2019 12:38:40
root
0755
unlink
38.336 KB
September 05 2019 12:38:40
root
0755
unlzma
78.5 KB
April 08 2022 2:56:10
root
0755
unrar
376.875 KB
March 22 2020 5:01:42
root
0755
unrar-nonfree
376.875 KB
March 22 2020 5:01:42
root
0755
unshare
42.43 KB
May 30 2023 5:42:35
root
0755
unxz
78.5 KB
April 08 2022 2:56:10
root
0755
unzip
182.289 KB
October 07 2022 7:09:47
root
0755
unzipsfx
82.273 KB
October 07 2022 7:09:47
root
0755
update-alternatives
54.406 KB
May 25 2022 1:14:20
root
0755
update-mime-database
58.367 KB
March 24 2020 4:58:21
root
0755
uptime
14.227 KB
October 31 2023 12:35:56
root
0755
usb-devices
4.004 KB
October 01 2019 11:03:11
root
0755
usbhid-dump
30.383 KB
October 01 2019 11:03:11
root
0755
usbreset
14.297 KB
October 01 2019 11:03:11
root
0755
users
38.336 KB
September 05 2019 12:38:40
root
0755
utmpdump
30.227 KB
May 30 2023 5:42:35
root
0755
uuidgen
14.227 KB
May 30 2023 5:42:35
root
0755
uuidparse
38.227 KB
May 30 2023 5:42:35
root
0755
vi
1.29 MB
December 07 2023 4:42:49
root
0755
view
1.29 MB
December 07 2023 4:42:49
root
0755
viewres
31.266 KB
February 29 2020 7:29:50
root
0755
vim.tiny
1.29 MB
December 07 2023 4:42:49
root
0755
virtualmin-config-system
3.221 KB
August 01 2020 12:21:33
root
0755
vmstat
38.25 KB
October 31 2023 12:35:56
root
0755
volname
14.148 KB
July 08 2019 10:40:51
root
0755
w
22.227 KB
October 31 2023 12:35:56
root
0755
w.procps
22.227 KB
October 31 2023 12:35:56
root
0755
wall
34.227 KB
May 30 2023 5:42:35
root
2755
watch
26.57 KB
October 31 2023 12:35:56
root
0755
watchgnupg
18.305 KB
July 04 2022 6:20:36
root
0755
wc
46.344 KB
September 05 2019 12:38:40
root
0755
wcmgr
30.039 KB
October 15 2018 5:03:02
root
0755
webalizer
220.195 KB
October 15 2018 5:03:02
root
0755
webazolver
220.195 KB
October 15 2018 5:03:02
root
0755
webmin
15.095 KB
November 08 2023 4:49:09
root
0755
wget
531.711 KB
November 12 2021 6:09:16
root
0755
whatis
55.211 KB
February 25 2020 6:13:45
root
0755
whereis
34.664 KB
May 30 2023 5:42:35
root
0755
which
0.924 KB
December 07 2019 3:13:44
root
0755
whiptail
34.164 KB
February 18 2020 10:21:04
root
0755
who
58.367 KB
September 05 2019 12:38:40
root
0755
whoami
38.336 KB
September 05 2019 12:38:40
root
0755
whois
156.719 KB
February 16 2020 10:25:51
root
0755
word-list-compress
14.297 KB
July 22 2021 8:20:06
root
0755
write
14.148 KB
March 30 2020 11:26:14
root
2755
www-browser
1.85 MB
February 28 2020 3:28:01
root
0755
x-www-browser
2.604 KB
February 06 2024 2:59:08
root
0755
x11perf
197.461 KB
February 29 2020 12:10:29
root
0755
x11perfcomp
2.741 KB
February 29 2020 12:10:29
root
0755
x86_64
26.5 KB
May 30 2023 5:42:35
root
0755
x86_64-linux-gnu-addr2line
34.703 KB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-ar
66.43 KB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-as
680.297 KB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-c++filt
30.266 KB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-cpp
1.1 MB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-cpp-9
1.1 MB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-dwp
1.95 MB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-elfedit
42.672 KB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-g++
1.1 MB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-g++-9
1.1 MB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcc
1.1 MB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcc-9
1.1 MB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcc-ar
34.633 KB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcc-ar-9
34.633 KB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcc-nm
34.633 KB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcc-nm-9
34.633 KB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcc-ranlib
34.633 KB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcc-ranlib-9
34.633 KB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcov
656.234 KB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcov-9
656.234 KB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcov-dump
528.133 KB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcov-dump-9
528.133 KB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcov-tool
544.195 KB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gcov-tool-9
544.195 KB
October 24 2022 11:28:06
root
0755
x86_64-linux-gnu-gold
2.21 MB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-gprof
99.883 KB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-ld
1.66 MB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-ld.bfd
1.66 MB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-ld.gold
2.21 MB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-nm
51.43 KB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-objcopy
182.477 KB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-objdump
392.828 KB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-ranlib
66.461 KB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-readelf
642.93 KB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-size
34.453 KB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-strings
34.656 KB
January 02 2024 4:48:50
root
0755
x86_64-linux-gnu-strip
182.477 KB
January 02 2024 4:48:50
root
0755
xargs
74.367 KB
February 18 2020 2:05:59
root
0755
xauth
54.969 KB
August 25 2019 11:09:53
root
0755
xbiff
24.188 KB
February 29 2020 12:10:29
root
0755
xcalc
47.484 KB
February 29 2020 12:10:29
root
0755
xclipboard
26.656 KB
February 29 2020 12:10:29
root
0755
xclock
65.141 KB
February 29 2020 12:10:29
root
0755
xcmsdb
30.742 KB
March 18 2018 11:19:30
root
0755
xconsole
27.281 KB
February 29 2020 12:10:29
root
0755
xcursorgen
22.297 KB
February 29 2020 12:10:29
root
0755
xcutsel
22.641 KB
February 29 2020 12:10:29
root
0755
xdg-user-dir
0.229 KB
January 24 2019 3:37:01
root
0755
xdg-user-dirs-update
26.07 KB
January 24 2019 3:37:01
root
0755
xditview
108.141 KB
February 29 2020 12:10:29
root
0755
xdpyinfo
43.07 KB
February 29 2020 7:29:50
root
0755
xdriinfo
14.305 KB
February 29 2020 7:29:50
root
0755
xedit
673.352 KB
February 29 2020 12:10:29
root
0755
xev
34.656 KB
February 29 2020 7:29:50
root
0755
xeyes
31.797 KB
February 29 2020 12:10:29
root
0755
xfd
40.063 KB
February 29 2020 7:29:50
root
0755
xfontsel
47.906 KB
February 29 2020 7:29:50
root
0755
xgamma
9.992 KB
March 18 2018 11:19:30
root
0755
xgc
78.422 KB
February 29 2020 12:10:29
root
0755
xhost
13.992 KB
March 18 2018 11:19:30
root
0755
xinit
22.328 KB
August 24 2019 11:28:16
root
0755
xkbbell
14.32 KB
February 28 2020 9:13:02
root
0755
xkbcomp
212.094 KB
February 28 2020 9:13:02
root
0755
xkbevd
42.391 KB
February 28 2020 9:13:02
root
0755
xkbprint
94.344 KB
February 28 2020 9:13:02
root
0755
xkbvleds
23.086 KB
February 28 2020 9:13:02
root
0755
xkbwatch
23.18 KB
February 28 2020 9:13:02
root
0755
xkeystone
16.584 KB
March 18 2018 11:19:30
root
0755
xkill
14.305 KB
February 29 2020 7:29:50
root
0755
xload
27 KB
February 29 2020 12:10:29
root
0755
xlogo
27.266 KB
February 29 2020 12:10:29
root
0755
xlsatoms
14.305 KB
February 29 2020 7:29:50
root
0755
xlsclients
18.313 KB
February 29 2020 7:29:50
root
0755
xlsfonts
26.398 KB
February 29 2020 7:29:50
root
0755
xmag
48.422 KB
February 29 2020 12:10:29
root
0755
xman
81.203 KB
February 29 2020 12:10:29
root
0755
xmessage
27.188 KB
February 29 2020 7:29:50
root
0755
xmodmap
34.336 KB
March 18 2018 11:19:30
root
0755
xmore
18.578 KB
February 29 2020 12:10:29
root
0755
xprop
48.602 KB
February 29 2020 7:29:50
root
0755
xrandr
62.086 KB
March 18 2018 11:19:30
root
0755
xrdb
30.086 KB
March 18 2018 11:19:30
root
0755
xrefresh
10.07 KB
March 18 2018 11:19:30
root
0755
xset
29.992 KB
March 18 2018 11:19:30
root
0755
xsetmode
9.992 KB
March 18 2018 11:19:30
root
0755
xsetpointer
9.992 KB
March 18 2018 11:19:30
root
0755
xsetroot
18 KB
March 18 2018 11:19:30
root
0755
xsm
102.766 KB
February 29 2020 7:08:03
root
0755
xstdcmap
14.57 KB
March 18 2018 11:19:30
root
0755
xsubpp
5.043 KB
November 23 2023 4:02:19
root
0755
xvidtune
39.414 KB
March 18 2018 11:19:30
root
0755
xvinfo
18.305 KB
February 29 2020 7:29:50
root
0755
xwd
38.313 KB
February 29 2020 12:10:29
root
0755
xwininfo
50.383 KB
February 29 2020 7:29:50
root
0755
xwud
34.297 KB
February 29 2020 12:10:29
root
0755
xxd
18.273 KB
December 07 2023 4:42:49
root
0755
xz
78.5 KB
April 08 2022 2:56:10
root
0755
xzcat
78.5 KB
April 08 2022 2:56:10
root
0755
xzcmp
6.477 KB
April 08 2022 2:56:10
root
0755
xzdiff
6.477 KB
April 08 2022 2:56:10
root
0755
xzegrep
5.764 KB
April 08 2022 2:56:10
root
0755
xzfgrep
5.764 KB
April 08 2022 2:56:10
root
0755
xzgrep
5.764 KB
April 08 2022 2:56:10
root
0755
xzless
1.76 KB
April 08 2022 2:56:10
root
0755
xzmore
2.11 KB
April 08 2022 2:56:10
root
0755
y2racc2.7
0.576 KB
July 06 2023 12:57:08
root
0755
yes
38.336 KB
September 05 2019 12:38:40
root
0755
zabbix_sender
269.063 KB
February 04 2020 5:03:41
root
0755
zdump
26.211 KB
November 22 2023 2:32:50
root
0755
zip
211.188 KB
April 21 2017 11:02:44
root
0755
zipcloak
91.617 KB
April 21 2017 11:02:44
root
0755
zipdetails
49.529 KB
November 23 2023 4:02:19
root
0755
zipgrep
2.884 KB
October 07 2022 7:09:47
root
0755
zipinfo
182.289 KB
October 07 2022 7:09:47
root
0755
zipnote
87.391 KB
April 21 2017 11:02:44
root
0755
zipsplit
91.391 KB
April 21 2017 11:02:44
root
0755

NineSec Team - 2022