news.utdallas.edu!wupost!darwin.sura.net!sgiblab!munnari.oz.au!sol.deakin.OZ.AU!mimas.cc.deakin.OZ.AU!not-for-mail Tue Mar 9 22:07:43 CST 1993
Article: 1478 of comp.lang.perl
Xref: feenix.metronet.com comp.lang.perl:1478
Path: feenix.metronet.com!news.utdallas.edu!wupost!darwin.sura.net!sgiblab!munnari.oz.au!sol.deakin.OZ.AU!mimas.cc.deakin.OZ.AU!not-for-mail
From:
[email protected] (Tim Cook)
Newsgroups: comp.lang.perl
#Subject: SOURCE: cronsort - Show crontab entries sorted by class and/or time
Date: 10 Mar 1993 09:03:31 +1000
Organization: Deakin University
Lines: 208
Message-ID: <
[email protected]>
NNTP-Posting-Host: mimas.cc.deakin.oz.au
Have a look at the top of the source to see what this can do, but if
you want to see its best feature, try
$ cronsort -a <your-huge-complex-root-crontab> | more
I just discovered that a "cronsort" was posted to comp.sources.misc in
1988. Written in C of course, and with somewhat fewer features, IMHO.
#!/bin/sh
# This is a shell archive (shar 3.32)
# made 03/09/1993 23:00 UTC by tim
#
# existing files WILL be overwritten
#
# This shar contains:
# length mode name
# ------ ---------- ------------------------------------------
# 5218 -r-xr-x--- cronsort
#
if touch 2>&1 | fgrep 'amc' > /dev/null
then TOUCH=touch
else TOUCH=true
fi
# ============= cronsort ==============
echo "x - extracting cronsort (Text)"
sed 's/^X//' << 'SHAR_EOF' > cronsort &&
X#!/usr/local/bin/perl
X# cronsort - Show particular entries from a crontab, sorted
X#
X# $Id: cronsort,v 1.3 1993/03/09 23:00:06 tim Exp $
X# $Source: /tmp_mnt/src/config/var/spool/cron/crontabs/root/RCS/cronsort,v $
X#
X# SYNOPSIS
X# cronsort [-y|-m|-w|-d|-r|-o|-a] [-n] [crontab]
X#
X# DESCRIPTION
X# -y Shows all entries executed once per year.
X# -m Shows all entries executed once per month.
X# -w Shows all entries executed once per week.
X# -d Shows all entries executed once per day, more than one
X# day per week.
X# -r (Regular) shows all entries executed more than once.
X# every day.
X# -o (Other) shows all entries that do not match any of the
X# above criteria (yes it is possible).
X# -a Shows all of the above, grouped into the above
X# classifications, plus any comments at the start of the
X# crontab.
X# -n If specified, no comments will be output.
X# [crontab]
X# The name of a crontab file. Default is standard
X# input.
X
X
Xrequire 'getopts.pl';
X
X
X##############################################################################
X# main - For want of a better word
X#
X
X&Getopts ('ymwdroan');
X
X$prog = substr ($0, rindex ($0, '/') + 1);
X
Xif (length ("$opt_y$opt_m$opt_w$opt_d$opt_r$opt_o$opt_a") != 1) {
X die "usage: $prog [-y|-m|-w|-d|-r|-o|-a] [-n] [crontab]\n"; }
X
Xif ($opt_a && ! $opt_n) {
X while (<>) {
X last if (! /^#/);
X print; }
X if (! /^\s*$/) {
X chop;
X push (@entries, $_); }
X }
X
Xwhile (<>) {
X next if (/^#/);
X next if (/^\s*$/);
X chop;
X push (@entries, $_);
X }
X
Xif ($opt_y) {
X &cronsort ('y', @entries); }
Xelsif ($opt_m) {
X &cronsort ('m', @entries); }
Xelsif ($opt_w) {
X &cronsort ('w', @entries); }
Xelsif ($opt_d) {
X &cronsort ('d', @entries); }
Xelsif ($opt_r) {
X &cronsort ('r', @entries); }
Xelsif ($opt_o) {
X &cronsort ('o', @entries); }
Xelsif ($opt_a) {
X foreach $type ('Regular', 'Daily', 'Weekly', 'Monthly', 'Yearly',
X 'Other') {
X if (! $opt_n) {
X print ("####################\n",
X "# ", $type, "\n",
X "####################\n"); }
X $type = substr ($type, 0, 1);
X $type =~ tr/[A-Z]/[a-z]/;
X &cronsort ($type, @entries);
X }
X }
X
Xexit (1);
X
X
X##############################################################
X# cronsort - Sort and output entries of specified type
X#
Xsub cronsort {
X local ($type) = shift (@_);
X local (@entries) = @_;
X
X local ($_);
X local (@fields);
X local (@output);
X local ($entry);
X local ($dummy, $cron);
X
X local ($any_minute, $any_hour, $any_day, $any_month, $any_weekday);
X local ($specific_minute, $specific_hour, $specific_day,
X $specific_month, $specific_weekday);
X local ($many_minutes, $many_hours, $many_weekdays);
X local ($yearly, $monthly, $weekly, $daily, $regular, $other);
X
X foreach $_ (@entries) {
X @fields = split;
X
X $any_minute = ($fields[0] eq '*');
X $any_hour = ($fields[1] eq '*');
X $any_day = ($fields[2] eq '*');
X $any_month = ($fields[3] eq '*');
X $any_weekday = ($fields[4] eq '*');
X
X $specific_minute = ($fields[0] =~ /^[0-9]+$/);
X $specific_hour = ($fields[1] =~ /^[0-9]+$/);
X $specific_day = ($fields[2] =~ /^[0-9]+$/);
X $specific_month = ($fields[3] =~ /^[0-9]+$/);
X $specific_weekday = ($fields[4] =~ /^[0-9]+$/);
X
X $many_minutes = ! $specific_minute;
X $many_hours = ! $specific_hour;
X $many_weekdays = ! $specific_weekday;
X
X $yearly = ($specific_minute && $specific_hour && $specific_day &&
X $specific_month && $any_weekday);
X $monthly = ($specific_minute && $specific_hour && $specific_day &&
X $any_month && $any_weekday);
X $weekly = ($specific_minute && $specific_hour && $any_day &&
X $any_month && $specific_weekday);
X $daily = ($specific_minute && $specific_hour && $any_day &&
X $any_month && $many_weekdays);
X $regular = ($any_weekday && $any_month && $any_day &&
X ($many_minutes || $many_hours));
X
X $other = ! $yearly && ! $monthly && ! $weekly && ! $daily && !
X $regular;
X
X if ($yearly && ($type eq 'y')) {
X push (@output, sprintf ('%03d%03d%03d%03d:%s', $fields[3],
X $fields[2], $fields[1], $fields[0], $_));
X }
X elsif ($monthly && ($type eq 'm')) {
X push (@output, sprintf ('%03d%03d%03d:%s', $fields[2],
X $fields[1], $fields[0], $_));
X }
X elsif ($weekly && ($type eq 'w')) {
X push (@output, sprintf ('%03d%03d%03d:%s', $fields[4],
X $fields[1], $fields[0], $_));
X }
X elsif ($daily && ($type eq 'd')) {
X push (@output, sprintf ('%03d%03d%20s:%s', $fields[1],
X $fields[0], $fields[4], $_));
X }
X elsif ($regular && ($type eq 'r')) {
X push (@output, sprintf ('%03d%1d%03d:%s', $fields[1],
X $specific_minute, $fields[0], $_));
X }
X elsif ($other && ($type eq 'o')) {
X push (@output, sprintf ('%20s|%20s|%20s|%20s|%20s:%s',
X $fields[4], $fields[3], $fields[2], $fields[1],
X $fields[0], $_));
X }
X }
X
X @output = sort (@output);
X
X foreach $entry (@output) {
X ($dummy, $cron) = split (':', $entry, 2);
X print ($cron, "\n");
X }
X }
SHAR_EOF
$TOUCH -am 0310090093 cronsort &&
chmod 0550 cronsort ||
echo "restore of cronsort failed"
set `wc -c cronsort`;Wc_c=$1
if test "$Wc_c" != "5218"; then
echo original size 5218, current size $Wc_c
fi
exit 0