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

    −144

    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/
          Ответить

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