1. 程式人生 > >學習zabbix(三)

學習zabbix(三)

前言:

學習zabbix之前,不得不瞭解的是SNMP協議

SNMP:簡單網路管理協議(Simple Network Protocol)

Snmp由兩部分組成,監控端和被監控端

監控模式:

主動模式:NMSagent採集資料,監控端到被監控端採集資料

被動模式:agentNMS報告資料,被監控端到監控端報告資料

這便意味著監控端和被監控端工作在不同套接字上

一旦被監控端發出特殊指令時,監控端會發送指令修改被監控端狀態


SNMP元件:

MIBmanagement  information  base(管理資訊庫)

監控端能夠向被監控傳送請求採集資料,被監控通過MIB

MIB定義監控到到被監控的雙方採集規範

SMIMIB表示機制

SNMP:協議本身,實現網路管理

 

NMS可發起的操作:

Get:獲取資料

GetNext:獲取更多引數

Set:設定

Trap:陷阱操作

 

SNMP基於UDP工作

NMS監聽埠:161

Agent監聽埠:162

 

SNMP是沒有資料儲存的定義,通常完成資料採集後人為的判斷資料是否存在問題!

 

這裡不得不提到cacti

nagios

Cacti類似於zabbox本身能夠通過指令碼,對每一個監控端通過snmp協議發起資料採集請求。資料採集完成後會儲存在cacti的資料庫當中,cacti是由php開發的,它能夠使用php強大的功能完成資料展示,這便意味著他能夠從資料庫中提取出資料,即時繪製出資料走勢圖。Cacti也可以讓使用者定義一個關注指標的閾值而後,一旦資料超出合理範圍也能完成報警操作!但是,他的報警能力較弱!

Cacti本身可以完成強大的資料採集展示,但是他的報警功能薄弱。比如:cacti監控一臺nginx服務,當nginx出現故障時,一般情況,會重啟nginx服務,當仍然不能正常工作時,監控會發起軟狀態和硬狀態的狀態探測切換,當第一次採集時發現異常,監控不會立即判斷為故障,當採集超過幾次後,還是異常,則為硬狀態,為了避免誤判它會多次取樣。而cacti

本身不具備報警功能,需要第三方外掛實現,並且報警的功能不能非常及時,尤其是對狀態轉換的服務類應用,報警能力略顯薄弱

 

Nagios:強大的報警機制

當關注的指標超過閾值後,從軟狀態轉換硬狀態後立即執行報警操作,支援多種多樣報警,如:簡訊閘道器發簡訊,郵件發郵件,MSN視窗發信息,電子鈴,閃光燈等等!由此可見Nagios報警是非常靈活的。

Nagios的各元件依賴關係!

但是nagios不太適合大型環境眾多指標同時監控,主機如果有100臺,它的工作還是客觀的,如果一旦達到數百臺,nagios效率低下,它不能完成分散式工作

在早些,cactinagios同時工作是很常見的!而Zabblx便可以實現cactinagios的功能

 

其他著名開源監控工具:zabbixzennosopennmscactinagiosicinga,ganglia

 

監控功能的實現:agentsshSNMP

SNMP協議版本在v1中是一款簡單協議,在v1中沒有認證功能,v2cNMS-à agent v1v2是基於UDP來實現,機制也相同!而v3v2,v1不同的是,v3實現認證加密和解密功能,但是在應用中v1使用是最多的。

 

MIB:所有的可以被監控被管理的物件的集合,定義物件的一系列屬性,每一個agetn端都有自己的MIB庫,mib庫中定義了很多指標來實現介面的資料互動

 

MIB檢視:MIB片段。SNMP是支援讀寫操作,對Mib庫操作進行讀寫操作都可實現。我們可以限定MIB庫的讀操作任何人都可以實現,寫操作再定義團體名。像這種能把mib庫中的子集,通過MIB某一個團體相關聯起來並定義其所能執行操作的機制就叫做MIB檢視,這裡可能需要檢視下MIB樹狀結構!

 

在眾多開源軟體監控工具中zabbix是專用的agent的監控工具

監控的主機由:linux,windows,freebsd…..

網路裝置:snmp,ssh(並非所有)

 

當了解了這些基礎後,在開始看zabbix概述

通常我們在監控時需要監控哪些?

1,軟體/裝置

裝置:軟體,路由器,交換機,i/o系統

軟體:作業系統本身(OS),網路,應用程式

2,偶發性故障

Down機,服務不可以,主機不可達

3,嚴重事件

主機效能資料

4,趨勢圖

時間序列資料

5

  

補充內容:

cacti資料儲存使用的是特殊資料庫(rrd ),而zabbix支援mysql,pgssql(關係型資料庫)

RRDround   robin  database,環裝資料庫,所以他不會持久儲存資料,一旦環走到盡頭,便覆蓋之前的資料從頭開始。cacti一旦資料初始化完成後是不會自動增長的,當然,如果定義n個數據指標,產生n個環裝資料,那也是不小的。而zabbix是插一條是一條,但是zabbix也是可以定義的,可以使用守護程序去清理資料。當然,也可以永久儲存,

 CactiRRD是一個開源元件,cacti使用snmp收集資料,收集完成使用rrd儲存資料,而rrd自己就有繪圖能力。所有cacti無非就是將rrd中所關注的資料繪成圖,在用php頁面展示出來而已。由此可以cacti是一個很強大的整合工具。

  

Zabbix分散式

Zabbix完全開源,企業級監控,支援目前主流作業系統,Zabbix可監控10萬裝置,20萬個指標(在對mysql切片優化後),可監控database,可監控web monitoring,web響應程式碼,響應時間等,可定義監控指標,可監控日誌,檔案內容等等!

 

中心zabbix不做任何操作,讓每一個代理收集監控各項指標,假設zabbix6000條指標,每個代理監控2000個指標,每個代理將監控資料儲存在代理監控主機資料庫。而後中心zabbix定期從代理取資料,當取完資料後,便可以刪除。代理zabbix只需儲存定期時間的資料,定期傳輸即可。主zabbix壓力必定減少!

 報警支援,簡訊,郵件,執行命令等!

 

Zabbix架構

Zabbix元件:

Zabbix-server:是c語言研發

監控端OSzabbix-agent,同樣c研發

Zabbix-databasemysql,pgsql(postgreSQL),oracledb2sqlite

Zabbix-web GUI:展示工具,設定工具

Zabbix-proxy:分散式專用元件,只應用於較大場景

 #############################################################################################

 

 

Zabbix程序描述:

Poller:此程序可能會被啟動多個,應對更多請求

Httppoller:監控web頁面專用poller

Discoverer:發現程序 佔用資源較大

Alerter:警報工作

Housekeeper:指明資料儲存時間,清理資料

Watchdog:監控主機程序是否關閉,並激活

Escalator:報警生成器

Timer:時間,計時器

Nodewatchel:監控節點

 

Pingerping操作監控節點是否線上的獨特機制

Db_config_syncer:同步配置,分散式場景

Db_data_syncer: 同步時間,分散式場景

  

安裝和部署:

在安裝zabbix之前,需要部署database,在部署lap平臺

Hardware Examples官方說明:

20臺機器:PII 350MHZ+256MB+sqlite

500臺:AMD Athion3200+2GB+mysql innodb

小於1000臺:Intel Core 6300 +4GB+RAUD 10 Mysql innodb or postgressql

小於10000臺:xeon 2xcpu+8GB +Fast RAID 10 Mysql innodb or postgressql

 Zabbix產生的資料主要由四部分組成:

1,  配置資料

2,  歷史資料:50bytes

3,  歷史趨勢資料 :128bytes

4,  事件資料:130bytes

Zabbix支援眾多資料庫,一般而言預留多少儲存資料,每一次的資料收集有 50位元組,歷史趨勢資料128位元組,事件資料130位元組,假設5分鐘收集一次,儲存時間,相乘計算出儲存資料的預留空間

 

1,安裝mysql

下載mariadb-5.5.44.tar.gz

[[email protected][node108] ~]# yum groupinstall "Development Tools" "Server Platform Development" –y

[[email protected][node108] ~]#yum   -y  install   cmake

[[email protected][node108] ~]# groupadd -r -g 306 mysql

[[email protected][node108] ~]# useradd -r -g 306 -u 306 mysql

[[email protected][node108] ~]# cd mariadb-5.5.44

[[email protected][node108] ~]# tar xf mariadb-5.5.44.tar.gz

[[email protected][node108] ~]# cd mariadb-5.5.44

[[email protected][node108] ~]# cmake  

-DCMAKE_INSTALL_PREFIX=/usr/local/Nmariadb-5.5.44

-DMYSQL_DATADIR=/mydata/data

-DSYSCONFDIR=/etc

-DWITH_INNOBASE_STORAGE_ENGINE=1

-DWITH_ARCHIVE_STORAGE_ENGINE=1

-DWITH_BLACKHOLE_STORAGE_ENGINE=1

-DWITH_READLINE=1

-DWITH_SSL=system

-DWITH_ZLIB=system

-DWITH_LIBWRAP=0

-DMYSQL_UNIX_ADDR=/tmp/mysql.sock

-DDEFAULT_CHARSET=utf8

-DDEFAULT_COLLATION=utf8_general_ci

[[email protected][node108] ~]# make

[[email protected][node108] ~]# make install

[[email protected][node108] ~]#mkdir  /mydata

[[email protected][node108] mariadb-5.5.44]# cd /usr/local/ Nmariadb-5.5.44/

[[email protected][node108] Nmariadb-5.5.44]# scripts/mysql_install_db --user=mysql --datadir=/mydata

[[email protected][node108] Nmariadb-5.5.44]# cp support-files/my-large.cnf /etc/mysql/my.cnf

[[email protected][node108] Nmariadb-5.5.44]# vim /etc/mysql/my.cnf

[mysqld]裡面新增如下

datadir = /mydata/data   安裝目錄指定

innodb_file_per_table = NO

skip_name_resolve = NO     跳過名稱解析的

[[email protected][node108] Nmariadb-5.5.44]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld

[[email protected][node108] Nmariadb-5.5.44]# chmod +x /etc/rc.d/init.d/mysqld

[[email protected][node108] Nmariadb-5.5.44]# chkconfig --add mysqld

[[email protected][node108] Nmariadb-5.5.44]# chkconfig mysqld on        

[[email protected][node108] Nmariadb-5.5.44]# service mysqld start

Starting MySQL.......                                      [  OK  ]

[[email protected][node108] Nmariadb-5.5.44]# ss -tlp |grep :mysql

LISTEN     0      50                      *:mysql                    *:*        users:(("mysqld",43871,14))

[[email protected][node108] Nmariadb-5.5.44]#

root使用者新增密碼,並且刪除使用者

[[email protected] mysql]# /usr/local/mysql/bin/mysql_secure_installation

[[email protected][node108] profile.d]# vim /etc/profile.d/mysqld.sh

export PATH=/usr/local/Nmariadb-5.5.44/bin/:$PATH

[[email protected][node108] profile.d]# . /etc/profile.d/mysqld.sh

[[email protected][node108] profile.d]# mysql

Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MariaDB connection id is 3

Server version: 5.5.44-MariaDB-log Source distribution

 

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

建立資料庫zabbix

MariaDB [(none)]> CREATE DATABASE zabbix CHARACTER SET utf8;

Query OK, 1 row affected (0.00 sec)

建立zbuser使用者,授權此用使用者可以通過172.16.x.x訪問zabbix庫,密碼zbuser

請注意:這裡由於是作用在一臺主機,所有授權是localhost,如果不是同一個主機授權的可能是主機名

 

MariaDB [(none)]> GRANT ALL on zabbix.* TO 'zbuser'@'172.16.%.%' IDENTIFIED BY 'zbuser';

Query OK, 0 rows affected (0.01 sec)

 

MariaDB [(none)]> GRANT ALL on zabbix.* TO 'zbuser'@'localhost' IDENTIFIED BY 'zbuser';

Query OK, 0 rows affected (0.00 sec)

 

MariaDB [(none)]> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.00 sec)

 

MariaDB [(none)]> \q

Bye

[[email protected][node108] ~]#

使用本機測試下授權

[[email protected][node108] ~]# mysql -uzbuser -h172.16.249.22 -p

Enter password:

Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MariaDB connection id is 5

Server version: 5.5.44-MariaDB-log Source distribution

 

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

MariaDB [(none)]>\q

Bye

 

2,下載zabbix安裝

指定官方yum源,www.zabbix.com

Wget  http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm

下載zabbix-release-2.4-1.e16.noarch.rpm包,就會自動建立本地yum

如果不裝把連結也到repo中即可

 

編譯安裝serveragent,並支援將資料放入mysql資料中,可使用類似如下配置命令:

./configure  --enable-server  ---enable-agent  --with-mysql   --enable-ipv6   --with-net-snmp   --with-libcurl   --with-ssh2

如果僅安裝server,並支援將資料庫放入mysql資料庫中,可使用類似如下配置命令:

./configure  --enable-server  --with-mysql    --with-net-snmp     --with-libcurl

如果僅安裝proxy,並支援將資料放入mysql資料庫中,可使用類似如下配置命令:

./configure   --profix=/usr    --enable-proxy   --with-net-snmp   --with-mysql     --with-ssh2

如果僅安裝agent,可使用類似如下配置命令:

./configure  --enable-agent

而後編譯安裝zabbix即可:

#make

#make install

 

 

 

服務端安裝:

[[email protected][node108] zabbix-2.4.5]yum install zabbix-server-2.4.5-1.el6.x86_64.rpm zabbix-server-mysql-2.4.5-1.el6.x86_64.rpm  zabbix-get-2.4.5-1.el6.x86_64.rpm zabbix-2.4.5-1.el6.x86_64.rpm zabbix-web-2.4.5-1.el6.noarch.rpm zabbix-web-mysql-2.4.5-1.el6.noarch.rpm zabbix-agent-2.4.5-1.el6.x86_64.rpm zabbix-sender-2.4.5-1.el6.x86_64.rpm

 

 

/etc/httpd/conf.d目錄下由zabbix.conf檔案,所以每次配置完成後必須過載httpd

啟動zabbix之前需要匯入資料到mysql

[[email protected][node108] zabbix]# cd  /usr/share/doc/zabbix-server-mysql-2.4.5/ create/

[[email protected][node108] create]#ls

data.sql  images.sql  schema.sql

匯入順序從右到左

[[email protected] create]# mysql zabbix -uroot < schema.sql

[[email protected] create]# mysql zabbix -uroot < images.sql

[[email protected] create]# mysql zabbix -uroot < data.sql

 

 

配置檔案:

LogFileSize=0  日誌滾動選項,0為不滾動

預設為Debuglevel=3級別

DBHost=localhost 指定資料庫

DBUser=zbuser        使用者

DBPassword=zbuser         密碼

DBSocket=/tmp/mysql.sock sock位置

# StartPollers=5  程序啟動5

# StartDiscoverers=1啟動發現

# StartTimers=1 計時器程序

# MaxHousekeeperDelete=500最多刪除個數

# StartDBSyncers=4報警

# StartDBSyncers=4同步程序

# HistoryCacheSize=8M歷史資料快取

# TrendCacheSize=4M歷史文字快取

AlertScriptsPath=/usr/lib/zabbix/alertscripts 報警指令碼存放路徑

ExternalScripts=/usr/lib/zabbix/externalscripts外部指令碼存放路徑

# SSHKeyLocation= ssh監控

其他是proxy

[[email protected] zabbix]# service zabbix-server start

Starting Zabbix server:                                    [  OK  ]

[[email protected] zabbix]# ss -tnl |grep :10051

LISTEN     0      128                      :::10051                   :::*    

LISTEN     0      128                       *:10051                    *:*    

[[email protected] zabbix]#ss  -tnlp可以看到zabbix啟動了很多程序

在瀏覽器中輸入ip地址/zabbix即可看到安裝介面



在下一步之前需要修改時區

[[email protected] zabbix]# vim /etc/php.ini

date.timezone = Asia/Shanghai

Reloading httpd:

[[email protected] zabbix]# service httpd restart

Stopping httpd:                                            [  OK  ]

Starting httpd:                                             [  OK  ]

[[email protected] zabbix]#



如果這裡報錯如下

Error connecting to database: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock

su mysql使用者下

[[email protected] mysql]# su mysql

bash-4.1$ ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock

 

而後下一步



預設管理員賬戶密碼:admin   zabbix

zabbix監控自己,包已經安裝過了

[[email protected] mysql]# vim /etc/zabbix/zabbix_agentd.conf

授權IP地址

Server=127.0.0.1,172.16.249.22

主動傳送server   ip(如果監控的是自己,127.0.0.1是不可以去掉的)

ServerActive=127.0.0.1,172.16.249.22

自動聯絡,推送資料,這裡的hostname必須全域性唯一

Hostname=Zabbix server

[[email protected] mysql]# service zabbix-agent start

Starting Zabbix agent:                                     [  OK  ]

[[email protected] mysql]#

 

 

 

新增一臺主機監控

安裝以下包

[[email protected] zabbix-2.4.5]# yum install zabbix-2.4.5-1.el6.x86_64.rpm zabbix-agent-2.4.5-1.el6.x86_64.rpm zabbix-sender-2.4.5-1.el6.x86_64.rpm

修改配置檔案

[[email protected] zabbix-2.4.5]# cp /etc/zabbix/zabbix_agentd.conf{,.bak}

[[email protected] zabbix-2.4.5]# vim /etc/zabbix/zabbix_agentd.conf

ServerActive=172.16.249.22  指向zabbix監控主機

Hostname=PC1                           設定主機名

Server=172.16.249.22              指向zabbix監控主機

[[email protected] zabbix-2.4.5]# service zabbix-agent start

Starting Zabbix agent:                                     [  OK  ]

[[email protected] zabbix-2.4.5]#

 

PS:如果這裡有iptables,這裡需要放行zabbix

web_gui介面新增主機

Templates:模板

Macros:主機巨集,一次修改多次有效的喲

Host inventory:資產清單

  ###############################################################################################

zabbbx-agent
安裝agent

yum -y install zabbix-agent zabbix
vim /etc/zabbix/zabbix_agentd.conf 
Server=10.0.0.120

新增UserParameter斷

vim /etc/zabbix/zabbix_agentd.conf
UserParameter=mysql_alive, mysqladmin ping|grep -c alive

可使用zabbix_get -s 10.0.0.53 -k mysql_alive檢視
web頁面建立主機組

新增主機到主機組

建立mysqlitems

新增觸發器

graphs出圖

預覽

##############################################################################################################3

[[email protected] ~]# /etc/init.d/postfix start
[[email protected] ~]# vim /etc/mail.rc 
#######set mail
set [email protected] smtp=smtp.163.com
set smtp-auth-user=usertzc smtp-auth-password=password smtp-auth=login
[[email protected] ~]# mail -s linuxea [email protected] < /etc/rc.local 

測試指令碼

[[email protected] alertscripts]# vim /usr/lib/zabbix/alertscripts/mail.sh
#!/bin/sh
MAIL_TITLE=$2
MAIL_CON=$3
echo "$MAIL_CON" | /bin/mail -s "$MAIL_TITLE" $1

建立使用者,管理---使用者---建立使用者


媒介

而後在動作中可執行命令和傳送郵件,選擇郵件即可(演示效果)

模擬一次mysql掛掉

###################################################################################################33

1.在client的httpd.conf中新增如下

sudo vim /alidata/server/httpd/conf/httpd.conf
<Location /server-status>
    SetHandler server-status
    Allow from 127.0.0.1
    Order deny,allow
    Deny from all
</Location>
ExtendedStatus On

如果你有rewrite規則,則需要在.htaccess中加上一條,如下:

RewriteCond %{REQUEST_URI} !server-status需要寫在index.php之前
sudo vim /alidata/www/jds.jince.com/.htaccess
# ThinkPHP Rewrite規則
<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_URI} !server-status
   RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

#禁止顯示目錄列表
Options -Indexes
2,重載入apache配置
Check uptime並重啟apache

sudo /etc/init.d/httpd configtest 無錯誤後
sudo /etc/init.d/httpd graceful

可以使用curl 127.0.0.1/server-status測試
3,在zabbix-agent上建立目錄和指令碼

sudo mkdir /etc/zabbix/scripts
sudo vim /etc/zabbix/scripts/check_apache.sh

check_apache.sh放入client的/etc/zabbix/scripts

  1 #! /bin/bash
  2 #
  3 # Name: zapache
  4 #
  5 # Checks Apache activity.
  6 #
  7 # Author: Alejandro Michavila
  8 # Modified for Scoreboard Values: Murat Koc, [email protected]
  9 # Modified for using also as external script: Murat Koc, [email protected]
 10 # Modified for outputting usage or ZBX_NOTSUPPORTED: Alejandro Michavila
 11 # Modified to do cacheing for performance, [email protected]
 12 #
 13 # Version: 1.5
 14 #
 15  
 16 zapachever="1.5"
 17 rval=0
 18 value=""
 19 cache_seconds="30"
 20 [ "$TMPDIR" ] || TMPDIR=/tmp
 21 function usage()
 22 {
 23     echo "zapache version: $zapachever"
 24     echo "usage:"
 25     echo "  $0 [<url>] TotalAccesses                 - Check total accesses."
 26     echo "  $0 [<url>] TotalKBytes                   - Check total KBytes."
 27     echo "  $0 [<url>] CPULoad                       - Check CPU load."
 28     echo "  $0 [<url>] Uptime                        - Check uptime."
 29     echo "  $0 [<url>] ReqPerSec                     - Check requests per second."
 30     echo "  $0 [<url>] BytesPerSec                   - Check Bytes per second."
 31     echo "  $0 [<url>] BytesPerReq                   - Check Bytes per request."
 32     echo "  $0 [<url>] BusyWorkers                   - Check busy workers."
 33     echo "  $0 [<url>] IdleWorkers                   - Check idle workers."
 34     echo "  $0 [<url>] version                       - Version of this script."
 35     echo "  $0 [<url>] ping                          - Check if Apache is up."
 36     echo "  $0 [<url>] WaitingForConnection          - Check Waiting for Connection processess."
 37     echo "  $0 [<url>] StartingUp                    - Check Starting Up processess."
 38     echo "  $0 [<url>] ReadingRequest                - Check Reading Request processess."
 39     echo "  $0 [<url>] SendingReply                  - Check Sending Reply processess."
 40     echo "  $0 [<url>] KeepAlive                     - Check KeepAlive Processess."
 41     echo "  $0 [<url>] DNSLookup                     - Check DNSLookup Processess."
 42     echo "  $0 [<url>] ClosingConnection             - Check Closing Connection Processess."
 43     echo "  $0 [<url>] Logging                       - Check Logging Processess."
 44     echo "  $0 [<url>] GracefullyFinishing           - Check Gracefully Finishing Processess."
 45     echo "  $0 [<url>] IdleCleanupOfWorker           - Check Idle Cleanup of Worker Processess."
 46     echo "  $0 [<url>] OpenSlotWithNoCurrentProcess  - Check Open Slots with No Current Process."
 47 }
 48 
 49 ########
 50 # Main #
 51 ########
 52 
 53 if [[ $# ==  1 ]];then
 54     #Agent Mode
 55     STATUS_URL="http://localhost/server-status?auto"
 56     CASE_VALUE="$1"
 57 elif [[ $# == 2 ]];then
 58     #External Script Mode
 59     STATUS_URL="$1"
 60     case "$STATUS_URL" in
 61         http://*|https://*) ;;
 62         *) STATUS_URL="http://$STATUS_URL/server-status?auto";;
 63     esac
 64     CASE_VALUE="$2"
 65 else
 66     #No Parameter
 67     usage
 68     exit 0
 69 fi
 70 
 71 case "$CASE_VALUE" in
 72 'version')
 73     echo "$zapachever"
 74     exit 0;;
 75 esac
 76 
 77 cache_prefix="zapache-${STATUS_URL//[^a-zA-Z0-9_-]/_}"
 78 cache="$TMPDIR/$cache_prefix.cache"
 79 cache_timestamp_check="$TMPDIR/$cache_prefix.ts"
 80 # This assumes touch from coreutils
 81 touch -d "@$((`date +%s` - ($cache_seconds - 1)))" "$cache_timestamp_check"
 82 
 83 if [ "$cache" -ot "$cache_timestamp_check" ]; then
 84     curl="`which curl`"
 85     if [ "$curl" ]; then
 86         fetch_url_cmd="$curl --insecure --silent --location"
 87     else
 88         wget="`which wget`"
 89         if [ "$wget" ]; then
 90             fetch_url_cmd="$wget --no-check-certificate --quiet -O -"
 91         else
 92             echo "ZBX_NOTSUPPORTED"
 93             exit 1
 94         fi
 95     fi
 96 
 97     $fetch_url_cmd "$STATUS_URL" > "$cache"
 98     rval=$?
 99     if [ $rval != 0 ]; then
100         echo "ZBX_NOTSUPPORTED"
101         exit 1
102     fi
103 fi
104 
105 case "$CASE_VALUE" in
106 'ping')
107     if [ ! -s "$cache" -o "$cache" -ot "$cache_timestamp_check" ]; then
108         echo "0"
109     else
110         echo "1"
111     fi
112     exit 0;;
113 esac
114 
115 if ! [ -s "$cache" ]; then
116     echo "ZBX_NOTSUPPORTED"
117     exit 1
118 fi
119  
120 case "$CASE_VALUE" in
121 'TotalAccesses')
122     value="`awk '/^Total Accesses:/ {print $3}' < \"$cache\"`"
123     rval=$?;;
124 'TotalKBytes')
125     value="`awk '/^Total kBytes:/ {print $3}' < \"$cache\"`"
126     rval=$?;;
127 'CPULoad')
128     value="`awk '/^CPULoad:/ {print $2}' < \"$cache\"`"
129     rval=$?;;
130 'Uptime')
131     value="`awk '/^Uptime:/ {print $2}' < \"$cache\"`"
132     rval=$?;;
133 'ReqPerSec')
134     value="`awk '/^ReqPerSec:/ {print $2}' < \"$cache\"`"
135     rval=$?;;
136 'BytesPerSec')
137     value="`awk '/^BytesPerSec:/ {print $2}' < \"$cache\"`"
138     rval=$?;;
139 'BytesPerReq')
140     value="`awk '/^BytesPerReq:/ {print $2}' < \"$cache\"`"
141     rval=$?;;
142 'BusyWorkers')
143     value="`awk '/^BusyWorkers:/ {print $2}' < \"$cache\"`"
144     rval=$?;;
145 'IdleWorkers')
146     value="`awk '/^IdleWorkers:/ {print $2}' < \"$cache\"`"
147     rval=$?;;
148 'WaitingForConnection')
149     value="`awk '/^Scoreboard:/ {print $2}' < \"$cache\" | awk 'BEGIN { FS = "_" }; { print NF-1 }'`"
150     rval=$?;;
151 'StartingUp')
152     value="`awk '/^Scoreboard:/ {print $2}' < \"$cache\" | awk 'BEGIN { FS = "S" }; { print NF-1 }'`"
153     rval=$?;;
154 'ReadingRequest')
155     value="`awk '/^Scoreboard:/ {print $2}' < \"$cache\" | awk 'BEGIN { FS = "R" }; { print NF-1 }'`"
156     rval=$?;;
157 'SendingReply')
158     value="`awk '/^Scoreboard:/ {print $2}' < \"$cache\" | awk 'BEGIN { FS = "W" }; { print NF-1 }'`"
159     rval=$?;;
160 'KeepAlive')
161     value="`awk '/^Scoreboard:/ {print $2}' < \"$cache\" | awk 'BEGIN { FS = "K" }; { print NF-1 }'`"
162     rval=$?;;
163 'DNSLookup')
164     value="`awk '/^Scoreboard:/ {print $2}' < \"$cache\" | awk 'BEGIN { FS = "D" }; { print NF-1 }'`"
165     rval=$?;;
166 'ClosingConnection')
167     value="`awk '/^Scoreboard:/ {print $2}' < \"$cache\" | awk 'BEGIN { FS = "C" }; { print NF-1 }'`"
168     rval=$?;;
169 'Logging')
170     value="`awk '/^Scoreboard:/ {print $2}' < \"$cache\" | awk 'BEGIN { FS = "L" }; { print NF-1 }'`"
171     rval=$?;;
172 'GracefullyFinishing')
173     value="`awk '/^Scoreboard:/ {print $2}' < \"$cache\" | awk 'BEGIN { FS = "G" }; { print NF-1 }'`"
174     rval=$?;;
175 'IdleCleanupOfWorker')
176     value="`awk '/^Scoreboard:/ {print $2}' < \"$cache\" | awk 'BEGIN { FS = "I" }; { print NF-1 }'`"
177     rval=$?;;
178 'OpenSlotWithNoCurrentProcess')
179     value="`awk '/^Scoreboard:/ {print $2}' < \"$cache\" | awk 'BEGIN { FS = "." }; { print NF-1 }'`"
180     rval=$?;;
181 *)
182     usage
183     exit 1;;
184 esac
185 
186 if [ "$rval" -eq 0 -a -z "$value" ]; then
187     rval=1
188 fi
189  
190 if [ "