This file is indexed.

/usr/bin/rad_counter is in freeradius 3.0.12+dfsg-5+deb9u1.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/perl
#
#	$Id: 8de31a153df98b806cab15ccceff5508072b47c4 $
#
use warnings ;
use GDBM_File ;
use Fcntl ;
use Getopt::Long;
use File::Basename;

my $user = '';
my $divisor = 1;
my $reset = 0;
my $match = '.*';
my $help = 0;

#
#  This should be fixed...
#
$filename = '';

sub show_help {
    my $progname = basename($0);
    print <<EOF;
Usage: $progname --file=<counter filename> [OPTION...]
Query and maintain FreeRADIUS rlm_counter DB file.

Arguments:
--file=<filename>               Counter DB filename.

Options:
--user=<username>               Information for specific user.
--match=<regexp>                Information for matching users.
--reset=<number>                Reset counter to <number>.
                                If divisor is set use it,
                                else <number> means seconds.
--help                          Show this help screen.
--(hours|minutes|seconds)       Specify information divisor.
EOF
    exit 0;
}

#
#  Print out only one user,
#
#  Or specify printing in hours, minutes, or seconds (default)
#
GetOptions ('user=s'  => \$user,
	    'match=s' => \$match,
	    'file=s'  => \$filename,
	    'reset=i' => \$reset,
	    'help'    => \$help,
	    'hours'   => sub { $divisor = 3600 },
	    'minutes' => sub { $divisor = 60 },
	    'seconds' => sub { $divisor = 1 } );

show_help if ($help || $filename eq '');

#
#  Open the file.
#
if ($reset){
    my $db = tie(%hash, 'GDBM_File', $filename, O_RDWR, 0666) or die "Cannot open $filename: $!\n";
}else{
    my $db = tie(%hash, 'GDBM_File', $filename, O_RDONLY, 0666) or die "Cannot open $filename: $!\n";
}

#
#  If given one name, give the seconds
#
if ($user ne '') {
    if (defined($hash{$user})){
	print $user, "\t\t", int ( unpack('L',$hash{$user}) / $divisor), "\n";
	if ($reset){
	    my $uniqueid = (unpack('L A32',$hash{$user}))[1];
	    $hash{$user} = pack('L A32',$reset * $divisor,$uniqueid);
	    print $user, "\t\t", "Counter reset to ", $reset * $divisor, "\n";
	}
    }else{
	print $user, "\t\t", "Not found\n";
    }

    undef $db;
    untie %hash;
    exit 0;
}

#
#  This may be faster, but unordered.
#while (($key,$val) = each %hash) {
#
foreach $key (sort keys %hash) {
    #
    #  These are special.
    next if ($key eq "DEFAULT1");
    next if ($key eq "DEFAULT2");

    #
    #  Allow user names matching a regex.
    #
    next if ($key !~ /$match/);

    #
    #  Print out the names...
    print $key, "\t\t", int ( unpack('L',$hash{$key}) / $divisor), "\n";
    if ($reset){
	my $uniqueid = (unpack('L A32',$hash{$key}))[1];
	$hash{$key} = pack('L A32',$reset * $divisor,$uniqueid);
	print $key, "\t\t", "Counter reset to ", $reset * $divisor, "\n";
    }
}
undef $db;
untie %hash;