#! /usr/bin/perl -w
# member_watch.pl
use strict;
my ($repdate,$date,$ufile1,$ufile2,$track1,$track2,$tmpfile);
chomp($repdate = `/bin/date "+%A %d %B %Y"`);
$date = `date +%d/%m/%y`;
$ufile1 = "/path/to/htpasswd-ONE";
$ufile2 = "/path/to/htpasswd-TWO";
$track1 = "/path/to/log/location/service1";
$track2 = "/path/to/log/location/service2";
$tmpfile= "/tmp/member.report";
chomp($date);
# get users from PREVIOUS htpasswd
my @traw1 = parse_trackfile($track1);
my @traw2 = parse_trackfile($track2);
my @tusers_service1 = sort @traw1;
my @tusers_service2 = sort @traw2;
# get current users from htpasswd
my @uraw1 = parse_htpasswd($ufile1,$track1);
my @uraw2 = parse_htpasswd($ufile2,$track2);
# sort lexically -- (alphabetically)
my @cusers_service1 = sort @uraw1;
my @cusers_service2 = sort @uraw2;
calculate_users("Service 1",\@cusers_service1,\@tusers_service1);
calculate_users("Service 2",\@cusers_service2,\@tusers_service2);
# ---------------
# subroutines
# ---------------
sub parse_trackfile {
my $trackfile = shift;
chomp (my $now = `date +%Y.%m.%d`);
my @users;
open FILE,$trackfile or die "Cannot open $trackfile: $!";
while (<FILE>) {
next if $_ =~ /^$/;
next if $_ =~ /^\#$/;
chomp($_);
push @users,$_;
}
close FILE or warn $!;
system("cp","$trackfile","${trackfile}-$now");
return @users;
}
sub parse_htpasswd {
my ($ufile,$trackfile) = @_;
my (@users,$user,$pass);
open TRACK,">$trackfile" or die "Cannot open $trackfile: $!\n";
open FILE,$ufile or die "Cannot open $ufile: $!\n";
while (<FILE>) {
next if $_ =~ /^$/;
next if $_ =~ /^\#$/;
($user,$pass) = split /:/;
print TRACK "$user\n";
push @users, $user;
}
close FILE or warn $!;
close TRACK or warn $!;
return @users;
}
sub calculate_users {
my ($service,$current,$previous) = @_;
my %current = map { $_ => 1 } @$current;
my %previous = map { $_ => 1 } @$previous;
# calculate NEW users
my @new_users = grep (!defined $previous{$_},@$current);
# calculate CANCELLED users
my @cancelled_users = grep (!defined $current{$_},@$previous);
# calculate REMAINING users
my @remaining_users = grep($current{$_},@$previous);
my ($new_cnt,$canc_cnt,$rem_cnt);
if (@new_users) {
$new_cnt = $#new_users;
} else {
$new_cnt = "0";
}
if (@cancelled_users) {
$canc_cnt = $#cancelled_users;
} else {
$canc_cnt = "0";
}
if (@remaining_users) {
$rem_cnt = $#remaining_users;
} else {
$rem_cnt = "0";
}
# open temp file for writing:
open TMP, ">$tmpfile" or die $!;
# print the report suitable for emailing
print TMP "$service: Member Information for $repdate\n\n";
print TMP "New Members:\t\t $new_cnt\n";
print TMP "Cancelled Members:\t $canc_cnt\n";
print TMP "Remaining Members:\t $rem_cnt\n";
print TMP "\n";
print TMP "------- New ------------------\n";
print TMP "\t$_\n" for @new_users;
print TMP "------------------------------\n\n";
print TMP "------- Cancelled ------------\n";
print TMP "\t$_\n" for @cancelled_users;
print TMP "------------------------------\n\n";
print TMP "------- Remaining ------------\n";
print TMP "\t$_\n" for @remaining_users;
print TMP "------------------------------\n";
close TMP or warn $!;
email_daily_report($service);
clean_up();
}
sub email_daily_report {
my ($service) = @_;
chomp (my $hostname = `/bin/hostname`);
open TMP,$tmpfile or die "Cannot open $tmpfile: $!\n";
open(SENDMAIL, "|/usr/lib/sendmail -oi -t")
or die "Cannot fork for sendmail: $!\n";
print SENDMAIL "From: MemberWatch <nobody\@${hostname}>\n";
print SENDMAIL "To: Webmaster <webmaster\@somedomain.dom>\n";
print SENDMAIL "Cc: Accounting <accounting\@somedomain.dom>\n";
print SENDMAIL "Subject: [$service] Members: $repdate\n";
print SENDMAIL "\n";
while (<TMP>) {
print SENDMAIL "$_";
}
close(SENDMAIL) or warn "Oops, sendmail did not close nicely";
close TMP or warn $!;
}
sub clean_up {
unlink $tmpfile or die "Cannot unlink $tmpfile: $!\n";
}
|