Ejemplo n.º 1
0
def _remove_zte_onu_from_olt(
    zte_ip_addr: str, telnet_login: str, telnet_passw: str, telnet_prompt: str, snmp_info: str, *args, **kwargs
):
    if not re.match(expect_util.IP4_ADDR_REGEX, zte_ip_addr):
        raise expect_util.ExpectValidationError("ip address for zte not valid")

    rack_num, fiber_num, onu_num = zte_utils.zte_onu_conv_from_onu(snmp_info)
    int_addr = "1/%d/%d" % (rack_num, fiber_num)

    # Входим
    ch = ZteOnuDeviceConfigType.login_into_olt(zte_ip_addr, telnet_login, telnet_passw, telnet_prompt)

    # enter to config
    ch.do_cmd("conf t", "%s(config)#" % telnet_prompt)

    # go to olt interface
    ch.do_cmd("interface gpon-olt_%s" % int_addr, "%s(config-if)#" % telnet_prompt)

    # remove onu register from olt fiber
    ch.do_cmd("no onu %d" % onu_num, "%s(config-if)#" % telnet_prompt)

    # Exit
    ch.do_cmd("exit", "%s(config)#" % telnet_prompt)
    ch.do_cmd("exit", "%s#" % telnet_prompt)
    ch.sendline("exit")
    ch.close()
    return True
Ejemplo n.º 2
0
    def remove_from_olt(self, extra_data: Dict):
        dev = self.dev_instance
        if not dev:
            return False
        if not dev.parent_dev or not dev.snmp_extra:
            return False
        telnet = extra_data.get("telnet")
        if not telnet:
            return False

        fiber_num, onu_num = str(dev.snmp_extra).split(".")
        fiber_num, onu_num = safe_int(fiber_num), safe_int(onu_num)
        fiber_addr = "%d.%d" % (fiber_num, onu_num)
        sn = self.get_item_plain(".1.3.6.1.4.1.3902.1012.3.28.1.1.5.%s" % fiber_addr)
        if sn is not None:
            if isinstance(sn, str):
                sn = "ZTEG%s" % "".join("%.2X" % ord(x) for x in sn[-4:])
            else:
                sn = "ZTEG%s" % "".join("%.2X" % x for x in sn[-4:])
            sn_mac = zte_utils.sn_to_mac(sn)
            if str(dev.mac_addr) != sn_mac:
                raise expect_util.ExpectValidationError(_("Mac of device not equal mac by snmp"))
            return _remove_zte_onu_from_olt(
                zte_ip_addr=str(dev.parent_dev.ip_address),
                telnet_login=telnet.get("login"),
                telnet_passw=telnet.get("password"),
                telnet_prompt=telnet.get("prompt"),
                snmp_info=str(dev.snmp_extra),
            )
        raise DeviceConsoleError(_("Could not fetch serial for onu"))
Ejemplo n.º 3
0
 def validate_extra_snmp_info(v: str) -> None:
     # for example 268501760.5
     try:
         fiber_num, onu_port = v.split(".")
         int(fiber_num), int(onu_port)
     except ValueError:
         raise expect_util.ExpectValidationError(_("Zte onu snmp field must be two dot separated integers"))
Ejemplo n.º 4
0
def _get_pon_mng_template(all_vids: VlanList, config: dict, *args,
                          **kwargs) -> list:
    all_vids = ",".join(map(str, set(all_vids)))
    vlan_config = config.get("vlanConfig")
    vids = vlan_config[0].get("vids")
    native_vids = (vid.get("vid") for vid in vids if vid.get("native", False))
    native_vids = list(set(native_vids))
    trunk_vids = (vid.get("vid") for vid in vids
                  if not vid.get("native", False))
    trunk_vids = list(set(trunk_vids))

    native_vids_len = len(native_vids)
    trunk_vids_len = len(trunk_vids)

    if native_vids_len > 1:
        raise expect_util.ExpectValidationError(
            _("Multiple native vid is not allowed on one port"))

    ports_config = []

    if native_vids_len == 1:
        if trunk_vids_len > 0:
            # Trunk with access port, Hybrid
            ports_config.extend([
                "vlan port eth_0/1 mode hybrid def-vlan %d" % native_vids[0],
                "vlan port eth_0/1 vlan %s" % ",".join(map(str, trunk_vids)),
            ])
        elif trunk_vids_len == 0:
            # Only Access port
            ports_config.append("vlan port eth_0/1 mode tag vlan %d" %
                                native_vids[0])
    elif native_vids_len == 0:
        if trunk_vids_len > 0:
            # Only trunk port
            ports_config.extend([
                "vlan port eth_0/1 mode trunk",
                "vlan port eth_0/1 vlan %s" % ",".join(map(str, trunk_vids)),
            ])
        elif trunk_vids_len == 0:
            # Without vlan config, type default vlan
            ports_config.append("vlan port eth_0/1 mode tag vlan 1")

    return ([
        f"service HSI type internet gemport 1 vlan {all_vids}",
        "loop-detect ethuni eth_0/1 enable",
    ] + ports_config + ["dhcp-ip ethuni eth_0/1 forbidden"])
Ejemplo n.º 5
0
def remove_from_olt(ip_addr: str, telnet_login: str, telnet_passw: str, telnet_prompt: str, int_name: str):
    if not re.match(expect_util.IP4_ADDR_REGEX, ip_addr):
        raise expect_util.ExpectValidationError("ip address for OLT not valid")

    # Split "EPON0/1:17" for fiber_num - 1, and onu_num - 17
    try:
        fiber_num, onu_num = int_name.split("/")[1].split(":")
        fiber_num, onu_num = safe_int(fiber_num), safe_int(onu_num)
    except (IndexError, ValueError):
        raise DeviceImplementationError("Device interface unexpected")

    if onu_num < 1 or onu_num > 64:
        raise DeviceImplementationError("Onu num must be in range 1-64")

    # Enter
    ch = expect_util.MySpawn("telnet %s" % ip_addr)
    ch.timeout = 15
    ch.expect_exact("Username: "******"Password: "******"Authentication failed!", "%s>" % telnet_prompt])
    if choice == 0:
        raise DeviceConsoleError(gettext("Wrong login or password for telnet access"))

    # enable privileges
    ch.do_cmd("enable", "%s#" % telnet_prompt)

    # enter to config
    ch.do_cmd("config", "%s_config#" % telnet_prompt)

    fiber_prompt = "%s_config_epon0/%d#" % (telnet_prompt, fiber_num)

    # enter to fiber
    ch.do_cmd("int EPON0/%d" % fiber_num, fiber_prompt)

    # unbind onu
    ch.do_cmd("no epon bind-onu sequence %d" % onu_num, fiber_prompt)

    # end removing
    ch.close()
    return True
Ejemplo n.º 6
0
def _get_onu_mng_template(all_vids: VlanList, config: dict, *args, **kwargs):
    all_vids = ",".join(map(str, set(all_vids)))
    vlan_config = config.get("vlanConfig")

    ports_config = []

    for port_conf in vlan_config:
        port_num = port_conf.get("port")

        vids = port_conf.get("vids")
        if not vids:
            continue

        native_vids = (vid.get("vid") for vid in vids
                       if vid.get("native", False))
        native_vids = list(set(native_vids))
        trunk_vids = (vid.get("vid") for vid in vids
                      if not vid.get("native", False))
        trunk_vids = list(set(trunk_vids))

        native_vids_len = len(native_vids)
        trunk_vids_len = len(trunk_vids)

        if native_vids_len > 1:
            raise expect_util.ExpectValidationError(
                _("Multiple native vid is not allowed on one port"))

        if native_vids_len == 1:
            if trunk_vids_len > 0:
                # Trunk with access port, Hybrid
                ports_config.extend([
                    "vlan port eth_0/%d mode hybrid def-vlan %d" %
                    (port_num, native_vids[0]),
                    "vlan port eth_0/%d vlan %s" %
                    (port_num, ",".join(map(str, trunk_vids))),
                ])
            elif trunk_vids_len == 0:
                # Only Access port
                ports_config.append("vlan port eth_0/%d mode tag vlan %d" %
                                    (port_num, native_vids[0]))
        elif native_vids_len == 0:
            if trunk_vids_len > 0:
                # Only trunk port
                ports_config.extend([
                    "vlan port eth_0/%d mode trunk" % port_num,
                    "vlan port eth_0/%d vlan %s" %
                    (port_num, ",".join(map(str, trunk_vids))),
                ])
            elif trunk_vids_len == 0:
                # Without vlan config, type default vlan
                ports_config.append("vlan port eth_0/%d mode tag vlan 1" %
                                    port_num)

    return ([
        f"service HSI type internet gemport 1 vlan {all_vids}",
        "loop-detect ethuni eth_0/1 enable",
        "loop-detect ethuni eth_0/2 enable",
        "loop-detect ethuni eth_0/3 enable",
        "loop-detect ethuni eth_0/4 enable",
        "interface pots pots_0/1 state lock",
        "interface pots pots_0/2 state lock",
        "interface wifi wifi_0/1 state lock",
    ] + ports_config + [
        "dhcp-ip ethuni eth_0/1 forbidden",
        "dhcp-ip ethuni eth_0/2 forbidden",
        "dhcp-ip ethuni eth_0/3 forbidden",
        "dhcp-ip ethuni eth_0/4 forbidden",
    ])
Ejemplo n.º 7
0
    def register_onu(
        self,
        serial: str,
        config: dict,
        onu_mac: str,
        zte_ip_addr: str,
        telnet_login: str,
        telnet_password: str,
        telnet_prompt: str,
        *args,
        **kwargs,
    ) -> Optional[str]:
        if not re.match(r"^ZTEG[0-9A-F]{8}$", serial):
            raise expect_util.ExpectValidationError(
                "Serial not valid, match: ^ZTEG[0-9A-F]{8}$")

        all_vids = get_all_vlans_from_config(config=config)
        if not all_vids:
            raise zte_utils.OnuZteRegisterError("not passed vlan list")

        onu_vlan = safe_int(all_vids[0])
        if onu_vlan == 0:
            raise zte_utils.OnuZteRegisterError("Bad vlan passed in config")

        if not re.match(expect_util.IP4_ADDR_REGEX, zte_ip_addr):
            raise expect_util.ExpectValidationError(
                "ip address for zte not valid")

        ch = self.login_into_olt(zte_ip_addr, telnet_login, telnet_password,
                                 telnet_prompt)
        self.ch = ch

        stack_num, rack_num, fiber_num = self.find_unregistered_onu(
            prompt=telnet_prompt, serial=serial)

        free_onu_number = self.get_last_registered_onu_number(
            stack_num=stack_num,
            rack_num=rack_num,
            fiber_num=fiber_num,
            prompt=telnet_prompt)

        # enter to config
        ch.do_cmd("conf t", f"{telnet_prompt}(config)#")

        int_addr = "%d/%d/%d" % (stack_num, rack_num, fiber_num)

        self.register_onu_on_olt_interface(
            free_onu_number=free_onu_number,
            serial=serial,
            prompt=telnet_prompt,
            onu_type=self.zte_type,
            int_addr=int_addr,
        )

        self.apply_zte_top_conf(
            prompt=telnet_prompt,
            free_onu_number=free_onu_number,
            int_addr=int_addr,
            user_vid=onu_vlan,
            onu_mac=onu_mac,
            all_vids=all_vids,
            config=config,
        )

        self.apply_zte_bot_conf(
            prompt=telnet_prompt,
            int_addr=int_addr,
            free_onu_number=free_onu_number,
            user_vid=onu_vlan,
            all_vids=all_vids,
            config=config,
        )

        ch.do_cmd("exit", "%s#" % telnet_prompt)
        ch.sendline("exit")

        ch.close()
        return zte_utils.zte_onu_conv_to_num(rack_num=rack_num,
                                             fiber_num=fiber_num,
                                             port_num=free_onu_number)