I have a sh script as follows. The script worked OK until the year rolled
over. My (now deleted) simple sh way of figuring the month and year blew
up. I decided to rewrite the script in perl because of the date/time
functions. It takes multiple commandline args (usernames) and checks for
various information on them. Since the maillogs are so large I want to exit
the first loop as soon as it is determined that the user has checked their
mail. 

#!/bin/sh

ext=`date +%Y%m`

month1="200702"
month2="200701"
month3="200612"
month4=200611
month5=200610
month6=200609
month7=200608

for i in $* ; do

        echo $i

        if test -r /export/home/$i/.forward ; then echo $i has forward file
; continue ;
        elif [ "`fgrep -c "user=$i" /var/adm/maillog`" -gt "0" ] ; then
echo $i checked mail month 0 ;  continue ;
        elif [ "`fgrep -c "user=$i" /export/home/archives/maillog.$month1`"
-gt "0" ] ; then echo $i checked mail month 1 ; continue;
        elif [ "`fgrep -c "user=$i" /export/home/archives/maillog.$month2`"
-gt "0" ] ; then echo $i checked mail month 2 ; continue;
        elif [ "`fgrep -c "user=$i" /export/home/archives/maillog.$month3`"
-gt "0" ] ; then echo $i checked mail month 3 ; continue;
        elif [ "`fgrep -c "user=$i" /export/home/archives/maillog.$month4`"
-gt "0" ] ; then echo $i checked mail month 4 ; continue;
        elif [ "`fgrep -c "user=$i" /export/home/archives/maillog.$month5`"
-gt "0" ] ; then echo $i checked mail month 5 ; continue;
        elif [ "`fgrep -c "user=$i" /export/home/archives/maillog.$month6`"
-gt "0" ] ; then echo $i checked mail month 6 ; continue;
        else echo $i has not checked mail in the last 6 months ;
        fi
        
        echo checking last for 2007 ; last -3 $i
        echo checking 2007 dial-up ; fgrep -c P${i}
/var/adm/radacct/pleiades/detail
        echo checking for last modified file ; ls -lrt /export/home/$i |
tail -2
        echo checking for newest file in public_html ; ls -lrt
/export/home/$i/public_html | tail -2 
        ls -lsu /export/mail/$i
        quota -v $i
        finger -m $i
        
done

This is what I have so far in perl:

# cat tt.pl
#!/usr/bin/perl -w

use POSIX;

# Get the current month and year
my ($mon,$year) = (localtime)[4,5];

# Seed nmonth

my @nmonth = (1,1,1,1,$mon,$year,0,0);

my $sec  =  1;
my $min  =  1;
my $hour =  1;
my $day  =  1;
my $wday =  0;
my $yday =  0;

# Put the loop here
my $a = 1;
while ($a < 7) {
 
        my $current = mktime($sec, $min, $hour, $day, $nmonth[4],
$nmonth[5], $wday, $yday); # Make new timestamp for the first
        @nmonth = localtime($current);          # Make an array out of the
timestamp to get the month and year
        my $ext_mon = ($nmonth[4] + 1);         # Pull the month out of the
array and add 1 to get month number
        my $ext_year = ($nmonth[5] + 1900);     # Pull the year and add
1900 to get the actual year
        if ($ext_mon <= 9) {                    # Make the month have two
places and write the var $ext
                $ext = $ext_year . '0' . $ext_mon;
        }
        else {
                $ext = $ext_year . $ext_mon;
        }

        push (@flist, $ext);
        $current = $current - 86400;    # Subtract one day from the first
timestamp to get the month before
        @nmonth = localtime($current);          # Make an array out of the
new timestamp for the next round
}
continue {
        $a++;
}

# This is the part I am having trouble with :

foreach $k (@ARGV) {

        if (-e ("/export/home/$k/.forward")) { 
                print "User $k has a forward file.\n\n" ; next ;
        } else {
        
        open MAILLOG, "/var/adm/maillog" or die "couldn't open maillog :
$!\n";
                if ($count = grep /user=$k/o, <MAILLOG> ) {
                print "$k checked mail $count times in
/var/adm/maillog.\n"; next ;
                } else {
        close MAILLOG; 

        open MAILLOG, "/export/home/archives/maillog.$flist[1]" or die
"couldn't open maillog.$flist[1] : $!\n";
                if ($count = grep /user=$k/o, <MAILLOG> ) {
                        print "$k checked mail $count times in
maillog.$flist[1].\n"; next ;
                } else {
        close MAILLOG; 

        open MAILLOG, "/export/home/archives/maillog.$flist[2]" or die
"couldn't open maillog.$flist[2] : $!\n";
                if ( $count = grep /user=$k/o, <MAILLOG> ) {
                print "$k checked mail $count times in
maillog.$flist[2].\n"; next ;
        } else {
        close MAILLOG;
        
        open MAILLOG, "/export/home/archives/maillog.$flist[3]" or die
"couldn't open maillog.$flist[3] : $!\n";
                if ( $count = grep /user=$k/o, <MAILLOG> ) {
                print "$k checked mail $count times in
maillog.$flist[3].\n"; next ;
        } else {
        close MAILLOG;
        
        open MAILLOG, "/export/home/archives/maillog.$flist[4]" or die
"couldn't open maillog.$flist[4] : $!\n";
                if ( $count = grep /user=$k/o, <MAILLOG> ) {
                print "$k checked mail $count times in
maillog.$flist[4].\n"; next ;
        } else {
        close MAILLOG;

        open MAILLOG, "/export/home/archives/maillog.$flist[5]" or die
"couldn't open maillog.$flist[5] : $!\n";
                if ( $count = grep /user=$k/o, <MAILLOG> ) {
                print "$k checked mail $count times in
maillog.$flist[5].\n"; next ;
        } else {
        close MAILLOG; print "$k has not checked their mail in the last 6
months.\n";

        }
        }
        }
        }
        }
        }

}
}


Input and output looks like this:

# ./tt.pl karyn smurphy root
karyn checked mail 2864 times in /var/adm/maillog.
smurphy checked mail 2864 times in /var/adm/maillog.
root checked mail 2864 times in /var/adm/maillog.
#

Yes, it goes to the next arg but as you can see, it returns the same count
for each subsequent arg. 

I feel that my braces are (all/part/some) of the problem, but not sure
how/what. Any suggestions would be appreciated.


-- 

Karyn Williams
Network Services Manager
California Institute of the Arts
[EMAIL PROTECTED]
http://www.calarts.edu/network

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to