Advertisement
theanonym

crawl-backup.pl

Mar 10th, 2017
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.97 KB | None | 0 0
  1. use 5.010;
  2. use strict;
  3.  
  4. use File::Basename qw/basename fileparse/;
  5. use File::Spec::Functions qw/catdir catfile/;
  6. use File::Copy qw/copy/;
  7. use Date::Format qw/time2str/;
  8.  
  9. # ----------------------------------------
  10.  
  11. my $saves_dir  = "/home/user/saves";
  12. my $backup_dir = "$saves_dir/backup";
  13. my $timeout    = 5;
  14.  
  15. # ----------------------------------------
  16.  
  17. sub report {
  18.    printf "[%s] %s\n", time2str("%H:%M:%S", time), $_[0];
  19. }
  20.  
  21. sub get_characters {
  22.    map { $_ => (stat)[9] } glob catdir($saves_dir, "*.cs");
  23. }
  24.  
  25. sub backup_character {
  26.    my($character) = @_;
  27.    my $backup_name = catfile($backup_dir, basename($character));
  28.    unlink $backup_name or die $! if -f $backup_name;
  29.    copy($character, $backup_name) or die $!;
  30. }
  31.  
  32. sub restore_chatacter {
  33.    my($character) = @_;
  34.    my $backup_name = catfile($backup_dir, basename($character));
  35.    copy($backup_name, $character) or die $!;
  36. }
  37.  
  38. # ----------------------------------------
  39.  
  40. die "`$saves_dir` not found" unless -d $saves_dir;
  41. report "Work in `$saves_dir`.";
  42. mkdir $backup_dir or die $! unless -d $backup_dir;
  43.  
  44. my %characters;
  45. while() {
  46.    my %new_characters = get_characters;
  47.    
  48.    while(my($character, $timestamp) = each %new_characters) {
  49.       my $charname = (basename $character, ".cs")[0];
  50.       if(exists $characters{$character}) {
  51.          #say "$timestamp < $characters{$character}";
  52.          if($timestamp > $characters{$character}) {
  53.             report "Updated: $charname";
  54.             backup_character $character;
  55.          } else {
  56.             # not modified
  57.          }
  58.       } else {
  59.          report "New: $charname";
  60.          backup_character $character;
  61.       }
  62.  
  63.       $characters{$character} = $timestamp;
  64.    }
  65.  
  66.    for my $died_character (grep { !exists $new_characters{$_} } keys %characters) {
  67.       my $charname = (basename $died_character, ".cs")[0];
  68.       restore_chatacter $died_character;
  69.       report "Restored: $charname";
  70.    }
  71.  
  72.    sleep $timeout;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement