ling@nosun.west.sun.com (Ling Kan) (03/28/90)
A couple weeks ago someone asked for an example of using dbm, now another
person asked for a password aging program in perl. May be a piece of code I
wrote last year can satisfy both requests.
This is a perl script that was developed as a toy program, so make sure you
understand it and modify it properly before you use it. (The location of
password database obviously need to be changed.) Also, I am sure perl guru will
correct me of any mistake.
ps. I remember I wrote the code in least than an hour (and this was the first
time I use dbm) while a guy thinking of using C was certan that it needs
man-days to develop such a utility. I consider this is a perfect example to
illustrate the flexibility of perl.
--------------------------------pw-aging.pl--------------------------------
#This script does password aging, it uses the associative arrary extensively
#and uses the dbm support in perl verion 3.0.
#It is run every night to check if a user's password is, say 100
#days old. It will also update the password database if any updates have
#occured.
#if the password file can not be found, then create a new one.
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
if (! -e '/tmp/passwd.dir' || ! -e '/tmp/passwd.pag') {
print "rebuilt password database\n";
dbmopen(PASSD,'/tmp/passwd',0666);
open(PASSF, 'ypcat passwd |');
while (<PASSF>) {
if (/CLOSED/) { next; }
@info = split(/:/);
$PASSD{$info[0]} = $info[1] . ':' . $yday;
}
close(PASSF);
dbmclose(PASSD);
}
# Update the password database
dbmopen(PASSD,'/tmp/passwd',0666);
open(PASSF, 'ypcat passwd |');
while (<PASSF>) {
if (/CLOSED/) { next; }
@info = split(/:/);
if ($PASSD{$info[0]} eq '') {
print "Add user $info[0] into the password database\n";
$PASSD{$info[0]} = $info[1] . ':' . $yday;
next;
}
@old = split(/:/,$PASSD{$info[0]);
if ($info[1] ne $old[1]) {
print "Update the password for user $info[0]\n";
$PASSD{$info[0]} = $info[1] . ':' . $yday;
next;
}
if ($yday > ($old[1] + 100)) { # does not handle year end
# wrap around.
print "uesr $info[1]'s password is older than 100 days"
# take some actions.
}
}
dbmclose(PASSD);
-----------------------------------------------------------------------------
Name: Ling Kan Tel: (503) 690-1386
mail: CADRE Technologies Inc. e-mail: nosun!microcase!ling
19545 N.W. Von Neumann Drive FAX: (503) 690-1320
Beaverton, OR 97006