source: vendor/current/source4/scripting/devel/demodirsync.py

Last change on this file was 988, checked in by Silvan Scherrer, 9 years ago

Samba Server: update vendor to version 4.4.3

File size: 5.7 KB
Line 
1#!/usr/bin/python
2
3
4import optparse
5import sys
6import base64
7
8sys.path.insert(0, "bin/python")
9
10import samba.getopt as options
11from samba.dcerpc import drsblobs, misc
12from samba.ndr import ndr_pack, ndr_unpack
13from samba import Ldb
14
15parser = optparse.OptionParser("get-descriptor [options]")
16sambaopts = options.SambaOptions(parser)
17credopts = options.CredentialsOptions(parser)
18parser.add_option_group(credopts)
19
20parser.add_option("-b", type="string", metavar="BASE",
21 help="set base DN for the search")
22parser.add_option("--host", type="string", metavar="HOST",
23 help="Ip of the host")
24
25lp = sambaopts.get_loadparm()
26creds = credopts.get_credentials(lp)
27
28opts = parser.parse_args()[0]
29
30def printdirsync(ctl):
31 arr = ctl.split(':')
32 if arr[0] == 'dirsync':
33 print "Need to continue: %s" % arr[1]
34 cookie = ndr_unpack(drsblobs.ldapControlDirSyncCookie, base64.b64decode(arr[3]))
35 print "DC's NTDS guid: %s " % cookie.blob.guid1
36 print "highest usn %s" % cookie.blob.highwatermark.highest_usn
37 print "tmp higest usn %s" % cookie.blob.highwatermark.tmp_highest_usn
38 print "reserved usn %s" % cookie.blob.highwatermark.reserved_usn
39 if cookie.blob.extra_length >0:
40 print "highest usn in extra %s" % cookie.blob.extra.ctr.cursors[0].highest_usn
41 return cookie
42
43remote_ldb= Ldb("ldap://" + opts.host + ":389", credentials=creds, lp=lp)
44tab = []
45if opts.b:
46 base = opts.b
47else:
48 base = None
49
50guid = None
51(msgs, ctrls) = remote_ldb.search(expression="(samaccountname=administrator)", base=base, attrs=["objectClass"], controls=["dirsync:1:1:50"])
52if (len(ctrls)):
53 for ctl in ctrls:
54 arr = ctl.split(':')
55 if arr[0] == 'dirsync':
56 cookie = ndr_unpack(drsblobs.ldapControlDirSyncCookie, base64.b64decode(arr[3]))
57 guid = cookie.blob.guid1
58 pass
59if not guid:
60 print "No dirsync control ... strange"
61 sys.exit(1)
62
63print ""
64print "Getting first guest without any cookie"
65(msgs, ctrls) = remote_ldb.searchex(expression="(samaccountname=guest)", base=base, attrs=["objectClass"], controls=["dirsync:1:1:50"])
66cookie = None
67if (len(ctrls)):
68 for ctl in ctrls:
69 cookie = printdirsync(ctl)
70 print "Returned %d entries" % len(msgs)
71
72savedcookie = cookie
73
74print ""
75print "Getting allusers with cookie"
76controls=["dirsync:1:1:50:%s" % base64.b64encode(ndr_pack(cookie))]
77(msgs, ctrls) = remote_ldb.searchex(expression="(samaccountname=*)", base=base, attrs=["objectClass"], controls=controls)
78if (len(ctrls)):
79 for ctl in ctrls:
80 cookie = printdirsync(ctl)
81 print "Returned %d entries" % len(msgs)
82
83cookie = savedcookie
84cookie.blob.guid1 = misc.GUID("128a99bf-e2df-4832-ac0a-1fb625e530db")
85if cookie.blob.extra_length > 0:
86 cookie.blob.extra.ctr.cursors[0].source_dsa_invocation_id = misc.GUID("128a99bf-e2df-4832-ac0a-1fb625e530db")
87
88print ""
89print "Getting all the entries"
90controls=["dirsync:1:1:50:%s" % base64.b64encode(ndr_pack(cookie))]
91(msgs, ctrls) = remote_ldb.searchex(expression="(objectclass=*)", base=base, controls=controls)
92cont = 0
93if (len(ctrls)):
94 for ctl in ctrls:
95 cookie = printdirsync(ctl)
96 if cookie != None:
97 cont = (ctl.split(':'))[1]
98 print "Returned %d entries" % len(msgs)
99
100usn = cookie.blob.highwatermark.tmp_highest_usn
101if cookie.blob.extra_length > 0:
102 bigusn = cookie.blob.extra.ctr.cursors[0].highest_usn
103else:
104 bigusn = usn + 1000
105while (cont == "1"):
106 print ""
107 controls=["dirsync:1:1:50:%s" % base64.b64encode(ndr_pack(cookie))]
108 (msgs, ctrls) = remote_ldb.searchex(expression="(objectclass=*)", base=base, controls=controls)
109 if (len(ctrls)):
110 for ctl in ctrls:
111 cookie = printdirsync(ctl)
112 if cookie != None:
113 cont = (ctl.split(':'))[1]
114 print "Returned %d entries" % len(msgs)
115
116print ""
117print "Getting with cookie but usn changed to %d we should use the one in extra" % (bigusn - 1)
118cookie.blob.highwatermark.highest_usn = 0
119cookie.blob.highwatermark.tmp_highest_usn = usn - 2
120if cookie.blob.extra_length > 0:
121 print "here"
122 cookie.blob.extra.ctr.cursors[0].highest_usn = bigusn - 1
123controls=["dirsync:1:1:50:%s" % base64.b64encode(ndr_pack(cookie))]
124(msgs, ctrls) = remote_ldb.searchex(expression="(objectclass=*)", base=base, controls=controls)
125if (len(ctrls)):
126 for ctl in ctrls:
127 cookie = printdirsync(ctl)
128 print "Returned %d entries" % len(msgs)
129
130print ""
131print "Getting with cookie but usn %d changed and extra/cursor GUID too" % (usn - 2)
132print " so that it's (tmp)highest_usn that drives the limit"
133cookie.blob.highwatermark.highest_usn = 0
134cookie.blob.highwatermark.tmp_highest_usn = usn - 2
135if cookie.blob.extra_length > 0:
136 cookie.blob.extra.ctr.cursors[0].source_dsa_invocation_id = misc.GUID("128a99bf-e2df-4832-ac0a-1fb625e530db")
137 cookie.blob.extra.ctr.cursors[0].highest_usn = bigusn - 1
138controls=["dirsync:1:1:50:%s" % base64.b64encode(ndr_pack(cookie))]
139(msgs, ctrls) = remote_ldb.searchex(expression="(objectclass=*)", base=base, controls=controls)
140if (len(ctrls)):
141 for ctl in ctrls:
142 cookie = printdirsync(ctl)
143 print "Returned %d entries" % len(msgs)
144
145print ""
146print "Getting with cookie but usn changed to %d" % (usn - 2)
147cookie.blob.highwatermark.highest_usn = 0
148cookie.blob.highwatermark.tmp_highest_usn = (usn - 2)
149if cookie.blob.extra_length > 0:
150 cookie.blob.extra.ctr.cursors[0].highest_usn = (usn - 2)
151controls=["dirsync:1:1:50:%s" % base64.b64encode(ndr_pack(cookie))]
152(msgs, ctrls) = remote_ldb.searchex(expression="(objectclass=*)", base=base, controls=controls)
153if (len(ctrls)):
154 for ctl in ctrls:
155 cookie = printdirsync(ctl)
156 print "Returned %d entries" % len(msgs)
Note: See TracBrowser for help on using the repository browser.