Nagiosは、WarningやCriticalをアラートを音で知らせる機能がある。
この機能を使っている人がどのくらいいるのか知らないが、実はこれ結構うるさくてしかたがないと思っている。
アラートの内容を確認しようと思って、色々画面遷移するのだが、新たな画面を開くたびにビィービィー鳴るからだ。
このアラート音機能を集約できたら、結構使い勝手がよくなると思うのだが、どうだろうか。
例えば、小さなポップアップ画面にパトライトのアニメGIFが表示され、アラートがある場合にアラート音が鳴り、このポップアップ画面をクリックするとアラート音が停止するというような機能を追加したら、新たな画面を開くたびにビィービィー鳴ることもなく使い勝手がよくならないだろうか。
実はこの機能は、パトロールクラリスに実装されているものだ。
そういうことで今回は、Nagiosにパトライト機能を追加してみたいと思う。
Nagiosのバージョンは、3.1.0 だ。
サーバOSは、CentOS 5.3 である。
 



 

仕様

今回追加するパトライト機能の仕様は以下の通りだ。

①サイドメニューにパトライトメニューを追加。(図1)
 今回は「総合監視状態」の下に追加する。
 
図1:サイドメニュー
図1:サイドメニュー

 
②サイドメニューのパトライトメニューをクリックすると、パトライトウィンドウを表示する。(図2※アラート音に注意)
 図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


Leave a Reply