1 # Unix SMB/CIFS implementation.
2 # Copyright (C) Andrew Bartlett 2012
5 # Copyright (C) Sean Dague <sdague@linux.vnet.ibm.com> 2011
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 from samba
.tests
.samba_tool
.base
import SambaToolCmdTest
26 from samba
.netcmd
.gpo
import get_gpo_dn
, get_gpo_info
27 from samba
.param
import LoadParm
28 from samba
.tests
.gpo
import stage_file
, unstage_file
29 from samba
.dcerpc
import preg
30 from samba
.ndr
import ndr_pack
, ndr_unpack
31 from samba
.common
import get_string
32 from configparser
import ConfigParser
33 import xml
.etree
.ElementTree
as etree
34 from tempfile
import NamedTemporaryFile
36 from samba
.gp
.gpclass
import check_guid
37 from samba
.gp_parse
.gp_ini
import GPTIniParser
43 "keyname": "Software\\\\Policies\\\\Mozilla\\\\Firefox\\\\Homepage",
44 "valuename": "StartPage",
50 "keyname": "Software\\\\Policies\\\\Mozilla\\\\Firefox\\\\Homepage",
57 "keyname": "Software\\\\Microsoft\\\\Internet Explorer\\\\Toolbar",
58 "valuename": "IEToolbar",
64 "keyname": "Software\\\\Policies\\\\Microsoft\\\\InputPersonalization",
65 "valuename": "RestrictImplicitTextCollection",
71 "keyname": "Software\\\\Policies\\\\Mozilla\\\\Firefox",
72 "valuename": "ExtensionSettings",
74 "type": "REG_MULTI_SZ",
77 " \\"key\\": \\"value\\"",
88 "keyname": "Software\\\\Policies\\\\Mozilla\\\\Firefox\\\\Homepage",
89 "valuename": "StartPage",
93 "keyname": "Software\\\\Policies\\\\Mozilla\\\\Firefox\\\\Homepage",
98 "keyname": "Software\\\\Microsoft\\\\Internet Explorer\\\\Toolbar",
99 "valuename": "IEToolbar",
103 "keyname": "Software\\\\Policies\\\\Microsoft\\\\InputPersonalization",
104 "valuename": "RestrictImplicitTextCollection",
108 "keyname": "Software\\\\Policies\\\\Mozilla\\\\Firefox",
109 "valuename": "ExtensionSettings",
115 def gpt_ini_version(gpo_guid
):
117 lp
.load(os
.environ
['SERVERCONFFILE'])
118 local_path
= lp
.get('path', 'sysvol')
119 GPT_INI
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
121 if os
.path
.exists(GPT_INI
):
122 with
open(GPT_INI
, 'rb') as f
:
124 parser
= GPTIniParser()
126 if parser
.ini_conf
.has_option('General', 'Version'):
127 version
= int(parser
.ini_conf
.get('General',
128 'Version').encode('utf-8'))
135 # These are new GUIDs, not used elsewhere, made up for the use of testing the
136 # adding of extension GUIDs in `samba-tool gpo load`.
137 ext_guids
= ['{123d2b56-7b14-4516-bbc4-763d29d57654}',
138 '{d000e91b-e70f-481b-9549-58de7929bcee}']
140 source_path
= os
.path
.abspath(os
.path
.join(os
.path
.dirname(__file__
), "../../../../.."))
141 provision_path
= os
.path
.join(source_path
, "source4/selftest/provisions/")
143 def has_difference(path1
, path2
, binary
=True, xml
=True, sortlines
=False):
144 """Use this function to determine if the GPO backup differs from another.
146 xml=True checks whether any xml files are equal
147 binary=True checks whether any .SAMBABACKUP files are equal
149 if os
.path
.isfile(path1
):
151 file1
= open(path1
).readlines()
153 file2
= open(path1
).readlines()
158 elif open(path1
).read() != open(path2
).read():
169 dirlist
= os
.listdir(l_dir
)
170 dirlist_other
= os
.listdir(r_dir
)
174 if dirlist
!= dirlist_other
:
178 l_name
= os
.path
.join(l_dir
, e
)
179 r_name
= os
.path
.join(r_dir
, e
)
181 if os
.path
.isdir(l_name
):
182 l_dirs
.append(l_name
)
183 r_dirs
.append(r_name
)
185 if (l_name
.endswith('.xml') and xml
or
186 l_name
.endswith('.SAMBABACKUP') and binary
):
187 if open(l_name
, "rb").read() != open(r_name
, "rb").read():
193 class GpoCmdTestCase(SambaToolCmdTest
):
194 """Tests for samba-tool time subcommands"""
198 # This exists in the source tree to be restored
199 backup_gpo_guid
= "{1E1DC8EA-390C-4800-B327-98B56A0AEA5D}"
201 def test_gpo_list(self
):
202 """Run gpo list against the server and make sure it looks accurate"""
203 (result
, out
, err
) = self
.runsubcmd("gpo", "listall", "-H", "ldap://%s" % os
.environ
["SERVER"])
204 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo listall ran successfully")
206 def test_fetchfail(self
):
207 """Run against a non-existent GPO, and make sure it fails (this hard-coded UUID is very unlikely to exist"""
208 (result
, out
, err
) = self
.runsubcmd("gpo", "fetch", "c25cac17-a02a-4151-835d-fae17446ee43", "-H", "ldap://%s" % os
.environ
["SERVER"])
209 self
.assertCmdFail(result
, "check for result code")
211 def test_fetch(self
):
212 """Run against a real GPO, and make sure it passes"""
213 (result
, out
, err
) = self
.runsubcmd("gpo", "fetch", self
.gpo_guid
, "-H", "ldap://%s" % os
.environ
["SERVER"], "--tmpdir", self
.tempdir
)
214 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo fetched successfully")
215 shutil
.rmtree(os
.path
.join(self
.tempdir
, "policy"))
218 """Show a real GPO, and make sure it passes"""
219 (result
, out
, err
) = self
.runsubcmd("gpo", "show", self
.gpo_guid
, "-H", "ldap://%s" % os
.environ
["SERVER"])
220 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo fetched successfully")
222 def test_show_as_admin(self
):
223 """Show a real GPO, and make sure it passes"""
224 (result
, out
, err
) = self
.runsubcmd("gpo", "show", self
.gpo_guid
, "-H", "ldap://%s" % os
.environ
["SERVER"], "-U%s%%%s" % (os
.environ
["USERNAME"], os
.environ
["PASSWORD"]))
225 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo fetched successfully")
227 def test_aclcheck(self
):
228 """Check all the GPOs on the remote server have correct ACLs"""
229 (result
, out
, err
) = self
.runsubcmd("gpo", "aclcheck", "-H", "ldap://%s" % os
.environ
["SERVER"], "-U%s%%%s" % (os
.environ
["USERNAME"], os
.environ
["PASSWORD"]))
230 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo checked successfully")
232 def test_getlink_empty(self
):
233 self
.samdb
= self
.getSamDB("-H", "ldap://%s" % os
.environ
["DC_SERVER"],
234 "-U%s%%%s" % (os
.environ
["DC_USERNAME"],
235 os
.environ
["DC_PASSWORD"]))
237 container_dn
= 'OU=gpo_test_link,%s' % self
.samdb
.get_default_basedn()
241 'objectClass': 'organizationalUnit'
244 (result
, out
, err
) = self
.runsubcmd("gpo", "getlink", container_dn
,
245 "-H", "ldap://%s" % os
.environ
["SERVER"],
246 "-U%s%%%s" % (os
.environ
["USERNAME"],
247 os
.environ
["PASSWORD"]))
248 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo link fetched successfully")
250 # Microsoft appears to allow an empty space character after deletion of
251 # a GPO. We should be able to handle this.
253 m
.dn
= ldb
.Dn(self
.samdb
, container_dn
)
254 m
['gPLink'] = ldb
.MessageElement(' ', ldb
.FLAG_MOD_REPLACE
, 'gPLink')
257 (result
, out
, err
) = self
.runsubcmd("gpo", "getlink", container_dn
,
258 "-H", "ldap://%s" % os
.environ
["SERVER"],
259 "-U%s%%%s" % (os
.environ
["USERNAME"],
260 os
.environ
["PASSWORD"]))
261 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo link fetched successfully")
263 self
.samdb
.delete(container_dn
)
265 def test_backup_restore_compare_binary(self
):
266 """Restore from a static backup and compare the binary contents"""
268 if not os
.path
.exists(provision_path
):
269 self
.skipTest('Test requires provision data not available in '
272 static_path
= os
.path
.join(self
.backup_path
, 'policy',
273 self
.backup_gpo_guid
)
275 temp_path
= os
.path
.join(self
.tempdir
, 'temp')
278 new_path
= os
.path
.join(self
.tempdir
, 'new')
283 (result
, out
, err
) = self
.runsubcmd("gpo", "restore", "BACKUP_RESTORE1",
286 os
.environ
["SERVER"], "--tmpdir",
287 temp_path
, "--entities",
288 self
.entity_file
, "-U%s%%%s" %
289 (os
.environ
["USERNAME"],
290 os
.environ
["PASSWORD"]),
291 "--restore-metadata")
293 self
.assertCmdSuccess(result
, out
, err
,
294 "Ensure gpo restore successful")
296 gpo_guid
= "{%s}" % out
.split("{")[1].split("}")[0]
298 (result
, out
, err
) = self
.runsubcmd("gpo", "backup", gpo_guid
,
300 os
.environ
["SERVER"],
301 "--tmpdir", new_path
)
303 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo fetched successfully")
305 # Compare the directories
306 self
.assertIsNone(has_difference(os
.path
.join(new_path
, 'policy',
308 static_path
, binary
=True,
312 (result
, out
, err
) = self
.runsubcmd("gpo", "del", gpo_guid
,
314 os
.environ
["SERVER"],
316 (os
.environ
["USERNAME"],
317 os
.environ
["PASSWORD"]))
318 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo deleted successfully")
320 shutil
.rmtree(temp_path
)
321 shutil
.rmtree(new_path
)
323 def test_backup_restore_no_entities_compare_binary(self
):
324 """Restore from a static backup (and use no entity file, resulting in
325 copy-restore fallback), and compare the binary contents"""
327 if not os
.path
.exists(provision_path
):
328 self
.skipTest('Test requires provision data not available in '
331 static_path
= os
.path
.join(self
.backup_path
, 'policy',
332 self
.backup_gpo_guid
)
334 temp_path
= os
.path
.join(self
.tempdir
, 'temp')
337 new_path
= os
.path
.join(self
.tempdir
, 'new')
344 (result
, out
, err
) = self
.runsubcmd("gpo", "restore", "BACKUP_RESTORE1",
347 os
.environ
["SERVER"], "--tmpdir",
348 temp_path
, "--entities",
349 self
.entity_file
, "-U%s%%%s" %
350 (os
.environ
["USERNAME"],
351 os
.environ
["PASSWORD"]),
352 "--restore-metadata")
354 self
.assertCmdSuccess(result
, out
, err
,
355 "Ensure gpo restore successful")
357 gpo_guid
= "{%s}" % out
.split("{")[1].split("}")[0]
360 # Do not output entities file
361 (result
, out
, err
) = self
.runsubcmd("gpo", "backup", gpo_guid
,
363 os
.environ
["SERVER"],
364 "--tmpdir", new_path
,
367 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo fetched successfully")
369 # Do not use an entities file
370 (result
, out
, err
) = self
.runsubcmd("gpo", "restore", "BACKUP_RESTORE2",
371 os
.path
.join(new_path
, 'policy', gpo_guid1
),
373 os
.environ
["SERVER"], "--tmpdir",
374 temp_path
, "-U%s%%%s" %
375 (os
.environ
["USERNAME"],
376 os
.environ
["PASSWORD"]),
377 "--restore-metadata")
379 self
.assertCmdSuccess(result
, out
, err
,
380 "Ensure gpo restore successful")
382 gpo_guid
= "{%s}" % out
.split("{")[1].split("}")[0]
385 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo restored successfully")
387 (result
, out
, err
) = self
.runsubcmd("gpo", "backup", gpo_guid
,
389 os
.environ
["SERVER"],
390 "--tmpdir", new_path
)
392 # Compare the directories
393 self
.assertIsNone(has_difference(os
.path
.join(new_path
, 'policy',
395 os
.path
.join(new_path
, 'policy',
397 binary
=True, xml
=False))
400 (result
, out
, err
) = self
.runsubcmd("gpo", "del", gpo_guid1
,
402 os
.environ
["SERVER"],
404 (os
.environ
["USERNAME"],
405 os
.environ
["PASSWORD"]))
406 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo deleted successfully")
409 (result
, out
, err
) = self
.runsubcmd("gpo", "del", gpo_guid2
,
411 os
.environ
["SERVER"],
413 (os
.environ
["USERNAME"],
414 os
.environ
["PASSWORD"]))
415 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo deleted successfully")
417 shutil
.rmtree(temp_path
)
418 shutil
.rmtree(new_path
)
420 def test_backup_restore_backup_compare_XML(self
):
421 """Restore from a static backup and backup to compare XML"""
423 if not os
.path
.exists(provision_path
):
424 self
.skipTest('Test requires provision data not available in '
427 static_path
= os
.path
.join(self
.backup_path
, 'policy',
428 self
.backup_gpo_guid
)
430 temp_path
= os
.path
.join(self
.tempdir
, 'temp')
433 new_path
= os
.path
.join(self
.tempdir
, 'new')
440 (result
, out
, err
) = self
.runsubcmd("gpo", "restore", "BACKUP_RESTORE1",
443 os
.environ
["SERVER"], "--tmpdir",
444 temp_path
, "--entities",
445 self
.entity_file
, "-U%s%%%s" %
446 (os
.environ
["USERNAME"],
447 os
.environ
["PASSWORD"]),
448 "--restore-metadata")
450 self
.assertCmdSuccess(result
, out
, err
,
451 "Ensure gpo restore successful")
453 gpo_guid
= "{%s}" % out
.split("{")[1].split("}")[0]
456 (result
, out
, err
) = self
.runsubcmd("gpo", "backup", gpo_guid
,
458 os
.environ
["SERVER"],
459 "--tmpdir", new_path
)
461 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo fetched successfully")
463 (result
, out
, err
) = self
.runsubcmd("gpo", "restore", "BACKUP_RESTORE2",
464 os
.path
.join(new_path
, 'policy', gpo_guid1
),
466 os
.environ
["SERVER"], "--tmpdir",
467 temp_path
, "--entities",
468 self
.entity_file
, "-U%s%%%s" %
469 (os
.environ
["USERNAME"],
470 os
.environ
["PASSWORD"]),
471 "--restore-metadata")
473 self
.assertCmdSuccess(result
, out
, err
,
474 "Ensure gpo restore successful")
476 gpo_guid
= "{%s}" % out
.split("{")[1].split("}")[0]
479 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo restored successfully")
481 (result
, out
, err
) = self
.runsubcmd("gpo", "backup", gpo_guid
,
483 os
.environ
["SERVER"],
484 "--tmpdir", new_path
)
486 # Compare the directories
487 self
.assertIsNone(has_difference(os
.path
.join(new_path
, 'policy',
489 os
.path
.join(new_path
, 'policy',
491 binary
=True, xml
=True))
494 (result
, out
, err
) = self
.runsubcmd("gpo", "del", gpo_guid1
,
496 os
.environ
["SERVER"],
498 (os
.environ
["USERNAME"],
499 os
.environ
["PASSWORD"]))
500 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo deleted successfully")
503 (result
, out
, err
) = self
.runsubcmd("gpo", "del", gpo_guid2
,
505 os
.environ
["SERVER"],
507 (os
.environ
["USERNAME"],
508 os
.environ
["PASSWORD"]))
509 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo deleted successfully")
511 shutil
.rmtree(temp_path
)
512 shutil
.rmtree(new_path
)
514 def test_backup_restore_generalize(self
):
515 """Restore from a static backup with different entities, generalize it
516 again, and compare the XML"""
518 if not os
.path
.exists(provision_path
):
519 self
.skipTest('Test requires provision data not available in '
522 static_path
= os
.path
.join(self
.backup_path
, 'policy',
523 self
.backup_gpo_guid
)
525 temp_path
= os
.path
.join(self
.tempdir
, 'temp')
528 new_path
= os
.path
.join(self
.tempdir
, 'new')
531 alt_entity_file
= os
.path
.join(new_path
, 'entities')
532 with
open(alt_entity_file
, 'wb') as f
:
533 f
.write(b
'''<!ENTITY SAMBA__NETWORK_PATH__82419dafed126a07d6b96c66fc943735__ "\\\\samdom.example.com">
534 <!ENTITY SAMBA__NETWORK_PATH__0484cd41ded45a0728333a9c5e5ef619__ "\\\\samdom">
535 <!ENTITY SAMBA____SDDL_ACL____4ce8277be3f630300cbcf80a80e21cf4__ "D:PAR(A;CI;KA;;;BA)(A;CIIO;KA;;;CO)(A;CI;KA;;;SY)(A;CI;KR;;;S-1-16-0)">
536 <!ENTITY SAMBA____USER_ID_____d0970f5a1e19cb803f916c203d5c39c4__ "*S-1-5-113">
537 <!ENTITY SAMBA____USER_ID_____7b7bc2512ee1fedcd76bdc68926d4f7b__ "Administrator">
538 <!ENTITY SAMBA____USER_ID_____a3069f5a7a6530293ad8df6abd32af3d__ "Foobaz">
539 <!ENTITY SAMBA____USER_ID_____fdf60b2473b319c8c341de5f62479a7d__ "*S-1-5-32-545">
540 <!ENTITY SAMBA____USER_ID_____adb831a7fdd83dd1e2a309ce7591dff8__ "Guest">
541 <!ENTITY SAMBA____USER_ID_____9fa835214b4fc8b6102c991f7d97c2f8__ "*S-1-5-32-547">
542 <!ENTITY SAMBA____USER_ID_____bf8caafa94a19a6262bad2e8b6d4bce6__ "*S-1-5-32-546">
543 <!ENTITY SAMBA____USER_ID_____a45da96d0bf6575970f2d27af22be28a__ "System">
544 <!ENTITY SAMBA____USER_ID_____171d33a63ebd67f856552940ed491ad3__ "s-1-5-32-545">
545 <!ENTITY SAMBA____USER_ID_____7140932fff16ce85cc64d3caab588d0d__ "s-1-1-0">
548 gen_entity_file
= os
.path
.join(temp_path
, 'entities')
552 (result
, out
, err
) = self
.runsubcmd("gpo", "restore", "BACKUP_RESTORE1",
555 os
.environ
["SERVER"], "--tmpdir",
556 temp_path
, "--entities",
557 alt_entity_file
, "-U%s%%%s" %
558 (os
.environ
["USERNAME"],
559 os
.environ
["PASSWORD"]),
560 "--restore-metadata")
562 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo restored successfully")
564 gpo_guid
= "{%s}" % out
.split("{")[1].split("}")[0]
566 (result
, out
, err
) = self
.runsubcmd("gpo", "backup", gpo_guid
,
568 os
.environ
["SERVER"],
569 "--tmpdir", new_path
,
570 "--generalize", "--entities",
573 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo fetched successfully")
575 # Assert entity files are identical (except for line order)
576 self
.assertIsNone(has_difference(alt_entity_file
,
580 # Compare the directories (XML)
581 self
.assertIsNone(has_difference(os
.path
.join(new_path
, 'policy',
583 static_path
, binary
=False,
587 (result
, out
, err
) = self
.runsubcmd("gpo", "del", gpo_guid
,
589 os
.environ
["SERVER"],
591 (os
.environ
["USERNAME"],
592 os
.environ
["PASSWORD"]))
593 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo deleted successfully")
595 shutil
.rmtree(temp_path
)
596 shutil
.rmtree(new_path
)
598 def test_backup_with_extension_attributes(self
):
599 self
.samdb
= self
.getSamDB("-H", "ldap://%s" % os
.environ
["DC_SERVER"],
600 "-U%s%%%s" % (os
.environ
["DC_USERNAME"],
601 os
.environ
["DC_PASSWORD"]))
603 temp_path
= os
.path
.join(self
.tempdir
, 'temp')
607 # Taken from "source4/setup/provision_group_policy.ldif" on domain
608 'gPCMachineExtensionNames': '[{35378EAC-683F-11D2-A89A-00C04FBBCFA2}{53D6AB1B-2488-11D1-A28C-00C04FB94F17}][{827D319E-6EAC-11D2-A4EA-00C04F79F83A}{803E14A0-B4FB-11D0-A0D0-00A0C90F574B}][{B1BE8D72-6EAC-11D2-A4EA-00C04F79F83A}{53D6AB1B-2488-11D1-A28C-00C04FB94F17}]',
609 'gPCUserExtensionNames': '[{3060E8D0-7020-11D2-842D-00C04FA372D4}{3060E8CE-7020-11D2-842D-00C04FA372D4}][{35378EAC-683F-11D2-A89A-00C04FBBCFA2}{0F6B957E-509E-11D1-A7CC-0000F87571E3}]'
612 gpo_dn
= get_gpo_dn(self
.samdb
, self
.gpo_guid
)
613 for ext
in extensions
:
614 data
= extensions
[ext
]
618 m
[ext
] = ldb
.MessageElement(data
, ldb
.FLAG_MOD_REPLACE
, ext
)
623 (result
, out
, err
) = self
.runsubcmd("gpo", "backup", self
.gpo_guid
,
625 os
.environ
["SERVER"],
626 "--tmpdir", temp_path
)
628 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo fetched successfully")
630 guid
= "{%s}" % out
.split("{")[1].split("}")[0]
632 temp_path
= os
.path
.join(temp_path
, 'policy', guid
)
634 (result
, out
, err
) = self
.runsubcmd("gpo", "restore", "RESTORE_EXT",
637 os
.environ
["SERVER"], "--tmpdir",
638 self
.tempdir
, "-U%s%%%s" %
639 (os
.environ
["USERNAME"],
640 os
.environ
["PASSWORD"]),
641 "--restore-metadata")
643 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo restored successfully")
645 gpo_guid
= "{%s}" % out
.split("{")[1].split("}")[0]
647 msg
= get_gpo_info(self
.samdb
, gpo_guid
)
648 self
.assertEqual(len(msg
), 1)
650 for ext
in extensions
:
651 self
.assertTrue(ext
in msg
[0])
652 self
.assertEqual(extensions
[ext
], str(msg
[0][ext
][0]))
656 (result
, out
, err
) = self
.runsubcmd("gpo", "del", gpo_guid
,
658 os
.environ
["SERVER"],
660 (os
.environ
["USERNAME"],
661 os
.environ
["PASSWORD"]))
662 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo deleted successfully")
664 shutil
.rmtree(os
.path
.join(self
.tempdir
, "policy"))
665 shutil
.rmtree(os
.path
.join(self
.tempdir
, 'temp'))
667 def test_admx_load(self
):
669 lp
.load(os
.environ
['SERVERCONFFILE'])
670 local_path
= lp
.get('path', 'sysvol')
671 admx_path
= os
.path
.join(local_path
, os
.environ
['REALM'].lower(),
672 'Policies', 'PolicyDefinitions')
673 (result
, out
, err
) = self
.runsubcmd("gpo", "admxload",
675 os
.environ
["SERVER"],
677 os
.path
.join(source_path
,
680 (os
.environ
["USERNAME"],
681 os
.environ
["PASSWORD"]))
682 self
.assertCmdSuccess(result
, out
, err
,
683 'Filling PolicyDefinitions failed')
684 self
.assertTrue(os
.path
.exists(admx_path
),
685 'PolicyDefinitions was not created')
686 self
.assertTrue(os
.path
.exists(os
.path
.join(admx_path
, 'samba.admx')),
687 'Filling PolicyDefinitions failed')
688 shutil
.rmtree(admx_path
)
690 def test_smb_conf_set(self
):
692 lp
.load(os
.environ
['SERVERCONFFILE'])
693 local_path
= lp
.get('path', 'sysvol')
694 reg_pol
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
695 self
.gpo_guid
, 'Machine/Registry.pol')
697 policy
= 'apply group policies'
698 before_vers
= gpt_ini_version(self
.gpo_guid
)
699 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage", "smb_conf",
700 "set"), self
.gpo_guid
,
703 os
.environ
["SERVER"],
705 (os
.environ
["USERNAME"],
706 os
.environ
["PASSWORD"]))
707 self
.assertCmdSuccess(result
, out
, err
,
708 'Failed to set apply group policies')
709 after_vers
= gpt_ini_version(self
.gpo_guid
)
710 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
712 self
.assertTrue(os
.path
.exists(reg_pol
),
713 'The Registry.pol does not exist')
714 reg_data
= ndr_unpack(preg
.file, open(reg_pol
, 'rb').read())
715 ret
= any([get_string(e
.valuename
) == policy
and e
.data
== 1
716 for e
in reg_data
.entries
])
717 self
.assertTrue(ret
, 'The sudoers entry was not added')
719 before_vers
= after_vers
720 # Ensure an empty set command deletes the entry
721 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage", "smb_conf",
722 "set"), self
.gpo_guid
,
723 policy
, "-H", "ldap://%s" %
724 os
.environ
["SERVER"],
726 (os
.environ
["USERNAME"],
727 os
.environ
["PASSWORD"]))
728 self
.assertCmdSuccess(result
, out
, err
,
729 'Failed to unset apply group policies')
730 after_vers
= gpt_ini_version(self
.gpo_guid
)
731 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
733 reg_data
= ndr_unpack(preg
.file, open(reg_pol
, 'rb').read())
734 ret
= not any([get_string(e
.valuename
) == policy
and e
.data
== 1
735 for e
in reg_data
.entries
])
736 self
.assertTrue(ret
, 'The sudoers entry was not removed')
738 def test_smb_conf_list(self
):
740 lp
.load(os
.environ
['SERVERCONFFILE'])
741 local_path
= lp
.get('path', 'sysvol')
742 reg_pol
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
743 self
.gpo_guid
, 'Machine/Registry.pol')
745 # Stage the Registry.pol file with test data
748 e
.keyname
= b
'Software\\Policies\\Samba\\smb_conf'
749 e
.valuename
= b
'apply group policies'
752 stage
.num_entries
= 1
754 ret
= stage_file(reg_pol
, ndr_pack(stage
))
755 self
.assertTrue(ret
, 'Could not create the target %s' % reg_pol
)
757 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage", "smb_conf",
758 "list"), self
.gpo_guid
,
760 os
.environ
["SERVER"],
762 (os
.environ
["USERNAME"],
763 os
.environ
["PASSWORD"]))
764 self
.assertIn('%s = True' % e
.valuename
, out
, 'The test entry was not found!')
766 # Unstage the Registry.pol file
767 unstage_file(reg_pol
)
769 def test_security_set(self
):
771 lp
.load(os
.environ
['SERVERCONFFILE'])
772 local_path
= lp
.get('path', 'sysvol')
773 inf_pol
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
774 self
.gpo_guid
, 'Machine/Microsoft/Windows NT/SecEdit/GptTmpl.inf')
776 before_vers
= gpt_ini_version(self
.gpo_guid
)
777 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage", "security",
778 "set"), self
.gpo_guid
,
779 'MaxTicketAge', '10',
781 os
.environ
["SERVER"],
783 (os
.environ
["USERNAME"],
784 os
.environ
["PASSWORD"]))
785 self
.assertCmdSuccess(result
, out
, err
,
786 'Failed to set MaxTicketAge')
787 self
.assertTrue(os
.path
.exists(inf_pol
),
788 '%s was not created' % inf_pol
)
789 inf_pol_contents
= open(inf_pol
, 'r').read()
790 self
.assertIn('MaxTicketAge = 10', inf_pol_contents
,
791 'The test entry was not found!')
792 after_vers
= gpt_ini_version(self
.gpo_guid
)
793 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
795 before_vers
= after_vers
796 # Ensure an empty set command deletes the entry
797 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage", "security",
798 "set"), self
.gpo_guid
,
801 os
.environ
["SERVER"],
803 (os
.environ
["USERNAME"],
804 os
.environ
["PASSWORD"]))
805 self
.assertCmdSuccess(result
, out
, err
,
806 'Failed to unset MaxTicketAge')
807 inf_pol_contents
= open(inf_pol
, 'r').read()
808 self
.assertNotIn('MaxTicketAge = 10', inf_pol_contents
,
809 'The test entry was still found!')
810 after_vers
= gpt_ini_version(self
.gpo_guid
)
811 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
813 def test_security_list(self
):
814 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage", "security",
815 "set"), self
.gpo_guid
,
816 'MaxTicketAge', '10',
818 os
.environ
["SERVER"],
820 (os
.environ
["USERNAME"],
821 os
.environ
["PASSWORD"]))
822 self
.assertCmdSuccess(result
, out
, err
,
823 'Failed to set MaxTicketAge')
825 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage", "security",
826 "list"), self
.gpo_guid
,
828 os
.environ
["SERVER"],
830 (os
.environ
["USERNAME"],
831 os
.environ
["PASSWORD"]))
832 self
.assertIn('MaxTicketAge = 10', out
, 'The test entry was not found!')
834 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage", "security",
835 "set"), self
.gpo_guid
,
838 os
.environ
["SERVER"],
840 (os
.environ
["USERNAME"],
841 os
.environ
["PASSWORD"]))
842 self
.assertCmdSuccess(result
, out
, err
,
843 'Failed to unset MaxTicketAge')
845 def test_security_nonempty_sections(self
):
847 lp
.load(os
.environ
['SERVERCONFFILE'])
848 local_path
= lp
.get('path', 'sysvol')
849 gpt_inf
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
850 self
.gpo_guid
, 'Machine/Microsoft/Windows NT',
851 'SecEdit/GptTmpl.inf')
853 before_vers
= gpt_ini_version(self
.gpo_guid
)
854 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage", "security",
855 "set"), self
.gpo_guid
,
856 'MaxTicketAge', '10',
858 os
.environ
["SERVER"],
860 (os
.environ
["USERNAME"],
861 os
.environ
["PASSWORD"]))
862 self
.assertCmdSuccess(result
, out
, err
,
863 'Failed to set MaxTicketAge')
864 after_vers
= gpt_ini_version(self
.gpo_guid
)
865 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
867 before_vers
= after_vers
868 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage", "security",
869 "set"), self
.gpo_guid
,
872 os
.environ
["SERVER"],
874 (os
.environ
["USERNAME"],
875 os
.environ
["PASSWORD"]))
876 self
.assertCmdSuccess(result
, out
, err
,
877 'Failed to unset MaxTicketAge')
878 after_vers
= gpt_ini_version(self
.gpo_guid
)
879 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
881 inf_data
= ConfigParser(interpolation
=None)
882 inf_data
.read(gpt_inf
)
884 self
.assertFalse(inf_data
.has_section('Kerberos Policy'))
886 def test_sudoers_add(self
):
888 lp
.load(os
.environ
['SERVERCONFFILE'])
889 local_path
= lp
.get('path', 'sysvol')
890 reg_pol
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
891 self
.gpo_guid
, 'Machine/Registry.pol')
893 # Stage the Registry.pol file with test data
896 e
.keyname
= b
'Software\\Policies\\Samba\\Unix Settings\\Sudo Rights'
897 e
.valuename
= b
'Software\\Policies\\Samba\\Unix Settings'
899 e
.data
= b
'fakeu ALL=(ALL) NOPASSWD: ALL'
900 stage
.num_entries
= 1
902 ret
= stage_file(reg_pol
, ndr_pack(stage
))
903 self
.assertTrue(ret
, 'Could not create the target %s' % reg_pol
)
905 before_vers
= gpt_ini_version(self
.gpo_guid
)
906 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
908 self
.gpo_guid
, 'ALL', 'ALL',
909 'fakeu', 'fakeg', "-H",
911 os
.environ
["SERVER"],
913 (os
.environ
["USERNAME"],
914 os
.environ
["PASSWORD"]))
915 self
.assertCmdSuccess(result
, out
, err
, 'Sudoers add failed')
916 after_vers
= gpt_ini_version(self
.gpo_guid
)
917 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
919 sudoer
= 'fakeu,fakeg% ALL=(ALL) NOPASSWD: ALL'
920 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
924 os
.environ
["SERVER"],
926 (os
.environ
["USERNAME"],
927 os
.environ
["PASSWORD"]))
928 self
.assertIn(sudoer
, out
, 'The test entry was not found!')
929 self
.assertIn(get_string(e
.data
), out
, 'The test entry was not found!')
931 before_vers
= after_vers
932 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
933 "sudoers", "remove"),
934 self
.gpo_guid
, sudoer
,
936 os
.environ
["SERVER"],
938 (os
.environ
["USERNAME"],
939 os
.environ
["PASSWORD"]))
940 self
.assertCmdSuccess(result
, out
, err
, 'Sudoers remove failed')
941 after_vers
= gpt_ini_version(self
.gpo_guid
)
942 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
944 before_vers
= after_vers
945 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
946 "sudoers", "remove"),
950 os
.environ
["SERVER"],
952 (os
.environ
["USERNAME"],
953 os
.environ
["PASSWORD"]))
954 self
.assertCmdSuccess(result
, out
, err
, 'Sudoers remove failed')
955 after_vers
= gpt_ini_version(self
.gpo_guid
)
956 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
958 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
962 os
.environ
["SERVER"],
964 (os
.environ
["USERNAME"],
965 os
.environ
["PASSWORD"]))
966 self
.assertNotIn(sudoer
, out
, 'The test entry was still found!')
967 self
.assertNotIn(get_string(e
.data
), out
,
968 'The test entry was still found!')
970 # Unstage the Registry.pol file
971 unstage_file(reg_pol
)
973 def test_sudoers_list(self
):
975 lp
.load(os
.environ
['SERVERCONFFILE'])
976 local_path
= lp
.get('path', 'sysvol')
977 vgp_xml
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
978 self
.gpo_guid
, 'Machine/VGP/VTLA/Sudo',
979 'SudoersConfiguration/manifest.xml')
981 stage
= etree
.Element('vgppolicy')
982 policysetting
= etree
.SubElement(stage
, 'policysetting')
983 pv
= etree
.SubElement(policysetting
, 'version')
985 name
= etree
.SubElement(policysetting
, 'name')
986 name
.text
= 'Sudo Policy'
987 description
= etree
.SubElement(policysetting
, 'description')
988 description
.text
= 'Sudoers File Configuration Policy'
989 apply_mode
= etree
.SubElement(policysetting
, 'apply_mode')
990 apply_mode
.text
= 'merge'
991 data
= etree
.SubElement(policysetting
, 'data')
992 load_plugin
= etree
.SubElement(data
, 'load_plugin')
993 load_plugin
.text
= 'true'
994 sudoers_entry
= etree
.SubElement(data
, 'sudoers_entry')
995 command
= etree
.SubElement(sudoers_entry
, 'command')
997 user
= etree
.SubElement(sudoers_entry
, 'user')
999 listelement
= etree
.SubElement(sudoers_entry
, 'listelement')
1000 principal
= etree
.SubElement(listelement
, 'principal')
1001 principal
.text
= 'fakeu'
1002 principal
.attrib
['type'] = 'user'
1003 # Ensure an empty principal doesn't cause a crash
1004 sudoers_entry
= etree
.SubElement(data
, 'sudoers_entry')
1005 command
= etree
.SubElement(sudoers_entry
, 'command')
1006 command
.text
= 'ALL'
1007 user
= etree
.SubElement(sudoers_entry
, 'user')
1009 # Ensure having dispersed principals still works
1010 sudoers_entry
= etree
.SubElement(data
, 'sudoers_entry')
1011 command
= etree
.SubElement(sudoers_entry
, 'command')
1012 command
.text
= 'ALL'
1013 user
= etree
.SubElement(sudoers_entry
, 'user')
1015 listelement
= etree
.SubElement(sudoers_entry
, 'listelement')
1016 principal
= etree
.SubElement(listelement
, 'principal')
1017 principal
.text
= 'fakeu2'
1018 principal
.attrib
['type'] = 'user'
1019 listelement
= etree
.SubElement(sudoers_entry
, 'listelement')
1020 group
= etree
.SubElement(listelement
, 'principal')
1021 group
.text
= 'fakeg2'
1022 group
.attrib
['type'] = 'group'
1023 ret
= stage_file(vgp_xml
, etree
.tostring(stage
, 'utf-8'))
1024 self
.assertTrue(ret
, 'Could not create the target %s' % vgp_xml
)
1026 reg_pol
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
1027 self
.gpo_guid
, 'Machine/Registry.pol')
1029 # Stage the Registry.pol file with test data
1032 e
.keyname
= b
'Software\\Policies\\Samba\\Unix Settings\\Sudo Rights'
1033 e
.valuename
= b
'Software\\Policies\\Samba\\Unix Settings'
1035 e
.data
= b
'fakeu3 ALL=(ALL) NOPASSWD: ALL'
1036 stage
.num_entries
= 1
1038 ret
= stage_file(reg_pol
, ndr_pack(stage
))
1039 self
.assertTrue(ret
, 'Could not create the target %s' % reg_pol
)
1041 sudoer
= 'fakeu ALL=(ALL) NOPASSWD: ALL'
1042 sudoer2
= 'fakeu2,fakeg2% ALL=(ALL) NOPASSWD: ALL'
1043 sudoer_no_principal
= 'ALL ALL=(ALL) NOPASSWD: ALL'
1044 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1046 self
.gpo_guid
, "-H",
1048 os
.environ
["SERVER"],
1050 (os
.environ
["USERNAME"],
1051 os
.environ
["PASSWORD"]))
1052 self
.assertCmdSuccess(result
, out
, err
, 'Sudoers list failed')
1053 self
.assertIn(sudoer
, out
, 'The test entry was not found!')
1054 self
.assertIn(sudoer2
, out
, 'The test entry was not found!')
1055 self
.assertIn(get_string(e
.data
), out
, 'The test entry was not found!')
1056 self
.assertIn(sudoer_no_principal
, out
,
1057 'The test entry was not found!')
1059 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1060 "sudoers", "remove"),
1061 self
.gpo_guid
, sudoer2
,
1063 os
.environ
["SERVER"],
1065 (os
.environ
["USERNAME"],
1066 os
.environ
["PASSWORD"]))
1067 self
.assertCmdSuccess(result
, out
, err
, 'Sudoers remove failed')
1069 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1070 "sudoers", "remove"),
1072 sudoer_no_principal
,
1074 os
.environ
["SERVER"],
1076 (os
.environ
["USERNAME"],
1077 os
.environ
["PASSWORD"]))
1078 self
.assertCmdSuccess(result
, out
, err
, 'Sudoers remove failed')
1080 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1082 self
.gpo_guid
, "-H",
1084 os
.environ
["SERVER"],
1086 (os
.environ
["USERNAME"],
1087 os
.environ
["PASSWORD"]))
1088 self
.assertNotIn(sudoer2
, out
, 'The test entry was still found!')
1089 self
.assertNotIn(sudoer_no_principal
, out
,
1090 'The test entry was still found!')
1092 # Unstage the manifest.xml file
1093 unstage_file(vgp_xml
)
1094 # Unstage the Registry.pol file
1095 unstage_file(reg_pol
)
1097 def test_symlink_list(self
):
1099 lp
.load(os
.environ
['SERVERCONFFILE'])
1100 local_path
= lp
.get('path', 'sysvol')
1101 vgp_xml
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
1102 self
.gpo_guid
, 'Machine/VGP/VTLA/Unix',
1103 'Symlink/manifest.xml')
1104 stage
= etree
.Element('vgppolicy')
1105 policysetting
= etree
.SubElement(stage
, 'policysetting')
1106 pv
= etree
.SubElement(policysetting
, 'version')
1108 name
= etree
.SubElement(policysetting
, 'name')
1109 name
.text
= 'Symlink Policy'
1110 description
= etree
.SubElement(policysetting
, 'description')
1111 description
.text
= 'Specifies symbolic link data'
1112 apply_mode
= etree
.SubElement(policysetting
, 'apply_mode')
1113 apply_mode
.text
= 'merge'
1114 data
= etree
.SubElement(policysetting
, 'data')
1115 file_properties
= etree
.SubElement(data
, 'file_properties')
1116 source
= etree
.SubElement(file_properties
, 'source')
1117 source
.text
= os
.path
.join(self
.tempdir
, 'test.source')
1118 target
= etree
.SubElement(file_properties
, 'target')
1119 target
.text
= os
.path
.join(self
.tempdir
, 'test.target')
1120 ret
= stage_file(vgp_xml
, etree
.tostring(stage
, 'utf-8'))
1121 self
.assertTrue(ret
, 'Could not create the target %s' % vgp_xml
)
1123 symlink
= 'ln -s %s %s' % (source
.text
, target
.text
)
1124 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1126 self
.gpo_guid
, "-H",
1128 os
.environ
["SERVER"],
1130 (os
.environ
["USERNAME"],
1131 os
.environ
["PASSWORD"]))
1132 self
.assertIn(symlink
, out
, 'The test entry was not found!')
1134 # Unstage the manifest.xml file
1135 unstage_file(vgp_xml
)
1137 def test_symlink_add(self
):
1138 source_text
= os
.path
.join(self
.tempdir
, 'test.source')
1139 target_text
= os
.path
.join(self
.tempdir
, 'test.target')
1140 symlink
= 'ln -s %s %s' % (source_text
, target_text
)
1141 before_vers
= gpt_ini_version(self
.gpo_guid
)
1142 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1145 source_text
, target_text
,
1147 os
.environ
["SERVER"],
1149 (os
.environ
["USERNAME"],
1150 os
.environ
["PASSWORD"]))
1151 self
.assertCmdSuccess(result
, out
, err
, 'Symlink add failed')
1152 after_vers
= gpt_ini_version(self
.gpo_guid
)
1153 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1155 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1157 self
.gpo_guid
, "-H",
1159 os
.environ
["SERVER"],
1161 (os
.environ
["USERNAME"],
1162 os
.environ
["PASSWORD"]))
1163 self
.assertIn(symlink
, out
, 'The test entry was not found!')
1165 before_vers
= after_vers
1166 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1167 "symlink", "remove"),
1169 source_text
, target_text
,
1171 os
.environ
["SERVER"],
1173 (os
.environ
["USERNAME"],
1174 os
.environ
["PASSWORD"]))
1175 self
.assertCmdSuccess(result
, out
, err
, 'Symlink remove failed')
1176 after_vers
= gpt_ini_version(self
.gpo_guid
)
1177 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1179 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1181 self
.gpo_guid
, "-H",
1183 os
.environ
["SERVER"],
1185 (os
.environ
["USERNAME"],
1186 os
.environ
["PASSWORD"]))
1187 self
.assertNotIn(symlink
, out
, 'The test entry was not removed!')
1189 def test_files_list(self
):
1191 lp
.load(os
.environ
['SERVERCONFFILE'])
1192 local_path
= lp
.get('path', 'sysvol')
1193 vgp_xml
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
1194 self
.gpo_guid
, 'Machine/VGP/VTLA/Unix',
1195 'Files/manifest.xml')
1196 source_file
= os
.path
.join(local_path
, lp
.get('realm').lower(),
1197 'Policies', self
.gpo_guid
, 'Machine/VGP',
1198 'VTLA/Unix/Files/test.source')
1199 stage
= etree
.Element('vgppolicy')
1200 policysetting
= etree
.SubElement(stage
, 'policysetting')
1201 pv
= etree
.SubElement(policysetting
, 'version')
1203 name
= etree
.SubElement(policysetting
, 'name')
1205 description
= etree
.SubElement(policysetting
, 'description')
1206 description
.text
= 'Represents file data to set/copy on clients'
1207 data
= etree
.SubElement(policysetting
, 'data')
1208 file_properties
= etree
.SubElement(data
, 'file_properties')
1209 source
= etree
.SubElement(file_properties
, 'source')
1210 source
.text
= source_file
1211 target
= etree
.SubElement(file_properties
, 'target')
1212 target
.text
= os
.path
.join(self
.tempdir
, 'test.target')
1213 user
= etree
.SubElement(file_properties
, 'user')
1214 user
.text
= pwd
.getpwuid(os
.getuid()).pw_name
1215 group
= etree
.SubElement(file_properties
, 'group')
1216 group
.text
= grp
.getgrgid(os
.getgid()).gr_name
1218 # Request permissions of 755
1219 permissions
= etree
.SubElement(file_properties
, 'permissions')
1220 permissions
.set('type', 'user')
1221 etree
.SubElement(permissions
, 'read')
1222 etree
.SubElement(permissions
, 'write')
1223 etree
.SubElement(permissions
, 'execute')
1224 permissions
= etree
.SubElement(file_properties
, 'permissions')
1225 permissions
.set('type', 'group')
1226 etree
.SubElement(permissions
, 'read')
1227 etree
.SubElement(permissions
, 'execute')
1228 permissions
= etree
.SubElement(file_properties
, 'permissions')
1229 permissions
.set('type', 'other')
1230 etree
.SubElement(permissions
, 'read')
1231 etree
.SubElement(permissions
, 'execute')
1233 ret
= stage_file(vgp_xml
, etree
.tostring(stage
, 'utf-8'))
1234 self
.assertTrue(ret
, 'Could not create the target %s' % vgp_xml
)
1236 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1238 self
.gpo_guid
, "-H",
1240 os
.environ
["SERVER"],
1242 (os
.environ
["USERNAME"],
1243 os
.environ
["PASSWORD"]))
1244 self
.assertIn(target
.text
, out
, 'The test entry was not found!')
1245 self
.assertIn('-rwxr-xr-x', out
,
1246 'The test entry permissions were not found')
1248 # Unstage the manifest.xml file
1249 unstage_file(vgp_xml
)
1251 def test_files_add(self
):
1253 lp
.load(os
.environ
['SERVERCONFFILE'])
1254 local_path
= lp
.get('path', 'sysvol')
1255 sysvol_source
= os
.path
.join(local_path
, lp
.get('realm').lower(),
1256 'Policies', self
.gpo_guid
, 'Machine/VGP',
1257 'VTLA/Unix/Files/test.source')
1258 source_file
= os
.path
.join(self
.tempdir
, 'test.source')
1259 source_data
= '#!/bin/sh\necho hello world'
1260 with
open(source_file
, 'w') as w
:
1261 w
.write(source_data
)
1262 target_file
= os
.path
.join(self
.tempdir
, 'test.target')
1263 user
= pwd
.getpwuid(os
.getuid()).pw_name
1264 group
= grp
.getgrgid(os
.getgid()).gr_name
1265 before_vers
= gpt_ini_version(self
.gpo_guid
)
1266 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1274 os
.environ
["SERVER"],
1276 (os
.environ
["USERNAME"],
1277 os
.environ
["PASSWORD"]))
1278 self
.assertCmdSuccess(result
, out
, err
, 'File add failed')
1279 self
.assertIn(source_data
, open(sysvol_source
, 'r').read(),
1280 'Failed to find the source file on the sysvol')
1281 after_vers
= gpt_ini_version(self
.gpo_guid
)
1282 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1284 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1286 self
.gpo_guid
, "-H",
1288 os
.environ
["SERVER"],
1290 (os
.environ
["USERNAME"],
1291 os
.environ
["PASSWORD"]))
1292 self
.assertIn(target_file
, out
, 'The test entry was not found!')
1293 self
.assertIn('-rwxr-xr-x', out
,
1294 'The test entry permissions were not found')
1296 os
.unlink(source_file
)
1298 before_vers
= after_vers
1299 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1304 os
.environ
["SERVER"],
1306 (os
.environ
["USERNAME"],
1307 os
.environ
["PASSWORD"]))
1308 self
.assertCmdSuccess(result
, out
, err
, 'File remove failed')
1309 after_vers
= gpt_ini_version(self
.gpo_guid
)
1310 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1312 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1314 self
.gpo_guid
, "-H",
1316 os
.environ
["SERVER"],
1318 (os
.environ
["USERNAME"],
1319 os
.environ
["PASSWORD"]))
1320 self
.assertNotIn(target_file
, out
, 'The test entry was still found!')
1322 def test_vgp_openssh_list(self
):
1324 lp
.load(os
.environ
['SERVERCONFFILE'])
1325 local_path
= lp
.get('path', 'sysvol')
1326 vgp_xml
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
1327 self
.gpo_guid
, 'Machine/VGP/VTLA/SshCfg',
1328 'SshD/manifest.xml')
1330 stage
= etree
.Element('vgppolicy')
1331 policysetting
= etree
.SubElement(stage
, 'policysetting')
1332 pv
= etree
.SubElement(policysetting
, 'version')
1334 name
= etree
.SubElement(policysetting
, 'name')
1335 name
.text
= 'Configuration File'
1336 description
= etree
.SubElement(policysetting
, 'description')
1337 description
.text
= 'Represents Unix configuration file settings'
1338 apply_mode
= etree
.SubElement(policysetting
, 'apply_mode')
1339 apply_mode
.text
= 'merge'
1340 data
= etree
.SubElement(policysetting
, 'data')
1341 configfile
= etree
.SubElement(data
, 'configfile')
1342 etree
.SubElement(configfile
, 'filename')
1343 configsection
= etree
.SubElement(configfile
, 'configsection')
1344 etree
.SubElement(configsection
, 'sectionname')
1345 opt
= etree
.SubElement(configsection
, 'keyvaluepair')
1346 key
= etree
.SubElement(opt
, 'key')
1347 key
.text
= 'KerberosAuthentication'
1348 value
= etree
.SubElement(opt
, 'value')
1350 ret
= stage_file(vgp_xml
, etree
.tostring(stage
, 'utf-8'))
1351 self
.assertTrue(ret
, 'Could not create the target %s' % vgp_xml
)
1353 openssh
= 'KerberosAuthentication Yes'
1354 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1356 self
.gpo_guid
, "-H",
1358 os
.environ
["SERVER"],
1360 (os
.environ
["USERNAME"],
1361 os
.environ
["PASSWORD"]))
1362 self
.assertIn(openssh
, out
, 'The test entry was not found!')
1364 # Unstage the manifest.xml file
1365 unstage_file(vgp_xml
)
1367 def test_vgp_openssh_set(self
):
1368 before_vers
= gpt_ini_version(self
.gpo_guid
)
1369 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1372 "KerberosAuthentication",
1375 os
.environ
["SERVER"],
1377 (os
.environ
["USERNAME"],
1378 os
.environ
["PASSWORD"]))
1379 self
.assertCmdSuccess(result
, out
, err
, 'OpenSSH set failed')
1380 after_vers
= gpt_ini_version(self
.gpo_guid
)
1381 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1383 openssh
= 'KerberosAuthentication Yes'
1384 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1386 self
.gpo_guid
, "-H",
1388 os
.environ
["SERVER"],
1390 (os
.environ
["USERNAME"],
1391 os
.environ
["PASSWORD"]))
1392 self
.assertIn(openssh
, out
, 'The test entry was not found!')
1394 before_vers
= after_vers
1395 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1398 "KerberosAuthentication", "-H",
1400 os
.environ
["SERVER"],
1402 (os
.environ
["USERNAME"],
1403 os
.environ
["PASSWORD"]))
1404 self
.assertCmdSuccess(result
, out
, err
, 'OpenSSH unset failed')
1405 after_vers
= gpt_ini_version(self
.gpo_guid
)
1406 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1408 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1410 self
.gpo_guid
, "-H",
1412 os
.environ
["SERVER"],
1414 (os
.environ
["USERNAME"],
1415 os
.environ
["PASSWORD"]))
1416 self
.assertNotIn(openssh
, out
, 'The test entry was still found!')
1418 def test_startup_script_add(self
):
1421 before_vers
= gpt_ini_version(self
.gpo_guid
)
1422 with
NamedTemporaryFile() as f
:
1423 fname
= os
.path
.basename(f
.name
)
1424 f
.write(b
'#!/bin/sh\necho $@ hello world')
1426 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1427 "scripts", "startup",
1428 "add"), self
.gpo_guid
,
1429 f
.name
, "'-n'", "-H",
1431 os
.environ
["SERVER"],
1433 (os
.environ
["USERNAME"],
1434 os
.environ
["PASSWORD"]))
1435 self
.assertCmdSuccess(result
, out
, err
, 'Script add failed')
1436 after_vers
= gpt_ini_version(self
.gpo_guid
)
1437 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1439 script_path
= '\\'.join(['\\', lp
.get('realm').lower(), 'Policies',
1440 self
.gpo_guid
, 'MACHINE\\VGP\\VTLA\\Unix',
1441 'Scripts\\Startup', fname
])
1442 entry
= '@reboot root %s -n' % script_path
1443 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage", "scripts",
1445 self
.gpo_guid
, "-H",
1447 os
.environ
["SERVER"],
1449 (os
.environ
["USERNAME"],
1450 os
.environ
["PASSWORD"]))
1451 self
.assertIn(entry
, out
, 'The test entry was not found!')
1452 local_path
= lp
.get('path', 'sysvol')
1453 local_script_path
= os
.path
.join(local_path
, lp
.get('realm').lower(),
1454 'Policies', self
.gpo_guid
,
1455 'Machine/VGP/VTLA/Unix',
1456 'Scripts/Startup', fname
)
1457 self
.assertTrue(os
.path
.exists(local_script_path
),
1458 'The test script was not uploaded to the sysvol')
1460 before_vers
= after_vers
1461 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1462 "scripts", "startup",
1463 "remove"), self
.gpo_guid
,
1466 os
.environ
["SERVER"],
1468 (os
.environ
["USERNAME"],
1469 os
.environ
["PASSWORD"]))
1470 self
.assertCmdSuccess(result
, out
, err
, 'Script remove failed')
1471 after_vers
= gpt_ini_version(self
.gpo_guid
)
1472 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1474 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage", "scripts",
1476 self
.gpo_guid
, "-H",
1478 os
.environ
["SERVER"],
1480 (os
.environ
["USERNAME"],
1481 os
.environ
["PASSWORD"]))
1482 self
.assertNotIn(entry
, out
, 'The test entry was still found!')
1484 def test_startup_script_list(self
):
1486 lp
.load(os
.environ
['SERVERCONFFILE'])
1487 local_path
= lp
.get('path', 'sysvol')
1488 vgp_xml
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
1489 self
.gpo_guid
, 'Machine/VGP/VTLA/Unix',
1490 'Scripts/Startup/manifest.xml')
1491 stage
= etree
.Element('vgppolicy')
1492 policysetting
= etree
.SubElement(stage
, 'policysetting')
1493 pv
= etree
.SubElement(policysetting
, 'version')
1495 name
= etree
.SubElement(policysetting
, 'name')
1496 name
.text
= 'Unix Scripts'
1497 description
= etree
.SubElement(policysetting
, 'description')
1498 description
.text
= 'Represents Unix scripts to run on Group Policy clients'
1499 data
= etree
.SubElement(policysetting
, 'data')
1500 listelement
= etree
.SubElement(data
, 'listelement')
1501 script
= etree
.SubElement(listelement
, 'script')
1502 script
.text
= 'test.sh'
1503 parameters
= etree
.SubElement(listelement
, 'parameters')
1504 parameters
.text
= '-e'
1505 ret
= stage_file(vgp_xml
, etree
.tostring(stage
, 'utf-8'))
1506 self
.assertTrue(ret
, 'Could not create the target %s' % vgp_xml
)
1508 script_path
= '\\'.join(['\\', lp
.get('realm').lower(), 'Policies',
1509 self
.gpo_guid
, 'MACHINE\\VGP\\VTLA\\Unix',
1510 'Scripts\\Startup', script
.text
])
1511 entry
= '@reboot root %s %s' % (script_path
, parameters
.text
)
1512 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage", "scripts",
1514 self
.gpo_guid
, "-H",
1516 os
.environ
["SERVER"],
1518 (os
.environ
["USERNAME"],
1519 os
.environ
["PASSWORD"]))
1520 self
.assertIn(entry
, out
, 'The test entry was not found!')
1522 # Unstage the manifest.xml file
1523 unstage_file(vgp_xml
)
1525 def test_vgp_motd_set(self
):
1526 text
= 'This is the message of the day'
1527 msg
= '"%s\n"' % text
1528 before_vers
= gpt_ini_version(self
.gpo_guid
)
1529 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1534 os
.environ
["SERVER"],
1536 (os
.environ
["USERNAME"],
1537 os
.environ
["PASSWORD"]))
1538 self
.assertCmdSuccess(result
, out
, err
, 'MOTD set failed')
1539 after_vers
= gpt_ini_version(self
.gpo_guid
)
1540 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1542 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1544 self
.gpo_guid
, "-H",
1546 os
.environ
["SERVER"],
1548 (os
.environ
["USERNAME"],
1549 os
.environ
["PASSWORD"]))
1550 self
.assertIn(text
, out
, 'The test entry was not found!')
1552 before_vers
= after_vers
1553 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1555 self
.gpo_guid
, "-H",
1557 os
.environ
["SERVER"],
1559 (os
.environ
["USERNAME"],
1560 os
.environ
["PASSWORD"]))
1561 self
.assertCmdSuccess(result
, out
, err
, 'MOTD unset failed')
1562 after_vers
= gpt_ini_version(self
.gpo_guid
)
1563 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1565 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1567 self
.gpo_guid
, "-H",
1569 os
.environ
["SERVER"],
1571 (os
.environ
["USERNAME"],
1572 os
.environ
["PASSWORD"]))
1573 self
.assertNotIn(text
, out
, 'The test entry was still found!')
1575 def test_vgp_motd(self
):
1577 lp
.load(os
.environ
['SERVERCONFFILE'])
1578 local_path
= lp
.get('path', 'sysvol')
1579 vgp_xml
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
1580 self
.gpo_guid
, 'Machine/VGP/VTLA/Unix',
1581 'MOTD/manifest.xml')
1583 stage
= etree
.Element('vgppolicy')
1584 policysetting
= etree
.SubElement(stage
, 'policysetting')
1585 pv
= etree
.SubElement(policysetting
, 'version')
1587 name
= etree
.SubElement(policysetting
, 'name')
1588 name
.text
= 'Text File'
1589 description
= etree
.SubElement(policysetting
, 'description')
1590 description
.text
= 'Represents a Generic Text File'
1591 apply_mode
= etree
.SubElement(policysetting
, 'apply_mode')
1592 apply_mode
.text
= 'replace'
1593 data
= etree
.SubElement(policysetting
, 'data')
1594 filename
= etree
.SubElement(data
, 'filename')
1595 filename
.text
= 'motd'
1596 text
= etree
.SubElement(data
, 'text')
1597 text
.text
= 'This is a message of the day'
1598 ret
= stage_file(vgp_xml
, etree
.tostring(stage
, 'utf-8'))
1599 self
.assertTrue(ret
, 'Could not create the target %s' % vgp_xml
)
1601 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1603 self
.gpo_guid
, "-H",
1605 os
.environ
["SERVER"],
1607 (os
.environ
["USERNAME"],
1608 os
.environ
["PASSWORD"]))
1609 self
.assertIn(text
.text
, out
, 'The test entry was not found!')
1611 # Unstage the manifest.xml file
1612 unstage_file(vgp_xml
)
1614 def test_vgp_issue_list(self
):
1616 lp
.load(os
.environ
['SERVERCONFFILE'])
1617 local_path
= lp
.get('path', 'sysvol')
1618 vgp_xml
= os
.path
.join(local_path
, lp
.get('realm').lower(), 'Policies',
1619 self
.gpo_guid
, 'Machine/VGP/VTLA/Unix',
1620 'Issue/manifest.xml')
1622 stage
= etree
.Element('vgppolicy')
1623 policysetting
= etree
.SubElement(stage
, 'policysetting')
1624 pv
= etree
.SubElement(policysetting
, 'version')
1626 name
= etree
.SubElement(policysetting
, 'name')
1627 name
.text
= 'Text File'
1628 description
= etree
.SubElement(policysetting
, 'description')
1629 description
.text
= 'Represents a Generic Text File'
1630 apply_mode
= etree
.SubElement(policysetting
, 'apply_mode')
1631 apply_mode
.text
= 'replace'
1632 data
= etree
.SubElement(policysetting
, 'data')
1633 filename
= etree
.SubElement(data
, 'filename')
1634 filename
.text
= 'issue'
1635 text
= etree
.SubElement(data
, 'text')
1636 text
.text
= 'Welcome to Samba!'
1637 ret
= stage_file(vgp_xml
, etree
.tostring(stage
, 'utf-8'))
1638 self
.assertTrue(ret
, 'Could not create the target %s' % vgp_xml
)
1640 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1642 self
.gpo_guid
, "-H",
1644 os
.environ
["SERVER"],
1646 (os
.environ
["USERNAME"],
1647 os
.environ
["PASSWORD"]))
1648 self
.assertIn(text
.text
, out
, 'The test entry was not found!')
1650 # Unstage the manifest.xml file
1651 unstage_file(vgp_xml
)
1653 def test_vgp_issue_set(self
):
1654 text
= 'Welcome to Samba!'
1655 msg
= '"%s\n"' % text
1656 before_vers
= gpt_ini_version(self
.gpo_guid
)
1657 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1662 os
.environ
["SERVER"],
1664 (os
.environ
["USERNAME"],
1665 os
.environ
["PASSWORD"]))
1666 self
.assertCmdSuccess(result
, out
, err
, 'Issue set failed')
1667 after_vers
= gpt_ini_version(self
.gpo_guid
)
1668 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1670 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1672 self
.gpo_guid
, "-H",
1674 os
.environ
["SERVER"],
1676 (os
.environ
["USERNAME"],
1677 os
.environ
["PASSWORD"]))
1678 self
.assertIn(text
, out
, 'The test entry was not found!')
1680 before_vers
= after_vers
1681 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1683 self
.gpo_guid
, "-H",
1685 os
.environ
["SERVER"],
1687 (os
.environ
["USERNAME"],
1688 os
.environ
["PASSWORD"]))
1689 self
.assertCmdSuccess(result
, out
, err
, 'Issue unset failed')
1690 after_vers
= gpt_ini_version(self
.gpo_guid
)
1691 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1693 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("manage",
1695 self
.gpo_guid
, "-H",
1697 os
.environ
["SERVER"],
1699 (os
.environ
["USERNAME"],
1700 os
.environ
["PASSWORD"]))
1701 self
.assertNotIn(text
, out
, 'The test entry was still found!')
1703 def test_load_show_remove(self
):
1704 before_vers
= gpt_ini_version(self
.gpo_guid
)
1705 with
NamedTemporaryFile() as f
:
1706 f
.write(gpo_load_json
)
1708 (result
, out
, err
) = self
.runsubcmd("gpo", "load",
1710 "--content=%s" % f
.name
,
1711 "--machine-ext-name=%s" %
1713 "--user-ext-name=%s" %
1716 os
.environ
["SERVER"],
1718 (os
.environ
["USERNAME"],
1719 os
.environ
["PASSWORD"]))
1720 self
.assertCmdSuccess(result
, out
, err
, 'Loading policy failed')
1721 after_vers
= gpt_ini_version(self
.gpo_guid
)
1722 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1724 before_vers
= after_vers
1725 # Write the default registry extension
1726 with
NamedTemporaryFile() as f
:
1727 f
.write(b
'[]') # Intentionally empty policy
1729 # Load an empty policy, taking the default client extension
1730 (result
, out
, err
) = self
.runsubcmd("gpo", "load",
1732 "--content=%s" % f
.name
,
1734 os
.environ
["SERVER"],
1736 (os
.environ
["USERNAME"],
1737 os
.environ
["PASSWORD"]))
1738 self
.assertCmdSuccess(result
, out
, err
, 'Loading policy failed')
1739 after_vers
= gpt_ini_version(self
.gpo_guid
)
1740 self
.assertEqual(after_vers
, before_vers
,
1741 'GPT.INI changed on empty merge')
1743 (result
, out
, err
) = self
.runsubcmd("gpo", "show", self
.gpo_guid
, "-H",
1744 "ldap://%s" % os
.environ
["SERVER"])
1745 self
.assertCmdSuccess(result
, out
, err
, 'Failed to fetch gpos')
1746 self
.assertIn('homepage', out
, 'Homepage policy not loaded')
1747 self
.assertIn('samba.org', out
, 'Homepage policy not loaded')
1748 self
.assertIn(ext_guids
[0], out
, 'Machine extension not loaded')
1749 self
.assertIn(ext_guids
[1], out
, 'User extension not loaded')
1750 self
.assertIn('{35378eac-683f-11d2-a89a-00c04fbbcfa2}', out
,
1751 'Default extension not loaded')
1752 toolbar_data
= '"valuename": "IEToolbar",\n "class": "USER",' + \
1753 '\n "type": "REG_BINARY",' + \
1754 '\n "data": [\n 0\n ]'
1755 self
.assertIn(toolbar_data
, out
, 'Toolbar policy not loaded')
1756 restrict_data
= '"valuename": "RestrictImplicitTextCollection",' + \
1757 '\n "class": "USER",' + \
1758 '\n "type": "REG_DWORD",\n "data": 1\n'
1759 self
.assertIn(restrict_data
, out
, 'Restrict policy not loaded')
1760 ext_data
= '" \\"key\\": \\"value\\"",'
1761 self
.assertIn(ext_data
, out
, 'Extension policy not loaded')
1763 before_vers
= after_vers
1764 with
NamedTemporaryFile() as f
:
1765 f
.write(gpo_remove_json
)
1767 (result
, out
, err
) = self
.runsubcmd("gpo", "remove",
1769 "--content=%s" % f
.name
,
1770 "--machine-ext-name=%s" %
1772 "--user-ext-name=%s" %
1775 os
.environ
["SERVER"],
1777 (os
.environ
["USERNAME"],
1778 os
.environ
["PASSWORD"]))
1779 self
.assertCmdSuccess(result
, out
, err
, 'Removing policy failed')
1780 after_vers
= gpt_ini_version(self
.gpo_guid
)
1781 self
.assertGreater(after_vers
, before_vers
, 'GPT.INI was not updated')
1783 (result
, out
, err
) = self
.runsubcmd("gpo", "show", self
.gpo_guid
, "-H",
1784 "ldap://%s" % os
.environ
["SERVER"])
1785 self
.assertCmdSuccess(result
, out
, err
, 'Failed to fetch gpos')
1786 self
.assertNotIn('samba.org', out
, 'Homepage policy not removed')
1787 self
.assertNotIn(ext_guids
[0], out
, 'Machine extension not unloaded')
1788 self
.assertNotIn(ext_guids
[1], out
, 'User extension not unloaded')
1790 def test_cse_register_unregister_list(self
):
1791 with
NamedTemporaryFile() as f
:
1792 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("cse",
1794 f
.name
, 'gp_test_ext',
1796 self
.assertCmdSuccess(result
, out
, err
, 'CSE register failed')
1798 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("cse",
1800 self
.assertIn(f
.name
, out
, 'The test cse was not found')
1801 self
.assertIn('ProcessGroupPolicy : gp_test_ext', out
,
1802 'The test cse was not found')
1803 self
.assertIn('MachinePolicy : True', out
,
1804 'The test cse was not enabled')
1805 self
.assertIn('UserPolicy : False', out
,
1806 'The test cse should not have User policy enabled')
1807 cse_ext
= re
.findall(r
'^UniqueGUID\s+:\s+(.*)', out
)
1808 self
.assertEqual(len(cse_ext
), 1,
1809 'The test cse GUID was not found')
1810 cse_ext
= cse_ext
[0]
1811 self
.assertTrue(check_guid(cse_ext
),
1812 'The test cse GUID was not formatted correctly')
1814 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("cse",
1817 self
.assertCmdSuccess(result
, out
, err
, 'CSE unregister failed')
1819 (result
, out
, err
) = self
.runsublevelcmd("gpo", ("cse",
1821 self
.assertNotIn(f
.name
, out
, 'The test cse was still found')
1824 """set up a temporary GPO to work with"""
1826 (result
, out
, err
) = self
.runsubcmd("gpo", "create", self
.gpo_name
,
1827 "-H", "ldap://%s" % os
.environ
["SERVER"],
1828 "-U%s%%%s" % (os
.environ
["USERNAME"], os
.environ
["PASSWORD"]),
1829 "--tmpdir", self
.tempdir
)
1830 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo created successfully")
1831 shutil
.rmtree(os
.path
.join(self
.tempdir
, "policy"))
1833 self
.gpo_guid
= "{%s}" % out
.split("{")[1].split("}")[0]
1835 self
.fail("Failed to find GUID in output: %s" % out
)
1837 self
.backup_path
= os
.path
.join(samba
.source_tree_topdir(), 'source4',
1838 'selftest', 'provisions',
1839 'generalized-gpo-backup')
1841 self
.entity_file
= os
.path
.join(self
.backup_path
, 'entities')
1844 """remove the temporary GPO to work with"""
1845 (result
, out
, err
) = self
.runsubcmd("gpo", "del", self
.gpo_guid
, "-H", "ldap://%s" % os
.environ
["SERVER"], "-U%s%%%s" % (os
.environ
["USERNAME"], os
.environ
["PASSWORD"]))
1846 self
.assertCmdSuccess(result
, out
, err
, "Ensuring gpo deleted successfully")