mirror of
https://github.com/limosek/zaf.git
synced 2025-11-01 18:17:37 +01:00
Merge branch '1.2'
This commit is contained in:
208
lib/JSON.sh
Executable file
208
lib/JSON.sh
Executable file
@@ -0,0 +1,208 @@
|
||||
#!/bin/sh
|
||||
|
||||
throw() {
|
||||
echo "$*" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
BRIEF=0
|
||||
LEAFONLY=0
|
||||
PRUNE=0
|
||||
NO_HEAD=0
|
||||
NORMALIZE_SOLIDUS=0
|
||||
|
||||
usage() {
|
||||
echo
|
||||
echo "Usage: JSON.sh [-b] [-l] [-p] [-s] [-h]"
|
||||
echo
|
||||
echo "-p - Prune empty. Exclude fields with empty values."
|
||||
echo "-l - Leaf only. Only show leaf nodes, which stops data duplication."
|
||||
echo "-b - Brief. Combines 'Leaf only' and 'Prune empty' options."
|
||||
echo "-n - No-head. Do not show nodes that have no path (lines that start with [])."
|
||||
echo "-s - Remove escaping of the solidus symbol (stright slash)."
|
||||
echo "-h - This help text."
|
||||
echo
|
||||
}
|
||||
|
||||
parse_options() {
|
||||
set -- "$@"
|
||||
local ARGN=$#
|
||||
while [ "$ARGN" -ne 0 ]
|
||||
do
|
||||
case $1 in
|
||||
-h) usage
|
||||
exit 0
|
||||
;;
|
||||
-b) BRIEF=1
|
||||
LEAFONLY=1
|
||||
PRUNE=1
|
||||
;;
|
||||
-l) LEAFONLY=1
|
||||
;;
|
||||
-p) PRUNE=1
|
||||
;;
|
||||
-n) NO_HEAD=1
|
||||
;;
|
||||
-s) NORMALIZE_SOLIDUS=1
|
||||
;;
|
||||
?*) echo "ERROR: Unknown option."
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
shift 1
|
||||
ARGN=$((ARGN-1))
|
||||
done
|
||||
}
|
||||
|
||||
awk_egrep () {
|
||||
local pattern_string=$1
|
||||
|
||||
gawk '{
|
||||
while ($0) {
|
||||
start=match($0, pattern);
|
||||
token=substr($0, start, RLENGTH);
|
||||
print token;
|
||||
$0=substr($0, start+RLENGTH);
|
||||
}
|
||||
}' pattern="$pattern_string"
|
||||
}
|
||||
|
||||
tokenize () {
|
||||
local GREP
|
||||
local ESCAPE
|
||||
local CHAR
|
||||
|
||||
if echo "test string" | egrep -ao --color=never "test" >/dev/null 2>&1
|
||||
then
|
||||
GREP='egrep -ao --color=never'
|
||||
else
|
||||
GREP='egrep -ao'
|
||||
fi
|
||||
|
||||
if echo "test string" | egrep -o "test" >/dev/null 2>&1
|
||||
then
|
||||
ESCAPE='(\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
|
||||
CHAR='[^[:cntrl:]"\\]'
|
||||
else
|
||||
GREP=awk_egrep
|
||||
ESCAPE='(\\\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
|
||||
CHAR='[^[:cntrl:]"\\\\]'
|
||||
fi
|
||||
|
||||
local STRING="\"$CHAR*($ESCAPE$CHAR*)*\""
|
||||
local NUMBER='-?(0|[1-9][0-9]*)([.][0-9]*)?([eE][+-]?[0-9]*)?'
|
||||
local KEYWORD='null|false|true'
|
||||
local SPACE='[[:space:]]+'
|
||||
|
||||
# Force zsh to expand $A into multiple words
|
||||
local is_wordsplit_disabled=$(unsetopt 2>/dev/null | grep -c '^shwordsplit$')
|
||||
if [ $is_wordsplit_disabled != 0 ]; then setopt shwordsplit; fi
|
||||
$GREP "$STRING|$NUMBER|$KEYWORD|$SPACE|." | egrep -v "^$SPACE$"
|
||||
if [ $is_wordsplit_disabled != 0 ]; then unsetopt shwordsplit; fi
|
||||
}
|
||||
|
||||
parse_array () {
|
||||
local index=0
|
||||
local ary=''
|
||||
read -r token
|
||||
case "$token" in
|
||||
']') ;;
|
||||
*)
|
||||
while :
|
||||
do
|
||||
parse_value "$1" "$index"
|
||||
index=$((index+1))
|
||||
ary="$ary""$value"
|
||||
read -r token
|
||||
case "$token" in
|
||||
']') break ;;
|
||||
',') ary="$ary," ;;
|
||||
*) throw "EXPECTED , or ] GOT ${token:-EOF}" ;;
|
||||
esac
|
||||
read -r token
|
||||
done
|
||||
;;
|
||||
esac
|
||||
[ "$BRIEF" -eq 0 ] && value=$(printf '[%s]' "$ary") || value=
|
||||
:
|
||||
}
|
||||
|
||||
parse_object () {
|
||||
local key
|
||||
local obj=''
|
||||
read -r token
|
||||
case "$token" in
|
||||
'}') ;;
|
||||
*)
|
||||
while :
|
||||
do
|
||||
case "$token" in
|
||||
'"'*'"') key=$token ;;
|
||||
*) throw "EXPECTED string GOT ${token:-EOF}" ;;
|
||||
esac
|
||||
read -r token
|
||||
case "$token" in
|
||||
':') ;;
|
||||
*) throw "EXPECTED : GOT ${token:-EOF}" ;;
|
||||
esac
|
||||
read -r token
|
||||
parse_value "$1" "$key"
|
||||
obj="$obj$key:$value"
|
||||
read -r token
|
||||
case "$token" in
|
||||
'}') break ;;
|
||||
',') obj="$obj," ;;
|
||||
*) throw "EXPECTED , or } GOT ${token:-EOF}" ;;
|
||||
esac
|
||||
read -r token
|
||||
done
|
||||
;;
|
||||
esac
|
||||
[ "$BRIEF" -eq 0 ] && value=$(printf '{%s}' "$obj") || value=
|
||||
:
|
||||
}
|
||||
|
||||
parse_value () {
|
||||
local jpath="${1:+$1,}$2" isleaf=0 isempty=0 print=0
|
||||
case "$token" in
|
||||
'{') parse_object "$jpath" ;;
|
||||
'[') parse_array "$jpath" ;;
|
||||
# At this point, the only valid single-character tokens are digits.
|
||||
''|[!0-9]) throw "EXPECTED value GOT ${token:-EOF}" ;;
|
||||
*) value=$token
|
||||
# if asked, replace solidus ("\/") in json strings with normalized value: "/"
|
||||
[ "$NORMALIZE_SOLIDUS" -eq 1 ] && value=$(echo "$value" | sed 's#\\/#/#g')
|
||||
isleaf=1
|
||||
[ "$value" = '""' ] && isempty=1
|
||||
;;
|
||||
esac
|
||||
[ "$value" = '' ] && return
|
||||
[ "$NO_HEAD" -eq 1 ] && [ -z "$jpath" ] && return
|
||||
|
||||
[ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 0 ] && print=1
|
||||
[ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && [ $PRUNE -eq 0 ] && print=1
|
||||
[ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 1 ] && [ "$isempty" -eq 0 ] && print=1
|
||||
[ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && \
|
||||
[ $PRUNE -eq 1 ] && [ $isempty -eq 0 ] && print=1
|
||||
[ "$print" -eq 1 ] && printf "[%s]\t%s\n" "$jpath" "$value"
|
||||
:
|
||||
}
|
||||
|
||||
parse () {
|
||||
read -r token
|
||||
parse_value
|
||||
read -r token
|
||||
case "$token" in
|
||||
'') ;;
|
||||
*) throw "EXPECTED EOF GOT $token" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
if ([ "$0" = "$BASH_SOURCE" ] || ! [ -n "$BASH_SOURCE" ]);
|
||||
then
|
||||
parse_options "$@"
|
||||
tokenize | parse
|
||||
fi
|
||||
|
||||
# vi: expandtab sw=2 ts=2
|
||||
@@ -1,18 +1,36 @@
|
||||
# Zaf cache related functions
|
||||
|
||||
zaf_cache_init(){
|
||||
[ -z "$ZAF_CACHE_DIR" ] && ZAF_CACHE_DIR=${ZAF_TMP_DIR}/zafc
|
||||
if [ -w $ZAF_CACHE_DIR ]; then
|
||||
zaf_trc "Cache: Removing stale entries"
|
||||
(cd $ZAF_CACHE_DIR && find ./ -type f -name '*.info' -mmin +1 2>/dev/null | \
|
||||
while read line ; do
|
||||
rm -f $line $(basename $line .info)
|
||||
done
|
||||
)
|
||||
else
|
||||
zaf_dbg "Cache dir $ZAF_CACHE_DIR is not accessible! Disabling cache."
|
||||
fi
|
||||
}
|
||||
|
||||
zaf_cache_clean(){
|
||||
if [ -n "$ZAF_CACHE_DIR" ]; then
|
||||
zaf_wrn "Removing cache entries"
|
||||
rm -rf "$ZAF_CACHE_DIR"
|
||||
(cd $ZAF_CACHE_DIR && find ./ -type f -name '*.info' 2>/dev/null | \
|
||||
while read line ; do
|
||||
rm -f $line $(basename $line .info)
|
||||
done
|
||||
)
|
||||
else
|
||||
zaf_err "Cache dir not set."
|
||||
zaf_dbg "Cache dir not set. Disabling cache."
|
||||
fi
|
||||
mkdir -p "$ZAF_CACHE_DIR"
|
||||
zaf_cache_init
|
||||
}
|
||||
|
||||
# Get cache key from requested param
|
||||
zaf_cache_key(){
|
||||
echo "$1" | md5sum - | cut -d ' ' -f 1
|
||||
echo "$1" | (md5sum - ||md5) 2>/dev/null | cut -d ' ' -f 1
|
||||
}
|
||||
|
||||
# Put object into cache
|
||||
@@ -23,12 +41,15 @@ zaf_tocache(){
|
||||
! [ -w $ZAF_CACHE_DIR ] && return 1
|
||||
local key
|
||||
local value
|
||||
local expiry
|
||||
|
||||
key=$(zaf_cache_key "$1")
|
||||
rm -f $ZAF_CACHE_DIR/$key $ZAF_CACHE_DIR/${key}.info
|
||||
echo "$2" >$ZAF_CACHE_DIR/$key
|
||||
echo "$1" >$ZAF_CACHE_DIR/$key.info
|
||||
touch -m -d "$3 seconds" $ZAF_CACHE_DIR/$key.info
|
||||
zaf_trc "Cache: Saving entry $1($key)"
|
||||
echo "$1" >$ZAF_CACHE_DIR/${key}.info
|
||||
expiry=$(zaf_date_add "$3")
|
||||
zaf_trc "Cache: Saving entry $1[$key,expiry=$expiry]"
|
||||
touch -m -d "$expiry" $ZAF_CACHE_DIR/${key}.info
|
||||
}
|
||||
|
||||
# Put object into cache from stdin and copy to stdout
|
||||
@@ -37,16 +58,19 @@ zaf_tocache(){
|
||||
zaf_tocache_stdin(){
|
||||
! [ -w $ZAF_CACHE_DIR ] && return 1
|
||||
local key
|
||||
local expiry
|
||||
|
||||
key=$(zaf_cache_key "$1")
|
||||
rm -f $ZAF_CACHE_DIR/$key $ZAF_CACHE_DIR/${key}.info
|
||||
cat >$ZAF_CACHE_DIR/$key
|
||||
if [ -s $ZAF_CACHE_DIR/$key ]; then
|
||||
zaf_trc "Cache: Saving entry $1($key)"
|
||||
echo "$1" >$ZAF_CACHE_DIR/$key.info
|
||||
touch -m -d "$2 seconds" $ZAF_CACHE_DIR/$key.info
|
||||
expiry="$(zaf_date_add $2)"
|
||||
echo "$1 [key=$key,expiry=$expiry]" >$ZAF_CACHE_DIR/${key}.info
|
||||
zaf_trc "Cache: Saving entry $1[key=$key,expiry=$expiry]"
|
||||
touch -m -d "$expiry" $ZAF_CACHE_DIR/$key.info
|
||||
cat $ZAF_CACHE_DIR/$key
|
||||
else
|
||||
rm $ZAF_CACHE_DIR/$key
|
||||
rm -f "$ZAF_CACHE_DIR/$key"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -60,6 +84,16 @@ zaf_cache_delentry(){
|
||||
rm -f "$ZAF_CACHE_DIR/$key*"
|
||||
}
|
||||
|
||||
# List entries in cache
|
||||
zaf_cache_list(){
|
||||
local i
|
||||
ls $ZAF_CACHE_DIR/*info >/dev/null 2>/dev/null || return 1
|
||||
local key
|
||||
for i in $ZAF_CACHE_DIR/*info; do
|
||||
cat $i
|
||||
done
|
||||
}
|
||||
|
||||
# Get object from cache
|
||||
# $1 key
|
||||
zaf_fromcache(){
|
||||
@@ -68,6 +102,7 @@ zaf_fromcache(){
|
||||
local value
|
||||
key=$(zaf_cache_key "$1")
|
||||
if [ -f $ZAF_CACHE_DIR/$key ]; then
|
||||
! [ -f "$ZAF_CACHE_DIR/$key.info" ] && { return 3; }
|
||||
if [ "$ZAF_CACHE_DIR/$key.info" -nt "$ZAF_CACHE_DIR/$key" ]; then
|
||||
zaf_trc "Cache: serving $1($key) from cache"
|
||||
cat $ZAF_CACHE_DIR/$key
|
||||
|
||||
@@ -27,7 +27,7 @@ zaf_ctrl_get_extitem_block() {
|
||||
# Get item body from stdin
|
||||
# $1 itemname
|
||||
zaf_ctrl_get_item_block() {
|
||||
grep -v '^#' | awk '/^Item '$1'/ { i=0;
|
||||
grep -vE '^#[a-zA-Z ]' | awk '/^Item '$1'/ { i=0;
|
||||
while (i==0) {
|
||||
getline;
|
||||
if (/^\/Item/) exit;
|
||||
@@ -42,7 +42,7 @@ zaf_ctrl_get_item_block() {
|
||||
# Get global plugin block body from stdin
|
||||
# $1 itemname
|
||||
zaf_ctrl_get_global_block() {
|
||||
grep -v '^#' | awk '{ i=0; print $0;
|
||||
grep -vE '^#[a-zA-Z ]' | awk '{ i=0; print $0;
|
||||
while (i==0) {
|
||||
getline;
|
||||
if (/^(Item |ExtItem)/) exit;
|
||||
@@ -156,6 +156,7 @@ zaf_ctrl_sudo() {
|
||||
|
||||
pdir="$3"
|
||||
plugin=$1
|
||||
! [ -d "$ZAF_SUDOERSD" ] && { zaf_wrn "$ZAF_SUDOERSD nonexistent! Skipping sudo install!"; return 1; }
|
||||
zaf_dbg "Installing sudoers entry $ZAF_SUDOERSD/zaf_$plugin"
|
||||
sudo=$(zaf_ctrl_get_global_option $2 "Sudo" | zaf_far '{PLUGINDIR}' "${plugindir}")
|
||||
[ -z "$sudo" ] && return # Nothing to install
|
||||
@@ -183,6 +184,7 @@ zaf_ctrl_cron() {
|
||||
|
||||
pdir="$3"
|
||||
plugin=$1
|
||||
! [ -d "$ZAF_CROND" ] && { zaf_wrn "$ZAF_CROND nonexistent! Skipping cron install!"; return 1; }
|
||||
zaf_dbg "Installing cron entry $ZAF_CROND/zaf_$plugin"
|
||||
cron=$(zaf_ctrl_get_global_option $2 "Cron")
|
||||
[ -z "$cron" ] && return # Nothing to install
|
||||
@@ -229,48 +231,62 @@ zaf_ctrl_generate_items_cfg() {
|
||||
local ikey
|
||||
local lock
|
||||
local cache
|
||||
local tmpfile
|
||||
local pname
|
||||
local pdefault
|
||||
local pregex
|
||||
local prest
|
||||
local zafparms
|
||||
|
||||
items=$(zaf_ctrl_get_items <"$1")
|
||||
tmpfile=$ZAF_TMP_DIR/gencfg$$
|
||||
(set -e
|
||||
for i in $items; do
|
||||
iscript=$(zaf_stripctrl $i)
|
||||
params=$(zaf_ctrl_get_item_option $1 $i "Parameters")
|
||||
if [ -n "$params" ]; then
|
||||
zaf_ctrl_get_item_option $1 $i "Parameters" >$tmpfile
|
||||
if [ -s "$tmpfile" ]; then
|
||||
ikey="$2.$i[*]"
|
||||
args=""
|
||||
apos=1;
|
||||
for p in $params; do
|
||||
while read pname pdefault pregex prest; do
|
||||
zafparams="$zafparams value=\"\$$apos\"; zaf_agentparm $pname $pdefault $pregex; export $pname; "
|
||||
args="$args \$$apos"
|
||||
apos=$(expr $apos + 1)
|
||||
done
|
||||
done <$tmpfile
|
||||
else
|
||||
ikey="$2.$i"
|
||||
zafparams=""
|
||||
args=""
|
||||
fi
|
||||
env="export ITEM_KEY='$ikey'; export PLUGIN='$2'; export PATH=${ZAF_PLUGINS_DIR}/$2:$ZAF_LIB_DIR:\$PATH; cd ${ZAF_PLUGINS_DIR}/$2; . $ZAF_LIB_DIR/preload.sh; "
|
||||
lock=$(zaf_ctrl_get_item_option $1 $i "Lock")
|
||||
if [ -n "$lock" ]; then
|
||||
lock="${ZAF_LIB_DIR}/zaflock $lock "
|
||||
fi
|
||||
cache=$(zaf_ctrl_get_item_option $1 $i "Cache")
|
||||
if [ -n "$cache" ]; then
|
||||
cache="_cache '$cache' "
|
||||
cache="${ZAF_LIB_DIR}/zafcache '$cache' "
|
||||
fi
|
||||
cmd=$(zaf_ctrl_get_item_option $1 $i "Cmd")
|
||||
if [ -n "$cmd" ]; then
|
||||
$(which echo) "UserParameter=$ikey,${ZAF_LIB_DIR}/preload.sh $cache $lock$cmd";
|
||||
printf "%s" "UserParameter=$ikey,${env}${zafparams}${preload}${cache}${lock}${cmd}"; echo
|
||||
continue
|
||||
fi
|
||||
cmd=$(zaf_ctrl_get_item_option $1 $i "Script")
|
||||
if [ -n "$cmd" ]; then
|
||||
zaf_ctrl_get_item_option $1 $i "Script" | \
|
||||
zaf_far '{INCLUDES}' '. /etc/zaf.conf; . ${ZAF_LIB_DIR}/zaf.lib.sh; . ${ZAF_LIB_DIR}/ctrl.lib.sh; . ${ZAF_LIB_DIR}/zbxapi.lib.sh; . ${ZAF_LIB_DIR}/cache.lib.sh; ' \
|
||||
>${ZAF_TMP_DIR}/${iscript}.sh;
|
||||
zaf_install_bin ${ZAF_TMP_DIR}/${iscript}.sh ${ZAF_PLUGINS_DIR}/$2/
|
||||
$(which echo) "UserParameter=$ikey,$cache $lock${ZAF_PLUGINS_DIR}/$2/${iscript}.sh $args";
|
||||
( echo "#!/bin/sh"
|
||||
echo ". $ZAF_LIB_DIR/preload.sh; "
|
||||
zaf_ctrl_get_item_option $1 $i "Script"
|
||||
) >${ZAF_TMP_DIR}/${iscript}.sh;
|
||||
[ -z "$3" ] && zaf_install_bin ${ZAF_TMP_DIR}/${iscript}.sh ${ZAF_PLUGINS_DIR}/$2/
|
||||
printf "%s" "UserParameter=$ikey,${env}${preload}${zafparams}${cache}${lock}${ZAF_PLUGINS_DIR}/$2/${iscript}.sh ${args}"; echo
|
||||
rm -f ${ZAF_TMP_DIR}/${iscript}.sh
|
||||
continue;
|
||||
fi
|
||||
zaf_err "Item $i declared in control file but has no Cmd, Function or Script!"
|
||||
done
|
||||
) || zaf_err "Error during zaf_ctrl_generate_items_cfg"
|
||||
rm -f $tmpfile
|
||||
}
|
||||
|
||||
# Generates zabbix cfg for external items from control file
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
# Os related functions
|
||||
|
||||
zaf_configure_os_openwrt() {
|
||||
ZAF_AGENT_RESTART="/etc/init.d/zabbix_agentd restart"
|
||||
ZAF_AGENT_RESTART="zaf agent-config ; /etc/init.d/zabbix_agentd restart"
|
||||
ZAF_AGENT_CONFIGD="/var/run/zabbix_agentd.conf.d/"
|
||||
ZAF_AGENT_CONFIG="/etc/zabbix_agentd.conf"
|
||||
ZAF_AGENT_PKG="zabbix-agentd"
|
||||
ZAF_CURL_INSECURE=1
|
||||
}
|
||||
zaf_configure_os_beesip() {
|
||||
zaf_configure_os_openwrt
|
||||
}
|
||||
|
||||
zaf_configure_os_freebsd() {
|
||||
ZAF_AGENT_PKG="zabbix3-agent"
|
||||
@@ -14,9 +17,13 @@ zaf_configure_os_freebsd() {
|
||||
ZAF_AGENT_CONFIGD="/usr/local/etc/zabbix3/zabbix_agentd.conf.d/"
|
||||
ZAF_AGENT_BIN="/usr/local/sbin/zabbix_agentd"
|
||||
ZAF_AGENT_RESTART="service zabbix_agentd restart"
|
||||
ZAF_SUDOERSD="/usr/local/etc/sudoers.d"
|
||||
}
|
||||
|
||||
zaf_detect_system() {
|
||||
ZAF_FILES_UID=zabbix
|
||||
ZAF_FILES_GID=zabbix
|
||||
ZAF_FILES_UMASK=0770
|
||||
if which dpkg >/dev/null; then
|
||||
ZAF_PKG=dpkg
|
||||
ZAF_OS=$(lsb_release -is|zaf_tolower)
|
||||
|
||||
296
lib/plugin.lib.sh
Normal file
296
lib/plugin.lib.sh
Normal file
@@ -0,0 +1,296 @@
|
||||
# Plugin related functions
|
||||
|
||||
# Update repo
|
||||
zaf_update_repo() {
|
||||
[ "$ZAF_GIT" != 1 ] && { zaf_err "Git is disabled or is not installed. Exiting."; }
|
||||
if [ -z "${ZAF_REPO_GITURL}" ] || [ -z "${ZAF_REPO_DIR}" ]; then
|
||||
zaf_err "This system is not configured for git repository."
|
||||
else
|
||||
[ ! -d "${ZAF_REPO_DIR}" ] && git clone "${ZAF_REPO_GITURL}" "${ZAF_REPO_DIR}"
|
||||
(cd ${ZAF_REPO_DIR} && git pull)
|
||||
fi
|
||||
}
|
||||
|
||||
# Construct url from plugin name
|
||||
# It can be http[s]://url
|
||||
# /path (from file)
|
||||
# name (to try from repo)
|
||||
zaf_get_plugin_url() {
|
||||
local url
|
||||
|
||||
if echo "$1" | grep -q '/'; then
|
||||
url="$1" # plugin with path - from directory
|
||||
else
|
||||
if echo "$1" | grep -q ^http; then
|
||||
url="$1" # plugin with http[s] url
|
||||
else
|
||||
if [ -d "${ZAF_REPO_DIR}/$1" ]; then
|
||||
url="${ZAF_REPO_DIR}/$1"
|
||||
else
|
||||
if [ -n "${ZAF_PREPACKAGED_DIR}" ] && [ -d "${ZAF_PREPACKAGED_DIR}/$1" ]; then
|
||||
url="${ZAF_PREPACKAGED_DIR}/$1"
|
||||
else
|
||||
if [ -n "${ZAF_REPO_URL}" ]; then
|
||||
url="${ZAF_REPO_URL}/$1"
|
||||
else
|
||||
zaf_err "Cannot find plugin $1"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
echo $url
|
||||
}
|
||||
|
||||
# $1 - control
|
||||
zaf_plugin_info() {
|
||||
local control="$1"
|
||||
local items
|
||||
|
||||
! [ -f "$control" ] && zaf_err "Control file $control not found."
|
||||
plugin=$(zaf_ctrl_get_global_block <"${control}" | zaf_block_get_option Plugin)
|
||||
pdescription=$(zaf_ctrl_get_global_block <"${control}" | zaf_block_get_moption Description)
|
||||
pmaintainer=$(zaf_ctrl_get_global_block <"${control}" | zaf_block_get_option Maintainer)
|
||||
pversion=$(zaf_ctrl_get_global_block <"${control}" | zaf_block_get_option Version)
|
||||
purl=$(zaf_ctrl_get_global_block <"${control}" | zaf_block_get_option Url)
|
||||
phome=$(zaf_ctrl_get_global_block <"${control}" | zaf_block_get_option Home)
|
||||
pitems=$(zaf_ctrl_get_items <"${control}")
|
||||
echo
|
||||
echo -n "Plugin '$plugin' "; [ -n "$pversion" ] && echo -n "version ${pversion}"; echo ":"
|
||||
echo "$pdescription"; echo
|
||||
[ -n "$pmaintainer" ] && echo "Maintainer: $pmaintainer"
|
||||
[ -n "$purl" ] && echo "Url: $purl"
|
||||
[ -n "$phome" ] && echo "Home: $phome"
|
||||
echo
|
||||
if zaf_is_plugin "$(basename $plugin)"; then
|
||||
items=$(zaf_list_plugin_items $plugin)
|
||||
[ -n "$items" ] && echo -n "Defined items: "; echo $items
|
||||
items=$(zaf_list_plugin_items $plugin test)
|
||||
[ -n "$items" ] && echo -n "Test items: "; echo $items
|
||||
items=$(zaf_list_plugin_items $plugin precache)
|
||||
[ -n "$items" ] && echo -n "Precache items: "; echo $items
|
||||
else
|
||||
echo "Items: $pitems"
|
||||
fi
|
||||
echo
|
||||
}
|
||||
|
||||
# Prepare plugin into dir
|
||||
# $1 is url, directory or plugin name (will be searched in default plugin dir).
|
||||
# $2 is directory to prepare.
|
||||
zaf_prepare_plugin() {
|
||||
local url
|
||||
local plugindir
|
||||
local control
|
||||
|
||||
url=$(zaf_get_plugin_url "$1")/control.zaf || exit $?
|
||||
plugindir="$2"
|
||||
control=${plugindir}/control.zaf
|
||||
zaf_install_dir "$plugindir"
|
||||
zaf_dbg "Fetching control file from $url ..."
|
||||
if zaf_fetch_url "$url" >"${control}"; then
|
||||
zaf_ctrl_check_deps "${control}"
|
||||
else
|
||||
zaf_err "prepare_plugin: Cannot fetch or write control file $control from url $url!"
|
||||
fi
|
||||
}
|
||||
|
||||
zaf_install_plugin() {
|
||||
local url
|
||||
local plugin
|
||||
local plugindir
|
||||
local control
|
||||
local version
|
||||
|
||||
if zaf_prepare_plugin "$1" "${ZAF_TMP_DIR}/plugin"; then
|
||||
url=$(zaf_get_plugin_url "$1")
|
||||
control="${ZAF_TMP_DIR}/plugin/control.zaf"
|
||||
plugin=$(zaf_ctrl_get_global_option $control Plugin)
|
||||
version=$(zaf_ctrl_get_global_option $control Version)
|
||||
plugindir="${ZAF_PLUGINS_DIR}"/$plugin
|
||||
if [ -n "$plugin" ] && zaf_prepare_plugin "$1" $plugindir; then
|
||||
zaf_wrn "Installing plugin $plugin version $version"
|
||||
zaf_dbg "Source url: $url, Destination dir: $plugindir"
|
||||
control=${plugindir}/control.zaf
|
||||
[ "$ZAF_DEBUG" -gt 1 ] && zaf_plugin_info "${control}"
|
||||
zaf_ctrl_check_deps "${control}"
|
||||
zaf_ctrl_sudo "$plugin" "${control}" "${plugindir}"
|
||||
zaf_ctrl_cron "$plugin" "${control}" "${plugindir}"
|
||||
zaf_ctrl_generate_cfg "${control}" "${plugin}" \
|
||||
| zaf_far '{PLUGINDIR}' "${plugindir}" >${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf
|
||||
zaf_dbg "Generated ${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf"
|
||||
zaf_ctrl_install "$url" "${control}" "${plugindir}"
|
||||
else
|
||||
zaf_err "Cannot install plugin '$plugin' to $plugindir!"
|
||||
fi
|
||||
else
|
||||
zaf_err "Cannot prepare plugin $1"
|
||||
fi
|
||||
}
|
||||
|
||||
# List installed plugins
|
||||
# $1 - plugin
|
||||
zaf_list_plugins() {
|
||||
local cfile
|
||||
local plugin
|
||||
ls -1 ${ZAF_PLUGINS_DIR} | while read p; do
|
||||
zaf_is_plugin "$(basename $p)" && echo $p
|
||||
done
|
||||
}
|
||||
|
||||
zaf_is_plugin() {
|
||||
[ -d "$ZAF_PLUGINS_DIR/$1" ] && [ -f "$ZAF_PLUGINS_DIR/$1/control.zaf" ] && return
|
||||
false
|
||||
}
|
||||
|
||||
zaf_discovery_plugins() {
|
||||
zaf_list_plugins | zaf_discovery '{#PLUGIN}'
|
||||
}
|
||||
|
||||
# $1 plugin
|
||||
# $2 ctrl_option
|
||||
zaf_plugin_option() {
|
||||
local plugindir
|
||||
local cfile
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
zaf_err "Missing plugin name.";
|
||||
fi
|
||||
if zaf_is_plugin "$1"; then
|
||||
plugindir="${ZAF_PLUGINS_DIR}/$1"
|
||||
cfile="$plugindir/control.zaf"
|
||||
zaf_ctrl_get_global_option $cfile $2
|
||||
else
|
||||
zaf_err "Plugin $1 not installed."
|
||||
fi
|
||||
}
|
||||
|
||||
zaf_plugin_version() {
|
||||
zaf_plugin_option "$1" Version
|
||||
}
|
||||
zaf_plugin_maintainer() {
|
||||
zaf_plugin_option "$1" Maintainer
|
||||
}
|
||||
zaf_plugin_url() {
|
||||
zaf_plugin_option "$1" Url
|
||||
}
|
||||
zaf_plugin_web() {
|
||||
zaf_plugin_option "$1" Web
|
||||
}
|
||||
zaf_plugin_template_url() {
|
||||
echo $(zaf_plugin_option "$1" Url)/template.xml
|
||||
}
|
||||
|
||||
# $1 plugin
|
||||
# $2 test to get test items, precache to get items to precache
|
||||
zaf_list_plugin_items() {
|
||||
local items
|
||||
local i
|
||||
local p
|
||||
local key
|
||||
local testparms
|
||||
local precache
|
||||
|
||||
if ! zaf_is_plugin "$1"; then
|
||||
zaf_err "Missing plugin name or plugin $1 unknown. ";
|
||||
fi
|
||||
plugindir="${ZAF_PLUGINS_DIR}/$1"
|
||||
cfile="$plugindir/control.zaf"
|
||||
items=$(zaf_ctrl_get_items <$cfile)
|
||||
for i in $items; do
|
||||
p=$(zaf_ctrl_get_item_option $cfile $i "Parameters")
|
||||
testparms=$(zaf_ctrl_get_item_option $cfile $i "Testparameters")
|
||||
precache=$(zaf_ctrl_get_item_option $cfile $i "Precache")
|
||||
case $2 in
|
||||
test)
|
||||
for tp in $testparms; do
|
||||
if [ -n "$p" ]; then
|
||||
echo -n "$1.$i[$tp] "
|
||||
else
|
||||
echo -n "$1.$i "
|
||||
fi
|
||||
done
|
||||
;;
|
||||
precache)
|
||||
for tp in $precache; do
|
||||
echo -n "$1.$i[$tp] "
|
||||
done
|
||||
;;
|
||||
*)
|
||||
if [ -n "$p" ]; then
|
||||
echo -n "$1.$i[] "
|
||||
else
|
||||
echo -n "$1.$i "
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
echo
|
||||
}
|
||||
|
||||
zaf_item_info() {
|
||||
local plugin
|
||||
local item
|
||||
local param
|
||||
|
||||
plugin=$(echo $1 | cut -d '.' -f 1)
|
||||
item=$(echo $1 | cut -d '.' -f 2-)
|
||||
if zaf_is_plugin $plugin; then
|
||||
if zaf_ctrl_get_items <$ZAF_PLUGINS_DIR/$plugin/control.zaf | grep -wq "$item"; then
|
||||
echo "Item $1:"
|
||||
echo -n "Cache: "; zaf_ctrl_get_item_option $ZAF_PLUGINS_DIR/$plugin/control.zaf "$item" "Cache"; echo
|
||||
echo "Parameters:"
|
||||
zaf_ctrl_get_item_option $ZAF_PLUGINS_DIR/$plugin/control.zaf "$item" "Parameters" ; echo
|
||||
echo "Testparameters:"
|
||||
zaf_ctrl_get_item_option $ZAF_PLUGINS_DIR/$plugin/control.zaf "$item" "Testparameters"; echo
|
||||
echo "Precache:"
|
||||
zaf_ctrl_get_item_option $ZAF_PLUGINS_DIR/$plugin/control.zaf "$item" "Precache"; echo
|
||||
grep "UserParameter=$1" $ZAF_AGENT_CONFIGD/zaf_${plugin}.conf
|
||||
else
|
||||
zaf_err "No such item $item."
|
||||
fi
|
||||
else
|
||||
zaf_err "No such plugin $plugin."
|
||||
fi
|
||||
}
|
||||
|
||||
zaf_list_items() {
|
||||
for p in $(zaf_list_plugins); do
|
||||
echo $p: $(zaf_list_plugin_items $p)
|
||||
done
|
||||
}
|
||||
|
||||
zaf_get_item() {
|
||||
if which zabbix_get >/dev/null; then
|
||||
zaf_trc zabbix_get -s localhost -k "'$1'"
|
||||
(zabbix_get -s localhost -k "$1" | tr '\n' ' '; echo) || zaf_wrn "Cannot reach agent on localhost. Please localhost to Server list."
|
||||
return 11
|
||||
else
|
||||
zaf_wrn "Please install zabbix_get binary to check items over network."
|
||||
return 11
|
||||
fi
|
||||
}
|
||||
|
||||
zaf_test_item() {
|
||||
zaf_trc $ZAF_AGENT_BIN -t "'$1'"
|
||||
if $ZAF_AGENT_BIN -t "$1" | grep ZBX_NOTSUPPORTED; then
|
||||
return 1
|
||||
else
|
||||
$ZAF_AGENT_BIN -t "$1" | tr '\n' ' '
|
||||
echo
|
||||
fi
|
||||
}
|
||||
|
||||
zaf_precache_item() {
|
||||
cmd=$(grep "^UserParameter=$item" $ZAF_AGENT_CONFIGD/zaf*.conf | cut -d ',' -f 2- | sed -e "s/_cache/_nocache/")
|
||||
zaf_wrn "Precaching item $item[$(echo $*| tr ' ' ',')] ($cmd)"
|
||||
eval $cmd
|
||||
}
|
||||
|
||||
zaf_remove_plugin() {
|
||||
! zaf_is_plugin $1 && { zaf_err "Plugin $1 not installed!"; }
|
||||
zaf_wrn "Removing plugin $1 (version $(zaf_plugin_version $1))"
|
||||
rm -rf ${ZAF_PLUGINS_DIR}/$1
|
||||
rm -f ${ZAF_AGENT_CONFIGD}/zaf_$1.conf ${ZAF_CROND}/zaf_$1 ${ZAF_SUDOERSD}/zaf_$1
|
||||
}
|
||||
|
||||
@@ -2,36 +2,36 @@
|
||||
|
||||
. /etc/zaf.conf
|
||||
|
||||
[ -z "$ZAF_TMP_BASE" ] && ZAF_TMP_BASE=/tmp/zaf
|
||||
ZAF_TMP_DIR="${ZAF_TMP_BASE}-${USER}"
|
||||
[ -z "$ZAF_CACHE_DIR" ] && ZAF_CACHE_DIR=${ZAF_TMP_BASE}c
|
||||
|
||||
trap "rm -rif ${ZAF_TMP_DIR}" EXIT
|
||||
! [ -d "${ZAF_TMP_DIR}" ] && mkdir "${ZAF_TMP_DIR}"
|
||||
! [ -d "${ZAF_CACHE_DIR}" ] && mkdir "${ZAF_CACHE_DIR}"
|
||||
[ -z "$ZAF_DEBUG" ] && ZAF_DEBUG=1
|
||||
|
||||
. ${ZAF_LIB_DIR}/zaf.lib.sh
|
||||
. ${ZAF_LIB_DIR}/plugin.lib.sh
|
||||
. ${ZAF_LIB_DIR}/ctrl.lib.sh
|
||||
. ${ZAF_LIB_DIR}/os.lib.sh
|
||||
. ${ZAF_LIB_DIR}/zbxapi.lib.sh
|
||||
. ${ZAF_LIB_DIR}/cache.lib.sh
|
||||
|
||||
# Plugin specific functions if exists
|
||||
[ -f ./functions.sh ] && . ./functions.sh
|
||||
|
||||
if ! type zaf_version >/dev/null; then
|
||||
echo "Problem loading libraries?"
|
||||
exit 2
|
||||
fi
|
||||
zaf_debug_init
|
||||
zaf_tmp_init
|
||||
zaf_cache_init
|
||||
|
||||
export ZAF_LIB_DIR
|
||||
export ZAF_TMP_DIR
|
||||
export ZAF_CACHE_DIR
|
||||
export ZAF_PLUGINS_DIR
|
||||
export ZAF_DEBUG
|
||||
unset ZAF_LOG_STDERR
|
||||
export PATH
|
||||
|
||||
if [ "$1" = "_cache" ] || [ "$1" = "_nocache" ] ; then
|
||||
[ "$1" = "_nocache" ] && export ZAF_NOCACHE=1
|
||||
shift
|
||||
seconds=$1
|
||||
shift
|
||||
parms=$(echo $*|tr -d ' ')
|
||||
if ! zaf_fromcache $parms; then
|
||||
([ "$(basename $0)" = "preload.sh" ] && [ -n "$*" ] && $@ ) | zaf_tocache_stdin $parms $seconds
|
||||
fi
|
||||
else
|
||||
[ "$(basename $0)" = "preload.sh" ] && [ -n "$*" ] && $@
|
||||
if [ "$(basename $0)" = "preload.sh" ] && [ -n "$*" ]; then
|
||||
tmpf=$(zaf_tmpfile preload)
|
||||
$@ 2>$tmpf
|
||||
[ -s $tmpf ] && zaf_wrn <$tmpf
|
||||
fi
|
||||
|
||||
|
||||
|
||||
@@ -11,17 +11,17 @@ zaf_msg() {
|
||||
echo $@
|
||||
}
|
||||
zaf_trc() {
|
||||
[ "$ZAF_DEBUG" -ge "3" ] && logger -s -t zaf -- $@
|
||||
[ "$ZAF_DEBUG" -ge "3" ] && logger -p user.info ${ZAF_LOG_STDERR} -t zaf-trace -- $@
|
||||
}
|
||||
zaf_dbg() {
|
||||
[ "$ZAF_DEBUG" -ge "2" ] && logger -s -t zaf -- $@
|
||||
[ "$ZAF_DEBUG" -ge "2" ] && logger -p user.debug ${ZAF_LOG_STDERR} -t zaf-debug -- $@
|
||||
}
|
||||
zaf_wrn() {
|
||||
[ "$ZAF_DEBUG" -ge "1" ] && logger -s -t zaf -- $@
|
||||
[ "$ZAF_DEBUG" -ge "1" ] && logger -p user.warn ${ZAF_LOG_STDERR} -t zaf-warning -- $@
|
||||
}
|
||||
zaf_err() {
|
||||
logger -s -t zaf -- $@
|
||||
logger -s -t zaf "Exiting with error!"
|
||||
logger ${ZAF_LOG_STDERR} -p user.err -t zaf-error -- $@
|
||||
logger ${ZAF_LOG_STDERR} -p user.err -t zaf-error "Exiting with error!"
|
||||
exit 1
|
||||
}
|
||||
# Help option
|
||||
@@ -38,11 +38,47 @@ zaf_hlp() {
|
||||
dl=$(expr $cols - $kl)
|
||||
printf %-${kl}s%-${dl}s%b "$1" "$2" "\n"
|
||||
}
|
||||
# $1 if nonempty, log to stderr too
|
||||
zaf_debug_init() {
|
||||
[ -z "$ZAF_DEBUG" ] && ZAF_DEBUG=1
|
||||
export ZAF_DEBUG
|
||||
[ -n "$1" ] && export ZAF_LOG_STDERR="-s"
|
||||
}
|
||||
|
||||
zaf_tmp_init() {
|
||||
[ -z "$ZAF_TMP_DIR" ] && ZAF_TMP_DIR=/tmp/
|
||||
! [ -w "$ZAF_TMP_DIR" ] && zaf_err "Tmp dir $ZAF_TMP_DIR is not writable."
|
||||
}
|
||||
|
||||
zaf_version(){
|
||||
echo $ZAF_VERSION
|
||||
}
|
||||
|
||||
# Add parameter for agent check
|
||||
# $1 parameter name (will be set to var)
|
||||
# $2 if nonempty, it is default value. If empty, parameter is mandatory
|
||||
# $3 if nonempty, regexp to test
|
||||
zaf_agentparm(){
|
||||
local name
|
||||
local default
|
||||
local regexp
|
||||
|
||||
name="$1"
|
||||
default="$2"
|
||||
regexp="$3"
|
||||
|
||||
[ -z "$value" ] && [ -z "$default" ] && zaf_err "$ITEM_KEY: Missing mandatory parameter $name."
|
||||
if [ -z "$value" ]; then
|
||||
value="$default"
|
||||
else
|
||||
if [ -n "$regexp" ]; then
|
||||
echo "$value" | grep -qE "$regexp" || zaf_err "$ITEM_KEY: Bad parameter '$name' value '$value' (not in regexp '$regexp')."
|
||||
fi
|
||||
fi
|
||||
eval $name=$value
|
||||
zaf_trc "$ITEM_KEY: Param $name set to $value"
|
||||
}
|
||||
|
||||
# Fetch url to stdout
|
||||
# $1 url
|
||||
# It supports real file, file:// and other schemes known by curl
|
||||
@@ -457,10 +493,35 @@ zaf_strunescape() {
|
||||
sed -e 's#\\\(['"$1"']\)#\1#g'
|
||||
}
|
||||
|
||||
|
||||
# Escape string on stdin
|
||||
# $1 - list of chars to escape
|
||||
zaf_strescape() {
|
||||
sed -e 's#\(['"$1"']\)#\\\1#g'
|
||||
}
|
||||
|
||||
# Add seconds to current date and return date in YYYY-MM-DD hh:mm:ss
|
||||
# $1 seconds
|
||||
zaf_date_add() {
|
||||
date -d "$1 seconds" "+%Y-%m-%d %H:%M:%S" 2>/dev/null || date -d "$(expr $(date +%s) + $1)" -D %s "+%Y-%m-%d %H:%M:%S"
|
||||
}
|
||||
|
||||
# Create temp file and return its name
|
||||
# $1 prefix or empty
|
||||
zaf_tmpfile() {
|
||||
echo "$ZAF_TMP_DIR/tmp$1"
|
||||
}
|
||||
|
||||
# return random number
|
||||
zaf_random() {
|
||||
hexdump -n 2 -e '/2 "%u"' /dev/urandom
|
||||
}
|
||||
|
||||
# Emulate sudo
|
||||
zaf_sudo() {
|
||||
if zaf_is_root || ! which sudo >/dev/null 2>/dev/null; then
|
||||
$@
|
||||
else
|
||||
sudo $@
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
34
lib/zafcache
Normal file
34
lib/zafcache
Normal file
@@ -0,0 +1,34 @@
|
||||
#!/bin/sh
|
||||
|
||||
. $(dirname $0)/preload.sh
|
||||
|
||||
help() {
|
||||
zaf_err "$0 seconds cmd..."
|
||||
}
|
||||
|
||||
seconds=$1
|
||||
shift
|
||||
[ -z "$*" ] && help
|
||||
|
||||
zaf_trc "zafcache($seconds): $ITEM_KEY,'$2' '$3' '$4' '$5' '$6' '$7' '$8' '$9'"
|
||||
|
||||
if [ -z "$ITEM_KEY" ]; then
|
||||
key=$(echo $*|tr ' ' '_')
|
||||
else
|
||||
key="$(echo ${ITEM_KEY}|cut -d '[' -f 1)[$(shift; echo $*|tr ' ' ',')]"
|
||||
fi
|
||||
|
||||
if ! zaf_fromcache "$key"; then
|
||||
zaf_fromcache "$key" >/dev/null 2>/dev/null
|
||||
[ $? -eq 3 ] && { zaf_err "Operation $key already in progress."; }
|
||||
if which at >/dev/null 2>/dev/null; then
|
||||
at -M now >/dev/null 2>/dev/null <<EOF
|
||||
. $(dirname $0)/preload.sh; tmpf=\$(zaf_tmpfile cache); $@ 2>"\$tmpf" | zaf_tocache_stdin "$key" "$seconds" ; [ -s \$tmpf ] && zaf_wrn <\$tmpf
|
||||
EOF
|
||||
else
|
||||
tmpf=$(zaf_tmpfile cache)
|
||||
$@ 2>"$tmpf" | zaf_tocache_stdin "$key" "$seconds"
|
||||
[ -s $tmpf ] && zaf_wrn <$tmpf
|
||||
fi
|
||||
fi
|
||||
|
||||
14
lib/zaflock
14
lib/zaflock
@@ -1,12 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /etc/zaf.conf
|
||||
|
||||
. ${ZAF_LIB_DIR}/zaf.lib.sh
|
||||
. $(dirname $0)/preload.sh
|
||||
|
||||
help() {
|
||||
echo "$0 key cmd"
|
||||
exit 2
|
||||
zaf_err "$0 key cmd"
|
||||
}
|
||||
|
||||
lkey="$1"
|
||||
@@ -16,7 +13,7 @@ shift
|
||||
[ -z "${ZAF_LOCK_SECONDS}" ] && seconds=5
|
||||
[ -z "${ZAF_LOCK_FORCE}" ] && force=1
|
||||
|
||||
lockfile="${ZAF_TMP_DIR}/zaflock_${lkey}"
|
||||
lockfile="/tmp/zaflock_${lkey}"
|
||||
i=0
|
||||
while [ -f "$lockfile" ] && [ $i -lt $seconds ]; do
|
||||
sleep 1
|
||||
@@ -31,7 +28,6 @@ if [ -f "$lockfile" ] && [ -z "$force" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
touch "$lockfile"
|
||||
[ -n "$*" ] && $@
|
||||
rm -f "$lockfile"
|
||||
[ -n "$*" ] && $@ 2>"$lockfile"
|
||||
[ -s "$lockfile" ] && zaf_wrn <"$lockfile"
|
||||
|
||||
|
||||
@@ -3,45 +3,56 @@
|
||||
# $1 - query string
|
||||
zaf_zbxapi_do() {
|
||||
local result
|
||||
zaf_trc "Zabbix API: $1"
|
||||
result=$(curl -s -f -L -X POST -H 'Content-Type: application/json-rpc' -d "$1" "$ZAF_ZBXAPI_URL")
|
||||
if [ $? = 0 ] && echo $result | grep -q '"result":'; then
|
||||
local query
|
||||
local tmpfile
|
||||
|
||||
tmpfile=$ZAF_TMP_DIR/zapi$$
|
||||
query="$1"
|
||||
zaf_trc "Zabbix API: $query"
|
||||
curl -s -f -L -X POST -H 'Content-Type: application/json-rpc' -d "$query" "$ZAF_ZBXAPI_URL" >$tmpfile
|
||||
if [ $? = 0 ] && $ZAF_LIB_DIR/JSON.sh -b <$tmpfile | grep -q '"result"'; then
|
||||
zaf_trc "API OK"
|
||||
echo $result
|
||||
cat $tmpfile
|
||||
rm -f $tmpfile
|
||||
else
|
||||
zaf_err "Error processing API request. ($?,$result)"
|
||||
zaf_err "Error processing API request. ($?,$tmpfile)"
|
||||
fi
|
||||
}
|
||||
# Call api function and cache results
|
||||
# $1 - query string
|
||||
zaf_zbxapi_do_cache() {
|
||||
local result
|
||||
local tmpfile
|
||||
local query
|
||||
|
||||
query="$(echo $1 | tr '\n' ' ')"
|
||||
tmpfile=$ZAF_TMP_DIR/zcapi$$
|
||||
if ! zaf_fromcache "$1"; then
|
||||
result=$(zaf_zbxapi_do "$1")
|
||||
[ -n "$result" ] && zaf_tocache "$1" "$result" 60
|
||||
echo $result
|
||||
zaf_zbxapi_do "$1" >$tmpfile
|
||||
[ -s "$tmpfile" ] && cat $tmpfile | zaf_tocache_stdin "$query" 60
|
||||
rm -f $tmpfile
|
||||
fi
|
||||
}
|
||||
|
||||
# Extract result from JSON response
|
||||
# Extract one result from JSON response
|
||||
zaf_zbxapi_getresult() {
|
||||
sed -e 's/\({"jsonrpc":"2.0","result":\)\(.*\),\("id":.*\)/\2/g' | sed -e 's/^\[\]$//'
|
||||
$ZAF_LIB_DIR/JSON.sh -b | grep '\["result"\]' | tr '\t' ' ' | cut -d ' ' -f 2-
|
||||
}
|
||||
|
||||
# Extract XML result from JSON response
|
||||
zaf_zbxapi_getxml() {
|
||||
zaf_zbxapi_getresult | sed -e 's/{"jsonrpc":"2.0","result":"//' | sed -e 's/","id"\:1}//' | zaf_zbxapi_getstring | zaf_strunescape '<">/'
|
||||
zaf_zbxapi_getstring | zaf_strunescape '</">' | zaf_far '\\n' "\n"
|
||||
}
|
||||
|
||||
# Extract string from JSON response result
|
||||
zaf_zbxapi_getstring() {
|
||||
sed -e 's/^"//' -e 's/"$//' -e 's/\\n/'\\n'/g'
|
||||
zaf_zbxapi_getresult | sed -e 's/^"//' -e 's/"$//'
|
||||
}
|
||||
|
||||
# Extract value from JSON response result
|
||||
# $1 key
|
||||
zaf_zbxapi_getvalue() {
|
||||
tr ',' '\n' | grep "\"$1\":" | cut -d '"' -f 4
|
||||
zaf_zbxapi_getvalues() {
|
||||
$ZAF_LIB_DIR/JSON.sh -b | grep '\["result",.*,"'$1'"]' | tr '\t' ' ' | cut -d ' ' -f 2- | sed -e 's/^"//' -e 's/"$//'
|
||||
}
|
||||
|
||||
# Zabbix API related functions
|
||||
@@ -68,7 +79,7 @@ zaf_zbxapi_login(){
|
||||
ZAF_ZBXAPI_URL=$(echo $ZAF_ZBXAPI_URL | cut -d '/' -f 1)//$ZAF_ZBXAPI_USER:$ZAF_ZBXAPI_PASS@$(echo $ZAF_ZBXAPI_URL | cut -d '/' -f 3-)
|
||||
fi
|
||||
result=$(zaf_zbxapi_do_cache "$authstr")
|
||||
ZAF_ZBXAPI_AUTH=$(echo $result |zaf_zbxapi_getresult| zaf_zbxapi_getstring)
|
||||
ZAF_ZBXAPI_AUTH=$(echo $result |zaf_zbxapi_getstring)
|
||||
[ -z "$ZAF_ZBXAPI_AUTH" ] && zaf_err "Cannot login into API"
|
||||
zaf_dbg "Logged into zabbix API ($ZAF_ZBXAPI_AUTH)"
|
||||
}
|
||||
@@ -102,7 +113,7 @@ zaf_zbxapi_get_object() {
|
||||
params='"params": {'$filter' "output":"'$output'"}';
|
||||
fi
|
||||
str='{ "method": "'$obj'.get", "jsonrpc": "2.0", "auth": "'$ZAF_ZBXAPI_AUTH'",'$params', "id": "'$id'" }'
|
||||
result=$(zaf_zbxapi_do_cache "$str" | zaf_zbxapi_getresult)
|
||||
result=$(zaf_zbxapi_do_cache "$str")
|
||||
[ -z "$result" ] && zaf_dbg "API call result empty or error! ($str)"
|
||||
echo $result
|
||||
}
|
||||
@@ -113,7 +124,7 @@ zaf_zbxapi_gethostgroupid() {
|
||||
|
||||
result=$(zaf_zbxapi_get_object "hostgroup" '"name": ["'$1'"]')
|
||||
[ -z "$result" ] && zaf_err "HostGroup $1 not found!"
|
||||
echo $result |zaf_zbxapi_getvalue groupid
|
||||
echo $result |zaf_zbxapi_getvalues groupid
|
||||
}
|
||||
|
||||
# $1 hostid
|
||||
@@ -126,7 +137,7 @@ zaf_zbxapi_gethost() {
|
||||
if [ -z "$2" ]; then
|
||||
echo $result
|
||||
else
|
||||
echo $result |zaf_zbxapi_getvalue $2
|
||||
echo $result |zaf_zbxapi_getvalues $2
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -136,7 +147,7 @@ zaf_zbxapi_gethostid() {
|
||||
|
||||
result=$(zaf_zbxapi_get_object "host" '"host": ["'$1'"]')
|
||||
[ -z "$result" ] && zaf_err "Host $1 not found!"
|
||||
echo $result |zaf_zbxapi_getvalue hostid
|
||||
echo $result |zaf_zbxapi_getvalues hostid
|
||||
}
|
||||
|
||||
# $1 hostname
|
||||
@@ -149,7 +160,7 @@ zaf_zbxapi_gethostinventory() {
|
||||
if [ -z "$2" ]; then
|
||||
echo $result
|
||||
else
|
||||
echo $result |zaf_zbxapi_getvalue $2
|
||||
echo $result |zaf_zbxapi_getvalues $2
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -159,7 +170,7 @@ zaf_zbxapi_gettemplateid() {
|
||||
|
||||
result=$(zaf_zbxapi_get_object "template" '"host": ["'$1'"]')
|
||||
[ -z "$result" ] && zaf_err "Template $1 not found!"
|
||||
echo $result |zaf_zbxapi_getvalue templateid
|
||||
echo $result |zaf_zbxapi_getvalues templateid
|
||||
}
|
||||
|
||||
# $1 templateid
|
||||
@@ -172,7 +183,7 @@ zaf_zbxapi_gettemplate() {
|
||||
if [ -z "$2" ]; then
|
||||
echo $result
|
||||
else
|
||||
echo $result |zaf_zbxapi_getvalue $2
|
||||
echo $result |zaf_zbxapi_getvalues $2
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -182,7 +193,7 @@ zaf_zbxapi_gethostsingroup() {
|
||||
|
||||
result=$(zaf_zbxapi_get_object "host" '' '"groupids": ["'$1'"]')
|
||||
[ -z "$result" ] && zaf_wrn "No hosts in groupid '$1'"
|
||||
echo $result | zaf_zbxapi_getvalue "hostid"
|
||||
echo $result | zaf_zbxapi_getvalues "hostid"
|
||||
}
|
||||
|
||||
# Get all hostids in system
|
||||
@@ -190,7 +201,7 @@ zaf_zbxapi_gethostids() {
|
||||
local result
|
||||
|
||||
result=$(zaf_zbxapi_get_object "host")
|
||||
echo $result | zaf_zbxapi_getvalue "hostid"
|
||||
echo $result | zaf_zbxapi_getvalues "hostid"
|
||||
}
|
||||
|
||||
# Get all templateids in system
|
||||
@@ -198,7 +209,7 @@ zaf_zbxapi_gettemplateids() {
|
||||
local result
|
||||
|
||||
result=$(zaf_zbxapi_get_object "template")
|
||||
echo $result | zaf_zbxapi_getvalue "templateid"
|
||||
echo $result | zaf_zbxapi_getvalues "templateid"
|
||||
}
|
||||
|
||||
# $1 hostgroupid
|
||||
@@ -207,7 +218,7 @@ zaf_zbxapi_gettemplatesingroup() {
|
||||
|
||||
result=$(zaf_zbxapi_get_object "template" '' '"groupids": ["'$1'"]')
|
||||
[ -z "$result" ] && zaf_wrn "No templates in groupid '$1'"
|
||||
echo $result | zaf_zbxapi_getvalue "templateid"
|
||||
echo $result | zaf_zbxapi_getvalues "templateid"
|
||||
}
|
||||
|
||||
# $1 map or null for all
|
||||
@@ -220,7 +231,7 @@ zaf_zbxapi_getmapid() {
|
||||
result=$(zaf_zbxapi_get_object "map")
|
||||
fi
|
||||
[ -z "$result" ] && zaf_err "Map $1 not found"
|
||||
echo $result | zaf_zbxapi_getvalue "sysmapid"
|
||||
echo $result | zaf_zbxapi_getvalues "sysmapid"
|
||||
}
|
||||
|
||||
# $1 mapid
|
||||
@@ -233,7 +244,7 @@ zaf_zbxapi_getmap() {
|
||||
if [ -z "$2" ]; then
|
||||
echo $result
|
||||
else
|
||||
echo $result |zaf_zbxapi_getvalue $2
|
||||
echo $result |zaf_zbxapi_getvalues $2
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user