1
0
mirror of https://github.com/limosek/zaf.git synced 2025-10-31 17:47:37 +01:00

39 Commits
1.2 ... 1.3

Author SHA1 Message Date
Lukas Macura
5bff2c5dc6 Removed autoinstallation of zabbix package in debian 2017-01-05 15:51:33 +01:00
Lukas Macura
41d6d508f0 Repaired dependency checking on debian 2016-12-11 14:59:28 +01:00
Lukas Macura
26d9d0ab55 Url to plugins points to right branch 2016-12-09 13:20:46 +01:00
Lukas Macura
8afcc37c7b Updated readme to match branch 2016-12-09 13:04:11 +01:00
Lukas Macura
d823a3665a Merged plugin installation changes from trunk 2016-12-09 12:52:52 +01:00
Lukas Macura
b003e4f29f Repaired zaf version 2016-12-07 13:13:35 +01:00
Lukas Macura
f2b199ed2a Released zaf 1.3 2016-12-07 12:55:58 +01:00
Lukas Macura
2e8a27e6ac Plugins can be entered divided by comas 2016-12-07 12:51:15 +01:00
Lukas Macura
25d47e6ba8 Updated doc for wget 2016-12-05 12:17:34 +01:00
Lukas Macura
71a79ed57f Added possibility to use wget 2016-12-05 12:03:13 +01:00
Lukas Macura
9ac7bd34d4 Repaired plugin (re)installation 2016-12-05 11:30:10 +01:00
Lukas Macura
0ef05853a4 Plugin installation is possible offline
Plugin postconfiguration will be called on zaf agent-config
2016-12-02 13:12:13 +01:00
Lukas Macura
3e2f1502d1 Simplified caching 2016-12-02 09:44:48 +01:00
Lukas Macura
407fb2f77f Repaired and reworked caching 2016-12-01 16:57:26 +01:00
Lukas Macura
bc1cbaf144 If OS_PKG unset, ignore dependencies 2016-12-01 11:16:11 +01:00
Lukas Macura
4842cdaee1 Cache locking support 2016-12-01 10:28:14 +01:00
Lukas Macura
336d120bb5 Added better documentation of install options 2016-11-30 16:57:18 +01:00
Lukas Macura
b535eb58e2 Added proxy setting support 2016-11-30 16:40:26 +01:00
Lukas Macura
6697df6519 More environment checking before autodetection for offline install 2016-11-28 15:54:08 +01:00
Lukas Macura
92b3b626aa Env variable has precedence over autodetection 2016-11-28 15:28:14 +01:00
Lukas Macura
79c1992f56 Error checking moved to common functions 2016-11-28 15:17:24 +01:00
Lukas Macura
0d6fd293a3 README.md is not installed by default 2016-11-28 14:08:42 +01:00
Lukas Macura
1c876c756c Better error checking on install 2016-11-28 13:53:51 +01:00
Lukas Macura
8e8e1b9dfc Repaired git detection 2016-11-28 13:28:25 +01:00
Lukas Macura
375f805b6a Repaired setting option 2016-11-26 17:52:00 +01:00
Lukas Macura
ce843ddd55 Quiet error when zabbix user is not found 2016-11-22 15:19:28 +01:00
Lukas Macura
5838292856 Added postconf hook for openwrt systems 2016-11-22 14:27:44 +01:00
Lukas Macura
cc244ef791 When cache is in tmp, automaticaly create it 2016-11-22 14:03:27 +01:00
Lukas Macura
006a9fc99b which => zaf_which 2016-11-21 18:20:03 +01:00
Lukas Macura
72ef383146 Internal which now search in more dirs 2016-11-21 17:11:30 +01:00
Lukas Macura
b80fd5ce7f Missed zaf_which 2016-11-21 17:05:13 +01:00
Lukas Macura
f72488708b Repaired 'which' detection and user environment checking 2016-11-21 16:59:59 +01:00
Lukas Macura
f110e9aec7 Repaired version numbers 2016-06-17 14:06:27 +02:00
Lukas Macura
b9551fb2f2 Repaired merge of trunk
External items are working now
2016-06-17 13:16:07 +02:00
Lukas Macura
8e9d950411 Merge branch '1.2' 2016-06-17 12:07:14 +02:00
Lukas Macura
93b482dc69 New package management
Repaired install
Added external item support
2016-06-17 11:58:43 +02:00
Lukas Macura
3ad71262e2 Merge pull request #1 from kovetskiy/master
package for archlinux
2016-06-16 14:22:16 +02:00
Egor Kovetskiy
c2316d2341 package for archlinux 2016-06-16 12:07:08 +06:00
Lukas Macura
f9584ff673 Updated version in master 2016-04-18 10:38:43 +02:00
23 changed files with 808 additions and 331 deletions

View File

@@ -1,12 +1,21 @@
# Zabbix agent framework makefile
all: help
help:
@echo make '{deb|arch|ipk|rpm}' '[PLUGINS="/dir/plg1 [/dir2]...] [IPLUGINS="plg1 [plg2]..."] [ZAF_OPTIONS="ZAF_cfg=val ..."] [AGENT_OPTIONS="Z_Server=host ..."]'
@echo PLUGINS are embedded into package. Has to be local directories accessible during build.
@echo IPLUGINS will be downloaded and installed after package is installed. Can be name or url accessible after package installation.
@echo
include deb.mk
include arch.mk
include ipk.mk
include rpm.mk
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
ifeq ($(DEBIAN_PKG),)
DEBIAN_PKG=$(shell . lib/zaf.lib.sh; echo out/zaf-$$ZAF_VERSION.deb)
endif
ifeq ($(ZAF_DEBUG),)
ZAF_DEBUG=0
endif
@@ -18,79 +27,15 @@ ifeq ($(IPLUGINS),)
IPLUGINS = zaf
endif
all: help
help:
@echo make '{deb|ipk|rpm}' '[PLUGINS="/dir/plg1 [/dir2]...] [IPLUGINS="plg1 [plg2]..."] [ZAF_OPTIONS="ZAF_cfg=val ..."] [AGENT_OPTIONS="Z_Server=host ..."]'
@echo PLUGINS are embedded into package. Has to be local directories accessible during build.
@echo IPLUGINS will be downloaded and installed after package is installed. Can be name or url accessible after package installation.
@echo
deb: $(DEBIAN_PKG)
$(DEBIAN_PKG): deb-clean deb-init deb-deps deb-control deb-scripts deb-cp deb-package
arch: $(ARCH_PKG)
rpm: $(RPM_PKG)
ipk: $(IPK_PKG)
clean:
@rm -rf tmp/* out/*
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_GITBRANCH" = "master" ] && master=master; \
zaf_far '{ZAF_VERSION}' "$${ZAF_VERSION}$$master" <files/control.template | zaf_far '{ZAF_DEPENDS}' "$$DEPENDS" >$(DEBIAN_CTRL)/control
deb-scripts:
@. lib/zaf.lib.sh; \
. lib/ctrl.lib.sh; \
cat files/postinst.template | \
zaf_far '{PLUGINS}' "$$(for p in $(PLUGINS); do echo $$(basename $$p); done)" | \
zaf_far '{IPLUGINS}' "$$(for p in $(IPLUGINS); do echo $$(basename $$p); done)" | \
zaf_far '{ZAF_LIB_DIR}' "/usr/lib/zaf" >$(DEBIAN_CTRL)/postinst
@chmod +x $(DEBIAN_CTRL)/postinst
@cp files/preinst.template $(DEBIAN_CTRL)/preinst
@chmod +x $(DEBIAN_CTRL)/preinst
@cp files/prerm.template $(DEBIAN_CTRL)/prerm
@chmod +x $(DEBIAN_CTRL)/prerm
deb-cp:
@mkdir -p $(DEBIAN_DIR)
@set -e; INSTALL_PREFIX=$(DEBIAN_DIR) ZAF_DEBUG=$(ZAF_DEBUG) ./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/prepackaged/$$plugin/; \
cp -R $$p/* $(DEBIAN_DIR)/usr/lib/zaf/prepackaged/$$plugin/; \
done
@cat lib/*lib.sh install.sh >$(DEBIAN_DIR)/usr/lib/zaf/install.sh
@chmod +x $(DEBIAN_DIR)/usr/lib/zaf/install.sh
@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
@echo "ZAF_PREPACKAGED_DIR=\"/usr/lib/zaf/prepackaged\"" >>$(DEBIAN_DIR)/etc/zaf.conf
ifneq ($(AGENT_OPTIONS),)
@echo "ZAF_AGENT_OPTIONS=\"$(AGENT_OPTIONS)\"" >>$(DEBIAN_DIR)/etc/zaf.conf
endif
deb-package:
@dpkg-deb -b $(DEBIAN_DIR) $(DEBIAN_PKG)
@echo "\nCheck configuration:"
@cat $(DEBIAN_DIR)/etc/zaf.conf
@echo PLUGINS embedded: $(PLUGINS)
@echo PLUGINS in postinst: $(IPLUGINS)
@echo

View File

@@ -28,40 +28,68 @@ So zaf is here for you :)
## 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 simple command should be used on most systems:
```
curl -k https://raw.githubusercontent.com/limosek/zaf/1.2/install.sh | sh
curl -k https://raw.githubusercontent.com/limosek/zaf/1.3/install.sh | sh
```
If you have only wget installed:
```
wget --no-check-certificate -O - https://raw.githubusercontent.com/limosek/zaf/1.3/install.sh | sh
```
If you do not have https support (like openwrt), I made small http mirror of github files which is synchronized each day:
```
wget -O - http://github.macura.cz/zaf/1.3/install.sh| ZAF_URL=http://github.macura.cz/zaf/ ZAF_REPO_URL=http://github.macura.cz/zaf-plugins/1.3/ sh
```
### Install options and autoconfiguration
General parameters for install.sh on any system (simplest way how to install)
```
curl -k https://raw.githubusercontent.com/limosek/zaf/1.2/install.sh | \
sh -s {auto|interactive|debug-auto|debug-interactive} [Agent-Options] [Zaf-Options]
curl -k https://raw.githubusercontent.com/limosek/zaf/1.3/install.sh | \
sh -s {auto|interactive|debug-auto|debug-interactive} [Agent-Options] [Server-Options] [Zaf-Options]
```
or use git version:
```
git clone https://github.com/limosek/zaf.git; cd zaf; git checkout 1.2
./install.sh {auto|interactive|debug-auto|debug-interactive} [Agent-Options] [Zaf-Options]
git clone https://github.com/limosek/zaf.git; cd zaf; git checkout 1.3
./install.sh {auto|interactive|debug-auto|debug-interactive} [Agent-Options] [Server-Options] [Zaf-Options]
Agent-Options: Z_Option=value [...]
Server-Options: S_Option=value [...]
Zaf-Options: ZAF_OPT=value [...]
To unset Agent-Option use Z_Option=''
```
So you can pass ANY configuration of your zabbix agent directly to installer prefixing it with *Z_*. Please note that options are *Case Sensitive*!
Next to this, you can pass ANY zaf config options by *ZAF_* prefix. Interresting ZAF options:
```
# If we want to use GIT and local GIT repository
ZAF_GIT='1'# Default
Next to this, you can pass ANY zaf config options by *ZAF_* prefix. You can see all interesting ZAF options if you use install interactive command.
Interresting ZAF options:
# Git repository. Can be your local version
ZAF_REPO_GITURL='https://github.com/limosek/zaf-plugins.git'
# Where to install plugins
ZAF_PLUGINS_DIR='/usr/lib/zaf/plugins'
# Plugins can be downloaded from http[s] too
ZAF_REPO_URL='https://raw.githubusercontent.com/limosek/zaf-plugins/master/'
```
Option|Info|Default
------|----|-------
ZAF_PKG|Packaging system to use|detect
ZAF_OS|Operating system to use|detect
ZAF_OS_CODENAME|Operating system codename|detect
ZAF_AGENT_PKG|Zabbix agent package|detect
ZAF_AGENT_OPTIONS|Zabbix options to set in cfg|empty
ZAF_GIT|Git is installed|detect
ZAF_CURL_INSECURE|Insecure curl (accept all certificates)|1
ZAF_TMP_DIR|Tmp directory|/tmp/
ZAF_CACHE_DIR|Cache directory|/tmp/zafc
ZAF_LIB_DIR|Libraries directory|/usr/lib/zaf
ZAF_PLUGINS_DIR|Plugins directory|${ZAF_LIB_DIR}/plugins
ZAF_PROXY|http[s] and ftp proxy used by zaf|empty
ZAF_REPO_URL|Plugins http[s] repository|https://raw.githubusercontent.com/limosek/zaf-plugins/1.3/
ZAF_REPO_DIR|Plugins directory|${ZAF_LIB_DIR}/repo
ZAF_AGENT_CONFIG|Zabbix agent config|/etc/zabbix/zabbix_agentd.conf
ZAF_AGENT_CONFIGD|Zabbix agent config.d|/etc/zabbix/zabbix_agentd.conf.d/
ZAF_AGENT_BIN|Zabbix agent binary|/usr/sbin/zabbix_agentd
ZAF_AGENT_RESTART|Zabbix agent restart cmd|detect
ZAF_SERVER_CONFIG|Zabbix server config|/etc/zabbix/zabbix_server.conf
ZAF_SERVER_CONFIGD|Zabbix server config.d|/etc/zabbix/zabbix_server.conf.d/
ZAF_SERVER_BIN|Zabbix server binary|/usr/sbin/zabbix_server
ZAF_SUDOERSD|Sudo sudoers.d directory|/etc/sudoers.d
ZAF_CROND|Cron.d directory|/etc/cron.d
ZAF_ZBXAPI_URL|Zabbix API url|http://localhost/zabbix/api_jsonrpc.php
ZAF_ZBXAPI_USER|Zabbix API user|zaf
ZAF_ZBXAPI_PASS|Zabbix API password|empty
ZAF_ZBXAPI_AUTHTYPE|Zabbix API authentication type|internal
ZAF_PLUGINS|Plugins to autoinstall|empty
Installer will try to autoguess suitable config options for your system.
Now everything was tested on Debian and OpenWrt. If somebody is interrested in, you can help and test with some rpm specific functions. Remember that on some systems, default zabbix agent config is empty so you *need to* enter essential config options as parameters.
@@ -70,7 +98,7 @@ Now everything was tested on Debian and OpenWrt. If somebody is interrested in,
Suppose you want to autoinstall agent on clean system. You need only curl installed. Everything else is one-cmd process.
This command will install zaf, install zabbix-agent if necessary and sets zabbix variables on agent to reach server. This command can be automatized by puppet or another deploying system.
```
curl -k https://raw.githubusercontent.com/limosek/zaf/1.2/install.sh | sh -s auto \
curl -k https://raw.githubusercontent.com/limosek/zaf/1.3/install.sh | sh -s auto \
Z_Server=zabbix.server.local \
Z_ServerActive=zabbix.server.local \
Z_HostnameItem=system.hostname Z_RefreshActiveChecks=60 \
@@ -82,16 +110,15 @@ You can make your own deb package with preconfigured option. It is up to you to
```
git clone https://github.com/limosek/zaf.git \
&& cd zaf \
&& git checkout 1.2 \
&& git checkout 1.3 \
&& git clone https://github.com/limosek/zaf-plugins.git \
&& make deb PLUGINS="./zaf-plugins/fsx" IPLUGINS="zaf" ZAF_OPTIONS="ZAF_GIT=0" AGENT_OPTIONS="Z_Server=zabbix.server Z_ServerActive=zabbix.server Z_StartAgents=8"
sudo dpkg -i out/zaf-1.2.deb
&& make deb PLUGINS="./zaf-plugins/fsx" ZAF_PLUGINS="zaf" ZAF_OPTIONS="ZAF_GIT=0" AGENT_OPTIONS="Z_Server=zabbix.server Z_ServerActive=zabbix.server Z_StartAgents=8"
sudo dpkg -i out/zaf-1.3.deb
```
General usage:
```
make {deb|ipk|rpm} [PLUGINS="/dir/plg1 [/dir2]...] [IPLUGINS="plg1 [plg2]..."] [ZAF_OPTIONS="ZAF_cfg=val ..."] [AGENT_OPTIONS="Z_Server=host ..."]
PLUGINS are embedded into package. Has to be local directories accessible during build.
IPLUGINS will be downloaded and installed after package is installed. Can be name or url accessible after package installation.
make {deb|ipk|rpm} [ZAF_PLUGINS="plg1 [plg2]" [ZAF_OPTIONS="ZAF_cfg=val ..."] [AGENT_OPTIONS="Z_Server=host ..."]
ZAF_PLUGINS are embedded into package. Has to be local directories accessible during build.
```
## Zaf plugin
@@ -127,7 +154,7 @@ During plugin installation, zaf will check all dependencies, do install binaries
Zaf binary can be installed on any system from openwrt to big system. It has minimal dependencies and is shell based. Is has minimal size (up to 50kb of code). It can be used for installing, removing and testing zaf plugin items. Zaf should be run as root.
```
./zaf
./zaf Version 1.2. Please use some of this commands:
./zaf Version 1.3. Please use some of this commands:
./zaf Cmd [ZAF_OPTION=value] [ZAF_CTRL_Option=value] [ZAF_CTRLI_Item_Option=value] ...
Plugin manipulation commands:
./zaf update To update repo (not plugins, similar to apt-get update)

22
arch.mk Normal file
View File

@@ -0,0 +1,22 @@
# Arch linux specific definitions
ARCH_DIR=tmp/archlinux
ifeq ($(ARCH_PKG),)
ARCH_PKG=$(shell . lib/zaf.lib.sh; echo out/zaf-$$ZAF_VERSION.arch)
endif
$(ARCH_PKG): clean arch-init arch-build
arch-init:
@mkdir -p tmp out $(ARCH_DIR)
@. lib/zaf.lib.sh; \
. lib/ctrl.lib.sh; \
cat files/archlinux/PKGBUILD | zaf_far '{PLUGINS}' "$(PLUGINS)" | zaf_far "{IPLUGINS}" "$(IPLUGINS)" | \
zaf_far "{ZAF_OPTIONS}" "$(ZAF_OPTIONS)" | zaf_far "{AGENT_OPTIONS}" "$(AGENT_OPTIONS)" \
>$(ARCH_DIR)/PKGBUILD
arch-build:
@cd $(ARCH_DIR) && makepkg -f

57
deb.mk Normal file
View File

@@ -0,0 +1,57 @@
# Debian specific config
DEBIAN_DIR=tmp/deb
DEBIAN_CTRL=$(DEBIAN_DIR)/DEBIAN
ifeq ($(DEBIAN_PKG),)
DEBIAN_PKG=$(shell . lib/zaf.lib.sh; echo out/zaf-$$ZAF_VERSION.deb)
endif
$(DEBIAN_PKG): clean deb-init deb-deps deb-control deb-scripts deb-cp deb-package
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_GITBRANCH" = "master" ] && master=master; \
zaf_far '{ZAF_VERSION}' "$${ZAF_VERSION}$$master" <files/debian/control.template | zaf_far '{ZAF_DEPENDS}' "$$DEPENDS" >$(DEBIAN_CTRL)/control
deb-scripts:
@. lib/zaf.lib.sh; \
. lib/ctrl.lib.sh; \
cat files/debian/postinst.template >$(DEBIAN_CTRL)/postinst
@chmod +x $(DEBIAN_CTRL)/postinst
@cp files/debian/preinst.template $(DEBIAN_CTRL)/preinst
@chmod +x $(DEBIAN_CTRL)/preinst
@cp files/debian/prerm.template $(DEBIAN_CTRL)/prerm
@chmod +x $(DEBIAN_CTRL)/prerm
deb-cp:
@mkdir -p $(DEBIAN_DIR)
@set -e; INSTALL_PREFIX=$(DEBIAN_DIR) ZAF_DEBUG=$(ZAF_DEBUG) ./install.sh auto $(ZAF_OPTIONS) ZAF_PLUGINS="$(ZAF_PLUGINS)" $(AGENT_OPTIONS)
@cat lib/*lib.sh install.sh >$(DEBIAN_DIR)/usr/lib/zaf/install.sh
@chmod +x $(DEBIAN_DIR)/usr/lib/zaf/install.sh
@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-package:
@dpkg-deb -b $(DEBIAN_DIR) $(DEBIAN_PKG)
@echo "\nCheck configuration:"
@cat $(DEBIAN_DIR)/etc/zaf.conf
@echo PLUGINS embedded: $(ZAF_PLUGINS)
@echo

39
files/archlinux/PKGBUILD Normal file
View File

@@ -0,0 +1,39 @@
pkgname="zaf-git"
pkgver=${PKGVER:-autogenerated}
pkgrel=${PKGREL:-1}
pkgdesc="zabbix agent framework - a cli tool for zabbix"
arch=("i686" "x86_64")
license=("GPL")
depends=(
"lsb-release"
"git"
)
backup=(
"etc/zaf.conf"
)
source=(
"zaf-git::git://github.com/limosek/zaf#branch=master"
)
md5sums=("SKIP")
pkgver() {
cd "$srcdir/$pkgname"
local date=$(git log -1 --format="%cd" --date=short | sed s/-//g)
local count=$(git rev-list --count HEAD)
local commit=$(git rev-parse --short HEAD)
echo "$date.${count}_$commit"
}
build() {
cd "$srcdir/$pkgname"
:
}
package() {
cd "$srcdir/$pkgname"
INSTALL_PREFIX="$pkgdir" \
./install.sh auto {ZAF_OPTIONS} {AGENT_OPTIONS}
}

View File

@@ -0,0 +1,10 @@
#!/bin/sh
case $1 in
configure)
zaf agent-config
;;
esac
true

View File

@@ -1,22 +0,0 @@
#!/bin/sh
case $1 in
configure)
if [ -f /usr/lib/zaf/install.sh ] && [ -f /etc/zaf.conf ] && [ -f /usr/lib/zaf/zaf.lib.sh ] && which zaf >/dev/null; then
. /etc/zaf.conf
. /usr/lib/zaf/zaf.lib.sh
. /usr/lib/zaf/os.lib.sh
. /usr/lib/zaf/ctrl.lib.sh
cd /usr/lib/zaf && /usr/lib/zaf/install.sh reconf
[ -n "{PLUGINS}" ] && for p in {PLUGINS}; do
if ! zaf_is_plugin $p;then
zaf install $ZAF_PREPACKAGED_DIR/$p;
fi
done
[ -n "{IPLUGINS}" ] && zaf reinstall {IPLUGINS}
fi
;;
esac
true

View File

@@ -1,11 +1,38 @@
#!/bin/sh
[ -z "$ZAF_DEBUG" ] && ZAF_DEBUG=1
if [ -z "$ZAF_URL" ]; then
# Runing as standalone install.sh. We have to download rest of files first.
ZAF_URL="https://github.com/limosek/zaf/"
fi
if [ -z "$ZAF_RAW_URL" ]; then
ZAF_RAW_URL="https://raw.githubusercontent.com/limosek/zaf"
fi
[ -z "$ZAF_GITBRANCH" ] && ZAF_GITBRANCH=1.3
############### Functions
# Lite version of zaf_fetch_url, full version will be loaded later
zaf_fetch_url(){
echo curl -f -k -s -L -o - "$1" >&2;
curl -f -k -s -L -o - "$1"
if zaf_which curl >/dev/null 2>/dev/null; then
echo curl -f -k -s -L -o - "$1" >&2;
curl -f -k -s -L -o - "$1"
else
wget --no-check-certificate -O - "$1"
fi
}
# Lite version of zaf_which, full version will be loaded later
zaf_which() {
if which >/dev/null 2>/dev/null; then
which "$1"
else
for i in /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin; do
[ -x $i/$1 ] && { echo $i/$1; return; }
done
return 1
fi
}
# Lite version of zaf_err, full version will be loaded later
@@ -31,6 +58,7 @@ zaf_download_files() {
zaf_get_option(){
local opt
ZAF_HELP_OPTS="$ZAF_HELP_OPTS\n$1 $2 [$3]"
eval opt=\$C_$1
if [ -n "$opt" ]; then
eval "$1='$opt'"
@@ -74,54 +102,73 @@ zaf_set_option(){
fi
}
# Set config option in zabbix agent config file
# $1 option
# $2 value
zaf_set_agent_option() {
local option="$1"
local value="$2"
if grep -q ^$option\= $ZAF_AGENT_CONFIG; then
zaf_dbg "Setting option $option in $ZAF_AGENT_CONFIG."
sed -i "s/$option=\(.*\)/$option=$2/" $ZAF_AGENT_CONFIG
# Set config option in zabbix config file
# $1 config file
# $2 option
# $3 value
zaf_set_zabbix_option() {
local cfgfile="$1"
local option="$2"
local value="$3"
if grep -q ^$option\= $cfgfile; then
zaf_dbg "Setting option $option in $cfgfile to $3."
sed -i "s/$option=\(.*\)/$option=$value/" $cfgfile
else
zaf_move_agent_option "$1" "$2"
zaf_move_zabbix_option "$1" "$2" "$3"
fi
}
# Unset config option in zabbix agent config file
# $1 option
zaf_unset_agent_option() {
local option="$1"
local value="$2"
if grep -q ^$option\= $ZAF_AGENT_CONFIG; then
zaf_dbg "Unsetting option $option in $ZAF_AGENT_CONFIG."
sed -i "s/$option=\(.*\)/#$option=$2/" $ZAF_AGENT_CONFIG
# Get config option from zabbix config file
# $1 config file
# $2 option
zaf_get_zabbix_option() {
local cfgfile="$1"
local option="$2"
grep ^$option\= $cfgfile | cut -d '=' -f 2-;
}
# Unset config option in zabbix config file
# $1 config file
# $2 option
zaf_unset_zabbix_option() {
local cfgfile="$1"
local option="$2"
local value="$3"
if grep -q ^$option\= $cfgfile; then
zaf_dbg "Unsetting option $option in $cfgfile."
sed -i "s/$option=\(.*\)/#$option=$2/" $cfgfile
fi
}
# Add config option in zabbix agent config file
# $1 option
# $2 value
zaf_add_agent_option() {
local option="$1"
local value="$2"
if ! grep -q "^$1=$2" $ZAF_AGENT_CONFIG; then
zaf_dbg "Adding option $option to $ZAF_AGENT_CONFIG."
echo "$option=$value" >>$ZAF_AGENT_CONFIG
# Add config option in zabbix config file
# $1 config file
# $2 option
# $3 value
zaf_add_zabbix_option() {
local cfgfile="$1"
local option="$2"
local value="$3"
if ! grep -q "^$option=$value" $cfgfile; then
zaf_dbg "Adding option $option to $cfgfile."
echo "$option=$value" >>$cfgfile
fi
}
# Move config option fron zabbix agent config file to zaf options file and set value
# $1 option
# $2 value
zaf_move_agent_option() {
local option="$1"
local value="$2"
if grep -q ^$option\= $ZAF_AGENT_CONFIG; then
zaf_dbg "Moving option $option from $ZAF_AGENT_CONFIG to ."
sed -i "s/$option=(.*)/$option=$2/" $ZAF_AGENT_CONFIG
# Move config option fron zabbix config file to zaf options file and set value
# $1 config file
# $2 options file
# $3 option
# $4 value
zaf_move_zabbix_option() {
local cfgfile="$1"
local optsfile="$2"
local option="$3"
local value="$4"
if grep -q ^$option\= $cfgfile; then
zaf_dbg "Moving option $option from $cfgfile to $optsfile."
sed -i "s/$option=(.*)/$option=$value/" $cfgfile
fi
[ -n "$value" ] && echo "$option=$value" >> "$ZAF_AGENT_CONFIGD/zaf_options.conf"
[ -n "$value" ] && echo "$option=$value" >> "$optsfile"
}
# Automaticaly configure agent if supported
@@ -131,6 +178,7 @@ zaf_configure_agent() {
local option
local value
local options
local changes
zaf_install_dir "$ZAF_AGENT_CONFIGD"
echo -n >"$ZAF_AGENT_CONFIGD/zaf_options.conf" || zaf_err "Cannot access $ZAF_AGENT_CONFIGD/zaf_options.conf"
@@ -140,18 +188,48 @@ zaf_configure_agent() {
option=$(echo $pair|cut -d '=' -f 1|cut -d '_' -f 2)
value=$(echo $pair|cut -d '=' -f 2-)
if [ -n "$value" ]; then
zaf_set_agent_option "$option" "$value"
zaf_set_zabbix_option "$ZAF_AGENT_CONFIG" "$option" "$value"
else
zaf_unset_agent_option "$option"
zaf_unset_zabbix_option "$ZAF_AGENT_CONFIG" "$option"
fi
options="$options Z_$option=$value"
changes=1
done
zaf_set_option ZAF_AGENT_OPTIONS "${options}"
[ -n "$changes" ] # Return false if no changes
}
# Automaticaly configure server if supported
# Parameters are in format S_zabbixconfvar=value
zaf_configure_server() {
local pair
local option
local value
local options
local changes
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
option=$(echo $pair|cut -d '=' -f 1|cut -d '_' -f 2)
value=$(echo $pair|cut -d '=' -f 2-)
if [ -n "$value" ]; then
zaf_set_zabbix_option "$ZAF_SERVER_CONFIG" "$option" "$value"
else
zaf_unset_zabbix_option "$ZAF_SERVER_CONFIG" "$option"
fi
options="$options S_$option=$value"
changes=1
done
zaf_set_option ZAF_SERVER_OPTIONS "${options}"
[ -n "$changes" ] # Return false if no changes
}
zaf_preconfigure(){
zaf_detect_system
zaf_os_specific zaf_configure_os
[ -z "$ZAF_OS" ] && zaf_detect_system
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."
else
@@ -173,10 +251,12 @@ zaf_configure(){
fi
fi
fi
if which git >/dev/null; then
ZAF_GIT=1
else
ZAF_GIT=0
if [ -z "$ZAF_GIT" ]; then
if zaf_which git >/dev/null; then
ZAF_GIT=1
else
ZAF_GIT=0
fi
fi
zaf_get_option ZAF_GIT "Git is installed" "$ZAF_GIT" "$INSTALL_MODE"
zaf_get_option ZAF_CURL_INSECURE "Insecure curl (accept all certificates)" "1" "$INSTALL_MODE"
@@ -186,19 +266,28 @@ zaf_configure(){
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_REPO_URL "Plugins http[s] repository" "https://raw.githubusercontent.com/limosek/zaf-plugins/master/" "$INSTALL_MODE"
zaf_get_option ZAF_PROXY "http proxy used by zaf" "" "$INSTALL_MODE"
zaf_get_option ZAF_REPO_URL "Plugins http[s] repository" "https://raw.githubusercontent.com/limosek/zaf-plugins/${ZAF_VERSION}/" "$INSTALL_MODE"
zaf_get_option ZAF_REPO_DIR "Plugins directory" "${ZAF_LIB_DIR}/repo" "$INSTALL_MODE"
zaf_get_option ZAF_AGENT_CONFIG "Zabbix agent config" "/etc/zabbix/zabbix_agentd.conf" "$INSTALL_MODE"
! [ -d "${ZAF_AGENT_CONFIGD}" ] && [ -d "/etc/zabbix/zabbix_agentd.d" ] && ZAF_AGENT_CONFIGD="/etc/zabbix/zabbix_agentd.d"
[ -z "${ZAF_AGENT_CONFIGD}" ] && ! [ -d "${ZAF_AGENT_CONFIGD}" ] && [ -d "/etc/zabbix/zabbix_agentd.d" ] && ZAF_AGENT_CONFIGD="/etc/zabbix/zabbix_agentd.d"
zaf_get_option ZAF_AGENT_CONFIGD "Zabbix agent config.d" "/etc/zabbix/zabbix_agentd.conf.d/" "$INSTALL_MODE"
zaf_get_option ZAF_AGENT_BIN "Zabbix agent binary" "/usr/sbin/zabbix_agentd" "$INSTALL_MODE"
zaf_get_option ZAF_AGENT_RESTART "Zabbix agent restart cmd" "service zabbix-agent restart" "$INSTALL_MODE"
zaf_get_option ZAF_SERVER_CONFIG "Zabbix server config" "/etc/zabbix/zabbix_server.conf" "$INSTALL_MODE"
[ -z "${ZAF_SERVER_CONFIGD}" ] && ! [ -d "${ZAF_SERVER_CONFIGD}" ] && [ -d "/etc/zabbix/zabbix_server.d" ] && ZAF_SERVER_CONFIGD="/etc/zabbix/zabbix_server.d"
zaf_get_option ZAF_SERVER_CONFIGD "Zabbix server config.d" "/etc/zabbix/zabbix_server.conf.d/" "$INSTALL_MODE"
zaf_get_option ZAF_SERVER_BIN "Zabbix server binary" "/usr/sbin/zabbix_server" "$INSTALL_MODE"
zaf_get_option ZAF_SUDOERSD "Sudo sudoers.d directory" "/etc/sudoers.d" "$INSTALL_MODE"
zaf_get_option ZAF_CROND "Cron.d directory" "/etc/cron.d" "$INSTALL_MODE"
zaf_get_option ZAF_ZBXAPI_URL "Zabbix API url" "http://localhost/zabbix/api_jsonrpc.php" "$INSTALL_MODE"
zaf_get_option ZAF_ZBXAPI_USER "Zabbix API user" "zaf" "$INSTALL_MODE"
zaf_get_option ZAF_ZBXAPI_PASS "Zabbix API password" "" "$INSTALL_MODE"
zaf_get_option ZAF_ZBXAPI_AUTHTYPE "Zabbix API authentication type" "internal" "$INSTALL_MODE"
zaf_get_option ZAF_PLUGINS "Plugins to autoinstall" "" "$INSTALL_MODE"
if zaf_is_root && ! [ -x $ZAF_AGENT_BIN ]; then
zaf_err "Zabbix agent ($ZAF_AGENT_BIN) not installed? Use ZAF_AGENT_BIN env variable to specify location. Exiting."
@@ -221,6 +310,7 @@ zaf_configure(){
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"
[ "${ZAF_GIT}" = 1 ] && zaf_set_option ZAF_REPO_GITURL "$ZAF_REPO_GITURL"
zaf_set_option ZAF_REPO_DIR "$ZAF_REPO_DIR"
zaf_set_option ZAF_AGENT_CONFIG "$ZAF_AGENT_CONFIG"
@@ -230,17 +320,37 @@ zaf_configure(){
zaf_set_option ZAF_FILES_GID "$ZAF_FILES_GID"
zaf_set_option ZAF_FILES_UMASK "$ZAF_FILES_UMASK"
zaf_set_option ZAF_AGENT_RESTART "$ZAF_AGENT_RESTART"
if [ -x "$ZAF_SERVER_BIN" ]; then
zaf_set_option ZAF_SERVER_CONFIG "$ZAF_SERVER_CONFIG"
zaf_set_option ZAF_SERVER_CONFIGD "$ZAF_SERVER_CONFIGD"
zaf_set_option ZAF_SERVER_EXTSCRIPTS "$(zaf_get_zabbix_option $ZAF_SERVER_CONFIG ExternalScripts)"
zaf_set_option ZAF_SERVER_BIN "$ZAF_SERVER_BIN"
else
zaf_set_option ZAF_SERVER_CONFIG ""
zaf_set_option ZAF_SERVER_BIN ""
zaf_set_option ZAF_SERVER_CONFIGD ""
zaf_set_option ZAF_SERVER_EXTSCRIPTS ""
fi
zaf_set_option ZAF_SUDOERSD "$ZAF_SUDOERSD"
zaf_set_option ZAF_CROND "$ZAF_CROND"
zaf_set_option ZAF_ZBXAPI_URL "$ZAF_ZBXAPI_URL"
zaf_set_option ZAF_ZBXAPI_USER "$ZAF_ZBXAPI_USER"
zaf_set_option ZAF_ZBXAPI_PASS "$ZAF_ZBXAPI_PASS"
zaf_set_option ZAF_ZBXAPI_AUTHTYPE "$ZAF_ZBXAPI_AUTHTYPE"
[ -n "$ZAF_PREPACKAGED_DIR" ] && zaf_set_option ZAF_PREPACKAGED_DIR "$ZAF_PREPACKAGED_DIR"
if [ -n "$ZAF_PLUGINS" ]; then
for p in $(echo $ZAF_PLUGINS | tr ',' ' '); do
zaf_install_plugin $p
done
fi
if zaf_is_root; then
zaf_configure_agent $ZAF_AGENT_OPTIONS "$@"
zaf_add_agent_option "Include" "$ZAF_AGENT_CONFIGD"
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"
else
zaf_wrn "Skipping server config. Zabbix server binary '$ZAF_SERVER_BIN' not found."
fi
fi
if ! [ -d $ZAF_CACHE_DIR ]; then
@@ -257,15 +367,15 @@ zaf_configure(){
zaf_install_all() {
zaf_install_dir ${ZAF_LIB_DIR}
for i in lib/zaf.lib.sh lib/plugin.lib.sh lib/os.lib.sh lib/ctrl.lib.sh lib/cache.lib.sh lib/zbxapi.lib.sh lib/JSON.sh README.md; do
zaf_install $i ${ZAF_LIB_DIR}/ || zaf_err "Error installing $i"
for i in lib/zaf.lib.sh lib/plugin.lib.sh lib/os.lib.sh lib/ctrl.lib.sh lib/cache.lib.sh lib/zbxapi.lib.sh lib/JSON.sh; do
zaf_install $i ${ZAF_LIB_DIR}/
done
for i in lib/zaflock lib/zafcache lib/preload.sh; do
zaf_install_bin $i ${ZAF_LIB_DIR}/ || zaf_err "Error installing $i"
zaf_install_bin $i ${ZAF_LIB_DIR}/
done
zaf_install_dir ${ZAF_BIN_DIR}
for i in zaf; do
zaf_install_bin $i ${ZAF_BIN_DIR}/ || zaf_err "Error installing $i"
zaf_install_bin $i ${ZAF_BIN_DIR}/
done
zaf_install_dir ${ZAF_PLUGINS_DIR}
zaf_install_dir ${ZAF_PLUGINS_DIR}
@@ -278,6 +388,7 @@ zaf_postconfigure() {
[ "${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}"
@@ -296,16 +407,18 @@ zaf_postconfigure() {
if ! [ -f README.md ]; then
# Hardcoded variables
ZAF_VERSION="1.2"
ZAF_GITBRANCH="1.2"
ZAF_URL="https://github.com/limosek/zaf"
ZAF_RAW_URL="https://raw.githubusercontent.com/limosek/zaf"
ZAF_VERSION="1.3"
export ZAF_TMP_DIR="/tmp/zaf-installer"
export ZAF_DIR="$ZAF_TMP_DIR/zaf"
if [ -n "$ZAF_PROXY" ]; then
export ALL_PROXY="$ZAF_PROXY"
export http_proxy="$ZAF_PROXY"
export https_proxy="$ZAF_PROXY"
fi
mkdir -p $ZAF_TMP_DIR
if ! which curl >/dev/null;
if ! zaf_which curl >/dev/null && ! zaf_which wget >/dev/null;
then
zaf_err "Curl not found. Cannot continue. Please install it."
zaf_err "Curl or wget not found. Cannot continue. Please install it."
fi
echo "Installing from url $url..."
[ -z "$*" ] && auto=auto
@@ -315,7 +428,7 @@ if ! [ -f README.md ]; then
fi
# Try to load local downloaded libs
if ! type zaf_version >/dev/null; then
if ! type zaf_version >/dev/null 2>/dev/null; then
. lib/zaf.lib.sh
. lib/plugin.lib.sh
. lib/os.lib.sh
@@ -351,6 +464,9 @@ for pair in "$@"; do
zaf_wrn "Overriding $option from cmdline."
done
[ -z "$C_ZAF_TMP_DIR" ] && C_ZAF_TMP_DIR="/tmp/"
if [ -n "$ZAF_PROXY" ]; then
export ALL_PROXY="$ZAF_PROXY"
fi
case $1 in
interactive)
@@ -417,14 +533,16 @@ 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 " Server-Options: S_Option=value [...]"
echo " Zaf-Options: ZAF_OPT=value [...]"
echo " To unset Agent-Option use Z_Option=''"
echo
echo "Example 1 (default install): install.sh auto"
echo 'Example 2 (preconfigure agent options): install.sh auto A_Server=zabbix.server A_ServerActive=zabbix.server A_Hostname=$(hostname)'
echo "Example 3 (preconfigure zaf packaging system to use): install.sh auto ZAF_PKG=opkg"
echo "Example 4 (interactive): install.sh interactive"
echo
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'
echo "Example 4 (preconfigure zaf packaging system to use): install.sh auto ZAF_PKG=opkg"
echo "Example 5 (interactive): install.sh interactive"
echo
exit 1
esac

10
ipk.mk Normal file
View File

@@ -0,0 +1,10 @@
# Makefile for generating openwrt ipk packages
# Contrinutions welcome :)
ifeq ($(IPK_PKG),)
IPK_PKG=$(shell . lib/zaf.lib.sh; echo out/zaf-$$ZAF_VERSION.ipk)
endif
$(IPK_PKG):
@echo "Not supported yet. Contributions welcomed! :) "; exit 2

View File

@@ -1,27 +1,25 @@
# Zaf cache related functions
zaf_cache_init(){
[ -z "$ZAF_CACHE_DIR" ] && ZAF_CACHE_DIR=${ZAF_TMP_DIR}/zafc
if [ -w $ZAF_CACHE_DIR ]; then
zaf_trc "Cache: Removing stale entries"
(cd $ZAF_CACHE_DIR && find ./ -type f -name '*.info' -mmin +1 2>/dev/null | \
while read line ; do
rm -f $line $(basename $line .info)
done
)
else
local files
local file
if [ "$ZAF_CACHE_DIR" = "/tmp/zafc" ] && ! [ -d "$ZAF_CACHE_DIR" ]; then
mkdir -p $ZAF_CACHE_DIR
chown $ZAF_FILES_UID $ZAF_CACHE_DIR >/dev/null 2>/dev/null
fi
if ! [ -w $ZAF_CACHE_DIR ]; then
zaf_dbg "Cache dir $ZAF_CACHE_DIR is not accessible! Disabling cache."
fi
}
zaf_cache_clean(){
if [ -n "$ZAF_CACHE_DIR" ]; then
local files
if [ -w "$ZAF_CACHE_DIR" ]; then
zaf_wrn "Removing cache entries"
(cd $ZAF_CACHE_DIR && find ./ -type f -name '*.info' 2>/dev/null | \
while read line ; do
rm -f $line $(basename $line .info)
done
)
files=$(find $ZAF_CACHE_DIR/ -type f)
[ -n "$files" ] && rm -f $files
else
zaf_dbg "Cache dir not set. Disabling cache."
fi
@@ -33,45 +31,78 @@ zaf_cache_key(){
echo "$1" | (md5sum - ||md5) 2>/dev/null | cut -d ' ' -f 1
}
# Wait for lock
# $1 - key
zaf_cache_lock(){
local lockfile
lockfile="${ZAF_CACHE_DIR}/${key}.lock"
[ -f "$lockfile" ] && sleep 1
[ -f "$lockfile" ] && return 1
return 0
}
# Unlock cache key
# $1 - key
zaf_cache_unlock(){
local lockfile
lockfile="${ZAF_CACHE_DIR}/${key}.lock"
rm -f $lockfile
}
# Put object into cache
# $1 key
# $2 value
# $3 lifetime in seconds
zaf_tocache(){
! [ -w $ZAF_CACHE_DIR ] && return 1
! [ -w $ZAF_CACHE_DIR ] && return
local key
local value
local expiry
local infofile
local datafile
key=$(zaf_cache_key "$1")
rm -f $ZAF_CACHE_DIR/$key $ZAF_CACHE_DIR/${key}.info
echo "$2" >$ZAF_CACHE_DIR/$key
echo "$1" >$ZAF_CACHE_DIR/${key}.info
datafile=${ZAF_CACHE_DIR}/$key
infofile=${ZAF_CACHE_DIR}/${key}.info
zaf_cache_lock "$key" || { zaf_wrn "Cache: Entry $1[$key] locked!"; return 1; }
rm -f $datafile $infofile
echo "$2" >$datafile
echo "$1" >$infofile
expiry=$(zaf_date_add "$3")
zaf_trc "Cache: Saving entry $1[$key,expiry=$expiry]"
touch -m -d "$expiry" $ZAF_CACHE_DIR/${key}.info
touch -m -d "$expiry" $infofile
zaf_cache_unlock $key
}
# Put object into cache from stdin and copy to stdout
# $1 key
# $2 lifetime in seconds
zaf_tocache_stdin(){
! [ -w $ZAF_CACHE_DIR ] && return 1
! [ -w $ZAF_CACHE_DIR ] && { cat; return; }
local key
local expiry
local infofile
local datafile
key=$(zaf_cache_key "$1")
rm -f $ZAF_CACHE_DIR/$key $ZAF_CACHE_DIR/${key}.info
cat >$ZAF_CACHE_DIR/$key
if [ -s $ZAF_CACHE_DIR/$key ]; then
expiry="$(zaf_date_add $2)"
echo "$1 [key=$key,expiry=$expiry]" >$ZAF_CACHE_DIR/${key}.info
zaf_trc "Cache: Saving entry $1[key=$key,expiry=$expiry]"
touch -m -d "$expiry" $ZAF_CACHE_DIR/$key.info
cat $ZAF_CACHE_DIR/$key
else
rm -f "$ZAF_CACHE_DIR/$key"
fi
datafile=${ZAF_CACHE_DIR}/$key
lockfile=${ZAF_CACHE_DIR}/${key}.lock
infofile=${ZAF_CACHE_DIR}/${key}.info
zaf_cache_lock "$key" || { zaf_wrn "Cache: Entry $1[$key] locked!"; return 1; }
rm -f $datafile $infofile
cat >$datafile
expiry="$(zaf_date_add $2)"
echo "$1 [key=$key,expiry=$expiry]" >$infofile
zaf_trc "Cache: Saving entry $1[key=$key,expiry=$expiry]"
touch -m -d "$expiry" $infofile
zaf_cache_unlock "$key"
cat $datafile
}
# Remove entry from cache
@@ -81,15 +112,16 @@ zaf_cache_delentry(){
local key
key=$(zaf_cache_key "$1")
zaf_trc "Cache: removing $1($key) from cache"
rm -f "$ZAF_CACHE_DIR/$key*"
rm -f "${ZAF_CACHE_DIR}/$key*"
}
# List entries in cache
zaf_cache_list(){
! [ -w $ZAF_CACHE_DIR ] && return 1
local i
ls $ZAF_CACHE_DIR/*info >/dev/null 2>/dev/null || return 1
ls ${ZAF_CACHE_DIR}/*info >/dev/null 2>/dev/null || return 1
local key
for i in $ZAF_CACHE_DIR/*info; do
for i in ${ZAF_CACHE_DIR}/*info; do
cat $i
done
}
@@ -97,18 +129,22 @@ zaf_cache_list(){
# Get object from cache
# $1 key
zaf_fromcache(){
! [ -r $ZAF_CACHE_DIR ] || [ -n "$ZAF_NOCACHE" ] && return 1
! [ -w $ZAF_CACHE_DIR ] && return 3
local key
local value
local infofile
local datafile
key=$(zaf_cache_key "$1")
if [ -f $ZAF_CACHE_DIR/$key ]; then
! [ -f "$ZAF_CACHE_DIR/$key.info" ] && { return 3; }
if [ "$ZAF_CACHE_DIR/$key.info" -nt "$ZAF_CACHE_DIR/$key" ]; then
datafile="${ZAF_CACHE_DIR}/${key}"
infofile="${ZAF_CACHE_DIR}/${key}.info"
if [ -f $datafile ]; then
if [ "$infofile" -nt "$datafile" ]; then
zaf_trc "Cache: serving $1($key) from cache"
cat $ZAF_CACHE_DIR/$key
cat "$datafile"
else
zaf_trc "Cache: removing old entry $1"
rm -f "$ZAF_CACHE_DIR/$key*"
zaf_cache_delentry $key
return 2
fi
else
@@ -117,3 +153,4 @@ zaf_fromcache(){
fi
}

View File

@@ -5,6 +5,25 @@ zaf_ctrl_get_items() {
grep '^Item ' | cut -d ' ' -f 2 | cut -d ':' -f 1 | tr '\r\n' ' '
}
# Get external item list from control on stdin
zaf_ctrl_get_extitems() {
grep '^ExtItem ' | cut -d ' ' -f 2 | cut -d ':' -f 1 | tr '\r\n' ' '
}
# Get external item body from stdin
# $1 itemname
zaf_ctrl_get_extitem_block() {
grep -v '^#' | awk '/^ExtItem '$1'/ { i=0;
while (i==0) {
getline;
if (/^\/ExtItem/) exit;
print $0;
}};
END {
exit i==0;
}'
}
# Get item body from stdin
# $1 itemname
zaf_ctrl_get_item_block() {
@@ -25,7 +44,7 @@ zaf_ctrl_get_global_block() {
grep -vE '^#[a-zA-Z ]' | awk '{ i=0; print $0;
while (i==0) {
getline;
if (/^Item /) exit;
if (/^(Item |ExtItem)/) exit;
print $0;
}}'
}
@@ -33,7 +52,7 @@ zaf_ctrl_get_global_block() {
# Get item multiline option
# $1 optionname
zaf_block_get_moption() {
awk '/^'$1'::$/ { i=0;
awk '/^'$1'::$/ { i=0; if (!/::/) print $0;
while (i==0) {
getline;
if (/^::$/) {i=1; continue;};
@@ -57,7 +76,7 @@ zaf_block_get_option() {
zaf_ctrl_get_global_option() {
local ctrlvar
local ctrlopt
ctrlopt="ZAF_CTRL_$(zaf_stripctrl $2)"
eval ctrlvar=\$$ctrlopt
if [ -n "$ctrlvar" ]; then
@@ -68,6 +87,7 @@ zaf_ctrl_get_global_option() {
|| zaf_ctrl_get_global_block <$1 | zaf_block_get_option "$2"
fi
}
# Get item specific option (single or multiline)
# $1 - control file
# $2 - item name
@@ -84,19 +104,41 @@ zaf_ctrl_get_item_option() {
else
zaf_ctrl_get_item_block <$1 "$2" | zaf_block_get_moption "$3" \
|| zaf_ctrl_get_item_block <$1 "$2" | zaf_block_get_option "$3"
fi
}
# Get external item specific option (single or multiline)
# $1 - control file
# $2 - item name
# $3 - option name
zaf_ctrl_get_extitem_option() {
local ctrlvar
local ctrlopt
ctrlopt="ZAF_CTRLI_$(zaf_stripctrl $2)_$(zaf_stripctrl $3)"
eval ctrlvar=\$$ctrlopt
if [ -n "$ctrlvar" ]; then
zaf_dbg "Overriding item control field $2/$3 from env $ctrlopt($ctrlvar)"
echo $ctrlopt
else
zaf_ctrl_get_extitem_block <$1 "$2" | zaf_block_get_moption "$3" \
|| zaf_ctrl_get_extitem_block <$1 "$2" | zaf_block_get_option "$3"
fi
}
# Check dependencies based on control file
zaf_ctrl_check_deps() {
local deps
deps=$(zaf_ctrl_get_global_block <$1 | zaf_block_get_option "Depends-${ZAF_PKG}" )
if ! zaf_os_specific zaf_check_deps $deps; then
zaf_err "Missing one of dependend system packages: $deps"
if [ -n "$ZAF_PKG" ]; then
deps=$(zaf_ctrl_get_global_block <$1 | zaf_block_get_option "Depends-${ZAF_PKG}" )
if ! zaf_os_specific zaf_check_deps $deps; then
zaf_err "Missing one of dependend system packages: $deps"
fi
fi
deps=$(zaf_ctrl_get_global_block <$1 | zaf_block_get_option "Depends-bin" )
for cmd in $deps; do
if ! which $cmd >/dev/null; then
if ! zaf_which $cmd >/dev/null; then
zaf_err "Missing binary dependency $cmd. Please install it first."
fi
done
@@ -115,17 +157,19 @@ zaf_ctrl_sudo() {
pdir="$3"
plugin=$1
sudo=$(zaf_ctrl_get_global_option $2 "Sudo" | zaf_far '{PLUGINDIR}' "${plugindir}")
[ -z "$sudo" ] || [ -z "$ZAF_SUDOERSD" ] && return
! [ -d "$ZAF_SUDOERSD" ] && { zaf_wrn "$ZAF_SUDOERSD nonexistent! Skipping sudo install!"; return 1; }
zaf_dbg "Installing sudoers entry $ZAF_SUDOERSD/zaf_$plugin"
sudo=$(zaf_ctrl_get_global_option $2 "Sudo" | zaf_far '{PLUGINDIR}' "${plugindir}")
[ -z "$sudo" ] && return # Nothing to install
if ! which sudo >/dev/null; then
if ! zaf_which sudo >/dev/null; then
zaf_wrn "Sudo needed bud not installed?"
fi
cmd=$(echo $sudo | cut -d ' ' -f 1)
parms=$(echo $sudo | cut -d ' ' -f 2-)
if which $cmd >/dev/null ; then
(echo "zabbix ALL=NOPASSWD:SETENV: $(which $cmd) $(echo $parms | tr '%' '*')";echo) >$ZAF_SUDOERSD/zaf_$plugin || zaf_err "Error during zaf_ctrl_sudo"
if zaf_which $cmd >/dev/null ; then
(echo "zabbix ALL=NOPASSWD:SETENV: $(zaf_which $cmd) $(echo $parms | tr '%' '*')";echo) >$ZAF_SUDOERSD/zaf_$plugin || zaf_err "Error during zaf_ctrl_sudo"
chmod 0440 $ZAF_SUDOERSD/zaf_$plugin
else
zaf_err "Cannot find binary '$cmd' to put into sudoers."
@@ -143,9 +187,10 @@ zaf_ctrl_cron() {
pdir="$3"
plugin=$1
cron=$(zaf_ctrl_get_global_option $2 "Cron")
[ -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"
cron=$(zaf_ctrl_get_global_option $2 "Cron")
[ -z "$cron" ] && return # Nothing to install
zaf_ctrl_get_global_option $2 "Cron" | zaf_far '{PLUGINDIR}' "${plugindir}" >$ZAF_CROND/zaf_$plugin || zaf_err "Error during zaf_ctrl_cron"
}
@@ -171,20 +216,17 @@ zaf_ctrl_install() {
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_fetch_url "$1/$f" >"${ZAF_TMP_DIR}/$f"
zaf_install "${ZAF_TMP_DIR}/$f" "$pdir"
done
script=$(zaf_ctrl_get_global_option $2 "Install-script")
[ -n "$script" ] && eval "$script"
true
) || zaf_err "Error during zaf_ctrl_install"
}
# Generates zabbix cfg from control file
# Generates zabbix items cfg from control file
# $1 control
# $2 pluginname
# $3 if nonempty, only return cfg, do not generate scripts
zaf_ctrl_generate_cfg() {
zaf_ctrl_generate_items_cfg() {
local items
local cmd
local iscript
@@ -203,6 +245,7 @@ zaf_ctrl_generate_cfg() {
(set -e
for i in $items; do
iscript=$(zaf_stripctrl $i)
zafparams=""
zaf_ctrl_get_item_option $1 $i "Parameters" >$tmpfile
if [ -s "$tmpfile" ]; then
ikey="$2.$i[*]"
@@ -245,8 +288,72 @@ zaf_ctrl_generate_cfg() {
fi
zaf_err "Item $i declared in control file but has no Cmd, Function or Script!"
done
) || zaf_err "Error during zaf_ctrl_generate_cfg"
) || zaf_err "Error during zaf_ctrl_generate_items_cfg"
rm -f $tmpfile
}
# Generates zabbix items cfg from control file
# $1 control
# $2 pluginname
zaf_ctrl_generate_extitems_cfg() {
local items
local cmd
local iscript
local ikey
local lock
local cache
local tmpfile
local pname
local pdefault
local pregex
local prest
local zafparms
items=$(zaf_ctrl_get_extitems <"$1")
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
args=""
apos=1;
while read pname pdefault pregex prest; do
zafparams="$zafparams value=\"\$$apos\"; zaf_agentparm $pname $pdefault $pregex; export $pname; "
args="$args \$$apos"
apos=$(expr $apos + 1)
done <$tmpfile
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
lock="${ZAF_LIB_DIR}/zaflock $lock "
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
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
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!"
done
) || zaf_err "Error during zaf_ctrl_generate_extitems_cfg"
rm -f $tmpfile
}

View File

@@ -1,17 +1,17 @@
# Os related functions
zaf_configure_os_openwrt() {
ZAF_AGENT_RESTART="zaf agent-config ; /etc/init.d/zabbix_agentd restart"
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_configure_os_beesip() {
zaf_configure_os_openwrt
zaf_preconfigure_os_beesip() {
zaf_preconfigure_os_openwrt
}
zaf_configure_os_freebsd() {
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/"
@@ -20,31 +20,52 @@ zaf_configure_os_freebsd() {
ZAF_SUDOERSD="/usr/local/etc/sudoers.d"
}
zaf_postconfigure_os_openwrt() {
if ! grep -q "zaf agent-config" /etc/init.d/zabbix_agentd; then
sed -i 's/uci2config $NAME/uci2config $NAME; zaf agent-config/' /etc/init.d/zabbix_agentd
fi
}
zaf_postconfigure_os_beesip() {
zaf_postconfigure_os_openwrt
}
zaf_which() {
if which >/dev/null 2>/dev/null; then
which "$1"
else
for i in /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin; do
[ -x $i/$1 ] && { echo $i/$1; return; }
done
return 1
fi
}
zaf_detect_system() {
ZAF_FILES_UID=zabbix
ZAF_FILES_GID=zabbix
ZAF_FILES_UMASK=0770
if which dpkg >/dev/null; then
if zaf_which dpkg >/dev/null; then
ZAF_PKG=dpkg
ZAF_OS=$(lsb_release -is|zaf_tolower)
ZAF_OS_CODENAME=$(lsb_release -cs|zaf_tolower)
ZAF_CURL_INSECURE=0
ZAF_AGENT_PKG="zabbix-agent"
return
else if which rpm >/dev/null; then
else if zaf_which rpm >/dev/null; then
ZAF_PKG="rpm"
ZAF_OS=$(lsb_release -is|zaf_tolower)
ZAF_OS_CODENAME=$(lsb_release -cs|zaf_tolower)
ZAF_CURL_INSECURE=0
ZAF_AGENT_PKG="zabbix-agent"
return
else if which opkg >/dev/null; then
else if zaf_which opkg >/dev/null; then
ZAF_PKG="opkg"
. /etc/openwrt_release
ZAF_OS="$(echo $DISTRIB_ID|zaf_tolower)"
ZAF_OS_CODENAME="$(echo $DISTRIB_CODENAME|zaf_tolower)"
return
else if which pkg >/dev/null; then
else if zaf_which pkg >/dev/null; then
ZAF_PKG="pkg"
ZAF_OS="freebsd"
ZAF_OS_CODENAME="$(freebsd-version|cut -d '-' -f 1)"
@@ -81,7 +102,7 @@ zaf_os_specific(){
}
zaf_is_root(){
[ "$USER" = "root" ]
[ "$USER" = "root" ] || [ "$EUID" = "0" ] || [ -n "$ZAF_ISROOT" ]
}
# Install file, bin or directory and respect install prefix
@@ -89,19 +110,19 @@ zaf_is_root(){
# $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_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_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_DO mkdir -p "$INSTALL_PREFIX/$1" || zaf_err "Cannot create directory $INSTALL_PREFIX/$1!"
}
# $1 - file
zaf_touch(){
@@ -119,15 +140,6 @@ zaf_uninstall(){
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" \
&& 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
@@ -137,7 +149,7 @@ zaf_install_agent_opkg() {
# $* - packages
zaf_check_deps_dpkg() {
for i in $*; do
dpkg-query -f '${Status},${Package}\n' -W $* 2>/dev/null | grep -q "^install ok installed"
dpkg-query -f '${db:Status-Status},${Package}\n' -W $* 2>/dev/null | grep -qE "^(installed|^,)"
done
}

View File

@@ -18,24 +18,16 @@ zaf_update_repo() {
zaf_get_plugin_url() {
local url
if echo "$1" | grep -q '/'; then
if [ "$(zaf_url_info $1)" = "path" ]; then
url="$1" # plugin with path - from directory
else
if echo "$1" | grep -q ^http; then
if [ "$(zaf_url_info $1)" = "url" ]; then
url="$1" # plugin with http[s] url
else
if [ -d "${ZAF_REPO_DIR}/$1" ]; then
url="${ZAF_REPO_DIR}/$1"
if [ -n "${ZAF_REPO_URL}" ]; then
url="${ZAF_REPO_URL}/$1"
else
if [ -n "${ZAF_PREPACKAGED_DIR}" ] && [ -d "${ZAF_PREPACKAGED_DIR}/$1" ]; then
url="${ZAF_PREPACKAGED_DIR}/$1"
else
if [ -n "${ZAF_REPO_URL}" ]; then
url="${ZAF_REPO_URL}/$1"
else
zaf_err "Cannot find plugin $1"
fi
fi
zaf_err "Cannot find plugin $1"
fi
fi
fi
@@ -55,6 +47,7 @@ zaf_plugin_info() {
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}")
peitems=$(zaf_ctrl_get_extitems <"${control}")
echo
echo -n "Plugin '$plugin' "; [ -n "$pversion" ] && echo -n "version ${pversion}"; echo ":"
echo "$pdescription"; echo
@@ -64,11 +57,12 @@ zaf_plugin_info() {
echo
if zaf_is_plugin "$(basename $plugin)"; then
items=$(zaf_list_plugin_items $plugin)
[ -n "$items" ] && echo -n "Defined items: "; echo $items
[ -n "$items" ] && { echo -n "Defined items: "; echo $items; }
items=$(zaf_list_plugin_items $plugin test)
[ -n "$items" ] && echo -n "Test items: "; echo $items
[ -n "$items" ] && { echo -n "Test items: "; echo $items; }
items=$(zaf_list_plugin_items $plugin precache)
[ -n "$items" ] && echo -n "Precache items: "; echo $items
[ -n "$items" ] && { echo -n "Precache items: "; echo $items; }
[ -n "$peitems" ] && { echo -n "External check items: "; echo $peitems; }
else
echo "Items: $pitems"
fi
@@ -82,16 +76,24 @@ zaf_prepare_plugin() {
local url
local plugindir
local control
local pluginname
url=$(zaf_get_plugin_url "$1")/control.zaf || exit $?
plugindir="$2"
control=${plugindir}/control.zaf
if [ "$(zaf_url_info $1)" = "path" ] && [ "$url" = "$control" ]; then
zaf_err "prepare_plugin: Cannot install from itself!"
fi
zaf_install_dir "$plugindir"
zaf_dbg "Fetching control file from $url ..."
if zaf_fetch_url "$url" >"${control}"; then
zaf_ctrl_check_deps "${control}"
if zaf_fetch_url "$url" >"${INSTALL_PREFIX}/${control}" && [ -s "${INSTALL_PREFIX}/${control}" ]; then
[ -z "${INSTALL_PREFIX}" ] && zaf_ctrl_check_deps "${control}"
pluginname=$(zaf_ctrl_get_global_block <"${INSTALL_PREFIX}/${control}" | zaf_block_get_option Plugin)
[ "$(basename $plugindir)" != "$pluginname" ] && zaf_err "prepare_plugin: Plugin name mismach ($plugindir vs ${INSTALL_PREFIX}/${control})!"
true
else
zaf_err "prepare_plugin: Cannot fetch or write control file $control from url $url!"
rm -rf "$plugindir"
zaf_err "prepare_plugin: Cannot fetch or write control file ${INSTALL_PREFIX}/$control from url $url!"
fi
}
@@ -99,35 +101,57 @@ zaf_install_plugin() {
local url
local plugin
local plugindir
local tmpplugindir
local control
local version
if zaf_prepare_plugin "$1" "${ZAF_TMP_DIR}/plugin"; then
plugin=$(basename "$1")
plugindir="${ZAF_PLUGINS_DIR}/${plugin}"
if [ -n "$plugin" ] && zaf_prepare_plugin "$1" $plugindir; then
url=$(zaf_get_plugin_url "$1")
control="${ZAF_TMP_DIR}/plugin/control.zaf"
plugin=$(zaf_ctrl_get_global_option $control Plugin)
version=$(zaf_ctrl_get_global_option $control Version)
plugindir="${ZAF_PLUGINS_DIR}"/$plugin
if [ -n "$plugin" ] && zaf_prepare_plugin "$1" $plugindir; then
zaf_wrn "Installing plugin $plugin version $version"
zaf_dbg "Source url: $url, Destination dir: $plugindir"
control=${plugindir}/control.zaf
[ "$ZAF_DEBUG" -gt 1 ] && zaf_plugin_info "${control}"
zaf_wrn "Installing plugin $plugin"
zaf_dbg "Source url: $url, Destination dir: $plugindir"
control=${plugindir}/control.zaf
[ "$ZAF_DEBUG" -gt 1 ] && zaf_plugin_info "${control}"
if [ -z "${INSTALL_PREFIX}" ]; then
zaf_ctrl_check_deps "${control}"
zaf_ctrl_sudo "$plugin" "${control}" "${plugindir}"
zaf_ctrl_cron "$plugin" "${control}" "${plugindir}"
zaf_ctrl_generate_cfg "${control}" "${plugin}" \
zaf_ctrl_generate_items_cfg "${control}" "${plugin}" \
| zaf_far '{PLUGINDIR}' "${plugindir}" >${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf
zaf_dbg "Generated ${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf"
zaf_ctrl_install "$url" "${control}" "${plugindir}"
zaf_ctrl_generate_extitems_cfg "${control}" "${plugin}"
else
zaf_err "Cannot install plugin '$plugin' to $plugindir!"
zaf_touch "${plugindir}/postinst.need"
fi
else
zaf_err "Cannot prepare plugin $1"
zaf_ctrl_install "$url" "${control}" "${plugindir}"
else
zaf_err "Cannot install plugin '$plugin' to $plugindir!"
fi
}
zaf_postinstall_plugin() {
local url
local plugin
local plugindir
local tmpplugindir
local control
local version
plugin=$(basename "$1")
plugindir="${ZAF_PLUGINS_DIR}/${plugin}"
control=${plugindir}/control.zaf
[ "$ZAF_DEBUG" -gt 1 ] && zaf_plugin_info "${control}"
zaf_ctrl_check_deps "${control}"
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_dbg "Generated ${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf"
zaf_ctrl_generate_extitems_cfg "${control}" "${plugin}"
}
# List installed plugins
# $1 - plugin
zaf_list_plugins() {

View File

@@ -1,7 +1,7 @@
# Hardcoded variables
ZAF_VERSION="1.2"
ZAF_GITBRANCH="1.2"
ZAF_VERSION="1.3"
ZAF_GITBRANCH="1.3"
ZAF_URL="https://github.com/limosek/zaf"
ZAF_RAW_URL="https://raw.githubusercontent.com/limosek/zaf"
@@ -12,12 +12,15 @@ zaf_msg() {
}
zaf_trc() {
[ "$ZAF_DEBUG" -ge "3" ] && logger -p user.info ${ZAF_LOG_STDERR} -t zaf-trace -- $@
return 0
}
zaf_dbg() {
[ "$ZAF_DEBUG" -ge "2" ] && logger -p user.debug ${ZAF_LOG_STDERR} -t zaf-debug -- $@
return 0
}
zaf_wrn() {
[ "$ZAF_DEBUG" -ge "1" ] && logger -p user.warn ${ZAF_LOG_STDERR} -t zaf-warning -- $@
return 0
}
zaf_err() {
logger ${ZAF_LOG_STDERR} -p user.err -t zaf-error -- $@
@@ -99,13 +102,33 @@ zaf_fetch_url() {
case $scheme in
http|https|ftp|file)
[ "$scheme" != "file" ] && [ -n "$ZAF_OFFLINE" ] && zaf_err "Cannot download $1 in offline mode!"
[ "${ZAF_CURL_INSECURE}" = "1" ] && insecure="-k"
zaf_dbg curl $insecure -f -s -L -o - $1
curl $insecure -f -s -L -o - "$1" | zaf_tocache_stdin "$1" 120
if zaf_which curl >/dev/null 2>/dev/null; then
[ "${ZAF_CURL_INSECURE}" = "1" ] && insecure="-k"
zaf_dbg curl $insecure -f -s -L -o - $1
curl $insecure -f -s -L -o - "$1" | zaf_tocache_stdin "$1" 120
else
[ "${ZAF_CURL_INSECURE}" = "1" ] && insecure="--no-check-certificate"
zaf_dbg wget $insecure -O - $1
wget $insecure -O - "$1" | zaf_tocache_stdin "$1" 120
fi
;;
esac
}
# Get info about url
# returns path or url
zaf_url_info() {
if echo "$1" | grep -q '^/'; then
echo "path"
else
if echo "$1" | grep -q ^http; then
echo "url"
else
echo "unknown"
fi
fi
}
# Find and replace string
zaf_far(){
local f
@@ -216,6 +239,12 @@ zaf_restart_agent() {
${ZAF_AGENT_RESTART} || zaf_err "Cannot restart Zabbix agent (${ZAF_AGENT_RESTART}). Try $ZAF_AGENT_BIN -f !";
}
# Check if zaf.version item is populated
zaf_check_agent_config() {
zaf_restart_agent
${ZAF_AGENT_BIN} -t zaf.version
}
zaf_tolower() {
tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'
}
@@ -260,7 +289,7 @@ zaf_random() {
# Emulate sudo
zaf_sudo() {
if zaf_is_root || ! which sudo >/dev/null 2>/dev/null; then
if zaf_is_root || ! zaf_which sudo >/dev/null 2>/dev/null; then
$@
else
sudo $@

View File

@@ -19,16 +19,8 @@ else
fi
if ! zaf_fromcache "$key"; then
zaf_fromcache "$key" >/dev/null 2>/dev/null
[ $? -eq 3 ] && { zaf_err "Operation $key already in progress."; }
if which at >/dev/null 2>/dev/null; then
at -M now >/dev/null 2>/dev/null <<EOF
. $(dirname $0)/preload.sh; tmpf=\$(zaf_tmpfile cache); $@ 2>"\$tmpf" | zaf_tocache_stdin "$key" "$seconds" ; [ -s \$tmpf ] && zaf_wrn <\$tmpf
EOF
else
tmpf=$(zaf_tmpfile cache)
$@ 2>"$tmpf" | zaf_tocache_stdin "$key" "$seconds"
[ -s $tmpf ] && zaf_wrn <$tmpf
fi
tmpf=$(zaf_tmpfile cache)
$@ 2>"$tmpf" | zaf_tocache_stdin "$key" "$seconds"
[ -s $tmpf ] && zaf_wrn <$tmpf
fi

29
lib/zafext Normal file
View File

@@ -0,0 +1,29 @@
#!/bin/sh
. /etc/zaf.conf
. ${ZAF_LIB_DIR}/zaf.lib.sh
. ${ZAF_LIB_DIR}/plugin.lib.sh
. ${ZAF_LIB_DIR}/ctrl.lib.sh
. ${ZAF_LIB_DIR}/os.lib.sh
. ${ZAF_LIB_DIR}/zbxapi.lib.sh
. ${ZAF_LIB_DIR}/cache.lib.sh
if ! type zaf_version >/dev/null; then
echo "Problem loading libraries?"
exit 2
fi
zaf_debug_init
zaf_tmp_init
zaf_cache_init
export ZAF_LIB_DIR
export ZAF_TMP_DIR
export ZAF_CACHE_DIR
export ZAF_PLUGINS_DIR
export ZAF_DEBUG
unset ZAF_LOG_STDERR
export PATH
export ZAF_ITEM=$(basename $0)

10
rpm.mk Normal file
View File

@@ -0,0 +1,10 @@
# Makefile for generating rpm packages
# Contrinutions welcome :)
ifeq ($(RPM_PKG),)
RPM_PKG=$(shell . lib/zaf.lib.sh; echo out/zaf-$$ZAF_VERSION.rpm)
endif
$(RPM_PKG):
@echo "Not supported yet. Contributions welcomed! :) "; exit 2

43
zaf
View File

@@ -25,6 +25,12 @@ ZAF_CFG_FILE="/etc/zaf.conf"
[ -n "$secondstage" ] && exec $0 $params
fi
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
@@ -55,9 +61,21 @@ 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<git $ZAF_GITBRANCH>"
echo "$ZAF_VERSION"
[ $ZAF_DEBUG -gt 1 ] && set |grep -E ^ZAF_
;;
@@ -67,20 +85,33 @@ userparms)
for plugin in $(zaf_list_plugins); do
plugindir=$ZAF_PLUGINS_DIR/$plugin
control=$plugindir/control.zaf
zaf_ctrl_generate_cfg "${control}" "${plugin}" "noscripts" \
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
zaf_dbg "Generating ${ZAF_AGENT_CONFIGD}/zaf_${plugin}.conf"
zaf_ctrl_generate_cfg "${control}" "${plugin}" \
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)
@@ -221,7 +252,7 @@ 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 ! which curl >/dev/null;
if ! zaf_which curl >/dev/null;
then
zaf_err "Curl not found. Cannot continue. Please install it."
fi
@@ -423,7 +454,7 @@ api)
echo
echo "Agent config info commands:"
zaf_hlp "$0 userparms" "See userparms generated from zaf on stdout"
zaf_hlp "$0 agent-config" "Reconfigure zabbix userparms in $ZAF_AGENT_CONFIGD"
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"