5 sys.path.insert(0, "bin/python")
11 from samba.ndr import ndr_unpack, ndr_print
12 from samba.dcerpc import smbXsrv
13 from samba.dcerpc import server_id
16 def print_watchers(num_watched, blob):
17 for i in range(0,num_watched):
18 id = ndr_unpack(server_id.server_id, blob[:24])
22 def print_record(data, ndr_type, watched, ctdb):
26 (rsn, dmaster, reserved1, flags) = struct.unpack('QIII', bytes(blob[:20]))
28 print(" ctdb record header: rsn=%lu, dmaster=%u, reserved1=0x%x, flags=0x%x len=%u" %
29 (rsn, dmaster, reserved1, flags, len(blob)))
34 (num_watched, ) = struct.unpack('I', bytes(blob[:4]))
38 deleted = num_watched & deleted_bit
40 num_watched = num_watched & ~deleted_bit
46 print(" num_watched: %d, deleted: %s" % (num_watched, deleted_str))
47 print_watchers(num_watched, blob)
48 blob = blob[num_watched*4:]
50 unpacked = ndr_unpack(ndr_type, blob, allow_remaining=True)
51 print(ndr_print(unpacked))
53 if __name__ == "__main__":
54 parser = argparse.ArgumentParser()
55 parser.add_argument('path', help='Path to the TDB file')
56 parser.add_argument('-c', '--ctdb',
59 help='The TDB database is from a ctdb cluster')
60 args = parser.parse_args()
63 if 'smbXsrv_session' in args.path:
64 ndr_type = smbXsrv.session_globalB
66 elif 'smbXsrv_open' in args.path:
67 ndr_type = smbXsrv.open_globalB
68 elif 'smbXsrv_client' in args.path:
69 ndr_type = smbXsrv.client_globalB
71 elif 'smbXsrv_tcon' in args.path:
72 ndr_type = smbXsrv.tcon_globalB
73 elif 'smbXsrv_version' in args.path:
74 ndr_type = smbXsrv.version_globalB
76 raise Exception("Failed to guess NDR type")
78 tdb = tdb.Tdb(args.path, 0, tdb.INCOMPATIBLE_HASH, os.O_RDONLY)
83 print("Record: %d" % i)
84 print_record(data, ndr_type, watched, args.ctdb)