2021年10月31日

ブログをロリポップに移行する(検討中)

 このブログは、さくらインターネットのライトプランで運用している。先日書いた通り、ロリポップのライトプランを新たに契約して、ファイル置き場にした。ロリポップのライトプランは容量が 160GB もあって、大いに余裕がある。このブログはせいぜい 1 GB 程度しか使ってないので、できればロリポップにまとめたい。

 お試しで移行してみたところ、意外に簡単に移行できそうだった。詳細は「ブログの実装を見直した」に書いた通りです。SSI の設定はそのままいけるのかと不安だったが、何の問題もなかった。一つ修正が必要だったのが、サイト内検索用の cgi の shebang 行に書いていた Perl の実行パスだった。/usr/bin/perl と書いていたのだが、今回ロリポップで契約しているサーバでは /usr/local/bin/perl だった。ローカルの Mac でも同じコードを使えるように、/usr/bin/env perl に修正した。

 ブログの移行自体は問題ないのだけど、ローカルで実装しているアクセス解析がちょっと厄介だった。さくらのサーバでは、ftp で Apache の生ログを取ってこれるのだけど、ロリポップのサーバでは、コントロールパネルに手動でアクセスしないとダウンロードできない。何とか自動化できないものかな、と探してみると、やっている人が見つかりました。

ロリポップの生ログをrubyとmechanizeで取得

 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 の設定変更だけど、だいぶ忘れてしまったので、再勉強中です。

Posted at 2021年10月31日 20:26:12
email.png