メールサーバの移行

イメージ
 自前のメールサーバを停止 これまで、自ドメインのメールサーバはVPS上に構築していた。 ・Ubuntu Server ・Postfix ・Dovecot ・spamAssassinと、BlackListの利用 Spam対策を行ってきたし、サーバ上でメールをトリガーにして各種プログラムを動かしたりしてきた。 メールサーバのメンテナンスは結構面倒くさくて、  ・Disk容量のチェック  ・不正アクセスのチェック  ・各種セキュリティパッチの適用 など、手間がかかる。 そこで、外部のサーバを利用することに…。 結構安くて使い勝手の良さそうなのが、「さくらのメールボックス」 3年契約で、3070円とな…。  メールアドレスは自分のだけなので、20GBまで利用可能!  (Gmailより大きいねぇ) ということで、早速契約。 アカウント設定を行って、既存のDNSを書き換える。WHOISも書き換えて完了。 SMTPとIMAPが利用できればOK。 ちょうど、GoogleがSPF設定していないと受信しないし、DKIMおよびDMARCに対応していないメールを弾くようになったので、対応しているのを確認。 さくらサーバ自体は、これまでお客さんのサーバとして何件も利用しているので、利用方法も難しくはない。  Webメールにも対応しているので、いざという場合にもありがたい。 ということで、各メールソフトの設定を変更。  PC(常時使用する3台)とタブレット、スマートフォンと台数は多いがそれ程手間はかからない。 問題は、旧サーバで送受信したメールの履歴だけれど、これはThunderbrdを使ってローカルに保存することで回避。  本当は、サーバtoサーバでMailboxに残そうとも考えたんだけど、古いメールはそれ程必要ないし、ローカルにバックアップしてあれば凌げるので、良しとする。 移行時にDNSの反映で若干時間がかかったものの、問題なく送受信できるのを確認して、作業完了。  これでメンテナンスの手間が減るので、安いもんです。

sed:改行含む文字列への置換

少し苦戦した…

すでにコンテンツのあるサイトのドメイン移転とサーバ変更、管理の委託を依頼されて作業を行う。
  1. ドメイン移管
  2. サーバの変更
  3. コンテンツの設置
  4. メールアカウントの設定
以上は、問題なく完了。

さて、あとはコンテンツの修正。

アクセス解析にGoogle Analyticsを利用するのだけれど、これまでの業者さんは未設置。
そこで、各ページに仕込む必要があるけれど、いちいち修正するのはさすがに面倒。
なにせ30ページ程のhtmlが2つもある。

こんな時は、sedの登場ですな。

まずは、jsフォルダを作成。
以下のような内容のg_ana.jsを作成。まぁ、ここまでは、Google Analyticsの吐き出すコードをほんの少し変更するだけでOK
 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-xxxxxxxxx', 'auto');

  ga('send', 'pageview');

でもって、こいつを読み込むように各htmlに書き込む。

とりあえず、</head>の前に設置すれば良いので、
<script type="text/javascript" src="js/g_ana.js"></script></head>
に置換をかければ良いわけだ。

sedで処理する

60回以上も「ファイルを開く」→「編集(貼付けるだけなんだけど)」→「保存」なんてやってられない。

$ sed s#</head>#<script type="text/javascript" src="js/g_ana.js"></script></head># ./index.html | less

で確認してみる。
とりあえず、OKなのを確認。

まあ、これで何も問題はないのだけれど、ソースを見た時に</head>の位置が気持ち悪い。(美しくない)

<script type="text/javascript" src="js/g_ana.js"></script>
</head>

こうなっていて欲しい。</script>と</head>の間に改行を入れたいちゅうわけだ。
こんなもの、\nを含めて置換すりゃ一発と思ったのだけれど、これが上手くいかない。

$ sed s#</head>#<script type="text/javascript" src="js/g_ana.js"></script>\n</head>#

結果を見ると、</script>n</head> 改行されない。しかも\n→n になってるだけやんか…。

試行錯誤を、繰り返す。
繰り返す
繰り返す×10…

苦戦したわ。
最終的には、以下の用に記述すればOKだった。
$ sed 's#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'\\$'\n''</head>#'

置換文字列は、A+改行+Bの構成になっている。
置換したい文字列に"(ダブルクォート)が含まれているので、基本的には’(シングルクォート)で囲んでいる。

A='s#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'
改行=\\$'\n\
B='</head>#'

という形でOK。

最後に罠が…

これでOKだろうと思ったが、実際に書きだす前に最終確認。

$ sed 's#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'\\$'\n''</head>#' *.html

index.htmlは問題なく置換したが、途中でERRORを吐いた。
sed: RE error: illegal byte sequence
なぬ?
よく調べてみると、文字コードがUTF-8だけでなく、EUC-JPで書かれたコンテンツが混ざっている。

こらこら。
文字コードまで変換するのは、もっと面倒。なので、そのまま置換したい。

先頭におまじないを付けてやることで回避した。

LC_ALL=C sed 's#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'\\$'\n''</head>#' *.html

これで、文字コードが混在していてもOK。

最終的には、以下のコードを実行。

LC_ALL=C sed -i.bak 's#</head>#<script type="text/javascript" src="js/g_ana.js"></script>'\\$'\n''</head>#' *.html

-i.bakオプションで、元のhtmlをhtml.bakにして保存する。

まあ、当然コピーで作業しているから、不要なんだけど、あとですぐdiffしたいし、ミスがあったら書き戻せるようにしておきたいからね。

ちゅうことで、60回以上エディタで書き換える作業をすること無く、終了。

時間的には、少し短いくらいかもしれないけど、精神衛生上極めて気持ちがいい。
改行1つに拘らなければ、1分で作業完了だったけど…(笑)






コメント

このブログの人気の投稿

WPS Officeで日本語入力ができない

VirtualBoxでUSBから起動

Virtualboxとnvidiaドライバ