| | 87 | |
| | 88 | sub next { |
| | 89 | my $self = shift; |
| | 90 | return if $self->{exit_flag}; |
| | 91 | |
| | 92 | while ( my $sp = $self->{sp} ||= $self->get_next_sp ) { |
| | 93 | my $sl = $sp->next or do { undef $self->{sp}; next; }; |
| | 94 | |
| | 95 | ## parse : from_time <= timestamp < delayed_to_time |
| | 96 | ## return: from_time <= timestamp < to_time |
| | 97 | next if $sl->{timestamp} < $self->{from_time}; |
| | 98 | return $sl unless $self->{to_time}; |
| | 99 | |
| | 100 | if ( $self->{delayed_to_time} <= $sl->{timestamp} ) { |
| | 101 | $self->{exit_flag} = 1; |
| | 102 | return; |
| | 103 | } |
| | 104 | |
| | 105 | return $sl if $sl->{timestamp} < $self->{to_time}; |
| | 106 | } |
| | 107 | |
| | 108 | return; |
| | 109 | } |
| | 110 | |
| | 111 | sub get_next_sp { |
| | 112 | my $self = shift; |
| | 113 | |
| | 114 | while ( my $logfile = $self->logfiles->[ $self->{target_idx}++ ] ) { |
| | 115 | my ($name, $year) = @$logfile{qw/ name year /}; |
| | 116 | next unless -r $name; |
| | 117 | |
| | 118 | return $self->{parse_module}->new( |
| | 119 | $name, |
| | 120 | year => $year, |
| | 121 | %{ $self->{for_parse_module} }, |
| | 122 | ); |
| | 123 | } |
| | 124 | |
| | 125 | return; |
| | 126 | } |
| 103 | | if ( my $rotate = $self->rotate ) { |
| 104 | | my $increment = $increment_map{$rotate}; |
| 105 | | ( my $truncate_to = (keys %$increment)[0] ) =~ s/s$//; |
| 106 | | my $rotated_on = $from->clone->truncate( to => $truncate_to ); |
| 107 | | |
| 108 | | while ( DateTime->compare( $rotated_on, $to ) != 1 ) { |
| 109 | | my $logfile = { |
| 110 | | name => $rotated_on->strftime( $self->patterned_file ), |
| 111 | | year => $rotated_on->year, |
| 112 | | }; |
| 113 | | push @{ $self->logfiles }, $logfile; |
| 114 | | $rotated_on->add( $increment ); |
| 115 | | } |
| 116 | | |
| 117 | | } else { |
| 118 | | $self->{logfiles} = [ |
| 119 | | { name => $self->patterned_file, |
| 120 | | year => $from->year, |
| 121 | | }, |
| 122 | | ]; |
| 123 | | } |
| 124 | | |
| 125 | | return $self; |
| 126 | | } |
| 127 | | |
| 128 | | sub set_logfiles_by_legacy { |
| 129 | | my $self = shift; |
| 130 | | |
| | 143 | $self->rotate or return [ |
| | 144 | { name => $self->patterned_file, |
| | 145 | year => $from->year, |
| | 146 | }, |
| | 147 | ]; |
| | 148 | |
| | 149 | my $increment = $increment_map{ $self->rotate }; |
| | 150 | ( my $truncate_to = (keys %$increment)[0] ) =~ s/s$//; |
| | 151 | my $rotated_on = $from->clone->truncate( to => $truncate_to ); |
| | 152 | |
| | 153 | while ( DateTime->compare( $rotated_on, $to ) != 1 ) { |
| | 154 | my $logfile = { |
| | 155 | name => $rotated_on->strftime( $self->patterned_file ), |
| | 156 | year => $rotated_on->year, |
| | 157 | }; |
| | 158 | push @$logfiles, $logfile; |
| | 159 | $rotated_on->add( $increment ); |
| | 160 | } |
| | 161 | |
| | 162 | return $logfiles; |
| | 163 | } |
| | 164 | |
| | 165 | sub logfiles_by_legacy { |
| | 166 | my $self = shift; |
| | 167 | |
| | 168 | $logfiles = []; |
| 214 | | or croak "can't find logrotate statefile. please set rotate_statefile"; |
| 215 | | my $state_h = Path::Class::file( $statefile )->open( 'r' ) or croak $!; |
| 216 | | my ( $year, $month, $day ); |
| 217 | | |
| 218 | | while ( my $line = <$state_h> ) { |
| 219 | | chomp $line; |
| 220 | | my ( $name, $status ) = $line =~ /^"(.*?)"[ ](.*)$/mxs; |
| 221 | | ( $name and $status ) or next; |
| 222 | | $name eq $file or next; |
| 223 | | ( $year, $month, $day ) = split "-", $status; |
| 224 | | ( $year and $month and $day ) |
| 225 | | or croak "parsing $statefile failed"; |
| 226 | | last; |
| 227 | | } |
| 228 | | |
| 229 | | close $state_h or croak $!; |
| 230 | | |
| | 246 | or croak "can't find logrotate statefile. please set the rotate_statefile"; |
| | 247 | |
| | 248 | my @statuses = Path::Class::file($statefile)->slurp( chomp => 1 ) or croak $!; |
| | 249 | my ( $status_line ) = grep /^"$file"[ ]/mxs, @statuses; |
| | 250 | |
| | 251 | if ( !$status_line ) { |
| | 252 | for my $line (@statuses) { |
| | 253 | my ( $meta ) = $line =~ qr{^"(.+)"[ ]}sx or next; |
| | 254 | grep {$_ eq $file} glob $meta or next; |
| | 255 | $status_line = $line and last; |
| | 256 | } |
| | 257 | } |
| | 258 | |
| | 259 | $status_line or return; |
| | 260 | my ( $date ) = $status_line =~ /"[ ](.*)$/mxs; |
| | 261 | my ( $year, $month, $day ) = split( "-", $date || '' ); |
| | 262 | ( $year and $month and $day ) |
| | 263 | or croak "parsing $statefile failed"; |
| | 264 | |
| 238 | | sub next { |
| 239 | | my $self = shift; |
| 240 | | return if $self->{exit_flag}; |
| 241 | | |
| 242 | | while ( my $sp = $self->{sp} ||= $self->get_next_sp ) { |
| 243 | | my $sl = $sp->next or do { undef $self->{sp}; next; }; |
| 244 | | |
| 245 | | ## parse : from_time <= timestamp < delayed_to_time |
| 246 | | ## return: from_time <= timestamp < to_time |
| 247 | | next if $sl->{timestamp} < $self->{from_time}; |
| 248 | | return $sl unless $self->{to_time}; |
| 249 | | |
| 250 | | if ( $self->{delayed_to_time} <= $sl->{timestamp} ) { |
| 251 | | $self->{exit_flag} = 1; |
| 252 | | return; |
| 253 | | } |
| 254 | | |
| 255 | | return $sl if $sl->{timestamp} < $self->{to_time}; |
| 256 | | } |
| 257 | | |
| 258 | | return; |
| 259 | | } |
| 260 | | |
| 261 | | sub get_next_sp { |
| 262 | | my $self = shift; |
| 263 | | |
| 264 | | while ( my $logfile = $self->logfiles->[ $self->{target_idx}++ ] ) { |
| 265 | | my ($name, $year) = @$logfile{qw/ name year /}; |
| 266 | | next unless -r $name; |
| 267 | | |
| 268 | | return $self->{parse_module}->new( |
| 269 | | $name, |
| 270 | | year => $year, |
| 271 | | %{ $self->{for_parse_module} }, |
| 272 | | ); |
| 273 | | } |
| 274 | | |
| 275 | | return; |
| 276 | | } |
| 277 | | |