mirror of
				https://github.com/limosek/zaf.git
				synced 2025-10-31 17:47:37 +01:00 
			
		
		
		
	First useable version
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1 +1,2 @@ | |||||||
| *~ | *~ | ||||||
|  | plugins/ | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								control
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								control
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | Plugin: zaf | ||||||
|  |  Basic items for Zabbix Agent Framework | ||||||
|  |  | ||||||
|  | Version: 0.1 | ||||||
|  |  | ||||||
|  | Url: https://raw.githubusercontent.com/limosek/zaf/master/ | ||||||
|  |  | ||||||
|  | Web: https://github.com/limosek/zaf/ | ||||||
|  |  | ||||||
|  | Maintainer: Lukas Macura <lukas@macura.cz> | ||||||
|  |  | ||||||
|  | Item: version | ||||||
|  |  Returns version of zaf installed. | ||||||
|  |  | ||||||
|  | Item-cmd-version: {ZAFLIB} zaf_list_plugins | ||||||
|  |  | ||||||
|  | Item: plugins | ||||||
|  |  Returns installed plugins | ||||||
|  |  | ||||||
|  | Item-cmd-plugins: {ZAFLOCK} zaf list | ||||||
|  |  | ||||||
|  | Binary-Depends: echo zaf | ||||||
|  |  | ||||||
							
								
								
									
										71
									
								
								install.sh
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								install.sh
									
									
									
									
									
								
							| @@ -2,6 +2,10 @@ | |||||||
|  |  | ||||||
| ZAF_CFG_FILE=/etc/zaf.conf | ZAF_CFG_FILE=/etc/zaf.conf | ||||||
|  |  | ||||||
|  | zaf_msg() { | ||||||
|  | 	[ "$ZAF_DEBUG" = "1" ] && echo $@ | ||||||
|  | } | ||||||
|  |  | ||||||
| # Read option. If it is already set in zaf.conf, it is skipped. If env variable is set, it is used instead of default | # Read option. If it is already set in zaf.conf, it is skipped. If env variable is set, it is used instead of default | ||||||
| # It sets global variable name on result. | # It sets global variable name on result. | ||||||
| # $1 - option name | # $1 - option name | ||||||
| @@ -13,7 +17,7 @@ zaf_get_option(){ | |||||||
| 	eval opt=\$$1 | 	eval opt=\$$1 | ||||||
| 	if [ -n "$opt" ] && ! [ "$4" = "user" ]; then | 	if [ -n "$opt" ] && ! [ "$4" = "user" ]; then | ||||||
| 		eval "$1='$opt'" | 		eval "$1='$opt'" | ||||||
| 		echo "Got $2 <$1> from ENV: $opt" >&2 | 		zaf_msg "Got $2 <$1> from ENV: $opt" >&2 | ||||||
| 		return | 		return | ||||||
| 	else | 	else | ||||||
| 		opt="$3" | 		opt="$3" | ||||||
| @@ -26,9 +30,9 @@ zaf_get_option(){ | |||||||
| 	fi | 	fi | ||||||
| 	if [ -z "$opt" ]; then | 	if [ -z "$opt" ]; then | ||||||
| 		opt="$3" | 		opt="$3" | ||||||
| 		echo "Got $2 <$1> from Defaults: $opt" >&2 | 		zaf_msg "Got $2 <$1> from Defaults: $opt" >&2 | ||||||
| 	else | 	else | ||||||
| 		echo "Got $2 <$1> from USER: $opt" | 		zaf_msg "Got $2 <$1> from USER: $opt" | ||||||
| 	fi | 	fi | ||||||
| 	eval "$1='$opt'"	 | 	eval "$1='$opt'"	 | ||||||
| } | } | ||||||
| @@ -39,7 +43,9 @@ zaf_get_option(){ | |||||||
| zaf_set_option(){ | zaf_set_option(){ | ||||||
| 	if ! grep -q "^$1=" ${ZAF_CFG_FILE}; then | 	if ! grep -q "^$1=" ${ZAF_CFG_FILE}; then | ||||||
| 		echo "$1='$2'" >>${ZAF_CFG_FILE} | 		echo "$1='$2'" >>${ZAF_CFG_FILE} | ||||||
| 		echo "Saving $1 to $2 in ${ZAF_CFG_FILE}" >&2 | 		zaf_msg "Saving $1 to $2 in ${ZAF_CFG_FILE}" >&2 | ||||||
|  | 	else | ||||||
|  | 		zaf_msg "Preserving $1 to $2 in ${ZAF_CFG_FILE}" >&2 | ||||||
| 	fi | 	fi | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -74,40 +80,60 @@ zaf_no_perms(){ | |||||||
|  |  | ||||||
| zaf_configure(){ | zaf_configure(){ | ||||||
|  |  | ||||||
| 	zaf_detect_pkg ZAF_PKG "Packaging system to use" "$(zaf_detect_pkg)"	 | 	[ "$1" = "user" ] && ZAF_DEBUG=1 | ||||||
| 	zaf_get_option ZAF_TMP_DIR "Tmp directory" "/tmp/zaf" | 	zaf_detect_pkg ZAF_PKG "Packaging system to use" "$(zaf_detect_pkg)" "$1" | ||||||
| 	zaf_get_option ZAF_LIB_DIR "Libraries directory" "/usr/lib/zaf" | 	zaf_get_option ZAF_TMP_BASE "Tmp directory prefix (\$USER will be added)" "/tmp/zaf" "$1" | ||||||
| 	zaf_get_option ZAF_PLUGINS_DIR "Plugins directory" "${ZAF_LIB_DIR}/plugins" | 	zaf_get_option ZAF_LIB_DIR "Libraries directory" "/usr/lib/zaf" "$1" | ||||||
| 	zaf_get_option ZAF_PLUGINS_REPO "Plugins reposiory" "git://github.com/limosek/zaf-plugins.git" | 	zaf_get_option ZAF_PLUGINS_DIR "Plugins directory" "${ZAF_LIB_DIR}/plugins" "$1" | ||||||
| 	zaf_get_option ZAF_AGENT_CONFIG "Zabbix agent config" "/etc/zabbix/zabbix_agentd.conf" | 	zaf_get_option ZAF_PLUGINS_REPO "Plugins reposiory" "git://github.com/limosek/zaf-plugins.git" "$1" | ||||||
| 	zaf_get_option ZAF_AGENT_CONFIGD "Zabbix agent config.d" "/etc/zabbix/zabbix_agentd.conf.d/" | 	zaf_get_option ZAF_REPO_DIR "Plugins directory" "${ZAF_LIB_DIR}/repo" "$1" | ||||||
| 	zaf_get_option ZAF_AGENT_BIN "Zabbix agent binary" "/usr/sbin/zabbix_agentd" | 	zaf_get_option ZAF_AGENT_CONFIG "Zabbix agent config" "/etc/zabbix/zabbix_agentd.conf" "$1" | ||||||
| 	zaf_get_option ZAF_AGENT_RESTART "Zabbix agent restart cmd" "service zabbix-agent restart" | 	zaf_get_option ZAF_AGENT_CONFIGD "Zabbix agent config.d" "/etc/zabbix/zabbix_agentd.conf.d/" "$1" | ||||||
|  | 	zaf_get_option ZAF_AGENT_BIN "Zabbix agent binary" "/usr/sbin/zabbix_agentd" "$1" | ||||||
|  | 	zaf_get_option ZAF_AGENT_RESTART "Zabbix agent restart cmd" "service zabbix-agent restart" "$1" | ||||||
| 	 | 	 | ||||||
| 	if ! which $ZAF_AGENT_BIN >/dev/null; then | 	if ! which $ZAF_AGENT_BIN >/dev/null; then | ||||||
| 		echo "Zabbix agent not installed? Use ZAF_ZABBIX_AGENT_BIN env variable to specify location. Exiting." | 		echo "Zabbix agent not installed? Use ZAF_ZABBIX_AGENT_BIN env variable to specify location. Exiting." | ||||||
| 		exit 3 | 		exit 3 | ||||||
| 	fi | 	fi | ||||||
|  | 	if which git >/dev/null; then | ||||||
|  | 		ZAF_GIT=1 | ||||||
|  | 	else | ||||||
|  | 		ZAF_GIT="" | ||||||
|  | 	fi | ||||||
|  |  | ||||||
| 	if ! [ -f "${ZAF_CFG_FILE}" ]; then | 	if ! [ -f "${ZAF_CFG_FILE}" ]; then | ||||||
| 		touch "${ZAF_CFG_FILE}" || zaf_no_perms "${ZAF_CFG_FILE}" | 		touch "${ZAF_CFG_FILE}" || zaf_no_perms "${ZAF_CFG_FILE}" | ||||||
| 	fi | 	fi | ||||||
| 	 | 	 | ||||||
| 	zaf_set_option ZAF_PKG "${ZAF_PKG}" | 	zaf_set_option ZAF_PKG "${ZAF_PKG}" | ||||||
| 	zaf_set_option ZAF_TMP_DIR "$ZAF_TMP_DIR" | 	zaf_set_option ZAF_GIT "${ZAF_GIT}" | ||||||
|  | 	zaf_set_option ZAF_TMP_BASE "$ZAF_TMP_BASE" | ||||||
| 	zaf_set_option ZAF_LIB_DIR "$ZAF_LIB_DIR" | 	zaf_set_option ZAF_LIB_DIR "$ZAF_LIB_DIR" | ||||||
| 	zaf_set_option ZAF_PLUGINS_DIR "$ZAF_PLUGINS_DIR" | 	zaf_set_option ZAF_PLUGINS_DIR "$ZAF_PLUGINS_DIR" | ||||||
| 	zaf_set_option ZAF_PLUGINS_REPO "$ZAF_PLUGINS_REPO" | 	zaf_set_option ZAF_PLUGINS_REPO "$ZAF_PLUGINS_REPO" | ||||||
|  | 	zaf_set_option ZAF_REPO_DIR "$ZAF_REPO_DIR" | ||||||
| 	zaf_set_option ZAF_AGENT_CONFIG "$ZAF_AGENT_CONFIG" | 	zaf_set_option ZAF_AGENT_CONFIG "$ZAF_AGENT_CONFIG" | ||||||
| 	zaf_set_option ZAF_AGENT_CONFIGD "$ZAF_AGENT_CONFIGD" | 	zaf_set_option ZAF_AGENT_CONFIGD "$ZAF_AGENT_CONFIGD" | ||||||
| 	zaf_set_option ZAF_AGENT_BIN "$ZAF_AGENT_BIN" | 	zaf_set_option ZAF_AGENT_BIN "$ZAF_AGENT_BIN" | ||||||
| 	zaf_set_option ZAF_AGENTRESTART "$ZAF_AGENT_RESTART" | 	zaf_set_option ZAF_AGENT_RESTART "$ZAF_AGENT_RESTART" | ||||||
|  | 	ZAF_TMP_DIR="${ZAF_TMP_BASE}-${USER}-$$" | ||||||
| } | } | ||||||
|  |  | ||||||
| if [ -f "${ZAF_CFG_FILE}" ]; then | if [ -f "${ZAF_CFG_FILE}" ]; then | ||||||
| 	. "${ZAF_CFG_FILE}" | 	. "${ZAF_CFG_FILE}" | ||||||
| fi | fi | ||||||
|  | ZAF_TMP_DIR="${ZAF_TMP_BASE}-${USER}-$$" | ||||||
|  |  | ||||||
| case $1 in | case $1 in | ||||||
|  | reconf) | ||||||
|  | 	zaf_configure user | ||||||
|  | 	$0 install | ||||||
|  | 	;; | ||||||
|  | defconf) | ||||||
|  | 	zaf_configure silent | ||||||
|  | 	$0 install | ||||||
|  | 	;; | ||||||
| *) | *) | ||||||
| 	zaf_configure | 	zaf_configure | ||||||
| 	rm -rif ${ZAF_TMP_DIR} | 	rm -rif ${ZAF_TMP_DIR} | ||||||
| @@ -115,10 +141,14 @@ case $1 in | |||||||
| 	install -d ${ZAF_LIB_DIR} | 	install -d ${ZAF_LIB_DIR} | ||||||
| 	install -d ${ZAF_PLUGINS_DIR} | 	install -d ${ZAF_PLUGINS_DIR} | ||||||
| 	install $(getrest lib/zaf.lib.sh) ${ZAF_LIB_DIR}/ | 	install $(getrest lib/zaf.lib.sh) ${ZAF_LIB_DIR}/ | ||||||
|  | 	install $(getrest lib/jshn.sh) ${ZAF_LIB_DIR}/ | ||||||
|  | 	install $(getrest lib/zaflock) ${ZAF_LIB_DIR}/ | ||||||
|  | 	mkdir -p ${ZAF_TMP_DIR}/p/zaf | ||||||
|  | 	install $(getrest control) ${ZAF_TMP_DIR}/p/zaf/ | ||||||
|  | 	install $(getrest template.xml) ${ZAF_TMP_DIR}/p/zaf/ | ||||||
| 	mkdir -p ${ZAF_PLUGINS_DIR} | 	mkdir -p ${ZAF_PLUGINS_DIR} | ||||||
| 	echo "UserParameter=zaf.version,echo master" >${ZAF_AGENT_CONFIGD}/zaf_base.conf | 	install $(getrest zaf) /usr/bin/ | ||||||
| 	install $(getrest zaf) /usr/bin  | 	/usr/bin/zaf install ${ZAF_TMP_DIR}/p/zaf/ | ||||||
| 	echo "Install OK. Installing plugins (${ZAF_DEFAULT_PLUGINS})." |  | ||||||
| 	if  ! /usr/bin/zaf check-agent-config; then | 	if  ! /usr/bin/zaf check-agent-config; then | ||||||
| 		echo "Something is wrong with zabbix agent config." | 		echo "Something is wrong with zabbix agent config." | ||||||
| 		echo "Ensure that zabbix_agentd reads ${ZAF_AGENT_CONFIG}" | 		echo "Ensure that zabbix_agentd reads ${ZAF_AGENT_CONFIG}" | ||||||
| @@ -126,11 +156,8 @@ case $1 in | |||||||
| 		echo "Does ${ZAF_AGENT_RESTART} work?" | 		echo "Does ${ZAF_AGENT_RESTART} work?" | ||||||
| 		exit 1 | 		exit 1 | ||||||
| 	fi | 	fi | ||||||
| 	for plugin in ${ZAF_DEFAULT_PLUGINS}; do |  | ||||||
| 		/usr/bin/zaf install $plugin || exit $? |  | ||||||
| 	done |  | ||||||
| 	rm -rif ${ZAF_TMP_DIR} | 	rm -rif ${ZAF_TMP_DIR} | ||||||
| 	echo "Done" | 	echo "Install OK. Use 'zaf' without parameters to continue." | ||||||
| 	;; | 	;; | ||||||
| esac | esac | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										280
									
								
								lib/jshn.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										280
									
								
								lib/jshn.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,280 @@ | |||||||
|  | # functions for parsing and generating json | ||||||
|  |  | ||||||
|  | _json_get_var() { | ||||||
|  | 	# dest=$1 | ||||||
|  | 	# var=$2 | ||||||
|  | 	eval "$1=\"\$${JSON_PREFIX}$2\"" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | _json_set_var() { | ||||||
|  | 	# var=$1 | ||||||
|  | 	local ___val="$2" | ||||||
|  | 	eval "${JSON_PREFIX}$1=\"\$___val\"" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | __jshn_raw_append() { | ||||||
|  | 	# var=$1 | ||||||
|  | 	local value="$2" | ||||||
|  | 	local sep="${3:- }" | ||||||
|  |  | ||||||
|  | 	eval "export -- \"$1=\${$1:+\${$1}\${value:+\$sep}}\$value\"" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | _jshn_append() { | ||||||
|  | 	# var=$1 | ||||||
|  | 	local _a_value="$2" | ||||||
|  | 	eval "${JSON_PREFIX}$1=\"\${${JSON_PREFIX}$1} \$_a_value\"" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | _get_var() { | ||||||
|  | 	# var=$1 | ||||||
|  | 	# value=$2 | ||||||
|  | 	eval "$1=\"\$$2\"" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | _set_var() { | ||||||
|  | 	# var=$1 | ||||||
|  | 	local __val="$2" | ||||||
|  | 	eval "$1=\"\$__val\"" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | _json_inc() { | ||||||
|  | 	# var=$1 | ||||||
|  | 	# dest=$2 | ||||||
|  |  | ||||||
|  | 	let "${JSON_PREFIX}$1 += 1" "$2 = ${JSON_PREFIX}$1" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | _json_add_generic() { | ||||||
|  | 	# type=$1 | ||||||
|  | 	# name=$2 | ||||||
|  | 	# value=$3 | ||||||
|  | 	# cur=$4 | ||||||
|  |  | ||||||
|  | 	local var | ||||||
|  | 	if [ "${4%%[0-9]*}" = "J_A" ]; then | ||||||
|  | 		_json_inc "S_$4" var | ||||||
|  | 	else | ||||||
|  | 		var="${2//[^a-zA-Z0-9_]/_}" | ||||||
|  | 		[[ "$var" == "$2" ]] || export -- "${JSON_PREFIX}N_${4}_${var}=$2" | ||||||
|  | 	fi | ||||||
|  |  | ||||||
|  | 	export -- \ | ||||||
|  | 		"${JSON_PREFIX}${4}_$var=$3" \ | ||||||
|  | 		"${JSON_PREFIX}T_${4}_$var=$1" | ||||||
|  | 	_jshn_append "JSON_UNSET" "${4}_$var" | ||||||
|  | 	_jshn_append "K_$4" "$var" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | _json_add_table() { | ||||||
|  | 	# name=$1 | ||||||
|  | 	# type=$2 | ||||||
|  | 	# itype=$3 | ||||||
|  | 	local cur seq | ||||||
|  |  | ||||||
|  | 	_json_get_var cur JSON_CUR | ||||||
|  | 	_json_inc JSON_SEQ seq | ||||||
|  |  | ||||||
|  | 	local table="J_$3$seq" | ||||||
|  | 	_json_set_var "U_$table" "$cur" | ||||||
|  | 	export -- "${JSON_PREFIX}K_$table=" | ||||||
|  | 	unset "${JSON_PREFIX}S_$table" | ||||||
|  | 	_json_set_var JSON_CUR "$table" | ||||||
|  | 	_jshn_append "JSON_UNSET" "$table" | ||||||
|  |  | ||||||
|  | 	_json_add_generic "$2" "$1" "$table" "$cur" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | _json_close_table() { | ||||||
|  | 	local _s_cur | ||||||
|  |  | ||||||
|  | 	_json_get_var _s_cur JSON_CUR | ||||||
|  | 	_json_get_var "${JSON_PREFIX}JSON_CUR" "U_$_s_cur" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_set_namespace() { | ||||||
|  | 	local _new="$1" | ||||||
|  | 	local _old="$2" | ||||||
|  |  | ||||||
|  | 	[ -n "$_old" ] && _set_var "$_old" "$JSON_PREFIX" | ||||||
|  | 	JSON_PREFIX="$_new" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_cleanup() { | ||||||
|  | 	local unset tmp | ||||||
|  |  | ||||||
|  | 	_json_get_var unset JSON_UNSET | ||||||
|  | 	for tmp in $unset J_V; do | ||||||
|  | 		unset \ | ||||||
|  | 			${JSON_PREFIX}U_$tmp \ | ||||||
|  | 			${JSON_PREFIX}K_$tmp \ | ||||||
|  | 			${JSON_PREFIX}S_$tmp \ | ||||||
|  | 			${JSON_PREFIX}T_$tmp \ | ||||||
|  | 			${JSON_PREFIX}N_$tmp \ | ||||||
|  | 			${JSON_PREFIX}$tmp | ||||||
|  | 	done | ||||||
|  |  | ||||||
|  | 	unset \ | ||||||
|  | 		${JSON_PREFIX}JSON_SEQ \ | ||||||
|  | 		${JSON_PREFIX}JSON_CUR \ | ||||||
|  | 		${JSON_PREFIX}JSON_UNSET | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_init() { | ||||||
|  | 	json_cleanup | ||||||
|  | 	export -n ${JSON_PREFIX}JSON_SEQ=0 | ||||||
|  | 	export -- \ | ||||||
|  | 		${JSON_PREFIX}JSON_CUR="J_V" \ | ||||||
|  | 		${JSON_PREFIX}K_J_V= | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_add_object() { | ||||||
|  | 	_json_add_table "$1" object T | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_close_object() { | ||||||
|  | 	_json_close_table | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_add_array() { | ||||||
|  | 	_json_add_table "$1" array A | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_close_array() { | ||||||
|  | 	_json_close_table | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_add_string() { | ||||||
|  | 	local cur | ||||||
|  | 	_json_get_var cur JSON_CUR | ||||||
|  | 	_json_add_generic string "$1" "$2" "$cur" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_add_int() { | ||||||
|  | 	local cur | ||||||
|  | 	_json_get_var cur JSON_CUR | ||||||
|  | 	_json_add_generic int "$1" "$2" "$cur" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_add_boolean() { | ||||||
|  | 	local cur | ||||||
|  | 	_json_get_var cur JSON_CUR | ||||||
|  | 	_json_add_generic boolean "$1" "$2" "$cur" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_add_double() { | ||||||
|  | 	local cur | ||||||
|  | 	_json_get_var cur JSON_CUR | ||||||
|  | 	_json_add_generic double "$1" "$2" "$cur" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # functions read access to json variables | ||||||
|  |  | ||||||
|  | json_load() { | ||||||
|  | 	eval "`jshn -r "$1"`" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_dump() { | ||||||
|  | 	jshn "$@" ${JSON_PREFIX:+-p "$JSON_PREFIX"} -w  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_get_type() { | ||||||
|  | 	local __dest="$1" | ||||||
|  | 	local __cur | ||||||
|  |  | ||||||
|  | 	_json_get_var __cur JSON_CUR | ||||||
|  | 	local __var="${JSON_PREFIX}T_${__cur}_${2//[^a-zA-Z0-9_]/_}" | ||||||
|  | 	eval "export -- \"$__dest=\${$__var}\"; [ -n \"\${$__var+x}\" ]" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_get_keys() { | ||||||
|  | 	local __dest="$1" | ||||||
|  | 	local _tbl_cur | ||||||
|  |  | ||||||
|  | 	if [ -n "$2" ]; then | ||||||
|  | 		json_get_var _tbl_cur "$2" | ||||||
|  | 	else | ||||||
|  | 		_json_get_var _tbl_cur JSON_CUR | ||||||
|  | 	fi | ||||||
|  | 	local __var="${JSON_PREFIX}K_${_tbl_cur}" | ||||||
|  | 	eval "export -- \"$__dest=\${$__var}\"; [ -n \"\${$__var+x}\" ]" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_get_values() { | ||||||
|  | 	local _v_dest="$1" | ||||||
|  | 	local _v_keys _v_val _select= | ||||||
|  | 	local _json_no_warning=1 | ||||||
|  |  | ||||||
|  | 	unset "$_v_dest" | ||||||
|  | 	[ -n "$2" ] && { | ||||||
|  | 		json_select "$2" || return 1 | ||||||
|  | 		_select=1 | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	json_get_keys _v_keys | ||||||
|  | 	set -- $_v_keys | ||||||
|  | 	while [ "$#" -gt 0 ]; do | ||||||
|  | 		json_get_var _v_val "$1" | ||||||
|  | 		__jshn_raw_append "$_v_dest" "$_v_val" | ||||||
|  | 		shift | ||||||
|  | 	done | ||||||
|  | 	[ -n "$_select" ] && json_select .. | ||||||
|  |  | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_get_var() { | ||||||
|  | 	local __dest="$1" | ||||||
|  | 	local __cur | ||||||
|  |  | ||||||
|  | 	_json_get_var __cur JSON_CUR | ||||||
|  | 	local __var="${JSON_PREFIX}${__cur}_${2//[^a-zA-Z0-9_]/_}" | ||||||
|  | 	eval "export -- \"$__dest=\${$__var:-$3}\"; [ -n \"\${$__var+x}\${3+x}\" ]" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_get_vars() { | ||||||
|  | 	while [ "$#" -gt 0 ]; do | ||||||
|  | 		local _var="$1"; shift | ||||||
|  | 		if [ "$_var" != "${_var#*:}" ]; then | ||||||
|  | 			json_get_var "${_var%%:*}" "${_var%%:*}" "${_var#*:}" | ||||||
|  | 		else | ||||||
|  | 			json_get_var "$_var" "$_var" | ||||||
|  | 		fi | ||||||
|  | 	done | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_select() { | ||||||
|  | 	local target="$1" | ||||||
|  | 	local type | ||||||
|  | 	local cur | ||||||
|  |  | ||||||
|  | 	[ -z "$1" ] && { | ||||||
|  | 		_json_set_var JSON_CUR "J_V" | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	[[ "$1" == ".." ]] && { | ||||||
|  | 		_json_get_var cur JSON_CUR | ||||||
|  | 		_json_get_var cur "U_$cur" | ||||||
|  | 		_json_set_var JSON_CUR "$cur" | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	json_get_type type "$target" | ||||||
|  | 	case "$type" in | ||||||
|  | 		object|array) | ||||||
|  | 			json_get_var cur "$target" | ||||||
|  | 			_json_set_var JSON_CUR "$cur" | ||||||
|  | 		;; | ||||||
|  | 		*) | ||||||
|  | 			[ -n "$_json_no_warning" ] || \ | ||||||
|  | 				echo "WARNING: Variable '$target' does not exist or is not an array/object" | ||||||
|  | 			return 1 | ||||||
|  | 		;; | ||||||
|  | 	esac | ||||||
|  | } | ||||||
|  |  | ||||||
|  | json_is_a() { | ||||||
|  | 	local type | ||||||
|  |  | ||||||
|  | 	json_get_type type "$1" | ||||||
|  | 	[ "$type" = "$2" ] | ||||||
|  | } | ||||||
							
								
								
									
										137
									
								
								lib/zaf.lib.sh
									
									
									
									
									
								
							
							
						
						
									
										137
									
								
								lib/zaf.lib.sh
									
									
									
									
									
								
							| @@ -1,4 +1,11 @@ | |||||||
|  |  | ||||||
|  | . /etc/zaf.conf | ||||||
|  | . ${ZAF_LIB_DIR}/jshn.sh | ||||||
|  | ZAF_TMP_DIR="${ZAF_TMP_BASE}-${USER}-$$" | ||||||
|  | trap "rm -rif ${ZAF_TMP_DIR}" EXIT | ||||||
|  |  | ||||||
|  | ! [ -d "${ZAF_TMP_DIR}" ] && mkdir "${ZAF_TMP_DIR}" | ||||||
|  |  | ||||||
| # Fetch url to stdout  | # Fetch url to stdout  | ||||||
| # $1 url | # $1 url | ||||||
| # It supports real file, file:// and other schemes known by curl | # It supports real file, file:// and other schemes known by curl | ||||||
| @@ -48,14 +55,11 @@ zaf_check_agent_config() { | |||||||
|  |  | ||||||
| # Update repo | # Update repo | ||||||
| zaf_update_repo() { | zaf_update_repo() { | ||||||
|  | 	[ "$ZAF_GIT" != 1 ] && { echo "Git is not installed."; return 1; } | ||||||
|  | 	! [ -d ${ZAF_REPO_DIR} ] &&  git clone "${ZAF_PLUGINS_REPO}" "${ZAF_REPO_DIR}" | ||||||
| 	[ -n "${ZAF_PLUGINS_REPO}" ] && cd ${ZAF_REPO_DIR} && git pull | 	[ -n "${ZAF_PLUGINS_REPO}" ] && cd ${ZAF_REPO_DIR} && git pull | ||||||
| } | } | ||||||
|  |  | ||||||
| # List installed plugins |  | ||||||
| zaf_list_installed_plugins() { |  | ||||||
| 	cd ${ZAF_PLUGINS_DIR}; ls --hide '.' |  | ||||||
| } |  | ||||||
|  |  | ||||||
| # Check plugin url | # Check plugin url | ||||||
| # $1 plugin uri | # $1 plugin uri | ||||||
| # $2 local file to fetch | # $2 local file to fetch | ||||||
| @@ -69,7 +73,20 @@ zaf_plugin_fetch_control() { | |||||||
| # $1 control file | # $1 control file | ||||||
| # $2 option | # $2 option | ||||||
| zaf_ctrl_get_option() { | zaf_ctrl_get_option() { | ||||||
| 	grep -E '^(.*): ' "$1" | grep -F "$2:" | cut -d ' ' -f 2- | 	awk 'BEGIN { FS=": "; }; /^'$2': / { printf $2$3$4$5"\n"; }' <$1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # Get description from control file | ||||||
|  | # $1 control file | ||||||
|  | # $2 option | ||||||
|  | zaf_ctrl_get_description() { | ||||||
|  | 	awk \ | ||||||
|  | 	"/^$2/"' { i=1; | ||||||
|  |      		while (1) { | ||||||
|  |         		getline; if (substr($0,0,1) != " ") exit; | ||||||
|  |         		printf $0"\n"; | ||||||
|  |       		} | ||||||
|  |      	}' <$1 | ||||||
| } | } | ||||||
|  |  | ||||||
| zaf_ctrl_binary_deps() { | zaf_ctrl_binary_deps() { | ||||||
| @@ -100,8 +117,11 @@ zaf_ctrl_install_bin() { | |||||||
| zaf_ctrl_generate_cfg() { | zaf_ctrl_generate_cfg() { | ||||||
| 	local items | 	local items | ||||||
| 	local cmd | 	local cmd | ||||||
|  | 	local ilock | ||||||
|  |  | ||||||
| 	items=$(zaf_ctrl_get_option "$1" Item) | 	items=$(zaf_ctrl_get_option "$1" Item) | ||||||
| 	for i in $items; do | 	for i in $items; do | ||||||
|  | 		ilock=$(echo $i | tr -d '[]*&;:') | ||||||
| 		cmd=$(zaf_ctrl_get_option "$1" "Item-cmd-$i") | 		cmd=$(zaf_ctrl_get_option "$1" "Item-cmd-$i") | ||||||
| 		echo "UserParameter=$2.${i},$cmd" | 		echo "UserParameter=$2.${i},$cmd" | ||||||
| 	done | 	done | ||||||
| @@ -120,45 +140,118 @@ zaf_install_plugin() { | |||||||
| 	else | 	else | ||||||
| 		url="$1" | 		url="$1" | ||||||
| 	fi | 	fi | ||||||
| 	plugin=$(basename "$url") | 	plugin="plug$$" | ||||||
| 	echo Installing plugin $plugin from $url... |  | ||||||
| 	rm -rf ${ZAF_TMP_DIR}/${plugin} | 	rm -rf ${ZAF_TMP_DIR}/${plugin} | ||||||
| 	control=${ZAF_TMP_DIR}/${plugin}/control | 	control=${ZAF_TMP_DIR}/${plugin}/control | ||||||
| 	plugindir="${ZAF_PLUGINS_DIR}/${plugin}" |  | ||||||
| 	mkdir -p "${ZAF_TMP_DIR}/${plugin}" | 	mkdir -p "${ZAF_TMP_DIR}/${plugin}" | ||||||
| 	if zaf_plugin_fetch_control "$url" "${control}"; then | 	if zaf_plugin_fetch_control "$url" "${control}"; then | ||||||
| 		set -e | 		set -e | ||||||
| 		zaf_ctrl_binary_deps "${control}" | 		plugin=$(zaf_ctrl_get_option "${control}" Plugin) | ||||||
| 		mkdir -p $plugindir | 		if [ -n "$plugin" ]; then | ||||||
| 		zaf_ctrl_install_bin "${control}" "${plugin}"  | 			echo Installing plugin $plugin from $url... | ||||||
| 		zaf_ctrl_generate_cfg "${control}" "${plugin}" | zaf_far '{PLUGINDIR}' "$plugindir" >${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf | 			plugindir="${ZAF_PLUGINS_DIR}/${plugin}" | ||||||
| 		zaf_restart_agent | 			zaf_ctrl_binary_deps "${control}" | ||||||
| 		cp $control "$plugindir"/ | 			mkdir -p $plugindir | ||||||
| 		zaf_fetch_url $url/template.xml >"$plugindir"/template.xml | 			zaf_ctrl_install_bin "${control}" "${plugin}"  | ||||||
|  | 			zaf_ctrl_generate_cfg "${control}" "${plugin}" | \ | ||||||
|  | 				zaf_far '{PLUGINDIR}' "$plugindir" | \ | ||||||
|  | 				zaf_far '{ZAFLIB}' ". ${ZAF_LIB_DIR}/zaf.lib.sh; " | \ | ||||||
|  | 				zaf_far '{ZAFLOCK}' "${ZAF_LIB_DIR}/zaflock '$plugin' " \ | ||||||
|  | 				>${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf | ||||||
|  | 			zaf_restart_agent | ||||||
|  | 			cp $control "$plugindir"/ | ||||||
|  | 			zaf_fetch_url $url/template.xml >"$plugindir"/template.xml | ||||||
|  | 		else | ||||||
|  | 			echo "Bad control file!" | ||||||
|  | 			cat $control | ||||||
|  | 			exit 4 | ||||||
|  | 		fi | ||||||
| 	else | 	else | ||||||
| 		echo "Cannot fetch control file!" | 		echo "Cannot fetch control file!" | ||||||
| 		exit 4 | 		exit 4 | ||||||
| 	fi | 	fi | ||||||
| } | } | ||||||
|  |  | ||||||
| zaf_plugin_info() { | # Show installed plugins (human readable) | ||||||
|  | # $1 - plugin | ||||||
|  | zaf_show_installed_plugins() { | ||||||
|  | 	local cfile | ||||||
|  | 	local plugin | ||||||
|  | 	cd ${ZAF_PLUGINS_DIR}; ls --hide '.' -1 | while read plugin; do | ||||||
|  | 		cfile=${ZAF_PLUGINS_DIR}/$plugin/control | ||||||
|  | 		echo Plugin $plugin: | ||||||
|  | 		zaf_ctrl_get_description $cfile Plugin: | ||||||
|  | 		echo "Homepage:" $(zaf_ctrl_get_option $cfile Web) | ||||||
|  | 		echo "Maintainer:" $(zaf_ctrl_get_option $cfile Maintainer) | ||||||
|  | 		echo | ||||||
|  | 	done | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # List installed plugins | ||||||
|  | # $1 - plugin | ||||||
|  | zaf_list_plugins() { | ||||||
|  | 	local cfile | ||||||
|  | 	local plugin | ||||||
|  | 	cd ${ZAF_PLUGINS_DIR}; ls --hide '.' -1  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | zaf_show_plugin() { | ||||||
| 	local items | 	local items | ||||||
| 	local plugindir | 	local plugindir | ||||||
|  | 	local cfile | ||||||
|  | 	local tst | ||||||
|  |  | ||||||
|  | 	if [ -z "$1" ]; then | ||||||
|  | 		echo "Missing plugin name"; | ||||||
|  | 		exit 1 | ||||||
|  | 	fi | ||||||
|  | 	[ -n "$2" ] && tst=1 | ||||||
| 	plugindir="${ZAF_PLUGINS_DIR}/$1" | 	plugindir="${ZAF_PLUGINS_DIR}/$1" | ||||||
| 	if [ -d "$plugindir" ]; then | 	cfile="$plugindir/control" | ||||||
| 		items=$(zaf_ctrl_get_option "$plugindir/control" Item) | 	if [ -d "$plugindir" ] ; then | ||||||
| 		echo "Items supported:" | 		echo "Plugin $1:" | ||||||
| 		echo "$items" | 		zaf_ctrl_get_description "$cfile" "Plugin:" | ||||||
|  | 		echo "Homepage:" $(zaf_ctrl_get_option $cfile Web) | ||||||
|  | 		echo "Maintainer:" $(zaf_ctrl_get_option $cfile Maintainer)	 | ||||||
|  | 		items=$(zaf_list_plugin_items $1) | ||||||
|  | 		echo  | ||||||
|  | 		echo "Supported items:" | ||||||
|  | 		for i in $items; do | ||||||
|  | 			echo -n "$1.$i: " | ||||||
|  | 			[ -n "$tst" ] && ${ZAF_AGENT_BIN} -t "$1.$i" | ||||||
|  | 			echo | ||||||
|  | 			zaf_ctrl_get_description "$cfile" "Item: $i"; | ||||||
|  | 			echo | ||||||
|  | 		done | ||||||
| 	else | 	else | ||||||
| 		echo "Plugin $1 not installed"  | 		echo "Plugin $1 not installed"  | ||||||
| 	fi | 	fi | ||||||
| } | } | ||||||
|  |  | ||||||
|  | zaf_list_plugin_items() { | ||||||
|  | 	if [ -z "$1" ]; then | ||||||
|  | 		echo "Missing plugin name"; | ||||||
|  | 		exit 1 | ||||||
|  | 	fi | ||||||
|  | 	plugindir="${ZAF_PLUGINS_DIR}/$1" | ||||||
|  | 	cfile="$plugindir/control" | ||||||
|  | 	if [ -d "$plugindir" ] ; then | ||||||
|  | 		zaf_ctrl_get_option "$cfile" Item | ||||||
|  | 	else | ||||||
|  | 		echo "Plugin $1 not installed"  | ||||||
|  | 	fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  | zaf_list_items() { | ||||||
|  | 	for p in $(zaf_list_plugins); do | ||||||
|  | 		zaf_list_plugin_items $p | ||||||
|  | 	done | ||||||
|  | } | ||||||
|  |  | ||||||
| zaf_remove_plugin() { | zaf_remove_plugin() { | ||||||
|  | 	! [ -d ${ZAF_PLUGINS_DIR}/$1 ] && { echo "Plugin $1 not installed!"; exit 2; } | ||||||
| 	rm -rf ${ZAF_PLUGINS_DIR}/$1 | 	rm -rf ${ZAF_PLUGINS_DIR}/$1 | ||||||
| 	rm -f ${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf | 	rm -f ${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								lib/zaflock
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								lib/zaflock
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | #!/bin/sh | ||||||
|  |  | ||||||
|  | . /etc/zaf.conf | ||||||
|  |  | ||||||
|  | . ${ZAF_LIB_DIR}/zaf.lib.sh | ||||||
|  |  | ||||||
|  | help() { | ||||||
|  | 	echo "$0 key cmd" | ||||||
|  | 	exit 2 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | lkey="$1" | ||||||
|  | [ -z "$lkey" ] && help | ||||||
|  | shift | ||||||
|  |  | ||||||
|  | [ -z "${ZAF_LOCK_SECONDS}" ] && seconds=5 | ||||||
|  | [ -z "${ZAF_LOCK_FORCE}" ] && force=1 | ||||||
|  |  | ||||||
|  | lockfile="${ZAF_TMP_DIR}/zaflock_${lkey}" | ||||||
|  | i=0 | ||||||
|  | while [ -f "$lockfile" ] && [ $i -lt $seconds ]; do | ||||||
|  | 	sleep 1 | ||||||
|  | 	i=$(expr $i + 1) | ||||||
|  | done | ||||||
|  | if [ -f "$lockfile" ] && [ -n "$force" ]; then | ||||||
|  | 	logger -s -t "zlock" -p daemon.warn "Releasing $lockfile!" | ||||||
|  | 	rm -f "$lockfile" | ||||||
|  | fi | ||||||
|  | if [ -f "$lockfile" ] && [ -z "$force" ]; then | ||||||
|  | 	logger -s -t "zlock" -p daemon.err "Could not get lock for $lockfile!" | ||||||
|  | 	exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | touch "$lockfile" | ||||||
|  | [ -n "$*" ] && $@ | ||||||
|  | rm -f "$lockfile" | ||||||
|  |  | ||||||
							
								
								
									
										0
									
								
								template.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								template.xml
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										50
									
								
								zaf
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								zaf
									
									
									
									
									
								
							| @@ -1,14 +1,10 @@ | |||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  |  | ||||||
| # Some defaults |  | ||||||
|  |  | ||||||
| ZAF_AGENT_RESTART="service zabbix-agentd restart" |  | ||||||
| ZAF_AGENT_CONFIG="/etc/zabbix/zabbix_agentd.conf" |  | ||||||
| ZAF_LIB_DIR="/usr/lib/zaf/" |  | ||||||
| ZAF_PLUGINS_DIR="/usr/lib/zaf/plugins/" |  | ||||||
|  |  | ||||||
| if [ -f /etc/zaf.conf  ]; then | if [ -f /etc/zaf.conf  ]; then | ||||||
| 	. /etc/zaf.conf | 	. /etc/zaf.conf | ||||||
|  | else | ||||||
|  | 	echo "Missing config file /etc/zaf.conf! Exiting." | ||||||
|  | 	exit 2 | ||||||
| fi | fi | ||||||
|  |  | ||||||
| . ${ZAF_LIB_DIR}/zaf.lib.sh | . ${ZAF_LIB_DIR}/zaf.lib.sh | ||||||
| @@ -23,12 +19,28 @@ update) | |||||||
| 	zaf_update_repo | 	zaf_update_repo | ||||||
| 	;; | 	;; | ||||||
|  |  | ||||||
| list) | show) | ||||||
| 	zaf_list_installed_plugins | 	if [ -z "$2" ]; then | ||||||
|  | 		zaf_show_installed_plugins | ||||||
|  | 	else | ||||||
|  | 		zaf_show_plugin "$2" | ||||||
|  | 	fi | ||||||
| 	;; | 	;; | ||||||
|  |  | ||||||
| info) | list) | ||||||
| 	zaf_plugin_info "$2" | 	zaf_list_plugins | ||||||
|  | 	;; | ||||||
|  |  | ||||||
|  | list-items) | ||||||
|  | 	if [ -z "$2" ]; then | ||||||
|  | 		zaf_list_items | ||||||
|  | 	else | ||||||
|  | 		zaf_list_plugin_items "$2" | ||||||
|  | 	fi | ||||||
|  | 	;; | ||||||
|  |  | ||||||
|  | test-items) | ||||||
|  | 	zaf_show_plugin "$2" tst | ||||||
| 	;; | 	;; | ||||||
|  |  | ||||||
| install) | install) | ||||||
| @@ -39,11 +51,19 @@ remove) | |||||||
| 	zaf_remove_plugin "$2" | 	zaf_remove_plugin "$2" | ||||||
| 	;; | 	;; | ||||||
|  |  | ||||||
|  | self-upgrade) | ||||||
|  | 	curl -s https://raw.githubusercontent.com/limosek/zaf/master/install.sh | sh | ||||||
|  | 	;; | ||||||
|  |  | ||||||
| *) | *) | ||||||
| 	echo "$0 update" | 	echo "$0 update			To update repo"  | ||||||
| 	echo "$0 list" | 	echo "$0 list			To list installed plugins" | ||||||
| 	echo "$0 install plugin" | 	echo "$0 show [plugin]		To show installed plugins or plugin info" | ||||||
| 	echo "$0 remove plugin"  | 	echo "$0 list-items [plugin]	To list all suported items [for plugin]" | ||||||
|  | 	echo "$0 test-items plugin	To test all suported items for plugin" | ||||||
|  | 	echo "$0 install plugin		To install plugin" | ||||||
|  | 	echo "$0 remove plugin		To remove plugin"  | ||||||
|  | 	echo "$0 self-upgrade		To self-upgrade zaf" | ||||||
| 	;; | 	;; | ||||||
|  |  | ||||||
| esac | esac | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Lukas Macura
					Lukas Macura