at posts/single.html

Wiki と荒らし (3)

書き換えられたページを特定したら、次はバックアップからページを元に戻す作業になる。

$ revert.rb ~/list.txt

revert.rb の中身はこの通り。

GZIP = '/usr/bin/gzip -cd'
def restore(filename, gen = 1)
  out = []
  buf = []
  open("|#{GZIP} #{filename}", 'r').each do |line|
    if line =~ /^>>>>>>>>>> \d+$/
      out.push buf
      buf = []
    else
      buf << line
    end
  end
  out[0 - gen]
end

def revert(filename, buf)
  filename =~ %r|([^/]+)\.gz|
  file = $1
  open("#{file}.txt", 'w') {|out|
    out.puts buf
  }
end

backup_dir = '~public_html/pukiwiki/backup'

ARGF.each do |line|
  line =~ /(\w+).txt/
  file = "#{backup_dir}/#{$1}.gz"
  revert(file, restore(file, 1))
end

最後に、 diff データを削除しておしまい。

$ cd ../diff
$ cut -f2 ~/list.txt | xargs rm -f

…ところが、元に戻した数時間後に、また書き換えられる被害を受けてしまった。 このままじゃ、いたちごっこっぽい。

関連する日記