View | Details | Raw Unified | Return to bug 41571
Collapse All | Expand All

(-)modules/univention/s4connector/__init__.py (-7 / +19 lines)
 Lines 46-51    Link Here 
46
import univention.admin.modules
46
import univention.admin.modules
47
import univention.admin.objects
47
import univention.admin.objects
48
import univention.debug2 as ud
48
import univention.debug2 as ud
49
import univention.debug as ud_c
49
from samba.ndr import ndr_unpack
50
from samba.ndr import ndr_unpack
50
from samba.dcerpc import misc
51
from samba.dcerpc import misc
51
from signal import signal, SIGTERM, SIG_DFL
52
from signal import signal, SIGTERM, SIG_DFL
 Lines 547-552    Link Here 
547
			debug_level = 2
548
			debug_level = 2
548
		ud.set_level(ud.LDAP, int(debug_level))
549
		ud.set_level(ud.LDAP, int(debug_level))
549
550
551
		try:
552
			udm_function_level = int(self.baseConfig.get('%s/debug/udm/function' % self.CONFIGBASENAME, 0))
553
		except ValueError:
554
			function_level = 0
555
		ud_c.init('/var/log/univention/%s-s4.log' % self.CONFIGBASENAME, 1, udm_function_level)
556
		try:
557
			udm_debug_level = int(self.baseConfig.get('%s/debug/udm/level' % self.CONFIGBASENAME, 1))
558
		except ValueError:
559
			udm_debug_level = 1
560
		ud_c.set_level(ud.ADMIN, int(udm_debug_level))
561
550
	def close_debug(self):
562
	def close_debug(self):
551
		_d = ud.function('ldap.close_debug')
563
		_d = ud.function('ldap.close_debug')
552
		ud.debug(ud.LDAP, ud.INFO, "close debug")
564
		ud.debug(ud.LDAP, ud.INFO, "close debug")
 Lines 698-704    Link Here 
698
		'''
710
		'''
699
		return dn.split(',', 1)[1]
711
		return dn.split(',', 1)[1]
700
712
701
	def __sync_file_from_ucs(self, filename, append_error='', traceback_level=ud.WARN):
713
	def __sync_file_from_ucs(self, filename, append_error='', traceback_level=ud.WARN, reject_if_s4_changed=False):
702
		_d = ud.function('ldap._sync_file_from_ucs')
714
		_d = ud.function('ldap._sync_file_from_ucs')
703
		'''
715
		'''
704
		sync changes from UCS stored in given file
716
		sync changes from UCS stored in given file
 Lines 839-845    Link Here 
839
				if not self._ignore_object(key, object) or ignore_subtree_match:
851
				if not self._ignore_object(key, object) or ignore_subtree_match:
840
					ud.debug(ud.LDAP, ud.INFO, "__sync_file_from_ucs: finished mapping")
852
					ud.debug(ud.LDAP, ud.INFO, "__sync_file_from_ucs: finished mapping")
841
					try:
853
					try:
842
						if ((old_dn and not self.sync_from_ucs(key, object, premapped_ucs_dn, unicode(old_dn, 'utf8'), old, new)) or (not old_dn and not self.sync_from_ucs(key, object, premapped_ucs_dn, old_dn, old, new))):
854
						if ((old_dn and not self.sync_from_ucs(key, object, premapped_ucs_dn, unicode(old_dn, 'utf8'), old, new, reject_if_s4_changed)) or (not old_dn and not self.sync_from_ucs(key, object, premapped_ucs_dn, old_dn, old, new, reject_if_s4_changed))):
843
							self._save_rejected_ucs(filename, dn)
855
							self._save_rejected_ucs(filename, dn)
844
							return False
856
							return False
845
						else:
857
						else:
 Lines 968-974    Link Here 
968
		# dummy
980
		# dummy
969
		pass
981
		pass
970
982
971
	def resync_rejected_ucs(self):
983
	def resync_rejected_ucs(self, reject_if_s4_changed=False):
972
		'''
984
		'''
973
		tries to resync rejected changes from UCS
985
		tries to resync rejected changes from UCS
974
		'''
986
		'''
 Lines 983-989    Link Here 
983
			for filename, dn in rejected:
995
			for filename, dn in rejected:
984
				ud.debug(ud.LDAP, ud.PROCESS, 'sync from ucs:   Resync rejected file: %s' % (filename))
996
				ud.debug(ud.LDAP, ud.PROCESS, 'sync from ucs:   Resync rejected file: %s' % (filename))
985
				try:
997
				try:
986
					if self.__sync_file_from_ucs(filename, append_error=' rejected'):
998
					if self.__sync_file_from_ucs(filename, append_error=' rejected', reject_if_s4_changed=reject_if_s4_changed):
987
						try:
999
						try:
988
							os.remove(os.path.join(filename))
1000
							os.remove(os.path.join(filename))
989
						except OSError:  # file not found
1001
						except OSError:  # file not found
 Lines 1004-1010    Link Here 
1004
		# dummy
1016
		# dummy
1005
		pass
1017
		pass
1006
1018
1007
	def poll_ucs(self):
1019
	def poll_ucs(self, reject_if_s4_changed=False):
1008
		'''
1020
		'''
1009
		poll changes from UCS: iterates over files exported by directory-listener module
1021
		poll changes from UCS: iterates over files exported by directory-listener module
1010
		'''
1022
		'''
 Lines 1044-1050    Link Here 
1044
1056
1045
					for i in [0, 1]:  # do it twice if the LDAP connection was closed
1057
					for i in [0, 1]:  # do it twice if the LDAP connection was closed
1046
						try:
1058
						try:
1047
							sync_successfull = self.__sync_file_from_ucs(filename, traceback_level=traceback_level)
1059
							sync_successfull = self.__sync_file_from_ucs(filename, traceback_level=traceback_level, reject_if_s4_changed=reject_if_s4_changed)
1048
						except (ldap.SERVER_DOWN, SystemExit):
1060
						except (ldap.SERVER_DOWN, SystemExit):
1049
							# once again, ldap idletimeout ...
1061
							# once again, ldap idletimeout ...
1050
							if i == 0:
1062
							if i == 0:
 Lines 1532-1538    Link Here 
1532
			self._debug_traceback(ud.ERROR, "Unknown Exception during sync_to_ucs")
1544
			self._debug_traceback(ud.ERROR, "Unknown Exception during sync_to_ucs")
1533
			return False
1545
			return False
1534
1546
1535
	def sync_from_ucs(self, property_type, object, pre_mapped_ucs_dn, old_dn=None, old_ucs_object=None, new_ucs_object=None):
1547
	def sync_from_ucs(self, property_type, object, pre_mapped_ucs_dn, old_dn=None, old_ucs_object=None, new_ucs_object=None, reject_if_s4_changed=False):
1536
		# dummy
1548
		# dummy
1537
		return False
1549
		return False
1538
1550
(-)modules/univention/s4connector/s4/__init__.py (-1 / +20 lines)
 Lines 2276-2282    Link Here 
2276
	def __has_attribute_value_changed(self, attribute, old_ucs_object, new_ucs_object):
2276
	def __has_attribute_value_changed(self, attribute, old_ucs_object, new_ucs_object):
2277
		return not old_ucs_object.get(attribute) == new_ucs_object.get(attribute)
2277
		return not old_ucs_object.get(attribute) == new_ucs_object.get(attribute)
2278
2278
2279
	def sync_from_ucs(self, property_type, object, pre_mapped_ucs_dn, old_dn=None, old_ucs_object=None, new_ucs_object=None):
2279
	def sync_from_ucs(self, property_type, object, pre_mapped_ucs_dn, old_dn=None, old_ucs_object=None, new_ucs_object=None, reject_if_s4_changed=False):
2280
		_d = ud.function('ldap.__sync_from_ucs')
2280
		_d = ud.function('ldap.__sync_from_ucs')
2281
		# Diese Methode erhaelt von der UCS Klasse ein Objekt,
2281
		# Diese Methode erhaelt von der UCS Klasse ein Objekt,
2282
		# welches hier bearbeitet wird und in das S4 geschrieben wird.
2282
		# welches hier bearbeitet wird und in das S4 geschrieben wird.
 Lines 2288-2293    Link Here 
2288
			ud.debug(ud.LDAP, ud.INFO, "sync_from_ucs ignored, sync_mode is %s" % self.property[property_type].sync_mode)
2288
			ud.debug(ud.LDAP, ud.INFO, "sync_from_ucs ignored, sync_mode is %s" % self.property[property_type].sync_mode)
2289
			return True
2289
			return True
2290
2290
2291
		if reject_if_s4_changed:
2292
			s4_object = self.get_object(object['dn'])
2293
			if s4_object:
2294
				guid_blob = s4_object.get('objectGUID')[0]
2295
				objectGUID = str(ndr_unpack(misc.GUID, guid_blob))
2296
2297
				object['changed_attributes'] = []
2298
				if object['modtype'] == 'modify':
2299
					old_s4_object = self.s4cache.get_entry(objectGUID)
2300
					# ud.debug(ud.LDAP, ud.INFO, "sync_to_ucs: old_s4_object: %s" % old_s4_object)
2301
					# ud.debug(ud.LDAP, ud.INFO, "sync_to_ucs: new_s4_object: %s" % original_object['attributes'])
2302
					if old_s4_object:
2303
						if old_s4_object.get('uSNChanged') != s4_object.get('uSNChanged'):
2304
							ud.debug(ud.LDAP, ud.PROCESS, "sync_from_ucs: S4-Object changed: %s" % object['dn'])
2305
							rejected = self._list_rejected()
2306
							if not rejected:
2307
								ud.debug(ud.LDAP, ud.PROCESS, "sync_from_ucs: Temporarily rejecting sync_to_ucs because S4-Object changed: %s" % object['dn'])
2308
								return False
2309
2291
		pre_mapped_ucs_old_dn = old_dn
2310
		pre_mapped_ucs_old_dn = old_dn
2292
2311
2293
		if old_dn:
2312
		if old_dn:
(-)modules/univention/s4connector/s4/main.py (-2 / +2 lines)
 Lines 210-216    Link Here 
210
		while True:
210
		while True:
211
			# Read changes from OpenLDAP
211
			# Read changes from OpenLDAP
212
			try:
212
			try:
213
				change_counter = s4.poll_ucs()
213
				change_counter = s4.poll_ucs(reject_if_s4_changed=True)
214
				if change_counter > 0:
214
				if change_counter > 0:
215
					# UCS changes, read again from UCS
215
					# UCS changes, read again from UCS
216
					retry_rejected = 0
216
					retry_rejected = 0
 Lines 242-248    Link Here 
242
242
243
		try:
243
		try:
244
			if str(retry_rejected) == baseconfig_retry_rejected:
244
			if str(retry_rejected) == baseconfig_retry_rejected:
245
				s4.resync_rejected_ucs()
245
				s4.resync_rejected_ucs(reject_if_s4_changed=True)
246
				s4.resync_rejected()
246
				s4.resync_rejected()
247
				retry_rejected = 0
247
				retry_rejected = 0
248
			else:
248
			else:

Return to bug 41571