Index: modules/univention/s4connector/s4/dns.py =================================================================== --- modules/univention/s4connector/s4/dns.py (Revision 62969) +++ modules/univention/s4connector/s4/dns.py (Arbeitskopie) @@ -38,7 +38,7 @@ from univention.s4connector.s4.dc import _unixTimeInverval2seconds from univention.admin.mapping import unmapUNIX_TimeInterval -from samba.dcerpc import dnsp +from samba.dcerpc import dnsp, misc from samba.ndr import ndr_pack, ndr_unpack, ndr_print import copy import time @@ -888,7 +888,7 @@ superordinate=s4connector_get_superordinate('dns/host_record', s4connector.lo, searchResult[0][0]) newRecord= univention.admin.handlers.dns.host_record.object(None, s4connector.lo, position=None, dn=searchResult[0][0], superordinate=superordinate, attributes=[], update_zone=False) newRecord.open() - newRecord.delete() + newRecord.remove() else: ud.debug(ud.LDAP, ud.INFO, 'ucs_host_record_delete: Object was not found, filter was: ((&(relativeDomainName=%s)(zoneName=%s))' % (relativeDomainName, zoneName)) @@ -954,7 +954,7 @@ superordinate=s4connector_get_superordinate('dns/ptr_record', s4connector.lo, searchResult[0][0]) newRecord= univention.admin.handlers.dns.ptr_record.object(None, s4connector.lo, position=None, dn=searchResult[0][0], superordinate=superordinate, attributes=[], update_zone=False) newRecord.open() - newRecord.delete() + newRecord.remove() else: ud.debug(ud.LDAP, ud.INFO, 'ucs_ptr_record_delete: Object was not found, filter was: ((&(relativeDomainName=%s)(zoneName=%s))' % (relativeDomainName, zoneName)) @@ -1008,7 +1008,7 @@ superordinate=s4connector_get_superordinate('dns/alias', s4connector.lo, searchResult[0][0]) newRecord= univention.admin.handlers.dns.alias.object(None, s4connector.lo, position=None, dn=searchResult[0][0], superordinate=superordinate, attributes=[], update_zone=False) newRecord.open() - newRecord.delete() + newRecord.remove() else: ud.debug(ud.LDAP, ud.INFO, 'ucs_cname_delete: Object was not found, filter was: ((&(relativeDomainName=%s)(zoneName=%s))' % (relativeDomainName, zoneName)) @@ -1095,7 +1095,7 @@ superordinate=s4connector_get_superordinate('dns/srv_record', s4connector.lo, searchResult[0][0]) newRecord= univention.admin.handlers.dns.srv_record.object(None, s4connector.lo, position=None, dn=searchResult[0][0], superordinate=superordinate, attributes=[], update_zone=False) newRecord.open() - newRecord.delete() + newRecord.remove() else: ud.debug(ud.LDAP, ud.INFO, 'ucs_srv_record_delete: Object was not found, filter was: ((&(relativeDomainName=%s)(zoneName=%s))' % (relativeDomainName, zoneName)) @@ -1253,7 +1253,7 @@ elif dns_type == 'reverse_zone': zone= univention.admin.handlers.dns.reverse_zone.object(None, s4connector.lo, position=None, dn=searchResult[0][0], superordinate=None, attributes=[], update_zone=False) zone.open() - zone.delete() + zone.remove() @@ -1305,6 +1305,7 @@ for dnsRecord in dnsRecords: dnsRecord=dnsRecord.encode('latin1') dnsRecord_DnssrvRpcRecord=ndr_unpack(dnsp.DnssrvRpcRecord, dnsRecord) + ud.debug(ud.LDAP, ud.INFO, "_identify_dns_con_object: DEBUG: %s" % (ndr_print(dnsRecord_DnssrvRpcRecord),)) dns_types.add(dnsRecord_DnssrvRpcRecord.wType) if dnsp.DNS_TYPE_PTR in dns_types: @@ -1376,6 +1377,11 @@ s4_dns_node_base_delete(s4connector, object) # ignore move + if object['modtype'] in ['delete']: + ## probably we should also do this (see s4/__init__.py): + entryUUID = object['attributes']['entryUUID'][0] + s4connector.update_deleted_cache_after_removal(entryUUID, guid) + return True def con2ucs (s4connector, key, object): @@ -1383,9 +1389,27 @@ ud.debug(ud.LDAP, ud.INFO, 'dns con2ucs: Object (%s): %s' % (object['dn'], object)) - dns_type=_identify_dns_con_object(s4connector, object) + guid_unicode = object.get('attributes').get('objectGUID')[0] + guid_blob = guid_unicode.encode('ISO-8859-1') ## to compensate for __object_from_element + guid = str(ndr_unpack(misc.GUID, guid_blob)) + ud.debug(ud.LDAP, ud.INFO, 'dns con2ucs: modtype %s' % (object['modtype'],)) + dns_type = None + if object['modtype'] == 'modify': + if object['attributes'].get('dNSTombstoned', [None])[0] == 'TRUE': + ud.debug(ud.LDAP, ud.INFO, 'dns con2ucs: got tombstoned object') + object['modtype']='delete' + old_s4_object = s4connector.s4cache.get_entry(guid) + if old_s4_object: + ud.debug(ud.LDAP, ud.INFO, 'dns con2ucs: Got old_s4_object: %s' % old_s4_object) + dns_type=_identify_dns_con_object(s4connector, {'attributes': old_s4_object}) + else: + ud.debug(ud.LDAP, ud.WARN, 'dns con2ucs: Can\'t figure out type of tombstoned object, old_s4_object not found in s4cache') + if not dns_type: + dns_type=_identify_dns_con_object(s4connector, object) + + if not dns_type: # unknown object -> ignore ud.debug(ud.LDAP, ud.INFO, 'dns con2ucs: Ignore unkown dns object: %s' % object['dn']) return True @@ -1432,6 +1456,14 @@ ucs_zone_delete(s4connector, object, dns_type) # ignore move + if object['modtype'] in ['add', 'modify']: + s4connector.s4cache.add_entry(guid, object.get('attributes')) + elif object['modtype'] in ['delete']: + s4connector.s4cache.remove_entry(guid) + ## probably we should also do this (see __init__.py): + entryUUID = self._get_entryUUID(object['dn']) + s4connector.update_deleted_cache_after_removal(entryUUID, guid) + return True '''