Initial commit

This commit is contained in:
afx 2016-03-31 20:21:25 +03:00
parent b9c0f3256a
commit 891cfbfb60
7 changed files with 243 additions and 0 deletions

18
LICENSE Normal file
View file

@ -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.

6
start.sh Executable file
View file

@ -0,0 +1,6 @@
#!/bin/bash
until /home/steinvord/steinvord/steinvord.py; do
echo "Steinvord crashed with exit code $?. Respawning.." >&2
sleep 1
done

143
steinvord.py Executable file
View file

@ -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)

70
tests/getz.py Executable file
View file

@ -0,0 +1,70 @@
#!/usr/bin/python3.2
#
# Zabbix API Python usage example
# Christoph Haas <email@christoph-haas.de>
#
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("---------------------------")

2
tests/z-gethostid.sh Executable file
View file

@ -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

2
tests/z-getitem.sh Executable file
View file

@ -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

2
tests/z-getuser.sh Executable file
View file

@ -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