view release on metacpan or search on metacpan
## mail something to joe at 5 after midnight on Fridays
MAILTO=joe
5 0 * * Fri /bin/someprogram 2>&1
_BLOCK_
## add this block to the crontab object
$ct->last($block);
## make another block using Block methods
$block = new Config::Crontab::Block;
$block->last( new Config::Crontab::Comment( -data => '## do backups' ) );
$block->last( new Config::Crontab::Env( -name => 'MAILTO', -value => 'bob' ) );
$block->last( new Config::Crontab::Event( -minute => 40,
-hour => 3,
-command => '/sbin/backup --partition=all' ) );
## add this block to crontab file
$ct->last($block);
## write out crontab file
$ct->write;
###############################
## changing an existing crontab
###############################
my $ct = new Config::Crontab; $ct->read;
## comment out the command that runs our backup
$_->active(0) for $ct->select(-command_re => '/sbin/backup');
## save our crontab again
$ct->write;
###############################
## read joe's crontab (must have root permissions)
###############################
## same as "crontab -u joe -l"
my $ct = new Config::Crontab( -owner => 'joe' );
=item *
remove the first crontab block that has '/bin/unwanted' as a command
perl -MConfig::Crontab -e '$c=new Config::Crontab; $c->read; \
$c->remove($c->block($c->select(-command_re => "/bin/unwanted"))); \
$c->write'
=item *
reschedule the backups to run just Monday thru Friday:
perl -MConfig::Crontab -e '$c=new Config::Crontab; $c->read; \
$_->dow("1-5") for $c->select(-command_re => "/sbin/backup"); $c->write'
=item *
reschedule the backups to run weekends too:
perl -MConfig::Crontab -e '$c=new Config::Crontab; $c->read; \
$_->dow("*") for $c->select(-command_re => "/sbin/backup"); $c->write'
=item *
change all 'MAILTO' environment settings in this crontab to 'joe@schmoe.org':
perl -MConfig::Crontab -e '$c=new Config::Crontab; $c->read; \
$_->value(q!joe@schmoe.org!) for $c->select(-name => "MAILTO"); $c->write'
=item *
If B<read> fails, B<error> will be set.
Examples:
## reads the crontab for this UID (via crontab -l)
$ct = new Config::Crontab;
$ct->read;
## reads the crontab from a file
$ct = new Config::Crontab;
$ct->read( -file => '/var/cronbackups/cron1' );
## same thing as above
$ct = new Config::Crontab( -file => '/var/cronbackups/cron1' );
$ct->read; ## '-file' attribute already set
## ditto using 'file' method
$ct = new Config::Crontab;
$ct->file('/var/cronbackups/cron1');
$ct->read;
## ditto, using a pipe
$ct = new Config::Crontab;
$ct->file('cat /var/cronbackups/cron1|');
$ct->read;
## ditto, using 'read' method
$ct = new Config::Crontab;
$ct->read( -file => 'cat /var/cronbackups/cron1|');
## now fortified with error-checking
$ct->read
or do {
warn $ct->error;
return;
};
=cut
@events = $ct->select( -type => 'event',
-hour_nre => '^(?:[8-9]|1[0-6])$' );
## get all event lines in the crontab
@events = $ct->select( -type => 'event' );
## get all lines in the crontab
@lines => $ct->select;
## get a line: note list context, also, no 'type' specified
($line) = $ct->select( -data_re => 'start backups' );
=head2 select_blocks([%criteria])
Returns a list of crontab Block objects that match the specified
criteria. If no criteria are specified, B<select_blocks> behaves just
like the B<blocks> method, returning all blocks in the crontab object.
The following criteria keys are available:
=over 4
## write out crontab
$ct->write
or do {
warn "Error: " . $ct->error . "\n";
return;
};
## set 'file' and write simultaneously (future calls to read and
## write will use this filename)
$ct->write('/var/mycronbackups/cron1.txt');
## same thing
$ct->file('/var/mycronbackups/cron1.txt');
$ct->write;
=head2 remove_tab([file])
Removes a crontab. If B<file> is set, that file will be unlinked. If
B<file> is not set (or is false), B<remove_tab> will attempt to remove
the selected user's crontab via F<crontab -u username -r> or F<crontab
-r> for the current user id.
If B<remove_tab> fails, B<error> will be set.
=over 4
=item B<a crontab file read in block (paragraph) mode:>
Line Block Block Line Entry
1 1 1 ## grind disks
2 1 2 5 5 * * * /bin/grind
3 1 3
4 2 1 ## backup reminder to joe
5 2 2 MAILTO=joe
6 2 3 5 0 * * Fri /bin/backup
7 2 4
8 3 1 ## meeting reminder to bob
9 3 2 MAILTO=bob
10 3 3 30 9 * * Wed /bin/meeting
Notice that each block has its own internal line numbering. Vertical
space has been inserted between blocks to clarify block structures.
Block mode parsing is the default.
=item B<a crontab file read in line mode:>
Line Block Block Line Entry
1 1 1 ## grind disks
2 2 1 5 5 * * * /bin/grind
3 3 1
4 4 1 ## backup reminder to joe
5 5 1 MAILTO=joe
6 6 1 5 0 * * Fri /bin/backup
7 7 1
8 8 1 ## meeting reminder to bob
9 9 1 MAILTO=bob
10 10 1 30 9 * * Wed /bin/meeting
Notice that each line is also a block. You normally don't want to
read in line mode unless you don't have paragraph breaks in your
crontab file (the dumper prints a newline between each block; with
each line being a block you get an extra newline between each line).
=item B<a crontab file read in file mode:>
Line Block Block Line Entry
1 1 1 ## grind disks
2 1 2 5 5 * * * /bin/grind
3 1 3
4 1 4 ## backup reminder to joe
5 1 5 MAILTO=joe
6 1 6 5 0 * * Fri /bin/backup
7 1 7
8 1 8 ## meeting reminder to bob
9 1 9 MAILTO=bob
10 1 10 30 9 * * Wed /bin/meeting
Notice that there is only one block in file mode, and each line is a
block line (but not a separate block).
=back
other attributes.
Each of these attributes corresponds directly to its similarly-named
method.
Examples:
## create an empty block object & populate it with the data method
$block = new Config::Crontab::Block;
$block->data( <<_BLOCK_ ); ## via a 'here' document
## 2:05a Friday backup
MAILTO=sysadmin@mydomain.ext
5 2 * * Fri /sbin/backup /dev/da0s1f
_BLOCK_
## create a block in the constructor (also via 'here' document)
$block = new Config::Crontab::Block( -data => <<_BLOCK_ );
## 2:05a Friday backup
MAILTO=sysadmin@mydomain.ext
5 2 * * Fri /sbin/backup /dev/da0s1f
_BLOCK_
## create an array of crontab objects
my @lines = ( new Config::Crontab::Comment(-data => '## run bar'),
new Config::Crontab::Event(-data => '5 8 * * * /foo/bar') );
## create a block object via lines attribute
$block = new Config::Crontab::Block( -lines => \@lines );
## ...or with lines method
Block data is terminated with a final newline.
=head2 lines([\@objects])
Get block data as a list of B<Config::Crontab::*> objects. Set block
data using a list reference.
Example:
$block->lines( [ new Config::Crontab::Comment( -data => "## run backup" ),
new Config::Crontab::Event( -data => "5 4 * * 1-5 /sbin/backup" ) ] );
## sorta like $block->dump
for my $obj ( $block->lines ) {
print $obj->dump . "\n";
}
## a clumsy way to "unshift" a new event
$block->lines( [new Config::Crontab::Comment(-data => '## hi mom!'),
$block->lines] );
Remove B<Config::Crontab::*> objects from this block.
Example:
## simple case: you need to get a handle on these objects first
$block->remove( $obj1, $obj2, $obj3 );
## more complex: remove an event from a block by searching
for my $event ( $block->select( -type => 'event') ) {
next unless $event->command =~ /\bbackup\b/; ## look for backup command
$block->remove($event); last; ## and remove it
}
=head2 replace($oldobj, $newobj)
Replaces I<$oldobj> with I<$newobj> within a block. Returns I<$oldobj>
if successful, I<undef> otherwise.
Example:
## must be run as root or other privileged user
$ct = new Config::Crontab( -owner => 'joe' );
$ct->read;
$ct->owner('sherman');
$ct->write;
Example 4:
==========
You may also make a backup of your crontab:
$ct = new Config::Crontab; $ct->read;
$ct->file('mycrontab.bak'); $ct->write;
You can also disable an entire block of commands. Consider the
following crontab file:
# refresh apache duds
1 0 * * * kill -1 `ps -x | egrep 'Master:.+? \(https?d\)' | awk '{print $1}'`
t/03_event.t view on Meta::CPAN
my $event;
## empty object
$event = new Config::Crontab::Event;
is( $event->dump, '' );
undef $event;
## setting via datetime
$event = new Config::Crontab::Event( -datetime => '@hourly',
-command => '/usr/sbin/backup_everything' );
is( $event->datetime, '@hourly' );
is( $event->command, '/usr/sbin/backup_everything' );
is( $event->dump, '@hourly /usr/sbin/backup_everything' );
undef $event;
## setting via datetime
$event = new Config::Crontab::Event( -datetime => '@hourly',
-command => '/usr/sbin/backup_everything' );
is( $event->datetime, '@hourly' );
is( $event->datetime, '@hourly' );
is( $event->command, '/usr/sbin/backup_everything' );
is( $event->dump, '@hourly /usr/sbin/backup_everything' );
undef $event;
## setting via datetime
$event = new Config::Crontab::Event( -datetime => '5 0 * * *',
-command => '/usr/sbin/backup_everything' );
is( $event->datetime, '5 0 * * *' );
is( $event->special, '' );
is( $event->minute, 5 );
is( $event->hour, 0 );
undef $event;
## setting via datetime
$event = new Config::Crontab::Event( -datetime => '*/5 0 * * *',
-command => '/usr/sbin/backup_everything' );
is( $event->datetime, '*/5 0 * * *' );
is( $event->special, '' );
is( $event->minute, '*/5' );
is( $event->hour, 0 );
undef $event;
## setting via datetime
$event = new Config::Crontab::Event( -datetime => '*/2,*/5 0 * * *',
-command => '/bin/echo' );
is( $event->datetime, '*/2,*/5 0 * * *', 'multiple wildcards (rus)' );
## setting via special
$event = new Config::Crontab::Event( -special => '@monthly',
-command => '/usr/sbin/backup_everything' );
is( $event->datetime, '@monthly' );
is( $event->special, '@monthly' );
is( $event->minute, '*' );
is( $event->hour, '*' );
undef $event;
## FIXME: currently no checks for bogus 'special' strings
## FIXME: if we ever do checking on -special, these tests will have
## FIXME: to be changed
## setting via special
$event = new Config::Crontab::Event( -special => '5 0 1 * *',
-command => '/usr/sbin/backup_everything' );
is( $event->datetime, '5 0 1 * *' );
is( $event->special, '5 0 1 * *' );
is( $event->minute, '*' );
is( $event->hour, '*' );
undef $event;
## setting via -data
$event = new Config::Crontab::Event( -data => '@reboot /usr/sbin/food' );
is( $event->special, '@reboot' );
is( $event->datetime, '@reboot' );
t/03_event.t view on Meta::CPAN
-datetime => '5 2 * * Fri', ## ignored
);
is( $event->special, '@reboot' );
is( $event->datetime, '@reboot' );
is( $event->command, '/usr/sbin/food' );
is( $event->hour, '*' );
is( $event->dump, '@reboot /usr/sbin/food' );
undef $event;
## setting via -data
$event = new Config::Crontab::Event( -data => '6 1 * * Fri /usr/sbin/backup' );
is( $event->special, '' );
is( $event->datetime, '6 1 * * Fri' );
is( $event->command, '/usr/sbin/backup' );
undef $event;
## try some disabled events
$event = new Config::Crontab::Event( -data => '## 7 2 * * Mon /bin/monday' );
is( $event->active, 0 );
is( $event->datetime, '7 2 * * Mon' );
is( $event->command, '/bin/monday' );
undef $event;
## setting via attributes
t/04_block.t view on Meta::CPAN
$block->last( new Config::Crontab::Env( -data => 'FOO=next' ) );
is( $block->select( -bogus => '' ), 8 );
is( $block->select( -data_re => 'next' ), 5 );
is( $block->select( -data => '' ), 3 );
undef $block;
## create a crontab block
@lines = ( $comment1, $env1, $event1, );
$block = new Config::Crontab::Block( -lines => \@lines );
$block->last( new Config::Crontab::Event( -data => '5 1 * * * /sbin/backup' ) );
$block->last( new Config::Crontab::Event( -data => '10 4 * * 3 /bin/wednesday' ) );
is( $block->dump, <<_DUMPED_ );
## just a comment
MAILTO=joe
5 0 * * * /bin/foo
5 1 * * * /sbin/backup
10 4 * * 3 /bin/wednesday
_DUMPED_
## delete the backup event
for my $event ( $block->select( -type => 'event') ) {
next unless $event->command =~ /\bbackup\b/; ## look for backup command
$block->remove($event); last;
}
is( $block->dump, <<_DUMPED_, "backup removed" );
## just a comment
MAILTO=joe
5 0 * * * /bin/foo
10 4 * * 3 /bin/wednesday
_DUMPED_
## compare string match vs regex
is( $block->select( -type => 'event', -command => 'foo' ), 0 );
is( $block->select( -type => 'event', -command_re => 'foo' ), 1 );
undef $block;
## set up block for up, down, first, last tests
@lines = ( $comment1, $env1, $event1, );
$block = new Config::Crontab::Block( -lines => \@lines );
$event2 = new Config::Crontab::Event( -data => '5 1 * * * /sbin/backup' );
is( $block->dump, <<_DUMPED_ );
## just a comment
MAILTO=joe
5 0 * * * /bin/foo
_DUMPED_
## add new event to bottom
$block->down($event2); ## add at bottom
is( $block->dump, <<_DUMPED_ );
## just a comment
MAILTO=joe
5 0 * * * /bin/foo
5 1 * * * /sbin/backup
_DUMPED_
## add new event to top
$block->remove($event2);
is( $block->dump, <<_DUMPED_ );
## just a comment
MAILTO=joe
5 0 * * * /bin/foo
_DUMPED_
## add new event to top
$block->first($event2);
is( $block->dump, <<_DUMPED_ );
5 1 * * * /sbin/backup
## just a comment
MAILTO=joe
5 0 * * * /bin/foo
_DUMPED_
## try last
$block->last($event2);
is( $block->dump, <<_DUMPED_ );
## just a comment
MAILTO=joe
5 0 * * * /bin/foo
5 1 * * * /sbin/backup
_DUMPED_
## move back to top
$block->first($event2);
is( $block->dump, <<_DUMPED_ );
5 1 * * * /sbin/backup
## just a comment
MAILTO=joe
5 0 * * * /bin/foo
_DUMPED_
## try up (duplicate bug)
$block->up($event2);
is( $block->dump, <<_DUMPED_ );
5 1 * * * /sbin/backup
## just a comment
MAILTO=joe
5 0 * * * /bin/foo
_DUMPED_
## try down
$block->down($event2);
is( $block->dump, <<_DUMPED_ );
## just a comment
5 1 * * * /sbin/backup
MAILTO=joe
5 0 * * * /bin/foo
_DUMPED_
## last, then down again
$block->last($event2);
is( $block->dump, <<_DUMPED_ );
## just a comment
MAILTO=joe
5 0 * * * /bin/foo
5 1 * * * /sbin/backup
_DUMPED_
## (duplicate bug)
$block->down($event2);
is( $block->dump, <<_DUMPED_ );
## just a comment
MAILTO=joe
5 0 * * * /bin/foo
5 1 * * * /sbin/backup
_DUMPED_
## try up
$block->up($event2);
is( $block->dump, <<_DUMPED_ );
## just a comment
MAILTO=joe
5 1 * * * /sbin/backup
5 0 * * * /bin/foo
_DUMPED_
undef $block;
## setup tests for before, after
@lines = ( $comment1, $env1, $event1, );
$block = new Config::Crontab::Block( -lines => \@lines );
is( $block->dump, <<_DUMPED_ );
## just a comment
MAILTO=joe
5 0 * * * /bin/foo
_DUMPED_
$event2 = new Config::Crontab::Event( -data => '5 1 * * * /sbin/backup' );
$block->before($comment1, $event2);
is( $block->dump, <<_DUMPED_ );
5 1 * * * /sbin/backup
## just a comment
MAILTO=joe
5 0 * * * /bin/foo
_DUMPED_
$block->after($comment1, $event2);
is( $block->dump, <<_DUMPED_ );
## just a comment
5 1 * * * /sbin/backup
MAILTO=joe
5 0 * * * /bin/foo
_DUMPED_
## see about non-existent references
my $event3 = new Config::Crontab::Event( -minute => 33, -command => '/sbin/uptime' );
$block->before(undef, $event3);
is( $block->dump, <<_DUMPED_ );
33 * * * * /sbin/uptime
## just a comment
5 1 * * * /sbin/backup
MAILTO=joe
5 0 * * * /bin/foo
_DUMPED_
## test active
is( $block->active(0), 0 );
is( $block->dump, <<_DUMPED_, "inactive block" );
#33 * * * * /sbin/uptime
## just a comment
#5 1 * * * /sbin/backup
#MAILTO=joe
#5 0 * * * /bin/foo
_DUMPED_
ok( $block->active(1) );
is( $event3->active(0), 0 );
is( $block->dump, <<_DUMPED_ );
#33 * * * * /sbin/uptime
## just a comment
5 1 * * * /sbin/backup
MAILTO=joe
5 0 * * * /bin/foo
_DUMPED_
ok( ! $block->active(undef) );
ok( $event3->active(1) );
is( $block->dump, <<_DUMPED_ );
33 * * * * /sbin/uptime
## just a comment
#5 1 * * * /sbin/backup
#MAILTO=joe
#5 0 * * * /bin/foo
_DUMPED_
## a system block
undef $block;
$block = new Config::Crontab::Block;
$block->system(1);
$block->data(<<_DATA_);
## this is foo
t/05_crontab.t view on Meta::CPAN
my $crontabd = <<'_CRONTAB_';
MAILTO=scott
## logs nightly
#30 4 * * * /home/scott/bin/weblog.pl -v -s daily >> ~/tmp/logs/weblog.log 2>&1
## logs weekly
#35 4 * * 1 /home/scott/bin/weblog.pl -v -s weekly >> ~/tmp/logs/weblog.log 2>&1
## run a backup
20 2 * * 5 /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
## fetch ufo
13 9 * * 1-5 env DISPLAY=tub:0 ~/bin/fetch_image
## check versions
#MAILTO=phil
#10 5 * * 1-5 $HOME/fetch_version -q
## start spamd
@reboot /usr/local/bin/spamd -c -d -p 1783
t/05_crontab.t view on Meta::CPAN
_DUMPED_
$block = $ct->block($lines[1]);
is( $block->dump, <<_DUMPED_, "dump block" );
## logs weekly
#35 4 * * 1 /home/scott/bin/weblog.pl -v -s weekly >> ~/tmp/logs/weblog.log 2>&1
_DUMPED_
$block = $ct->block($lines[2]);
is( $block->dump, <<'_DUMPED_', "dump block" );
## run a backup
20 2 * * 5 /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
_DUMPED_
$block = $ct->block($lines[3]);
is( $block->dump, <<'_DUMPED_', "dump block" );
## run a backup
20 2 * * 5 /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
_DUMPED_
## regular expression match
@lines = $ct->select( type => 'event',
dow_re => '5' );
is( scalar @lines, 4 );
## negative regular expression match
@lines = $ct->select( type => 'event',
t/05_crontab.t view on Meta::CPAN
## test remove blocks
$block = $ct->block($ct->select(type => 'comment', data_re => 'logs nightly'));
ok( $ct->remove($block) );
my $crontabd2 = <<'_CRONTAB_';
MAILTO=scott
## logs weekly
#35 4 * * 1 /home/scott/bin/weblog.pl -v -s weekly >> ~/tmp/logs/weblog.log 2>&1
## run a backup
20 2 * * 5 /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
## fetch ufo
13 9 * * 1-5 env DISPLAY=tub:0 ~/bin/fetch_image
## check versions
#MAILTO=phil
#10 5 * * 1-5 $HOME/fetch_version -q
## start spamd
@reboot /usr/local/bin/spamd -c -d -p 1783
t/05_crontab.t view on Meta::CPAN
## "move" tests
$ct->last($block);
is( $ct->dump, <<'_DUMPED_', "block last" );
MAILTO=scott
## logs weekly
#35 4 * * 1 /home/scott/bin/weblog.pl -v -s weekly >> ~/tmp/logs/weblog.log 2>&1
## run a backup
20 2 * * 5 /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
## fetch ufo
13 9 * * 1-5 env DISPLAY=tub:0 ~/bin/fetch_image
## check versions
#MAILTO=phil
#10 5 * * 1-5 $HOME/fetch_version -q
## start spamd
@reboot /usr/local/bin/spamd -c -d -p 1783
t/05_crontab.t view on Meta::CPAN
is( $ct->dump, <<'_DUMPED_', "after compare dump" );
MAILTO=scott
## logs weekly
#35 4 * * 1 /home/scott/bin/weblog.pl -v -s weekly >> ~/tmp/logs/weblog.log 2>&1
## logs nightly
#30 4 * * * /home/scott/bin/weblog.pl -v -s daily >> ~/tmp/logs/weblog.log 2>&1
## run a backup
20 2 * * 5 /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
## fetch ufo
13 9 * * 1-5 env DISPLAY=tub:0 ~/bin/fetch_image
## check versions
#MAILTO=phil
#10 5 * * 1-5 $HOME/fetch_version -q
## start spamd
@reboot /usr/local/bin/spamd -c -d -p 1783
t/05_crontab.t view on Meta::CPAN
undef $ct;
## test replace
$ct = new Config::Crontab( -file => $crontabf );
$block = new Config::Crontab::Block( -data => <<_BLOCK_ );
## new replacement block
FOO=bar
6 12 * * Thu /bin/thursday
_BLOCK_
$ct->replace($ct->block($ct->select(-data_re => 'run a backup')), $block);
is( $ct->dump, <<'_DUMPED_', "replacement dump" );
MAILTO=scott
## logs nightly
#30 4 * * * /home/scott/bin/weblog.pl -v -s daily >> ~/tmp/logs/weblog.log 2>&1
## logs weekly
#35 4 * * 1 /home/scott/bin/weblog.pl -v -s weekly >> ~/tmp/logs/weblog.log 2>&1
## new replacement block
t/05_crontab.t view on Meta::CPAN
($ct->select(-command_re => 'weblog'))[0]->hour(5);
is( $ct->dump, <<'_DUMPED_', "replacement hour dump" );
MAILTO=scott
## logs nightly
#30 5 * * * /home/scott/bin/weblog.pl -v -s daily >> ~/tmp/logs/weblog.log 2>&1
## logs weekly
#35 4 * * 1 /home/scott/bin/weblog.pl -v -s weekly >> ~/tmp/logs/weblog.log 2>&1
## run a backup
20 2 * * 5 /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
## fetch ufo
13 9 * * 1-5 env DISPLAY=tub:0 ~/bin/fetch_image
## check versions
#MAILTO=phil
#10 5 * * 1-5 $HOME/fetch_version -q
## start spamd
@reboot /usr/local/bin/spamd -c -d -p 1783
t/05_crontab.t view on Meta::CPAN
$ct->read( -file => $crontabf );
is( $ct->dump, $crontabd, "compare read" );
for my $blk ( $ct->blocks ) {
$blk->remove($blk->select( -type => 'comment' ));
$blk->remove($blk->select( -type => 'event',
-active => 0, ));
}
is( $ct->dump, <<'_CRONTAB_', "compare removed blocks" );
MAILTO=scott
20 2 * * 5 /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
13 9 * * 1-5 env DISPLAY=tub:0 ~/bin/fetch_image
#MAILTO=phil
@reboot /usr/local/bin/spamd -c -d -p 1783
_CRONTAB_
undef $ct;
## test block removal using crontab select
$ct = new Config::Crontab;
$ct->read( -file => $crontabf );
is( $ct->dump, $crontabd, "compare removed block via select" );
$ct->remove($ct->select( -type => 'comment' ));
$ct->remove($ct->select( -type => 'event',
-active => 0 ));
is( $ct->dump, <<'_CRONTAB_', "compre remove via select" );
MAILTO=scott
20 2 * * 5 /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
13 9 * * 1-5 env DISPLAY=tub:0 ~/bin/fetch_image
#MAILTO=phil
@reboot /usr/local/bin/spamd -c -d -p 1783
_CRONTAB_
undef $ct;
t/05_crontab.t view on Meta::CPAN
unlink $crontabf;
$crontabd = <<'_CRONTAB_';
MAILTO=scott
## logs nightly
#30 4 * * * ipartner $HOME/bin/weblog.pl -v -s daily >> ~/tmp/logs/weblog.log 2>&1
## logs weekly
#35 4 * * 1 ipartner $HOME/bin/weblog.pl -v -s weekly >> ~/tmp/logs/weblog.log 2>&1
## run a backup
20 2 * * 5 root /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 root /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
## fetch ufo
13 9 * * 1-5 scott env DISPLAY=tub:0 $HOME/bin/fetch_image
## check versions
#MAILTO=phil
#10 5 * * 1-5 phil $HOME/fetch_version -q
## start spamd
@reboot root /usr/local/bin/spamd -c -d -p 1783
t/05_crontab.t view on Meta::CPAN
unlink $crontabf;
$crontabd = <<'_CRONTAB_';
MAILTO=scott
## logs nightly
#30 4 * * * ipartner $HOME/bin/weblog.pl -v -s daily >> ~/tmp/logs/weblog.log 2>&1
## logs weekly
#35 4 * * 1 ipartner $HOME/bin/weblog.pl -v -s weekly >> ~/tmp/logs/weblog.log 2>&1
## run a backup
20 2 * * 5 root /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 root /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
## fetch ufo
13 9 * * 1-5 scott env DISPLAY=tub:0 $HOME/bin/fetch_image
## check versions
#MAILTO=phil
#10 5 * * 1-5 phil $HOME/fetch_version -q
## start spamd
@reboot root /usr/local/bin/spamd -c -d -p 1783
t/06_synopsis.t view on Meta::CPAN
## mail something to joe at 5 after midnight on Fridays
MAILTO=joe
5 0 * * Fri /bin/someprogram 2>&1
_BLOCK_
## add this block to the crontab object
$ct->last($block);
## make another block using Block methods
$block = new Config::Crontab::Block;
$block->last( new Config::Crontab::Comment( -data => '## do backups' ) );
$block->last( new Config::Crontab::Env( -name => 'MAILTO', -value => 'bob' ) );
$block->last( new Config::Crontab::Event( -minute => 40,
-hour => 3,
-command => '/sbin/backup --partition=all' ) );
## add this block to crontab file
$ct->last($block);
## write out crontab file
$ct->write;
is( $ct->dump, <<_DUMPED_, "dump clean" );
## mail something to joe at 5 after midnight on Fridays
MAILTO=joe
5 0 * * Fri /bin/someprogram 2>&1
## do backups
MAILTO=bob
40 3 * * * /sbin/backup --partition=all
_DUMPED_
END {
unlink ".tmp_crontab.$$";
}
t/07_write.t view on Meta::CPAN
my $crontabf = ".tmp_crontab.$$";
my $crontabd = <<'_CRONTAB_';
MAILTO=scott
## logs nightly
#30 4 * * * /home/scott/bin/weblog.pl -v -s daily >> ~/tmp/logs/weblog.log 2>&1
## logs weekly
#35 4 * * 1 /home/scott/bin/weblog.pl -v -s weekly >> ~/tmp/logs/weblog.log 2>&1
## run a backup
20 2 * * 5 /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
## fetch ufo
13 9 * * 1-5 env DISPLAY=tub:0 ~/bin/fetch_image
## check versions
#MAILTO=phil
#10 5 * * 1-5 $HOME/fetch_version -q
## start spamd
@reboot /usr/local/bin/spamd -c -d -p 1783
t/07_write.t view on Meta::CPAN
my $crontabd2 = <<'_CRONTAB_';
MAILTO=scott
## fetch ufo
13 9 * * 1-5 env DISPLAY=tub:0 ~/bin/fetch_image
## logs nightly
#30 4 * * * /home/scott/bin/weblog.pl -v -s daily >> ~/tmp/logs/weblog.log 2>&1
## run a backup
20 2 * * 5 /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
## logs weekly
#35 4 * * 1 /home/scott/bin/weblog.pl -v -s weekly >> ~/tmp/logs/weblog.log 2>&1
## start spamd
@reboot /usr/local/bin/spamd -c -d -p 1783
## check versions
#MAILTO=phil
#10 5 * * 1-5 $HOME/fetch_version -q
t/07_write.t view on Meta::CPAN
## logs weekly
#35 4 * * 1 /home/scott/bin/weblog.pl -v -s weekly >> ~/tmp/logs/weblog.log 2>&1
## start spamd
@reboot /usr/local/bin/spamd -c -d -p 1783
## check versions
#MAILTO=phil
#10 5 * * 1-5 $HOME/fetch_version -q
## run a backup
20 2 * * 5 /usr/bin/tar -zcvf .backup/`$HOME/bin/dateish`.tar.gz ~/per
40 2 * * 5 /usr/bin/scp $HOME/.backup/`$HOME/bin/dateish`.tar.gz mx:~/backup/tub
_CRONTAB_
## write a crontab file
open FILE, ">$crontabf"
or die "Couldn't open $crontabf: $!\n";
print FILE $crontabd;
close FILE;
## read our crontab
$ct = new Config::Crontab( -file => $crontabf );
t/07_write.t view on Meta::CPAN
ok( $ct->write, "write" );
undef $ct;
## read our file again
$ct = new Config::Crontab;
$ct->file($crontabf);
$ct->read;
is( $ct->dump, $crontabd2, "dump clean" );
## more furniture adjustments
ok( $ct->last($ct->block($ct->select( data_re => 'run a backup' ))), "last" );
is( $ct->dump, $crontabd3, "dump clean" );
## write to a different file
ok( $ct->file(".foo_" . $crontabf), "new file" );
ok( $ct->write, "write" );
undef $ct;
## test a pipe with 'new'
$ct = new Config::Crontab( -file => "cat $crontabf|" );
$ct->read;
t/07_write.t view on Meta::CPAN
## comment 3
MAILTO=joe
0 0 * * Fri /bin/backup
_CRONTAB_
open FILE, ">$crontabf"
or die "Could not open $crontabf: $!\n";
print FILE $crontabd5;
close FILE;
## squeeze: FIXME: squeeze(0) doesn't work properly
t/07_write.t view on Meta::CPAN
is( $ct->dump, <<_CRONTAB_, "squeeze dump clean" );
## comment 1
5 8 * * * /bin/command1
## for best results
## squeeze from end of tube
5 10 * * * /bin/command2
## comment 3
MAILTO=joe
0 0 * * Fri /bin/backup
_CRONTAB_
undef $ct;
## test reading/writing from a nonexistent file: strict should take effect here
$ct = new Config::Crontab( -file => ".tmp_foo.$$" );
ok( $block = new Config::Crontab::Block, "new block" );
ok( $block->last( new Config::Crontab::Event( -data => '5 10 15 20 Mon /bin/monday' ) ), "last" );
ok( $ct->last($block), "last again" );
ok( $ct->write, "write" );