diff options
Diffstat (limited to 'wintest/test-s4-howto.py')
-rwxr-xr-x | wintest/test-s4-howto.py | 258 |
1 files changed, 13 insertions, 245 deletions
diff --git a/wintest/test-s4-howto.py b/wintest/test-s4-howto.py index e97963f8f3..f198594541 100755 --- a/wintest/test-s4-howto.py +++ b/wintest/test-s4-howto.py @@ -5,16 +5,6 @@ import sys, os import wintest, pexpect, time, subprocess -def check_prerequesites(t): - t.info("Checking prerequesites") - t.setvar('HOSTNAME', t.cmd_output("hostname -s").strip()) - if os.getuid() != 0: - raise Exception("You must run this script as root") - t.run_cmd('ifconfig ${INTERFACE} ${INTERFACE_NET} up') - if t.getvar('INTERFACE_IPV6'): - t.run_cmd('ifconfig ${INTERFACE} inet6 del ${INTERFACE_IPV6}/64', checkfail=False) - t.run_cmd('ifconfig ${INTERFACE} inet6 add ${INTERFACE_IPV6}/64 up') - def build_s4(t): '''build samba4''' t.info('Building s4') @@ -60,13 +50,6 @@ def start_s4(t): '--option', 'panic action=gnome-terminal -e "gdb --pid %PID%"']) t.port_wait("${INTERFACE_IP}", 139) -def stop_vms(t): - '''Shut down any existing alive VMs, so they do not collide with what we are doing''' - t.info('Shutting down any of our VMs already running') - vms = t.get_vms() - for v in vms: - t.vm_poweroff(v, checkfail=False) - def test_smbclient(t): '''test smbclient''' t.info('Testing smbclient') @@ -102,170 +85,6 @@ def create_shares(t): t.run_cmd("mkdir -p var/profiles") -def set_nameserver(t, nameserver): - '''set the nameserver in resolv.conf''' - t.write_file("/etc/resolv.conf.wintest", ''' -# Generated by wintest, the Samba v Windows automated testing system -nameserver %s - -# your original resolv.conf appears below: -''' % t.substitute(nameserver)) - child = t.pexpect_spawn("cat /etc/resolv.conf", crlf=False) - i = child.expect(['your original resolv.conf appears below:', pexpect.EOF]) - if i == 0: - child.expect(pexpect.EOF) - contents = child.before.lstrip().replace('\r', '') - t.write_file('/etc/resolv.conf.wintest', contents, mode='a') - t.write_file('/etc/resolv.conf.wintest-bak', contents) - t.run_cmd("mv -f /etc/resolv.conf.wintest /etc/resolv.conf") - t.resolv_conf_backup = '/etc/resolv.conf.wintest-bak'; - - -def restore_resolv_conf(t): - '''restore the /etc/resolv.conf after testing is complete''' - if getattr(t, 'resolv_conf_backup', False): - t.info("restoring /etc/resolv.conf") - t.run_cmd("mv -f %s /etc/resolv.conf" % t.resolv_conf_backup) - - -def rndc_cmd(t, cmd, checkfail=True): - '''run a rndc command''' - t.run_cmd("${RNDC} -c ${PREFIX}/etc/rndc.conf %s" % cmd, checkfail=checkfail) - -def named_supports_gssapi_keytab(t): - '''see if named supports tkey-gssapi-keytab''' - t.write_file("${PREFIX}/named.conf.test", - 'options { tkey-gssapi-keytab "test"; };') - try: - t.run_cmd("${NAMED_CHECKCONF} ${PREFIX}/named.conf.test") - except subprocess.CalledProcessError: - return False - return True - - -def configure_bind(t): - t.chdir('${PREFIX}') - - nameserver = t.get_nameserver() - if nameserver == t.getvar('INTERFACE_IP'): - raise RuntimeError("old /etc/resolv.conf must not contain %s as a nameserver, this will create loops with the generated dns configuration" % nameserver) - t.setvar('DNSSERVER', nameserver) - - if t.getvar('INTERFACE_IPV6'): - ipv6_listen = 'listen-on-v6 port 53 { ${INTERFACE_IPV6}; };' - else: - ipv6_listen = '' - t.setvar('BIND_LISTEN_IPV6', ipv6_listen) - - if named_supports_gssapi_keytab(t): - t.setvar("NAMED_TKEY_OPTION", - 'tkey-gssapi-keytab "${PREFIX}/private/dns.keytab";') - else: - t.info("LCREALM=${LCREALM}") - t.setvar("NAMED_TKEY_OPTION", - '''tkey-gssapi-credential "DNS/${LCREALM}"; - tkey-domain "${LCREALM}"; - ''') - t.putenv("KRB5_CONFIG", '${PREFIX}/private/krb5.conf') - t.putenv('KEYTAB_FILE', '${PREFIX}/private/dns.keytab') - t.putenv('KRB5_KTNAME', '${PREFIX}/private/dns.keytab') - - t.write_file("etc/named.conf", ''' -options { - listen-on port 53 { ${INTERFACE_IP}; }; - ${BIND_LISTEN_IPV6} - directory "${PREFIX}/var/named"; - dump-file "${PREFIX}/var/named/data/cache_dump.db"; - pid-file "${PREFIX}/var/named/named.pid"; - statistics-file "${PREFIX}/var/named/data/named_stats.txt"; - memstatistics-file "${PREFIX}/var/named/data/named_mem_stats.txt"; - allow-query { any; }; - recursion yes; - ${NAMED_TKEY_OPTION} - max-cache-ttl 10; - max-ncache-ttl 10; - - forward only; - forwarders { - ${DNSSERVER}; - }; - -}; - -key "rndc-key" { - algorithm hmac-md5; - secret "lA/cTrno03mt5Ju17ybEYw=="; -}; - -controls { - inet ${INTERFACE_IP} port 953 - allow { any; } keys { "rndc-key"; }; -}; - -include "${PREFIX}/private/named.conf"; -''') - - # add forwarding for the windows domains - domains = t.get_domains() - for d in domains: - t.write_file('etc/named.conf', - ''' -zone "%s" IN { - type forward; - forward only; - forwarders { - %s; - }; -}; -''' % (d, domains[d]), - mode='a') - - - t.write_file("etc/rndc.conf", ''' -# Start of rndc.conf -key "rndc-key" { - algorithm hmac-md5; - secret "lA/cTrno03mt5Ju17ybEYw=="; -}; - -options { - default-key "rndc-key"; - default-server ${INTERFACE_IP}; - default-port 953; -}; -''') - - set_nameserver(t, t.getvar('INTERFACE_IP')) - - -def stop_bind(t): - '''Stop our private BIND from listening and operating''' - rndc_cmd(t, "stop", checkfail=False) - t.port_wait("${INTERFACE_IP}", 53, wait_for_fail=True) - - t.run_cmd("rm -rf var/named") - - -def start_bind(t): - '''restart the test environment version of bind''' - t.info("Restarting bind9") - t.chdir('${PREFIX}') - - set_nameserver(t, t.getvar('INTERFACE_IP')) - - t.run_cmd("mkdir -p var/named/data") - t.run_cmd("chown -R ${BIND_USER} var/named") - - t.bind_child = t.run_child("${BIND9} -u ${BIND_USER} -n 1 -c ${PREFIX}/etc/named.conf -g") - - t.port_wait("${INTERFACE_IP}", 53) - rndc_cmd(t, "flush") - -def restart_bind(t): - configure_bind(t) - stop_bind(t) - start_bind(t) - def test_dns(t): '''test that DNS is OK''' t.info("Testing DNS") @@ -289,7 +108,7 @@ def test_dyndns(t): '''test that dynamic DNS is working''' t.chdir('${PREFIX}') t.run_cmd("sbin/samba_dnsupdate --fail-immediately") - rndc_cmd(t, "flush") + t.rndc_cmd("flush") def run_winjoin(t, vm): @@ -574,7 +393,7 @@ def prep_join_as_dc(t, vm): t.run_cmd('killall -9 -q samba smbd nmbd winbindd', checkfail=False) t.vm_poweroff("${WIN_VM}", checkfail=False) t.vm_restore("${WIN_VM}", "${WIN_SNAPSHOT}") - rndc_cmd(t, 'flush') + t.rndc_cmd('flush') t.run_cmd("rm -rf etc/smb.conf private") child = t.open_telnet("${WIN_HOSTNAME}", "${WIN_DOMAIN}\\administrator", "${WIN_PASS}", set_time=True) t.get_ipconfig(child) @@ -722,71 +541,20 @@ def test_join_as_rodc(t, vm): t.vm_poweroff("${WIN_VM}") -def run_dcpromo_as_first_dc(t, vm, func_level=None): - t.setwinvars(vm) - t.info("Configuring a windows VM ${WIN_VM} at the first DC in the domain using dcpromo") - child = t.open_telnet("${WIN_HOSTNAME}", "administrator", "${WIN_PASS}", set_time=True) - if t.get_is_dc(child): - return - - if func_level == '2008r2': - t.setvar("FUNCTION_LEVEL_INT", str(4)) - elif func_level == '2003': - t.setvar("FUNCTION_LEVEL_INT", str(1)) - else: - t.setvar("FUNCTION_LEVEL_INT", str(0)) - - child = t.open_telnet("${WIN_HOSTNAME}", "administrator", "${WIN_PASS}", set_ip=True, set_noexpire=True) - - """This server must therefore not yet be a directory server, so we must promote it""" - child.sendline("copy /Y con answers.txt") - child.sendline(''' -[DCInstall] -; New forest promotion -ReplicaOrNewDomain=Domain -NewDomain=Forest -NewDomainDNSName=${WIN_REALM} -ForestLevel=${FUNCTION_LEVEL_INT} -DomainNetbiosName=${WIN_DOMAIN} -DomainLevel=${FUNCTION_LEVEL_INT} -InstallDNS=Yes -ConfirmGc=Yes -CreateDNSDelegation=No -DatabasePath="C:\Windows\NTDS" -LogPath="C:\Windows\NTDS" -SYSVOLPath="C:\Windows\SYSVOL" -; Set SafeModeAdminPassword to the correct value prior to using the unattend file -SafeModeAdminPassword=${WIN_PASS} -; Run-time flags (optional) -RebootOnCompletion=No - -''') - child.expect("copied.") - child.expect("C:") - child.expect("C:") - child.sendline("dcpromo /answer:answers.txt") - i = child.expect(["You must restart this computer", "failed", "Active Directory Domain Services was not installed", "C:"], timeout=120) - if i == 1 or i == 2: - raise Exception("dcpromo failed") - child.sendline("shutdown -r -t 0") - t.port_wait("${WIN_IP}", 139, wait_for_fail=True) - t.port_wait("${WIN_IP}", 139) - - def test_howto(t): '''test the Samba4 howto''' - check_prerequesites(t) + t.check_prerequesites() # we don't need fsync safety in these tests t.putenv('TDB_NO_FSYNC', '1') if not t.skip("configure_bind"): - configure_bind(t) + t.configure_bind(kerberos_support=True, include='${PREFIX}/private/named.conf') if not t.skip("stop_bind"): - stop_bind(t) + t.stop_bind() if not t.skip("stop_vms"): - stop_vms(t) + t.stop_vms() if not t.skip("build"): build_s4(t) @@ -802,9 +570,9 @@ def test_howto(t): if not t.skip("smbclient"): test_smbclient(t) if not t.skip("configure_bind2"): - configure_bind(t) + t.configure_bind(kerberos_support=True, include='${PREFIX}/private/named.conf') if not t.skip("start_bind"): - start_bind(t) + t.start_bind() if not t.skip("dns"): test_dns(t) if not t.skip("kerberos"): @@ -842,7 +610,7 @@ def test_howto(t): create_shares(t) start_s4(t) test_smbclient(t) - restart_bind(t) + t.restart_bind(kerberos_support=True, include='{PREFIX}/private/named.conf') test_dns(t) test_kerberos(t) test_dyndns(t) @@ -851,7 +619,7 @@ def test_howto(t): if t.have_vm('W2K8R2A') and not t.skip("join_w2k8r2"): prep_join_as_dc(t, "W2K8R2A") - run_dcpromo_as_first_dc(t, "W2K8R2A", func_level='2008r2') + t.run_dcpromo_as_first_dc("W2K8R2A", func_level='2008r2') join_as_dc(t, "W2K8R2A") create_shares(t) start_s4(t) @@ -860,7 +628,7 @@ def test_howto(t): if t.have_vm('W2K8R2A') and not t.skip("join_rodc"): prep_join_as_dc(t, "W2K8R2A") - run_dcpromo_as_first_dc(t, "W2K8R2A", func_level='2008r2') + t.run_dcpromo_as_first_dc("W2K8R2A", func_level='2008r2') join_as_rodc(t, "W2K8R2A") create_shares(t) start_s4(t) @@ -869,7 +637,7 @@ def test_howto(t): if t.have_vm('W2K3A') and not t.skip("join_w2k3"): prep_join_as_dc(t, "W2K3A") - run_dcpromo_as_first_dc(t, "W2K3A", func_level='2003') + t.run_dcpromo_as_first_dc("W2K3A", func_level='2003') join_as_dc(t, "W2K3A") create_shares(t) start_s4(t) @@ -882,7 +650,7 @@ def test_howto(t): def test_cleanup(t): '''cleanup after tests''' t.info("Cleaning up ...") - restore_resolv_conf(t) + t.restore_resolv_conf() if getattr(t, 'bind_child', False): t.bind_child.kill() |