diff --git a/ceilometer b/ceilometer
old mode 100644
new mode 100755
index cbc2714dc3ae77a5216770c2dcd4b61a7ff544bd..218d89af0555ce635a5fd478fa8aa619f66997ce
--- a/ceilometer
+++ b/ceilometer
@@ -1,137 +1,126 @@
 #!/usr/bin/env python
 
-import optparse
+import calendar
+import ConfigParser
 import httplib
 import json
-import time
+import math
+import optparse
 import os
 import sys
-import math
+import time
+
+from filelock import FileLock
 
 class api_response():
 
-	__status = None
-	__data = None
-	__msg = None
+    __status = None
+    __data = None
+    __msg = None
 
-	def __init__(self, status, data, msg):
-		self.setStatus(status)
-		self.setData(data)
-		self.setMsg(msg)
+    def __init__(self, status, data, msg):
+        self.setStatus(status)
+        self.setData(data)
+        self.setMsg(msg)
 
-	def setStatus(self, status):
-		self.__status = status
+    def setStatus(self, status):
+        self.__status = status
 
-	def getStatus(self):
-		return self.__status
+    def getStatus(self):
+        return self.__status
 
-	def setData(self, data):
-		self.__data = data
+    def setData(self, data):
+        self.__data = data
 
-	def getData(self):
-		return self.__data
+    def getData(self):
+        return self.__data
 
-	def setMsg(self, msg):
-		self.__msg = msg
+    def setMsg(self, msg):
+        self.__msg = msg
 
-	def getMsg(self):
-		return self.__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
-
-class Ceilometer:
-
-	__username = ''
-	__tenant = ''
-	__token = ''
-	__password = ''
-	__tenantID = None
-	__server = ''
-
-	def __init__(self, tenant, username, password, server, port):
-		auth = '{"auth": {"tenantName": "%s", "passwordCredentials": {"username": "%s", "password": "%s"}}}' % (tenant, username, password)
-		header = {"Content-Type": "application/json", "Accept": "application/json"}
-		res = api_request.httpsPost('/v2.0/tokens', server, port, auth, header)
-		res_json = json.loads(res.getData())
-#                print json.dumps(res_json, sort_keys=True, indent=4)
-		self.setUsername(username)
-		self.setTenant(tenant)
-		self.setTenantID(res_json['access']['token']['tenant']['id'])
-		self.setToken(res_json['access']['token']['id'])
-		self.setPassword(password)
-		self.__server=server
-
-	def setUsername(self, username):
-		self.__username = username
-
-	def setPassword(self, password):
-		self.__password = password
-
-	def setTenant(self, tenant):
-		self.__tenant = tenant
-
-	def getTenant(self):
-		return self.__tenant
-
-	def setTenantID(self, tenantID):
-		self.__tenantID = tenantID
-
-	def getTenantID(self):
-		return self.__tenantID
-
-	def setToken(self, token):
-		self.__token = token
-
-	def getToken(self):
-		return self.__token
-
-	def getAuth(self):
-		return {"X-Auth-Token": self.__token}
-
-	def getMeter(self, meter, resource_id):
-		url = "/v2/meters/%s?q.field=resource_id&q.op=eq&q.value=%s&limit=1" % (meter, resource_id )
-		res = api_request.httpGet(url, self.__server, 8777, self.getAuth())
-#                print res.getStatus(), res.getMsg()
-                res_json = json.loads(res.getData())
-#                print json.dumps(res_json, sort_keys=True, indent=4)
-#		return res_json[0]['counter_volume']
-		meter = res_json[0]['counter_volume']
-#		if type(meter) is float:
-#			meter = math.floor(meter)
-		return meter
+    @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 getMeter(token_id, server, 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 "Error: unknown meter!"
+
+    res_json = json.loads(api_request.httpGet(url, server, 8777, {"X-Auth-Token": token_id}).getData())
+
+    return res_json[0]['counter_volume']
+
+def getToken(server, tenant, username, password, port):
+    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"}
+        res = api_request.httpPost('/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 main():
-	ceilometer=Ceilometer('service', 'ceilometer', 'PASSWORD', 'prisma-cloud.ba.infn.it', 5000)
-#	print ceilometer.getMeter('cpu_util', '407480dd-7ba2-40d2-8686-2be78c93c6d6')
-	print ceilometer.getMeter(sys.argv[1], sys.argv[2])
+    config_file_path = os.path.join(os.path.dirname(__file__), 'proxy.conf')
+    parser_config = ConfigParser.SafeConfigParser()
+    parser_config.readfp(open(config_file_path))
+
+    server = parser_config.get('ceilometer', 'server')
+    tenant = parser_config.get('ceilometer', 'tenant')
+    username = parser_config.get('ceilometer', 'username')
+    password = parser_config.get('ceilometer', 'password')
+    port = parser_config.get('ceilometer', 'port')
+
+    token_id = getToken(server, tenant, username, password, port)
+
+    print getMeter(token_id, server, sys.argv[1], sys.argv[2])
 
 if __name__ == "__main__":
-	main()
+    main()
diff --git a/ceilometer.sh b/ceilometer.sh
old mode 100644
new mode 100755
index 78398019e8fdec99c4169b97e0ce4b1612d6f0f9..8d19dbeaea012cbe570a1b73a050a5a527702f1f
--- a/ceilometer.sh
+++ b/ceilometer.sh
@@ -1,2 +1,2 @@
 #!/bin/bash
-python /usr/lib/zabbix/externalscripts/ceilometer $1 $2
+python /usr/lib/zabbix/externalscripts/ceilometer $1 $2