diff --git a/.gitignore b/.gitignore index 47f6dfc..e46087e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ *~ plugins/ +out/ +tmp/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..10fa93f --- /dev/null +++ b/Makefile @@ -0,0 +1,68 @@ +# Zabbix agent framework makefile + +CONTROLFILES=$(foreach p,$(PLUGINS),$(p)/control.zaf) +ZAF_EXPORT_OPTS=$(foreach o,$(ZAF_OPTIONS),$(shell echo $(o)|cut -d '=' -f 1)) +DEBIAN_DIR=tmp/deb +DEBIAN_CTRL=$(DEBIAN_DIR)/DEBIAN +DEBIAN_PKG=out/zaf.deb + +all: help + +help: + @echo make '{deb|ipk|rpm}' '[PLUGINS="/dir/plg1 /dir/plg2] [ZAF_OPTIONS="ZAF_cfg=val ..."] [AGENT_OPTIONS="Z_Server=host ..."]' + +deb: deb-clean deb-init deb-deps deb-control deb-postinst deb-cp deb-changelog deb-package + +deb-clean: + rm -rf $(DEBIAN_DIR) $(DEBIAN_PKG) + +deb-init: + @mkdir -p tmp out $(DEBIAN_DIR) + +deb-deps: $(CONTROLFILES) + @which dpkg >/dev/null && which dpkg-buildpackage >/dev/null && which dch >/dev/null || { echo "You need essential debian developer tools. Please install them:\nsudo apt-get install build-essential devscripts debhelper"; exit 2; } + +deb-control: + @mkdir -p $(DEBIAN_CTRL) + @. lib/zaf.lib.sh; \ + . lib/ctrl.lib.sh; \ + for p in $(PLUGINS); do \ + DEPENDS="$$DEPENDS,$$(zaf_ctrl_get_global_option $$p/control.zaf Depends-dpkg | tr ' ' ',')"; \ + done; \ + zaf_far '{ZAF_VERSION}' "0.1" $(DEBIAN_CTRL)/control + +deb-postinst: +ifneq ($(PLUGINS),) + @echo -n "#!/bin/sh\nzaf install " >$(DEBIAN_CTRL)/postinst + @. lib/zaf.lib.sh; \ + . lib/ctrl.lib.sh; \ + for p in $(PLUGINS); do \ + echo -n " "$$(zaf_ctrl_get_global_option $$p/control.zaf Plugin) ; \ + done >>$(DEBIAN_CTRL)/postinst + @echo >>$(DEBIAN_CTRL)/postinst + @chmod +x $(DEBIAN_CTRL)/postinst +endif + +deb-cp: + @mkdir -p $(DEBIAN_DIR) + INSTALL_PREFIX=$(DEBIAN_DIR) ZAF_DEBUG=0 ./install.sh auto $(ZAF_OPTIONS) $(AGENT_OPTIONS) + @. lib/zaf.lib.sh; \ + . lib/ctrl.lib.sh; \ + for p in $(PLUGINS); do \ + plugin=$$(zaf_ctrl_get_global_option $$p/control.zaf Plugin) ; \ + mkdir -p $(DEBIAN_DIR)/usr/lib/zaf/plugins/$$plugin/; \ + cp -R $$p/* $(DEBIAN_DIR)/usr/lib/zaf/plugins/$$plugin/; \ + done + @rm -rf $(DEBIAN_DIR)/tmp + @cp $(DEBIAN_DIR)/etc/zaf.conf tmp/zaf.conf + grep -E "$$(echo $(ZAF_EXPORT_OPTS) | tr ' ' '|')=" tmp/zaf.conf >$(DEBIAN_DIR)/etc/zaf.conf +ifneq ($(AGENT_OPTIONS),) + echo "ZAF_AGENT_OPTIONS=\"$(AGENT_OPTIONS)\"" >>$(DEBIAN_DIR)/etc/zaf.conf +endif + +deb-changelog: + @cp files/changelog.template debian/changelog + +deb-package: + dpkg-deb -b $(DEBIAN_DIR) $(DEBIAN_PKG) + diff --git a/files/changelog.template b/files/changelog.template new file mode 100644 index 0000000..98bcb73 --- /dev/null +++ b/files/changelog.template @@ -0,0 +1,5 @@ +PACKAGE (0.1) zaf; urgency=medium + + * Initial release. + + -- Lukas Macura Wed, 06 Apr 2016 13:56:25 +0200 diff --git a/files/control.template b/files/control.template new file mode 100644 index 0000000..2d281ac --- /dev/null +++ b/files/control.template @@ -0,0 +1,11 @@ +Package: zaf +Version: {ZAF_VERSION} +Homepage: https://github.com/limosek/zaf +Section: admin +Priority: optional +Architecture: all +Depends: dash, awk, sed, grep, coreutils {ZAF_DEPENDS} +Maintainer: Lukas Macura +Description: Zabbix agent framework package + This tool is used to maintain external zabbix checks in one place. 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. + diff --git a/files/zaf.conf-deb.template b/files/zaf.conf-deb.template new file mode 100644 index 0000000..d6a8345 --- /dev/null +++ b/files/zaf.conf-deb.template @@ -0,0 +1,12 @@ +ZAF_PKG='dpkg' +ZAF_AGENT_PKG='zabbix-agent' +ZAF_TMP_BASE='/tmp/zaf' +ZAF_LIB_DIR='/usr/lib/zaf' +ZAF_BIN_DIR='/usr/bin' +ZAF_PLUGINS_DIR='/usr/lib/zaf/plugins' +ZAF_PLUGINS_URL='https://raw.githubusercontent.com/limosek/zaf-plugins/master/' +ZAF_PLUGINS_GITURL='https://github.com/limosek/zaf-plugins.git' +ZAF_REPO_DIR='/usr/lib/zaf/repo' +ZAF_AGENT_CONFIGD='/etc/zabbix/zabbix_agentd.d' +ZAF_AGENT_BIN='/usr/sbin/zabbix_agentd' +ZAF_AGENT_RESTART='service zabbix-agent restart' diff --git a/install.sh b/install.sh index 9060fe5..fea45a5 100755 --- a/install.sh +++ b/install.sh @@ -127,6 +127,7 @@ zaf_configure_agent() { 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 echo $pair | grep -q '^Z\_' || continue # Skip non Z_ vars option=$(echo $pair|cut -d '=' -f 1|cut -d '_' -f 2) @@ -239,10 +240,12 @@ reconf) ;; install) zaf_configure auto - zaf_configure_agent $ZAF_AGENT_OPTIONS "$@" - zaf_set_agent_option "Include" "$ZAF_AGENT_CONFIGD" append rm -rif ${ZAF_TMP_DIR} mkdir -p ${ZAF_TMP_DIR} + if zaf_is_root; then + zaf_configure_agent $ZAF_AGENT_OPTIONS "$@" + zaf_set_agent_option "Include" "$ZAF_AGENT_CONFIGD" append + fi zaf_install_dir ${ZAF_LIB_DIR} zaf_install_dir ${ZAF_PLUGINS_DIR} zaf_install $(zaf_getrest lib/zaf.lib.sh) ${ZAF_LIB_DIR} diff --git a/lib/ctrl.lib.sh b/lib/ctrl.lib.sh index e3e8ff5..028404d 100644 --- a/lib/ctrl.lib.sh +++ b/lib/ctrl.lib.sh @@ -92,14 +92,14 @@ zaf_ctrl_install() { local cmd pdir="$3" - binaries=$(zaf_ctrl_get_global_block <$2 | zaf_block_get_option "Install-bin") + 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" done - script=$(zaf_ctrl_get_global_block <$2 | zaf_block_get_moption "Install-script") + script=$(zaf_ctrl_get_global_option $2 "Install-script") [ -n "$script" ] && eval "$script" - cmd=$(zaf_ctrl_get_global_block <$2 | zaf_block_get_option "Install-cmd") + cmd=$(zaf_ctrl_get_global_option $2 "Install-cmd") [ -n "$cmd" ] && $cmd } diff --git a/lib/os.lib.sh b/lib/os.lib.sh index 7433fe8..cb5c0ff 100644 --- a/lib/os.lib.sh +++ b/lib/os.lib.sh @@ -8,6 +8,12 @@ zaf_configure_os_openwrt() { ZAF_CURL_INSECURE=1 } +zaf_configure_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_detect_system() { if which dpkg >/dev/null; then ZAF_PKG=dpkg @@ -29,12 +35,18 @@ zaf_detect_system() { ZAF_OS="$(echo $DISTRIB_ID|tr '[:upper:]' '[:lower:]')" ZAF_OS_CODENAME="$(echo $DISTRIB_CODENAME|tr '[:upper:]' '[:lower:]')" return + else if which pkg >/dev/null; then + ZAF_PKG="pkg" + ZAF_OS="freebsd" + ZAF_OS_CODENAME="$(freebsd-version|cut -d '-' -f 1)" + return else ZAF_PKG="unknown" ZAF_OS="unknown" ZAF_OS_CODENAME="unknown" ZAF_AGENT_PKG="" return + fi fi fi fi @@ -137,4 +149,13 @@ zaf_check_deps_opkg() { done } +# Check if pkg dependency is met +# $* - packages +zaf_check_deps_pkg() { + local p + for p in $*; do + pkg query -x "Package: %n" $p| grep -q 'Package:' || { echo "Missing package $p" >&2; return 1; } + done +} +