「電子の山奥 ブログ」「電子の隠者ブログ」でググっても最初の2件しか出ない。アクセスログを見るとそもそもクロールがほとんどされていない。
どういうわけかshooting1.htmlはけっこうクロールされていたようなので、クロールするしないの判断基準は.html拡張子の有無にあると踏んでトップページからブログへのリンクをblogからblog/index.htmlに変えてみた。
もちろんその前にGoogle公式ドキュメントを読んでクロールしてもらう方法を調べたのだが、ユーザ登録が必要であったり、サイトマップを作成しなきゃいけないとかでめんどくさかったのでやめた。
上記の件に関連して、アクセスログを漁っているときに攻撃試行のログが大量に残っていて邪魔だったのでフィルタアウトするプログラムを書くことにした。
普通にgrep -F -v -e ... -e ...でいいじゃんと思ったけどフィルタ対象の文字列が1000件を超え、コマンドライン引数の上限を考慮する必要が出てきた。 xargsを使おうかと思ったが、一つ一つの文字列の手前に-eを付けなければならないこと、その結果空白やシェルの特殊文字が混ざった場合におかしくなること、そもそも標準入出力を扱うフィルタとしたかったことからxargsは適さないと判断し、自前でプログラムを作成した。
最近はシェルでダメだと思ったらすぐHaskellで書いちゃっている。 runhaskellコマンドでその場で実行できるので割と手軽。pipが無いpython と同程度の手軽さと言えばかなり手軽だと思っていただけるのではなかろうか。
ブログの肥やしに作ったスクリプトを下に貼ります。使い捨てのつもりで作ったので説明は一切ないけどあしからず。
#!/usr/bin/env runhaskell
import System.Environment (getEnv)
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Lazy.Char8 as BL8
main :: IO ()
main = do
home <- getEnv "HOME"
blacklist <- map BL8.toStrict . BL8.lines <$> BL.readFile (home <> "/var/lib/httpfiltspam/blacklist")
BL.interact
$ BL8.unlines
. filter (\l -> let sl = BL8.toStrict l in not $ any (`B.isInfixOf` sl) blacklist)
. BL8.lines