diff --git a/devices/HW_device_template.py b/devices/HW_device_template.py deleted file mode 100644 index dd6cad99bd5824bd1b8a37a471aeb7796f32a05d..0000000000000000000000000000000000000000 --- a/devices/HW_device_template.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- coding: utf-8 -*- -# -# This file wraps around a tango device class and provides a number of abstractions useful for hardware devices. It works together -# -# Distributed under the terms of the APACHE license. -# See LICENSE.txt for more info. - -""" - -""" - -# PyTango imports -from tango.server import run -from tango import AttrWriteType -# Additional import - -from util.attribute_wrapper import attribute_wrapper -from util.hardware_device import hardware_device - -__all__ = ["HW_dev"] - - -class HW_dev(hardware_device): - """ - This class is the minimal (read empty) implementation of a class using 'hardware_device' - """ - - # ---------- - # Attributes - # ---------- - """ - attribute wrapper objects can be declared here. All attribute wrapper objects will get automatically put in a list (attr_list) for easy access - - example = attribute_wrapper(comms_annotation="this is an example", datatype=numpy.double, dims=(8, 2), access=AttrWriteType.READ_WRITE) - ... - - """ - - def always_executed_hook(self): - """Method always executed before any TANGO command is executed.""" - pass - - def delete_device(self): - """Hook to delete resources allocated in init_device. - - This method allows for any memory or other resources allocated in the - init_device method to be released. This method is called by the device - destructor and by the device Init command (a Tango built-in). - """ - self.debug_stream("Shutting down...") - - self.Off() - self.debug_stream("Shut down. Good bye.") - - # -------- - # overloaded functions - # -------- - def fault(self): - """ user code here. is called when the state is set to FAULT """ - pass - - def off(self): - """ user code here. is called when the state is set to OFF """ - pass - - def on(self): - """ user code here. is called when the state is set to ON """ - - pass - - def standby(self): - """ user code here. is called when the state is set to STANDBY """ - pass - - def initialise(self): - """ user code here. is called when the sate is set to INIT """ - pass - - -# ---------- -# Run server -# ---------- -def main(args=None, **kwargs): - """Main function of the hardware device module.""" - return run((HW_dev,), args=args, **kwargs) - - -if __name__ == '__main__': - main() diff --git a/devices/SNMP.py b/devices/SNMP.py deleted file mode 100644 index f7a314be14ec4025d1de76350d34f9d5aab6794f..0000000000000000000000000000000000000000 --- a/devices/SNMP.py +++ /dev/null @@ -1,129 +0,0 @@ -# -*- coding: utf-8 -*- -# -# This file is part of the PCC project -# -# -# -# Distributed under the terms of the APACHE license. -# See LICENSE.txt for more info. - -""" SNMP Device for LOFAR2.0 - -""" - -# PyTango imports -from tango.server import run -from tango.server import device_property -from tango import AttrWriteType - -# Additional import -from clients.SNMP_client import SNMP_client -from util.attribute_wrapper import attribute_wrapper -from util.hardware_device import hardware_device - -import numpy - -__all__ = ["SNMP", "main"] - - -class SNMP(hardware_device): - """ - - **Properties:** - - - Device Property - SNMP_community - - Type:'DevString' - SNMP_host - - Type:'DevULong' - SNMP_timeout - - Type:'DevDouble' - """ - - # ----------------- - # Device Properties - # ----------------- - - SNMP_community = device_property( - dtype='DevString', - mandatory=True - ) - - SNMP_host = device_property( - dtype='DevString', - mandatory=True - ) - - SNMP_timeout = device_property( - dtype='DevDouble', - mandatory=True - ) - - # ---------- - # Attributes - # ---------- - - sys_description_R = attribute_wrapper(comms_annotation={"oids": "1.3.6.1.2.1.1.1.0"}, datatype=numpy.str_) - sys_objectID_R = attribute_wrapper(comms_annotation={"oids": "1.3.6.1.2.1.1.2.0", "type": "OID"}, datatype=numpy.int64) - sys_uptime_R = attribute_wrapper(comms_annotation={"oids": "1.3.6.1.2.1.1.3.0", "type": "TimeTicks"}, datatype=numpy.str_) - sys_name_R = attribute_wrapper(comms_annotation={"oids": "1.3.6.1.2.1.1.5.0"}, datatype=numpy.str_) - ip_route_mask_127_0_0_1_R = attribute_wrapper(comms_annotation={"oids": "1.3.6.1.2.1.4.21.1.11.127.0.0.1", "type": "IpAddress"}, datatype=numpy.str_) - TCP_active_open_R = attribute_wrapper(comms_annotation={"oids": "1.3.6.1.2.1.6.5.0", "type": "Counter32"}, datatype=numpy.str_) - - sys_contact_RW = attribute_wrapper(comms_annotation={"oids": "1.3.6.1.2.1.1.4.0"}, datatype=numpy.str_, access=AttrWriteType.READ_WRITE) - sys_contact_R = attribute_wrapper(comms_annotation={"oids": "1.3.6.1.2.1.1.4.0"}, datatype=numpy.str_) - - TCP_Curr_estab_R = attribute_wrapper(comms_annotation={"oids": "1.3.6.1.2.1.6.9.0", "type": "Gauge"}, datatype=numpy.int64) - - # inferred spectrum - if_index_R = attribute_wrapper(comms_annotation={"oids": "1.3.6.1.2.1.2.2.1.1"}, dims=(10,), datatype=numpy.int64) - - - - def always_executed_hook(self): - """Method always executed before any TANGO command is executed.""" - pass - - def delete_device(self): - """Hook to delete resources allocated in init_device. - - This method allows for any memory or other resources allocated in the - init_device method to be released. This method is called by the device - destructor and by the device Init command (a Tango built-in). - """ - self.debug_stream("Shutting down...") - - self.Off() - self.debug_stream("Shut down. Good bye.") - - # -------- - # overloaded functions - # -------- - def configure_for_initialise(self): - """ user code here. is called when the state is set to STANDBY """ - - # set up the SNMP ua client - self.snmp_manager = SNMP_client(self.SNMP_community, self.SNMP_host, self.SNMP_timeout, self.Fault, self) - - # map the attributes to the OPC ua comm client - for i in self.attr_list(): - i.set_comm_client(self.snmp_manager) - - self.snmp_manager.start() - - -# -------- -# Commands -# -------- - - -# ---------- -# Run server -# ---------- -def main(args=None, **kwargs): - """Main function of the PCC module.""" - return run((SNMP,), args=args, **kwargs) - - -if __name__ == '__main__': - main() diff --git a/devices/clients/SNMP_client.py b/devices/clients/SNMP_client.py deleted file mode 100644 index 7e774745d863640231a3d6d46b73c883bba6e155..0000000000000000000000000000000000000000 --- a/devices/clients/SNMP_client.py +++ /dev/null @@ -1,185 +0,0 @@ -from util.comms_client import CommClient -import snmp -import numpy -import traceback - -__all__ = ["SNMP_client"] - - -snmp_to_numpy_dict = { - snmp.types.INTEGER: numpy.int64, - snmp.types.TimeTicks: numpy.int64, - snmp.types.OCTET_STRING: str, - snmp.types.OID: str -} - -snmp_types = { - "Integer": numpy.int64, - "Gauge": numpy.int64, - "TimeTick": numpy.int64, - "Counter32": numpy.int64, - "OctetString": str, - "IpAddress": str, - "OID": str, -} - - -# numpy_to_snmp_dict = { -# numpy.int64, -# numpy.int64, -# str, -# } - - -class SNMP_client(CommClient): - """ - messages to keep a check on the connection. On connection failure, reconnects once. - """ - - def start(self): - super().start() - - def __init__(self, community, host, timeout, fault_func, streams, try_interval=2): - """ - Create the SNMP and connect() to it - """ - super().__init__(fault_func, streams, try_interval) - - self.community = community - self.host = host - self.manager = snmp.Manager(community=bytes(community, "utf8")) - - # Explicitly connect - if not self.connect(): - # hardware or infra is down -- needs fixing first - fault_func() - return - - def connect(self): - """ - Try to connect to the client - """ - self.streams.debug_stream("Connecting to community: %s, host: %s", self.community, self.host) - - self.connected = True - return True - - def ping(self): - """ - ping the client to make sure the connection with the client is still functional. - """ - pass - - def _setup_annotation(self, annotation): - """ - This class's Implementation of the get_mapping function. returns the read and write functions - """ - - if isinstance(annotation, dict): - # check if required path inarg is present - if annotation.get('oids') is None: - AssertionError("SNMP get attributes require an oid") - oids = annotation.get("oids") # required - else: - TypeError("SNMP attributes require a dict with oid(s)") - return - - if annotation.get('type') is not None: - dtype = annotation.get("type") # required - # actual_type = snmp_types[dtype] - else: - dtype = None - - return oids, dtype - - def setup_value_conversion(self, attribute): - """ - gives the client access to the attribute_wrapper object in order to access all data it could potentially need. - """ - - dim_x = attribute.dim_x - dim_y = attribute.dim_y - - return dim_x, dim_y - - def get_oids(self, x, y, in_oid): - - if x == 0: - x = 1 - if y == 0: - y = 1 - - nof_oids = x * y - - if nof_oids == 1: - # is scalar - if type(in_oid) is str: - # for ease of handling put single oid in a 1 element list - in_oid = [in_oid] - return in_oid - - elif type(in_oid) is list and len(in_oid) == nof_oids: - # already is an array and of the right length - return in_oid - elif type(in_oid) is list and len(in_oid) != nof_oids: - # already is an array but the wrong length. Unable to handle this - raise ValueError("SNMP oids need to either be a single value or an array the size of the attribute dimensions. got: {} expected: {}x{}={}".format(len(in_oid),x,y,x*y)) - else: - out_oids = [] - - for i in range(nof_oids): - out_oids.append(in_oid + ".{}".format(i+1)) - - return out_oids - - def setup_attribute(self, annotation, attribute): - """ - MANDATORY function: is used by the attribute wrapper to get read/write functions. must return the read and write functions - """ - - # process the annotation - oids, dtype = self._setup_annotation(annotation) - - # get all the necessary data to set up the read/write functions from the attribute_wrapper - dim_x, dim_y = self.setup_value_conversion(attribute) - oids = self.get_oids(dim_x, dim_y, oids) - - if dtype is None: - - def _read_function(): - vars = self.manager.get(self.host, *oids) - - value = [] - for i in vars: - val = snmp_to_numpy_dict[type(i.value)](str(i.value)) - value.append(val) - return value - - def _write_function(value): - if len(oids) == 1 and type(value) != list: - value = [value] - else: - for i in range(len(oids)): - self.manager.set(self.host, oids[i], value[i]) - - else: - def _read_function(): - vars = self.manager.get(self.host, *oids) - - value = [] - for i in vars: - val = snmp_to_numpy_dict[type(i.value)](str(i.value)) - value.append(val) - return value - - def _write_function(value): - if len(oids) == 1 and type(value) != list: - value = [value] - else: - for i in range(len(oids)): - self.manager.set(self.host, oids[i], snmp_types[dtype](value[i])) - - # return the read/write functions - return _read_function, _write_function - -