1. Perl / Говнокод #17143

    −19

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    sub rotate {
        my ($filename, $max_entries) = @_;
        $max_entries //= 10; # TODO: make infinity available
    
        return if (! -f $filename);
    
        my ($name, $dir, $suffix) = fileparse($filename, qr/\.[^.]*$/);
    
        my %old_files = ();
        my $shift_max = 0; # maximum number of file that is going to be rotated
        my $glob = File::Spec->catfile($dir, $name . '.*' . $suffix);
        for my $file (glob qq/"$glob"/) {
            my ($number) = $file =~ /\.(\d+)\Q$suffix\E$/;
    
            $old_files{$number} = $file if (defined $number);
            $shift_max++ while (exists $old_files{$shift_max + 1});
        }
    
        $shift_max = $max_entries - 1 if ($shift_max >= $max_entries);
        # how many files to remove from the end
        my $to_remove = scalar(keys %old_files) - $max_entries;
    
        # rename and unlink
        for my $number (sort { $b <=> $a } keys %old_files) {
            my $file = $old_files{$number};
    
            if ($to_remove-- > 0) {
                print "## DEBUG: unlink $file\n";
                unlink($file)
                    or croak('Cannot unlink ' . $file);
            } elsif ($number <= $shift_max) {
                my $new_name = File::Spec->catfile($dir, $name . '.' . ($number + 1) . $suffix);
                print "## DEBUG: rename $file -> $new_name\n";
                rename($file, $new_name)
                    or croak('Cannot rename ' . $file . ' to ' . $new_name);
            }
        }
    
        my $new_name = File::Spec->catfile($dir, $name . '.1' . $suffix);
        print "## DEBUG: rename $filename -> $new_name\n";
        rename($filename, $new_name)
            or croak('Cannot rename ' . $filename . ' to ' . $new_name);
    }

    Продолжаем парад велосипедов. Сделал ротацию бекап-архивов :-{

    Запостил: Elvenfighter, 20 Ноября 2014

    Комментарии (10) RSS

    • POSIX::strftime("%m/%d/%Y %H:%M:%S\n", localtime);
      Ответить
    • Наверное, все когда-нибудь писали велосипед с ротацией бекапов...
      Ответить
      • А нельзя какой-нить логротейт прикрутить ?
        Ответить
        • Ну это как забивание гвоздей шуроповёртом. Можно, конечно, но зачем?

          Если уж уходим от велосипедов - то к нормальной системе бекапов, а не к еще более костыльным решениям...
          Ответить
          • Ну уж лучше взять готовый шуруповёрт чем сделать свой (как тут). А в идеале конечно да, нормальный бекап инкрементальный
            Ответить
            • > взять готовый шуруповёрт чем сделать свой
              Ну у логротейта задача немного не та... Хотя... Если в prerotate делать сам бекап, а триггеры настраивать только по времени - должно проканать.
              Ответить
        • > какой-нить логротейт прикрутить ?
          http://www.rsnapshot.org/
          Ответить

    Добавить комментарий