def scan_onu_list(self) -> Generator[ONUdevPort, None, None]: """ If fast operation then just return tuple. If long operation then return the generator of ports count first, then max chunk size, and ports in next in generations """ # numbers # fiber_nums = (safe_int(i) for i in self.get_list('.1.3.6.1.4.1.3320.101.6.1.1.1')) # numbers fiber_onu_counts = self.get_list(".1.3.6.1.4.1.3320.101.6.1.1.2") # comma separated strings, remember to remove empty elements fiber_onu_id_nums = self.get_list_keyval( ".1.3.6.1.4.1.3320.101.6.1.1.23") # All onu's count yield sum(safe_int(i) for i in fiber_onu_counts) # chunk max size yield 200 try: for fiber_onu_num, fiber_id in fiber_onu_id_nums: for onu_num in fiber_onu_num.split(b","): if not onu_num: continue onu_num = safe_int(onu_num) if onu_num == 0: continue status = safe_int( self.get_item(".1.3.6.1.4.1.3320.101.10.1.1.26.%d" % onu_num)) signal = safe_float( self.get_item(".1.3.6.1.4.1.3320.101.10.5.1.5.%d" % onu_num)) mac = self.get(".1.3.6.1.4.1.3320.101.10.1.1.3.%d" % onu_num) yield ONUdevPort( num=onu_num, name=self.get_item(".1.3.6.1.2.1.2.2.1.2.%d" % onu_num), status=status == 3, mac=macbin2str(mac.value), signal=signal / 10 if signal else "—", uptime=safe_int( self.get_item(".1.3.6.1.2.1.2.2.1.9.%d" % onu_num)), fiberid=safe_int(fiber_id), ) except EasySNMPTimeoutError as e: raise EasySNMPTimeoutError("{} ({})".format( gettext("wait for a reply from the SNMP Timeout"), e))
def onu_find_sn_by_mac(self) -> Tuple[Optional[int], Optional[str]]: parent = self.parent_dev if parent is not None: manager = parent.get_manager_object_olt() mac = self.mac_addr ports = manager.get_list_keyval(".1.3.6.1.4.1.3320.101.10.1.1.3") for srcmac, snmpnum in ports: # convert bytes mac address to str presentation mac address real_mac = macbin2str(srcmac) if mac == real_mac: return safe_int(snmpnum), None return None, _('Onu with mac "%(onu_mac)s" not found on OLT') % { "onu_mac": mac } return None, _("Parent device not found")
def get_units_unregistered(self, fiber_num: int) -> Iterable: sn_num_list = self.get_list_keyval( ".1.3.6.1.4.1.3902.1012.3.13.3.1.2.%d" % fiber_num) firmware_ver = self.get_list(".1.3.6.1.4.1.3902.1012.3.13.3.1.11.%d" % fiber_num) loid_passws = self.get_list(".1.3.6.1.4.1.3902.1012.3.13.3.1.9.%d" % fiber_num) loids = self.get_list(".1.3.6.1.4.1.3902.1012.3.13.3.1.8.%d" % fiber_num) return ({ "mac": macbin2str(sn[-6:]), "firmware_ver": frm_ver, "loid_passw": loid_passw, "loid": loid, "sn": "ZTEG" + "".join("%.2x" % i for i in sn[-4:]).upper(), } for frm_ver, loid_passw, loid, ( sn, num) in zip(firmware_ver, loid_passws, loids, sn_num_list))
def parse_opt82(remote_id: bytes, circuit_id: bytes) -> Tuple[Optional[str], int]: # 'remote_id': '0x000600ad24d0c544', 'circuit_id': '0x000400020002' mac, port = None, 0 if not isinstance(remote_id, bytes): remote_id = bytes(remote_id) if not isinstance(circuit_id, bytes): circuit_id = bytes(circuit_id) if circuit_id.startswith(b"ZTE"): mac = remote_id.decode() else: try: port = safe_int(circuit_id[-1:][0]) except IndexError: port = 0 if len(remote_id) >= 6: mac = macbin2str(remote_id[-6:]) return mac, port
def get_details(self): if self.dev_instance is None: return num = safe_int(self.dev_instance.snmp_extra) if not num: return status_map = {3: "ok", 2: "down"} try: # https://www.zabbix.com/documentation/1.8/ru/manual/advanced_snmp status = safe_int( self.get_item(".1.3.6.1.4.1.3320.101.10.1.1.26.%d" % num)) signal = safe_float( self.get_item(".1.3.6.1.4.1.3320.101.10.5.1.5.%d" % num)) # distance = self.get_item('.1.3.6.1.4.1.3320.101.10.1.1.27.%d' % num) mac = self.get_item_plain(".1.3.6.1.4.1.3320.101.10.1.1.3.%d" % num) uptime = safe_int(self.get_item(".1.3.6.1.2.1.2.2.1.9.%d" % num)) if uptime > 0: uptime = RuTimedelta(seconds=uptime / 100) # speed = self.get_item('.1.3.6.1.2.1.2.2.1.5.%d' % num) if status > 0: return { "status": status_map.get(status, "unknown"), "signal": signal / 10 if signal else "—", "mac": macbin2str(mac), "info": ( # IF-MIB::ifDescr (_("name"), self.get_item(".1.3.6.1.2.1.2.2.1.2.%d" % num)), # IF-MIB::ifMtu (_("mtu"), self.get_item(".1.3.6.1.2.1.2.2.1.4.%d" % num)), # IF-MIB::ifInOctets (_("in_octets"), bytes2human( safe_float( self.get_item(".1.3.6.1.2.1.2.2.1.10.%d" % num)))), # IF-MIB::ifInUcastPkts (_("in_ucst_pkts"), self.get_item(".1.3.6.1.2.1.2.2.1.11.%d" % num)), # IF-MIB::ifInNUcastPkts (_("in_not_ucst_pkts"), self.get_item(".1.3.6.1.2.1.2.2.1.12.%d" % num)), # IF-MIB::ifInDiscards (_("in_discards"), self.get_item(".1.3.6.1.2.1.2.2.1.13.%d" % num)), # IF-MIB::ifInErrors (_("in_errors"), self.get_item(".1.3.6.1.2.1.2.2.1.14.%d" % num)), # IF-MIB::ifOutOctets (_("out_octets"), bytes2human( safe_float( self.get_item(".1.3.6.1.2.1.2.2.1.16.%d" % num)))), # IF-MIB::ifOutUcastPkts (_("out_ucst_pkts"), self.get_item(".1.3.6.1.2.1.2.2.1.17.%d" % num)), # IF-MIB::ifOutNUcastPkts (_("out_not_ucst_pkts"), self.get_item(".1.3.6.1.2.1.2.2.1.18.%d" % num)), # IF-MIB::ifOutDiscards (_("out_discards"), self.get_item(".1.3.6.1.2.1.2.2.1.19.%d" % num)), # IF-MIB::ifOutErrors (_("out_errors"), self.get_item(".1.3.6.1.2.1.2.2.1.20.%d" % num)), (_("uptime"), str(uptime)), ), } except EasySNMPTimeoutError as e: return {"err": "{}: {}".format(_("ONU not connected"), e)}
def mac(self) -> str: return macbin2str(self._mac)