13 # GNU General Public License for more details. |
13 # GNU General Public License for more details. |
14 # |
14 # |
15 # You should have received a copy of the GNU General Public License |
15 # You should have received a copy of the GNU General Public License |
16 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
17 # |
17 # |
18 # Christian Arnold <arnold@schlittermann.de> |
18 # Christian Arnold <arnold@schlittermann.de> |
19 |
19 |
20 use 5.010; |
20 use 5.010; |
21 use Perl6::Slurp; |
|
22 use strict; |
21 use strict; |
23 use warnings; |
22 use warnings; |
|
23 use Perl6::Slurp; |
24 use File::Basename; |
24 use File::Basename; |
25 use Pod::Usage; |
25 use Pod::Usage; |
26 use Getopt::Long; |
26 use Getopt::Long; |
27 use Date::Parse qw(str2time); |
27 use Date::Parse qw(str2time); |
28 use Cwd qw(realpath); |
28 use Cwd qw(realpath); |
70 my %devs = @_; |
70 my %devs = @_; |
71 my %rc; |
71 my %rc; |
72 |
72 |
73 foreach my $devno ( keys %devs ) { |
73 foreach my $devno ( keys %devs ) { |
74 if ( $devs{$devno}{date} ) { |
74 if ( $devs{$devno}{date} ) { |
75 if ( ( $NOW - $devs{$devno}{date} ) > |
75 if ( ( $NOW - str2time( $devs{$devno}{date} ) ) > |
76 ( $devs{$devno}{dump} * 86400 ) ) |
76 ( $devs{$devno}{dump} * 86_400 * 2 ) ) |
77 { |
77 { |
78 $rc{ $devs{$devno}{dev} } = { rc => $ERRORS{WARNING} }; |
78 $rc{ $devs{$devno}{dev} } = { |
|
79 rc => $ERRORS{CRITICAL}, |
|
80 lastdump => "[$devs{$devno}{date}]" |
|
81 }; |
79 } |
82 } |
|
83 elsif ( ( $NOW - str2time( $devs{$devno}{date} ) ) > |
|
84 ( $devs{$devno}{dump} * 86_400 ) ) |
|
85 { |
|
86 $rc{ $devs{$devno}{dev} } = { |
|
87 rc => $ERRORS{WARNING}, |
|
88 lastdump => "[$devs{$devno}{date}]" |
|
89 }; |
|
90 } |
|
91 else { |
|
92 $rc{ $devs{$devno}{dev} } = { |
|
93 rc => $ERRORS{OK}, |
|
94 lastdump => "[$devs{$devno}{date}]" |
|
95 }; |
|
96 } |
80 } |
97 } |
81 else { |
98 else { |
82 $rc{ $devs{$devno}{dev} } = { rc => $ERRORS{CRITICAL} }; |
99 $rc{ $devs{$devno}{dev} } = { |
83 } |
100 rc => $ERRORS{CRITICAL}, |
84 } |
101 lastdump => "[NEVER]" |
85 |
102 }; |
86 my ( @critical, @warning ); |
103 } |
|
104 } |
|
105 |
|
106 my ( @critical, @warning, @ok ); |
87 |
107 |
88 foreach my $dev ( keys %rc ) { |
108 foreach my $dev ( keys %rc ) { |
89 if ( $rc{$dev}{rc} eq $ERRORS{CRITICAL} ) { |
109 if ( $rc{$dev}{rc} eq $ERRORS{CRITICAL} ) { |
90 push @critical, $dev; |
110 push @critical, "$dev last dump: $rc{$dev}{lastdump}"; |
|
111 next; |
|
112 } |
|
113 elsif ( $rc{$dev}{rc} eq $ERRORS{WARNING} ) { |
|
114 push @warning, "$dev last dump: $rc{$dev}{lastdump}"; |
|
115 next; |
91 } |
116 } |
92 else { |
117 else { |
93 push @warning, $dev; |
118 push @ok, "$dev last dump: $rc{$dev}{lastdump}"; |
94 } |
119 } |
95 } |
120 } |
96 |
121 |
97 say "$NAME CRITICAL: @critical check dump backup" and exit $ERRORS{CRITICAL} |
122 say "$NAME CRITICAL: " . join( ', ', @critical ) and exit $ERRORS{CRITICAL} |
98 if (@critical); |
123 if (@critical); |
99 say "$NAME WARNING: @warning check dump backup" and exit $ERRORS{WARNING} |
124 say "$NAME WARNING: " . join( ', ', @warning ) and exit $ERRORS{WARNING} |
100 if (@warning); |
125 if (@warning); |
101 say "$NAME OK: all dump backups in limit" and exit $ERRORS{OK}; |
126 say "$NAME OK: " . join( ', ', @ok ) and exit $ERRORS{OK}; |
102 } |
127 } |
103 |
128 |
104 sub get_candidates() { |
129 sub get_candidates() { |
105 |
130 |
106 my %devs; |
131 my %devs; |
150 dev => $+{dev}, |
175 dev => $+{dev}, |
151 rdev => $rdev, |
176 rdev => $rdev, |
152 mp => $+{mp}, |
177 mp => $+{mp}, |
153 level => $+{level}, |
178 level => $+{level}, |
154 dump => $devs{"$major:$minor"}{dump}, |
179 dump => $devs{"$major:$minor"}{dump}, |
155 date => str2time( $+{date} ) |
180 date => $+{date} |
156 }; |
181 }; |
157 } |
182 } |
158 } |
183 } |
159 |
184 |
160 return %devs; |
185 return %devs; |
161 } |
186 } |
162 |
187 |
163 sub real_device($) { |
188 sub real_device($) { |
164 my $dev = shift; |
189 my $dev = shift; |
165 |
190 |
|
191 # get the real device |
166 if ( $dev ~~ /^(LABEL|UUID)=/ ) { |
192 if ( $dev ~~ /^(LABEL|UUID)=/ ) { |
167 chomp( $dev = `blkid -c /dev/null -o device -t '$dev'` ); |
193 |
|
194 # only root can use blkid without cache |
|
195 if ( not scalar($<) ) { |
|
196 chomp( $dev = `/sbin/blkid -c /dev/null -o device -t '$dev'` ); |
|
197 } |
|
198 else { |
|
199 chomp( $dev = `/sbin/blkid -o device -t '$dev'` ); |
|
200 } |
168 } |
201 } |
169 |
202 |
170 $dev = realpath($dev); |
203 $dev = realpath($dev); |
171 } |
204 } |
172 |
205 |
173 sub devno($) { |
206 sub devno($) { |
174 my @mm = ( ( stat shift )[6] >> 8, ( stat _ )[6] & 0xff ); |
207 my $dev = shift; |
|
208 |
|
209 # get major and minor number for device |
|
210 my @mm = ( ( stat($dev) )[6] >> 8, ( stat($dev) )[6] & 0xff ); |
175 return wantarray ? @mm : "$mm[0]:$mm[1]"; |
211 return wantarray ? @mm : "$mm[0]:$mm[1]"; |
176 } |
212 } |
177 |
213 |
178 sub version($$) { |
214 sub version($$) { |
179 my $progname = shift; |
215 my $progname = shift; |