mirror of
				https://github.com/limosek/zaf.git
				synced 2025-10-31 17:47:37 +01:00 
			
		
		
		
	Compare commits
	
		
			39 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 5bff2c5dc6 | ||
|   | 41d6d508f0 | ||
|   | 26d9d0ab55 | ||
|   | 8afcc37c7b | ||
|   | d823a3665a | ||
|   | b003e4f29f | ||
|   | f2b199ed2a | ||
|   | 2e8a27e6ac | ||
|   | 25d47e6ba8 | ||
|   | 71a79ed57f | ||
|   | 9ac7bd34d4 | ||
|   | 0ef05853a4 | ||
|   | 3e2f1502d1 | ||
|   | 407fb2f77f | ||
|   | bc1cbaf144 | ||
|   | 4842cdaee1 | ||
|   | 336d120bb5 | ||
|   | b535eb58e2 | ||
|   | 6697df6519 | ||
|   | 92b3b626aa | ||
|   | 79c1992f56 | ||
|   | 0d6fd293a3 | ||
|   | 1c876c756c | ||
|   | 8e8e1b9dfc | ||
|   | 375f805b6a | ||
|   | ce843ddd55 | ||
|   | 5838292856 | ||
|   | cc244ef791 | ||
|   | 006a9fc99b | ||
|   | 72ef383146 | ||
|   | b80fd5ce7f | ||
|   | f72488708b | ||
|   | f110e9aec7 | ||
|   | b9551fb2f2 | ||
|   | 8e9d950411 | ||
|   | 93b482dc69 | ||
|   | 3ad71262e2 | ||
|   | c2316d2341 | ||
|   | f9584ff673 | 
							
								
								
									
										93
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										93
									
								
								Makefile
									
									
									
									
									
								
							| @@ -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 | ||||
|  | ||||
| 	 | ||||
|   | ||||
							
								
								
									
										81
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								README.md
									
									
									
									
									
								
							| @@ -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
									
								
							
							
						
						
									
										22
									
								
								arch.mk
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										57
									
								
								deb.mk
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										39
									
								
								files/archlinux/PKGBUILD
									
									
									
									
									
										Normal 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} | ||||
| } | ||||
|  | ||||
							
								
								
									
										10
									
								
								files/debian/postinst.template
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								files/debian/postinst.template
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| case $1 in | ||||
| configure) | ||||
|   zaf agent-config | ||||
| ;; | ||||
| esac | ||||
|  | ||||
| true | ||||
|  | ||||
| @@ -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 | ||||
|  | ||||
							
								
								
									
										250
									
								
								install.sh
									
									
									
									
									
								
							
							
						
						
									
										250
									
								
								install.sh
									
									
									
									
									
								
							| @@ -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
									
								
							
							
						
						
									
										10
									
								
								ipk.mk
									
									
									
									
									
										Normal 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 | ||||
|  | ||||
							
								
								
									
										121
									
								
								lib/cache.lib.sh
									
									
									
									
									
								
							
							
						
						
									
										121
									
								
								lib/cache.lib.sh
									
									
									
									
									
								
							| @@ -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 | ||||
| } | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										147
									
								
								lib/ctrl.lib.sh
									
									
									
									
									
								
							
							
						
						
									
										147
									
								
								lib/ctrl.lib.sh
									
									
									
									
									
								
							| @@ -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 | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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 | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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() { | ||||
|   | ||||
| @@ -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 $@ | ||||
|   | ||||
							
								
								
									
										14
									
								
								lib/zafcache
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								lib/zafcache
									
									
									
									
									
								
							| @@ -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
									
								
							
							
						
						
									
										29
									
								
								lib/zafext
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										10
									
								
								rpm.mk
									
									
									
									
									
										Normal 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
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								zaf
									
									
									
									
									
								
							| @@ -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" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user