Config-Crontab

 view release on metacpan or  search on metacpan

Crontab.pm  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;

  ###############################
  ## 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' );

Crontab.pm  view on Meta::CPAN

=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 *

Crontab.pm  view on Meta::CPAN

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

Crontab.pm  view on Meta::CPAN

    @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

Crontab.pm  view on Meta::CPAN


    ## 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.

Crontab.pm  view on Meta::CPAN


=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

Crontab.pm  view on Meta::CPAN

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

Crontab.pm  view on Meta::CPAN


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] );

Crontab.pm  view on Meta::CPAN


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:

README  view on Meta::CPAN


    ## 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" );



( run in 1.276 second using v1.01-cache-2.11-cpan-49f99fa48dc )