LoginSignup
3
3

More than 5 years have passed since last update.

zabbixのローダブルモジュールで、ロード元のプログラムを調べる

Last updated at Posted at 2014-04-28

2015年10月18日追記

2015年10月15日に公開されたzabbix3.0.0alpha3から、プログラムの種類の定義がZBX_DAEMON_TYPE_XXXからZBX_PROGRAM_TYPE_XXXに、プログラムの種類のグローバル変数がdaemon_typeからprogram_typeに変更されました。
zabbix3.0.0alpha3以降ではその部分を適宜変更する必要があります。

はじめに

zabbix2.2で追加になった新機能「ローダブルモジュール」ですが、server/agent/proxyのどのプログラムからロードされたのかをモジュール側から調べることが出来そうだったのでやってみました。

やってみた

zabbix2.2.xのソースに含まれるサンプル"dummy.c"との差分が下記の通りです。
試しに、エージェント以外のプロセスにロードされた時にはモジュールの初期化に失敗するようにしてみました。
zabbix-agentでのみ利用できるモジュール、という訳です。

# diff -c dummy/dummy.c dummy-agent/dummy-agent.c
*** dummy/dummy.c       2014-04-07 18:12:32.000000000 +0900
--- dummy-agent/dummy-agent.c   2014-04-28 19:07:29.877924653 +0900
***************
*** 19,24 ****
--- 19,28 ----

  #include "sysinc.h"
  #include "module.h"
+ #include "log.h"
+ #include "common.h"
+
+ extern unsigned char daemon_type ;

  /* the variable keeps timeout setting for item processing */
  static int    item_timeout = 0;
***************
*** 173,182 ****
   ******************************************************************************/
  int   zbx_module_init()
  {
        /* initialization for dummy.random */
        srand(time(NULL));

!       return ZBX_MODULE_OK;
  }

  /******************************************************************************
--- 177,206 ----
   ******************************************************************************/
  int   zbx_module_init()
  {
+       int ret = ZBX_MODULE_FAIL;
+
        /* initialization for dummy.random */
        srand(time(NULL));

!       /* determine daemon process */
!       switch (daemon_type){
!               case ZBX_DAEMON_TYPE_SERVER:
!                       zabbix_log(LOG_LEVEL_WARNING, "module loaded by server process. [%d]", daemon_type);
!                       break;
!               case ZBX_DAEMON_TYPE_PROXY_ACTIVE:
!               case ZBX_DAEMON_TYPE_PROXY_PASSIVE:
!               case ZBX_DAEMON_TYPE_PROXY:
!                       zabbix_log(LOG_LEVEL_WARNING, "module loaded by proxy process. [%d]", daemon_type);
!                       break;
!               case ZBX_DAEMON_TYPE_AGENT:
!                       zabbix_log(LOG_LEVEL_WARNING, "module loaded by agent process. [%d]", daemon_type);
!                       ret = ZBX_MODULE_OK;
!                       break;
!               default:
!                       zabbix_log(LOG_LEVEL_WARNING, "unknown daemon_type [%d]", daemon_type );
!       }
!
!       return ret;
  }

  /******************************************************************************

やったこと

  • log.hとcommon.hをインクルード
    log.hはログ出力のため、common.hはZBX_DAEMON_TYPE_HOGEという定数の定義を取り込むため。

  • サーバやエージェントなどのプロセス本体で定義されたグローバル変数"daemon_type"をextern
    この変数からロード元のプログラムを調べます。

  • プログラム起動時に呼び出される初期化関数"zbx_module_init()"の中に分岐とログ出力を追加
    ログ出力がわかりやすくなるように、ログレベルをわざとWARNにしています。
    "daemon_type"がZBX_DAEMON_TYPE_AGENT以外の場合にはモジュールの初期化に失敗(ZBX_MODULE_FAIL)を返します。

実際にロードしてみる

コンパイルの仕方とかモジュールをロードする設定は省きます。

zabbix-agentからロード

# tail /var/log/zabbix/zabbix_agentd.log
 19243:20140428:191154.189 Zabbix Agent stopped. Zabbix 2.2.3 (revision 44105).
 19585:20140428:191154.336 Starting Zabbix Agent [fishbone]. Zabbix 2.2.3 (revision 44105).
 19585:20140428:191154.336 using configuration file: /etc/zabbix/zabbix_agentd.conf
 19585:20140428:191154.336 module loaded by agent process. [8]
 19585:20140428:191154.336 loaded modules: dummy-agent.so
 19587:20140428:191154.338 agent #0 started [collector]
 19588:20140428:191154.338 agent #1 started [listener #1]
 19589:20140428:191154.338 agent #2 started [listener #2]
 19590:20140428:191154.338 agent #3 started [listener #3]
 19591:20140428:191154.339 agent #4 started [active checks #1]

それっぽく動いています。

zabbix-serverからロード

# tail /var/log/zabbix/zabbix_server.log
 19744:20140428:191300.368 Jabber notifications:      YES
 19744:20140428:191300.368 Ez Texting notifications:  YES
 19744:20140428:191300.368 ODBC:                      YES
 19744:20140428:191300.369 SSH2 support:              YES
 19744:20140428:191300.369 IPv6 support:              YES
 19744:20140428:191300.369 ******************************
 19744:20140428:191300.369 using configuration file: /etc/zabbix/zabbix_server.conf
 19744:20140428:191300.369 module loaded by server process. [1]
 19744:20140428:191300.369 cannot initialize module "dummy-agent.so"
 19744:20140428:191300.369 loading modules failed, exiting...

目論見通りにモジュールの初期化に失敗、サーバは起動しません。

zabbix-proxyからロード

手元にzabbix-proxyが動作している環境がないため試していません。

最後に

  • 上記の内容はCentOS6.5にzabbixオフィシャルパッケージをインストールした環境でビルド・動作確認しています。
  • 起動に失敗しても
# service zabbix-server restart
Shutting down Zabbix server:                               [  OK  ]
Starting Zabbix server:                                    [  OK  ]

とか表示するzabbix-serverって一体なんなんでしょう。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3