データ解析をやっていると、サーバからのログ収集だけでなく、ブラウザの管理画面からしか取得できないデータを自動的に取得する場面が出てきます。
それをGnome+VNC+xautomationでやってしまえという試みです。
単純に面白いのでオススメです。
いきさつ
とある管理画面にログインすると売上データが取得できるとします。1日1回取得する必要があり、当然人手をかけることは望ましくないので自動化しようとなります。HTMLソース主体のWebScrapingで解決できる場合もありますが、JavaScript動作などが複雑で、ブラウザ操作でしか取得できない場合があります。ではどうするかというと、OSの画面上でマウスとキーボードを自動でブラウザ操作することで取得しようとなります。Windowsだと UWSC というものがあったりします。でも今回は、Linuxであり、しかもXENのDomUインスタンス上を条件として考えだしました。
DomUのコンソールは xm console で接続しますが、そこでビジュアル画面出せるのかよ、とかだいぶ的はずれなところから突っついていきました。で、この辺を調べてると Xwindow, Xorg, Xserver という単語にあたってくるわけですが、結論としては、そもそもDomUにXは入れられないとわかり、悶絶するなど。
結局、X Windowなど不要で、Gnome+VNCだけで画面を出せることがわかり、あとはxautomationを使うだけ。という流れで開発していきました。まずは基本環境の構築手順を紹介します。
リンク集
Gnome
VNC サーバ
VNC Viewer
xautomation
構築を始める前に
VNC Serverは起動するユーザのホームディレクトリを使用します。以下の説明は全てrootユーザで実行していますが、一般ユーザで実行する場合はホームディレクトリが存在する必要があります。また、重要なシステムとして扱う場合、autofsなどでホームをNFSマウントしていると不安定になるためautofsを解除してから利用します。
パッケージインストール
関連パッケージ一式をインストールします。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apt-get update apt-get install \ gnome-desktop-environment \ vnc4server \ xautomation \ xfonts-100dpi xfonts-75dpi xfonts-base rxvt \ ttf-sazanami-gothic ttf-sazanami-mincho \ scim-anthy \ iceweasel iceweasel-l10n-ja apt-get --purge remove avahi-daemon apt-get -f autoremove |
Gnome+VNCサーバを起動
ここではrootユーザで実行します。まず、1回VNCサーバを立ち上げます。:0 はディスプレイ番号になります(デフォルトは :1 )。この時に入力するパスワード(6~8文字)はVNC Viewerから接続する時に使います。
1 2 3 |
vncserver :0 Password: password Verify: password |
起動を確認します。5900+ディスプレイ番号 のポートが利用されます。
1 |
lsof -i:5900 -n |
$HOME/.vnc/ に設定ファイルやログができます。
いったん停止して設定ファイルを作成します。
1 |
vncserver -kill :0 |
VNCサーバの設定ファイル例です。
vim ~/.vnc/xstartup
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/sh # 日本語表示 export LANG=ja_JP.UTF-8 # 日本語入力(Ctrl+Spaceで入力切替) export GTK_IM_MODULE=scim export QT_IM_MODULE=scim export XMODIFIERS="@im=SCIM" # Gnomeで起動 xrdb $HOME/.Xresources exec gnome-session & |
再度VNCサーバを起動します。
1 |
vncserver :0 |
ここまで何も目に見えないため胸が不安でいっぱいですが、次で一気に道が拓けます。
VNC Viewerで接続する
RealVNC・TightVNC・UltraVNC・MetaVNC と色々ありますが、実運用では不要で、開発での確認用のため複雑な機能は必要ありません。今回は簡単かつ日本語版がある RealVNC を使用しました。VNC Viewer をインストールします。
起動し、接続してみます。(ポート番号と経路上のフィルタリングに注意してください)
1 2 |
サーバ: 192.168.xx.yy:0 パスワード: password |
ゴミ箱などが表示され、メニューなどが日本語で表示されていればOKです。
メニューバーのアプリケーションにあるシェル端末を開いたり、エディタを開いて日本語入力をしてみてください。言語バーはCtrl+Spaceで入力切替できます。
xautomationで操作する
画面に接続できたら、端末を起動してコマンドを投げてみます。VNC Viewer上の端末で打つ場合はディスプレイ番号を気にする必要はありません。
1 2 3 4 5 |
# 現在のマウスカーソル位置を取得 xmousepos # マウスカーソル位置を絶対位置へ移動 xte 'mousemove 10 20' |
実運用では同サーバ上の、他のシェルから実行することになるので、ディスプレイ番号を指定する必要があります。番号は起動時に指定したものですが、VNC上のシェルでこのように確認できます。
1 2 |
echo $DISPLAY :0.0 |
番号を変数代入しながらコマンド実行するか export しておくことで省略して実行できます。
1 2 3 4 5 6 7 8 9 |
# 都度番号を指定 DISPLAY=:0 xmousepos # 設定してしまう場合 export DISPLAY=:0 xmousepos # xteコマンドはオプションで指定可能 xte -x:0 'mousemove 10 20' |
仮想環境が必須になった昨今では、Linuxのビジュアル画面を見ることも減ったでしょうから、Gnome+VNCまでを利用して楽しむことも良いかもしれません。
次回はxautomationの詳しい使い方を紹介します。