Nagiosは、WarningやCriticalをアラートを音で知らせる機能がある。
この機能を使っている人がどのくらいいるのか知らないが、実はこれ結構うるさくてしかたがないと思っている。
アラートの内容を確認しようと思って、色々画面遷移するのだが、新たな画面を開くたびにビィービィー鳴るからだ。
このアラート音機能を集約できたら、結構使い勝手がよくなると思うのだが、どうだろうか。
例えば、小さなポップアップ画面にパトライトのアニメGIFが表示され、アラートがある場合にアラート音が鳴り、このポップアップ画面をクリックするとアラート音が停止するというような機能を追加したら、新たな画面を開くたびにビィービィー鳴ることもなく使い勝手がよくならないだろうか。
実はこの機能は、パトロールクラリスに実装されているものだ。
そういうことで今回は、Nagiosにパトライト機能を追加してみたいと思う。
Nagiosのバージョンは、3.1.0 だ。
サーバOSは、CentOS 5.3 である。
仕様
今回追加するパトライト機能の仕様は以下の通りだ。
①サイドメニューにパトライトメニューを追加。(図1)
今回は「総合監視状態」の下に追加する。
図1:サイドメニュー
②サイドメニューのパトライトメニューをクリックすると、パトライトウィンドウを表示する。(図2※アラート音に注意)
図2をクリックするとパトライトウィンドウが表示され、アラート音が鳴る。
図2:パトライトウィンドウ
※図2のパトライトのアニメGIFは、TK CG GALLERYのパトランプのアニメGIFを利用しています。
③パトライトウィンドウが表示されている間だけNagiosのステータスに応じてアラート音が鳴る。
この「Nagiosのステータスに応じてアラート音が鳴る」という部分は、総合監視状態の画面と同等とするのが妥当だろう。
④パトライトウィンドウをクリックすると一時的にアラート音が停止する。
図2をクリックして表示されたパトライトウィンドウもクリックすると、アラート音が停止する。
⑤更新間隔でリロードされると再度アラート音が鳴る。
⑥アラート音を完全に停止させるためには、Nagiosで認知済みにする。
これは、Nagios GUIのオリジナル仕様だ。
⑦パトライト機能のアラート音は、Nagios本来のアラート音とは別のパラメータで指定できるようにする。
これで、Nagiosのアラート音を消して、パトライト機能にアラート音を集約することが出来る。
新たな画面を開くたびにビィービィー鳴る煩わしさから解放されるだろう。
また、これで、Nagiosとパトライト機能のアラート音の両方を使うことも出来る。
パトライト機能のアラート音設定パラメータの追加
パトライト機能のアラート音は、Nagios本来のアラート音とは別に以下のパラメータで設定できるようにする。
host_unreachable_ptsound=hostdown.wav
host_down_ptsound=hostdown.wav
service_critical_ptsound=critical.wav
service_warning_ptsound=warning.wav
service_unknown_ptsound=warning.wav
normal_ptsound=noproblem.wav
このためには、/usr/local/src/nagios-3.1.0/cgi/cgiutils.cを修正して、上記のパラメータを読み込めるようにする必要がある。
<54行目に以下を追加>
char *service_critical_ptsound=NULL;
char *service_warning_ptsound=NULL;
char *service_unknown_ptsound=NULL;
char *host_down_ptsound=NULL;
char *host_unreachable_ptsound=NULL;
char *normal_ptsound=NULL;
|
<192行目に以下を追加>
service_critical_ptsound=NULL;
service_warning_ptsound=NULL;
service_unknown_ptsound=NULL;
host_down_ptsound=NULL;
host_unreachable_ptsound=NULL;
normal_ptsound=NULL;
|
<222行目に以下を追加>
free(service_critical_ptsound);
free(service_warning_ptsound);
free(service_unknown_ptsound);
free(host_down_ptsound);
free(host_unreachable_ptsound);
free(normal_ptsound);
|
<374行目に以下を追加>
else if(!strcmp(var,"service_critical_ptsound"))
service_critical_ptsound=strdup(val);
else if(!strcmp(var,"service_warning_ptsound"))
service_warning_ptsound=strdup(val);
else if(!strcmp(var,"service_unknown_ptsound"))
service_unknown_ptsound=strdup(val);
else if(!strcmp(var,"host_down_ptsound"))
host_down_ptsound=strdup(val);
else if(!strcmp(var,"host_unreachable_ptsound"))
host_unreachable_ptsound=strdup(val);
else if(!strcmp(var,"normal_ptsound"))
normal_ptsound=strdup(val);
|
パトライトCGIの作成
今回、「Nagiosのステータスに応じてアラート音が鳴る」という部分は、総合監視状態の画面と同等とするので、総合監視状態の画面を表示するtac.cgiをカスタマイズする。
表示するのが、総合監視状態の画面ではなく、パトライトウィンドウというイメージだ。
そのために、まずは、/usr/local/src/nagios-3.1.0/cgi/tac.cをコピーして、patlight.cを作り、以下の修正を行う。
<57~62行目を以下のように修正>
extern char *service_critical_ptsound;
extern char *service_warning_ptsound;
extern char *service_unknown_ptsound;
extern char *host_down_ptsound;
extern char *host_unreachable_ptsound;
extern char *normal_ptsound;
|
<81行目を削除>
81 void display_tac_overview(void);
|
<268~292行目を削除>
268 if(display_header==TRUE){
269
270 /* begin top table */
271 printf("<table border=0 width=100%% cellpadding=0 cellspacing=0>\n");
272 printf("<tr>\n");
273
274 /* left column of top table - info box */
275 printf("<td align=left valign=top width=33%%>\n");
276 display_info_table("Tactical Status Overview",TRUE,¤t_authdata);
277 printf("</td>\n");
278
279 /* middle column of top table - log file navigation options */
280 printf("<td align=center valign=top width=33%%>\n");
281 printf("</td>\n");
282
283 /* right hand column of top row */
284 printf("<td align=right valign=top width=33%%>\n");
285 printf("</td>\n");
286
287 /* end of top table */
288 printf("</tr>\n");
289 printf("</table>\n");
290 printf("</p>\n");
291
292 }
|
<315~331行目を以下のように修正>
今回はパトライトのアニメGIFは、patlight.gifという名前に固定しています。
パトライトのアニメGIFは、patlight.gifという名前でアップロードする必要があります。
if(hosts_unreachable_unacknowledged > 0 && host_unreachable_ptsound!=NULL)
sound=host_unreachable_ptsound;
else if(hosts_down_unacknowledged > 0 && host_down_ptsound!=NULL)
sound=host_down_ptsound;
else if(services_critical_unacknowledged > 0 && service_critical_ptsound!=NULL)
sound=service_critical_ptsound;
else if(services_warning_unacknowledged > 0 && service_warning_ptsound!=NULL)
sound=service_warning_ptsound;
else if(services_unknown_unacknowledged==0 && services_warning_unacknowledged==0 && services_critical_unacknowledged==0 && hosts_down_unacknowledged==0 && hosts_unreachable_unacknowledged==0 && normal_ptsound!=NULL)
sound=normal_ptsound;
if(sound!=NULL){
printf("<object id=\"em1\" type=\"audio/x-wav\" data=\"%s%s\" height=\"-\" width=\"0\">",url_media_path,sound);
printf("<param name=\"filename\" value=\"%s%s\">",url_media_path,sound);
printf("<param name=\"autostart\" value=\"true\">");
printf("<param name=\"playcount\" value=\"0\">");
printf("</object>");
printf("<IMG SRC=\"%s%s\" galleryimg=\"no\" width=\"300\" height=\"300\" border=\"0\" onClick=\"document.em1.stop()\">",url_images_path,"patlight.gif");
}
|
<334~335行目を削除>
334 /**** display main tac screen ****/
335 display_tac_overview();
|
<392~394行目を以下のように修正>
printf("<meta http-equiv='content-type' content='text/html;charset=utf-8'>\n");
printf("<meta http-equiv='Pragma' content='no-cache'>\n");
printf("<TITLE>\n");
printf("パトライト\n");
printf("</TITLE>\n");
|
<402行目を以下のように修正>
printf("<BODY CLASS='tac' marginwidth=2 marginheight=2 topmargin=0 leftmargin=0 rightmargin=0 onLoad=\"focus();\">\n");
|
<935~1665行目を削除>
display_tac_overview 関数を削除する。
935 void display_tac_overview(void){
936 char host_health_image[16];
937 char service_health_image[16];
938
939
940 printf("<p align=left>\n");
941
942 printf("<table border=0 align=left width=100%% cellspacing=4 cellpadding=0>\n");
943 printf("<tr>\n");
<中略>
1653 printf("</tr>\n");
1654 printf("</table>\n");
1655 printf("</td>\n");
1656
1657 printf("</tr>\n");
1658
1659 printf("</table>\n");
1660
1661 printf("</p>\n");
1662
1663
1664 return;
1665 }
|
パトライトCGIのインストール
パトライトCGIのインストールには、patlight.cのmakeが必要だ。
そのために、Makefile(/usr/local/src/nagios-3.1.0/cgi/Makefile)を以下のように修正し、patlight.cをmake出来るようにしなければならない。
<42行目を以下のように修正>
patlight.cgiを追加する。
CGIS=avail.cgi cmd.cgi config.cgi extinfo.cgi history.cgi notifications.cgi outages.cgi showlog.cgi status.cgi statuswml.cgi summary.cgi tac.cgi patlight.cgi $(CGIEXTRAS)
|
<175行目に以下を追加>
patlight.cgi: patlight.c $(CGIDEPS) $(CDATADEPS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ patlight.c $(CGILIBS) $(CDATALIBS) $(LIBS)
|
Makefileの修正が終わったら、以下のようにmakeとインストールを行う。
# cd /usr/local/src/nagios-3.1.0/cgi
# make
# make install
|
サイドメニューにパトライトメニューを追加
次にサイドメニュー(/usr/local/nagios/share/side.php)にパトライトメニューを追加する。
<42行目に以下を追加>
<li><a href="Javascript:w=window.open('<?php echo $cfg["cgi_base_url"];?>/patlight.cgi','patlight','width=300,height=300,menubar=no,toolbar=no,resizable=no');w.focus();" >パトライト</a></li>
|
パトライト用アラート音パラメータの設定
最後に以下のパラメータを cgi.cfg に設定する。
host_unreachable_ptsound=hostdown.wav
host_down_ptsound=hostdown.wav
service_critical_ptsound=critical.wav
service_warning_ptsound=warning.wav
service_unknown_ptsound=warning.wav
normal_ptsound=noproblem.wav
|
ダウンロード
今回修正した、Makefile、cgiutils.c、および、今回作成したpatlight.cを公開する。
あくまでも、Jラボ版のNagios 3.1.0用なので利用する場合は必ずオリジナルのソースのバックアップを取得しておいて欲しい。
patlight-nagios-3.1.0.tar.gz
Categories: Nagios