1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-04 08:22:08 +03:00

s4-wintest: reliability and usability improvements

- allow for missing VMs
- improved VM names
- added join of w2k3 to Samba domain
- cope with w2k3 dcpromo output
- wait for port 139 not 23, to avoid windows telnet server bug

Autobuild-User: Andrew Tridgell <tridge@samba.org>
Autobuild-Date: Thu Nov 18 23:56:11 CET 2010 on sn-devel-104
This commit is contained in:
Andrew Tridgell
2010-11-18 23:56:22 +11:00
parent 5b3981acb1
commit 58c43f74b9
3 changed files with 170 additions and 120 deletions

View File

@ -26,13 +26,16 @@ def build_s4(t):
t.run_cmd('rm -rf ${PREFIX}') t.run_cmd('rm -rf ${PREFIX}')
t.run_cmd('make -j install') t.run_cmd('make -j install')
def provision_s4(t): def provision_s4(t, func_level="2008", interfaces=None):
'''provision s4 as a DC''' '''provision s4 as a DC'''
t.info('Provisioning s4') t.info('Provisioning s4')
t.chdir('${PREFIX}') t.chdir('${PREFIX}')
t.run_cmd("rm -rf etc private") t.run_cmd("rm -rf etc private")
t.run_cmd("find var -type f | xargs rm -f") t.run_cmd("find var -type f | xargs rm -f")
t.run_cmd('sbin/provision --realm=${LCREALM} --domain=${DOMAIN} --adminpass=${PASSWORD1} --server-role="domain controller" --function-level=2008 -d${DEBUGLEVEL}') options=' --function-level=%s -d${DEBUGLEVEL}' % func_level
if interfaces:
options += ' --option=interfaces=%s' % interfaces
t.run_cmd('sbin/provision --realm=${LCREALM} --domain=${DOMAIN} --adminpass=${PASSWORD1} --server-role="domain controller"' + options)
t.run_cmd('bin/samba-tool newuser testallowed ${PASSWORD1}') t.run_cmd('bin/samba-tool newuser testallowed ${PASSWORD1}')
t.run_cmd('bin/samba-tool newuser testdenied ${PASSWORD1}') t.run_cmd('bin/samba-tool newuser testdenied ${PASSWORD1}')
t.run_cmd('bin/samba-tool group addmembers "Allowed RODC Password Replication Group" testallowed') t.run_cmd('bin/samba-tool group addmembers "Allowed RODC Password Replication Group" testallowed')
@ -44,7 +47,7 @@ def start_s4(t, interfaces=None):
t.run_cmd(['sbin/samba', t.run_cmd(['sbin/samba',
'--option', 'panic action=gnome-terminal -e "gdb --pid %PID%"', '--option', 'panic action=gnome-terminal -e "gdb --pid %PID%"',
'--option', 'interfaces=%s' % interfaces]) '--option', 'interfaces=%s' % interfaces])
t.port_wait("localhost", 445) t.port_wait("localhost", 139)
def test_smbclient(t): def test_smbclient(t):
t.info('Testing smbclient') t.info('Testing smbclient')
@ -120,26 +123,24 @@ def run_winjoin(t, vm):
t.vm_poweroff("${WIN_VM}", checkfail=False) t.vm_poweroff("${WIN_VM}", checkfail=False)
t.vm_restore("${WIN_VM}", "${WIN_SNAPSHOT}") t.vm_restore("${WIN_VM}", "${WIN_SNAPSHOT}")
t.ping_wait("${WIN_HOSTNAME}") t.ping_wait("${WIN_HOSTNAME}")
t.port_wait("${WIN_HOSTNAME}", 23)
child = t.open_telnet("${WIN_HOSTNAME}", "${WIN_USER}", "${WIN_PASS}", set_time=True) child = t.open_telnet("${WIN_HOSTNAME}", "${WIN_USER}", "${WIN_PASS}", set_time=True)
child.sendline("netdom join ${WIN_HOSTNAME} /Domain:${LCREALM} /PasswordD:${PASSWORD1} /UserD:administrator") child.sendline("netdom join ${WIN_HOSTNAME} /Domain:${LCREALM} /PasswordD:${PASSWORD1} /UserD:administrator")
child.expect("The command completed successfully") child.expect("The command completed successfully")
child.sendline("shutdown /r -t 0") child.sendline("shutdown /r -t 0")
t.port_wait("${WIN_HOSTNAME}", 23, wait_for_fail=True) t.port_wait("${WIN_HOSTNAME}", 139, wait_for_fail=True)
t.port_wait("${WIN_HOSTNAME}", 23) t.port_wait("${WIN_HOSTNAME}", 139)
def test_winjoin(t, vm): def test_winjoin(t, vm):
t.setwinvars(vm) t.setwinvars(vm)
t.info("Checking the windows join is OK") t.info("Checking the windows join is OK")
t.chdir('${PREFIX}') t.chdir('${PREFIX}')
t.port_wait("${WIN_HOSTNAME}", 445) t.port_wait("${WIN_HOSTNAME}", 139)
t.retry_cmd('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -Uadministrator@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"]) t.retry_cmd('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -Uadministrator@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"])
t.cmd_contains("host -t A ${WIN_HOSTNAME}.${LCREALM}.", ['has address']) t.cmd_contains("host -t A ${WIN_HOSTNAME}.${LCREALM}.", ['has address'])
t.cmd_contains('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -Utestallowed@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"]) t.cmd_contains('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -Utestallowed@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"])
t.cmd_contains('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -k no -Utestallowed@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"]) t.cmd_contains('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -k no -Utestallowed@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"])
t.cmd_contains('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -k yes -Utestallowed@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"]) t.cmd_contains('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -k yes -Utestallowed@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"])
t.port_wait("${WIN_HOSTNAME}", 23)
child = t.open_telnet("${WIN_HOSTNAME}", "${DOMAIN}\\administrator", "${PASSWORD1}") child = t.open_telnet("${WIN_HOSTNAME}", "${DOMAIN}\\administrator", "${PASSWORD1}")
child.sendline("net use t: \\\\${HOSTNAME}.${LCREALM}\\test") child.sendline("net use t: \\\\${HOSTNAME}.${LCREALM}\\test")
child.expect("The command completed successfully") child.expect("The command completed successfully")
@ -154,11 +155,12 @@ def run_dcpromo(t, vm):
t.vm_poweroff("${WIN_VM}", checkfail=False) t.vm_poweroff("${WIN_VM}", checkfail=False)
t.vm_restore("${WIN_VM}", "${WIN_SNAPSHOT}") t.vm_restore("${WIN_VM}", "${WIN_SNAPSHOT}")
t.ping_wait("${WIN_HOSTNAME}") t.ping_wait("${WIN_HOSTNAME}")
t.port_wait("${WIN_HOSTNAME}", 23)
child = t.open_telnet("${WIN_HOSTNAME}", "administrator", "${WIN_PASS}") child = t.open_telnet("${WIN_HOSTNAME}", "administrator", "${WIN_PASS}")
child.sendline("copy /Y con answers.txt") child.sendline("copy /Y con answers.txt")
child.sendline(''' child.sendline('''
[DCInstall] [DCINSTALL]
RebootOnSuccess=Yes
RebootOnCompletion=Yes
ReplicaOrNewDomain=Replica ReplicaOrNewDomain=Replica
ReplicaDomainDNSName=${LCREALM} ReplicaDomainDNSName=${LCREALM}
SiteName=Default-First-Site-Name SiteName=Default-First-Site-Name
@ -172,28 +174,27 @@ DatabasePath="C:\Windows\NTDS"
LogPath="C:\Windows\NTDS" LogPath="C:\Windows\NTDS"
SYSVOLPath="C:\Windows\SYSVOL" SYSVOLPath="C:\Windows\SYSVOL"
SafeModeAdminPassword=${PASSWORD1} SafeModeAdminPassword=${PASSWORD1}
RebootOnCompletion=No
 
''') ''')
child.expect("copied.") child.expect("copied.")
child.expect("C:")
child.expect("C:")
child.sendline("dcpromo /answer:answers.txt") child.sendline("dcpromo /answer:answers.txt")
i = child.expect(["You must restart this computer", "failed"], timeout=120) i = child.expect(["You must restart this computer", "failed", "C:"], timeout=120)
if i != 0: if i == 1:
raise Exception("dcpromo failed") raise Exception("dcpromo failed")
child.sendline("shutdown -r -t 0") t.port_wait("${WIN_HOSTNAME}", 139, wait_for_fail=True)
t.port_wait("${WIN_HOSTNAME}", 23, wait_for_fail=True) t.port_wait("${WIN_HOSTNAME}", 139)
t.port_wait("${WIN_HOSTNAME}", 23)
def test_dcpromo(t, vm): def test_dcpromo(t, vm):
t.setwinvars(vm) t.setwinvars(vm)
t.info("Checking the dcpromo join is OK") t.info("Checking the dcpromo join is OK")
t.chdir('${PREFIX}') t.chdir('${PREFIX}')
t.port_wait("${WIN_HOSTNAME}", 445) t.port_wait("${WIN_HOSTNAME}", 139)
t.retry_cmd('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -Uadministrator@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"]) t.retry_cmd('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -Uadministrator@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"])
t.cmd_contains("host -t A ${WIN_HOSTNAME}.${LCREALM}.", ['has address']) t.cmd_contains("host -t A ${WIN_HOSTNAME}.${LCREALM}.", ['has address'])
t.cmd_contains('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -Utestallowed@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"]) t.cmd_contains('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -Utestallowed@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"])
t.port_wait("${WIN_HOSTNAME}", 23)
t.cmd_contains("bin/samba-tool drs kcc ${HOSTNAME} -Uadministrator@${LCREALM}%${PASSWORD1}", ['Consistency check', 'successful']) t.cmd_contains("bin/samba-tool drs kcc ${HOSTNAME} -Uadministrator@${LCREALM}%${PASSWORD1}", ['Consistency check', 'successful'])
t.cmd_contains("bin/samba-tool drs kcc ${WIN_HOSTNAME} -Uadministrator@${LCREALM}%${PASSWORD1}", ['Consistency check', 'successful']) t.cmd_contains("bin/samba-tool drs kcc ${WIN_HOSTNAME} -Uadministrator@${LCREALM}%${PASSWORD1}", ['Consistency check', 'successful'])
@ -206,28 +207,38 @@ def test_dcpromo(t, vm):
t.cmd_contains("bin/samba-tool drs showrepl ${HOSTNAME} -k yes", t.cmd_contains("bin/samba-tool drs showrepl ${HOSTNAME} -k yes",
[ "INBOUND NEIGHBORS", [ "INBOUND NEIGHBORS",
"${BASEDN}", "${BASEDN}",
"Last attempt", "was successful", "Last attempt .* was successful",
"CN=Schema,CN=Configuration,${BASEDN}", "CN=Configuration,${BASEDN}",
"Last attempt", "was successful", "Last attempt .* was successful",
"CN=Configuration,${BASEDN}", # cope with either order
"Last attempt .* was successful",
"OUTBOUND NEIGHBORS", "OUTBOUND NEIGHBORS",
"${BASEDN}", "${BASEDN}",
"Last success", "Last success",
"CN=Configuration,${BASEDN}", "CN=Configuration,${BASEDN}",
"Last success",
"CN=Configuration,${BASEDN}",
"Last success"], "Last success"],
ordered=True) ordered=True,
regex=True)
t.cmd_contains("bin/samba-tool drs showrepl ${WIN_HOSTNAME} -k yes", t.cmd_contains("bin/samba-tool drs showrepl ${WIN_HOSTNAME} -k yes",
[ "INBOUND NEIGHBORS", [ "INBOUND NEIGHBORS",
"${BASEDN}", "${BASEDN}",
"Last attempt", "was successful", "Last attempt .* was successful",
"CN=Schema,CN=Configuration,${BASEDN}", "CN=Configuration,${BASEDN}",
"Last attempt", "was successful", "Last attempt .* was successful",
"CN=Configuration,${BASEDN}",
"Last attempt .* was successful",
"OUTBOUND NEIGHBORS", "OUTBOUND NEIGHBORS",
"${BASEDN}", "${BASEDN}",
"Last success", "Last success",
"CN=Schema,CN=Configuration,${BASEDN}", "CN=Configuration,${BASEDN}",
"Last success",
"CN=Configuration,${BASEDN}",
"Last success" ], "Last success" ],
ordered=True) ordered=True,
regex=True)
child = t.open_telnet("${WIN_HOSTNAME}", "${DOMAIN}\\administrator", "${PASSWORD1}", set_time=True) child = t.open_telnet("${WIN_HOSTNAME}", "${DOMAIN}\\administrator", "${PASSWORD1}", set_time=True)
child.sendline("net use t: \\\\${HOSTNAME}.${LCREALM}\\test") child.sendline("net use t: \\\\${HOSTNAME}.${LCREALM}\\test")
@ -279,7 +290,6 @@ def run_dcpromo_rodc(t, vm):
t.vm_poweroff("${WIN_VM}", checkfail=False) t.vm_poweroff("${WIN_VM}", checkfail=False)
t.vm_restore("${WIN_VM}", "${WIN_SNAPSHOT}") t.vm_restore("${WIN_VM}", "${WIN_SNAPSHOT}")
t.ping_wait("${WIN_HOSTNAME}") t.ping_wait("${WIN_HOSTNAME}")
t.port_wait("${WIN_HOSTNAME}", 23)
child = t.open_telnet("${WIN_HOSTNAME}", "administrator", "${WIN_PASS}") child = t.open_telnet("${WIN_HOSTNAME}", "administrator", "${WIN_PASS}")
child.sendline("copy /Y con answers.txt") child.sendline("copy /Y con answers.txt")
child.sendline(''' child.sendline('''
@ -313,8 +323,8 @@ RebootOnCompletion=No
if i != 0: if i != 0:
raise Exception("dcpromo failed") raise Exception("dcpromo failed")
child.sendline("shutdown -r -t 0") child.sendline("shutdown -r -t 0")
t.port_wait("${WIN_HOSTNAME}", 23, wait_for_fail=True) t.port_wait("${WIN_HOSTNAME}", 139, wait_for_fail=True)
t.port_wait("${WIN_HOSTNAME}", 23) t.port_wait("${WIN_HOSTNAME}", 139)
@ -322,11 +332,10 @@ def test_dcpromo_rodc(t, vm):
t.setwinvars(vm) t.setwinvars(vm)
t.info("Checking the w2k8 RODC join is OK") t.info("Checking the w2k8 RODC join is OK")
t.chdir('${PREFIX}') t.chdir('${PREFIX}')
t.port_wait("${WIN_HOSTNAME}", 445) t.port_wait("${WIN_HOSTNAME}", 139)
t.retry_cmd('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -Uadministrator@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"]) t.retry_cmd('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -Uadministrator@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"])
t.cmd_contains("host -t A ${WIN_HOSTNAME}.${LCREALM}.", ['has address']) t.cmd_contains("host -t A ${WIN_HOSTNAME}.${LCREALM}.", ['has address'])
t.cmd_contains('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -Utestallowed@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"]) t.cmd_contains('bin/smbclient -L ${WIN_HOSTNAME}.${LCREALM} -Utestallowed@${LCREALM}%${PASSWORD1}', ["C$", "IPC$", "Sharename"])
t.port_wait("${WIN_HOSTNAME}", 23)
child = t.open_telnet("${WIN_HOSTNAME}", "${DOMAIN}\\administrator", "${PASSWORD1}", set_time=True) child = t.open_telnet("${WIN_HOSTNAME}", "${DOMAIN}\\administrator", "${PASSWORD1}", set_time=True)
child.sendline("net use t: \\\\${HOSTNAME}.${LCREALM}\\test") child.sendline("net use t: \\\\${HOSTNAME}.${LCREALM}\\test")
child.expect("The command completed successfully") child.expect("The command completed successfully")
@ -337,7 +346,7 @@ def test_dcpromo_rodc(t, vm):
child.expect("was successful") child.expect("was successful")
child.expect("CN=Configuration,${BASEDN}") child.expect("CN=Configuration,${BASEDN}")
child.expect("was successful") child.expect("was successful")
child.expect("CN=Schema,CN=Configuration,${BASEDN}") child.expect("CN=Configuration,${BASEDN}")
child.expect("was successful") child.expect("was successful")
t.info("Checking if new users are available on windows") t.info("Checking if new users are available on windows")
@ -370,7 +379,6 @@ def test_join_as_dc(t, vm):
t.chdir('${PREFIX}') t.chdir('${PREFIX}')
t.retry_cmd('bin/smbclient -L ${HOSTNAME}.${WIN_REALM} -Uadministrator@${WIN_REALM}%${WIN_PASS}', ["C$", "IPC$", "Sharename"]) t.retry_cmd('bin/smbclient -L ${HOSTNAME}.${WIN_REALM} -Uadministrator@${WIN_REALM}%${WIN_PASS}', ["C$", "IPC$", "Sharename"])
t.cmd_contains("host -t A ${HOSTNAME}.${WIN_REALM}.", ['has address']) t.cmd_contains("host -t A ${HOSTNAME}.${WIN_REALM}.", ['has address'])
t.port_wait("${WIN_HOSTNAME}", 23)
child = t.open_telnet("${WIN_HOSTNAME}", "${WIN_DOMAIN}\\administrator", "${WIN_PASS}", set_time=True) child = t.open_telnet("${WIN_HOSTNAME}", "${WIN_DOMAIN}\\administrator", "${WIN_PASS}", set_time=True)
t.info("Forcing kcc runs, and replication") t.info("Forcing kcc runs, and replication")
@ -391,7 +399,7 @@ def test_join_as_dc(t, vm):
child.expect("was successful") child.expect("was successful")
child.expect("CN=Configuration,${WIN_BASEDN}") child.expect("CN=Configuration,${WIN_BASEDN}")
child.expect("was successful") child.expect("was successful")
child.expect("CN=Schema,CN=Configuration,${WIN_BASEDN}") child.expect("CN=Configuration,${WIN_BASEDN}")
child.expect("was successful") child.expect("was successful")
t.info("Checking if new users propogate to windows") t.info("Checking if new users propogate to windows")
@ -402,8 +410,8 @@ def test_join_as_dc(t, vm):
t.info("Checking if new users on windows propogate to samba") t.info("Checking if new users on windows propogate to samba")
child.sendline("net user test3 ${PASSWORD3} /add") child.sendline("net user test3 ${PASSWORD3} /add")
child.expect("The command completed successfully") child.expect("The command completed successfully")
t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest2%${PASSWORD2} -k no", ['Sharename', 'IPC']) t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest3%${PASSWORD3} -k no", ['Sharename', 'IPC'])
t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest2%${PASSWORD2} -k yes", ['Sharename', 'IPC']) t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest3%${PASSWORD3} -k yes", ['Sharename', 'IPC'])
t.info("Checking propogation of user deletion") t.info("Checking propogation of user deletion")
t.run_cmd('bin/samba-tool user delete test2 -Uadministrator@${WIN_REALM}%${WIN_PASS}') t.run_cmd('bin/samba-tool user delete test2 -Uadministrator@${WIN_REALM}%${WIN_PASS}')
@ -411,9 +419,9 @@ def test_join_as_dc(t, vm):
child.expect("The command completed successfully") child.expect("The command completed successfully")
t.retry_cmd("bin/smbclient -L ${WIN_HOSTNAME} -Utest2%${PASSWORD2} -k no", ['LOGON_FAILURE']) t.retry_cmd("bin/smbclient -L ${WIN_HOSTNAME} -Utest2%${PASSWORD2} -k no", ['LOGON_FAILURE'])
t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest2%${PASSWORD2} -k no", ['LOGON_FAILURE']) t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest3%${PASSWORD3} -k no", ['LOGON_FAILURE'])
t.retry_cmd("bin/smbclient -L ${WIN_HOSTNAME} -Utest2%${PASSWORD2} -k yes", ['LOGON_FAILURE']) t.retry_cmd("bin/smbclient -L ${WIN_HOSTNAME} -Utest2%${PASSWORD2} -k yes", ['LOGON_FAILURE'])
t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest2%${PASSWORD2} -k yes", ['LOGON_FAILURE']) t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest3%${PASSWORD3} -k yes", ['LOGON_FAILURE'])
t.vm_poweroff("${WIN_VM}") t.vm_poweroff("${WIN_VM}")
@ -438,10 +446,10 @@ def test_join_as_rodc(t, vm):
t.chdir('${PREFIX}') t.chdir('${PREFIX}')
t.retry_cmd('bin/smbclient -L ${HOSTNAME}.${WIN_REALM} -Uadministrator@${WIN_REALM}%${WIN_PASS}', ["C$", "IPC$", "Sharename"]) t.retry_cmd('bin/smbclient -L ${HOSTNAME}.${WIN_REALM} -Uadministrator@${WIN_REALM}%${WIN_PASS}', ["C$", "IPC$", "Sharename"])
t.cmd_contains("host -t A ${HOSTNAME}.${WIN_REALM}.", ['has address']) t.cmd_contains("host -t A ${HOSTNAME}.${WIN_REALM}.", ['has address'])
t.port_wait("${WIN_HOSTNAME}", 23)
child = t.open_telnet("${WIN_HOSTNAME}", "${WIN_DOMAIN}\\administrator", "${WIN_PASS}", set_time=True) child = t.open_telnet("${WIN_HOSTNAME}", "${WIN_DOMAIN}\\administrator", "${WIN_PASS}", set_time=True)
t.info("Forcing kcc runs, and replication") t.info("Forcing kcc runs, and replication")
t.run_cmd('bin/samba-tool drs kcc ${HOSTNAME} -Uadministrator@${WIN_REALM}%${WIN_PASS}')
t.run_cmd('bin/samba-tool drs kcc ${WIN_HOSTNAME} -Uadministrator@${WIN_REALM}%${WIN_PASS}') t.run_cmd('bin/samba-tool drs kcc ${WIN_HOSTNAME} -Uadministrator@${WIN_REALM}%${WIN_PASS}')
t.kinit("administrator@${WIN_REALM}", "${WIN_PASS}") t.kinit("administrator@${WIN_REALM}", "${WIN_PASS}")
@ -453,33 +461,36 @@ def test_join_as_rodc(t, vm):
t.info("Checking if showrepl is happy") t.info("Checking if showrepl is happy")
child.sendline("repadmin /showrepl") child.sendline("repadmin /showrepl")
child.expect("${WIN_BASEDN}") child.expect("DSA invocationID")
child.expect("was successful")
child.expect("CN=Configuration,${WIN_BASEDN}") t.cmd_contains("bin/samba-tool drs showrepl ${WIN_HOSTNAME}.${WIN_REALM} -k yes",
child.expect("was successful") [ "INBOUND NEIGHBORS",
child.expect("CN=Schema,CN=Configuration,${WIN_BASEDN}") "OUTBOUND NEIGHBORS",
child.expect("was successful") "${WIN_BASEDN}",
"Last attempt .* was successful",
"CN=Configuration,${WIN_BASEDN}",
"Last attempt .* was successful",
"CN=Configuration,${WIN_BASEDN}",
"Last attempt .* was successful" ],
ordered=True,
regex=True)
t.info("Checking if new users on windows propogate to samba") t.info("Checking if new users on windows propogate to samba")
child.sendline("net user test3 ${PASSWORD3} /add") child.sendline("net user test3 ${PASSWORD3} /add")
child.expect("The command completed successfully") child.expect("The command completed successfully")
t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest2%${PASSWORD2} -k no", ['Sharename', 'IPC']) t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest3%${PASSWORD3} -k no", ['Sharename', 'IPC'])
t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest2%${PASSWORD2} -k yes", ['Sharename', 'IPC']) t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest3%${PASSWORD3} -k yes", ['Sharename', 'IPC'])
# should this work?
t.info("Checking if new users propogate to windows") t.info("Checking if new users propogate to windows")
t.run_cmd('bin/samba-tool newuser test2 ${PASSWORD2}') t.cmd_contains('bin/samba-tool newuser test2 ${PASSWORD2}', ['No RID Set DN'])
t.retry_cmd("bin/smbclient -L ${WIN_HOSTNAME} -Utest2%${PASSWORD2} -k no", ['Sharename', 'Remote IPC'])
t.retry_cmd("bin/smbclient -L ${WIN_HOSTNAME} -Utest2%${PASSWORD2} -k yes", ['Sharename', 'Remote IPC'])
t.info("Checking propogation of user deletion") t.info("Checking propogation of user deletion")
t.run_cmd('bin/samba-tool user delete test2 -Uadministrator@${WIN_REALM}%${WIN_PASS}')
child.sendline("net user test3 /del") child.sendline("net user test3 /del")
child.expect("The command completed successfully") child.expect("The command completed successfully")
t.retry_cmd("bin/smbclient -L ${WIN_HOSTNAME} -Utest2%${PASSWORD2} -k no", ['LOGON_FAILURE']) t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest3%${PASSWORD3} -k no", ['LOGON_FAILURE'])
t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest2%${PASSWORD2} -k no", ['LOGON_FAILURE']) t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest3%${PASSWORD3} -k yes", ['LOGON_FAILURE'])
t.retry_cmd("bin/smbclient -L ${WIN_HOSTNAME} -Utest2%${PASSWORD2} -k yes", ['LOGON_FAILURE'])
t.retry_cmd("bin/smbclient -L ${HOSTNAME} -Utest2%${PASSWORD2} -k yes", ['LOGON_FAILURE'])
t.vm_poweroff("${WIN_VM}") t.vm_poweroff("${WIN_VM}")
@ -488,8 +499,12 @@ def test_howto(t):
check_prerequesites(t) check_prerequesites(t)
# we don't need fsync safety in these tests
t.putenv('TDB_NO_FSYNC', '1')
if not t.skip("build"): if not t.skip("build"):
build_s4(t) build_s4(t)
if not t.skip("provision"): if not t.skip("provision"):
provision_s4(t) provision_s4(t)
@ -509,49 +524,63 @@ def test_howto(t):
if not t.skip("dyndns"): if not t.skip("dyndns"):
test_dyndns(t) test_dyndns(t)
if not t.skip("windows7"): if t.have_var('WINDOWS7_VM') and not t.skip("windows7"):
run_winjoin(t, "WINDOWS7") run_winjoin(t, "WINDOWS7")
test_winjoin(t, "WINDOWS7") test_winjoin(t, "WINDOWS7")
if not t.skip("winxp"): if t.have_var('WINXP_VM') and not t.skip("winxp"):
run_winjoin(t, "WINXP") run_winjoin(t, "WINXP")
test_winjoin(t, "WINXP") test_winjoin(t, "WINXP")
if not t.skip("dcpromo_rodc"): if t.have_var('W2K8R2C_VM') and not t.skip("dcpromo_rodc"):
t.info("Testing w2k8r2 RODC dcpromo") t.info("Testing w2k8r2 RODC dcpromo")
run_dcpromo_rodc(t, "WINDOWS_DC2") run_dcpromo_rodc(t, "W2K8R2C")
test_dcpromo_rodc(t, "WINDOWS_DC2") test_dcpromo_rodc(t, "W2K8R2C")
if not t.skip("dcpromo_w2k8r2"): if t.have_var('W2K8R2B_VM') and not t.skip("dcpromo_w2k8r2"):
t.info("Testing w2k8r2 dcpromo") t.info("Testing w2k8r2 dcpromo")
run_dcpromo(t, "WINDOWS_DC1") run_dcpromo(t, "W2K8R2B")
test_dcpromo(t, "WINDOWS_DC1") test_dcpromo(t, "W2K8R2B")
if not t.skip("dcpromo_w2k8"): if t.have_var('W2K8B_VM') and not t.skip("dcpromo_w2k8"):
t.info("Testing w2k8 dcpromo") t.info("Testing w2k8 dcpromo")
run_dcpromo(t, "WINDOWS_DC5") run_dcpromo(t, "W2K8B")
test_dcpromo(t, "WINDOWS_DC5") test_dcpromo(t, "W2K8B")
if not t.skip("join_w2k8r2"): if t.have_var('W2K3B_VM') and not t.skip("dcpromo_w2k3"):
join_as_dc(t, "WINDOWS_DC3") t.info("Testing w2k3 dcpromo")
t.info("Changing to 2003 functional level")
provision_s4(t, func_level='2003', interfaces='${INTERFACES}')
create_shares(t)
start_s4(t, interfaces='${INTERFACES}')
test_smbclient(t)
restart_bind(t)
test_dns(t)
test_kerberos(t)
test_dyndns(t)
run_dcpromo(t, "W2K3B")
test_dcpromo(t, "W2K3B")
if t.have_var('W2K8R2A_VM') and not t.skip("join_w2k8r2"):
join_as_dc(t, "W2K8R2A")
create_shares(t) create_shares(t)
start_s4(t, interfaces='${INTERFACES}') start_s4(t, interfaces='${INTERFACES}')
test_dyndns(t) test_dyndns(t)
test_join_as_dc(t, "WINDOWS_DC3") test_join_as_dc(t, "W2K8R2A")
if not t.skip("join_rodc"): if t.have_var('W2K8R2A_VM') and not t.skip("join_rodc"):
join_as_rodc(t, "WINDOWS_DC3") join_as_rodc(t, "W2K8R2A")
create_shares(t) create_shares(t)
start_s4(t, interfaces='${INTERFACES}') start_s4(t, interfaces='${INTERFACES}')
test_dyndns(t) test_dyndns(t)
test_join_as_rodc(t, "WINDOWS_DC3") test_join_as_rodc(t, "W2K8R2A")
if not t.skip("join_w2k3"): if t.have_var('W2K3A_VM') and not t.skip("join_w2k3"):
join_as_dc(t, "WINDOWS_DC4") join_as_dc(t, "W2K3A")
create_shares(t) create_shares(t)
start_s4(t, interfaces='${INTERFACES}') start_s4(t, interfaces='${INTERFACES}')
test_dyndns(t) test_dyndns(t)
test_join_as_dc(t, "WINDOWS_DC4") test_join_as_dc(t, "W2K3A")
t.info("Howto test: All OK") t.info("Howto test: All OK")

View File

@ -43,39 +43,44 @@ WINXP_SNAPSHOT : howto-test
WINXP_USER : tridge WINXP_USER : tridge
WINXP_PASS : penguin WINXP_PASS : penguin
# Samba will join this w2k8r2 VM as a DC and then as a RODC
W2K8R2A_HOSTNAME : w2k8
W2K8R2A_VM : w2k8r2
W2K8R2A_BASEDN : DC=v2,DC=tridgell,DC=net
W2K8R2A_REALM : v2.tridgell.net
W2K8R2A_DOMAIN : v2
W2K8R2A_PASS : p@ssw0rd5
W2K8R2A_SNAPSHOT : howto-test
# this w2k8r2 VM will become a DC in the samba domain # this w2k8r2 VM will become a DC in the samba domain
WINDOWS_DC1_HOSTNAME : w2k8r2b W2K8R2B_HOSTNAME : w2k8r2b
WINDOWS_DC1_VM : w2k8r2b W2K8R2B_VM : w2k8r2b
WINDOWS_DC1_PASS : p@ssw0rd W2K8R2B_PASS : p@ssw0rd
WINDOWS_DC1_SNAPSHOT : howto-test2 W2K8R2B_SNAPSHOT : howto-test2
# this w2k8r2 VM will become a RODC in the samba domain # this w2k8r2 VM will become a RODC in the samba domain
WINDOWS_DC2_HOSTNAME : w2k8r2c W2K8R2C_HOSTNAME : w2k8r2c
WINDOWS_DC2_VM : w2k8r2c W2K8R2C_VM : w2k8r2c
WINDOWS_DC2_PASS : p@ssw0rd W2K8R2C_PASS : p@ssw0rd
WINDOWS_DC2_SNAPSHOT : howto-test2 W2K8R2C_SNAPSHOT : howto-test2
# Samba will join this VM as a DC # Samba will join this w2k3 VM as a DC
WINDOWS_DC3_HOSTNAME : w2k8 W2K3A_HOSTNAME : w2k3
WINDOWS_DC3_VM : w2k8r2 W2K3A_VM : w2003
WINDOWS_DC3_BASEDN : DC=v2,DC=tridgell,DC=net W2K3A_BASEDN : DC=vsofs3,DC=com
WINDOWS_DC3_REALM : v2.tridgell.net W2K3A_REALM : vsofs3.com
WINDOWS_DC3_DOMAIN : v2 W2K3A_DOMAIN : vsofs3
WINDOWS_DC3_PASS : p@ssw0rd5 W2K3A_PASS : penguin
WINDOWS_DC3_SNAPSHOT : howto-test W2K3A_SNAPSHOT : howto-test
# Samba will join this w2k3 box as a DC # this w2k3 VM will become a DC in the samba domain
WINDOWS_DC4_HOSTNAME : w2k3 W2K3B_HOSTNAME : w2k3b
WINDOWS_DC4_VM : w2003 W2K3B_VM : w2k3b
WINDOWS_DC4_BASEDN : DC=vsofs3,DC=com W2K3B_PASS : penguin
WINDOWS_DC4_REALM : vsofs3.com W2K3B_SNAPSHOT : howto-test
WINDOWS_DC4_DOMAIN : vsofs3
WINDOWS_DC4_PASS : penguin
WINDOWS_DC4_SNAPSHOT : howto-test
# this w2k8 VM will become a DC in the samba domain # this w2k8 VM will become a DC in the samba domain
WINDOWS_DC5_HOSTNAME : w2k8c W2K8B_HOSTNAME : w2k8c
WINDOWS_DC5_VM : w2k8 W2K8B_VM : w2k8
WINDOWS_DC5_PASS : p@ssw0rd W2K8B_PASS : p@ssw0rd
WINDOWS_DC5_SNAPSHOT : howto-test W2K8B_SNAPSHOT : howto-test

View File

@ -3,7 +3,7 @@
'''automated testing library for testing Samba against windows''' '''automated testing library for testing Samba against windows'''
import pexpect, subprocess import pexpect, subprocess
import sys, os, time import sys, os, time, re
class wintest(): class wintest():
'''testing of Samba against windows VMs''' '''testing of Samba against windows VMs'''
@ -83,6 +83,11 @@ class wintest():
text = text.replace("${%s}" % var_name, self.vars[var_name]) text = text.replace("${%s}" % var_name, self.vars[var_name])
return text return text
def have_var(self, varname):
'''see if a variable has been set'''
return varname in self.vars
def putenv(self, key, value): def putenv(self, key, value):
'''putenv with substitution''' '''putenv with substitution'''
os.putenv(key, self.substitute(value)) os.putenv(key, self.substitute(value))
@ -115,27 +120,38 @@ class wintest():
cmd = self.substitute(cmd) cmd = self.substitute(cmd)
return self.run_cmd(cmd, output=True) return self.run_cmd(cmd, output=True)
def cmd_contains(self, cmd, contains, nomatch=False, ordered=False): def cmd_contains(self, cmd, contains, nomatch=False, ordered=False, regex=False):
'''check that command output contains the listed strings''' '''check that command output contains the listed strings'''
out = self.cmd_output(cmd) out = self.cmd_output(cmd)
self.info(out) self.info(out)
for c in self.substitute(contains): for c in self.substitute(contains):
ofs = out.find(c) if regex:
m = re.search(c, out)
if m is None:
start = -1
end = -1
else:
start = m.start()
end = m.end()
else:
start = out.find(c)
end = start + len(c)
if nomatch: if nomatch:
if ofs != -1: if start != -1:
raise RuntimeError("Expected to not see %s in %s" % (c, cmd)) raise RuntimeError("Expected to not see %s in %s" % (c, cmd))
else: else:
if ofs == -1: if start == -1:
raise RuntimeError("Expected to see %s in %s" % (c, cmd)) raise RuntimeError("Expected to see %s in %s" % (c, cmd))
if ordered and ofs != -1: if ordered and start != -1:
ofs += len(c) out = out[end:]
out = out[ofs:]
def retry_cmd(self, cmd, contains, retries=30, delay=2, wait_for_fail=False): def retry_cmd(self, cmd, contains, retries=30, delay=2, wait_for_fail=False,
ordered=False, regex=False):
'''retry a command a number of times''' '''retry a command a number of times'''
while retries > 0: while retries > 0:
try: try:
self.cmd_contains(cmd, contains, nomatch=wait_for_fail) self.cmd_contains(cmd, contains, nomatch=wait_for_fail,
ordered=ordered, regex=regex)
return return
except: except:
time.sleep(delay) time.sleep(delay)
@ -214,7 +230,7 @@ class wintest():
child.expect("C:") child.expect("C:")
def open_telnet(self, hostname, username, password, retries=30, delay=3, set_time=False): def open_telnet(self, hostname, username, password, retries=60, delay=5, set_time=False):
'''open a telnet connection to a windows server, return the pexpect child''' '''open a telnet connection to a windows server, return the pexpect child'''
while retries > 0: while retries > 0:
child = self.pexpect_spawn("telnet " + hostname + " -l '" + username + "'") child = self.pexpect_spawn("telnet " + hostname + " -l '" + username + "'")