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 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")
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 ""
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 ""
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
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)
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
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
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
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(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")
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)
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)
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()
def forward_ip(self): return board.get_interface_ipaddr(board.lan_iface)
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)
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()
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)