First scripts

pull/1/head
Lukas Macura 2016-03-23 14:37:51 +01:00
parent b048d26533
commit 5e566a2046
7 changed files with 400 additions and 26 deletions

View File

@ -1,53 +1,41 @@
# zaf
Zabbix Agent Framework
# Zabbix Agent Framework
This tool is used to maintain external zabbix checks in *one place*. There are lot of places where it is possible to download many external checks.
But there is problem with installation, update and centralised management. This tool should do all of this in easy steps.
But there is problem with installation, update and centralised management. This tool should do all of this in easy steps. Today is is in devel stage and not everything works.
I will try to make it working :)
## Example
Best way how to explain everything is example. Supposing we are working on debian-like system.
```
sudo apt-get install software-properties-common
sudo add-apt-repository xxx/zaf
sudo apt-get update
sudo apt-get install zaf
sudo zaf add-repository http://some.other.project/
sudo zaf update
sudo zaf install process-discovery
sudo zaf upgrade
curl https://raw.githubusercontent.com/limosek/zaf/master/install.sh | sudo sh
sudo zaf install process-info
sudo zaf install http://other.check.domain/check/
zaf make-deb
zaf make-opkg
zaf make-rpm
zaf self-upgrade
```
## Zaf APT repository
Zaf APT repository is for easier installation of zaf itself. It can be skipped or zaf can be installed directly.
## Zaf repository
Zaf repository is place where zaf plugins are located. There can be lot of repositories. In fact, every zaf plugin can have its own repo.
## Zaf plugin
Zaf plugin is set of configuration options and binaries which are needed for specific checks. For example, to monitor postfix, we need some cron job which is automaticaly run and next ti this, some external items which has to be configured.
## How it works
There is central zaf reposirory on github. There are basic checks and zaf code itself. Next to this, each project can have its own zaf structure. Adding url of plugin to zaf will make it useable and updatable.
## Zaf repository structure
Each zaf repository url MUST have this items:
```
/zaf.md # Documentation
/zaf.plugins # List of plugins, one plugin per line
```
## Zaf plugin structure
Each zaf plugin url MUST have this items:
```
/plugin/README.md # Documentation
/plugin/control # Control file
/plugin/template.xml # Template for Zabbix
```
## Zaf control file
## Zaf control file
Control files are similar to Debian Control files
```
will be explained
```

110
install.sh Executable file
View File

@ -0,0 +1,110 @@
#!/bin/sh
readopt(){
echo -n "$1 [$2]: "
read opt
[ -z "$opt" ] && opt="$2"
}
getrest(){
if [ -f "$(dirname $0)/$1" ]; then
echo "$(dirname $0)/$1"
else
wget https://raw.githubusercontent.com/limosek/zaf/master/$1 -O- >${ZAF_TMP_DIR}/$(basename $1)
echo ${ZAF_TMP_DIR}/$(basename $1)
fi
}
preconf(){
echo "Zabbix Agent Framework installer."
if ! which zabbix_agentd >/dev/null; then
echo "Zabbix agent not installed? Exiting."
exit 3
fi
if ! [ -f "/etc/zaf.conf" ] || [ -n "$1" ]; then
readopt "Tmp directory" "/tmp/zaf"
ZAF_TMP_DIR="$opt"
readopt "Libraries directory" "/usr/lib/zaf"
ZAF_LIB_DIR="$opt"
readopt "Plugins directory" "${ZAF_LIB_DIR}/plugins"
ZAF_PLUGINS_DIR="$opt"
readopt "Git plugins directory" "${ZAF_LIB_DIR}/repo"
ZAF_REPO_DIR="$opt"
readopt "Plugins repository" "https://github.com/limosek/zaf.git/plugins"
ZAF_PLUGINS_REPO="$opt"
readopt "Default plugins to install" "process-info"
ZAF_DEFAULT_PLUGINS="$opt"
readopt "Zabbix agent config" "/etc/zabbix/zabbix_agentd.conf"
ZAF_AGENT_CONFIG="$opt"
readopt "Zabbix agent restart cmd" "service zabbix-agent restart"
ZAF_AGENT_RESTART="$opt"
if which sudo >/dev/null; then
sudo=1
else
sudo=0
fi
readopt "Use sudo" "$sudo"
ZAF_SUDO="$opt"
else
echo "Skipping configuration. Config file /etc/zaf.conf already exists."
. /etc/zaf.conf
fi
if [ "$USERNAME" = "root" ]; then
echo "We are root. That is OK."
else
if [ "$ZAF_SUDO" = 1 ] && ! which sudo >/dev/null; then
echo "We are not root and sudo is not installed. Cannot continue."
exit 2
fi
echo "We are not root. Assuming we have enough privileges."
fi
echo "ZAF_LIB_DIR='$ZAF_LIB_DIR'" >/etc/zaf.conf || { echo "Not enough privileges. Please become root!"; exit 2; }
echo "ZAF_TMP_DIR='$ZAF_TMP_DIR'" >>/etc/zaf.conf
echo "ZAF_PLUGINS_DIR='$ZAF_PLUGINS_DIR'" >>/etc/zaf.conf
echo "ZAF_REPO_DIR='$ZAF_REPO_DIR'" >>/etc/zaf.conf
echo "ZAF_PLUGINS_REPO='$ZAF_PLUGINS_REPO'" >>/etc/zaf.conf
echo "ZAF_AGENT_RESTART='$ZAF_AGENT_RESTART'" >>/etc/zaf.conf
echo "ZAF_AGENT_CONFIG='$ZAF_AGENT_CONFIG'" >>/etc/zaf.conf
echo "ZAF_SUDO='$ZAF_SUDO'" >>/etc/zaf.conf
}
case $1 in
reconf)
preconf force
export ZAF_DEFAULT_PLUGINS
$0 install
;;
*)
preconf
rm -rif ${ZAF_TMP_DIR}
install -d ${ZAF_TMP_DIR}
install -d ${ZAF_LIB_DIR}
install -d ${ZAF_PLUGINS_DIR}
if [ -n "${ZAF_PLUGINS_REPO}" ]; then
if ! [ -d "${ZAF_REPO_DIR}" ]; then
git clone "${ZAF_PLUGINS_REPO}" "${ZAF_REPO_DIR}"
else
(cd "${ZAF_REPO_DIR}" && git pull)
fi
fi
install $(getrest lib/zaf.lib.sh) ${ZAF_LIB_DIR}/
mkdir -p ${ZAF_PLUGINS_DIR}
install $(getrest zaf) /usr/bin
echo "Install OK. Installing plugins (${ZAF_DEFAULT_PLUGINS})."
for plugin in ${ZAF_DEFAULT_PLUGINS}; do
/usr/bin/zaf install $plugin || exit $?
done
echo "Done"
;;
esac

15
lib/zaf.lib.sh Normal file
View File

@ -0,0 +1,15 @@
# Update repo
zaf_update_repo() {
cd ${ZAF_REPO_DIR} && git pull
}
# List installed plugins
zaf_list_installed_plugins() {
cd ${ZAF_PLUGINS_DIR}; ls -d
}
# Install plugin.
# Parameter is url, directory or plugin name (will be searched in default plugin dir)
zaf_install_plugin() {
a
}

View File

@ -0,0 +1,8 @@
# Zaf plugin for detailed process info
This plugin is used to monitor process activity on linux based systems. It supports autodiscovery of processes and next to this it will show CPU and memory usage of each process.
Please note that this plugin is very simple plugin for domonstrating possibilities. It cannot catch all processes because it discovers processes in regular intervals and if process will start and end between this time, it will not be autodiscovered.
## Usage
zaf intall process-list

View File

@ -0,0 +1,15 @@
Plugin: process-info
Maintainer: Lukas Macura <lukas@macura.cz>
Item: cpu[*]
This item will return cpu usage of given process. In zabbix, it will be prefixed automaticaly by plugin name (processlist.cpu)
Item-cmd-cpu[*]: TOTAL=0; for PROC in $(/bin/ps u -C $1 | /bin/grep -e '^$2' | /usr/bin/awk '{ print $$3 }'); do TOTAL=$(echo "$TOTAL $PROC" | /usr/bin/awk '{print $$1 + $$2}') ; done; echo $TOTAL
Item: discovery
Discovery of runing processes
Item-cmd-discovery: echo "{\n \"data\":[" ; /bin/ps --no-headers caux | /usr/bin/awk '{ print " { \"{#PSUSER}\":\"" $1 "\", \"{#PSNAME}\":\"" $11 "\" },"}' | /usr/bin/sort | /usr/bin/uniq | /bin/sed -e 's/\//\\\//g' -e '$s/.$//' ; echo " ]\n}"
Binary-Depends: echo ps awk sort uniq sed

View File

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
<version>3.0</version>
<date>2016-03-23T09:37:42Z</date>
<groups>
<group>
<name>Templates</name>
</group>
</groups>
<templates>
<template>
<template>Template Zaf processinfo</template>
<name>Template Zaf processinfo</name>
<description/>
<groups>
<group>
<name>Templates</name>
</group>
</groups>
<applications>
<application>
<name>Process Statistics</name>
</application>
</applications>
<items/>
<discovery_rules>
<discovery_rule>
<name>Process Discovery</name>
<type>0</type>
<snmp_community/>
<snmp_oid/>
<key>ps.discovery</key>
<delay>300</delay>
<status>0</status>
<allowed_hosts/>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<delay_flex/>
<params/>
<ipmi_sensor/>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<filter>
<evaltype>0</evaltype>
<formula/>
<conditions/>
</filter>
<lifetime>30</lifetime>
<description>Discovers running processes via ps.&#13;
Returns the {#PSNAME} and {#PSUSER} discovery macros which return the process name and owning user respectively.</description>
<item_prototypes>
<item_prototype>
<name>CPU usage of $1 processes owned by $2</name>
<type>0</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>proc.cpu[{#PSNAME},{#PSUSER}]</key>
<delay>60</delay>
<history>14</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>%</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description/>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>Process Statistics</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<application_prototypes/>
</item_prototype>
<item_prototype>
<name>Memory usage of $1 processes owned by $2</name>
<type>0</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>proc.mem[{#PSNAME},{#PSUSER},,]</key>
<delay>60</delay>
<history>14</history>
<trends>365</trends>
<status>0</status>
<value_type>3</value_type>
<allowed_hosts/>
<units>B</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description/>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>Process Statistics</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<application_prototypes/>
</item_prototype>
<item_prototype>
<name>Number of $1 processes owned by $2</name>
<type>0</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>proc.num[{#PSNAME},{#PSUSER},,]</key>
<delay>60</delay>
<history>14</history>
<trends>365</trends>
<status>0</status>
<value_type>3</value_type>
<allowed_hosts/>
<units/>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description/>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>Process Statistics</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
<application_prototypes/>
</item_prototype>
</item_prototypes>
<trigger_prototypes/>
<graph_prototypes/>
<host_prototypes/>
</discovery_rule>
</discovery_rules>
<macros/>
<templates/>
<screens/>
</template>
</templates>
</zabbix_export>

34
zaf Executable file
View File

@ -0,0 +1,34 @@
#!/bin/sh
# Some defaults
ZAF_AGENT_RESTART="service zabbix-agentd restart"
ZAF_AGENT_CONFIG="/etc/zabbix/zabbix_agentd.conf"
ZAF_LIB_DIR="/usr/lib/zaf/"
ZAF_PLUGINS_DIR="/usr/lib/zaf/plugins/"
if [ -f /etc/zaf.conf ]; then
. /etc/zaf.conf
fi
. ${ZAF_LIB_DIR}/zaf.lib.sh
case $1 in
update)
zaf_update_repo
;;
list-installed)
zaf_list_installed_plugins
;;
install)
zaf_install_plugin "$2"
;;
*)
echo "$0 update"
echo "$0 install plugin"
;;
esac