Wiki と荒らし (3)
2005-09-11
書き換えられたページを特定したら、次はバックアップからページを元に戻す作業になる。
$ 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
…ところが、元に戻した数時間後に、また書き換えられる被害を受けてしまった。 このままじゃ、いたちごっこっぽい。