\n\n"; print "Server message: $!"; exit; } my $ddir = $dir . "data"; print DAT "package SET;\n"; print DAT "%SET::setups = ('$VAR::setup', '$ddir');\n"; print DAT "1;\n"; close(DAT); if (-O $dir . "shared/setups.dat") { if (! chmod(0666, $dir . "shared/setups.dat")) { print "Content-type: text/html\n\n"; print "Cannot chmod file [" . $dir . "shared/setups.dat]
\n\n";
print "Server message: $!";
exit;
}
}
print "Location: admin.cgi?setup=setup\n\n";
}
else {
if (! $VAR::setup) {
eval {
require $dir . "shared/setups.dat";
};
if ($@) {
print "Content-type: text/html\n\n";
print $@;
exit;
}
require $dir . "shared/subs3.cgi";
&load_setup(0);
}
}
eval {
require $dir . "shared/setups.dat";
};
if ($@) {
print "Content-type: text/html\n\n";
print $@;
exit;
}
if (exists($SET::setups{$VAR::setup})) { $VAR::data_dir = $SET::setups{$VAR::setup}; }
else {
print "Content-type: text/html\n\n";
print "Setup [$VAR::setup] doesn't exist";
exit;
}
if (! -e "$VAR::data_dir/variables.dat") {
if (! open(DAT, ">$VAR::data_dir/variables.dat")) {
print "Content-type: text/html\n\n";
print "Cannot create file [$VAR::data_dir/variables.dat]. You may
\n";
print "need to FTP in, create the require $VAR::data_dir directory if it does not exist, and chmod
\n";
print "the directory 777 (drwxrwxrwx). Or you may have defined the data path in the
\n";
print $dir . "shared/setups.dat incorrectly.
\n\n"; print "Server message: $!"; exit; } print DAT "package CFG; \$CFG::notify='1'; \$CFG::email='$ENV{'SERVER_ADMIN'}'; \$CFG::ccemail=''; \$CFG::log1='1'; \$CFG::log2='1'; \$CFG::log3='1'; \$CFG::threshold='10'; \$CFG::ignore='1'; \$CFG::resolution='3'; \$CFG::title=''; \$CFG::mailprog =''; \$CFG::pwd_file=''; \$CFG::pwd_backup='1'; \$CFG::tzo='0'; \$CFG::action='1'; \$CFG::cookie='30'; \$CFG::cookie_name='$VAR::setup'; \$CFG::burl=''; \$CFG::murl=''; \$CFG::fail1=''; \$CFG::hta_file=''; \$CFG::headers=''; \$CFG::safe='0'; \$CFG::utid='1'; \$CFG::cookie_domain=''; \$CFG::cookie_path='/'; \$CFG::dcp='0777'; \$CFG::fcp='0666'; 1; "; close(DAT); if (-O "$VAR::data_dir/variables.dat") { if (! chmod(0666, "$VAR::data_dir/variables.dat")) { print "Content-type: text/html\n\n"; print "Cannot chmod file [$VAR::data_dir/variables.dat]
\n\n"; print "Server message: $!"; exit; } } } eval { ($0 =~ m,(.*)/[^/]+,) && unshift(@INC, $1); require "$VAR::data_dir/variables.dat"; }; if ($@) { print "Content-type: text/html\n\n"; print $@; exit; } eval { &main; }; if ($@) { print "Content-type: text/html\n\n"; print $@; } exit; ######################################################## # Main Routine ######################################################## sub main { if (-e "$VAR::data_dir/locked.dat") { &error("Locked out : number of logged failed logins exceeds limit of [5]. To unlock, FTP in and delete the $VAR::data_dir/locked.dat file - then refresh or reload this page", ""); } my @pairs = split(/; /, $ENV{'HTTP_COOKIE'}); my ($pair, %cookie, $cookie); foreach (@pairs) { my ($name, $value) = split(/=/); $cookie{$name} = $value; } ($VAR::login_usr, $VAR::login_pwd) = split(/\+/, $cookie{'PSlogin'}); if ($ENV{'REQUEST_METHOD'} eq "GET") { if (($VAR::login_usr) && (-e "$VAR::data_dir/password.dat")) { require $dir . "shared/subs6.cgi"; &recheck_ps_admin_login($VAR::login_usr, $VAR::login_pwd); } elsif ((! $VAR::login_usr) && (-e "$VAR::data_dir/password.dat")) { require $dir . "shared/subs6.cgi"; &ps_admin_login; } $|++; my @pairs = split(/&/, $ENV{'QUERY_STRING'}); my ($name, $value, %in); foreach (@pairs) { ($name, $value) = split(/=/); $in{$name} = $value; } if (! $in{'action'}) { require $dir . "shared/subs6.cgi"; &admin; } elsif ($in{'action'} eq "Menu") { require $dir . "shared/subs6.cgi"; &menu; } elsif ($in{'action'} eq "Log_Out") { require $dir . "shared/subs6.cgi"; &log_out_ps_admin; } elsif ($in{'action'} eq "Tracking_Statistics") { require $dir . "shared/subs1.cgi"; &tracking_statistics; } elsif ($in{'action'} eq "Tracked_Users") { require $dir . "shared/subs1.cgi"; &tracked_users_options; } elsif ($in{'action'} eq "Exempt_Users") { require $dir . "shared/subs1.cgi"; &exempt_users; } elsif ($in{'action'} eq "Suspended_Users") { require $dir . "shared/subs1.cgi"; &suspended_users; } elsif ($in{'action'} eq "User_Tracking_IDs") { require $dir . "shared/subs1.cgi"; &user_tracking_ids; } elsif ($in{'action'} eq "Manage_Users") { require $dir . "shared/subs1.cgi"; &manage_users_options; } elsif ($in{'action'} eq "Resolve_IP") { require $dir . "shared/subs4.cgi"; &resolve_ip_form; } elsif ($in{'action'} eq "Error_Log") { require $dir . "shared/subs2.cgi"; &error_log; } elsif ($in{'action'} eq "Login_Log") { require $dir . "shared/subs2.cgi"; &login_log_options; } elsif ($in{'action'} eq "Action_Log") { require $dir . "shared/subs2.cgi"; &action_log; } elsif ($in{'action'} eq "Backup_Password_Files") { require $dir . "shared/subs2.cgi"; &backup_password_files; } elsif ($in{'action'} eq "Disk_Usage") { require $dir . "shared/subs2.cgi"; &disk_usage; } elsif ($in{'action'} eq "Purge_PS_Logs") { require $dir . "shared/subs2.cgi"; &purge_ps_logs_options; } elsif ($in{'action'} eq "Backup_Restore") { require $dir . "shared/subs2.cgi"; &backup_restore; } elsif ($in{'action'} eq "Synchronize") { require $dir . "shared/subs5.cgi"; &synchronize; } elsif ($in{'action'} eq "Purge_All_User_IP_Logs") { require $dir . "shared/subs5.cgi"; &purge_all_user_ip_logs; } elsif ($in{'action'} eq "Manage_HTACCESS") { require $dir . "shared/subs4.cgi"; &manage_htaccess; } elsif ($in{'action'} eq "Preferences") { require $dir . "shared/subs3.cgi"; &preferences; } elsif ($in{'action'} eq "PS_Admin_Authentication") { require $dir . "shared/subs3.cgi"; &ps_admin_authentication; } elsif ($in{'action'} eq "Load_Setup") { require $dir . "shared/subs3.cgi"; &load_setup(1); } elsif ($in{'action'} eq "Manage_Setups") { require $dir . "shared/subs3.cgi"; &manage_setups; } elsif ($in{'action'} eq "Check_Setup") { require $dir . "shared/subs3.cgi"; &check_setup; } elsif ($in{'action'} eq "Server_Snapshot") { require $dir . "shared/subs3.cgi"; &server_snapshot; } elsif ($in{'action'} eq "PS_Admin_Home") { require $dir . "shared/subs6.cgi"; &ps_admin_home; } elsif ($in{'action'} eq "Members_Home") { require $dir . "shared/subs4.cgi"; &members_home("", "", 0); } elsif ($in{'action'} eq "About_PS") { require $dir . "shared/subs4.cgi"; &about_ps; } elsif ($in{'action'} eq "Contact_Us") { require $dir . "shared/subs4.cgi"; &contact_us; } else { &oops("Invalid / unrecognized command submitted [$in{'action'}]", ""); } } elsif ($ENV{'REQUEST_METHOD'} eq "POST") { my $form = &parse(); if (($VAR::login_usr) && (-e "$VAR::data_dir/password.dat")) { require $dir . "shared/subs6.cgi"; &recheck_ps_admin_login($VAR::login_usr, $VAR::login_pwd); } if (($form->{'submit'} eq "Home") || ($form->{'submit'} eq "home")) { require $dir . "shared/subs6.cgi"; &ps_admin_home; } elsif ($form->{'submit'} eq "Tracked Users") { require $dir . "shared/subs1.cgi"; &tracked_users_options; } elsif ($form->{'submit'} eq "Display Login Log") { require $dir . "shared/subs2.cgi"; &login_log($form->{'sortby'}); } elsif ($form->{'submit'} eq "Purge PS Logs") { require $dir . "shared/subs2.cgi"; &purge_ps_logs($form->{'dlogs'}); } elsif ($form->{'submit'} eq "Create Setup") { require $dir . "shared/subs3.cgi"; &create_setup($form->{'name'}); } elsif ($form->{'submit'} eq "Edit Setup") { require $dir . "shared/subs3.cgi"; &edit_setup($form->{'name'}); } elsif ($form->{'submit'} eq "Save Setup") { require $dir . "shared/subs3.cgi"; &save_setup($form->{'old_name'}, $form->{'new_name'}, $form->{'d_dir'}, $form->{'flag'}); } elsif ($form->{'submit'} eq "Delete Setup") { require $dir . "shared/subs3.cgi"; &delete_setup($form->{'new_name'}); } elsif ($form->{'submit'} eq "Login") { require $dir . "shared/subs6.cgi"; &verify_ps_admin_login($form->{'login_usr'}, $form->{'login_pwd'}, $form->{'days'}); } elsif ($form->{'submit'} eq "Send") { require $dir . "shared/subs4.cgi"; &send($form->{'username'}, $form->{'sender'}, $form->{'subject'}, $form->{'message'}); } elsif ($form->{'submit'} eq "Unexempt User") { require $dir . "shared/subs1.cgi"; &save_exempt($form->{'username'}, 0); } elsif ($form->{'submit'} eq "Exempt User") { require $dir . "shared/subs1.cgi"; &save_exempt($form->{'username'}, 1); } elsif ($form->{'submit'} eq "Display Users") { require $dir . "shared/subs1.cgi"; &manage_users($form->{'num_per_page'}, $form->{'page'}); } elsif ($form->{'submit'} eq "Page Change") { require $dir . "shared/subs1.cgi"; &manage_users($form->{'num_per_page'}, $form->{'page'}); } elsif ($form->{'submit'} eq "Display Tracked Users") { require $dir . "shared/subs1.cgi"; &display_tracked_users($form->{'num_per_page'}, $form->{'page'}, $form->{'s1'}, $form->{'s2'}, $form->{'s3'}, $form->{'s4'}, $form->{'s5'}, $form->{'s6'}, $form->{'display'}); } elsif ($form->{'submit'} eq "Manage Tracked Users") { require $dir . "shared/subs1.cgi"; &tracked_users($form->{'num_per_page'}, $form->{'page'}, $form->{'s1'}, $form->{'s2'}, $form->{'s3'}, $form->{'s4'}, $form->{'s5'}, $form->{'s6'}, $form->{'display'}); } elsif ($form->{'submit'} eq "Redefine User Display") { require $dir . "shared/subs1.cgi"; &tracked_users_options; } elsif ($form->{'submit'} eq "Change Page") { require $dir . "shared/subs1.cgi"; &tracked_users($form->{'num_per_page'}, $form->{'page'}, $form->{'s1'}, $form->{'s2'}, $form->{'s3'}, $form->{'s4'}, $form->{'s5'}, $form->{'s6'}, $form->{'display'}); } elsif ($form->{'submit'} eq "Save Preferences") { require $dir . "shared/subs3.cgi"; &save_preferences($form->{'notify'}, $form->{'email'}, $form->{'ccemail'}, $form->{'log1'}, $form->{'log2'},$form->{'log3'}, $form->{'threshold'}, $form->{'ignore'}, $form->{'resolution'}, $form->{'title'}, $form->{'mailprog'}, $form->{'pwd_file'}, $form->{'pwd_backup'}, $form->{'tzo'}, $form->{'action'}, $form->{'cookie'}, $form->{'cookie_name'}, $form->{'burl'}, $form->{'murl'}, $form->{'fail1'}, $form->{'hta_file'}, $form->{'headers'}, $form->{'safe'}, $form->{'utid'}, $form->{'cookie_domain'}, $form->{'cookie_path'}, $form->{'dcp'}, $form->{'fcp'}); } elsif ($form->{'submit'} eq "Save HTACCESS") { require $dir . "shared/subs4.cgi"; &save_htaccess($form->{'file'}); } elsif ($form->{'submit'} eq "Backup") { require $dir . "shared/subs2.cgi"; &save_backup($form->{'file'}); } elsif ($form->{'submit'} eq "Restore") { require $dir . "shared/subs2.cgi"; &restore_backup($form->{'file'}); } elsif ($form->{'submit'} eq "Restore Backup Password File") { require $dir . "shared/subs2.cgi"; &restore_backup_password_file($form->{'file'}); } elsif ($form->{'submit'} eq "Delete Backup Password File") { require $dir . "shared/subs2.cgi"; &delete_backup_password_file($form->{'backups'}); } elsif ($form->{'submit'} eq "Purge User Tracking IDs") { require $dir . "shared/subs1.cgi"; &purge_selected_user_tracking_ids($form->{'ips'}); } elsif ($form->{'submit'} eq "Restore Backup Password File") { require $dir . "shared/subs2.cgi"; &restore_backup_password_file($form->{'backups'}); } elsif ($form->{'submit'} eq "Display Backup Password File") { require $dir . "shared/subs2.cgi"; &display_backup_password_file($form->{'backups'}); } elsif ($form->{'submit'} eq "View Suspended User IP Log") { require $dir . "shared/subs1.cgi"; &view_suspended_user_ip_log($form->{'username'}); } elsif ($form->{'submit'} eq "Delete Suspended User") { require $dir . "shared/subs7.cgi"; &delete_user($form->{'username'}); } elsif ($form->{'submit'} eq "Restore Suspended User") { require $dir . "shared/subs1.cgi"; &restore_suspended_user($form->{'username'}); } elsif ($form->{'submit'} eq "Delete User") { require $dir . "shared/subs7.cgi"; &delete_user($form->{'username'}); } elsif ($form->{'submit'} eq "Delete IP Log") { require $dir . "shared/subs7.cgi"; &delete_selected_ip_logs($form->{'username'}); } elsif ($form->{'submit'} eq "Suspend User") { require $dir . "shared/subs7.cgi"; &suspend_user($form->{'username'}); } elsif ($form->{'submit'} eq "Restore User") { require $dir . "shared/subs1.cgi"; &restore_suspended_user($form->{'username'}); } elsif ($form->{'submit'} eq "Delete Error Log") { require $dir . "shared/subs2.cgi"; &delete_error_log; } elsif ($form->{'submit'} eq "Delete Login Log") { require $dir . "shared/subs2.cgi"; &delete_login_log; } elsif ($form->{'submit'} eq "Delete Action Log") { require $dir . "shared/subs2.cgi"; &delete_action_log; } elsif ($form->{'submit'} eq "Add User") { require $dir . "shared/subs7.cgi"; &add_user($form->{'data'}, $form->{'format'}, $form->{'delimiter1'}, $form->{'delimiter2'}); } elsif ($form->{'submit'} eq "Password Protect PS Admin") { require $dir . "shared/subs3.cgi"; &ps_admin_pwd($form->{'new_usr'}, $form->{'new_pwd'}, $form->{'auth_setup'}, 0, $form->{'cobalt'}); } elsif ($form->{'submit'} eq "Change Admin Password") { require $dir . "shared/subs3.cgi"; &ps_admin_pwd($form->{'new_usr'}, $form->{'new_pwd'}, $form->{'auth_setup'}, 1, $form->{'cobalt'}); } elsif ($form->{'submit'} eq "Remove Password Protection") { require $dir . "shared/subs3.cgi"; &remove_admin_pwd($form->{'auth_setup'}); } elsif ($form->{'submit'} eq "Login to Members") { require $dir . "shared/subs4.cgi"; &members_home($form->{'mem_usr'}, $form->{'mem_pwd'}, 1); } elsif ($form->{'submit'} eq "Resolve IP") { require $dir . "shared/subs4.cgi"; &resolve_IP($form->{'lookup_IP'}); } else { &oops("Invalid / unrecognized command submitted", ""); } } else { &oops("Invalid / unrecognized command submitted", ""); } }
\n" if (! $body); #print "HTTP/1.0 200 OK\n"; print "Content-type: text/html\n\n"; print <
|
---|
\n\n";
print "You MUST define FULL ABSOLUTE (NOT relative, and NOT URL) path to setups.dat configuration file -
\n";
print "located in the sentry/admin/shared/ directory. This path is defined in the reset.cgi file. The
\n";
print "path has either not been defined, or is incorrectly defined. Correct by manually editing
\n";
print "reset.cgi - edit using ASCII (text) editor like Notepad, and upload edited file in ASCII (text).
\n\n"; print "Server message: $@\n"; exit; } ########################################################################## # Do NOT change or alter the code below! ########################################################################## print "Content-type: text/html\n\n"; print "reset.cgi [Version 5.30200402261]
\n\n";
eval { &main; };
if ($@) { print $@; }
exit;
########################################################
# Main Routine
########################################################
sub main {
my $setup;
if (! $permission) {
print "This script has been disabled. To enable, edit the \$permission variable in the reset.cgi script\n";
exit;
}
if (($permission == 1) && ($ENV{'QUERY_STRING'})) {
print "This script cannot be called from the browser - only via cron. To call from browser, change \n";
print "\$permission to 2 in the reset.cgi script\n";
exit;
}
my $data_dir;
if ($ARGV[0] || $ENV{'QUERY_STRING'}) {
$setup = $ARGV[0] if $ARGV[0];
$setup = $ENV{'QUERY_STRING'} if $ENV{'QUERY_STRING'};
if (exists($SET::setups{$setup})) { $data_dir = $SET::setups{$setup}; }
else { &error("Setup [$setup] doesn't exist"); }
}
else {
print "No setup name passed to reset
\n";
print "=============================
\n\n"; print "To call this script from the browser to manually reset:
\n\n"; print "http://www.yoursite.com/cgi-bin/sentry/admin/reset.cgi?setup_name
\n\n";
print "Where setup_name is the name of the PS setup you wish to reset. The
\n";
print "default setup_name is simply: setup
\n\n";
print "To execute this script automatically at preset times and dates via cron,
\n";
print "please contact your web host.\n";
exit;
}
if ($alog_cap) {
if (-e "$data_dir/action.log") {
if (((stat("$data_dir/action.log"))[7]) > $alog_cap) {
unlink("$data_dir/action.log") || &error("Cannot delete file [$data_dir/action.log] - $!");
}
}
}
if ($elog_cap) {
if (-e "$data_dir/error.log") {
if (((stat("$data_dir/error.log"))[7]) > $elog_cap) {
unlink("$data_dir/error.log") || &error("Cannot delete file [$data_dir/error.log] - $!");
}
}
}
if ($llog_cap) {
if (-e "$data_dir/login.log") {
if (((stat("$data_dir/login.log"))[7]) > $llog_cap) {
unlink("$data_dir/login.log") || &error("Cannot delete file [$data_dir/login.log] - $!");
}
}
}
my (@files, $file);
if ($pw_cap) {
opendir(DIR, $data_dir) || &error("Cannot open directory [$data_dir] - $!");
@files = sort(grep { m/.*\.pwd/ } readdir(DIR));
closedir(DIR);
for (@files) {
if ((time() - (stat("$data_dir/$_"))[9]) > $pw_cap) { unlink("$data_dir/$_") || &error("Cannot delete file [$data_dir/$_] - $!"); }
}
}
if ($id_cap) {
opendir(DIR, "$data_dir/ips") || &error("Cannot open directory [$data_dir/ips] - $!");
while ($file = readdir(DIR)) {
if (-f "$data_dir/ips/$file") {
if ((time() - (stat("$data_dir/ips/$file"))[9]) > $id_cap) { unlink("$data_dir/ips/$file") || &error("Cannot delete file [$data_dir/ips/$file] - $!"); }
}
}
closedir(DIR);
}
if ($su_cap) {
opendir(DIR, "$data_dir/suspended") || &error("Cannot open directory [$data_dir/suspended] - $!");
while ($file = readdir(DIR)) {
if (-f "$data_dir/suspended/$file") {
if ((time() - (stat("$data_dir/suspended/$file"))[9]) > $su_cap) {
unlink("$data_dir/suspended/$file") || &error("Cannot delete file [$data_dir/suspended/$file] - $!");
}
}
}
closedir(DIR);
}
if ($ip_cap) {
opendir(DIR, "$data_dir/tracked") || &error("Cannot open directory [$data_dir/tracked] - $!");
@files = sort(grep { m/.*\.hst/ } readdir(DIR));
closedir(DIR);
my (@IPs, $numIPs, $usr, $ext);
for $file (@files) {
open(HST, "$data_dir/tracked/$file") || &error("Cannot open file [$data_dir/tracked/$file] - $!");
@IPs =
|
---|
HTML
}
###############################################
# Footer
###############################################
sub footer {
print <
HTML
}
###############################################
# Error Handler
###############################################
sub error {
my ($err_msg1, $err_msg2) = @_;
my @cone = caller(1);
my $fnct = $cone[3];
$fnct =~ s/VAR::/SUB /i;
my ($package, $filename, $line) = caller;
chomp $err_msg2;
if (! $err_msg2) { $err_msg2 = "None"; }
my $extra;
if ($err_msg2 =~ m/permission denied/i) {
$extra = ". Ensure the directory / file path is correct - you MUST use full, absolute server directory paths (not URLs). If you are sure the path is ";
$extra .= "correct, then if you get this error when a new file is being created, CHMOD (via FTP - for details regarding CHMOD, please refer to ";
$extra .= "PS Admin [Help]) the directory that the file is being created in 777 (rwxrwxrwx). Otherwise, if you get this error when an existing file ";
$extra .= "is being updated, CHMOD (via FTP) the file 666 (rw-rw-rw-).";
}
&header;
print <
HTML my $time = &get_time_stamp(); if ($num_pages == 1) { $numforms = 1; } else { $numforms = 2; } print < HTML if ($num_pages > 1) { print <
|
---|
HTML } print <
= Exempt User
= Non-Suspended
= Suspended User
|
HTML
}
print <
User |
Last Tracked Date |
Num IPs |
HTML
if ($display != 2) {
print qq~ Logged IPs | Resolved IPs | \n~;
}
else {
print qq~ IP Bar Chart | \n~;
}
print qq~ \n~;
for ($index = $start; $index < ($end + 1); $index++) {
$username = $member[$index];
$time = (stat("$VAR::data_dir/tracked/$username.hst"))[9];
$login = &get_time_stamp($time);
open(HST, "$VAR::data_dir/tracked/$username.hst") || &error("Cannot open file [$VAR::data_dir/tracked/$username.hst]", $!);
@IPs = sort($login |
$numIPs |
HTML
if ($display == 0) {
print qq~ \n~;
print qq~ \n~;
}
print qq~ | \n~;
print qq~ \n~;
}
print <
|
---|
HTML if ($num_pages > 1) { print <
|
---|
Su | Mo | Tu | We | Th | Fr | Sa | \\r\\n
"; } for (var i = 1; i < 10; i++) { tabla = tabla + "\\r\\n | "; if (((i+ajuste) % 7)==0) tabla = tabla + "\\r\\n | |||||
"; if (((i+ajuste) % 7)==0) tabla = tabla + "\\r\\n | ||||||
|
---|
~; } } &header; print <
HTML &footer; } ######################################################## # View Suspended User IP Log ######################################################## sub view_suspended_user_ip_log { if ($CFG::safe) { &message; } my ($username) = $_[0]; if (! $username) { &oops("No suspended user(s) selected to view IP Logs."); } for (split(/,/, $username)) { $message .= "User [$_]:\n"; $message .= "=========================\n"; if (-e "$VAR::data_dir/tracked/$_.hst") { $time = (stat("$VAR::data_dir/tracked/$_.hst"))[9]; $login = &get_time_stamp($time); open(HST, "$VAR::data_dir/tracked/$_.hst") || &error("Cannot open file [$VAR::data_dir/tracked/$_.hst]", $!); @IPs = sort(~; &confirm($message); } ######################################################## # Manage Users Options ######################################################## sub manage_users_options { &header; print <
HTML &footer; } ######################################################## # Manage Users ######################################################## sub manage_users { if (! $CFG::pwd_file) { &oops("No password file defined."); } ($num_per_page, $page) = @_; if (! -e $CFG::pwd_file) { open(PWD, ">$CFG::pwd_file") || &error("Cannot create file [$CFG::pwd_file]", $!); close(PWD); $num_users = 0; } else { open(PWD, $CFG::pwd_file) || &error("Cannot open file [$CFG::pwd_file]", $!); @users = sort {lc $a cmp lc $b}