Example #1
0
 def runTest(self):
     board.sendline(
         'rm -f /etc/config/samba; opkg update; opkg install --force-reinstall samba36-server samba36-client kmod-fs-cifs'
     )
     board.expect('Configuring samba36-server')
     board.expect(prompt)
     board.sendline(
         'mkdir -p /tmp/samba; chmod a+rwx /tmp/samba; rm -rf /tmp/samba/*')
     board.expect(prompt)
     board.sendline(
         'uci set samba.@samba[0].homes=0; uci delete samba.@sambashare[0]; uci add samba sambashare; uci set samba.@sambashare[0]=sambashare; uci set samba.@sambashare[0].name="boardfarm-test"; uci set samba.@sambashare[0].path="/tmp/samba"; uci set samba.@sambashare[0].read_only="no"; uci set samba.@sambashare[0].guest_ok="yes"; uci commit samba'
     )
     board.expect(prompt)
     board.sendline('/etc/init.d/samba restart')
     board.sendline('smbclient -N -L 127.0.0.1')
     board.expect('boardfarm-test')
     board.expect(prompt)
     lan.sendline('smbclient -N -L %s' %
                  board.get_interface_ipaddr(board.lan_iface))
     lan.expect('boardfarm-test')
     lan.expect(prompt)
     lan.sendline(
         'mkdir -p /mnt/samba; mount -o guest //%s/boardfarm-test /mnt/samba'
         % board.get_interface_ipaddr(board.lan_iface))
     lan.expect(prompt)
     lan.sendline('echo boardafarm-testing-string > /mnt/samba/test')
     lan.expect(prompt)
     lan.sendline('umount /mnt/samba')
     lan.expect(prompt)
     board.sendline('cat /tmp/samba/test')
     board.expect('boardafarm-testing-string')
     board.expect(prompt)
Example #2
0
def check_valid_docsis_ip_networking(board,
                                     strict=True,
                                     time_for_provisioning=120):
    start_time = time.time()

    wan_ipv4 = False
    wan_ipv6 = False
    erouter_ipv4 = False
    erouter_ipv6 = False
    mta_ipv4 = True
    mta_ipv6 = False  # Not in spec

    cm_configmode = board.cm_cfg.cm_configmode

    if cm_configmode == 'bridge':
        # TODO
        pass
    if cm_configmode == 'ipv4':
        wan_ipv4 = erouter_ipv4 = True
    if cm_configmode == 'dslite':
        # TODO
        pass
    if cm_configmode == 'dual-stack':
        wan_ipv4 = erouter_ipv4 = True
        wan_ipv6 = erouter_ipv6 = True

    while (time.time() - start_time < time_for_provisioning):
        try:
            if wan_ipv4:
                valid_ipv4(board.get_interface_ipaddr(board.wan_iface))
            if wan_ipv6:
                valid_ipv6(board.get_interface_ip6addr(board.wan_iface))

            if hasattr(board, 'erouter_iface'):
                if erouter_ipv4:
                    valid_ipv4(board.get_interface_ipaddr(board.erouter_iface))
                if erouter_ipv6:
                    valid_ipv6(board.get_interface_ip6addr(
                        board.erouter_iface))

            if hasattr(board, 'mta_iface'):
                if mta_ipv4:
                    valid_ipv4(board.get_interface_ipaddr(board.mta_iface))
                if mta_ipv6:
                    valid_ipv6(board.get_interface_ip6addr(board.mta_iface))

            # if we get this far, we have all IPs and can exit while loop
            break
        except KeyboardInterrupt:
            raise
        except:
            if time.time() - start_time > time_for_provisioning:
                if strict:
                    assert False, "Failed to provision docsis device properly"
                else:
                    print("WARN: failed to provision board entirely")
Example #3
0
 def server_opts_reverse(self, node=lan):
     try:
         lan_priv_ip = node.get_interface_ipaddr("eth1")
     except:
         lan_priv_ip = node.get_interface_ipaddr("wlan0")
     board.uci_forward_traffic_redirect("tcp", "5001", lan_priv_ip)
     self.rip = board.get_interface_ipaddr(board.wan_iface)
     return ""
Example #4
0
 def server_opts_reverse(self, node=lan):
     try:
         lan_priv_ip = node.get_interface_ipaddr("eth1")
     except:
         lan_priv_ip = node.get_interface_ipaddr("wlan0")
     board.uci_forward_traffic_redirect("udp", "5001", lan_priv_ip)
     self.rip = board.get_interface_ipaddr(board.wan_iface)
     return ""
Example #5
0
 def runTest(self):
     lan.sendline('nmap -sS -A -v -p 1-10000 %s' % board.get_interface_ipaddr(board.lan_iface))
     lan.expect('Starting Nmap')
     lan.expect('Nmap scan report', timeout=1200)
     lan.expect(prompt, timeout=60)
     open_ports = re.findall("(\d+)/tcp\s+open", lan.before)
     msg = "Found %s open TCP ports on LAN interface: %s." % \
         (len(open_ports), ", ".join(open_ports))
     self.result_message = msg
Example #6
0
 def runTest(self):
     lan.sendline('nmap -sS -A -v -p 1-10000 %s' %
                  board.get_interface_ipaddr(board.lan_iface))
     lan.expect('Starting Nmap')
     lan.expect('Nmap scan report', timeout=1200)
     lan.expect(prompt, timeout=60)
     open_ports = re.findall("(\d+)/tcp\s+open", lan.before)
     msg = "Found %s open TCP ports on LAN interface: %s." % \
         (len(open_ports), ", ".join(open_ports))
     self.result_message = msg
Example #7
0
 def runTest(self):
     if not lan:
         msg = 'No LAN Device defined, skipping ping test from LAN.'
         lib.common.test_msg(msg)
         self.skipTest(msg)
     router_ip = board.get_interface_ipaddr(board.lan_iface)
     lan.sendline('\nping -i 0.2 -c 5 %s' % router_ip)
     lan.expect('PING ')
     lan.expect('5 (packets )?received', timeout=15)
     lan.expect(prompt)
Example #8
0
 def runTest(self):
     wan_ip_addr = board.get_interface_ipaddr('eth0')
     wan.sendline('\nnmap -sS -A -v %s' % wan_ip_addr)
     wan.expect('Starting Nmap', timeout=5)
     wan.expect('Nmap scan report', timeout=120)
     wan.expect(prompt, timeout=60)
     open_ports = re.findall("(\d+)/tcp\s+open", wan.before)
     msg = "Found %s open TCP ports on WAN interface." % len(open_ports)
     self.result_message = msg
     assert len(open_ports) == 0
    def runTest(self):
        wan.sendline(
            'apt-get -o DPkg::Options::="--force-confnew" -y --force-yes install snmp'
        )
        wan.expect(prompt)

        wan_ip = board.get_interface_ipaddr(board.wan_iface)

        wan.sendline('snmpget -v2c -c public %s 1.3.6.1.2.1.1.1.0' % wan_ip)
        wan.expect('iso.3.6.1.2.1.1.1.0 = STRING: ')
        wan.expect(prompt)

        self.result_message = wan.before
Example #10
0
 def runTest(self):
     wan_ip_addr = board.get_interface_ipaddr(board.wan_iface)
     wan.sendline('\nnmap -sS -A -v %s' % wan_ip_addr)
     wan.expect('Starting Nmap', timeout=5)
     wan.expect('Nmap scan report', timeout=240)
     wan.expect(prompt, timeout=60)
     open_ports = re.findall("(\d+)/tcp\s+open", wan.before)
     msg = "Found %s open TCP ports on WAN interface." % len(open_ports)
     self.result_message = msg
     print("open ports = %s" % open_ports)
     if hasattr(board, 'wan_open_ports'):
         print("allowing open ports %s" % board.wan_open_ports)
         open_ports = set(open_ports) - set(board.wan_open_ports)
     assert len(open_ports) == 0
Example #11
0
 def runTest(self):
     wan_ip_addr = board.get_interface_ipaddr(board.wan_iface)
     wan.sendline('\nnmap -sS -A -v %s' % wan_ip_addr)
     wan.expect('Starting Nmap', timeout=5)
     wan.expect('Nmap scan report', timeout=240)
     wan.expect(prompt, timeout=60)
     open_ports = re.findall("(\d+)/tcp\s+open", wan.before)
     msg = "Found %s open TCP ports on WAN interface." % len(open_ports)
     self.result_message = msg
     print("open ports = %s" % open_ports)
     if hasattr(board, 'wan_open_ports'):
         print ("allowing open ports %s" % board.wan_open_ports)
         open_ports = set(open_ports) - set(board.wan_open_ports)
     assert len(open_ports) == 0
Example #12
0
 def runTest(self):
     lan.sendline('nmap -sS -A -v -p 1-10000 %s' %
                  board.get_interface_ipaddr(board.lan_iface))
     lan.expect('Starting Nmap')
     for i in range(12):
         if 0 == lan.expect(['Nmap scan report', pexpect.TIMEOUT],
                            timeout=100):
             break
         board.sendcontrol('c')
         board.expect(prompt)
     lan.expect(prompt, timeout=60)
     open_ports = re.findall("(\d+)/tcp\s+open", lan.before)
     msg = "Found %s open TCP ports on LAN interface: %s." % \
         (len(open_ports), ", ".join(open_ports))
     self.result_message = msg
    def runTest(self):
        super(SshWanDetect, self).runTest()

        board.uci_allow_wan_ssh()

        ipaddr = board.get_interface_ipaddr(board.wan_iface)
        port = "22"

        if wan:
            t = wan
        else:
            t = pexpect.spawn("bash")

        sp = lib.common.spawn_ssh_pexpect(ipaddr, "root",
                "password", prompt="root@OpenWrt", port=port, via=wan)
        sp.sendline("exit")
    def runTest(self):
        super(SshWanDetect, self).runTest()

        board.uci_allow_wan_ssh()

        ipaddr = board.get_interface_ipaddr(board.wan_iface)
        port = "22"

        if wan:
            t = wan
        else:
            t = pexpect.spawn("bash")

        sp = lib.common.spawn_ssh_pexpect(ipaddr, "root",
                "password", prompt="root@OpenWrt", port=port, via=wan)
        sp.sendline("exit")
    def runTest(self):
        super(NetperfUdpTest, self).runTest()

        self.run_netperf(lan, "192.168.0.1 -c -C -l 30 -t UDP_STREAM -- -m 1460 -M 1460")

        # setup port forwarding to lan netperf server
        lan_priv_ip = lan.get_interface_ipaddr("eth1")
        board.uci_forward_traffic_redirect("tcp", "12865", lan_priv_ip)
        # setup port for data socket separate from control port
        board.uci_forward_traffic_redirect("udp", "12866", lan_priv_ip)

        wan_ip = board.get_interface_ipaddr(board.wan_iface)

        # send at router ip, which will forward to lan client
        wan.sendline('')
        wan.expect(prompt)
        self.run_netperf(wan, wan_ip, "-c -C -l 30 -t UDP_STREAM -- -P ,12866 -m 1460 -M 1460")
Example #16
0
    def runTest(self):
        super(NetperfUdpTest, self).runTest()

        self.run_netperf(
            lan, "192.168.0.1 -c -C -l 30 -t UDP_STREAM -- -m 1460 -M 1460")

        # setup port forwarding to lan netperf server
        lan_priv_ip = lan.get_interface_ipaddr(lan.iface_dut)
        board.uci_forward_traffic_redirect("tcp", "12865", lan_priv_ip)
        # setup port for data socket separate from control port
        board.uci_forward_traffic_redirect("udp", "12866", lan_priv_ip)

        wan_ip = board.get_interface_ipaddr(board.wan_iface)

        # send at router ip, which will forward to lan client
        wan.sendline('')
        wan.expect(prompt)
        self.run_netperf(
            wan, wan_ip,
            "-c -C -l 30 -t UDP_STREAM -- -P ,12866 -m 1460 -M 1460")
    def runTest(self):
        # setup port forwarding to lan netperf server
        lan_priv_ip = lan.get_interface_ipaddr("eth1")
        board.uci_forward_traffic_redirect("tcp", "12865", lan_priv_ip)
        # setup port for data socket separate from control port
        board.uci_forward_traffic_redirect("tcp", "12866", lan_priv_ip)

        wan_ip = board.get_interface_ipaddr(board.wan_iface)

        # send at router ip, which will forward to lan client
        wan.sendline('')
        wan.expect(prompt)
        board.sendline('mpstat -P ALL 30 1')
        speed = self.run_netperf(wan, wan_ip, "-c -C -l 30 -t TCP_STREAM -- -P ,12866")
        board.expect('Average.*idle\r\nAverage:\s+all(\s+[0-9]+.[0-9]+){10}\r\n')
        idle_cpu = float(board.match.group(1))
        avg_cpu = 100 - float(idle_cpu)
        lib.common.test_msg("Average cpu usage was %s" % avg_cpu)

        self.result_message = "Setup NetperfReverse and Ran Throughput (Speed = %s 10^6bits/sec, CPU = %s)" % (speed, avg_cpu)
Example #18
0
    def runTest(self):
        # setup port forwarding to lan netperf server
        lan_priv_ip = lan.get_interface_ipaddr(lan.iface_dut)
        board.uci_forward_traffic_redirect("tcp", "12865", lan_priv_ip)
        # setup port for data socket separate from control port
        board.uci_forward_traffic_redirect("tcp", "12866", lan_priv_ip)

        wan_ip = board.get_interface_ipaddr(board.wan_iface)

        # send at router ip, which will forward to lan client
        wan.sendline('')
        wan.expect(prompt)
        board.sendline('mpstat -P ALL 30 1')
        speed = self.run_netperf(wan, wan_ip,
                                 "-c -C -l 30 -t TCP_STREAM -- -P ,12866")
        board.expect(
            'Average.*idle\r\nAverage:\s+all(\s+[0-9]+.[0-9]+){10}\r\n')
        idle_cpu = float(board.match.group(1))
        avg_cpu = 100 - float(idle_cpu)
        lib.common.test_msg("Average cpu usage was %s" % avg_cpu)

        self.result_message = "Setup NetperfReverse and Ran Throughput (Speed = %s 10^6bits/sec, CPU = %s)" % (
            speed, avg_cpu)
Example #19
0
 def runTest(self):
     board.sendline('rm -f /etc/config/samba; opkg update; opkg install --force-reinstall samba36-server samba36-client kmod-fs-cifs')
     board.expect('Configuring samba36-server')
     board.expect(prompt)
     board.sendline('mkdir -p /tmp/samba; chmod a+rwx /tmp/samba; rm -rf /tmp/samba/*')
     board.expect(prompt)
     board.sendline('uci set samba.@samba[0].homes=0; uci delete samba.@sambashare[0]; uci add samba sambashare; uci set samba.@sambashare[0]=sambashare; uci set samba.@sambashare[0].name="boardfarm-test"; uci set samba.@sambashare[0].path="/tmp/samba"; uci set samba.@sambashare[0].read_only="no"; uci set samba.@sambashare[0].guest_ok="yes"; uci commit samba')
     board.expect(prompt)
     board.sendline('/etc/init.d/samba restart')
     board.sendline('smbclient -N -L 127.0.0.1')
     board.expect('boardfarm-test')
     board.expect(prompt)
     lan.sendline('smbclient -N -L %s' % board.get_interface_ipaddr(board.lan_iface))
     lan.expect('boardfarm-test')
     lan.expect(prompt)
     lan.sendline('mkdir -p /mnt/samba; mount -o guest //%s/boardfarm-test /mnt/samba' % board.get_interface_ipaddr(board.lan_iface))
     lan.expect(prompt)
     lan.sendline('echo boardafarm-testing-string > /mnt/samba/test')
     lan.expect(prompt)
     lan.sendline('umount /mnt/samba')
     lan.expect(prompt)
     board.sendline('cat /tmp/samba/test')
     board.expect('boardafarm-testing-string')
     board.expect(prompt)
    def boot(self, reflash=True):
        # start tftpd server on appropriate device
        tftp_servers = [ x['name'] for x in self.config.board['devices'] if 'tftpd-server' in x.get('options', "") ]
        tftp_device = None
        # start all tftp servers for now
        for tftp_server in tftp_servers:
            # This is a mess, just taking the last tftpd-server?
            tftp_device = getattr(self.config, tftp_server)

        dhcp_started = False

        # start dhcp servers
        for device in self.config.board['devices']:
            if 'options' in device and 'no-dhcp-sever' in device['options']:
                continue
            if 'options' in device and 'dhcp-server' in device['options']:
                getattr(self.config, device['name']).setup_dhcp_server()
                dhcp_started = True

        if not wan and len(tftp_servers) == 0:
            msg = 'No WAN Device or tftp_server defined, skipping flash.'
            lib.common.test_msg(msg)
            self.skipTest(msg)

        # This still needs some clean up, the fall back is to assuming the
        # WAN provides the tftpd server, but it's not always the case
        if wan:
            wan.configure(kind="wan_device", config=self.config.board)
            if tftp_device is None:
                tftp_device = wan

        if wan and not dhcp_started:
            wan.setup_dhcp_server()

        tftp_device.start_tftp_server()

        prov = getattr(self.config, 'provisioner', None)
        if prov is not None:
            prov.tftp_device = tftp_device
            prov.provision_board(self.config.board)

            if hasattr(prov, 'prov_gateway'):
                gw = prov.prov_gateway if wan.gw in prov.prov_network else prov.prov_ip

                for nw in [prov.cm_network, prov.mta_network, prov.open_network]:
                    wan.sendline('ip route add %s via %s' % (nw, gw))
                    wan.expect(prompt)

            # TODO: don't do this and sort out two interfaces with ipv6
            wan.disable_ipv6('eth0')

            if hasattr(prov, 'prov_gateway_v6'):
                wan.sendline('ip -6 route add default via %s' % str(prov.prov_gateway_v6))
                wan.expect(prompt)

            wan.sendline('ip route')
            wan.expect(prompt)
            wan.sendline('ip -6 route')
            wan.expect(prompt)

        if lan:
            lan.configure(kind="lan_device")

        # tftp_device is always None, so we can set it from config
        board.tftp_server = tftp_device.ipaddr
        # then these are just hard coded defaults
        board.tftp_port = 22
        # but are user/password used for tftp, they are likely legacy and just need to go away
        board.tftp_username = "******"
        board.tftp_password = "******"

        board.reset()
        rootfs = None

        # Reflash only if at least one or more of these
        # variables are set, or else there is nothing to do in u-boot
        meta_interrupt = False
        if self.config.META_BUILD and not board.flash_meta_booted:
            meta_interrupt = True
        if reflash and (meta_interrupt or self.config.ROOTFS or\
                            self.config.KERNEL or self.config.UBOOT):
            # Break into U-Boot, set environment variables
            board.wait_for_boot()
            board.setup_uboot_network(tftp_device.gw)
            if self.config.META_BUILD:
                for attempt in range(3):
                    try:
                        board.flash_meta(self.config.META_BUILD, wan, lan)
                        break
                    except Exception as e:
                        print(e)
                        tftp_device.restart_tftp_server()
                        board.reset(break_into_uboot=True)
                        board.setup_uboot_network(tftp_device.gw)
                else:
                    raise Exception('Error during flashing...')
            if self.config.UBOOT:
                board.flash_uboot(self.config.UBOOT)
            if self.config.ROOTFS:
                # save filename for cases where we didn't flash it
                # but will use it later to load from memory
                rootfs = board.flash_rootfs(self.config.ROOTFS)
            if self.config.NFSROOT:
                board.prepare_nfsroot(self.config.NFSROOT)
            if self.config.KERNEL:
                board.flash_linux(self.config.KERNEL)
            # Boot from U-Boot to Linux
            board.boot_linux(rootfs=rootfs, bootargs=self.config.bootargs)
        if hasattr(board, "pre_boot_linux"):
            board.pre_boot_linux(wan=wan, lan=lan)
        board.linux_booted = True
        board.wait_for_linux()
        if self.config.META_BUILD and board.flash_meta_booted:
            board.flash_meta(self.config.META_BUILD, wan, lan)
        linux_booted_seconds_up = board.get_seconds_uptime()
        # Retry setting up wan protocol
        if self.config.setup_device_networking:
            for i in range(2):
                time.sleep(10)
                try:
                    if "pppoe" in self.config.WAN_PROTO:
                        wan.turn_on_pppoe()
                    board.config_wan_proto(self.config.WAN_PROTO)
                    break
                except:
                    print("\nFailed to check/set the router's WAN protocol.")
                    pass
            board.wait_for_network()
        board.wait_for_mounts()

        # Give other daemons time to boot and settle
        if self.config.setup_device_networking:
            for i in range(5):
                board.get_seconds_uptime()
                time.sleep(5)

        try:
            board.sendline("passwd")
            board.expect("password:"******"password")
            board.expect("password:"******"password")
            board.expect(prompt)
        except:
            print("WARNING: Unable to set root password on router.")

        board.sendline('cat /proc/cmdline')
        board.expect(prompt)
        board.sendline('uname -a')
        board.expect(prompt)

        # we can't have random messsages messages
        board.set_printk()

        if hasattr(self.config, 'INSTALL_PKGS') and self.config.INSTALL_PKGS != "":
            for pkg in self.config.INSTALL_PKGS.split(' '):
                if len(pkg) > 0:
                    board.install_package(pkg)

        # TODO: we should do some of this for other types of provisioners
        # TODO: this should probably move into a DEVICE specific helper function
        # so all the correct logic can be encoded there
        if prov is not None and 'debian-isc-provisioner' in prov.model:
            start_time = time.time()
            time_for_provisioning = 120

            wan_ipv4 = False
            wan_ipv6 = False
            erouter_ipv4 = False
            erouter_ipv6 = False
            mta_ipv4 = False
            mta_ipv6 = False # Never possible on any boards?

            cm_configmode = board.cm_cfg.cm_configmode

            if cm_configmode == 'bridge':
                # TODO
                pass
            if cm_configmode == 'ipv4':
                wan_ipv4 = erouter_ipv4 = True
                # TODO: this fails if we have dhcp6 running, why?
                #mta_ipv4 = True # TODO: is this true?
            if cm_configmode == 'dslite':
                # TODO
                pass
            if cm_configmode == 'dual-stack':
                wan_ipv4 = erouter_ipv4 = True
                wan_ipv6 = erouter_ipv6 = True
                # TODO: mta does not come up in this mode now, to b e fixed
            # TODO: no ipv6 only TLV?!?

            while (time.time() - start_time < time_for_provisioning):
                try:
                    if wan_ipv4:
                        valid_ipv4(board.get_interface_ipaddr(board.wan_iface))
                    if wan_ipv6:
                        valid_ipv6(board.get_interface_ip6addr(board.wan_iface))

                    if hasattr(board, 'erouter_iface'):
                        if erouter_ipv4:
                            valid_ipv4(board.get_interface_ipaddr(board.erouter_iface))
                        if erouter_ipv6:
                            valid_ipv6(board.get_interface_ip6addr(board.erouter_iface))

                    if hasattr(board, 'mta_iface'):
                        if mta_ipv4:
                            valid_ipv4(board.get_interface_ipaddr(board.mta_iface))
                        if mta_ipv6:
                            valid_ipv6(board.get_interface_ip6addr(board.mta_iface))

                    # if we get this far, we have all IPs and can exit while loop
                    break
                except KeyboardInterrupt:
                    raise
                except:
                    if time.time() - start_time < time_for_provisioning:
                        raise

        # Try to verify router has stayed up (and, say, not suddenly rebooted)
        end_seconds_up = board.get_seconds_uptime()
        print("\nThe router has been up %s seconds." % end_seconds_up)
        if self.config.setup_device_networking:
            assert end_seconds_up > linux_booted_seconds_up

        self.logged['boot_time'] = end_seconds_up

        if board.routing and lan and self.config.setup_device_networking:
            if wan is not None:
                lan.start_lan_client(wan_gw=wan.gw)
            else:
                lan.start_lan_client()
Example #21
0
 def forward_ip(self):
     return board.get_interface_ipaddr(board.lan_iface)
Example #22
0
    def runTest(self):
        if 'cdrouter_server' in self.config.board:
            self.cdrouter_server = self.config.board['cdrouter_server']
        elif self.config.cdrouter_server is not None:
            self.cdrouter_server = self.config.cdrouter_server

        if 'cdrouter_wan_iface' in self.config.board:
            self.cdrouter_wan_iface = self.config.board['cdrouter_wan_iface']
        else:
            self.cdrouter_wan_iface = self.config.cdrouter_wan_iface

        if 'cdrouter_lan_iface' in self.config.board:
            self.cdrouter_lan_iface = self.config.board['cdrouter_lan_iface']
        else:
            self.cdrouter_lan_iface = self.config.cdrouter_lan_iface

        if self.tests is None:
            self.skipTest("No tests defined!")

        if self.cdrouter_server is None:
            self.skipTest("No cdrouter server specified")

        lan.sendline('ifconfig %s down' % lan.iface_dut)
        lan.expect(prompt)

        if not board.has_cmts:
            wan.sendline('ifconfig %s down' % wan.iface_dut)
            wan.expect(prompt)

        c = CDRouter(self.cdrouter_server)

        try:
            board.sendcontrol('c')
            board.expect(prompt)
            board.sendline('reboot')
            board.expect('reboot: Restarting system')
        except:
            board.reset()
        board.wait_for_linux()
        board.wait_for_network()

        # Add extra board specific delay
        board.expect(pexpect.TIMEOUT,
                     timeout=getattr(board, 'cdrouter_bootdelay', 0))

        # If alt mac addr is specified in config, use that..
        # CMTS = we route so no wan mac is used
        # if we route, we need to add routes
        wandutmac = None
        if board.has_cmts and wan.wan_cmts_provisioner:
            # TODO: there are more missing ones CDrouter expects
            wan.sendline('ip route add 200.0.0.0/8 via 192.168.3.2')
            wan.expect(prompt)
        elif not wan.static_ip:
            for device in self.config.board['devices']:
                if device['name'] == 'wan':
                    if 'alt_macaddr' in device:
                        wandutmac = device['alt_macaddr']
                    break

            # Otherwise grab this from the device interface
            if wandutmac is None:
                board.sendline('ifconfig %s' % board.wan_iface)
                board.expect('([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})')
                wandutmac = board.match.group()
                board.expect(prompt)

            print("Using %s for WAN mac address" % wandutmac)

        lan.vlan = wan.vlan = 0
        for device in self.config.board['devices']:
            d = None
            if device['name'] == 'wan':
                d = wan
            elif device['name'] == 'lan':
                d = lan
            else:
                continue

            if d is not None:
                d.vlan = getattr(device, 'vlan', 0)
            if d.vlan == 0:
                d.sendline('cat /proc/net/vlan/config')
                d.expect_exact('cat /proc/net/vlan/config')
                if 0 == d.expect(
                    [pexpect.TIMEOUT,
                     '%s.*\|\s([0-9]+).*\|' % d.iface_dut],
                        timeout=5):
                    d.vlan = 0
                else:
                    d.vlan = d.match.group(1)
                d.expect(prompt)

        print("Using %s for WAN vlan" % wan.vlan)
        print("Using %s for LAN vlan" % lan.vlan)

        # TODO: move wan and lan interface to bft config?
        contents = """
testvar wanInterface """ + self.cdrouter_wan_iface
        if wandutmac is not None:
            contents = contents + """
testvar wanDutMac """ + wandutmac

        if wan.vlan != 0:
            contents = contents + """
testvar wanVlanId """ + wan.vlan

        contents = contents + """
testvar lanInterface """ + self.cdrouter_lan_iface

        if lan.vlan != 0:
            contents = contents + """
testvar lanVlanId """ + lan.vlan

        def add_cdrouter_config(config):
            cdr_conf = None

            # TODO: make a generic helper to search path and overlays
            if os.path.isfile(config):
                cdr_conf = open(config, 'r').readlines()
            elif 'BFT_OVERLAY' in os.environ:
                for p in os.environ['BFT_OVERLAY'].split(' '):
                    p = os.path.realpath(p)
                    try:
                        cdr_conf = open(os.path.join(p, config),
                                        'r').readlines()
                    except:
                        continue
                    else:
                        break

            return "\n" + "".join(cdr_conf)

        # Take config from overall config, but fallback to board config
        if self.config.cdrouter_config is not None:
            contents = contents + add_cdrouter_config(
                self.config.cdrouter_config)
        elif board.cdrouter_config is not None:
            contents = contents + add_cdrouter_config(board.cdrouter_config)

        if self.extra_config:
            contents = contents + "\n" + self.extra_config.replace(',', '\n')

        if board.has_cmts:
            for i in range(5):
                try:
                    wan_ip = board.get_interface_ipaddr(board.erouter_iface)
                except:
                    board.expect(pexpect.TIMEOUT, timeout=15)
                    continue
                else:
                    if i == 4:
                        raise Exception("Failed to get erouter ip address")
                    break

            # TODO: mask from config? wanNatIp vs. wanIspAssignGateway?
            contents=contents + """
testvar wanMode static
testvar wanIspIp %s
testvar wanIspGateway %s
testvar wanIspMask 255.255.255.0
testvar wanIspAssignIp %s
testvar wanNatIp %s
testvar IPv4HopCount %s
testvar lanDnsServer %s
testvar wanDnsServer %s""" % (self.config.board['cdrouter_wanispip'], \
                              self.config.board['cdrouter_wanispgateway'], \
                              wan_ip, wan_ip, \
                              self.config.board['cdrouter_ipv4hopcount'], \
                              board.get_dns_server(), \
                              board.get_dns_server_upstream())

        print("Using below for config:")
        print(contents)
        print("#######################")

        config_name = "bft-automated-job-%s" % str(time.time()).replace(
            '.', '')
        cfg = c.configs.create(Config(name=config_name, contents=contents))

        p = c.packages.create(
            Package(name=config_name, testlist=self.tests, config_id=cfg.id))

        self.start_time = time.time()
        j = c.jobs.launch(Job(package_id=p.id))

        while j.result_id is None:
            if (time.time() - self.start_time) > 300:
                # delete job if it fails to start
                c.jobs.delete(j.id)
                raise Exception("Failed to start CDrouter job")

            board.expect(pexpect.TIMEOUT, timeout=1)
            j = c.jobs.get(j.id)

        print('Job Result-ID: {0}'.format(j.result_id))

        self.job_id = j.result_id
        self.results = c.results
        unpaused = False
        end_of_start = False
        no_more_pausing = False
        while True:
            r = c.results.get(j.result_id)
            print(r.status)

            # we are ready to go from boardfarm reset above
            if r.status == "paused" and unpaused == False:
                c.results.unpause(j.result_id)
                unpaused = True
                board.expect(pexpect.TIMEOUT, timeout=1)
                c.results.pause(j.result_id, when="end-of-test")
                end_of_start = True
                continue

            if r.status == "paused" and end_of_start == True:
                end_of_start = False
                # TODO: do we need this anymore? we have board specific cdrouter_bootdelay
                board.expect(pexpect.TIMEOUT, timeout=60)
                c.results.unpause(j.result_id)
                board.expect(pexpect.TIMEOUT, timeout=1)
                no_more_pausing = True
                continue

            if no_more_pausing and r.status == "paused":
                print("Error: test is still paused")
                c.results.stop(j.result_id)
                break

            if r.status != "running" and r.status != "paused":
                break

            board.expect(pexpect.TIMEOUT, timeout=5)

        print(r.result)
        self.result_message = r.result.encode('ascii', 'ignore')
        # TODO: results URL?
        elapsed_time = time.time() - self.start_time
        print("Test took %s" %
              time.strftime("%H:%M:%S", time.gmtime(elapsed_time)))

        summary = c.results.summary_stats(j.result_id)

        self.result_message += " (Failed= %s, Passed = %s, Skipped = %s)" \
                % (summary.result_breakdown.failed, \
                   summary.result_breakdown.passed, \
                   summary.result_breakdown.skipped)

        for test in summary.test_summaries:
            self.logged[test.name] = vars(test)

            if str(test.name) not in ["start", "final"]:
                from lib.common import TestResult
                try:
                    grade_map = {
                        "pass": "******",
                        "fail": "FAIL",
                        "skip": "SKIP"
                    }[test.result]
                    tr = TestResult(test.name, grade_map, test.description)
                    if test.started is not None:
                        tr.start_time = test.started
                        tr.stop_time = test.started + test.duration
                    else:
                        tr.elapsed_time = test.duration
                    self.subtests.append(tr)
                except:
                    continue

            # TODO: handle skipped tests

            try:
                metric = c.results.get(result_id, test.name, "bandwidth")
                print(vars(metric))
                # TODO: decide how to export data to kibana
            except:
                # Not all tests have this metric, no other way?
                pass

        assert (r.result == "The package completed successfully")

        self.recover()
    def runTest(self):
        super(WlanAssociate, self).runTest()
        wlan_iface = wifi_interface(board)
        if wlan_iface is None:
            self.skipTest("No wifi interfaces detected, skipping..")
        if wlan is None:
            self.skipTest("No wlan VM, skipping test..")

        #Determine if we are using a beeliner x86 host. If not, default to usb drivers.
        #Would like to push this out to a library.
        wlan.sendline('lspci |grep -q Atheros; echo $?')
        wlan.expect('(\d+)\r\n')
        check_atheros = int(wlan.match.group(1))

        if check_atheros is not 0:
            print("Creating realtek interface.")
            wlan.sendline('\napt-get install -qy firmware-realtek')
            wlan.expect('Reading package')
            wlan.expect(prompt)
            wlan.sendline('rmmod rtl8192cu 8812au')
            wlan.expect(prompt)
            wlan.sendline('modprobe rtl8192cu')
            wlan.expect(prompt)
            wlan.sendline('modprobe 8812au')
            wlan.expect(prompt)
        else:
            #Check if modules are alerady loaded. If not, load them.
            print("Found Atheros hardware, creating interface.")
            wlan.sendline('lsmod |grep -q ath_hal; echo $?')
            wlan.expect('(\d+)\r\n')
            check_loaded = int(wlan.match.group(1))

            if check_loaded is not 0:
                #rc.wlan takes care of insmod, wlanconfig creates wlan0. Both should be in the path.
                wlan.sendline('rc.wlan up')
                wlan.expect(prompt)
                wlan.sendline(
                    'wlanconfig wlan0 create wlandev wifi0 wlanmode sta')
                wlan.expect(prompt)

        wlan.sendline('rfkill unblock all')
        wlan.expect(prompt)

        wlan.sendline('ifconfig wlan0')
        wlan.expect('HWaddr')
        wlan.expect(prompt)

        wlan.sendline('ifconfig wlan0 down')
        wlan.expect(prompt)

        wlan.sendline('ifconfig wlan0 up')
        wlan.expect(prompt)

        # wait until the wifi can see the SSID before even trying to join
        # not sure how long we should really give this, or who's fault it is
        for i in range(0, 20):
            try:
                wlan.sendline('iwlist wlan0 scan | grep ESSID:')
                wlan.expect(self.config.ssid)
                wlan.expect(prompt)
            except:
                lib.common.test_msg(
                    "can't see ssid %s, scanning again (%s tries)" %
                    (self.config.ssid, i))
            else:
                break

        time.sleep(10)

        for i in range(0, 2):
            try:
                wlan.sendline('iwconfig wlan0 essid %s' % self.config.ssid)
                wlan.expect(prompt)

                # give it some time to associate
                time.sleep(20)

                # make sure we assocaited
                wlan.sendline('iwconfig wlan0')
                wlan.expect('Access Point: ([0-9A-F]{2}[:-]){5}([0-9A-F]{2})')
                wlan.expect(prompt)
            except:
                lib.common.test_msg(
                    "Can't associate with ssid %s, trying again (%s tries) " %
                    (self.config.ssid, i))
            else:
                break

        # get ip on wlan
        wlan.sendline('killall dhclient')
        wlan.expect(prompt)
        time.sleep(10)
        wlan.sendline('dhclient wlan0')
        wlan.expect(prompt)

        # for reference
        wlan.sendline('ifconfig wlan0')
        wlan.expect(prompt)

        # make sure dhcp worked, and for reference of IP
        wlan_ip = wlan.get_interface_ipaddr("wlan0")

        # add route to wan
        wlan.sendline('ip route add 192.168.0.0/24 via %s' %
                      board.get_interface_ipaddr(board.lan_iface))
        wlan.expect(prompt)
        wlan.sendline('ip route show')
        wlan.expect(prompt)

        wlan.sendline('ping %s -c3' %
                      board.get_interface_ipaddr(board.lan_iface))
        wlan.expect('3 packets transmitted')
        wlan.expect(prompt)
        wlan.sendline('curl %s --connect-timeout 5 > /dev/null 2>&1; echo $?' %
                      board.get_interface_ipaddr(board.lan_iface))
        wlan.expect('(\d+)\r\n')
        curl_success = int(wlan.match.group(1))

        msg = "Attempt to curl router returns %s\n" % (curl_success)
        lib.common.test_msg(msg)
        assert (curl_success == 0)
Example #24
0
    def boot(self, reflash=True):
        # start tftpd server on appropriate device
        tftp_servers = [
            x['name'] for x in self.config.board['devices']
            if 'tftpd-server' in x.get('options', "")
        ]
        tftp_device = None
        # start all tftp servers for now
        for tftp_server in tftp_servers:
            tftp_device = getattr(self.config, tftp_server)

        dhcp_started = False

        # start dhcp servers
        for device in self.config.board['devices']:
            if 'options' in device and 'dhcp-server' in device['options']:
                getattr(self.config, device['name']).setup_dhcp_server()
                dhcp_started = True

        if not wan and len(tftp_servers) == 0:
            msg = 'No WAN Device or tftp_server defined, skipping flash.'
            lib.common.test_msg(msg)
            self.skipTest(msg)

        # This still needs some clean up, the fall back is to assuming the
        # WAN provides the tftpd server, but it's not always the case
        if wan:
            wan.configure(kind="wan_device", config=self.config.board)
            if tftp_device is None:
                tftp_device = wan

        if wan and not dhcp_started:
            wan.setup_dhcp_server()

        tftp_device.start_tftp_server()

        prov = getattr(self.config, 'provisioner', None)
        if prov is not None:
            prov.tftp_device = tftp_device
            prov.provision_board(self.config.board)

            if hasattr(prov, 'prov_gateway'):
                gw = prov.prov_gateway if wan.gw in prov.prov_network else prov.prov_ip

                for nw in [prov.cm_network, prov.mta_network]:
                    wan.sendline('ip route add %s via %s' % (nw, gw))
                    wan.expect(prompt)

            wan.sendline('ip route')
            wan.expect(prompt)

        if lan:
            lan.configure(kind="lan_device")

        # tftp_device is always None, so we can set it from config
        board.tftp_server = tftp_device.ipaddr
        # then these are just hard coded defaults
        board.tftp_port = 22
        # but are user/password used for tftp, they are likely legacy and just need to go away
        board.tftp_username = "******"
        board.tftp_password = "******"

        board.reset()
        rootfs = None

        # Reflash only if at least one or more of these
        # variables are set, or else there is nothing to do in u-boot
        meta_interrupt = False
        if self.config.META_BUILD and not board.flash_meta_booted:
            meta_interrupt = True
        if reflash and (meta_interrupt or self.config.ROOTFS or\
                            self.config.KERNEL or self.config.UBOOT):
            # Break into U-Boot, set environment variables
            board.wait_for_boot()
            board.setup_uboot_network(tftp_device.gw)
            if self.config.META_BUILD:
                for attempt in range(3):
                    try:
                        board.flash_meta(self.config.META_BUILD, wan, lan)
                        break
                    except Exception as e:
                        print(e)
                        tftp_device.restart_tftp_server()
                        board.reset(break_into_uboot=True)
                        board.setup_uboot_network(tftp_device.gw)
                else:
                    raise Exception('Error during flashing...')
            if self.config.UBOOT:
                board.flash_uboot(self.config.UBOOT)
            if self.config.ROOTFS:
                # save filename for cases where we didn't flash it
                # but will use it later to load from memory
                rootfs = board.flash_rootfs(self.config.ROOTFS)
            if self.config.NFSROOT:
                board.prepare_nfsroot(self.config.NFSROOT)
            if self.config.KERNEL:
                board.flash_linux(self.config.KERNEL)
            # Boot from U-Boot to Linux
            board.boot_linux(rootfs=rootfs, bootargs=self.config.bootargs)
        if hasattr(board, "pre_boot_linux"):
            board.pre_boot_linux(wan=wan, lan=lan)
        board.linux_booted = True
        board.wait_for_linux()
        if self.config.META_BUILD and board.flash_meta_booted:
            board.flash_meta(self.config.META_BUILD, wan, lan)
        linux_booted_seconds_up = board.get_seconds_uptime()
        # Retry setting up wan protocol
        if self.config.setup_device_networking:
            for i in range(2):
                time.sleep(10)
                try:
                    if "pppoe" in self.config.WAN_PROTO:
                        wan.turn_on_pppoe()
                    board.config_wan_proto(self.config.WAN_PROTO)
                    break
                except:
                    print("\nFailed to check/set the router's WAN protocol.")
                    pass
            board.wait_for_network()
        board.wait_for_mounts()

        if prov is not None and 'debian' in prov.model:
            table = self.config.board['station']
            idx = wan.port  # TODO: how to do this right...?

            for not_used in range(5):
                try:
                    ips = [board.get_interface_ipaddr(board.wan_iface)]
                    if hasattr(board, 'erouter_iface'):
                        ips += [
                            board.get_interface_ipaddr(board.erouter_iface)
                        ]
                    if hasattr(board, 'mta_iface'):
                        ips += [board.get_interface_ipaddr(board.mta_iface)]
                    break
                except:
                    continue

            # TODO: don't hard code 300 or mv1-1
            prov.sendline('sed /^%s/d -i /etc/iproute2/rt_tables' % idx)
            prov.expect(prompt)
            prov.sendline('echo "%s     %s" >> /etc/iproute2/rt_tables' %
                          (idx, table))
            prov.expect(prompt)

            for ip in ips:
                prov.sendline('ip rule del from %s' % ip)
                prov.expect(prompt)
                prov.sendline('ip rule add from %s lookup %s' % (ip, table))
                prov.expect(prompt)

            wan_ip = wan.get_interface_ipaddr(wan.iface_dut)
            prov.sendline('ip route add default via %s dev eth1 table %s' %
                          (wan_ip, table))
            prov.expect(prompt)

        if self.config.setup_device_networking:
            # Router mac addresses are likely to change, so flush arp
            if lan:
                lan.ip_neigh_flush()
            if wan:
                wan.ip_neigh_flush()

            # Clear default routes perhaps left over from prior use
            if lan:
                lan.sendline('\nip -6 route del default')
                lan.expect(prompt)
            if wan:
                wan.sendline('\nip -6 route del default')
                wan.expect(prompt)

        # Give other daemons time to boot and settle
        if self.config.setup_device_networking:
            for i in range(5):
                board.get_seconds_uptime()
                time.sleep(5)

        try:
            board.sendline("passwd")
            board.expect("password:"******"password")
            board.expect("password:"******"password")
            board.expect(prompt)
        except:
            print("WARNING: Unable to set root password on router.")

        board.sendline('cat /proc/cmdline')
        board.expect(prompt)
        board.sendline('uname -a')
        board.expect(prompt)

        # we can't have random messsages messages
        board.sendline("echo \"1 1 1 7\" > /proc/sys/kernel/printk")
        board.expect(prompt)

        if hasattr(self.config,
                   'INSTALL_PKGS') and self.config.INSTALL_PKGS != "":
            for pkg in self.config.INSTALL_PKGS.split(' '):
                if len(pkg) > 0:
                    board.install_package(pkg)

        # Try to verify router has stayed up (and, say, not suddenly rebooted)
        end_seconds_up = board.get_seconds_uptime()
        print("\nThe router has been up %s seconds." % end_seconds_up)
        if self.config.setup_device_networking:
            assert end_seconds_up > linux_booted_seconds_up

        self.logged['boot_time'] = end_seconds_up

        if board.routing and lan and self.config.setup_device_networking:
            if wan is not None:
                lan.start_lan_client(wan_gw=wan.gw)
            else:
                lan.start_lan_client()
Example #25
0
    def runTest(self):
        super(WlanAssociate, self).runTest()
        wlan_iface = wifi_interface(board)
        if wlan_iface is None:
            self.skipTest("No wifi interfaces detected, skipping..")
        if wlan is None:
            self.skipTest("No wlan VM, skipping test..")

        #Determine if we are using a beeliner x86 host. If not, default to usb drivers.
        #Would like to push this out to a library.
        wlan.sendline('lspci |grep -q Atheros; echo $?')
        wlan.expect('(\d+)\r\n')
        check_atheros = int(wlan.match.group(1))

        if check_atheros is not 0:
            print("Creating realtek interface.")
            wlan.sendline('\napt-get install -qy firmware-realtek')
            wlan.expect('Reading package')
            wlan.expect(prompt)
            wlan.sendline('rmmod rtl8192cu 8812au')
            wlan.expect(prompt)
            wlan.sendline('modprobe rtl8192cu')
            wlan.expect(prompt)
            wlan.sendline('modprobe 8812au')
            wlan.expect(prompt)
        else:
            #Check if modules are alerady loaded. If not, load them.
            print("Found Atheros hardware, creating interface.")
            wlan.sendline('lsmod |grep -q ath_hal; echo $?')
            wlan.expect('(\d+)\r\n')
            check_loaded = int(wlan.match.group(1))

            if check_loaded is not 0:
                #rc.wlan takes care of insmod, wlanconfig creates wlan0. Both should be in the path.
                wlan.sendline('rc.wlan up')
                wlan.expect(prompt)
                wlan.sendline('wlanconfig wlan0 create wlandev wifi0 wlanmode sta')
                wlan.expect(prompt)

        wlan.sendline('rfkill unblock all')
        wlan.expect(prompt)

        wlan.sendline('ifconfig wlan0')
        wlan.expect('HWaddr')
        wlan.expect(prompt)

        wlan.sendline('ifconfig wlan0 down')
        wlan.expect(prompt)

        wlan.sendline('ifconfig wlan0 up')
        wlan.expect(prompt)

        # wait until the wifi can see the SSID before even trying to join
        # not sure how long we should really give this, or who's fault it is
        for i in range(0, 20):
            try:
                wlan.sendline('iwlist wlan0 scan | grep ESSID:')
                wlan.expect(self.config.ssid)
                wlan.expect(prompt)
            except:
                lib.common.test_msg("can't see ssid %s, scanning again (%s tries)" % (self.config.ssid, i))
            else:
                break

        time.sleep(10)

        for i in range(0, 2):
            try:
                wlan.sendline('iwconfig wlan0 essid %s' % self.config.ssid)
                wlan.expect(prompt)

                # give it some time to associate
                time.sleep(20)

                # make sure we assocaited
                wlan.sendline('iwconfig wlan0')
                wlan.expect('Access Point: ([0-9A-F]{2}[:-]){5}([0-9A-F]{2})')
                wlan.expect(prompt)
            except:
                lib.common.test_msg("Can't associate with ssid %s, trying again (%s tries) " % (self.config.ssid, i))
            else:
                break

        # get ip on wlan
        wlan.sendline('killall dhclient')
        wlan.expect(prompt)
        time.sleep(10)
        wlan.sendline('dhclient wlan0')
        wlan.expect(prompt)

        # for reference
        wlan.sendline('ifconfig wlan0')
        wlan.expect(prompt)

        # make sure dhcp worked, and for reference of IP
        wlan_ip = wlan.get_interface_ipaddr("wlan0")

        # add route to wan
        wlan.sendline('ip route add 192.168.0.0/24 via %s' % board.get_interface_ipaddr(board.lan_iface))
        wlan.expect(prompt)
        wlan.sendline('ip route show')
        wlan.expect(prompt)

        wlan.sendline('ping %s -c3' % board.get_interface_ipaddr(board.lan_iface))
        wlan.expect('3 packets transmitted')
        wlan.expect(prompt)
        wlan.sendline('curl %s --connect-timeout 5 > /dev/null 2>&1; echo $?' % board.get_interface_ipaddr(board.lan_iface))
        wlan.expect('(\d+)\r\n')
        curl_success = int(wlan.match.group(1))

        msg = "Attempt to curl router returns %s\n" % (curl_success)
        lib.common.test_msg(msg)
        assert (curl_success == 0)
Example #26
0
 def forward_ip(self):
     return board.get_interface_ipaddr(board.lan_iface)