upstartでのホスト名の変更。

Debianというか、Ubuntu 10.04 LTSでの話ですが、/etc/hostnameを変更後、

$ sudo stop hostname && sudo start hostname

を実行し、ログインしなおすとホスト名が変更されます。/etc/init.d/hostname restartとかやってもwarningが表示されつつ、stop & startコマンドが実行されている罠。upstartが、というのが正しいですね。

$ sudo /etc/init.d/hostname restart
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service hostname restart

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the restart(8) utility, e.g. restart hostname
hostname stop/waiting
$ sudo /etc/init.d/hostname stop
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service hostname stop

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the stop(8) utility, e.g. stop hostname
$ sudo /etc/init.d/hostname start
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service hostname start

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the start(8) utility, e.g. start hostname
hostname stop/waiting

MiniKeePassのDBが肥大化する問題。

ID/Passwordの管理にiPhoneではMiniKeePassを、Debianではkeepass2を使っています。先日、このMiniKeePassが突然落ちる問題に遭遇しました。このMiniKeePassで使っているDBのファイルサイズが倍々ゲームでどんどんデカくなっていたのです。6MB超えたところでMiniKeePassが落ちたり、固まったりするようになりました。これは困りました。MiniKeePassではCompressなどに関する設定はありません。Debian側で使っているkeepass2では、compressやdeleteの設定などがあったの、いろいろ試してみた結果、次のように変更すると6MBものファイルサイズが20KB程度まで圧縮することができました。その方法は、

Tools→Database Maintenance→Entry Historyとたどり、

../../../_images/20120315010557.png

Delete history entries older than (days)の値をデフォルトの365から10などにし、Deleteボタンを押します。

../../../_images/20120315010556.png

keepassのDBはファイルなのでファイル単位でバックアップ取れます。Dropboxなどで同期している場合には、自動でバックアップが取得されていることので、この値小さくても全然問題にならないでしょう。

Redmineのチケットを一括してプロジェクト移動させる。

普段チームのタスク管理はRedmineのチケットで管理しています。あるシステムの運用を引き継いだ際、それに関する依頼作業もチケットで管理するようになりました。最初は良かったのです。メーリングリストや個人宛のメールだけでのトラッキングをやめたので作業漏れは無くなりました。が、しばらく運用して大変な事になりました。Redmineの一つのプロジェクトで全て管理していたので、チームのタスクが埋れてしまい探すのがめっちゃ大変になってしまいました。そこで、依頼作業はサブプロジェクトとして分ける事にしました。分けるのは良いのですがどうやって既存のチケットを移行させるかが問題です。一つのチケットだけなら”移動”というリンクのクリックでプロジェクトを移動することができます。でもチマチマ一つずつ移動なんてやってられません。そう思ってググる先生に聞いてみたら、 CSVでのインポートプラグイン があったので、これを試してみました。

手順的には公開元に書かれている通りではあるのですが、

$ http://www.skyarc.co.jp/engineerblog/download/redmine_importer.0.0.3.zip
$ unzip redmine_importer.0.0.3.zip
$ sudo cp -a trunk $REDMINE_HOME/vendor/plugins/redmine_importer
$ sudo /etc/init.d/apache2 restart

で反映できます。

肝心の移動させる対象のチケットはカスタムクエリで表示させた後、CSV形式でダウンロードします。そしてブロジェクトのタグをサブプロジェクトのタグにsedコマンドで一括変換し、

$ sed -i 's/before-tag/after-tag/g' export.csv

メニューに表示されるCSV importからexport.csvインポートすれば終わりです。同じチケットは重複してしまうのかと思ってましたが、実際にはチケット番号をキーにしてプロジェクトタグだけを一括updateしているみたいですね。

Multihost SSH wrapperによる複数ノードでのコマンド実行。

仕事で複数ノードから同時に別々のWebサーバに対してabで負荷を掛ける必要があったので、普段なら dsh を使うところなのですが、複数ノードにコマンド発行できるサーバはあいにくCentOS 5.5でした。不幸な事に tomahawk も導入されていませんでした。複数ノードに対してsshができるパッケージが無いかなと思って探してみたらちゃんとあるではありませんか。

$ yum search ssh
(snip)
mussh.noarch : Multihost SSH wrapper
(snip)

特に依存関係もないFedora Projectがパッケージベンダーとなっているrpmパッケージです。

$ rpm -qi mussh
Name        : mussh                        Relocations: (not relocatable)
Version     : 0.7                               Vendor: Fedora Project
Release     : 1.el5                         Build Date: Wed Jul 11 10:29:43 2007
Install Date: Mon Mar 12 18:06:01 2012         Build Host: ppc3.fedora.redhat.com
Group       : Applications/System           Source RPM: mussh-0.7-1.el5.src.rpm
Size        : 32686                            License: GPL
Signature   : DSA/SHA1, Wed Jul 11 12:36:32 2007, Key ID 119cc036217521f6
Packager    : Fedora Project <http://bugzilla.redhat.com/bugzilla>
URL         : http://www.sourceforge.net/projects/mussh
Summary     : Multihost SSH wrapper
Description :
Mussh is a shell script that allows you to execute a command or script
over ssh on multiple hosts with one command. When possible mussh will use
ssh-agent and RSA/DSA keys to minimize the need to enter your password
more than once.

この実体(/usr/bin/mussh)は単なるシェルスクリプトでした。なお、Debianにも同じパッケージ名musshで存在します。Sidの場合はバージョン1.0です。使い方はmanマニュアルとREADME, EXAMPLEを見れば分かりますが下記に例示しておきます。

複数ノードからそれぞれ別のノードにabを掛ける。

この手のツールは、同じコマンドを同時に実行させてやることはできても、違うコマンドを実行させることができません。なので、実際にabを実行するノード上に次のようなワンライナーを用意してやります。

#!/bin/dash
ab -k -c $1 -n $2 xxx.xxx.xxx.xxx/

別のノードでは、IPアドレスを別のサーバのものにしたワンライナーを用意しておきます。1対1で対応していたので楽ですね。

musshを導入したホストでは次のようなシェルスクリプトを用意します。

#!/bin/sh

CONN=1000
INCR=10000
REQ_BEGIN=100000
REQ_END=300000
DATE=$(date +%Y%m%d-%H%M%S)

func_mussh () {
mussh -h user1@xxx.xxx.xxx.xxx user2@yyy.yyy.yyy.yyy zzz.zzz.zzz.zzz \
        -m3 -b \
        -i /home/user/test/id_rsa \
        -c "sh ab.sh $1 $2"
}

for i in $(seq $REQ_BEGIN $INCR $REQ_END)
do
echo "request: $i"
func_mussh $CONN $i > log/ab-${i}-${DATE}.log
sleep 10
done
  • “-h”オプションでコマンドを実行させたいノードを半角スペース区切りで羅列します。ユーザが異なる場合はSSHラッパーなので上記のように”user@”をprefixで指定してやります

  • “-mN”で並列度を指定します。上記では3台のノードに対して同時に実行するために”-m3”と指定しています

  • “-b”をつけることで出力をノード毎にまとめてくれます。こうすると、関数func_musshでリダイレクトしている結果が、

user2@yyy.yyy.yyy.yyy: This is ApacheBench, Version 2.3 <$Revision: 655654 $>
user2@yyy.yyy.yyy.yyy: Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
user2@yyy.yyy.yyy.yyy: Licensed to The Apache Software Foundation, http://www.apache.org/
(snip)
user2@yyy.yyy.yyy.yyy: 95%      9
user2@yyy.yyy.yyy.yyy: 98%     20
user2@yyy.yyy.yyy.yyy: 99%     33
user2@yyy.yyy.yyy.yyy: 100%    421 (longest request)
user1@xxx.xxx.xxx.xxx: This is ApacheBench, Version 2.3 <$Revision: 655654 $>
user1@xxx.xxx.xxx.xxx: Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
user1@xxx.xxx.xxx.xxx: Licensed to The Apache Software Foundation, http://www.apache.org/
user1@xxx.xxx.xxx.xxx: Benchmarking aaa.aaa.aaa.aaa (be patient)
user1@xxx.xxx.xxx.xxx: Completed 1000 requests
user1@xxx.xxx.xxx.xxx: Completed 2000 requests
(snip)

のように対象ノード毎にまとめられた形で出力されます。

  • “-i”オプションを使うとSSH公開鍵認証の秘密鍵を指定します。これもOpenSSHのsshコマンドと同じですね

  • “-c”オプションで実行させたいコマンドを指定します。今回はseqコマンドでリクエスト数を10000ずつ増分させるようにループ処理しています。セミコロン”;”で区切れば複数コマンドを渡すこともできます

musshでできないこと

musshでは対話形式のコマンドには対応していません。なので、 visiblepwを有効にしてやっても 使えないものは使えません。sudoを使いたければ、特定コマンドだけをパスワードなしで実行できるユーザを用意してやるか、mussh自体がシェルスクリプトなのでsudo対応できるようにしてやるようにパッチでも書くと良いかもしれませんが、そもそもsudoで実行する必要があるようなコマンドをリモートホストから実行する、という運用自体が微妙ですね…。良い案があれば教えてください。 1

1

セキュアOSを使う、という以外のワークアラウンドでw。

分割してメールで送られてきた画像ファイルをデコードする。

おまめちゃんのお宮参りのために、父親からこんなメールが送られて来ました。

(妹の名前)がお宮参りに着た着物の写真を送ります。

よければ、おまめちゃんのお宮参りに使って!

(snip)

--------_4F5C5649000000006A0F_MULTIPART_MIXED_
Content-Type: image/jpeg;
 name="IMG_0874.JPG"
Content-Disposition: attachment;
 filename="IMG_0874.JPG"
Content-Transfer-Encoding: base64

/9j/4Sn+RXhpZgAASUkqAAgAAAAKAA4BAgAgAAAAhgAAAA8BAgAGAAAApgAAABABAgAZAAAArAAA
ABIBAwABAAAAAQAAABoBBQABAAAAzAAAABsBBQABAAAA1AAAACgBAwABAAAAAgAAADIBAgAUAAAA
3AAAABMCAwABAAAAAgAAAGmHBAABAAAA8AAAAOoMAAAgICAgICAgICAgICAgICAgICAgICAgICAg
(snip)

普通ですね。2通目。

Subject: =?ISO-2022-JP?B?GyRCJCo1XDsyJGokTkNlSiobKEI=?= [2/4]
References: <xxxxxxx@example.com>
Message-Id: <xxxxxxx@example.com>
MIME-Version: 1.0
Content-Type: message/partial; number=2; total=4;
 id="<xxxxxxx@example.com>"
Content-Transfer-Encoding: 7bit
X-Mailer: Becky! ver. 2.58 [ja]

LDtTou4fX+ppgisB/wAUuZ7hREBtDgnIQk9M+vWjVpxby2rYLQEfM8YzgfSmx3C8lLxISSsYHUdS
P60/7MtwiyRrgCMtj2AzmpaGiDS+NNEyFchNxRzgjnp7n6Uk0rEg4UMcEhDnFAmeh+FA6zTMhDkx
7cSDdtHqPftXC3V0kfiyISZY85Q/zpCTLVjEsHiaQsCVZcnHRef/AK9cb4uZoJxJKqxkH5ArZz7/
(snip)

と、いきなりbase64でエンコードされた文字列だけで始まるメールががが。3通目も同じで、最後の4通目は

jHUivCvFtm10bnKhkA+6DnNUjK/Y+f77TJdPlJCbo+pGOa51ZYvtEjFApGR6CqsTcoi4kFwBCn7s
MSSe341rOyw+RKC20tkfNyKQXPbfC9iBCs6oYwDyHPUVPqc0f2hw2IV5JIb73HApMaPMiWurgyh8
MVO5e9bumr9mu42IIG3bjNTqB3WmwgXAVE2s3BJbIHvXR6fbD7UqCQSsc52CpZSPWdD1Wa2litQT
BbHgzqxJDehH9frXvWi+LRb2bD78yjCs/A+v1qdzRRR6/Br0cptY45xKHwMoTgN3681vRSSC5Mki
kFcYxj5ge49qi1g5bH//2Q==
--------_4F5C5649000000006A0F_MULTIPART_MIXED_--

で終わってました。これでは用を成さないのでデコードしてみます。

まず、この4通のメッセージをソースで表示して、[1-4].txtで保存し、メールヘッダや本文を削除してbase64の文字列だけにします。一通目の

--------_4F5C5649000000006A0F_MULTIPART_MIXED_
Content-Type: image/jpeg;
 name="IMG_0874.JPG"
Content-Disposition: attachment;
 filename="IMG_0874.JPG"
Content-Transfer-Encoding: base64

と、4通目の

--------_4F5C5649000000006A0F_MULTIPART_MIXED_--

も削除します。

そして、base64コマンドでデコードします。

$ cat [1-4].txt | base64 -d > kimono.jpg
$ ls -l kimono.jpg
-rw-r--r--  1 user user  2953927  3月 11 19:55 kimono.jpg

gthumbなどで確認するとちゃんと見られますね。

../../../_images/20120311161241.jpg

ちなみにもう一通送られてきた、背面の写真。よう30年近くもちゃんと保管してますなぁ。

../../../_images/20120311161430.jpg

それにしても、Becky!って、勝手に添付ファイル分割してくれるんですね。でも一般人だと分割しても元に戻す方法知らない気がするので、送った人は「画像見られないヨ!」と文句言われると思うんですけど、大丈夫なのでしょうかね。