telnetの自動化

KVM(というかqemu)で-monitor telnet::4444,server,nowaitみたいなオプションを指定すると、モニタにtelnet接続できる。
telnetなので基本は対話的にコマンドを実行するしかないが、expectを使えばスクリプトに組み込むことができる。sleepとechoとパイプで頑張ってもいいけど。。virshとか使えばいいのにね!
4444はポート番号の例なので適宜読み替え。

# cat -v tlnt.sh                                                     
#!/bin/sh

HOST=$1
PORT=$2
shift;shift
CMD=$*

expect -c "
set timeout 10
spawn telnet $HOST $PORT
expect (qemu)\ ; send \"${CMD}\r\"
expect (qemu)\ ; send \"^]\"
expect telnet>\ ; send \"close\r\"
" | tail -n +7 | head -n -2

下から3行目は「^]」ではなく「Ctrl+]」なので注意。

tailとかheadは決め打ち。引数は「ホスト」「ポート」「コマンド」の順。
たとえば

# tlnt.sh localhost 4444 info status
VM status: running
# 

みたいな感じで使える。
使えるコマンドは

# tlnt.sh localhost 4444 help

で。

たとえば

# tlnt.sh localhost 4444 quit

VMごと強制シャットダウンができたり、(途中で切れちゃうので注意)

# tlnt.sh localhost 4444 screendump screenshot.ppm

スクリーンショットが取れる。

# for i in `tlnt.sh localhost 4444 info | awk '{ print $2 }'`
do
echo "### $i ###"
tlnt.sh localhost 4444 info $i
echo
done

とすればinfo 〜で見れる全パラメータが吐き出せる。
別にtelnet先はlocalhostじゃなくてもいいので、-incomingオプション付きでプロセスを立ち上げてから自動でライブマイグレーションするようなスクリプトも作りこめると思う。