From 2ffc186d68850500c116b17121cfca039896c9c7 Mon Sep 17 00:00:00 2001 From: Lukas Macura Date: Wed, 7 Dec 2016 14:25:34 +0100 Subject: [PATCH] Make scripts nicer by unexpand --- install.sh | 108 ++++++++-------- lib/JSON.sh | 324 +++++++++++++++++++++++----------------------- lib/ctrl.lib.sh | 114 ++++++++-------- lib/os.lib.sh | 90 ++++++------- lib/plugin.lib.sh | 8 +- lib/zaf.lib.sh | 134 +++++++++---------- lib/zbxapi.lib.sh | 232 ++++++++++++++++----------------- zaf | 36 +++--- 8 files changed, 523 insertions(+), 523 deletions(-) diff --git a/install.sh b/install.sh index b445701..07c67ed 100755 --- a/install.sh +++ b/install.sh @@ -16,7 +16,7 @@ fi # Lite version of zaf_fetch_url, full version will be loaded later zaf_fetch_url(){ if zaf_which curl >/dev/null 2>/dev/null; then - echo curl -f -k -s -L -o - "$1" >&2; + echo curl -f -k -s -L -o - "$1" >&2; curl -f -k -s -L -o - "$1" else wget --no-check-certificate -O - "$1" @@ -38,8 +38,8 @@ zaf_which() { # Lite version of zaf_err, full version will be loaded later zaf_err() { 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 + logger ${ZAF_LOG_STDERR} -p user.err -t zaf-error "Exiting with error!" + exit 1 } # Download tgz and extract to tmpdir @@ -59,12 +59,12 @@ zaf_get_option(){ local opt ZAF_HELP_OPTS="$ZAF_HELP_OPTS\n$1 $2 [$3]" - eval opt=\$C_$1 + eval opt=\$C_$1 if [ -n "$opt" ]; then - eval "$1='$opt'" - zaf_dbg "Got '$2' <$1> from CLI: $opt" - return - fi + eval "$1='$opt'" + zaf_dbg "Got '$2' <$1> from CLI: $opt" + return + fi eval opt=\$$1 if [ -n "$opt" ] && ! [ "$4" = "user" ]; then eval "$1='$opt'" @@ -180,7 +180,7 @@ zaf_configure_agent() { local options local changes - zaf_install_dir "$ZAF_AGENT_CONFIGD" + zaf_install_dir "$ZAF_AGENT_CONFIGD" echo -n >"$ZAF_AGENT_CONFIGD/zaf_options.conf" || zaf_err "Cannot access $ZAF_AGENT_CONFIGD/zaf_options.conf" ! [ -f "$ZAF_AGENT_CONFIG" ] && zaf_install "$ZAF_AGENT_CONFIG" for pair in "$@"; do @@ -208,7 +208,7 @@ zaf_configure_server() { local options local changes - zaf_install_dir "$ZAF_SERVER_CONFIGD" + zaf_install_dir "$ZAF_SERVER_CONFIGD" echo -n >"$ZAF_SERVER_CONFIGD/zaf_options.conf" || zaf_err "Cannot access $ZAF_SERVER_CONFIGD/zaf_options.conf" for pair in "$@"; do echo $pair | grep -q '^S\_' || continue # Skip non S_ vars @@ -229,12 +229,12 @@ zaf_configure_server() { zaf_preconfigure(){ [ -z "$ZAF_OS" ] && zaf_detect_system - zaf_os_specific zaf_preconfigure_os + zaf_os_specific zaf_preconfigure_os if ! zaf_is_root; then - [ -z "$INSTALL_PREFIX" ] && zaf_err "We are not root. Use INSTALL_PREFIX or become root." + [ -z "$INSTALL_PREFIX" ] && zaf_err "We are not root. Use INSTALL_PREFIX or become root." else [ "$1" != "reconf" ] && zaf_os_specific zaf_check_deps zaf && zaf_err "Zaf is installed as system package. Cannot install." - fi + fi } zaf_configure(){ @@ -263,7 +263,7 @@ zaf_configure(){ zaf_get_option ZAF_TMP_DIR "Tmp directory" "/tmp/" "$INSTALL_MODE" zaf_get_option ZAF_CACHE_DIR "Cache directory" "/tmp/zafc" "$INSTALL_MODE" zaf_get_option ZAF_LIB_DIR "Libraries directory" "/usr/lib/zaf" "$INSTALL_MODE" - zaf_get_option ZAF_BIN_DIR "Directory to put binaries" "/usr/bin" "$INSTALL_MODE" + zaf_get_option ZAF_BIN_DIR "Directory to put binaries" "/usr/bin" "$INSTALL_MODE" zaf_get_option ZAF_PLUGINS_DIR "Plugins directory" "${ZAF_LIB_DIR}/plugins" "$INSTALL_MODE" [ "${ZAF_GIT}" = 1 ] && zaf_get_option ZAF_REPO_GITURL "Git plugins repository" "https://github.com/limosek/zaf-plugins.git" "$INSTALL_MODE" zaf_get_option ZAF_PROXY "http proxy used by zaf" "" "$INSTALL_MODE" @@ -293,7 +293,7 @@ zaf_configure(){ zaf_err "Zabbix agent ($ZAF_AGENT_BIN) not installed? Use ZAF_AGENT_BIN env variable to specify location. Exiting." fi - [ -n "$INSTALL_PREFIX" ] && zaf_install_dir "/etc" + [ -n "$INSTALL_PREFIX" ] && zaf_install_dir "/etc" if ! [ -f "${ZAF_CFG_FILE}" ]; then touch "${ZAF_CFG_FILE}" || zaf_err "No permissions to ${ZAF_CFG_FILE}" fi @@ -307,7 +307,7 @@ zaf_configure(){ zaf_set_option ZAF_TMP_DIR "$ZAF_TMP_DIR" zaf_set_option ZAF_CACHE_DIR "$ZAF_CACHE_DIR" zaf_set_option ZAF_LIB_DIR "$ZAF_LIB_DIR" - zaf_set_option ZAF_BIN_DIR "$ZAF_BIN_DIR" + zaf_set_option ZAF_BIN_DIR "$ZAF_BIN_DIR" zaf_set_option ZAF_PLUGINS_DIR "$ZAF_PLUGINS_DIR" zaf_set_option ZAF_REPO_URL "$ZAF_REPO_URL" zaf_set_option ZAF_PROXY "$ZAF_PROXY" @@ -344,7 +344,7 @@ zaf_configure(){ fi if zaf_is_root; then - zaf_configure_agent $ZAF_AGENT_OPTIONS "$@" + zaf_configure_agent $ZAF_AGENT_OPTIONS "$@" zaf_add_zabbix_option "$ZAF_AGENT_CONFIG" "Include" "$ZAF_AGENT_CONFIGD" if [ -f "$ZAF_SERVER_BIN" ]; then zaf_configure_server $ZAF_SERVER_OPTIONS "$@" && zaf_add_zabbix_option "$ZAF_SERVER_CONFIG" "Include" "$ZAF_SERVER_CONFIGD" @@ -379,26 +379,26 @@ zaf_install_all() { done zaf_install_dir ${ZAF_PLUGINS_DIR} zaf_install_dir ${ZAF_PLUGINS_DIR} - zaf_install_dir ${ZAF_BIN_DIR} + zaf_install_dir ${ZAF_BIN_DIR} } zaf_postconfigure() { if zaf_is_root; then - ${INSTALL_PREFIX}/${ZAF_BIN_DIR}/zaf cache-clean - [ "${ZAF_GIT}" = 1 ] && ${INSTALL_PREFIX}/${ZAF_BIN_DIR}/zaf update - ${INSTALL_PREFIX}/${ZAF_BIN_DIR}/zaf reinstall zaf || zaf_err "Error installing zaf plugin." - ${INSTALL_PREFIX}/${ZAF_BIN_DIR}/zaf agent-config || zaf_err "Error configuring agent." - zaf_os_specific zaf_postconfigure_os - if zaf_is_root && ! zaf_test_item zaf.framework_version; then + ${INSTALL_PREFIX}/${ZAF_BIN_DIR}/zaf cache-clean + [ "${ZAF_GIT}" = 1 ] && ${INSTALL_PREFIX}/${ZAF_BIN_DIR}/zaf update + ${INSTALL_PREFIX}/${ZAF_BIN_DIR}/zaf reinstall zaf || zaf_err "Error installing zaf plugin." + ${INSTALL_PREFIX}/${ZAF_BIN_DIR}/zaf agent-config || zaf_err "Error configuring agent." + zaf_os_specific zaf_postconfigure_os + if zaf_is_root && ! zaf_test_item zaf.framework_version; then echo "Something is wrong with zabbix agent config." echo "Ensure that zabbix_agentd reads ${ZAF_AGENT_CONFIG}" echo "and there is Include=${ZAF_AGENT_CONFIGD} directive inside." echo "Does ${ZAF_AGENT_RESTART} work?" exit 1 - fi + fi else - [ "${ZAF_GIT}" = 1 ] && [ -n "${INSTALL_PREFIX}" ] && git clone "${ZAF_REPO_GITURL}" "${INSTALL_PREFIX}/${ZAF_REPO_DIR}" - fi + [ "${ZAF_GIT}" = 1 ] && [ -n "${INSTALL_PREFIX}" ] && git clone "${ZAF_REPO_GITURL}" "${INSTALL_PREFIX}/${ZAF_REPO_DIR}" + fi zaf_wrn "Install done. Use 'zaf' to get started." true } @@ -416,7 +416,7 @@ if ! [ -f README.md ]; then export https_proxy="$ZAF_PROXY" fi mkdir -p $ZAF_TMP_DIR - if ! zaf_which curl >/dev/null && ! zaf_which wget >/dev/null; + if ! zaf_which curl >/dev/null && ! zaf_which wget >/dev/null; then zaf_err "Curl or wget not found. Cannot continue. Please install it." fi @@ -457,11 +457,11 @@ zaf_tmp_init # Read options as config for ZAF for pair in "$@"; do - echo $pair | grep -q '^ZAF\_' || continue - option=$(echo $pair|cut -d '=' -f 1) - value=$(echo $pair|cut -d '=' -f 2-) - eval "C_${option}='$value'" - zaf_wrn "Overriding $option from cmdline." + echo $pair | grep -q '^ZAF\_' || continue + option=$(echo $pair|cut -d '=' -f 1) + value=$(echo $pair|cut -d '=' -f 2-) + eval "C_${option}='$value'" + zaf_wrn "Overriding $option from cmdline." done [ -z "$C_ZAF_TMP_DIR" ] && C_ZAF_TMP_DIR="/tmp/" if [ -n "$ZAF_PROXY" ]; then @@ -470,7 +470,7 @@ fi case $1 in interactive) - shift + shift INSTALL_MODE=interactive zaf_preconfigure zaf_configure "$@" @@ -478,52 +478,52 @@ interactive) zaf_postconfigure ;; auto) - shift + shift INSTALL_MODE=auto zaf_preconfigure zaf_configure "$@" - zaf_install_all + zaf_install_all zaf_postconfigure - ;; + ;; debug-auto) - shift; + shift; ZAF_DEBUG=4 INSTALL_MODE=auto zaf_preconfigure - zaf_configure "$@" + zaf_configure "$@" zaf_install_all zaf_postconfigure - ;; + ;; debug-interactive) - shift; - ZAF_DEBUG=4 + shift; + ZAF_DEBUG=4 INSTALL_MODE=interactive zaf_preconfigure zaf_configure "$@" zaf_install_all zaf_postconfigure - ;; + ;; debug) - shift; - ZAF_DEBUG=4 + shift; + ZAF_DEBUG=4 INSTALL_MODE=auto zaf_preconfigure zaf_configure "$@" zaf_install_all zaf_postconfigure - ;; + ;; reconf) - shift; - rm -f $ZAF_CFG_FILE + shift; + rm -f $ZAF_CFG_FILE INSTALL_MODE=auto zaf_preconfigure reconf zaf_configure "$@" zaf_postconfigure - ;; + ;; install) INSTALL_MODE=auto zaf_preconfigure nor - zaf_configure "$@" + zaf_configure "$@" zaf_install_all zaf_postconfigure ;; @@ -531,12 +531,12 @@ install) echo echo "Please specify how to install." echo "install.sh {auto|interactive|debug-auto|debug-interactive|reconf} [Agent-Options] [Zaf-Options]" - echo "scratch means that config file will be created from scratch" - echo " Agent-Options: Z_Option=value [...]" + echo "scratch means that config file will be created from scratch" + echo " Agent-Options: Z_Option=value [...]" echo " Server-Options: S_Option=value [...]" - echo " Zaf-Options: ZAF_OPT=value [...]" + echo " Zaf-Options: ZAF_OPT=value [...]" echo " To unset Agent-Option use Z_Option=''" - echo + echo echo "Example 1 (default install): install.sh auto" echo 'Example 2 (preconfigure agent options): install.sh auto Z_Server=zabbix.server Z_ServerActive=zabbix.server Z_Hostname=$(hostname)' echo 'Example 3 (preconfigure server options): install.sh auto S_StartPollers=10 S_ListenPort=10051' diff --git a/lib/JSON.sh b/lib/JSON.sh index d9b8056..6851394 100755 --- a/lib/JSON.sh +++ b/lib/JSON.sh @@ -1,8 +1,8 @@ #!/bin/sh throw() { - echo "$*" >&2 - exit 1 + echo "$*" >&2 + exit 1 } BRIEF=0 @@ -12,197 +12,197 @@ 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 + 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 + 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 + 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" + 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 + 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 -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 + 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:]]+' + 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 + # 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= - : + 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= - : + 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 + 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" - : + [ "$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 + 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 + parse_options "$@" + tokenize | parse fi # vi: expandtab sw=2 ts=2 diff --git a/lib/ctrl.lib.sh b/lib/ctrl.lib.sh index 039be6e..1218cc9 100644 --- a/lib/ctrl.lib.sh +++ b/lib/ctrl.lib.sh @@ -162,7 +162,7 @@ zaf_ctrl_sudo() { ! [ -d "$ZAF_SUDOERSD" ] && { zaf_wrn "$ZAF_SUDOERSD nonexistent! Skipping sudo install!"; return 1; } zaf_dbg "Installing sudoers entry $ZAF_SUDOERSD/zaf_$plugin" - [ -z "$sudo" ] && return # Nothing to install + [ -z "$sudo" ] && return # Nothing to install if ! zaf_which sudo >/dev/null; then zaf_wrn "Sudo needed bud not installed?" fi @@ -188,7 +188,7 @@ zaf_ctrl_cron() { pdir="$3" plugin=$1 cron=$(zaf_ctrl_get_global_option $2 "Cron") - [ -z "$cron" ] || [ -z "$ZAF_CROND" ] && return + [ -z "$cron" ] || [ -z "$ZAF_CROND" ] && return ! [ -d "$ZAF_CROND" ] && { zaf_wrn "$ZAF_CROND nonexistent! Skipping cron install!"; return 1; } zaf_dbg "Installing cron entry $ZAF_CROND/zaf_$plugin" [ -z "$cron" ] && return # Nothing to install @@ -212,12 +212,12 @@ zaf_ctrl_install() { binaries=$(zaf_ctrl_get_global_option $2 "Install-bin") for b in $binaries; do zaf_fetch_url "$1/$b" >"${ZAF_TMP_DIR}/$b" - zaf_install_bin "${ZAF_TMP_DIR}/$b" "$pdir" + zaf_install_bin "${ZAF_TMP_DIR}/$b" "$pdir" done files=$(zaf_ctrl_get_global_option $2 "Install-files") for f in $files; do zaf_fetch_url "$1/$b" >"${ZAF_TMP_DIR}/$b" - zaf_install "${ZAF_TMP_DIR}/$b" "$pdir" + zaf_install "${ZAF_TMP_DIR}/$b" "$pdir" done true ) || zaf_err "Error during zaf_ctrl_install" @@ -244,9 +244,9 @@ zaf_ctrl_generate_items_cfg() { tmpfile=$ZAF_TMP_DIR/gencfg$$ (set -e for i in $items; do - iscript=$(zaf_stripctrl $i) - zaf_ctrl_get_item_option $1 $i "Parameters" >$tmpfile - if [ -s "$tmpfile" ]; then + iscript=$(zaf_stripctrl $i) + zaf_ctrl_get_item_option $1 $i "Parameters" >$tmpfile + if [ -s "$tmpfile" ]; then ikey="$2.$i[*]" args="" apos=1; @@ -255,37 +255,37 @@ zaf_ctrl_generate_items_cfg() { args="$args \$$apos" apos=$(expr $apos + 1) done <$tmpfile - else + 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 + 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 + fi + cache=$(zaf_ctrl_get_item_option $1 $i "Cache") + if [ -n "$cache" ]; then cache="${ZAF_LIB_DIR}/zafcache '$cache' " - fi - cmd=$(zaf_ctrl_get_item_option $1 $i "Cmd") - if [ -n "$cmd" ]; then - 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 - ( 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 + fi + cmd=$(zaf_ctrl_get_item_option $1 $i "Cmd") + if [ -n "$cmd" ]; then + 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 + ( 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!" + 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 @@ -312,10 +312,10 @@ zaf_ctrl_generate_extitems_cfg() { tmpfile=$ZAF_TMP_DIR/gencfg$$ (set -e for i in $items; do - iscript=$(zaf_stripctrl $i) - zaf_ctrl_get_extitem_option $1 $i "Parameters" >$tmpfile - ikey="$2.$i" - if [ -s "$tmpfile" ]; then + iscript=$(zaf_stripctrl $i) + zaf_ctrl_get_extitem_option $1 $i "Parameters" >$tmpfile + ikey="$2.$i" + if [ -s "$tmpfile" ]; then args="" apos=1; while read pname pdefault pregex prest; do @@ -323,34 +323,34 @@ zaf_ctrl_generate_extitems_cfg() { args="$args \$$apos" apos=$(expr $apos + 1) done <$tmpfile - else + else 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_extitem_option $1 $i "Lock") - if [ -n "$lock" ]; then + 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_extitem_option $1 $i "Lock") + if [ -n "$lock" ]; then lock="${ZAF_LIB_DIR}/zaflock $lock " - fi - cache=$(zaf_ctrl_get_extitem_option $1 $i "Cache") - if [ -n "$cache" ]; then + fi + cache=$(zaf_ctrl_get_extitem_option $1 $i "Cache") + if [ -n "$cache" ]; then cache="${ZAF_LIB_DIR}/zafcache '$cache' " - fi - cmd=$(zaf_ctrl_get_extitem_option $1 $i "Cmd") - if [ -n "$cmd" ]; then + fi + cmd=$(zaf_ctrl_get_extitem_option $1 $i "Cmd") + if [ -n "$cmd" ]; then echo "#!/bin/sh" >${ZAF_SERVER_EXTSCRIPTS}/$ikey chmod +x ${ZAF_SERVER_EXTSCRIPTS}/$ikey - (printf "%s" "${env}${zafparams}${preload}${cache}${lock}${cmd}"; echo) >>${ZAF_SERVER_EXTSCRIPTS}/$ikey - continue - fi - cmd=$(zaf_ctrl_get_extitem_option $1 $i "Script") - if [ -n "$cmd" ]; then - echo "#!/bin/sh" >${ZAF_SERVER_EXTSCRIPTS}/$ikey + (printf "%s" "${env}${zafparams}${preload}${cache}${lock}${cmd}"; echo) >>${ZAF_SERVER_EXTSCRIPTS}/$ikey + continue + fi + cmd=$(zaf_ctrl_get_extitem_option $1 $i "Script") + if [ -n "$cmd" ]; then + echo "#!/bin/sh" >${ZAF_SERVER_EXTSCRIPTS}/$ikey chmod +x ${ZAF_SERVER_EXTSCRIPTS}/$ikey - (printf "%s" "${env}${zafparams}${preload}${cache}${lock}${cmd}"; echo) >>${ZAF_SERVER_EXTSCRIPTS}/$ikey - continue; - fi - zaf_err "External item $i declared in control file but has no Cmd, Function or Script!" + (printf "%s" "${env}${zafparams}${preload}${cache}${lock}${cmd}"; echo) >>${ZAF_SERVER_EXTSCRIPTS}/$ikey + continue; + fi + zaf_err "External item $i declared in control file but has no Cmd, Function or Script!" done ) || zaf_err "Error during zaf_ctrl_generate_extitems_cfg" rm -f $tmpfile diff --git a/lib/os.lib.sh b/lib/os.lib.sh index bde51ba..c1192e3 100644 --- a/lib/os.lib.sh +++ b/lib/os.lib.sh @@ -1,23 +1,23 @@ # Os related functions zaf_preconfigure_os_openwrt() { - ZAF_AGENT_RESTART="/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_AGENT_RESTART="/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_preconfigure_os_beesip() { - zaf_preconfigure_os_openwrt + zaf_preconfigure_os_openwrt } zaf_preconfigure_os_freebsd() { - ZAF_AGENT_PKG="zabbix3-agent" - ZAF_AGENT_CONFIG="/usr/local/etc/zabbix3/zabbix_agentd.conf" - 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_AGENT_PKG="zabbix3-agent" + ZAF_AGENT_CONFIG="/usr/local/etc/zabbix3/zabbix_agentd.conf" + 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_postconfigure_os_openwrt() { @@ -75,9 +75,9 @@ zaf_detect_system() { ZAF_OS="unknown" ZAF_OS_CODENAME="unknown" ZAF_AGENT_PKG="" - return - fi - fi + return + fi + fi fi fi } @@ -86,72 +86,72 @@ zaf_detect_system() { # $1 - name of the function. # all variants will be tested. (name_os_codename, name_os, name_{dpkg|opkg|rpm}, name ) zaf_os_specific(){ - local func="$1" - - if type "${func}_${ZAF_OS}_${ZAF_OS_CODENAME}" >/dev/null 2>/dev/null; then - eval "${func}_${ZAF_OS}_${ZAF_OS_CODENAME} $2 $3 $4 $5 $6" - else if type "${func}_${ZAF_OS}" >/dev/null 2>/dev/null; then - eval "${func}_${ZAF_OS} $2 $3 $4 $5 $6" - else if type "${func}_${ZAF_PKG}" >/dev/null 2>/dev/null; then - eval "${func}_${ZAF_PKG} $2 $3 $4 $5 $6" - else - zaf_dbg "No OS/packager specific implementation for $1" - fi - fi - fi + local func="$1" + + if type "${func}_${ZAF_OS}_${ZAF_OS_CODENAME}" >/dev/null 2>/dev/null; then + eval "${func}_${ZAF_OS}_${ZAF_OS_CODENAME} $2 $3 $4 $5 $6" + else if type "${func}_${ZAF_OS}" >/dev/null 2>/dev/null; then + eval "${func}_${ZAF_OS} $2 $3 $4 $5 $6" + else if type "${func}_${ZAF_PKG}" >/dev/null 2>/dev/null; then + eval "${func}_${ZAF_PKG} $2 $3 $4 $5 $6" + else + zaf_dbg "No OS/packager specific implementation for $1" + fi + fi + fi } zaf_is_root(){ - [ "$USER" = "root" ] || [ "$EUID" = "0" ] || [ -n "$ZAF_ISROOT" ] + [ "$USER" = "root" ] || [ "$EUID" = "0" ] || [ -n "$ZAF_ISROOT" ] } # Install file, bin or directory and respect install prefix # $1 - src file # $2 - directory zaf_install(){ - zaf_dbg "Install file $1 to $INSTALL_PREFIX/$2/$(basename $1)" - $ZAF_DO cp "$1" "$INSTALL_PREFIX/$2/$(basename $1)" || zaf_err "Cannot create file $INSTALL_PREFIX/$2/$(basename $1)!" + zaf_dbg "Install file $1 to $INSTALL_PREFIX/$2/$(basename $1)" + $ZAF_DO cp "$1" "$INSTALL_PREFIX/$2/$(basename $1)" || zaf_err "Cannot create file $INSTALL_PREFIX/$2/$(basename $1)!" } # $1 - src file # $2 - directory zaf_install_bin(){ - zaf_dbg "Install binary $1 to $INSTALL_PREFIX/$2/$(basename $1)" - $ZAF_DO cp "$1" "$INSTALL_PREFIX/$2/$(basename $1)" || zaf_err "Cannot create binary $INSTALL_PREFIX/$2/$(basename $1)!" - $ZAF_DO chmod +x "$INSTALL_PREFIX/$2/$(basename $1)" + zaf_dbg "Install binary $1 to $INSTALL_PREFIX/$2/$(basename $1)" + $ZAF_DO cp "$1" "$INSTALL_PREFIX/$2/$(basename $1)" || zaf_err "Cannot create binary $INSTALL_PREFIX/$2/$(basename $1)!" + $ZAF_DO chmod +x "$INSTALL_PREFIX/$2/$(basename $1)" } # $1 - directory zaf_install_dir(){ - zaf_dbg "Install directory $1 to $INSTALL_PREFIX/$1" - $ZAF_DO mkdir -p "$INSTALL_PREFIX/$1" || zaf_err "Cannot create directory $INSTALL_PREFIX/$1!" + zaf_dbg "Install directory $1 to $INSTALL_PREFIX/$1" + $ZAF_DO mkdir -p "$INSTALL_PREFIX/$1" || zaf_err "Cannot create directory $INSTALL_PREFIX/$1!" } # $1 - file zaf_touch(){ - zaf_dbg "Touch $INSTALL_PREFIX/$1" - $ZAF_DO touch "$INSTALL_PREFIX/$1" + zaf_dbg "Touch $INSTALL_PREFIX/$1" + $ZAF_DO touch "$INSTALL_PREFIX/$1" } # $1 - directory zaf_uninstall(){ - if [ -n "$INSTALL_PREFIX" ]; then - zaf_dbg "Removing $INSTALL_PREFIX/$1" + if [ -n "$INSTALL_PREFIX" ]; then + zaf_dbg "Removing $INSTALL_PREFIX/$1" $ZAF_DO rm -rf "$INSTALL_PREFIX/$1" - else + else zaf_dbg "Removing $1" $ZAF_DO rm -rf "$1" - fi + fi } # Automaticaly install agent on debian # For another os, create similar function (install_zabbix_centos) zaf_install_agent_debian() { - zaf_fetch_url "http://repo.zabbix.com/zabbix/3.0/debian/pool/main/z/zabbix-release/zabbix-release_3.0-1+${ZAF_OS_CODENAME}_all.deb" >"/tmp/zaf-installer/zabbix-release_3.0-1+${ZAF_OS_CODENAME}_all.deb" \ + zaf_fetch_url "http://repo.zabbix.com/zabbix/3.0/debian/pool/main/z/zabbix-release/zabbix-release_3.0-1+${ZAF_OS_CODENAME}_all.deb" >"/tmp/zaf-installer/zabbix-release_3.0-1+${ZAF_OS_CODENAME}_all.deb" \ && dpkg -i "/tmp/zaf-installer/zabbix-release_3.0-1+${ZAF_OS_CODENAME}_all.deb" \ && apt-get update \ && apt-get install -y -q $ZAF_AGENT_PKG } zaf_install_agent_opkg() { - opkg update && \ - opkg install $ZAF_AGENT_PKG + opkg update && \ + opkg install $ZAF_AGENT_PKG } # Check if dpkg dependency is met diff --git a/lib/plugin.lib.sh b/lib/plugin.lib.sh index f5ad9fd..1094896 100644 --- a/lib/plugin.lib.sh +++ b/lib/plugin.lib.sh @@ -19,7 +19,7 @@ zaf_get_plugin_url() { local url if [ "$(zaf_url_info $1)" = "path" ]; then - url="$1" # plugin with path - from directory + url="$1" # plugin with path - from directory else if [ "$(zaf_url_info $1)" = "url" ]; then url="$1" # plugin with http[s] url @@ -118,7 +118,7 @@ zaf_install_plugin() { zaf_ctrl_sudo "$plugin" "${control}" "${plugindir}" zaf_ctrl_cron "$plugin" "${control}" "${plugindir}" zaf_ctrl_generate_items_cfg "${control}" "${plugin}" \ - | zaf_far '{PLUGINDIR}' "${plugindir}" >${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf + | zaf_far '{PLUGINDIR}' "${plugindir}" >${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf zaf_dbg "Generated ${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf" zaf_ctrl_generate_extitems_cfg "${control}" "${plugin}" else @@ -146,7 +146,7 @@ zaf_postinstall_plugin() { zaf_ctrl_sudo "$plugin" "${control}" "${plugindir}" zaf_ctrl_cron "$plugin" "${control}" "${plugindir}" zaf_ctrl_generate_items_cfg "${control}" "${plugin}" \ - | zaf_far '{PLUGINDIR}' "${plugindir}" >${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf + | zaf_far '{PLUGINDIR}' "${plugindir}" >${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf zaf_dbg "Generated ${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf" zaf_ctrl_generate_extitems_cfg "${control}" "${plugin}" } @@ -306,7 +306,7 @@ zaf_test_item() { } zaf_precache_item() { - cmd=$(grep "^UserParameter=$item" $ZAF_AGENT_CONFIGD/zaf*.conf | cut -d ',' -f 2- | sed -e "s/_cache/_nocache/") + 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 } diff --git a/lib/zaf.lib.sh b/lib/zaf.lib.sh index 3c80791..fec646a 100644 --- a/lib/zaf.lib.sh +++ b/lib/zaf.lib.sh @@ -24,8 +24,8 @@ zaf_wrn() { } zaf_err() { 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 + logger ${ZAF_LOG_STDERR} -p user.err -t zaf-error "Exiting with error!" + exit 1 } # Help option # $1 - key @@ -75,7 +75,7 @@ zaf_agentparm(){ 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')." + echo "$value" | grep -qE "$regexp" || zaf_err "$ITEM_KEY: Bad parameter '$name' value '$value' (not in regexp '$regexp')." fi fi eval $name=$value @@ -116,7 +116,7 @@ zaf_fetch_url() { } # Get info about url -# returns path or url +# returns path or url zaf_url_info() { if echo "$1" | grep -q '^/'; then echo "path" @@ -131,41 +131,41 @@ zaf_url_info() { # Find and replace string zaf_far(){ - local f - local t - local sedcmd="sed" - i=1 - while [ "$i" -lt "$#" ]; - do - eval f=\$${i} - i=$(expr $i + 1) - eval t=\$${i} - i=$(expr $i + 1) - sedcmd="$sedcmd -e 's~$f~$t~g'" - done - eval $sedcmd + local f + local t + local sedcmd="sed" + i=1 + while [ "$i" -lt "$#" ]; + do + eval f=\$${i} + i=$(expr $i + 1) + eval t=\$${i} + i=$(expr $i + 1) + sedcmd="$sedcmd -e 's~$f~$t~g'" + done + eval $sedcmd } # Limit concurrent processes or continue zaf_bglimit(){ - local maxbg - local maxnumber - local cnumber - [ -z "$BASH_VERSION" ] && { zaf_dbg "Job server not available. Use bash!"; return 1; } - if [ $# -eq 0 ] ; then - maxbg=5 - else - maxbg=$1 - fi - maxnumber=$((0 + ${1:-0})) - while true; do - cnumber=$(jobs | wc -l) - if [ $cnumber -lt $maxnumber ]; then - break - fi - zaf_dbg "Limiting next job due to $maxbg limit of bg jobs" - sleep 1 - done + local maxbg + local maxnumber + local cnumber + [ -z "$BASH_VERSION" ] && { zaf_dbg "Job server not available. Use bash!"; return 1; } + if [ $# -eq 0 ] ; then + maxbg=5 + else + maxbg=$1 + fi + maxnumber=$((0 + ${1:-0})) + while true; do + cnumber=$(jobs | wc -l) + if [ $cnumber -lt $maxnumber ]; then + break + fi + zaf_dbg "Limiting next job due to $maxbg limit of bg jobs" + sleep 1 + done } # Initialises discovery function @@ -178,27 +178,27 @@ EOF # Add row(s) to discovery data zaf_discovery_add_row(){ - local rows - local row + local rows + local row - rows=$1 - row=$2 - shift;shift - echo " {" - while [ -n "$1" ]; do - echo -n ' "'$1'":"'$2'" ' - shift;shift - if [ -n "$1" ]; then + rows=$1 + row=$2 + shift;shift + echo " {" + while [ -n "$1" ]; do + echo -n ' "'$1'":"'$2'" ' + shift;shift + if [ -n "$1" ]; then echo "," - else + else echo "" - fi - done - if [ "$row" -lt "$rows" ]; then - echo " }," - else + fi + done + if [ "$row" -lt "$rows" ]; then + echo " }," + else echo " }" - fi + fi } # Dumps json object @@ -213,22 +213,22 @@ EOF # Arguments are name of variables to discovery. # Dumps json to stdout zaf_discovery(){ - local tmpfile - local rows - local a b c d e f g h i j row + local tmpfile + local rows + local a b c d e f g h i j row - tmpfile="${ZAF_TMP_DIR}/disc$$" - cat >$tmpfile - rows=$(wc -l <$tmpfile) - local a b c d e f g h i j; - zaf_discovery_begin - row=1 - while read a b c d e f g h i j; do - zaf_discovery_add_row "$rows" "$row" "$1" "${1:+${a}}" "$2" "${2:+${b}}" "$3" "${3:+${c}}" "$4" "${4:+${d}}" "$5" "${5:+${e}}" "$6" "${6:+${f}}" "$7" "${7:+${g}}" "$8" "${8:+${h}}" "$9" "${9:+${i}}" - row=$(expr $row + 1) - done <$tmpfile - zaf_discovery_end - rm -f $tmpfile + tmpfile="${ZAF_TMP_DIR}/disc$$" + cat >$tmpfile + rows=$(wc -l <$tmpfile) + local a b c d e f g h i j; + zaf_discovery_begin + row=1 + while read a b c d e f g h i j; do + zaf_discovery_add_row "$rows" "$row" "$1" "${1:+${a}}" "$2" "${2:+${b}}" "$3" "${3:+${c}}" "$4" "${4:+${d}}" "$5" "${5:+${e}}" "$6" "${6:+${f}}" "$7" "${7:+${g}}" "$8" "${8:+${h}}" "$9" "${9:+${i}}" + row=$(expr $row + 1) + done <$tmpfile + zaf_discovery_end + rm -f $tmpfile } ############################################ Zaf internal routines diff --git a/lib/zbxapi.lib.sh b/lib/zbxapi.lib.sh index 7bbe4e4..3d5f41e 100644 --- a/lib/zbxapi.lib.sh +++ b/lib/zbxapi.lib.sh @@ -10,7 +10,7 @@ zaf_zbxapi_do() { 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 + if [ $? = 0 ] && $ZAF_LIB_DIR/JSON.sh -b <$tmpfile | grep -q '"result"'; then zaf_trc "API OK" cat $tmpfile rm -f $tmpfile @@ -52,7 +52,7 @@ zaf_zbxapi_getstring() { # Extract value from JSON response result # $1 key zaf_zbxapi_getvalues() { - $ZAF_LIB_DIR/JSON.sh -b | grep '\["result",.*,"'$1'"]' | tr '\t' ' ' | cut -d ' ' -f 2- | sed -e 's/^"//' -e 's/"$//' + $ZAF_LIB_DIR/JSON.sh -b | grep '\["result",.*,"'$1'"]' | tr '\t' ' ' | cut -d ' ' -f 2- | sed -e 's/^"//' -e 's/"$//' } # Zabbix API related functions @@ -66,17 +66,17 @@ zaf_zbxapi_login(){ [ -z "$ZAF_ZBXAPI_URL" ] || [ -z "$ZAF_ZBXAPI_USER" ] || [ -z "$ZAF_ZBXAPI_PASS" ] && zaf_err "Zabbix Api parameters not set! Set ZAF_ZBXAPI_URL, ZAF_ZBXAPI_USER and ZAF_ZBXAPI_PASS and try again." authstr='{ - "method" : "user.login", - "params" : { - "password" : "'$ZAF_ZBXAPI_PASS'", - "user" : "'$ZAF_ZBXAPI_USER'" - }, - "id" : 0, - "jsonrpc" : "2.0" + "method" : "user.login", + "params" : { + "password" : "'$ZAF_ZBXAPI_PASS'", + "user" : "'$ZAF_ZBXAPI_USER'" + }, + "id" : 0, + "jsonrpc" : "2.0" }' if [ "$ZAF_ZBXAPI_AUTHTYPE" = "http" ] ; then - 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-) + 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_getstring) @@ -122,9 +122,9 @@ zaf_zbxapi_get_object() { zaf_zbxapi_gethostgroupid() { local result - result=$(zaf_zbxapi_get_object "hostgroup" '"name": ["'$1'"]') - [ -z "$result" ] && zaf_err "HostGroup $1 not found!" - echo $result |zaf_zbxapi_getvalues groupid + result=$(zaf_zbxapi_get_object "hostgroup" '"name": ["'$1'"]') + [ -z "$result" ] && zaf_err "HostGroup $1 not found!" + echo $result |zaf_zbxapi_getvalues groupid } # $1 hostid @@ -132,10 +132,10 @@ zaf_zbxapi_gethostgroupid() { zaf_zbxapi_gethost() { local result - result=$(zaf_zbxapi_get_object "host" '' '"hostids": ["'$1'"]' 'extend') - [ -z "$result" ] && zaf_err "Hostid $1 not found!" - if [ -z "$2" ]; then - echo $result + result=$(zaf_zbxapi_get_object "host" '' '"hostids": ["'$1'"]' 'extend') + [ -z "$result" ] && zaf_err "Hostid $1 not found!" + if [ -z "$2" ]; then + echo $result else echo $result |zaf_zbxapi_getvalues $2 fi @@ -145,9 +145,9 @@ zaf_zbxapi_gethost() { zaf_zbxapi_gethostid() { local result - result=$(zaf_zbxapi_get_object "host" '"host": ["'$1'"]') - [ -z "$result" ] && zaf_err "Host $1 not found!" - echo $result |zaf_zbxapi_getvalues hostid + result=$(zaf_zbxapi_get_object "host" '"host": ["'$1'"]') + [ -z "$result" ] && zaf_err "Host $1 not found!" + echo $result |zaf_zbxapi_getvalues hostid } # $1 hostname @@ -155,10 +155,10 @@ zaf_zbxapi_gethostid() { zaf_zbxapi_gethostinventory() { local result - result=$(zaf_zbxapi_get_object "host" '"host": ["'$1'"]' '"withInventory": "true", "selectInventory": "extend"') - [ -z "$result" ] && zaf_err "Host $1 not found!" + result=$(zaf_zbxapi_get_object "host" '"host": ["'$1'"]' '"withInventory": "true", "selectInventory": "extend"') + [ -z "$result" ] && zaf_err "Host $1 not found!" if [ -z "$2" ]; then - echo $result + echo $result else echo $result |zaf_zbxapi_getvalues $2 fi @@ -168,9 +168,9 @@ zaf_zbxapi_gethostinventory() { zaf_zbxapi_gettemplateid() { local result - result=$(zaf_zbxapi_get_object "template" '"host": ["'$1'"]') - [ -z "$result" ] && zaf_err "Template $1 not found!" - echo $result |zaf_zbxapi_getvalues templateid + result=$(zaf_zbxapi_get_object "template" '"host": ["'$1'"]') + [ -z "$result" ] && zaf_err "Template $1 not found!" + echo $result |zaf_zbxapi_getvalues templateid } # $1 templateid @@ -178,10 +178,10 @@ zaf_zbxapi_gettemplateid() { zaf_zbxapi_gettemplate() { local result - result=$(zaf_zbxapi_get_object "template" '' '"templateids": ["'$1'"]' 'extend') - [ -z "$result" ] && zaf_err "Templateid $1 not found!" - if [ -z "$2" ]; then - echo $result + result=$(zaf_zbxapi_get_object "template" '' '"templateids": ["'$1'"]' 'extend') + [ -z "$result" ] && zaf_err "Templateid $1 not found!" + if [ -z "$2" ]; then + echo $result else echo $result |zaf_zbxapi_getvalues $2 fi @@ -191,34 +191,34 @@ zaf_zbxapi_gettemplate() { zaf_zbxapi_gethostsingroup() { local result - result=$(zaf_zbxapi_get_object "host" '' '"groupids": ["'$1'"]') - [ -z "$result" ] && zaf_wrn "No hosts in groupid '$1'" - echo $result | zaf_zbxapi_getvalues "hostid" + result=$(zaf_zbxapi_get_object "host" '' '"groupids": ["'$1'"]') + [ -z "$result" ] && zaf_wrn "No hosts in groupid '$1'" + echo $result | zaf_zbxapi_getvalues "hostid" } # Get all hostids in system zaf_zbxapi_gethostids() { local result - result=$(zaf_zbxapi_get_object "host") - echo $result | zaf_zbxapi_getvalues "hostid" + result=$(zaf_zbxapi_get_object "host") + echo $result | zaf_zbxapi_getvalues "hostid" } # Get all templateids in system zaf_zbxapi_gettemplateids() { local result - result=$(zaf_zbxapi_get_object "template") - echo $result | zaf_zbxapi_getvalues "templateid" + result=$(zaf_zbxapi_get_object "template") + echo $result | zaf_zbxapi_getvalues "templateid" } # $1 hostgroupid zaf_zbxapi_gettemplatesingroup() { local result - result=$(zaf_zbxapi_get_object "template" '' '"groupids": ["'$1'"]') - [ -z "$result" ] && zaf_wrn "No templates in groupid '$1'" - echo $result | zaf_zbxapi_getvalues "templateid" + result=$(zaf_zbxapi_get_object "template" '' '"groupids": ["'$1'"]') + [ -z "$result" ] && zaf_wrn "No templates in groupid '$1'" + echo $result | zaf_zbxapi_getvalues "templateid" } # $1 map or null for all @@ -226,12 +226,12 @@ zaf_zbxapi_getmapid() { local result if [ -n "$1" ]; then - result=$(zaf_zbxapi_get_object "map" '"name": ["'$1'"]') + result=$(zaf_zbxapi_get_object "map" '"name": ["'$1'"]') else - result=$(zaf_zbxapi_get_object "map") + result=$(zaf_zbxapi_get_object "map") fi - [ -z "$result" ] && zaf_err "Map $1 not found" - echo $result | zaf_zbxapi_getvalues "sysmapid" + [ -z "$result" ] && zaf_err "Map $1 not found" + echo $result | zaf_zbxapi_getvalues "sysmapid" } # $1 mapid @@ -239,10 +239,10 @@ zaf_zbxapi_getmapid() { zaf_zbxapi_getmap() { local result - result=$(zaf_zbxapi_get_object "map" '' '"sysmapids": ["'$1'"]' 'extend') - [ -z "$result" ] && zaf_err "Mapid $1 not found" - if [ -z "$2" ]; then - echo $result + result=$(zaf_zbxapi_get_object "map" '' '"sysmapids": ["'$1'"]' 'extend') + [ -z "$result" ] && zaf_err "Mapid $1 not found" + if [ -z "$2" ]; then + echo $result else echo $result |zaf_zbxapi_getvalues $2 fi @@ -261,18 +261,18 @@ zaf_zbxapi_export_object(){ bkpstr=' { - "method": "configuration.export", - "jsonrpc": "2.0", - "params": { - "options": { - "'$obj'": [ - "'$id'" - ] - }, - "format": "xml" - }, - "auth": "'$ZAF_ZBXAPI_AUTH'", - "id": 1 + "method": "configuration.export", + "jsonrpc": "2.0", + "params": { + "options": { + "'$obj'": [ + "'$id'" + ] + }, + "format": "xml" + }, + "auth": "'$ZAF_ZBXAPI_AUTH'", + "id": 1 }' zaf_zbxapi_do_cache "$bkpstr" | zaf_zbxapi_getxml } @@ -303,67 +303,67 @@ zaf_zbxapi_import_config(){ local impstr if [ -z "$1" ]; then - xmlstr=$(zaf_strescape '"') + xmlstr=$(zaf_strescape '"') else - ! [ -f "$1" ] && return 1 - xmlstr=$(zaf_strescape '"\n\r' <$1) + ! [ -f "$1" ] && return 1 + xmlstr=$(zaf_strescape '"\n\r' <$1) fi impstr=' { - "method": "configuration.import", - "jsonrpc": "2.0", - "params": { - "format": "xml", - "rules": { - "applications": { - "createMissing": true, - "updateExisting": true - }, - "discoveryRules": { - "createMissing": true, - "updateExisting": true - }, - "graphs": { - "createMissing": true, - "updateExisting": true - }, - "hosts": { - "createMissing": true, - "updateExisting": true - }, - "items": { - "createMissing": true, - "updateExisting": true - }, - "templates": { - "createMissing": true, - "updateExisting": true - }, - "triggers": { - "createMissing": true, - "updateExisting": true - }, - "maps": { - "createMissing": true, - "updateExisting": true - }, - "screens": { - "createMissing": true, - "updateExisting": true - }, - "items": { - "createMissing": true, - "updateExisting": true - }, - "valueMaps": { - "createMissing": true, - "updateExisting": true - } - }, + "method": "configuration.import", + "jsonrpc": "2.0", + "params": { + "format": "xml", + "rules": { + "applications": { + "createMissing": true, + "updateExisting": true + }, + "discoveryRules": { + "createMissing": true, + "updateExisting": true + }, + "graphs": { + "createMissing": true, + "updateExisting": true + }, + "hosts": { + "createMissing": true, + "updateExisting": true + }, + "items": { + "createMissing": true, + "updateExisting": true + }, + "templates": { + "createMissing": true, + "updateExisting": true + }, + "triggers": { + "createMissing": true, + "updateExisting": true + }, + "maps": { + "createMissing": true, + "updateExisting": true + }, + "screens": { + "createMissing": true, + "updateExisting": true + }, + "items": { + "createMissing": true, + "updateExisting": true + }, + "valueMaps": { + "createMissing": true, + "updateExisting": true + } + }, "source": "'$xmlstr'" - }, - "auth": "'$ZAF_ZBXAPI_AUTH'", - "id": 3 + }, + "auth": "'$ZAF_ZBXAPI_AUTH'", + "id": 3 }' zaf_zbxapi_do "$impstr" | zaf_zbxapi_getresult | grep -q true } diff --git a/zaf b/zaf index d662172..76586c8 100755 --- a/zaf +++ b/zaf @@ -11,14 +11,14 @@ ZAF_CFG_FILE="/etc/zaf.conf" # Read options as config for ZAF for pair in "$@"; do - if echo $pair | grep -qE '^ZAF\_(.*)='; then - option=$(echo $pair|cut -d '=' -f 1) - value=$(echo $pair|cut -d '=' -f 2-) - eval "${option}='$value'" + if echo $pair | grep -qE '^ZAF\_(.*)='; then + option=$(echo $pair|cut -d '=' -f 1) + value=$(echo $pair|cut -d '=' -f 2-) + eval "${option}='$value'" export secondstage=1 - else + else params="$params $pair" - fi + fi done export $(set |grep ^ZAF_ | cut -d '=' -f 1) # If some variables in cmd were stripped, rerun only with right arguments and exported variables @@ -86,7 +86,7 @@ userparms) plugindir=$ZAF_PLUGINS_DIR/$plugin control=$plugindir/control.zaf zaf_ctrl_generate_items_cfg "${control}" "${plugin}" "noscripts" \ - | zaf_far '{PLUGINDIR}' "${plugindir}" + | zaf_far '{PLUGINDIR}' "${plugindir}" done ;; agent-config) @@ -102,10 +102,10 @@ agent-config) for plugin in $(zaf_list_plugins); do plugindir=$ZAF_PLUGINS_DIR/$plugin control=$plugindir/control.zaf - if ! [ -f "${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf" ] || [ "$control" -nt "${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf" ] || [ -n "$force" ]; then + if ! [ -f "${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf" ] || [ "$control" -nt "${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf" ] || [ -n "$force" ]; then zaf_dbg "Generating ${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf" zaf_ctrl_generate_items_cfg "${control}" "${plugin}" \ - | zaf_far '{PLUGINDIR}' "${plugindir}" >${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf + | zaf_far '{PLUGINDIR}' "${plugindir}" >${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf fi done ;; @@ -264,23 +264,23 @@ self-remove) zaf_os_specific zaf_check_deps zaf && zaf_err "Zaf is installed as system package. Cannot self-remove." . /etc/zaf.conf if [ "$1" = "force" ]; then - rm -rf /etc/zaf.conf ${ZAF_PLUGINS_DIR} ${ZAF_REPO_DIR} ${ZAF_LIB_DIR} \ - ${ZAF_BIN_DIR}/zaf ${ZAF_AGENT_CONFIGD}/zaf_* + rm -rf /etc/zaf.conf ${ZAF_PLUGINS_DIR} ${ZAF_REPO_DIR} ${ZAF_LIB_DIR} \ + ${ZAF_BIN_DIR}/zaf ${ZAF_AGENT_CONFIGD}/zaf_* else - echo "This will remove zaf from this computer and erase all configuration." - echo "This command will be executed:" - echo "rm -rf /etc/zaf.conf ${ZAF_PLUGINS_DIR} ${ZAF_REPO_DIR} ${ZAF_LIB_DIR} \ + echo "This will remove zaf from this computer and erase all configuration." + echo "This command will be executed:" + echo "rm -rf /etc/zaf.conf ${ZAF_PLUGINS_DIR} ${ZAF_REPO_DIR} ${ZAF_LIB_DIR} \ ${ZAF_BIN_DIR}/zaf ${ZAF_AGENT_CONFIGD}/zaf_*" - echo - echo "To continue, please do $0 self-remove force" + echo + echo "To continue, please do $0 self-remove force" fi - ;; + ;; ###### API related commands api) zaf_zbxapi_login case $2 in get-*-id) - obj=$(echo $2|cut -d '-' -f 2) + obj=$(echo $2|cut -d '-' -f 2) [ -z "$3" ] && zaf_err "$0 $1 $2 <$obj>" eval zaf_zbxapi_get${obj}id "$3" ;;