diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1d38ce7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,18 @@ +Copyright (c) 2015-2016 deflax.net + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgement in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..3232ffe --- /dev/null +++ b/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +until /home/steinvord/steinvord/steinvord.py; do + echo "Steinvord crashed with exit code $?. Respawning.." >&2 + sleep 1 +done diff --git a/steinvord.py b/steinvord.py new file mode 100755 index 0000000..c9da720 --- /dev/null +++ b/steinvord.py @@ -0,0 +1,143 @@ +#!/usr/bin/python3.2 + +### +### steinvord.py +### + + +## SETUP + +z_url = 'http://fqdn/zabbix/' +z_user = 'USER' +z_pass = 'PASS' + +server = 'irc.example.com' +channel = '#example' +nick = 'steinvord' +botnick = 'Steinvord' +botuser = 'steinvord' + +encoding = 'utf-8' +calibrate = 0 + + +### begin +import sys, socket, time, re, datetime +from pyzabbix import ZabbixAPI +from difflib import Differ + +trigprevlist = [] +triglist = [] +counter = 0 + +try: + zapi = ZabbixAPI(z_url) + zapi.session.timeout = 5 + zapi.login(z_user, z_pass) +except Exception as e: + print(e) + exit(3) +print ("Connected to Zabbix API Version %s" % zapi.api_version()) + +irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #defines the socket +print("Establishing connection to [%s]" % (server)) +irc.connect((server, 6667)) #connects to the server +irc.setblocking(False) + +sock_auth = "USER "+ botuser +" "+ botuser +" "+ botuser +" :This is the Steinvord bot!\n" +sock_nick = "NICK "+ botnick +"\n" +sock_nicksrv = "PRIVMSG nickserv :iNOOPE\r\n" +sock_join = "JOIN "+ channel +"\n" +irc.send(sock_auth.encode(encoding)) +irc.send(sock_nick.encode(encoding)) +irc.send(sock_nicksrv.encode(encoding)) +irc.send(sock_join.encode(encoding)) + +def environment(): + currtemp = float(zapi.item.get(filter={'hostid': '10125', 'itemid': '26379'})[0]['lastvalue']) + currhumid = calibrate + float(zapi.item.get(filter={'hostid': '10125', 'itemid': '26618'})[0]['lastvalue']) + + t_result = 't=' + str(currtemp) + '°C' + if currtemp > 24: + t_result += ' !! WARNING !!' + t_result += ' h=' + str(currhumid) + '%' + t_sock_result = 'PRIVMSG ' + channel + ' :' + t_result + '\n' + irc.send(t_sock_result.encode(encoding)) + + +while True: + time.sleep(1) + counter += 1 + + if counter == 60: + counter = 0 + ctime = datetime.datetime.now() + if int(ctime.minute) == 20: + environment() # print env data every 20 minutes + + triggers = zapi.trigger.get(only_true=1, + skipDependent=1, + monitored=1, + active=1, + output='extend', + expandDescription=1, + expandData='host', + sortfield='triggerid' + ) + + for t in triggers: + #print(t) + if int(t['value']) == 1: + triglist.append("{}".format(t['description']) + #triglist.append("{0} - {1}".format( + # t['host'], + # t['description'], + # '') + ) + + for d in Differ().compare(trigprevlist, triglist): + if re.match('^\+', d) is not None: + sock_result = 'PRIVMSG ' + nick + " :" + d + '\n' + irc.send(sock_result.encode(encoding)) + if re.match('^\-', d) is not None: + sock_result = 'PRIVMSG ' + nick + " :" + d + '\n' + irc.send(sock_result.encode(encoding)) + time.sleep(1) + + trigprevlist = triglist + triglist = [] + + try: + text=irc.recv(2040) #receive the text + decoded_text = text.decode(encoding) + + ### print (decoded_text) #print text to console DEBUG + + if decoded_text.find('!ping') != -1: + triggers = zapi.trigger.get(only_true=1, + skipDependent=1, + monitored=1, + active=1, + output='extend', + expandDescription=1, + expandData='host', + sortfield='triggerid' + ) + for t in triggers: + if int(t['value']) == 1: + result = "{0} - {1} {2}".format(t['host'], t['description'], '') + sock_result = 'PRIVMSG ' + channel + " :" + result + '\n' + irc.send(sock_result.encode(encoding)) + time.sleep(1) + if decoded_text.find('!env') != -1: + environment() + + # Prevent Timeout + if decoded_text.find('PING') != -1: + pingpong = 'PONG ' + decoded_text.split() [1] + '\r\n' + irc.send(pingpong.encode(encoding)) + except Exception: + continue + +exit(0) + diff --git a/tests/getz.py b/tests/getz.py new file mode 100755 index 0000000..eb36576 --- /dev/null +++ b/tests/getz.py @@ -0,0 +1,70 @@ +#!/usr/bin/python3.2 +# +# Zabbix API Python usage example +# Christoph Haas +# + +username='' +password='1' +hostgroup='' +item_name='system.cpu.load[,avg1]' +zabbix_url='' + +import zabbix_api +import sys + +# Connect to Zabbix server +z=zabbix_api.ZabbixAPI(server=zabbix_url) +z.login(user=username, password=password) + +# Get hosts in the hostgroup +hostgroup = z.hostgroup.get( + { + 'filter': { 'name':hostgroup }, + 'sortfield': 'name', + 'sortorder': 'ASC', + 'limit':2, + 'select_hosts':'extend' + }) + +print(hostgroup[0]) +print("\n") +for host in hostgroup[0]['name']: + hostname = host['host'] + print("Host:", hostname) + print("Host-ID:", host['hostid']) + + item = z.item.get({ + 'output':'extend', + 'hostids':host['hostid'], + 'filter':{'key_':item_name}}) + if item: + print(item[0]['lastvalue']) + print("Item-ID:", item[0]['itemid']) + + # Get history + lastvalue = z.history.get({ + 'history': item[0]['value_type'], + 'itemids': item[0]['itemid'], + 'output': 'extend', + # Sort by timestamp from new to old + 'sortfield':'clock', + 'sortorder':'DESC', + # Get only the first (=newest) entry + 'limit': 1, + }) + + # CAVEAT! The history.get function must be told which type the + # values are (float, text, etc.). The item.value_type contains + # the number that needs to be passed to history.get. + if lastvalue: + lastvalue = lastvalue[0]['value'] + + print("Last value:", lastvalue) + + else: + print("No item....") + + print("---------------------------") + + diff --git a/tests/z-gethostid.sh b/tests/z-gethostid.sh new file mode 100755 index 0000000..7219b37 --- /dev/null +++ b/tests/z-gethostid.sh @@ -0,0 +1,2 @@ +#!/bin/bash +curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"host.get","params":{"output":"extend","filter":{"host":"fqdn"}},"auth":"changeme","id":1}' http://fqdn/zabbix/api_jsonrpc.php diff --git a/tests/z-getitem.sh b/tests/z-getitem.sh new file mode 100755 index 0000000..d314e3a --- /dev/null +++ b/tests/z-getitem.sh @@ -0,0 +1,2 @@ +#!/bin/bash +curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"item.get","params":{"output":"extend","filter":{"hostid":"10125"}},"auth":"changeme","id":2}' http://fqdn/zabbix/api_jsonrpc.php diff --git a/tests/z-getuser.sh b/tests/z-getuser.sh new file mode 100755 index 0000000..466f11c --- /dev/null +++ b/tests/z-getuser.sh @@ -0,0 +1,2 @@ +#!/bin/bash +curl -i -X POST -H 'Content-Type:application/json' -d'{"jsonrpc": "2.0","method":"user.login","params":{"user":"USER","password":"PASS"},"auth": null,"id":0}' http://fqdn/zabbix/api_jsonrpc.php