最新のハードウェアやソフトウェアにかんするニュースもいいけれど、「事件は枯れたシステムが稼働する現場で起こってるんだ」と現場ですぐに役立つ知識を欲するあなたへ贈る珠玉のTips集。今回は、Perlスクリプトを用いたWebアクセスの自動化だ。
郵便番号検索などが行えるWebサイトをよく利用します。ただ、毎回Webブラウザで項目を入力して検索するのは面倒なので、スクリプトなどを利用したいと考えています。どのように実現したらよいでしょうか?
一般的なCGIに対しては、Perlスクリプトなどを用いると簡単に検索できます。ここでは、「MACアドレスのベンダーコード検索」サービス用のスクリプトとして、WWW::Mechanizeモジュールを利用したoui-search.plを紹介します(リスト1)。
なおシステムには、PerlおよびWWW::Mechanizeモジュールを事前にインストールしてください。WWW::Mechanizeモジュールは依存するものが複数あるので、CPANモジュールを利用すると簡単に導入できます。
# perl -MCPAN -e shell
cpan> install WWW:Mechanize
1 #!/usr/bin/perl -w
2
3 use strict;
4 use WWW::Mechanize;
5
6 unless($ARGV[0] =~ m/^[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}$/i)
7 {
8 print("ERROR: Invalid argument.\n");
9 print(" ex\) $0 08-00-20\n");
10 exit(1);
11 }
12
13 my $url = 'http://standards.ieee.org/regauth/oui/index.shtml';
14 my $agent = WWW::Mechanize -> new();
15 $agent -> get($url);
16 $agent -> field("x", $ARGV[0]);
17 $agent -> submit_form(form_number => "1");
18
19 print("IEEE OUI Company_id\n");
20 print("-------- -----------------------\n");
21 if($agent -> content =~ m/(?:[0-9A-F]{6})\s+\(base 16\)\s+(.+)/)
22 {
23 print("$ARGV[0] $1\n");
24 }
25 else
26 {
27 print("$ARGV[0] NOT FOUND\n");
28 }
29
30 exit(0);
oui-search.plを実行する際は、引数としてMACアドレスのベンダーコードを指定します。例えば、「08-00-20」を指定すると、
% ./oui-search.pl 08-00-20
IEEE OUI Company_id
-------- -----------------------
08-00-20 SUN MICROSYSTEMS INC.
のように表示されます。ここで、存在しないコードを指定した場合は、
% ./oui-search.pl 08-00-dd
IEEE OUI Company_id
-------- -----------------------
08-00-dd NOT FOUND
と「NOT FOUND」が表示されるので注意してください。
oui-search.plの内容を見てみると、まず6行目で引数の型チェックを行っています。14行目でインスタンスを生成し、15行目で指定URLへアクセスします。16行目では、「x」というテキストフィールドに対して、引数で与えられたベンダーコードを入力しています。最後に17行目で[Submit]ボタンを押し、検索を実行します。そして21行目では、検索結果表示ページの内容からベンダー名を抜き出し、23行目で標準出力へ表示させています。
このように、WWW::Mechanizeモジュールを利用すれば、Web経由での管理インタフェースしか持たないネットワーク機器などのメンテナンスが容易になります。例えば、「cronで定期的にスクリプトを実行し、ステータス表示画面からデータを抜き出して管理者にメールする」という操作も実現できるわけです。
スクリプトを作成するうえで面倒なのが、HTMLソースコードからフォームの名称や値の入力方法を調べる部分だと思います。これについては、HTTP::Recorderモジュールを用いることで、スクリプト主要部分のひな形を生成させることが可能です。例えば、HTTP::ProxyモジュールとHTTP::Recorderモジュールを利用して簡易プロキシサーバーrecord-http.plを作成し(リスト2)、Webブラウザでのアクセスを経由注5させることで、HTTP通信の内容(Webブラウザから送信された内容の主要部分)を取得できます(実行例1)。
#!/usr/bin/perl -w
use strict;
use HTTP::Proxy;
use HTTP::Recorder;
my $proxy = HTTP::Proxy -> new();
my $agent = HTTP::Recorder -> new
(
file => "/tmp/myagent",
showwindow => 0
);
$proxy -> agent($agent);
$proxy -> start();
1;
# ./record-http.pl & ←Webブラウザでベンダーコード検索を実行
# cat /tmp/myagent
$agent->get("http://standards.ieee.org/regauth/oui/
index.shtml");
$agent->field("x", "08-00-20");
$agent->submit_form(form_number => "1");
JavaScriptを利用している場合など、一部のWebページでは正常に記録されないことがありますが、この内容をカスタマイズすることで、HTMLソースコードを参照することなしに、WWW::Mechanizeモジュールを利用したスクリプトの作成が可能になります。
Copyright © ITmedia, Inc. All Rights Reserved.