Skip to content
Snippets Groups Projects
Commit 717b90b6 authored by Daniele Belfiore's avatar Daniele Belfiore
Browse files

Added exception handler and fixed bug of the lock file

parent fe40e7c8
No related branches found
No related tags found
No related merge requests found
...@@ -2,18 +2,19 @@ ...@@ -2,18 +2,19 @@
import calendar import calendar
import ConfigParser import ConfigParser
import errno
import httplib import httplib
import json import json
import math import math
import optparse import optparse
import os import os
import socket
import sys import sys
import time import time
from filelock import FileLock from filelock import FileLock
class api_response(): class api_response():
__status = None __status = None
__data = None __data = None
__msg = None __msg = None
...@@ -43,32 +44,23 @@ class api_response(): ...@@ -43,32 +44,23 @@ class api_response():
class api_request(): class api_request():
@staticmethod @staticmethod
def httpGet(url, host, port, header): def call(protocol, url, host, port, header, params=None):
conn = httplib.HTTPConnection(host, port) if (protocol == 'http'):
conn.request("GET", url, headers = header) conn = httplib.HTTPConnection(host, port)
res = conn.getresponse() else:
response = api_response(res.status, res.read(), res.msg) conn = httplib.HTTPSConnection(host, port)
return response try:
@staticmethod if params is None:
def httpsGet(url, host, port, header): conn.request("GET", url, headers = header)
conn = httplib.HTTPSConnection(host, port) else:
conn.request("GET", url, headers = header) conn.request("POST", url, params, header)
res = conn.getresponse() except socket.error as e:
response = api_response(res.status, res.read(), res.msg) print 'Exception: ' + str(e)
return response sys.exit()
@staticmethod
def httpPost(url, host, port, params, headers):
conn = httplib.HTTPConnection(host, port)
conn.request("POST", url, params, headers)
res = conn.getresponse()
response = api_response(res.status, res.read(), res.msg)
return response
@staticmethod
def httpsPost(url, host, port, params, headers):
conn = httplib.HTTPSConnection(host, port)
conn.request("POST", url, params, headers)
res = conn.getresponse() res = conn.getresponse()
response = api_response(res.status, res.read(), res.msg) response = api_response(res.status, res.read(), res.msg)
return response return response
def getToken(protocol, server, port, tenant, username, password): def getToken(protocol, server, port, tenant, username, password):
...@@ -79,23 +71,22 @@ def getToken(protocol, server, port, tenant, username, password): ...@@ -79,23 +71,22 @@ def getToken(protocol, server, port, tenant, username, password):
parser_token.readfp(open(token_file_path)) parser_token.readfp(open(token_file_path))
if (not parser_token.get('token', 'expires')) or (int(float(parser_token.get('token', 'expires')) - time.time()) <= 0): if (not parser_token.get('token', 'expires')) or (int(float(parser_token.get('token', 'expires')) - time.time()) <= 0):
auth = '{"auth": {"tenantName": "%s", "passwordCredentials": {"username": "%s", "password": "%s"}}}' % (tenant, username, password) params = '{"auth": {"tenantName": "%s", "passwordCredentials": {"username": "%s", "password": "%s"}}}' % (tenant, username, password)
header = {"Content-Type": "application/json", "Accept": "application/json"} header = {"Content-Type": "application/json", "Accept": "application/json"}
if protocol == 'http': res = api_request.call(protocol, '/v2.0/tokens', server, port, header, params)
res = api_request.httpPost('/v2.0/tokens', server, port, auth, header)
else:
res = api_request.httpsPost('/v2.0/tokens', server, port, auth, header)
res_json = json.loads(res.getData()) res_json = json.loads(res.getData())
timestamp = calendar.timegm(time.strptime(res_json['access']['token']['expires'],"%Y-%m-%dT%H:%M:%SZ")) try:
timestamp = calendar.timegm(time.strptime(res_json['access']['token']['expires'],"%Y-%m-%dT%H:%M:%SZ"))
parser_token.set('token', 'id', res_json['access']['token']['id']) parser_token.set('token','id', res_json['access']['token']['id'])
parser_token.set('token', 'expires', str(timestamp)) parser_token.set('token', 'expires', str(timestamp))
with FileLock(token_file_path): with FileLock(token_file_path):
with open(token_file_path, 'w') as configfile: with open(token_file_path, 'w') as configfile:
parser_token.write(configfile) parser_token.write(configfile)
except KeyError as e:
print 'Exception: Wrong Keystone Credentials'
sys.exit()
return parser_token.get('token', 'id') return parser_token.get('token', 'id')
...@@ -105,23 +96,24 @@ def getMeter(protocol, server, port, token_id, meter, resource_id): ...@@ -105,23 +96,24 @@ def getMeter(protocol, server, port, token_id, meter, resource_id):
elif meter in ('network.incoming.bytes', 'network.outgoing.bytes'): elif meter in ('network.incoming.bytes', 'network.outgoing.bytes'):
url = "/v2/meters/%s?q.field=metadata.instance_id&q.op=eq&q.value=%s&limit=1" % (meter, resource_id) url = "/v2/meters/%s?q.field=metadata.instance_id&q.op=eq&q.value=%s&limit=1" % (meter, resource_id)
else: else:
return "Sorry, Unknown Meter" return "Unknown Meter"
if protocol == 'http': try:
res_json = json.loads(api_request.httpGet(url, server, port, {"X-Auth-Token": token_id}).getData()) res_json = json.loads(api_request.call(protocol, url, server, port, {"X-Auth-Token": token_id}).getData())
else: if res_json:
res_json = json.loads(api_request.httpsGet(url, server, port, {"X-Auth-Token": token_id}).getData()) return res_json[0]['counter_volume']
else:
return 'Sample Not Found'
if res_json: except ValueError as e:
return res_json[0]['counter_volume'] print 'Exception: Wrong Ceilometer Port'
else: sys.exit()
return 'Sorry, Sample Not Found'
def main(): def main():
config_file_path = os.path.join(os.path.dirname(__file__), 'proxy.conf') config_file_path = os.path.join(os.path.dirname(__file__), 'credentials.conf')
parser_config = ConfigParser.SafeConfigParser() parser_config = ConfigParser.SafeConfigParser()
parser_config.readfp(open(config_file_path)) parser_config.readfp(open(config_file_path))
token_id = getToken( token_id = getToken(
parser_config.get('keystone', 'protocol'), parser_config.get('keystone', 'protocol'),
parser_config.get('keystone', 'server'), parser_config.get('keystone', 'server'),
......
#!/usr/bin/env python
import calendar
import ConfigParser
import httplib
import json
import math
import optparse
import os
import sys
import time
from filelock import FileLock
class api_response():
__status = None
__data = None
__msg = None
def __init__(self, status, data, msg):
self.setStatus(status)
self.setData(data)
self.setMsg(msg)
def setStatus(self, status):
self.__status = status
def getStatus(self):
return self.__status
def setData(self, data):
self.__data = data
def getData(self):
return self.__data
def setMsg(self, msg):
self.__msg = msg
def getMsg(self):
return self.__msg
class api_request():
@staticmethod
def httpGet(url, host, port, header):
conn = httplib.HTTPConnection(host, port)
conn.request("GET", url, headers = header)
res = conn.getresponse()
response = api_response(res.status, res.read(), res.msg)
return response
@staticmethod
def httpsGet(url, host, port, header):
conn = httplib.HTTPSConnection(host, port)
conn.request("GET", url, headers = header)
res = conn.getresponse()
response = api_response(res.status, res.read(), res.msg)
return response
@staticmethod
def httpPost(url, host, port, params, headers):
conn = httplib.HTTPConnection(host, port)
conn.request("POST", url, params, headers)
res = conn.getresponse()
response = api_response(res.status, res.read(), res.msg)
return response
@staticmethod
def httpsPost(url, host, port, params, headers):
conn = httplib.HTTPSConnection(host, port)
conn.request("POST", url, params, headers)
res = conn.getresponse()
response = api_response(res.status, res.read(), res.msg)
return response
def getToken(protocol, server, port, tenant, username, password):
token_file_path = os.path.join(os.path.dirname(__file__), 'token_backup')
parser_token = ConfigParser.SafeConfigParser()
with FileLock(token_file_path):
parser_token.readfp(open(token_file_path))
if (not parser_token.get('token', 'expires')) or (int(float(parser_token.get('token', 'expires')) - time.time()) <= 0):
auth = '{"auth": {"tenantName": "%s", "passwordCredentials": {"username": "%s", "password": "%s"}}}' % (tenant, username, password)
header = {"Content-Type": "application/json", "Accept": "application/json"}
if protocol == 'http':
res = api_request.httpPost('/v2.0/tokens', server, port, auth, header)
else:
res = api_request.httpsPost('/v2.0/tokens', server, port, auth, header)
res_json = json.loads(res.getData())
timestamp = calendar.timegm(time.strptime(res_json['access']['token']['expires'],"%Y-%m-%dT%H:%M:%SZ"))
parser_token.set('token', 'id', res_json['access']['token']['id'])
parser_token.set('token', 'expires', str(timestamp))
with FileLock(token_file_path):
with open(token_file_path, 'w') as configfile:
parser_token.write(configfile)
return parser_token.get('token', 'id')
def getMeter(protocol, server, port, token_id, meter, resource_id):
if meter in ('cpu', 'cpu_util', 'disk.ephemeral.size', 'disk.root.size', 'memory', 'vcpus'):
url = "/v2/meters/%s?q.field=resource_id&q.op=eq&q.value=%s&limit=1" % (meter, resource_id)
elif meter in ('network.incoming.bytes', 'network.outgoing.bytes'):
url = "/v2/meters/%s?q.field=metadata.instance_id&q.op=eq&q.value=%s&limit=1" % (meter, resource_id)
else:
return "Sorry, Unknown Meter"
if protocol == 'http':
res_json = json.loads(api_request.httpGet(url, server, port, {"X-Auth-Token": token_id}).getData())
else:
res_json = json.loads(api_request.httpsGet(url, server, port, {"X-Auth-Token": token_id}).getData())
if res_json:
return res_json[0]['counter_volume']
else:
return 'Sorry, Sample Not Found'
def main():
config_file_path = os.path.join(os.path.dirname(__file__), 'proxy.conf')
parser_config = ConfigParser.SafeConfigParser()
parser_config.readfp(open(config_file_path))
token_id = getToken(
parser_config.get('keystone', 'protocol'),
parser_config.get('keystone', 'server'),
parser_config.get('keystone', 'port'),
parser_config.get('keystone', 'tenant'),
parser_config.get('keystone', 'username'),
parser_config.get('keystone', 'password')
)
# print getMeter(
# parser_config.get('ceilometer', 'protocol'),
# parser_config.get('ceilometer', 'server'),
# parser_config.get('ceilometer', 'port'),
# token_id,
# sys.argv[1],
# sys.argv[2]
# )
server = '141.250.2.118'
protocol = 'http'
port = '8774'
url = "/v2/ea26dfda4a1c43a79c94a0720510c308/os-fping/ded7f200-fb21-4577-acd3-d16e2260207b"
res_json = json.loads(api_request.httpGet(url, server, port, {"X-Auth-Token": token_id}).getData())
print json.dumps(res_json, sort_keys=True, indent=4, separators=(',', ': '))
if __name__ == "__main__":
main()
#!/bin/bash #!/bin/bash
python "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"/ceilometer $1 $2 #python "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"/ceilometer $1 $2
python /usr/lib/zabbix/externalscripts/zabbix-external-scripts/ceilometer $1 $2
File moved
import os import os
import time import time
import errno import errno
class FileLockException(Exception): class FileLockException(Exception):
pass pass
...@@ -11,7 +11,7 @@ class FileLock(object): ...@@ -11,7 +11,7 @@ class FileLock(object):
compatible as it doesn't rely on msvcrt or fcntl for the locking. compatible as it doesn't rely on msvcrt or fcntl for the locking.
""" """
def __init__(self, file_name, timeout=10, delay=.05): def __init__(self, file_name, timeout=90, delay=.05):
""" Prepare the file locker. Specify the file to lock and optionally """ Prepare the file locker. Specify the file to lock and optionally
the maximum timeout and the delay between each attempt to lock. the maximum timeout and the delay between each attempt to lock.
""" """
...@@ -35,9 +35,11 @@ class FileLock(object): ...@@ -35,9 +35,11 @@ class FileLock(object):
break; break;
except OSError as e: except OSError as e:
if e.errno != errno.EEXIST: if e.errno != errno.EEXIST:
raise raise
if (time.time() - start_time) >= self.timeout: if time.time() - os.stat(self.lockfile)[7] >= 60: # if the file is locked since 60 seconds
raise FileLockException("Timeout occured.") os.remove(self.lockfile)
#if (time.time() - start_time) >= self.timeout:
#raise FileLockException("Timeout occured.")
time.sleep(self.delay) time.sleep(self.delay)
self.is_locked = True self.is_locked = True
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment