File Coverage

bin/ubic-periodic
Criterion Covered Total %
statement 12 29 41.3
branch 0 14 0.0
condition n/a
subroutine 4 8 50.0
pod n/a
total 16 51 31.3


line stmt bran cond sub pod time code
1             #!/usr/bin/env perl
2             package ubic_periodic;
3             $ubic_periodic::VERSION = '1.60';
4             # ABSTRACT: run given command every N seconds
5              
6 1     1   637 use strict;
  1         1  
  1         23  
7 1     1   3 use warnings;
  1         137  
  1         27  
8              
9              
10 1     1   4 use Getopt::Long 2.33;
  1         4  
  1         17  
11 1     1   78 use Pod::Usage;
  1         2  
  1         423  
12              
13             return 1 if caller;
14              
15             my $period = 60;
16             my $stdout;
17             my $stderr;
18             my $rotate_logs;
19              
20             GetOptions(
21             'period=i' => \$period,
22             'stdout=s' => \$stdout,
23             'stderr=s' => \$stderr,
24             'rotate-logs!' => \$rotate_logs,
25             ) or pod2usage(2);
26             pod2usage(2) unless @ARGV == 1;
27              
28             my $command = shift @ARGV;
29              
30             sub xunlink {
31 0     0     my $file = shift;
32 0 0         unlink $file or die "Can't unlink '$file': $!";
33             }
34              
35             sub xrename {
36 0     0     my ($from, $to) = @_;
37 0 0         rename $from => $to or die "Can't rename '$from' to '$to': $!";
38             }
39              
40             sub touch {
41 0     0     my $file = shift;
42 0 0         open my $fh, '>', $file or die "Can't touch '$file': $!";
43             }
44              
45             sub rotate {
46 0     0     my $file = shift;
47 0           my $time = time;
48              
49 0 0         return unless -e $file;
50              
51 0 0         unless (-e "$file.1") {
52 0           touch("$file.1");
53             }
54 0           my $mtime = (stat "$file.1")[9];
55 0 0         if ($time - $mtime >= 86400) {
56             # it's time to rotate!
57 0 0         if (-e "$file.2") {
58 0           xunlink("$file.2");
59             }
60 0           xrename("$file.1" => "$file.2");
61 0           xrename($file => "$file.1");
62             }
63             }
64              
65             while (1) {
66             my $start_time = time;
67              
68             if ($rotate_logs) {
69             rotate($stdout);
70             rotate($stderr);
71             }
72              
73             # we reopen logs on every loop, so we don't have to restart periodic service on logrotate
74             if ($stdout) {
75             open STDOUT, '>>', $stdout or die "Can't open stdout: $!";
76             }
77             if ($stderr) {
78             open STDERR, '>>', $stderr or die "Can't open stderr: $!";
79             }
80             system($command); # no, we don't check for failures
81              
82             my $time = time;
83             if ($time - $start_time < $period) {
84             sleep $start_time + $period - $time;
85             }
86             }
87              
88             __END__