1
0
mirror of https://github.com/limosek/zaf.git synced 2024-11-21 18:09:06 +01:00

Rework of functions

This commit is contained in:
Lukas Macura 2016-03-30 16:09:02 +02:00
parent bffda469c8
commit 5a811dedf6
6 changed files with 381 additions and 190 deletions

View File

@ -1,8 +1,28 @@
# Zabbix Agent Framework # Zabbix Agent Framework
This tool is used to maintain external zabbix checks in *one place*. There are lot of places where it is possible to download many external checks. This tool is used to maintain external zabbix checks in *one place*. There are lot of places where it is possible to download many external checks.
But there is problem with installation, update and centralised management. This tool should do all of this in easy steps. Today is is in devel stage and not everything works. But there is problem with installation, update and centralised management. This tool should do all of this in easy steps. In future it can be *starting point* to
I will try to make it working :) install and configure zabbix agent on systems with one step. Primary goal is not to make all plugins available here but to be able to use any plugin and decentralized development.
If you are maintainer of some external check, it is enough to create zaf file in your repo and use zaf installer everywhere.
## Features
* Minimal dependencies. At this time, only sh, sed, awk and curl
* Minimal runtime version to fit on different systems (openwrt, debian, ubuntu, ...)
* Modular. Zaf module can be maintained externaly from this framework
* Sharing code. Many zabbix external checks share common shell functions.
* Zabbix discovery simplification. Creating zabbix item for discovery is not so easy in shell based system and result is not nice. But you can use framework function to do so.
* OS packaging support.
## Installing Zaf
You need to be root and you must have curl installed on your system. Depending on your system, github certificates may not be available so you have to use *-k* option for curl (insecure). Default installation type is silent. So there will be no questions and everything will be autodetected. This command should be used on most systems:
```
curl https://raw.githubusercontent.com/limosek/zaf/master/install.sh | sh
```
but in openwrt, you should use this:
```
curl -k https://raw.githubusercontent.com/limosek/zaf/master/install.sh | sh
```
## Example ## Example
Best way how to explain everything is example. Supposing we are working on debian-like system. Best way how to explain everything is example. Supposing we are working on debian-like system.

View File

@ -2,15 +2,27 @@
if ! [ "$(basename $0)" = "install.sh" ]; then if ! [ "$(basename $0)" = "install.sh" ]; then
# We are runing from stdin # We are runing from stdin
url="https://raw.githubusercontent.com/limosek/zaf/master/"
if ! which curl >/dev/null;
then
echo "Curl not found. Cannot continue. Please install it."
exit 2
fi
echo "Installing from url $url..." >&2
[ -z "$*" ] && silent=silent
set -e set -e
mkdir -p /tmp/zaf-installer \ mkdir -p /tmp/zaf-installer \
&& cd /tmp/zaf-installer \ && cd /tmp/zaf-installer \
&& curl -f -k -s -L -o - https://raw.githubusercontent.com/limosek/zaf/master/install.sh >install.sh \ && (for i in lib/zaf.lib.sh lib/os.lib.sh lib/ctrl.lib.sh install.sh ; do curl -f -k -s -L -o - "$url/$i") >install.sh \
&& chmod +x install.sh \ && chmod +x install.sh \
&& exec ./install.sh defconf && exec ./install.sh $silent "$@"
exit
fi fi
ZAF_CFG_FILE=/etc/zaf.conf ZAF_CFG_FILE=/etc/zaf.conf
. $(dirname $0)/lib/zaf.lib.sh
. $(dirname $0)/lib/os.lib.sh
. $(dirname $0)/lib/ctrl.lib.sh
zaf_msg() { zaf_msg() {
[ "$ZAF_DEBUG" = "1" ] && echo $@ [ "$ZAF_DEBUG" = "1" ] && echo $@
@ -44,13 +56,14 @@ zaf_get_option(){
else else
zaf_msg "Got $2 <$1> from USER: $opt" zaf_msg "Got $2 <$1> from USER: $opt"
fi fi
eval "$1='$opt'" eval "$1='$opt'"
} }
# Sets option to zaf.conf # Sets option to zaf.conf
# $1 option name # $1 option name
# $2 option value # $2 option value
zaf_set_option(){ zaf_set_option(){
local description
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}
zaf_msg "Saving $1 to $2 in ${ZAF_CFG_FILE}" >&2 zaf_msg "Saving $1 to $2 in ${ZAF_CFG_FILE}" >&2
@ -77,25 +90,45 @@ zaf_install_exe(){
chmod +x "$2" chmod +x "$2"
} }
zaf_detect_pkg() { # Automaticaly install agent if supported
if which dpkg >/dev/null; then zaf_install_agent() {
ZAF_PKG="dpkg" case $ZAF_OS in
ZAF_CURL_INSECURE=0 Debian)
return curl "http://repo.zabbix.com/zabbix/3.0/debian/pool/main/z/zabbix-release/zabbix-release_3.0-1+${ZAF_CODENAME}_all.deb" >"/tmp/zaf-installer/zabbix-release_3.0-1+${ZAF_CODENAME}_all.deb" \
fi && dpkg -i "/tmp/zaf-installer/zabbix-release_3.0-1+${ZAF_CODENAME}_all.deb" \
if which opkg >/dev/null; then && apt-get update \
ZAF_PKG="opkg" && apt-get install $ZAF_AGENT_PKG
ZAF_AGENT_RESTART="/etc/init.d/zabbix_agentd restart" ;;
ZAF_AGENT_CONFIGD="/var/run/zabbix_agentd.conf.d/" esac
ZAF_AGENT_CONFIG="/etc/zabbix_agentd.conf" }
ZAF_CURL_INSECURE=1
return # Set config option in zabbix agent
fi # $1 option
if which rpm >/dev/null; then # $2 value
ZAF_PKG="rpm" zaf_agent_set_option() {
ZAF_CURL_INSECURE=0 local option="$1"
return local value="$2"
if grep ^$option\= $ZAF_AGENT_CONFIG; then
echo "Moving option $option to zaf config part."
sed -i "s/$option=/#$option=/" $ZAF_AGENT_CONFIG
fi fi
echo "$option=$value" >> "$ZAF_AGENT_CONFIGD/zaf_options.conf"
}
# Automaticaly configure agent if supported
# Parameters are in format zabbixconfvar=value
zaf_configure_agent() {
local pair
local option
local value
touch "$ZAF_AGENT_CONFIGD/zaf_options.conf"
for pair in "$@"; do
echo $pair | grep -q '^Z\_' || continue
option=$(echo $pair|cut -d '=' -f 1|cut -d '_' -f 2)
value=$(echo $pair|cut -d '=' -f 2-)
zaf_agent_set_option "$option" "$value"
done
} }
zaf_no_perms(){ zaf_no_perms(){
@ -105,8 +138,19 @@ zaf_no_perms(){
zaf_configure(){ zaf_configure(){
[ "$1" = "user" ] && ZAF_DEBUG=1 [ "$1" = "interactive" ] && ZAF_DEBUG=1
zaf_detect_pkg ZAF_PKG "Packaging system to use" "$(zaf_detect_pkg)" "$1" zaf_detect_system
zaf_get_option ZAF_PKG "Packaging system to use" "$ZAF_PKG" "$1"
zaf_get_option ZAF_OS "Operating system to use" "$ZAF_OS" "$1"
zaf_get_option ZAF_OS_CODENAME "Operating system codename" "$ZAF_OS_CODENAME" "$1"
zaf_get_option ZAF_AGENT_PKG "Zabbix agent package" "$ZAF_AGENT_PKG" "$1"
if [ -n "$ZAF_AGENT_PKG" ]; then
if ! zaf_check_deps "$ZAF_AGENT_PKG"; then
if [ "$1" = "silent" ]; then
zaf_install_agent
fi
fi
fi
zaf_get_option ZAF_CURL_INSECURE "Insecure curl (accept all certificates)" "1" "$1" zaf_get_option ZAF_CURL_INSECURE "Insecure curl (accept all certificates)" "1" "$1"
zaf_get_option ZAF_TMP_BASE "Tmp directory prefix (\$USER will be added)" "/tmp/zaf" "$1" zaf_get_option ZAF_TMP_BASE "Tmp directory prefix (\$USER will be added)" "/tmp/zaf" "$1"
zaf_get_option ZAF_LIB_DIR "Libraries directory" "/usr/lib/zaf" "$1" zaf_get_option ZAF_LIB_DIR "Libraries directory" "/usr/lib/zaf" "$1"
@ -134,6 +178,9 @@ zaf_configure(){
fi fi
zaf_set_option ZAF_PKG "${ZAF_PKG}" zaf_set_option ZAF_PKG "${ZAF_PKG}"
zaf_set_option ZAF_OS "${ZAF_OS}"
zaf_set_option ZAF_OS_CODENAME "${ZAF_OS_CODENAME}"
zaf_set_option ZAF_AGENT_PKG "${ZAF_AGENT_PKG}"
zaf_set_option ZAF_GIT "${ZAF_GIT}" zaf_set_option ZAF_GIT "${ZAF_GIT}"
zaf_set_option ZAF_CURL_INSECURE "${ZAF_CURL_INSECURE}" zaf_set_option ZAF_CURL_INSECURE "${ZAF_CURL_INSECURE}"
zaf_set_option ZAF_TMP_BASE "$ZAF_TMP_BASE" zaf_set_option ZAF_TMP_BASE "$ZAF_TMP_BASE"
@ -154,16 +201,13 @@ fi
ZAF_TMP_DIR="${ZAF_TMP_BASE}-${USER}-$$" ZAF_TMP_DIR="${ZAF_TMP_BASE}-${USER}-$$"
case $1 in case $1 in
reconf) interactive)
zaf_configure user zaf_configure interactive
$0 install $0 install
;; ;;
defconf) silent)
zaf_configure silent zaf_configure silent
$0 install zaf_configure_agent "$@"
;;
*)
zaf_configure
rm -rif ${ZAF_TMP_DIR} rm -rif ${ZAF_TMP_DIR}
mkdir -p ${ZAF_TMP_DIR} mkdir -p ${ZAF_TMP_DIR}
mkdir -p ${ZAF_LIB_DIR} mkdir -p ${ZAF_LIB_DIR}
@ -175,7 +219,7 @@ defconf)
mkdir -p ${ZAF_PLUGINS_DIR} mkdir -p ${ZAF_PLUGINS_DIR}
zaf_install_exe $(zaf_getrest zaf) /usr/bin/zaf zaf_install_exe $(zaf_getrest zaf) /usr/bin/zaf
/usr/bin/zaf install zaf /usr/bin/zaf install zaf
if ! /usr/bin/zaf check-agent-config; then if ! 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}"
echo "and there is Include=${ZAF_AGENT_CONFIGD} directive inside." echo "and there is Include=${ZAF_AGENT_CONFIGD} directive inside."
@ -185,6 +229,16 @@ defconf)
rm -rif ${ZAF_TMP_DIR} rm -rif ${ZAF_TMP_DIR}
echo "Install OK. Use 'zaf' without parameters to continue." echo "Install OK. Use 'zaf' without parameters to continue."
;; ;;
*)
echo
echo "Please specify how to install."
echo "ZAF_CONFIG_OPTION=value [...] install.sh {silent|interactive} Z_option=value [...]"
echo "Example 1 (default install): install.sh silent"
echo 'Example 2 (preconfigure agent options): install.sh silent Z_Server=zabbix.server Z_ServerActive=zabbix.server Z_Hostname=$(hostname)'
echo "Example 3 (preconfigure zaf packaging system to use): ZAF_PKG=dpkg install.sh silent"
echo "Example 4 (interactive): install.sh interactive"
echo
exit 1
esac esac

112
lib/ctrl.lib.sh Normal file
View File

@ -0,0 +1,112 @@
# Control file related functions
# Check plugin url
# $1 plugin uri
# $2 local file to fetch
zaf_plugin_fetch_control() {
[ -z "$1" ] && return -1
local name=$(basename "$1")
zaf_fetch_url "$1/control.zaf" >"$2"
}
# Get block from stdin
# $1 option
# $2 name
zaf_ctrl_get_items() {
grep '^Item ' | cut -d ' ' -f 2 | cut -d ':' -f 1 | tr '\r\n' ' '
}
# Get item body from stdin
# $1 itemname
zaf_ctrl_get_item_block() {
grep -v '^#' | awk '/^Item '$1'/ { i=0;
while (i==0) {
getline;
if (/^\/Item/) exit;
print $0;
}}'
}
# Get global plugin block body from stdin
# $1 itemname
zaf_ctrl_get_global_block() {
grep -v '^#' | awk '{ i=0;
while (i==0) {
getline;
if (/^Item /) exit;
print $0;
}}'
}
# Get item multiline option
# $1 optionname
zaf_block_get_moption() {
awk '/^'$1'::$/ { i=0;
while (i==0) {
getline;
if (/^::$/) exit;
print $0;
}}'
}
# Get item singleline option
# $1 optionname
zaf_block_get_option() {
grep "^$1:" | cut -d ' ' -f 2- | tr -d '\r\n'
}
zaf_ctrl_check_deps() {
local deps
deps=$(zaf_ctrl_get_global_block <$1 | zaf_block_get_option "Depends-${ZAF_PKG}" )
zaf_check_deps $deps
deps=$(zaf_ctrl_get_global_block <$1 | zaf_block_get_option "Depends-bin" )
for cmd in $deps; do
if ! which $cmd >/dev/null; then
echo "Missing binary dependency $cmd. Please install it first."
return 1
fi
done
}
# Install binaries from control
# $1 control
# $2 plugindir
zaf_ctrl_install() {
local binaries
local pdir
local script
local cmd
pdir="$2"
binaries=$(zaf_ctrl_get_global_block <$1 | zaf_block_get_option "Install-bin" | zaf_far '{PLUGINDIR}' "$plugindir" )
for b in $binaries; do
zaf_fetch_url "$url/$b" >"$pdir/$b"
chmod +x "$pdir/$b"
done
script=$(zaf_ctrl_get_global_block <$1 | zaf_block_get_moption "Install-script" | zaf_far '{PLUGINDIR}' "$plugindir" )
[ -n "$script" ] && eval $script
cmd=$(zaf_ctrl_get_global_block <$1 | zaf_block_get_option "Install-cmd" | zaf_far '{PLUGINDIR}' "$plugindir" )
[ -n "$cmd" ] && $cmd
}
# Generates zabbix cfg from control file
# $1 control
# $2 pluginname
zaf_ctrl_generate_cfg() {
local items
local cmd
local ilock
items=$(zaf_ctrl_get_items <"$1")
for i in $items; do
block=$(zaf_ctrl_get_item_block <$1 $i)
ilock=$(echo $i | tr -d '[]*&;:')
cmd=$(zaf_block_get_option <$1 "Cmd")
[ -n "$cmd" ] && { echo "UserParameter=$2.${i},$cmd"; continue; }
cmd=$(zaf_block_get_option <$1 "Function")
[ -n "$cmd" ] && { echo "UserParameter=$2.${i},${ZAF_LIB_DIR}/preload.sh $cmd"; continue; }
cmd=$(zaf_block_get_moption <$1 "Script")
[ -n "$cmd" ] && { zaf_block_get_moption <$1 "Script" >${ZAF_PLUGIN_DIR}/$2/$ilock.sh; echo "UserParameter=$2.${i},${ZAF_PLUGIN_DIR}/$ilock.sh"; continue; }
done
}

74
lib/os.lib.sh Normal file
View File

@ -0,0 +1,74 @@
# Os related functions
zaf_detect_system() {
if which dpkg >/dev/null; then
ZAF_PKG="dpkg"
ZAF_OS=$(lsb_release -is)
ZAF_OS_CODENAME=$(lsb_release -cs)
ZAF_CURL_INSECURE=0
ZAF_AGENT_PKG="zabbix-agent"
return
else if which rpm >/dev/null; then
ZAF_PKG="rpm"
ZAF_OS=$(lsb_release -is)
ZAF_OS_CODENAME=$(lsb_release -cs)
ZAF_CURL_INSECURE=0
ZAF_AGENT_PKG="zabbix-agent"
return
else if which opkg >/dev/null; then
ZAF_PKG="opkg"
. /etc/openwrt_release
ZAF_OS="$DISTRIB_ID"
ZAF_OS_CODENAME="$DISTRIB_CODENAME"
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
return
else
ZAF_PKG="unknown"
ZAF_OS="unknown"
ZAF_OS_CODENAME="unknown"
ZAF_AGENT_PKG=""
fi
fi
fi
}
# Check if dpkg dependency is met
# $* - packages
zaf_check_deps_dpkg() {
dpkg-query -f '${Package}\n' -W $* >/dev/null
}
# Check if dpkg dependency is met
# $* - packages
zaf_check_deps_rpm() {
rpm --quiet -qi $*
}
# Check if dpkg dependency is met
# $* - packages
zaf_check_deps_opkg() {
local p
for p in $*; do
opkg info $p | grep -q 'Package:' || { echo "Missing package $p" >&2; return 1; }
done
}
# Check dependency based on system
zaf_check_deps() {
case $ZAF_PKG in
dpkg) zaf_check_deps_dpkg $*
;;
opkg) zaf_check_deps_opkg $*
;;
rpm) zaf_check_deps_rpm $*
;;
*) return
;;
esac
}

View File

@ -1,14 +1,4 @@
############################################ Init part
# Get all config variables and initialise TMP
! [ -f /etc/zaf.conf ] && { echo "Config file /etc/zaf.conf does not exists! Exiting."; exit 2; }
. /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}"
############################################ Common routines ############################################ Common routines
zaf_msg() { zaf_msg() {
@ -32,7 +22,7 @@ zaf_fetch_url() {
http|https|ftp|file) http|https|ftp|file)
[ "${ZAF_CURL_INSECURE}" = "1" ] && insecure="-k" [ "${ZAF_CURL_INSECURE}" = "1" ] && insecure="-k"
zaf_msg curl $insecure -f -s -L -o - "$1" zaf_msg curl $insecure -f -s -L -o - "$1"
curl $insecure -f -s -L -o - "$1"; curl $insecure -f -s -L -o - "$1"
;; ;;
esac esac
} }
@ -113,81 +103,13 @@ zaf_update_repo() {
[ -n "${ZAF_PLUGINS_REPO}" ] && cd ${ZAF_REPO_DIR} && git pull [ -n "${ZAF_PLUGINS_REPO}" ] && cd ${ZAF_REPO_DIR} && git pull
} }
# Check plugin url
# $1 plugin uri
# $2 local file to fetch
zaf_plugin_fetch_control() {
[ -z "$1" ] && return -1
local name=$(basename "$1")
zaf_fetch_url "$1/control" >"$2"
}
# Get option from control file # Construct url from plugin name
# $1 control file # It can be http[s]://url
# $2 option # /path (from file)
zaf_ctrl_get_option() { # name (to try from repo)
awk 'BEGIN { FS=": "; }; /^'$2': / { printf $2$3$4$5"\n"; }' <$1 zaf_get_plugin_url() {
}
# 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() {
local deps
deps=$(zaf_ctrl_get_option "$1" Binary-Depends)
for cmd in $deps; do
if ! which $cmd >/dev/null; then
echo "Missing binary dependency $cmd. Please install it first."
exit 5
fi
done
}
zaf_ctrl_install_bin() {
local binaries
local pdir
binaries=$(zaf_ctrl_get_option "$1" Install-bin)
pdir="${ZAF_PLUGINS_DIR}/${2}/"
for b in $binaries; do
zaf_fetch_url "$url/$b" >"$pdir/$b"
chmod +x "$pdir/$b"
done
}
# Generates zabbix cfg from control file
# $1 control
# $2 pluginname
zaf_ctrl_generate_cfg() {
local items
local cmd
local ilock
items=$(zaf_ctrl_get_option "$1" Item)
for i in $items; do
ilock=$(echo $i | tr -d '[]*&;:')
cmd=$(zaf_ctrl_get_option "$1" "Item-cmd-$i")
echo "UserParameter=$2.${i},$cmd"
done
}
# Install plugin.
# Parameter is url, directory or plugin name (will be searched in default plugin dir)
zaf_install_plugin() {
local url local url
local control
local plugin
local plugindir
if echo "$1" | grep -q '/'; then if echo "$1" | grep -q '/'; then
url="$1" # plugin with path - installing from directory url="$1" # plugin with path - installing from directory
else else
@ -201,51 +123,73 @@ zaf_install_plugin() {
fi fi
fi fi
fi fi
plugin="plug$$" echo $url
rm -rf ${ZAF_TMP_DIR}/${plugin} }
control=${ZAF_TMP_DIR}/${plugin}/control
mkdir -p "${ZAF_TMP_DIR}/${plugin}" # $1 - control
# $2 - if nonempty, show informarions instead of setting env
zaf_plugin_info() {
local control="$1"
plugin=$(zaf_ctrl_get_global_block <"${control}" | zaf_block_get_option Plugin)
pdescription=$(zaf_ctrl_get_global_block <"${control}" | zaf_block_get_moption Description)
pmaintainer=$(zaf_ctrl_get_global_block <"${control}" | zaf_block_get_option Maintainer)
pversion=$(zaf_ctrl_get_global_block <"${control}" | zaf_block_get_option Version)
purl=$(zaf_ctrl_get_global_block <"${control}" | zaf_block_get_option Url)
phome=$(zaf_ctrl_get_global_block <"${control}" | zaf_block_get_option Home)
pitems=$(zaf_ctrl_get_items <"${control}")
[ -z "$2" ] && return
echo
echo -n "Plugin $plugin "; [ -n "$version" ] && echo -n "version ${pversion}"; echo ":"
echo "$pdescription"; echo
[ -n "$pmaintainer" ] && echo "Maintainer: $pmaintainer"
[ -n "$purl" ] && echo "Url: $purl"
[ -n "$phome" ] && echo "Home: $phome"
echo
echo "Items: $pitems"
echo
}
# Prepare plugin into tmp dir
# $1 is url, directory or plugin name (will be searched in default plugin dir).
# $2 is directory to prepare.
zaf_prepare_plugin() {
url=$(zaf_get_plugin_url "$1")
plugindir="$2"
control=${plugindir}/control.zaf
echo "Fetching control file from $url ..."
if zaf_plugin_fetch_control "$url" "${control}"; then if zaf_plugin_fetch_control "$url" "${control}"; then
plugin=$(zaf_ctrl_get_option "${control}" Plugin) zaf_plugin_info "${control}"
if [ -n "$plugin" ]; then zaf_ctrl_check_deps "${control}"
echo Installing plugin $plugin from $url... else
plugindir="${ZAF_PLUGINS_DIR}/${plugin}" echo "Cannot fetch control file!"
zaf_ctrl_binary_deps "${control}" return 1
mkdir -p $plugindir fi
zaf_ctrl_install_bin "${control}" "${plugin}" }
zaf_ctrl_generate_cfg "${control}" "${plugin}" | \
zaf_install_plugin() {
mkdir "${ZAF_TMP_DIR}/plugin"
if zaf_prepare_plugin "$1" "${ZAF_TMP_DIR}/plugin"; then
plugindir="${ZAF_PLUGINS_DIR}"/$plugin
echo $plugindir;exit;
if zaf_prepare_plugin "$1" $plugindir; then
zaf_ctrl_check_deps "${control}"
zaf_ctrl_install "${control}" "${plugin}"
zaf_ctrl_generate_cfg "${control}" "${plugin}"
exit;
#| \
zaf_far '{PLUGINDIR}' "$plugindir" | \ zaf_far '{PLUGINDIR}' "$plugindir" | \
zaf_far '{ZAFLIB}' ". ${ZAF_LIB_DIR}/zaf.lib.sh; . " | \ zaf_far '{ZAFLIBDIR}' "${ZAF_LIB_DIR}" | \
zaf_far '{ZAFFUNC}' ". ${ZAF_LIB_DIR}/zaf.lib.sh; " | \
zaf_far '{ZAFLOCK}' "${ZAF_LIB_DIR}/zaflock '$plugin' " \ zaf_far '{ZAFLOCK}' "${ZAF_LIB_DIR}/zaflock '$plugin' " \
>${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf >$plugindir/zabbix.conf
zaf_restart_agent
cp $control "$plugindir"/
zaf_fetch_url $url/template.xml >"$plugindir"/template.xml
else else
echo "Bad control file $control ($url)!" echo "Bad control file $control ($url)!"
cat $control cat $control
exit 4 exit 4
fi fi
else
echo "Cannot fetch control file!"
exit 4
fi fi
}
# 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 # List installed plugins
@ -256,41 +200,6 @@ zaf_list_plugins() {
cd ${ZAF_PLUGINS_DIR}; ls -1 cd ${ZAF_PLUGINS_DIR}; ls -1
} }
zaf_show_plugin() {
local items
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"
cfile="$plugindir/control"
if [ -d "$plugindir" ] ; then
echo "Plugin $1:"
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 " Supported items:"
for i in $items; do
if [ -n "$tst" ]; then
echo -n " "; ${ZAF_AGENT_BIN} -t "$1.$i"
else
echo -n " $1.$i: "
fi
echo
zaf_ctrl_get_description "$cfile" "Item: $i";
echo
done
else
echo "Plugin $1 not installed"
fi
}
zaf_discovery_plugins() { zaf_discovery_plugins() {
zaf_list_plugins | zaf_discovery '{#PLUGIN}' zaf_list_plugins | zaf_discovery '{#PLUGIN}'
} }

28
zaf
View File

@ -7,7 +7,19 @@ else
exit 2 exit 2
fi fi
[ -z "$ZAF_TMP_BASE" ] && ZAF_TMP_BASE=/tmp/zaf
ZAF_TMP_DIR="${ZAF_TMP_BASE}-${USER}-$$"
trap "rm -rif ${ZAF_TMP_DIR}" EXIT
! [ -d "${ZAF_TMP_DIR}" ] && mkdir "${ZAF_TMP_DIR}"
# Devel version
if [ -f $(dirname $0)/lib/zaf.lib.sh ]; then
ZAF_LIB_DIR=$(realpath $(dirname $0)/lib)
fi
. ${ZAF_LIB_DIR}/zaf.lib.sh . ${ZAF_LIB_DIR}/zaf.lib.sh
. ${ZAF_LIB_DIR}/os.lib.sh
. ${ZAF_LIB_DIR}/ctrl.lib.sh
case $1 in case $1 in
@ -44,7 +56,11 @@ test-items)
;; ;;
install) install)
zaf_install_plugin "$2" shift;
[ -z "$@" ] && echo "$0 install plugin [plugin]..."
for p in $@; do
zaf_install_plugin "$p"
done
;; ;;
remove) remove)
@ -52,12 +68,17 @@ remove)
;; ;;
self-upgrade) self-upgrade)
curl -s https://raw.githubusercontent.com/limosek/zaf/master/install.sh | sh rm -rf /tmp/zaf-installer && mkdir /tmp/zaf-installer
if zaf_fetch_url https://raw.githubusercontent.com/limosek/zaf/master/install.sh >/tmp/zaf-installer/install.sh; then
cd /tmp/zaf-installer && ./install.sh
else
echo "Cannot fetch uri https://raw.githubusercontent.com/limosek/zaf/master/install.sh!";
fi
;; ;;
self-remove) self-remove)
if [ "$2" = "force" ]; then if [ "$2" = "force" ]; then
rm -rf /etc/zaf.conf ${ZAF_PLUGINS_DIR} ${ZAF_REPO_DIR} ${ZAF_LIB_DIR} /usr/bin/zaf ${ZAF_AGENT_CONFIGD}/zap_* rm -rf /etc/zaf.conf ${ZAF_PLUGINS_DIR} ${ZAF_REPO_DIR} ${ZAF_LIB_DIR} /usr/bin/zaf ${ZAF_AGENT_CONFIGD}/zaf_*
else else
echo "This will remove zaf from this computer and erase all configuration." echo "This will remove zaf from this computer and erase all configuration."
echo "To continue, please do $0 self-remove force" echo "To continue, please do $0 self-remove force"
@ -73,6 +94,7 @@ self-remove)
echo "$0 install plugin To install plugin" echo "$0 install plugin To install plugin"
echo "$0 remove plugin To remove plugin" echo "$0 remove plugin To remove plugin"
echo "$0 self-upgrade To self-upgrade zaf" echo "$0 self-upgrade To self-upgrade zaf"
echo "$0 self-remove To self-remove zaf and its config"
;; ;;
esac esac