昨日エントリーした
ZabbixのAPIを叩いて、ホストグループやホストの一括登録をやらせるプログラムを書いているのだけど、日本語の扱いで上手く行っていなくて、悩んでいたりする。
[From Zabbix APIを叩いて、日本語ホストグループ名で登録したいのだが… | Software - Soukaku's HENA-CHOKO Blog]
の続き。
「日本語の部分を、JSON形式にする前に、JSONで使える形に変換できれば」ということで、改めて調べてみて、どうやら
外部から入力された文字列は必ずEncodeモジュールのdecode関数を使用してデコードします。デコードとは「バイト文字列」を「内部文字列」に変換する処理のことをいいます。マルチバイト文字列を扱う場合はdecode関数を使用して必ず内部文字列に変換します。
[From Encode - 日本語などのマルチバイト文字列を適切に処理する / Perlモジュール徹底解説 - サンプルコードによるPerl入門]
のあたりのやり方が使えそうということで、標準入力からホスト名データを読み込んだあと、JSON形式のデータを生成する前のところで、バイト文字列を内部文字列に変換する処理を入れみたら、文字化けせずに登録されるようになりました。
というわけで、下のスクリプトが、登録に成功するようになったもの。
[soukaku@messiah|scripts]$ more ZBX_groupcreate.pl
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use JSON::RPC::Client;
use Data::Dumper;
use Encode;
# 結果出力時の表示形式を固定
binmode(STDOUT, ":utf8");
# Zabbix API経由でユーザ認証
my $client = new JSON::RPC::Client;
my $url = 'http://172.16.0.254/zabbix/api_jsonrpc.php';
my $authID;
my $response;
# 認証用のJSONデータを生成
my $json = {
jsonrpc => "2.0",
method => "user.login",
params => {
user => "admin",
password => "zabbix"},
id => 1
};
# JSON形式データをZabbix APIにPOST
$response = $client->call($url, $json);
die "Authentication failed\n" unless $response->content->{'result'};
# 取得した認証トークンを変数に代入
$authID = $response->content->{'result'};
print "Authentication successful. Auth ID: " . $authID . "\n-----\n";
# 標準入力から、ホストグループ名データを取得
while (my $hostgroup_raw = ≶STDIN> ) {
# ホストグループ名を、内部文字形式に変換
chomp($hostgroup_raw);
my $hostgroup = decode('UTF-8',$hostgroup_raw);
# JSON形式データを生成
$json = {
jsonrpc=> '2.0',
method => 'hostgroup.create',
params => {
name => "$hostgroup", },
id => 2,
auth => "$authID",
};
# JSON形式データをZabbix APIにポスト
$response = $client->call($url, $json);
# 処理結果を表示
print $hostgroup." :\n\t-> ".JSON->new->encode($response->content)."\n\n";
};
while文で標準入力からのデータを受け取り改行文字を取り除いたあとに、"my $hostgroup = decode('UTF-8',$hostgroup_raw);
"でバイト文字列(UTF-8)→内部文字列変換を実行しています。
このスクリプトに、予め作成しておいたグループ名を格納したファイルを標準入力から処理させると、
[soukaku@messiah|~]$ perl scripts/ZBX_groupcreate.pl < scripts/tmp/group_test.txt
Authentication successful. Auth ID: 0b507d3547182ead9a34b364abe7b89f
-----
テスト用グループ(日本語表記) 01 :
-> {"jsonrpc":"2.0","id":2,"result":{"groupids":["54"]}}
テスト用グループ(日本語表記) 02 :
-> {"jsonrpc":"2.0","id":2,"result":{"groupids":["55"]}}
テスト用グループ(日本語表記) 03 :
-> {"jsonrpc":"2.0","id":2,"result":{"groupids":["56"]}}
テスト用グループ(日本語表記) 04 :
-> {"jsonrpc":"2.0","id":2,"result":{"groupids":["57"]}}
テスト用グループ(日本語表記) 05 :
-> {"jsonrpc":"2.0","id":2,"result":{"groupids":["58"]}}
テスト用グループ(日本語表記) 06 :
-> {"jsonrpc":"2.0","id":2,"result":{"groupids":["59"]}}
テスト用グループ(日本語表記) 07 :
-> {"jsonrpc":"2.0","id":2,"result":{"groupids":["60"]}}
Test用グループ(混在表記) 01 :
-> {"jsonrpc":"2.0","id":2,"result":{"groupids":["61"]}}
このように処理され、その結果をGUIで確認してみると、
と成功しているのが判ります。
他の処理で日本語名を使いたい場合も、おそらく同じ方法で対応できるはずなので、もう少し色々試してみよう…。
#ホスト登録でも表示名に日本語入れて一気に処理できる可能性が高くなったぞ、っと。
コメントする