Show
Ignore:
Timestamp:
06/29/08 20:56:43 (5 years ago)
Author:
lamanotrama
Message:

_parse_rotatestatus: parse glob. logfiles_by_* returns array_ref

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/Parse-Syslog-Period/trunk/lib/Parse/Syslog/Period/Parser.pm

    r14835 r14851  
    7373    } 
    7474 
    75     $self->rotate eq 'macro'? $self->set_logfiles_by_macro 
    76                             : $self->set_logfiles_by_legacy; 
     75    $self->{logfiles} = $self->rotate eq 'macro'? $self->logfiles_by_macro 
     76                                                : $self->logfiles_by_legacy; 
    7777    return $self; 
    7878} 
     
    8585    return $self; 
    8686} 
     87 
     88sub 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 
     111sub 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} 
    87127    
    88 sub set_logfiles_by_macro { 
    89     my $self = shift; 
    90  
     128sub logfiles_by_macro { 
     129    my $self = shift; 
     130 
     131    my $logfiles = []; 
    91132    my $from = $self->from; 
    92133    my $to   = $self->{delayed_to} ||= DateTime->now->set_time_zone( 'local' ); 
    93     $self->{logfiles} = []; 
    94134    $self->{rotate} = undef; 
    95135    $self->{patterned_file} = $self->file; 
     
    101141    } 
    102142 
    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 
     165sub logfiles_by_legacy { 
     166    my $self = shift; 
     167 
     168    $logfiles = []; 
    131169    my $from = $self->from; 
    132170    my $to   = $self->{delayed_to} ||= DateTime->now->set_time_zone( 'local' ); 
    133     $self->{logfiles} = []; 
    134171 
    135172    my $rotate = $self->rotate 
    136173        or croak "required rotate"; 
    137174    ( $rotate =~  /^(monthly|weekly|daily)$/ ) 
    138         or croak "illegal rotate type '$rotate'"; 
     175        or croak "invalid rotate type '$rotate'"; 
    139176 
    140177    my $at = $self->rotate_at 
    141         or croak "required rotate_at(hour and minute)"; 
     178        or croak "required rotate_at"; 
    142179    my ($rotate_hour, $rotate_minute) = @$at{qw/ hour minute /}; 
    143180    ( $rotate_hour and $rotate_minute ) 
    144181        or croak "rotate_at must contain hour and minute"; 
    145  
    146     my ($unit_type) = %{ $increment_map{$rotate} }; 
    147182 
    148183    my $last_rotated_date = $self->_parse_rotatestatus( 
     
    151186    );  
    152187 
    153     if ( !$last_rotated_date ) { 
    154         $self->{logfiles} = [ 
    155             {   name => $self->file, 
    156                 year => DateTime->now->set_time_zone( 'local' )->year, 
    157             }, 
    158         ]; 
    159         return; 
    160     } 
     188    $last_rotated_date  or return [ 
     189        {   name => $self->file, 
     190            year => DateTime->now->set_time_zone( 'local' )->year, 
     191        }, 
     192    ]; 
    161193 
    162194    my $last_rotated_on = DateTime->new( 
     
    167199    ); 
    168200 
    169     if ( DateTime->compare( $from, $last_rotated_on ) == 1 ) { 
    170         $self->{logfiles} = [ 
    171             { name => $self->file, 
    172               year => $last_rotated_on->year, 
    173             }, 
    174         ]; 
    175         return; 
    176     } 
    177  
     201    DateTime->compare( $from, $last_rotated_on ) == 1 or return [ 
     202        { name => $self->file, 
     203          year => $last_rotated_on->year  
     204        }, 
     205    ]; 
     206 
     207    my ( $unit_type ) = %{ $increment_map{$rotate} }; 
    178208    my $from_dur = $self->_dur_by_unittype( $last_rotated_on, $from, $unit_type ); 
    179209    my $from_suffix = $from_dur + 1; 
     
    195225            year => $rotated_on->year, 
    196226        }; 
    197         push @{ $self->logfiles }, $logfile; 
     227        push @$logfiles, $logfile; 
    198228        $rotated_on->add( $unit_type => 1 ); 
    199     }        
     229    } 
     230 
     231    return $logfiles; 
    200232} 
    201233 
     
    212244    $statefile ||= '/var/lib/logrotate.status'; 
    213245    -f $statefile 
    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 
    231265    return { 
    232266        year   => $year, 
     
    236270} 
    237271 
    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  
    278272 
    2792731;