#!/bin/sh if [ -z "$secondstage" ]; then ZAF_CFG_FILE="/etc/zaf.conf" if [ -f $ZAF_CFG_FILE ]; then . $ZAF_CFG_FILE else echo "Missing config file $ZAF_CFG_FILE! Exiting." exit 2 fi # 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'" export secondstage=1 else params="$params $pair" 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 [ -n "$secondstage" ] && exec $0 $params fi export ZAF_BIN=$(realpath $0) if [ -n "$ZAF_PROXY" ]; then export ALL_PROXY="$ZAF_PROXY" export http_proxy="$ZAF_PROXY" export https_proxy="$ZAF_PROXY" fi if [ -f ./lib/zaf.lib.sh ]; then . ./lib/zaf.lib.sh . ./lib/plugin.lib.sh . ./lib/os.lib.sh . ./lib/ctrl.lib.sh . ./lib/cache.lib.sh . ./lib/zbxapi.lib.sh [ -f ./lib/zaf.${ZAF_OS}.sh ] && . ./lib/zaf.${ZAF_OS}.sh else . ${ZAF_LIB_DIR}/zaf.lib.sh . ${ZAF_LIB_DIR}/plugin.lib.sh . ${ZAF_LIB_DIR}/os.lib.sh . ${ZAF_LIB_DIR}/ctrl.lib.sh . ${ZAF_LIB_DIR}/cache.lib.sh . ${ZAF_LIB_DIR}/zbxapi.lib.sh [ -f ${ZAF_LIB_DIR}/zaf.${ZAF_OS}.sh ] && . ${ZAF_LIB_DIR}/zaf.${ZAF_OS}.sh fi zaf_debug_init stderr zaf_tmp_init zaf_cache_init case $1 in cache-clean) zaf_cache_clean ;; cache-list) zaf_cache_list ;; cache-test1) for i in test1 test2 test3; do echo "To cache:" echo "$i" | zaf_tocache_stdin "test" 10 done ;; cache-test2) for i in test1 test2 test3; do echo "From cache:" zaf_fromcache "test" done ;; version) echo "$ZAF_VERSION" [ $ZAF_DEBUG -gt 1 ] && set |grep -E ^ZAF_ ;; ###### Agent related commands userparms) for plugin in $(zaf_list_plugins); do plugindir=$ZAF_PLUGINS_DIR/$plugin control=$plugindir/control.zaf zaf_ctrl_generate_items_cfg "${control}" "${plugin}" "noscripts" \ | zaf_far '{PLUGINDIR}' "${plugindir}" done ;; agent-config) [ -n "$2" ] && force=yes for p in $(zaf_list_plugins); do if [ -f "$ZAF_PLUGINS_DIR/$p/postinst.need" ]; then zaf_wrn "Calling postinstalation of plugin $p" zaf_postinstall_plugin $p && rm -f "$ZAF_PLUGINS_DIR/$p/postinst.need" force=yes fi done zaf_wrn "Generating config files in $ZAF_AGENT_CONFIGD ..." 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 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 fi done ;; server-config) zaf_wrn "Not implemented yet" ;; ###### Plugins related commands update) zaf_wrn "Updating repository ${ZAF_REPO_GITURL}..." zaf_update_repo ;; upgrade) ZAF_DEBUG=$ZAF_DEBUG $0 reinstall $(zaf_list_plugins) ;; show) shift; if [ -z "$1" ]; then zaf_list_plugins | while read plugin; do zaf_plugin_info $ZAF_PLUGINS_DIR/$plugin/control.zaf done else if echo $1 | grep -vq "\."; then if zaf_list_plugins | grep -q "^$1"; then zaf_is_plugin $1 && zaf_plugin_info $ZAF_PLUGINS_DIR/$1/control.zaf || zaf_err "Plugin $1 not installed." else if echo $1 |grep -q ^http; then zaf_prepare_plugin "$1" "$ZAF_TMP_DIR/plugin" zaf_plugin_info "$ZAF_TMP_DIR/plugin/control.zaf" else zaf_err "Plugin $1 not installed." fi fi else zaf_item_info "$1" fi fi ;; plugins) zaf_list_plugins ;; items) shift if [ -z "$1" ]; then zaf_list_items else zaf_list_plugin_items "$1" fi ;; test) [ "$USER" != "zabbix" ] && zaf_wrn "You are not zabbix user. Test will be run with your privileges and sudo access!" shift if echo $1|grep -q '\.'; then zaf_test_item "$1" exit fi if [ -n "$1" ]; then plugins="$@" else plugins="$(zaf_list_plugins)" fi for p in $plugins; do ! zaf_is_plugin $p && zaf_err "Unknown plugin $p" for i in $(zaf_list_plugin_items $p test); do zaf_test_item $i echo done done ;; itemsh) shift if zaf_is_item "$1"; then plugin=$(zaf_get_plugin_name "$1") item=$(zaf_get_item_name "$1") params=$(zaf_get_item_params "$1") params2=$(zaf_paramstosh "[$params]") script=$(zaf_ctrl_generate_items_cfg "${ZAF_PLUGINS_DIR}/${plugin}/control.zaf" "${plugin}" "" "sh -i #"| grep "UserParameter=$plugin.$item" | cut -d ',' -f 2-) exec sh -c "$script" dummy $params2 else zaf_err "No such plugin/item $1" fi ;; run) shift if zaf_is_item "$1"; then plugin=$(zaf_get_plugin_name "$1") item=$(zaf_get_item_name "$1") params=$(zaf_get_item_params "$1") params2=$(zaf_paramstosh "[$params]") script=$(zaf_ctrl_generate_items_cfg "${ZAF_PLUGINS_DIR}/${plugin}/control.zaf" "${plugin}" | grep "UserParameter=$plugin.$item" | cut -d ',' -f 2-) exec sh -c "$script" dummy $params2 else zaf_err "No such plugin/item $1" fi ;; get) shift if zaf_is_item "$1"; then zaf_get_item "$1" exit fi if [ -n "$1" ]; then plugins="$@" else plugins="$(zaf_list_plugins)" fi for p in $plugins; do for i in $(zaf_list_plugin_items $p test); do echo $i: $(zaf_get_item $i) echo done done ;; send) shift if [ -z "$1" ]; then # No parameters - pipe to zabbix_sender zaf_dbg "Waiting for data on stdin (host item value) per line" zscmd="zabbix_sender -z '$ZAF_ZBXSRV_HOST' -p '$ZAF_ZBXSRV_PORT' -i -" zaf_dbg $zscmd eval $zscmd exit else if [ -n "$2" ]; then # Hostname as parameter - rerun with right hostname set exec $0 send "$2" "$3" ZAF_HOSTNAME="$1" else if echo "$1" | grep -q ':'; then # Hostname:item - rerun with right hostname set exec $0 send "$(echo $1 |cut -d ':' -f 2-)" "$3" ZAF_HOSTNAME="$(echo $1 |cut -d ':' -f 1)" fi if zaf_is_item "$1"; then # Item supported by zaf plugin=$(zaf_get_plugin_name "$1") item=$(zaf_get_item_name "$1") zscmd="zabbix_sender -z '$ZAF_ZBXSRV_HOST' -p '$ZAF_ZBXSRV_PORT' -s '$(zaf_hostname)' -k '$plugin.$item' -o '$(zaf_run_item $1)'" zaf_dbg $zscmd eval $zscmd exit else if echo $1 | grep -q '='; then item=$(echo $1 | cut -d '=' -f 1) value=$(echo $1 | cut -d '=' -f 2-) else item=$1 zaf_dbg "Waiting for value of $(zaf_hostname):$1 on stdin" value=$(cat) fi zscmd="zabbix_sender -z '$ZAF_ZBXSRV_HOST' -p '$ZAF_ZBXSRV_PORT' -s '$(zaf_hostname)' -k '$item' -o '$value'" zaf_dbg $zscmd eval $zscmd exit fi fi fi ;; register) shift if [ -z "$1" ]; then hostname=$(zaf_hostname) else hostname="$1" if [ -z "$2" ]; then metadata="ZAF" else metadata="$2" fi fi zaf_register "$hostname" "$metadata" exit; ;; precache) shift for i in $*; do if zaf_is_plugin $i; then for j in $(zaf_list_plugin_items $i precache); do item=$(echo $j | cut -d '[' -f 1) params=$(echo $j | cut -d '[' -f 2 | cut -d ']' -f 1 | tr ',' ' ') zaf_precache_item $params >/dev/null done else item=$(echo $i | cut -d '[' -f 1) params=$(echo $i | cut -d '[' -f 2 | cut -d ']' -f 1 | tr ',' ' ') zaf_precache_item $params >/dev/null fi done ;; install) shift [ -z "$1" ] && echo "$0 install plugin [plugin]..." for p in $@; do if zaf_is_plugin "$(basename $p)"; then zaf_wrn "Plugin $(basename $p) already installed. Skipping installation." continue fi zaf_install_plugin "$p" installed=1 done [ -n "$installed" ] && zaf_is_root && zaf_restart_agent ;; reinstall) shift [ -z "$1" ] && echo "$0 reinstall plugin [plugin]..." for p in $@; do if zaf_is_plugin "$p"; then params=$(zaf_get_plugin_parameters $p) for param in $params; do eval export ZAF_${p}_${param}=$(zaf_get_plugin_parameter "${ZAF_PLUGINS_DIR}/${p}" $param) zaf_dbg "Saving ZAF_${p}_${param}" done zaf_remove_plugin "$p" reinstalled=1 fi zaf_install_plugin "$p" reinstalled=1 done [ -n "$reinstalled" ] && zaf_is_root && zaf_restart_agent ;; remove|uninstall) shift [ -z "$1" ] && echo "$0 remove plugin [plugin]..." for p in $@; do if zaf_is_plugin "$p"; then zaf_remove_plugin "$p" removed=1 fi done [ -n "$removed" ] && zaf_is_root && zaf_restart_agent ;; plugin-set) plugin="$2" param="$3" value="$4" if [ -z "$plugin" ] || [ -z "$param" ]; then zaf_err "$0 plugin-set plugin parameter value" else if zaf_is_plugin "$plugin"; then plugindir="${ZAF_PLUGINS_DIR}/${plugin}" zaf_set_plugin_parameter "$plugindir" "$param" "$value" else zaf_err "Plugin $plugin is not installed." fi fi ;; ###### Zaf related commands self-upgrade) shift [ -z "$1" ] && auto=auto zaf_os_specific zaf_check_deps zaf && zaf_err "Zaf is installed as system package. Cannot self-upgrade." if ! zaf_which curl >/dev/null; then zaf_err "Curl not found. Cannot continue. Please install it." fi zaf_fetch_url $ZAF_RAW_URL/$ZAF_GITBRANCH/install.sh | exec sh -s $auto "$@" exit ;; self-remove) shift 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_* 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} \ ${ZAF_BIN_DIR}/zaf ${ZAF_AGENT_CONFIGD}/zaf_*" 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) [ -z "$3" ] && zaf_err "$0 $1 $2 <$obj>" eval zaf_zbxapi_get${obj}id "$3" ;; get-byid-*|get-id-*) obj=$(echo $2|cut -d '-' -f 3) [ -z "$3" ] && zaf_err "$0 $1 $2 " eval zaf_zbxapi_get${obj} "$3" "$4" ;; get-host-ids) if [ -n "$3" ]; then gid=$(zaf_zbxapi_gethostgroupid "$3") || exit 1 zaf_dbg "Selecting all hosts in group $3($gid)" zaf_zbxapi_gethostsingroup $gid else zaf_dbg "Selecting all hosts in system" zaf_zbxapi_gethostids fi ;; get-inventory) [ -z "$3" ] && zaf_err "$0 $1 field [host]. If host unspecified, use hostname" if [ -z "$4" ]; then host=$(hostname) else host="$4" fi zaf_zbxapi_gethostinventory $host $3 ;; get-template-ids) if [ -n "$3" ]; then gid=$(zaf_zbxapi_gethostgroupid "$3") || exit 1 zaf_dbg "Selecting all templates in group $3($gid)" zaf_zbxapi_gettemplatesingroup $gid else zaf_dbg "Selecting all templates in system" zaf_zbxapi_gettemplateids fi ;; get-map-ids) zaf_zbxapi_getmapid ;; export-hosts) shift; shift [ -z "$1" ] && zaf_err "$0 api export-hosts dir [hostgroup]" dir="$1" shift if [ -n "$1" ]; then gid=$(zaf_zbxapi_gethostgroupid "$1") || exit 1 shift hosts=$(zaf_zbxapi_gethostsingroup $gid) else hosts=$(zaf_zbxapi_gethostids) fi zaf_wrn "Will backup this hosts: $hosts" zaf_wrn "Output dir: $dir" for h in $hosts; do if zaf_bglimit 5; then ( hn=$(zaf_zbxapi_gethost $h name) zaf_wrn "Exporting host $hn($h)..." zaf_zbxapi_export_host $h >"$dir/$hn.xml" ) & else hn=$(zaf_zbxapi_gethost $h name) zaf_wrn "Exporting host $hn($h)..." zaf_zbxapi_export_host $h >"$dir/$hn.xml" fi done wait ;; export-host) shift; shift hostid=$(zaf_zbxapi_gethostid "$1") || exit 1 zaf_wrn "Exporting host $3($hostid)..." zaf_zbxapi_export_host $hostid ;; export-template) shift; shift templateid=$(zaf_zbxapi_gettemplateid "$1") || exit 1 zaf_wrn "Exporting template $3($hostid)..." zaf_zbxapi_export_template $templateid ;; export-templates) shift; shift [ -z "$1" ] && zaf_err "$0 api export-templates dir" dir="$1" templates=$(zaf_zbxapi_gettemplateids) zaf_wrn "Will backup this templates: $templates" zaf_wrn "Output dir: $dir" for t in $templates; do if zaf_bglimit 5; then ( tn=$(zaf_zbxapi_gettemplate $t name) zaf_wrn "Exporting template $tn($t)..." zaf_zbxapi_export_template $t >"$dir/$tn.xml" ) & else tn=$(zaf_zbxapi_gettemplate $t name) zaf_wrn "Exporting template $tn($t)..." zaf_zbxapi_export_template $t >"$dir/$tn.xml" fi done wait ;; import-template) shift; shift if zaf_is_plugin $1; then if [ -f "$ZAF_PLUGINS_DIR/$1/template.xml" ]; then template="$ZAF_PLUGINS_DIR/$1/template.xml" zaf_wrn "Importing template $template" zaf_zbxapi_import_config $template || zaf_err "Error importing template" else url="$(zaf_plugin_option $1 Template)" if [ -n "$url" ]; then zaf_fetch_url $url | zaf_zbxapi_import_config || zaf_err "Error importing template" else url="$(zaf_plugin_option $1 Url)" zaf_fetch_url $url/template.xml | zaf_zbxapi_import_config || zaf_err "Error importing template" fi fi else if [ -f $1 ]; then zaf_wrn "Importing template $1" zaf_zbxapi_import_config $1 || zaf_err "Error importing template" else zaf_err "Unknown plugin $1!" fi fi ;; *) echo "$0 api command [parameters]" for i in host template map; do zaf_hlp "get-${i}-id $i" "Get $i id" zaf_hlp "get-byid-${i} id [property]" "Get $i property from id. Leave empty property for JSON" done zaf_hlp "get-inventory host [fields]" "Get inventory fields [or all fields]" zaf_hlp "get-host-ids [hg]" "Get all hostids or hostids in group hg" zaf_hlp "get-template-ids [hg]" "Get all templateids or templateids in group hg" zaf_hlp "get-map-ids" "Get all mapids" zaf_hlp "export-hosts dir [hg]" "Backup all hosts [in group hg] (get their config from zabbix and save to dir/hostname.xml)" zaf_hlp "export-host host" "Backup host (get config from zabbix to stdout)" zaf_hlp "import-template {plugin|file}" "Import template for plugin or from file" zaf_hlp "export-template name" "Export template to stdout" zaf_hlp "export-templates dir" "Export all template to dir" echo [ -n "$2" ] && zaf_err "Bad API command '$2'!" ;; esac ;; *) if zaf_is_plugin "$1"; then if [ -z "$2" ]; then zaf_list_plugin_commands "$1" else zaf_plugin_run_command "$@" fi exit fi echo "$0 Version ${ZAF_VERSION}. Please use some of this commands:" echo "$0 Cmd [ZAF_OPTION=value] [ZAF_CTRL_Option=value] [ZAF_CTRLI_Item_Option=value] ..." echo "Plugin manipulation commands:" zaf_hlp "$0 update" "To update repo (not plugins, similar to apt-get update)" zaf_hlp "$0 upgrade" "To upgrade installed plugins from repo" zaf_hlp "$0 install plugin" "To install plugin" zaf_hlp "$0 remove plugin" "To remove plugin" echo echo "Plugin info commands:" zaf_hlp "$0 plugins" "To list installed plugins" zaf_hlp "$0 show [plugin]" "To show installed plugins or plugin info" zaf_hlp "$0 items [plugin]" "To list all suported items [for plugin]" echo echo "Plugin diagnostic commands:" zaf_hlp "$0 test [plugin[.item]]" "To test [all] suported items by zabbix_agentd [for plugin]" zaf_hlp "$0 get [plugin[.item]]" "To test [all] suported items by zabbix_get [for plugin]" zaf_hlp "$0 run [plugin[.item]]" "To test [all] suported items by directly runing command [for plugin]" zaf_hlp "$0 precache [plugin[.item]]" "To precache [all] suported items" zaf_hlp "$0 itemsh plugin.item" "To spawn interactive shell in item context (same as UserParameter)." echo echo "Zabbix API commands:" zaf_hlp "$0 api" "To zabbix API functions. See $0 api for more info." echo echo "Zabbix trapper commands:" zaf_hlp "$0 send plugin.item" "To send result of agent param directly to Zabbix server by zabbix_server." zaf_hlp "$0 send item" "To send value for any item from stdin." zaf_hlp "$0 send host:item" "To send value for any host:item from stdin." echo "Zabbix agent registration:" zaf_hlp "$0 register [hostname] [metadata]" "To register hostname on Zabbix server (autoregistration)." echo echo "Agent config info commands:" zaf_hlp "$0 userparms" "See userparms generated from zaf on stdout" zaf_hlp "$0 agent-config [force]" "Reconfigure zabbix userparms in $ZAF_AGENT_CONFIGD" echo echo "Zaf related commands:" zaf_hlp "$0 self-upgrade" "To self-upgrade zaf" zaf_hlp "$0 self-remove" "To self-remove zaf and its config" zaf_hlp "$0 cache-clean" "To remove all entries from cache" zaf_hlp "$0 cache-list" "To show all entries in cache" echo [ -n "$1" ] && zaf_err "Bad command '$1'!" ;; esac