zabbix api脚本
import simplejson as jsonimport urllib2, subprocess, re, time
class ZabbixAPIException(Exception):
pass
class ZabbixAPI(object):
__auth = ''
__id = 0
_state = {}
def __new__(cls, *args, **kw):
if not cls._state.has_key(cls):
cls._state = super(ZabbixAPI, cls).__new__(cls, *args, **kw)
return cls._state
def __init__(self, url, user, password):
self.__url = url.rstrip('/') + '/api_jsonrpc.php'
self.__user = user
self.__password = password
self._zabbix_api_object_list = ('Action', 'Alert', 'APIInfo', 'Application', 'DCheck', 'DHost', 'DRule',
'DService', 'Event', 'Graph', 'Grahpitem', 'History', 'Host', 'Hostgroup', 'Image', 'Item',
'Maintenance', 'Map', 'Mediatype', 'Proxy', 'Screen', 'Script', 'Template', 'Trigger', 'User',
'Usergroup', 'Usermacro', 'Usermedia')
def __getattr__(self, name):
if name not in self._zabbix_api_object_list:
raise ZabbixAPIException('No such API object: %s' % name)
if not self.__dict__.has_key(name):
self.__dict__ = ZabbixAPIObjectFactory(self, name)
return self.__dict__
def login(self):
user_info = {'user' : self.__user,
'password' : self.__password}
obj = self.json_obj('user.login', user_info)
content = self.postRequest(obj)
try:
self.__auth = content['result']
except KeyError, e:
e = content['error']['data']
raise ZabbixAPIException(e)
def isLogin(self):
return self.__auth != ''
def __checkAuth__(self):
if not self.isLogin():
raise ZabbixAPIException("NOT logged in")
def json_obj(self, method, params):
obj = { 'jsonrpc' : '2.0',
'method': method,
'params': params,
'auth' : self.__auth,
'id' : self.__id}
return json.dumps(obj)
def postRequest(self, json_obj):
#print 'Post: %s' % json_obj
headers = { 'Content-Type' : 'application/json-rpc',
'User-Agent' : 'python/zabbix_api'}
req = urllib2.Request(self.__url, json_obj, headers)
opener = urllib2.urlopen(req)
content = json.loads(opener.read())
self.__id += 1
#print 'Receive: %s' % content
return content
'''
/usr/local/zabbix/bin/zabbix_get is the default path to zabbix_get, it depends on the 'prefix' while install zabbix.
plus, the ip(computer run this script) must be put into the conf of agent.
'''
@staticmethod
def zabbixGet(ip, key):
zabbix_get = subprocess.Popen('/apps/svr/zabbix/bin/zabbix_get-s %s -k %s' % (ip, key), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
result, err = zabbix_get.communicate()
if err:
return 'ERROR'
return result.strip()
def createObject(self, object_name, *args, **kwargs):
return object_name(self, *args, **kwargs)
def getHostByHostid(self, hostids):
if not isinstance(hostids,list):
hostids =
return for dict in self.host.get({'hostids':hostids,'output':'extend'})]
#################################################
# Decorate Method
#################################################
def checkAuth(func):
def ret(self, *args):
self.__checkAuth__()
return func(self, args)
return ret
def postJson(method_name):
def decorator(func):
def wrapper(self, params):
try:
content = self.postRequest(self.json_obj(method_name, params))
return content['result']
except KeyError, e:
e = content['error']['data']
raise ZabbixAPIException(e)
return wrapper
return decorator
def ZabbixAPIObjectMethod(func):
def wrapper(self, method_name, params):
try:
content = self.postRequest(self.json_obj(method_name, params))
return content['result']
except KeyError, e:
e = content['error']['data']
raise ZabbixAPIException(e)
return wrapper
#################################################
# Zabbix API Object (host, item...)
#################################################
class ZabbixAPIObjectFactory(object):
def __init__(self, zapi, object_name=''):
self.__zapi = zapi
self.__object_name = object_name
def __checkAuth__(self):
self.__zapi.__checkAuth__()
def postRequest(self, json_obj):
return self.__zapi.postRequest(json_obj)
def json_obj(self, method, param):
return self.__zapi.json_obj(method, param)
def __getattr__(self, method_name):
def method(params):
return self.proxyMethod('%s.%s' % (self.__object_name,method_name), params)
return method
# 'find' method is a wrapper of get. Difference between 'get' and 'find' is that 'find' can create object you want while it dosn't exist
def find(self, params, attr_name=None, to_create=False):
filtered_list = []
result = self.proxyMethod('%s.get' % self.__object_name, {'output':'extend','filter': params})
if to_create and len(result) == 0:
result = self.proxyMethod('%s.create' % self.__object_name, params)
return result.values()
if attr_name is not None:
for element in result:
filtered_list.append(element)
return filtered_list
else:
return result
@ZabbixAPIObjectMethod
@checkAuth
def proxyMethod(self, method_name, params):
pass
def testCase():
zapi = ZabbixAPI(url='xxxx', user='xxxx', password='xxxx')
zapi.login()
print zapi.Graph.find({'graphid':'221'}, attr_name='graphid')
#hostid = zapi.Host.find({'ip':'xxxxxx'}, attr_name='hostid')
print zapi.Host.find({'ip':'10.200.100.25'})
print zapi.Host.exists({'filter':{'host':'GD9-DNS-001'}})
#host = zapi.createObject(Host, 'HostToCreate')
#item = host.getItem('444107')
#zapi.host.get({'hostids':['16913','17411'],'output':'extend'})
#group = zapi.createObject(Hostgroup, '926')
#print zapi.getHostByHostid('16913')
if __name__ == '__main__':
testCase()
页:
[1]