Beispiel #1
0
    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))
Beispiel #2
0
 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")
Beispiel #3
0
    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))
Beispiel #4
0
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
Beispiel #5
0
 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)}
Beispiel #6
0
 def mac(self) -> str:
     return macbin2str(self._mac)