#!/usr/bin/perl # delexpired.pl # # by M.D. Brownsworth # # Version 2.7 # 6 Feb 02 # # Companion crontab script to popauthd SMTP authorization daemon. # Deletes expired entries from sendmail access files, rehashes db. # # Example entry from access.info file: # Mar 20 14:03:01 michelle 24.14.231.140 985125786 # # Example crontab: # Delete expired entries in relay allow file at 15 minutes after hour # 15 * * * * root /etc/cron_scripts/delexpired.pl require 5.004; use IO::Seekable; use Fcntl qw(:DEFAULT :flock); $maildir = "/etc/mail"; $access = "$maildir/access"; $makeaccess ="$maildir/makeaccess"; $newtimestamp = time; # Uncomment desired expiration value below #$expires = 3600; # 1 hour #$expires = 10800; # 3 hours #$expires = 21600; # 6 hours #$expires = 43200; # 12 hours #$expires = 86400; # 1 day #$expires = 129600; # 3 days $expires = 604800; # 1 week #$expires = 1209600; # 2 weeks #$expires = 1814400; # 3 weeks #$expires = 2419200; # 1 month open(ACCESS, "$access") || die "Can't open $access $!\n"; flock(ACCESS, LOCK_EX); # Lock file to prevent other updates open(INFO, "${access}.info") || die "Can't open ${access}.info: $!\n"; flock(INFO, LOCK_EX); # Ditto open(TEMP, ">>${access}.temp2") || die "Can't open ${access}.temp2: $!\n"; while() { ($date,$userid,$ip,$timestamp) = split(/\t/, $_); chomp($timestamp); # Trim trailing newline char next if (($newtimestamp - $timestamp) > $expires); print TEMP; } close(TEMP); system("awk -F\\\t '{ print \$3 \"\tRELAY\" }' ${access}.temp2 > ${access}.relay"); # Intermediate file system("[ ! -r ${access}.static ] && { touch ${access}.static; }"); # Create static file if none exists flock(ACCESS, LOCK_UN); close(ACCESS); system("cat ${access}.relay ${access}.static > $access"); # Combine relay and static files system("$makeaccess"); # Rehash access.db system("rm ${access}.relay"); # Tidy up rename("${access}.temp2","${access}.info"); flock(INFO, LOCK_UN); close(INFO); exit(0);