このブログは、さくらインターネットのライトプランで運用している。先日書いた通り、ロリポップのライトプランを新たに契約して、ファイル置き場にした。ロリポップのライトプランは容量が 160GB もあって、大いに余裕がある。このブログはせいぜい 1 GB 程度しか使ってないので、できればロリポップにまとめたい。
お試しで移行してみたところ、意外に簡単に移行できそうだった。詳細は「ブログの実装を見直した」に書いた通りです。SSI の設定はそのままいけるのかと不安だったが、何の問題もなかった。一つ修正が必要だったのが、サイト内検索用の cgi の shebang 行に書いていた Perl の実行パスだった。/usr/bin/perl
と書いていたのだが、今回ロリポップで契約しているサーバでは /usr/local/bin/perl
だった。ローカルの Mac でも同じコードを使えるように、/usr/bin/env perl
に修正した。
ブログの移行自体は問題ないのだけど、ローカルで実装しているアクセス解析がちょっと厄介だった。さくらのサーバでは、ftp で Apache の生ログを取ってこれるのだけど、ロリポップのサーバでは、コントロールパネルに手動でアクセスしないとダウンロードできない。何とか自動化できないものかな、と探してみると、やっている人が見つかりました。
2013年の記事だけど、同じようにやってみたら、うまくいきました。以下、やったことの記録です。
1. Homebrew を使って rbenv と ruby-build をインストール。
2. ~/.bash_profile
に以下の行を追加。(直接 eval...
を書き込むことが奨励されていますが、私は rbenv をいつでも使うわけじゃないので、使うときだけ enable_rbenv
と手打ちして有効にするつもり。)
enable_rbenv() { eval "$(rbenv init -)"; }
3. 適当な Ruby のバージョン(今回は 2.7.2)をインストールして、その上に mechanize
をインストールする。(システムの Ruby にインストールするのは避けたかった。)
$ enable_rbenv
$ rbenv install 2.7.2
Downloading openssl-1.1.1i.tar.gz...
...(中略)
Downloading ruby-2.7.2.tar.bz2...
...(中略)
$ rbenv versions
* system (set by /Users/XXXXXX/.rbenv/version)
2.7.2
$ rbenv shell 2.7.2 # 現在実行中のシェルだけで Ruby のバージョンを変更
$ rbenv versions
system
* 2.7.2 (set by RBENV_VERSION environment variable)
$ ruby -v
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin18]
$ gem install mechanize
Fetching unf_ext-0.0.8.gem
Fetching unf-0.1.4.gem
...
Done installing documentation for public_suffix, addressable, unf_ext, unf, domain_name, http-cookie, mime-types-data, mime-types, net-http-digest_auth, connection_pool, net-http-persistent, nokogiri, rubyntlm, webrick, webrobots, mechanize after 12 seconds
16 gems installed
4. スクリプトを作成。大部分が Ruby だが、事前に rbenv でバージョンを設定するために、bash スクリプトとして、途中で Ruby を呼び出している。無事動作しました。
#!/bin/bash
# ロリポップのアクセスログを自動ダウンロードする
# 2021.10.26. Toshi Nagata
# Cf. http://www.darkdrive.net/blog/?p=305
# Require: rbenv, ruby 2.7.2, mechanize
# Usage: sh get_lolipop_log.sh YYYYMMDD ...
eval "$(rbenv init -)"
rbenv shell 2.7.2
ruby -e '
#! ruby -Ku
# -*- mode:ruby; coding:utf-8 -*-
require "mechanize"
args = ARGV.dup
if args.length == 0
args.push("")
end
sld = "XXXXXXXX" # ログイン時のドメイン名(ホスト名)
tld = "net" # ログイン時のドメイン名(トップレベルドメイン)
pass = "password" # ログイン時のパスワード
# YYYYYYYY は、ロリポップコントロールパネルの「アクセスログページ」の URL の最後の部分
# (下の analyzeurl が「アクセスログページ」の URL そのものになるようにする)
analyzeurl = "https://user.lolipop.jp/?mode=analyze&exec=setting&id=YYYYYYYY"
# login form
agent = Mechanize.new
login = agent.get "https://user.lolipop.jp/"
form = login.form_with "frm"
domain_plan = form.radiobutton_with "domain_plan"
domain_plan.value = 1
login = form.submit
# domain login form
form = login.form_with "frm"
domain_name_2 = form.field_with "domain_name_2"
domain_name_2.value = sld
domain_name_3 = form.field_with "domain_name_3"
domain_name_3.value = tld
passwd = form.field_with "passwd"
passwd.value = pass
form.action = form.action + "?mode=login&exec=1"
logined = form.submit
# log download form
aclog = agent.get analyzeurl
args.each_with_index { |dt, i|
if dt == ""
dt = (Date.today - 2).to_s
dt = dt.gsub("-", "")
end
dt = dt.slice(2,7)
form = aclog.form_with "frm2"
form.method = "POST"
form.action = "https://user.lolipop.jp/?mode=analyze&exec=download"
form.field_with("sltDate").value = dt
data = form.submit
if data.filename.match(/\.gz$/)
# 同名のファイルがある時はリネームしておき、あとで削除する
# (data.saveas は、同名のファイルがあると .1, .2 などをつけて新しいファイルを作る)
backup = false
if File.exists?(data.filename)
File.delete(data.filename + ".bak") if File.exists?(data.filename + ".bak")
File.rename(data.filename, data.filename + ".bak")
backup = true
end
data.save_as(data.filename)
puts "Log file " + data.filename + " was saved"
File.delete(data.filename + ".bak") if backup
else
puts "Cannot get log file for " + dt
break
end
while true
break if File.exists?(data.filename)
sleep 0.5
end
break if i == args.length - 1
sleep 1
}
' "$@"
あとは DNS の設定変更だけど、だいぶ忘れてしまったので、再勉強中です。