|
#!/bin/bash
PROGNAME=$(basename $0)
##### Helper functions
function usage
{
echo "This script adds WEB checks from a file to a zabbix host by inputting the urls directly into the database."
echo "USE WITH CARE!!"
echo ""
echo "usage: ${PROGNAME}"
echo ""
echo "MySQL connection options:"
echo "-u | --dbusermysql username to connect to zabbix database (Required)"
echo "-p | --dbpassmysql password to connect to zabbix database (Required)"
echo "-H | --dbhosthostname of the mysql server (Default: localhost)"
echo "-D | --dbnamedatabasename of the zabbix mysql database (Default: zabbix)"
echo ""
echo "Webcheck options:"
echo "-t | --timeouttimeout in seconds before a http request times out (Default: 15)"
echo "-d | --delaynumber of seconds between two WEB checks (Default: 60)"
echo "-i | --historynumber of days to keep all values (Default: 90)"
echo "-t | --trendsnumber of days to keep trends (Default: 360)"
echo ""
echo "-o | --hostidthe zabbix hostid of the host these WEB checks will be added to (Required)"
echo "-A | --appnamezabbix application the WEB checks will be added to (Required)"
echo "-a | --agent user agent the WEB check will be done as (Default: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)')"
echo ""
echo "-f | --urlfilefile with urls to monitor. One url per line (Required)"
echo ""
echo "Help:"
echo "-h | --helpthis message"
}
function error_exit
{
#----------------------------------------------------------------
#Function for exit due to fatal program error
#Accepts 1 argument:
#string containing descriptive error message
# Example call of the error_exit function. Note the inclusion
# of the LINENO environment variable. It contains the current
# line number.
#
#error_exit "$LINENO: An error has occurred."
#
#----------------------------------------------------------------
echo "${PROGNAME}: ${1:-"Unknown Error"}" 1>&2
exit 1
}
function log
{
echo "${PROGNAME}: $1"
}
##### Parameter processing
# 定义你zabbix主机的hostid,这个可以在数据库hosts字段里查看,我这里直接传入$1变量,让他自动查看hostid.
#HOSTID=
HOSTID=`/usr/local/mysql/bin/mysql -u root -p'www.netbank.cn' -D zabbix --batch --skip-column-name -e "SELECT hostid from hosts where ip ='$1';"`
# 定义添加在哪个程序里查看.
APPLNAME=Services
USERAGENT='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)'
##定义你监控的路径比如:http://abc.test.com/test.index
HOSTFILE=/root/test
# timeout in seconds before a http request times out
TIMEOUT=33
# number of seconds between two checks
DELAY=60
# number of days to keep all values
HISTORY=90
# number of days to keep trends
TRENDS=360
MYSQLUSER=
MYSQLPASS=
MYSQLHOST=
MYSQLDB=
while [ "$1" != "" ]; do
case $1 in
-u | --dbuser ) shift
MYSQLUSER=$1
;;
-p | --dbpass ) shift
MYSQLPASS=$1
;;
-H | --dbhost ) shift
MYSQLHOST=$1
;;
-D | --dbname ) shift
MYSQLDB=$1
;;
-t | --timeout ) shift
TIMEOUT=$1
;;
-d | --delay ) shift
DELAY=$1
;;
-i | --history ) shift
HISTORY=$1
;;
-t | --trends ) shift
TRENDS=$1
;;
-o | --hostid ) shift
HOSTID=$1
;;
-f | --urlfile ) shift
HOSTFILE=$1
;;
-a | --agent ) shift
USERAGENT=$1
;;
-A | --appname ) shift
APPLNAME=$1
;;
-h | --help ) usage
exit
# ;;
# * ) usage
# exit 1
esac
shift
done
if [ -z "$MYSQLUSER" ]
then
error_exit "$LINENO: Required parameter not found: -u | --dbuser. See -h | --help for more information"
fi
if [ -z "$MYSQLPASS" ]
then
error_exit "$LINENO: Required parameter not found: -p | --dbpass. See -h | --help for more information"
fi
if [ -z "$HOSTID" ]
then
error_exit "$LINENO: Required parameter not found: -o | --hostid. See -h | --help for more information"
fi
if [ -z "$HOSTFILE" ]
then
error_exit "$LINENO: Required parameter not found: -f | --urlfile. See -h | --help for more information"
fi
if [ -z "$APPLNAME" ]
then
error_exit "$LINENO: Required parameter not found: -A | --appname. See -h | --help for more information"
fi
##### Functions
# Executes an sql command, call like so:
# mysql_cmd "select * from zabbix.items where hostid = ${HOSTID}"
mysql_cmd () {
if [ -z "$1" ] # Is parameter #1 zero length?
then
error_exit "-Parameter #1 is zero length in mysql_cmd.-\n" # Or no parameter passed.
fi
# --skip-columna-names for parseable output assumes we don't use select *
# so you already know which column names are in which order
# --batch output results in record-per-line tab-delimited way
#log "mysql -u${MYSQLUSER} -p${MYSQLPASS} -D${MYSQLDB} -h${MYSQLHOST} --batch --skip-column-name -e\"$1\""
result=`mysql -u${MYSQLUSER} -p${MYSQLPASS} -D${MYSQLDB} -h${MYSQLHOST} --batch --skip-column-name -e"$1"`
if [ "$?" = "0" ]; then
# in bash you cannot return a value so we echo it, the calling function can
# then just capture that using `` or $()
echo $result
else
error_exit "MySQL command failed: $1 (-u${MYSQLUSER} -p${MYSQLPASS} -D${MYSQLDB} -h${MYSQLHOST})"
fi
}
zabbix_get_next_id () {
table="$1"
field="$2"
# Get the current id and the next id and compare them. If the difference is 1, use it.
curr_id=`mysql_cmd "SELECT nextid FROM ids WHERE table_name='${table}' AND field_name='${field}';"`
next_id=`mysql_cmd "UPDATE ids SET nextid=nextid+1 WHERE nodeid=0 AND table_name='${table}' AND field_name='${field}';SELECT nextid FROM ids WHERE table_name='${table}' AND field_name='${field}';"`
if [ `expr $curr_id - $next_id` -eq -1 ] ;
then
echo $next_id
return 1
else
return 0
fi
}
##### Main
log "== Starting run"
log "== Starting run"
log "== Starting run"
# Add an application if it doesn't exist and get it's appid returned
app_id=`mysql_cmd "select applicationid from applications where hostid = '${HOSTID}' and name = '${APPLNAME}'"`
if [ -z "$app_id" ]
then
app_id=`zabbix_get_next_id 'applications' 'applicationid'`
mysql_cmd "insert into applications(applicationid, hostid, name) values (${app_id}, ${HOSTID}, '${APPLNAME}')"
fi
# Loop through all sites to be added
while read line; do
log "== Starting ${line}"
test_name=`echo ${line} |cut -f 3 -d/ |awk -F: '{print $1}'`
step_name=`echo ${line} |cut -f 3 -d/ |awk -F: '{print $1}'`
# 这些打#号的不用管,只是为了让我们了解,构造一个监控,需要些什么字段。
# create a {httptest}
# mysql> select * from httptest\G
# *************************** 1. row ***************************
# httptestid: 1
# name: blah scenario name
# applicationid: 364
# lastcheck: 0
# nextcheck: 0
# curstate: 3
# curstep: 0
# lastfailedstep: 0
# delay: 60
# status: 0
# macros:
# agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
# time: 0.0000
# error:
# authentication: 0
# http_user:
# http_password:
# 1 row in set (0.00 sec)
httptest_id=`zabbix_get_next_id 'httptest' 'httptestid'`
mysql_cmd "insert into httptest(httptestid, name, applicationid, curstate, delay, status, agent, authentication) values (${httptest_id}, '${test_name}', ${app_id}, 3, 60, 0, '${USERAGENT}', 0)"
# create a {httpstep}
# mysql> select * from httpstep\G
# *************************** 1. row ***************************
# httpstepid: 1
# httptestid: 1
# name: scenario step 1
# no: 1
# url: http://localhost:8888
# timeout: 15
# posts:
# required:
# status_codes:
# 1 row in set (0.00 sec)
httpstep_id=`zabbix_get_next_id 'httpstep' 'httpstepid'`
mysql_cmd "insert into httpstep(httpstepid, httptestid, name, no, url, timeout, posts, required, status_codes) values (${httpstep_id}, ${httptest_id}, '${step_name}', 1, '${line}', ${TIMEOUT}, '', '', '')"
# create {items} for {httpstep}
# mysql> select * from items where itemid in (23731,23732,23733)\G
# *************************** 1. row ***************************
# itemid: 23731
# type: 9
# snmp_community:
# snmp_oid:
# snmp_port: 161
# hostid: 10092
# description: Download speed for step '$2' of scenario '$1'
# key_: web.test.in[blah scenario name,scenario step 1,bps]
# delay: 60
# history: 30
# trends: 90
# lastvalue: NULL
# lastclock: NULL
# prevvalue: NULL
# status: 0
# value_type: 0
# trapper_hosts: localhost
# units: Bps
# multiplier: 0
# delta: 0
# prevorgvalue: NULL
# snmpv3_securityname:
# snmpv3_securitylevel: 0
# snmpv3_authpassphrase:
# snmpv3_privpassphrase:
# formula: 0
# error:
# lastlogsize: 0
# logtimefmt:
# templateid: 0
# valuemapid: 0
# delay_flex:
# params:
# ipmi_sensor:
# data_type: 0
# authtype: 0
# username:
# password:
# publickey:
# privatekey:
# mtime: 0
# *************************** 2. row ***************************
# itemid: 23732
# type: 9
# snmp_community:
# snmp_oid:
# snmp_port: 161
# hostid: 10092
# description: Response time for step '$2' of scenario '$1'
# key_: web.test.time[blah scenario name,scenario step 1,resp]
# delay: 60
# history: 30
# trends: 90
# lastvalue: NULL
# lastclock: NULL
# prevvalue: NULL
# status: 0
# value_type: 0
# trapper_hosts: localhost
# units: s
# multiplier: 0
# delta: 0
# prevorgvalue: NULL
# snmpv3_securityname:
# snmpv3_securitylevel: 0
# snmpv3_authpassphrase:
# snmpv3_privpassphrase:
# formula: 0
# error:
# lastlogsize: 0
# logtimefmt:
# templateid: 0
# valuemapid: 0
# delay_flex:
# params:
# ipmi_sensor:
# data_type: 0
# authtype: 0
# username:
# password:
# publickey:
# privatekey:
# mtime: 0
# *************************** 3. row ***************************
# itemid: 23733
# type: 9
# snmp_community:
# snmp_oid:
# snmp_port: 161
# hostid: 10092
# description: Response code for step '$2' of scenario '$1'
# key_: web.test.rspcode[blah scenario name,scenario step 1]
# delay: 60
# history: 30
# trends: 90
# lastvalue: NULL
# lastclock: NULL
# prevvalue: NULL
# status: 0
# value_type: 3
# trapper_hosts: localhost
# units:
# multiplier: 0
# delta: 0
# prevorgvalue: NULL
# snmpv3_securityname:
# snmpv3_securitylevel: 0
# snmpv3_authpassphrase:
# snmpv3_privpassphrase:
# formula: 0
# error:
# lastlogsize: 0
# logtimefmt:
# templateid: 0
# valuemapid: 0
# delay_flex:
# params:
# ipmi_sensor:
# data_type: 0
# authtype: 0
# username:
# password:
# publickey:
# privatekey:
# mtime: 0
# 3 rows in set (0.00 sec)
# create a {httpstepitem} (connects {httptest} and {items})
# mysql> select * from httpstepitem\G
# *************************** 1. row ***************************
# httpstepitemid: 1
# httpstepid: 1
# itemid: 23731
# type: 2
# *************************** 2. row ***************************
# httpstepitemid: 2
# httpstepid: 1
# itemid: 23732
# type: 1
# *************************** 3. row ***************************
# httpstepitemid: 3
# httpstepid: 1
# itemid: 23733
# type: 0
# 3 rows in set (0.00 sec)
# Create 3 items for response time, response code and download speed
log "Create 3 items for response time, response code and download speed"
# download speed
item_id=`zabbix_get_next_id 'items' 'itemid'`
mysql_cmd "insert into items(itemid, type, hostid, description, key_, delay, history, trends, status, value_type, trapper_hosts, units, multiplier, delta, prevorgvalue, formula, error, lastlogsize, logtimefmt, templateid, valuemapid, delay_flex, params, data_type, mtime) values (${item_id}, 9, ${HOSTID}, 'Download speed for step \'\$2\' of scenario \'\$1\'', 'web.test.in[${test_name},${step_name},bps]', ${DELAY}, ${HISTORY}, ${TRENDS}, 0, 0, 'localhost', 'Bps', 0, 0, NULL, 0, '', 0, '', 0, 0, '', '', 0, 0)"
httpstepitem_id=`zabbix_get_next_id 'httpstepitem' 'httpstepitemid'`
mysql_cmd "insert into httpstepitem(httpstepitemid, httpstepid, itemid, type) values (${httpstepitem_id}, ${httpstep_id}, ${item_id}, 2)"
# response time
item_id=`zabbix_get_next_id 'items' 'itemid'`
mysql_cmd "insert into items(itemid, type, hostid, description, key_, delay, history, trends, status, value_type, trapper_hosts, units, multiplier, delta, prevorgvalue, formula, error, lastlogsize, logtimefmt, templateid, valuemapid, delay_flex, params, data_type, mtime) values (${item_id}, 9, ${HOSTID}, 'Response time for step \'\$2\' of scenario \'\$1\'', 'web.test.time[${test_name},${step_name},resp]', ${DELAY}, ${HISTORY}, ${TRENDS}, 0, 0, 'localhost', 's', 0, 0, NULL, 0, '', 0, '', 0, 0, '', '', 0, 0)"
httpstepitem_id=`zabbix_get_next_id 'httpstepitem' 'httpstepitemid'`
mysql_cmd "insert into httpstepitem(httpstepitemid, httpstepid, itemid, type) values (${httpstepitem_id}, ${httpstep_id}, ${item_id}, 1)"
# response code
item_id=`zabbix_get_next_id 'items' 'itemid'`
mysql_cmd "insert into items(itemid, type, hostid, description, key_, delay, history, trends, status, value_type, trapper_hosts, units, multiplier, delta, prevorgvalue, formula, error, lastlogsize, logtimefmt, templateid, valuemapid, delay_flex, params, data_type, mtime) values (${item_id}, 9, ${HOSTID}, 'Response code for step \'\$2\' of scenario \'\$1\'', 'web.test.rspcode[${test_name},${step_name}]', ${DELAY}, ${HISTORY}, ${TRENDS}, 0, 3, 'localhost', '', 0, 0, NULL, 0, '', 0, '', 0, 0, '', '', 0, 0)"
httpstepitem_id=`zabbix_get_next_id 'httpstepitem' 'httpstepitemid'`
mysql_cmd "insert into httpstepitem(httpstepitemid, httpstepid, itemid, type) values (${httpstepitem_id}, ${httpstep_id}, ${item_id}, 0)"
# create {items} for {httptest}
# mysql> select * from items where itemid in (23734,23735)\G
# *************************** 1. row ***************************
# itemid: 23734
# type: 9
# snmp_community:
# snmp_oid:
# snmp_port: 161
# hostid: 10092
# description: Download speed for scenario '$1'
# key_: web.test.in[blah scenario name,,bps]
# delay: 60
# history: 30
# trends: 90
# lastvalue: NULL
# lastclock: NULL
# prevvalue: NULL
# status: 0
# value_type: 0
# trapper_hosts: localhost
# units: Bps
# multiplier: 0
# delta: 0
# prevorgvalue: NULL
# snmpv3_securityname:
# snmpv3_securitylevel: 0
# snmpv3_authpassphrase:
# snmpv3_privpassphrase:
# formula: 0
# error:
# lastlogsize: 0
# logtimefmt:
# templateid: 0
# valuemapid: 0
# delay_flex:
# params:
# ipmi_sensor:
# data_type: 0
# authtype: 0
# username:
# password:
# publickey:
# privatekey:
# mtime: 0
# *************************** 2. row ***************************
# itemid: 23735
# type: 9
# snmp_community:
# snmp_oid:
# snmp_port: 161
# hostid: 10092
# description: Failed step of scenario '$1'
# key_: web.test.fail[blah scenario name]
# delay: 60
# history: 30
# trends: 90
# lastvalue: NULL
# lastclock: NULL
# prevvalue: NULL
# status: 0
# value_type: 3
# trapper_hosts: localhost
# units:
# multiplier: 0
# delta: 0
# prevorgvalue: NULL
# snmpv3_securityname:
# snmpv3_securitylevel: 0
# snmpv3_authpassphrase:
# snmpv3_privpassphrase:
# formula: 0
# error:
# lastlogsize: 0
# logtimefmt:
# templateid: 0
# valuemapid: 0
# delay_flex:
# params:
# ipmi_sensor:
# data_type: 0
# authtype: 0
# username:
# password:
# publickey:
# privatekey:
# mtime: 0
# 2 rows in set (0.00 sec)
# create {httptestitem} (connects {httptest} and {items})
# mysql> select * from httptestitem\G
# *************************** 1. row ***************************
# httptestitemid: 1
# httptestid: 1
# itemid: 23734
# type: 2
# *************************** 2. row ***************************
# httptestitemid: 2
# httptestid: 1
# itemid: 23735
# type: 3
# 2 rows in set (0.00 sec)
# Create 2 items for download speed and fail test of the whole scenario
log "Create 2 items for download speed and fail test of the whole scenario"
# download speed
item_id=`zabbix_get_next_id 'items' 'itemid'`
mysql_cmd "insert into items(itemid, type, hostid, description, key_, delay, history, trends, status, value_type, trapper_hosts, units, multiplier, delta, prevorgvalue, formula, error, lastlogsize, logtimefmt, templateid, valuemapid, delay_flex, params, data_type, mtime) values (${item_id}, 9, ${HOSTID}, 'Download speed for scenario \'\$1\'', 'web.test.in[${test_name},,bps]', ${DELAY}, ${HISTORY}, ${TRENDS}, 0, 0, 'localhost', 'Bps', 0, 0, NULL, 0, '', 0, '', 0, 0, '', '', 0, 0)"
httptestitem_id=`zabbix_get_next_id 'httptestitem' 'httptestitemid'`
mysql_cmd "insert into httptestitem(httptestitemid, httptestid, itemid, type) values (${httptestitem_id}, ${httptest_id}, ${item_id}, 2)"
# fail test
item_id=`zabbix_get_next_id 'items' 'itemid'`
mysql_cmd "insert into items(itemid, type, hostid, description, key_, delay, history, trends, status, value_type, trapper_hosts, units, multiplier, delta, prevorgvalue, formula, error, lastlogsize, logtimefmt, templateid, valuemapid, delay_flex, params, data_type, mtime) values (${item_id}, 9, ${HOSTID}, 'Failed step of scenario \'\$1\'', 'web.test.fail[${test_name}]', ${DELAY}, ${HISTORY}, ${TRENDS}, 0, 3, 'localhost', '', 0, 0, NULL, 0, '', 0, '', 0, 0, '', '', 0, 0)"
httptestitem_id=`zabbix_get_next_id 'httptestitem' 'httptestitemid'`
mysql_cmd "insert into httptestitem(httptestitemid, httptestid, itemid, type) values (${httptestitem_id}, ${httptest_id}, ${item_id}, 3)"
done < ${HOSTFILE}
|
|