#!/usr/bin/perl5 # # This tests all the possible invocations of crontab # # $| = 1; # $user MUST be a valid user with a crontab and SHELL=/bin/sh $user = 'sys'; $file = "crontab.test.$$"; $crontab = './crontab'; $tempfile = "crontab.tmp.$$"; $ENV{'EDITOR'} = '/bin/ed'; $ENV{'SHELL'} = '/bin/sh'; $CRONDIR = '/usr/spool/cron/crontabs'; chdir('/tmp') || die "cannot chdir /tmp: $!\n"; open(CT, ">$file"); print CT </dev/null 2>&1", "edit {U}'s crontab", "ls -l $CRONDIR/{U} | grep '^-r' >/dev/null", "$crontab -l >$tempfile", "list user's crontab", "cmp $CRONDIR/{U} $tempfile", "$crontab -r", "remove {U}'s crontab", "perl -e 'exit(-e \"$CRONDIR/{U}\")'", # -- su only "$crontab -l $user >$tempfile", "list $user's crontab (root or $user only)", "grep $user $tempfile >/dev/null", "(echo q | $crontab -e {U}) >/dev/null 2>&1", "edit {U}'s crontab (root or {U} only)", "ls -l $CRONDIR/{U} | grep '^-r' >/dev/null", "$crontab -r {U}", "remove {U}'s crontab (root or {U} only)", "perl -e 'exit ((\"{U}\" eq \"root\" || \"{U}\" eq \"$user\") ? 0 : 1)'", "$crontab -l diag >$tempfile 2>&1", "list diag's crontab (root only)", "grep diag $tempfile >/dev/null || grep 'authorized' $tempfile >/dev/null", "$crontab diag gaga >$tempfile 2>&1", "Too many args, should fail", "grep 'proper usage' $tempfile >/dev/null", ); if ($< != 0) { die "$0: crontab test script must be run as root\n"; } @save_cmds = @cmds; foreach $u ('root', $user) { ($login,$pass,$uid,$gid) = getpwnam($u); die "$u: no such user. you must create a user $u to run this test\n" unless (!$login); if ($u eq 'root') { $prefix = $postfix = ''; } else { $prefix = "su $user -c '"; $postfix = "'"; } # save a copy of this user's crontab $saved_ct = "crontab.$u.sav"; system("cp $CRONDIR/$u $saved_ct"); @cmds = @save_cmds; while (@cmds) { $cmd = shift(@cmds); $cmd =~ s,{U},$u,g; $expected = shift(@cmds); $expected =~ s,{U},$u,g; $checkok = shift(@cmds); $checkok =~ s,{U},$u,g; # print "---\nUSER=$u\t CMD='$cmd'\n", # "Expect: $expected\n", # "Press [RETURN] to execute: "; # ; $? = 0; # if ($cmd =~ /\b-[el]\b/) { # $postfix .= ' >$tempfile 2>&1'; # } $newcmd = "$prefix$cmd$postfix"; system($newcmd); $status = $?; # print "Running test: $checkok\n"; $? = 0; system("$checkok"); if ($?) { print "--- FAILED Test:\n", "\tUSER=$u\n", "\tCMD='$newcmd'\n", "\tExpect: $expected\n", "\tTest: $checkok\n"; exit 1; $failures++; } else { print "OK: $newcmd\n"; unlink($tempfile); } # restore user's crontab system("cp $saved_ct $CRONDIR/$u"); } } unlink($file); unlink($tempfile); exit $failures;