Move all loggers to be members of the class, not global objects
This commit is contained in:
@ -6,22 +6,15 @@ from __future__ import (
|
|||||||
print_function,
|
print_function,
|
||||||
)
|
)
|
||||||
|
|
||||||
# --------------------------------------------
|
|
||||||
import logging
|
|
||||||
|
|
||||||
|
|
||||||
class NullHandler(logging.Handler):
|
|
||||||
def emit(self, record):
|
|
||||||
pass
|
|
||||||
# --------------------------------------------
|
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
import logging
|
||||||
import agentx
|
import agentx
|
||||||
from agentx.dataset import DataSet
|
from agentx.dataset import DataSet
|
||||||
from agentx.network import Network
|
from agentx.network import Network
|
||||||
|
|
||||||
class AgentError(Exception):
|
class NullHandler(logging.Handler):
|
||||||
pass
|
def emit(self, record):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class Agent(object):
|
class Agent(object):
|
||||||
|
@ -6,7 +6,8 @@ from __future__ import (
|
|||||||
print_function,
|
print_function,
|
||||||
)
|
)
|
||||||
|
|
||||||
# --------------------------------------------
|
import time
|
||||||
|
import agentx
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
|
||||||
@ -15,17 +16,11 @@ class NullHandler(logging.Handler):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger('agentx.dataset')
|
|
||||||
logger.addHandler(NullHandler())
|
|
||||||
# --------------------------------------------
|
|
||||||
|
|
||||||
import time
|
|
||||||
import agentx
|
|
||||||
|
|
||||||
|
|
||||||
class DataSet():
|
class DataSet():
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._data = {}
|
self._data = {}
|
||||||
|
self.logger = logging.getLogger('agentx.dataset')
|
||||||
|
self.logger.addHandler(NullHandler())
|
||||||
|
|
||||||
def set(self, oid, oid_type, value):
|
def set(self, oid, oid_type, value):
|
||||||
if oid_type.startswith('int'):
|
if oid_type.startswith('int'):
|
||||||
@ -47,7 +42,7 @@ class DataSet():
|
|||||||
elif oid_type == 'counter64' or oid_type == 'uint64' or oid_type == 'u64':
|
elif oid_type == 'counter64' or oid_type == 'uint64' or oid_type == 'u64':
|
||||||
t = agentx.TYPE_COUNTER64
|
t = agentx.TYPE_COUNTER64
|
||||||
else:
|
else:
|
||||||
logger.error('Invalid oid_type: %s' % (oid_type))
|
self.logger.error('Invalid oid_type: %s' % (oid_type))
|
||||||
return
|
return
|
||||||
|
|
||||||
self._data[oid] = {
|
self._data[oid] = {
|
||||||
|
@ -6,8 +6,11 @@ from __future__ import (
|
|||||||
print_function,
|
print_function,
|
||||||
)
|
)
|
||||||
|
|
||||||
# --------------------------------------------
|
import socket
|
||||||
|
import time
|
||||||
import logging
|
import logging
|
||||||
|
import agentx
|
||||||
|
from agentx.pdu import PDU
|
||||||
|
|
||||||
|
|
||||||
class NullHandler(logging.Handler):
|
class NullHandler(logging.Handler):
|
||||||
@ -15,19 +18,9 @@ class NullHandler(logging.Handler):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger('agentx.network')
|
|
||||||
logger.addHandler(NullHandler())
|
|
||||||
|
|
||||||
class NetworkError(Exception):
|
class NetworkError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# --------------------------------------------
|
|
||||||
|
|
||||||
import socket
|
|
||||||
import time
|
|
||||||
import agentx
|
|
||||||
from agentx.pdu import PDU
|
|
||||||
|
|
||||||
|
|
||||||
class Network():
|
class Network():
|
||||||
def __init__(self, server_address = '/var/agentx/master'):
|
def __init__(self, server_address = '/var/agentx/master'):
|
||||||
@ -41,13 +34,16 @@ class Network():
|
|||||||
self._connected = False
|
self._connected = False
|
||||||
self._server_address = server_address
|
self._server_address = server_address
|
||||||
self._timeout = 0.1 # Seconds
|
self._timeout = 0.1 # Seconds
|
||||||
|
self.logger = logging.getLogger('agentx.network')
|
||||||
|
self.logger.addHandler(NullHandler())
|
||||||
|
|
||||||
|
|
||||||
def connect(self):
|
def connect(self):
|
||||||
if self._connected:
|
if self._connected:
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
logger.info("Connecting to %s" % self._server_address)
|
self.logger.info("Connecting to %s" % self._server_address)
|
||||||
if self._server_address.startswith('/'):
|
if self._server_address.startswith('/'):
|
||||||
self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
||||||
self.socket.connect(self._server_address)
|
self.socket.connect(self._server_address)
|
||||||
@ -59,13 +55,13 @@ class Network():
|
|||||||
self.socket.settimeout(self._timeout)
|
self.socket.settimeout(self._timeout)
|
||||||
self._connected = True
|
self._connected = True
|
||||||
except socket.error:
|
except socket.error:
|
||||||
logger.error("Failed to connect to %s" % self._server_address)
|
self.logger.error("Failed to connect to %s" % self._server_address)
|
||||||
self._connected = False
|
self._connected = False
|
||||||
|
|
||||||
def disconnect(self):
|
def disconnect(self):
|
||||||
if not self._connected:
|
if not self._connected:
|
||||||
return
|
return
|
||||||
logger.info("Disconnecting from %s" % self._server_address)
|
self.logger.info("Disconnecting from %s" % self._server_address)
|
||||||
self.socket.close()
|
self.socket.close()
|
||||||
self.socket = None
|
self.socket = None
|
||||||
self._connected = False
|
self._connected = False
|
||||||
@ -73,9 +69,9 @@ class Network():
|
|||||||
|
|
||||||
def update(self, newdata):
|
def update(self, newdata):
|
||||||
if len(self.data) == 0:
|
if len(self.data) == 0:
|
||||||
logger.info("Setting initial serving dataset (%d OIDs)" % len(newdata))
|
self.logger.info("Setting initial serving dataset (%d OIDs)" % len(newdata))
|
||||||
else:
|
else:
|
||||||
logger.info("Replacing serving dataset (%d OIDs)" % len(newdata))
|
self.logger.info("Replacing serving dataset (%d OIDs)" % len(newdata))
|
||||||
self.data = newdata
|
self.data = newdata
|
||||||
self.data_idx = sorted(self.data.keys(), key=lambda k: tuple(int(part) for part in k.split('.')))
|
self.data_idx = sorted(self.data.keys(), key=lambda k: tuple(int(part) for part in k.split('.')))
|
||||||
|
|
||||||
@ -110,7 +106,7 @@ class Network():
|
|||||||
def _get_next_oid(self, oid, endoid):
|
def _get_next_oid(self, oid, endoid):
|
||||||
if oid in self.data:
|
if oid in self.data:
|
||||||
# Exact match found
|
# Exact match found
|
||||||
#logger.debug('get_next_oid, exact match of %s' % oid)
|
#self.logger.debug('get_next_oid, exact match of %s' % oid)
|
||||||
idx = self.data_idx.index(oid)
|
idx = self.data_idx.index(oid)
|
||||||
if idx == (len(self.data_idx) - 1):
|
if idx == (len(self.data_idx) - 1):
|
||||||
# Last Item in MIB, No match!
|
# Last Item in MIB, No match!
|
||||||
@ -118,7 +114,7 @@ class Network():
|
|||||||
return self.data_idx[idx + 1]
|
return self.data_idx[idx + 1]
|
||||||
else:
|
else:
|
||||||
# No exact match, find prefix
|
# No exact match, find prefix
|
||||||
#logger.debug('get_next_oid, no exact match of %s' % oid)
|
#self.logger.debug('get_next_oid, no exact match of %s' % oid)
|
||||||
slist = oid.split('.')
|
slist = oid.split('.')
|
||||||
elist = endoid.split('.')
|
elist = endoid.split('.')
|
||||||
for tmp_oid in self.data_idx:
|
for tmp_oid in self.data_idx:
|
||||||
@ -140,20 +136,20 @@ class Network():
|
|||||||
if not self._connected:
|
if not self._connected:
|
||||||
return
|
return
|
||||||
|
|
||||||
logger.debug("==== Open PDU ====")
|
self.logger.debug("==== Open PDU ====")
|
||||||
pdu = self.new_pdu(agentx.AGENTX_OPEN_PDU)
|
pdu = self.new_pdu(agentx.AGENTX_OPEN_PDU)
|
||||||
self.send_pdu(pdu)
|
self.send_pdu(pdu)
|
||||||
pdu = self.recv_pdu()
|
pdu = self.recv_pdu()
|
||||||
self.session_id = pdu.session_id
|
self.session_id = pdu.session_id
|
||||||
|
|
||||||
logger.debug("==== Ping PDU ====")
|
self.logger.debug("==== Ping PDU ====")
|
||||||
pdu = self.new_pdu(agentx.AGENTX_PING_PDU)
|
pdu = self.new_pdu(agentx.AGENTX_PING_PDU)
|
||||||
self.send_pdu(pdu)
|
self.send_pdu(pdu)
|
||||||
pdu = self.recv_pdu()
|
pdu = self.recv_pdu()
|
||||||
|
|
||||||
logger.debug("==== Register PDU ====")
|
self.logger.debug("==== Register PDU ====")
|
||||||
for oid in oid_list:
|
for oid in oid_list:
|
||||||
logger.info("Registering: %s" % (oid))
|
self.logger.info("Registering: %s" % (oid))
|
||||||
pdu = self.new_pdu(agentx.AGENTX_REGISTER_PDU)
|
pdu = self.new_pdu(agentx.AGENTX_REGISTER_PDU)
|
||||||
pdu.oid = oid
|
pdu.oid = oid
|
||||||
self.send_pdu(pdu)
|
self.send_pdu(pdu)
|
||||||
@ -181,21 +177,21 @@ class Network():
|
|||||||
return
|
return
|
||||||
|
|
||||||
if not request:
|
if not request:
|
||||||
logger.error("Empty PDU, connection closed!")
|
self.logger.error("Empty PDU, connection closed!")
|
||||||
self.disconnect()
|
self.disconnect()
|
||||||
raise NetworkError("Empty PDU, disconnecting")
|
raise NetworkError("Empty PDU, disconnecting")
|
||||||
|
|
||||||
response = self.response_pdu(request)
|
response = self.response_pdu(request)
|
||||||
if request.type == agentx.AGENTX_GET_PDU:
|
if request.type == agentx.AGENTX_GET_PDU:
|
||||||
logger.debug("Received GET PDU")
|
self.logger.debug("Received GET PDU")
|
||||||
for rvalue in request.range_list:
|
for rvalue in request.range_list:
|
||||||
oid = rvalue[0]
|
oid = rvalue[0]
|
||||||
logger.debug("OID: %s" % (oid))
|
self.logger.debug("OID: %s" % (oid))
|
||||||
if oid in self.data:
|
if oid in self.data:
|
||||||
logger.debug("OID Found")
|
self.logger.debug("OID Found")
|
||||||
response.values.append(self.data[oid])
|
response.values.append(self.data[oid])
|
||||||
else:
|
else:
|
||||||
logger.debug("OID Not Found!")
|
self.logger.debug("OID Not Found!")
|
||||||
response.values.append({
|
response.values.append({
|
||||||
'type': agentx.TYPE_NOSUCHOBJECT,
|
'type': agentx.TYPE_NOSUCHOBJECT,
|
||||||
'name': rvalue[0],
|
'name': rvalue[0],
|
||||||
@ -203,10 +199,10 @@ class Network():
|
|||||||
})
|
})
|
||||||
|
|
||||||
elif request.type == agentx.AGENTX_GETNEXT_PDU:
|
elif request.type == agentx.AGENTX_GETNEXT_PDU:
|
||||||
logger.debug("Received GET_NEXT PDU")
|
self.logger.debug("Received GET_NEXT PDU")
|
||||||
for rvalue in request.range_list:
|
for rvalue in request.range_list:
|
||||||
oid = self._get_next_oid(rvalue[0], rvalue[1])
|
oid = self._get_next_oid(rvalue[0], rvalue[1])
|
||||||
logger.debug("GET_NEXT: %s => %s" % (rvalue[0], oid))
|
self.logger.debug("GET_NEXT: %s => %s" % (rvalue[0], oid))
|
||||||
if oid:
|
if oid:
|
||||||
response.values.append(self.data[oid])
|
response.values.append(self.data[oid])
|
||||||
else:
|
else:
|
||||||
@ -217,6 +213,6 @@ class Network():
|
|||||||
})
|
})
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.warn("Received unsupported PDU %d" % request.type)
|
self.logger.warn("Received unsupported PDU %d" % request.type)
|
||||||
|
|
||||||
self.send_pdu(response)
|
self.send_pdu(response)
|
||||||
|
@ -7,24 +7,16 @@ from __future__ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
# --------------------------------------------
|
# --------------------------------------------
|
||||||
|
import struct
|
||||||
|
import pprint
|
||||||
import logging
|
import logging
|
||||||
|
import agentx
|
||||||
|
|
||||||
class NullHandler(logging.Handler):
|
class NullHandler(logging.Handler):
|
||||||
def emit(self, record):
|
def emit(self, record):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger('agentx.pdu')
|
|
||||||
logger.addHandler(NullHandler())
|
|
||||||
# --------------------------------------------
|
|
||||||
|
|
||||||
import struct
|
|
||||||
import pprint
|
|
||||||
|
|
||||||
import agentx
|
|
||||||
|
|
||||||
|
|
||||||
class PDU(object):
|
class PDU(object):
|
||||||
def __init__(self, type=0):
|
def __init__(self, type=0):
|
||||||
self.type = type
|
self.type = type
|
||||||
@ -36,23 +28,25 @@ class PDU(object):
|
|||||||
self.decode_buf = ''
|
self.decode_buf = ''
|
||||||
self.state = {}
|
self.state = {}
|
||||||
self.values = []
|
self.values = []
|
||||||
|
self.logger = logging.getLogger('agentx.pdu')
|
||||||
|
self.logger.addHandler(NullHandler())
|
||||||
|
|
||||||
def dump(self):
|
def dump(self):
|
||||||
name = agentx.PDU_TYPE_NAME[self.type]
|
name = agentx.PDU_TYPE_NAME[self.type]
|
||||||
logger.debug('PDU DUMP: New PDU')
|
self.logger.debug('PDU DUMP: New PDU')
|
||||||
logger.debug(
|
self.logger.debug(
|
||||||
'PDU DUMP: Meta : [%s: %d %d %d]' %
|
'PDU DUMP: Meta : [%s: %d %d %d]' %
|
||||||
(name, self.session_id, self.transaction_id, self.packet_id))
|
(name, self.session_id, self.transaction_id, self.packet_id))
|
||||||
if 'payload_length' in self.state:
|
if 'payload_length' in self.state:
|
||||||
logger.debug('PDU DUMP: Length : %s' %
|
self.logger.debug('PDU DUMP: Length : %s' %
|
||||||
self.state['payload_length'])
|
self.state['payload_length'])
|
||||||
if hasattr(self, 'response'):
|
if hasattr(self, 'response'):
|
||||||
logger.debug('PDU DUMP: Response : %s' % self.response)
|
self.logger.debug('PDU DUMP: Response : %s' % self.response)
|
||||||
if hasattr(self, 'values'):
|
if hasattr(self, 'values'):
|
||||||
logger.debug('PDU DUMP: Values : %s' %
|
self.logger.debug('PDU DUMP: Values : %s' %
|
||||||
pprint.pformat(self.values))
|
pprint.pformat(self.values))
|
||||||
if hasattr(self, 'range_list'):
|
if hasattr(self, 'range_list'):
|
||||||
logger.debug('PDU DUMP: Range list: %s' %
|
self.logger.debug('PDU DUMP: Range list: %s' %
|
||||||
pprint.pformat(self.range_list))
|
pprint.pformat(self.range_list))
|
||||||
|
|
||||||
# ====================================================
|
# ====================================================
|
||||||
@ -108,7 +102,7 @@ class PDU(object):
|
|||||||
# No data
|
# No data
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
logger.error('Unknown Type:' % type)
|
self.logger.error('Unknown Type:' % type)
|
||||||
return buf
|
return buf
|
||||||
|
|
||||||
def encode_header(self, pdu_type, payload_length=0, flags=0):
|
def encode_header(self, pdu_type, payload_length=0, flags=0):
|
||||||
@ -181,8 +175,8 @@ class PDU(object):
|
|||||||
oid = '.'.join(str(i) for i in sub_ids)
|
oid = '.'.join(str(i) for i in sub_ids)
|
||||||
return oid, ret['include']
|
return oid, ret['include']
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception('Invalid packing OID header')
|
self.logger.exception('Invalid packing OID header')
|
||||||
logger.debug('%s' % pprint.pformat(self.decode_buf))
|
self.logger.debug('%s' % pprint.pformat(self.decode_buf))
|
||||||
|
|
||||||
def decode_search_range(self):
|
def decode_search_range(self):
|
||||||
start_oid, include = self.decode_oid()
|
start_oid, include = self.decode_oid()
|
||||||
@ -207,14 +201,14 @@ class PDU(object):
|
|||||||
self.decode_buf = self.decode_buf[l + padding:]
|
self.decode_buf = self.decode_buf[l + padding:]
|
||||||
return buf
|
return buf
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception('Invalid packing octet header')
|
self.logger.exception('Invalid packing octet header')
|
||||||
|
|
||||||
def decode_value(self):
|
def decode_value(self):
|
||||||
try:
|
try:
|
||||||
vtype, _ = struct.unpack('!HH', self.decode_buf[:4])
|
vtype, _ = struct.unpack('!HH', self.decode_buf[:4])
|
||||||
self.decode_buf = self.decode_buf[4:]
|
self.decode_buf = self.decode_buf[4:]
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception('Invalid packing value header')
|
self.logger.exception('Invalid packing value header')
|
||||||
oid, _ = self.decode_oid()
|
oid, _ = self.decode_oid()
|
||||||
if vtype in [
|
if vtype in [
|
||||||
agentx.TYPE_INTEGER, agentx.TYPE_COUNTER32,
|
agentx.TYPE_INTEGER, agentx.TYPE_COUNTER32,
|
||||||
@ -241,7 +235,7 @@ class PDU(object):
|
|||||||
# No data
|
# No data
|
||||||
data = None
|
data = None
|
||||||
else:
|
else:
|
||||||
logger.error('Unknown Type: %s' % vtype)
|
self.logger.error('Unknown Type: %s' % vtype)
|
||||||
return {'type': vtype, 'name': oid, 'data': data}
|
return {'type': vtype, 'name': oid, 'data': data}
|
||||||
|
|
||||||
def decode_header(self):
|
def decode_header(self):
|
||||||
@ -267,11 +261,11 @@ class PDU(object):
|
|||||||
self.decode_buf = self.decode_buf[:ret['payload_length']]
|
self.decode_buf = self.decode_buf[:ret['payload_length']]
|
||||||
if ret['flags'] & 0x08: # content present
|
if ret['flags'] & 0x08: # content present
|
||||||
context = self.decode_octet()
|
context = self.decode_octet()
|
||||||
logger.debug('Context: %s' % context)
|
self.logger.debug('Context: %s' % context)
|
||||||
return ret
|
return ret
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception('Invalid packing: %d' % len(self.decode_buf))
|
self.logger.exception('Invalid packing: %d' % len(self.decode_buf))
|
||||||
logger.debug('%s' % pprint.pformat(self.decode_buf))
|
self.logger.debug('%s' % pprint.pformat(self.decode_buf))
|
||||||
|
|
||||||
def decode(self, buf):
|
def decode(self, buf):
|
||||||
self.set_decode_buf(buf)
|
self.set_decode_buf(buf)
|
||||||
@ -310,4 +304,4 @@ class PDU(object):
|
|||||||
else:
|
else:
|
||||||
pdu_type_str = agentx.PDU_TYPE_NAME.get(
|
pdu_type_str = agentx.PDU_TYPE_NAME.get(
|
||||||
ret['pdu_type'], 'Unknown:' + str(ret['pdu_type']))
|
ret['pdu_type'], 'Unknown:' + str(ret['pdu_type']))
|
||||||
logger.error('Unsupported PDU type:' + pdu_type_str)
|
self.logger.error('Unsupported PDU type:' + pdu_type_str)
|
||||||
|
@ -9,7 +9,7 @@ class MyAgent(agentx.Agent):
|
|||||||
def setup(self):
|
def setup(self):
|
||||||
global vppstat, vpp, logger
|
global vppstat, vpp, logger
|
||||||
|
|
||||||
self.logger.info("Connecting to VPP Stats...")
|
self.logger.info("Connecting to VPP Stats Segment")
|
||||||
vppstat = VPPStats(socketname='/run/vpp/stats.sock', timeout=2)
|
vppstat = VPPStats(socketname='/run/vpp/stats.sock', timeout=2)
|
||||||
if not vppstat.connect():
|
if not vppstat.connect():
|
||||||
self.logger.error("Can't connect to VPP Stats API, bailing")
|
self.logger.error("Can't connect to VPP Stats API, bailing")
|
||||||
|
Reference in New Issue
Block a user