| Lines 31-39
          
      
      
        Link Here | 
        
          | 31 | # <http://www.gnu.org/licenses/>. | 31 | # <http://www.gnu.org/licenses/>. | 
        
          | 32 |  | 32 |  | 
        
          | 33 | from __future__ import print_function | 33 | from __future__ import print_function | 
          
            
              | 34 | import ldb | 34 |  | 
            
              | 35 | import ldap |  |  | 
            
              | 36 | import ldap.sasl | 
        
          | 37 | import os | 35 | import os | 
        
          | 38 | import subprocess | 36 | import subprocess | 
        
          | 39 | import locale | 37 | import locale | 
  
    | Lines 42-51
          import tempfile
      
      
        Link Here | 
        
          | 42 | import ipaddr | 40 | import ipaddr | 
        
          | 43 | import time | 41 | import time | 
        
          | 44 | from datetime import datetime, timedelta | 42 | from datetime import datetime, timedelta | 
            
              |  |  | 43 | import pipes | 
            
              | 44 |  | 
            
              | 45 | import ldb | 
            
              | 46 | import ldap | 
            
              | 47 | import ldap.sasl | 
            
              | 48 | from ldap.filter import filter_format | 
        
          | 45 | from samba.dcerpc import nbt, security | 49 | from samba.dcerpc import nbt, security | 
        
          | 46 | from samba.ndr import ndr_unpack | 50 | from samba.ndr import ndr_unpack | 
        
          | 47 | from samba.net import Net | 51 | from samba.net import Net | 
        
          | 48 | from samba.param import LoadParm | 52 | from samba.param import LoadParm | 
            
              |  |  | 53 |  | 
        
          | 49 | import univention.config_registry | 54 | import univention.config_registry | 
        
          | 50 | import univention.uldap | 55 | import univention.uldap | 
        
          | 51 | import univention.lib.package_manager | 56 | import univention.lib.package_manager | 
  
    | Lines 71-76
          finally:
      
      
        Link Here | 
        
          | 71 | 	if orig_path: | 76 | 	if orig_path: | 
        
          | 72 | 		sys.path = orig_path | 77 | 		sys.path = orig_path | 
        
          | 73 |  | 78 |  | 
            
              |  |  | 79 |  | 
        
          | 74 | # Ensure univention debug is initialized | 80 | # Ensure univention debug is initialized | 
        
          | 75 | def initialize_debug(): | 81 | def initialize_debug(): | 
        
          | 76 | 	# Use a little hack to determine if univention.debug has been initialized | 82 | 	# Use a little hack to determine if univention.debug has been initialized | 
  
    | Lines 88-93
          def initialize_debug():
      
      
        Link Here | 
        
          | 88 | 	else: | 94 | 	else: | 
        
          | 89 | 		ud.set_level(ud.MODULE, oldLevel) | 95 | 		ud.set_level(ud.MODULE, oldLevel) | 
        
          | 90 |  | 96 |  | 
            
              |  |  | 97 |  | 
        
          | 91 | class failedToSetService(Exception): | 98 | class failedToSetService(Exception): | 
        
          | 92 |  | 99 |  | 
        
          | 93 | 	'''ucs_addServiceToLocalhost failed''' | 100 | 	'''ucs_addServiceToLocalhost failed''' | 
  
    | Lines 337-343
          def check_ad_account(ad_domain_info, username, password, ucr=None):
      
      
        Link Here | 
        
          | 337 |  | 344 |  | 
        
          | 338 | 	domain_sid = ndr_unpack(security.dom_sid, res[0][1]["objectSid"][0]) | 345 | 	domain_sid = ndr_unpack(security.dom_sid, res[0][1]["objectSid"][0]) | 
        
          | 339 |  | 346 |  | 
          
            
              | 340 | 	res = lo_ad.search(filter="(sAMAccountName=%s)" % username, attr=["objectSid", "primaryGroupID"]) | 347 | 	res = lo_ad.search(filter=filter_format("(sAMAccountName=%s)", [username]), attr=["objectSid", "primaryGroupID"]) | 
        
          | 341 | 	if not res or "objectSid" not in res[0][1]: | 348 | 	if not res or "objectSid" not in res[0][1]: | 
        
          | 342 | 		msg = "Determination user SID failed" | 349 | 		msg = "Determination user SID failed" | 
        
          | 343 | 		ud.debug(ud.MODULE, ud.ERROR, msg) | 350 | 		ud.debug(ud.MODULE, ud.ERROR, msg) | 
  
    | Lines 354-360
          def check_ad_account(ad_domain_info, username, password, ucr=None):
      
      
        Link Here | 
        
          | 354 |  | 361 |  | 
        
          | 355 | 	user_dn = res[0][0] | 362 | 	user_dn = res[0][0] | 
        
          | 356 |  | 363 |  | 
          
            
              | 357 | 	res = lo_ad.search(filter="(sAMAccountName=%s)" % username, base=user_dn, scope="base", attr=["tokenGroups"]) | 364 | 	res = lo_ad.search(filter=filter_format("(sAMAccountName=%s)", [username]), base=user_dn, scope="base", attr=["tokenGroups"]) | 
        
          | 358 | 	if not res or "tokenGroups" not in res[0][1]: | 365 | 	if not res or "tokenGroups" not in res[0][1]: | 
        
          | 359 | 		msg = "Lookup of AD group memberships for user failed" | 366 | 		msg = "Lookup of AD group memberships for user failed" | 
        
          | 360 | 		ud.debug(ud.MODULE, ud.ERROR, msg) | 367 | 		ud.debug(ud.MODULE, ud.ERROR, msg) | 
  
    | Lines 380-386
          def _sid_of_ucs_sambadomain(lo=None, ucr=None):
      
      
        Link Here | 
        
          | 380 | 		ucr = univention.config_registry.ConfigRegistry() | 387 | 		ucr = univention.config_registry.ConfigRegistry() | 
        
          | 381 | 		ucr.load() | 388 | 		ucr.load() | 
        
          | 382 |  | 389 |  | 
          
            
              | 383 | 	res = lo.search(filter="(&(objectclass=sambadomain)(sambaDomainName=%s))" % ucr.get("windows/domain"), attr=["sambaSID"], unique=True) | 390 | 	res = lo.search(filter=filter_format("(&(objectclass=sambadomain)(sambaDomainName=%s))", [ucr.get("windows/domain")]), attr=["sambaSID"], unique=True) | 
        
          | 384 | 	if not res: | 391 | 	if not res: | 
        
          | 385 | 		ud.debug(ud.MODULE, ud.ERROR, "No UCS LDAP search result for sambaDomainName=%s" % ucr.get("windows/domain")) | 392 | 		ud.debug(ud.MODULE, ud.ERROR, "No UCS LDAP search result for sambaDomainName=%s" % ucr.get("windows/domain")) | 
        
          | 386 | 		raise ldap.NO_SUCH_OBJECT({'desc': 'no object'}) | 393 | 		raise ldap.NO_SUCH_OBJECT({'desc': 'no object'}) | 
  
    | Lines 403-409
          def _dn_of_udm_domain_admins(lo=None, ucr=None):
      
      
        Link Here | 
        
          | 403 |  | 410 |  | 
        
          | 404 | 	ucs_domain_sid = _sid_of_ucs_sambadomain(lo, ucr) | 411 | 	ucs_domain_sid = _sid_of_ucs_sambadomain(lo, ucr) | 
        
          | 405 | 	domain_admins_sid = "%s-%s" % (ucs_domain_sid, security.DOMAIN_RID_ADMINS) | 412 | 	domain_admins_sid = "%s-%s" % (ucs_domain_sid, security.DOMAIN_RID_ADMINS) | 
          
            
              | 406 | 	res = lo.searchDn(filter="(sambaSID=%s)" % domain_admins_sid, unique=True) | 413 | 	res = lo.searchDn(filter=filter_format("(sambaSID=%s)", [domain_admins_sid]), unique=True) | 
        
          | 407 | 	if not res: | 414 | 	if not res: | 
        
          | 408 | 		ud.debug(ud.MODULE, ud.ERROR, "Failed to determine DN of UCS Domain Admins group") | 415 | 		ud.debug(ud.MODULE, ud.ERROR, "Failed to determine DN of UCS Domain Admins group") | 
        
          | 409 | 		raise ldap.NO_SUCH_OBJECT({'desc': 'no object'}) | 416 | 		raise ldap.NO_SUCH_OBJECT({'desc': 'no object'}) | 
  
    | Lines 490-496
          def prepare_administrator(username, password, ucr=None):
      
      
        Link Here | 
        
          | 490 |  | 497 |  | 
        
          | 491 | 	# First check if account exists in LDAP, otherwise create it: | 498 | 	# First check if account exists in LDAP, otherwise create it: | 
        
          | 492 | 	lo = univention.uldap.getMachineConnection() | 499 | 	lo = univention.uldap.getMachineConnection() | 
          
            
              | 493 | 	res = lo.search(filter="(&(uid=%s)(objectClass=shadowAccount))" % (username,), attr=["userPassword", "sambaSID"]) | 500 | 	res = lo.search(filter=filter_format("(&(uid=%s)(objectClass=shadowAccount))", (username,)), attr=["userPassword", "sambaSID"]) | 
        
          | 494 | 	if not res: | 501 | 	if not res: | 
        
          | 495 | 		ud.debug(ud.MODULE, ud.INFO, "No UCS LDAP search result for uid=%s" % username) | 502 | 		ud.debug(ud.MODULE, ud.INFO, "No UCS LDAP search result for uid=%s" % username) | 
        
          | 496 | 		try: | 503 | 		try: | 
  
    | Lines 536-561
          def prepare_administrator(username, password, ucr=None):
      
      
        Link Here | 
        
          | 536 |  | 543 |  | 
        
          | 537 |  | 544 |  | 
        
          | 538 | def _mapped_ad_dn(ad_dn, ad_ldap_base, ucr=None): | 545 | def _mapped_ad_dn(ad_dn, ad_ldap_base, ucr=None): | 
          
            
              | 539 | 	if ad_dn[-len(ad_ldap_base):] != ad_ldap_base: | 546 | 	""" | 
            
              | 540 | 		ud.debug(ud.MODULE, ud.ERROR, "Mapping of AD DN %s failed, base is not %s" % (ad_dn, ad_ldap_base)) | 547 | 	>>> _mapped_ad_dn('uid=Administrator + CN=admin,OU=users,CN=univention,Foo=univention,bar=base', 'foo=univention,bar = base', {'ldap/base': 'dc=base'}) | 
            
              |  |  | 548 | 	'uid=Administrator+cn=admin,ou=users,cn=univention,dc=base' | 
            
              | 549 | 	""" | 
            
              | 550 | 	parent = ad_dn | 
            
              | 551 | 	while parent: | 
            
              | 552 | 		if univention.uldap.access.compare_dn(parent, ad_ldap_base): | 
            
              | 553 | 			break | 
            
              | 554 | 		parent = univention.uldap.parentDn(parent) | 
            
              | 555 | 	else: | 
            
              | 556 | 		ud.debug(ud.MODULE, ud.ERROR, "Mapping of AD DN %r failed, base is not %r" % (ad_dn, ad_ldap_base)) | 
        
          | 541 | 		return | 557 | 		return | 
        
          | 542 |  | 558 |  | 
        
          | 543 | 	if not ucr: | 559 | 	if not ucr: | 
        
          | 544 | 		ucr = univention.config_registry.ConfigRegistry() | 560 | 		ucr = univention.config_registry.ConfigRegistry() | 
        
          | 545 | 		ucr.load() | 561 | 		ucr.load() | 
        
          | 546 |  | 562 |  | 
          
            
              | 547 | 	relative_dn = ad_dn[:-len(ad_ldap_base) - 1] | 563 | 	base = ldap.dn.str2dn(ad_ldap_base) | 
            
              | 548 | 	mapped_relative_dn_components = [] | 564 | 	dn = [[(attr[0].lower() if attr[0] in ('CN', 'OU') else attr[0], attr[1], attr[2]) for attr in x] for x in ldap.dn.str2dn(ad_dn)[:-len(base)]] | 
            
              | 549 | 	relative_dn_components = relative_dn.split(',') | 565 | 	return ldap.dn.dn2str(dn + ldap.dn.str2dn(ucr.get("ldap/base"))) | 
            
              | 550 | 	for rdn in relative_dn_components: |  |  | 
            
              | 551 | 		attr, val = rdn.split('=') | 
            
              | 552 | 		if attr in ('CN', 'OU'): | 
            
              | 553 | 			attr = attr.lower() | 
            
              | 554 | 		mapped_rdn = '='.join((attr, val)) | 
            
              | 555 | 		mapped_relative_dn_components.append(mapped_rdn) | 
            
              | 556 | 	mapped_relative_dn = ','.join(mapped_relative_dn_components) | 
            
              | 557 | 	mapped_dn = ",".join((mapped_relative_dn, ucr.get("ldap/base"))) | 
            
              | 558 | 	return mapped_dn | 
        
          | 559 |  | 566 |  | 
        
          | 560 |  | 567 |  | 
        
          | 561 | def synchronize_account_position(ad_domain_info, username, password, ucr=None): | 568 | def synchronize_account_position(ad_domain_info, username, password, ucr=None): | 
  
    | Lines 590-596
          def synchronize_account_position(ad_domain_info, username, password, ucr=None):
      
      
        Link Here | 
        
          | 590 | 	except (ldap.INVALID_CREDENTIALS, ldap.UNWILLING_TO_PERFORM): | 597 | 	except (ldap.INVALID_CREDENTIALS, ldap.UNWILLING_TO_PERFORM): | 
        
          | 591 | 		return False  # Massive failure, but no issue to be raised here. | 598 | 		return False  # Massive failure, but no issue to be raised here. | 
        
          | 592 |  | 599 |  | 
          
            
              | 593 | 	res = lo_ad.searchDn(filter="(sAMAccountName=%s)" % username) | 600 | 	res = lo_ad.searchDn(filter=filter_format("(sAMAccountName=%s)", [username])) | 
        
          | 594 | 	if not res: | 601 | 	if not res: | 
        
          | 595 | 		ud.debug(ud.MODULE, ud.ERROR, "Lookup of AD DN for user %s failed" % username) | 602 | 		ud.debug(ud.MODULE, ud.ERROR, "Lookup of AD DN for user %s failed" % username) | 
        
          | 596 | 		return False  # Massive failure, but no issue to be raised here. | 603 | 		return False  # Massive failure, but no issue to be raised here. | 
  
    | Lines 598-604
          def synchronize_account_position(ad_domain_info, username, password, ucr=None):
      
      
        Link Here | 
        
          | 598 |  | 605 |  | 
        
          | 599 | 	# Second determine position in UCS LDAP: | 606 | 	# Second determine position in UCS LDAP: | 
        
          | 600 | 	lo = univention.uldap.getMachineConnection() | 607 | 	lo = univention.uldap.getMachineConnection() | 
          
            
              | 601 | 	res = lo.searchDn(filter="(&(uid=%s)(objectClass=shadowAccount))" % (username,), unique=True) | 608 | 	res = lo.searchDn(filter=filter_format("(&(uid=%s)(objectClass=shadowAccount))", (username,)), unique=True) | 
        
          | 602 | 	if not res: | 609 | 	if not res: | 
        
          | 603 | 		ud.debug(ud.MODULE, ud.ERROR, "No UCS LDAP search result for uid=%s" % username) | 610 | 		ud.debug(ud.MODULE, ud.ERROR, "No UCS LDAP search result for uid=%s" % username) | 
        
          | 604 | 		return False  # Massive failure, but no issue to be raised here. | 611 | 		return False  # Massive failure, but no issue to be raised here. | 
  
    | Lines 608-614
          def synchronize_account_position(ad_domain_info, username, password, ucr=None):
      
      
        Link Here | 
        
          | 608 | 		return True | 615 | 		return True | 
        
          | 609 |  | 616 |  | 
        
          | 610 | 	mapped_ad_user_dn = _mapped_ad_dn(ad_user_dn, ad_ldap_base, ucr) | 617 | 	mapped_ad_user_dn = _mapped_ad_dn(ad_user_dn, ad_ldap_base, ucr) | 
          
            
              | 611 | 	target_position = mapped_ad_user_dn.split(',', 1)[1] | 618 | 	target_position = lo.parentDn(mapped_ad_user_dn) | 
        
          | 612 |  | 619 |  | 
        
          | 613 | 	cmd = ("univention-directory-manager", "users/user", "move", "--dn", ucs_user_dn, "--position", target_position) | 620 | 	cmd = ("univention-directory-manager", "users/user", "move", "--dn", ucs_user_dn, "--position", target_position) | 
        
          | 614 | 	p1 = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True) | 621 | 	p1 = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True) | 
  
    | Lines 664-677
          def disable_ssl():
      
      
        Link Here | 
        
          | 664 |  | 671 |  | 
        
          | 665 | def _add_service_to_localhost(service): | 672 | def _add_service_to_localhost(service): | 
        
          | 666 | 	ud.debug(ud.MODULE, ud.PROCESS, "Adding service %s to localhost" % service) | 673 | 	ud.debug(ud.MODULE, ud.PROCESS, "Adding service %s to localhost" % service) | 
          
            
              | 667 | 	res = subprocess.call('. /usr/share/univention-lib/ldap.sh; ucs_addServiceToLocalhost "%s"' % service, shell=True) | 674 | 	res = subprocess.call('. /usr/share/univention-lib/ldap.sh; ucs_addServiceToLocalhost %s' % (pipes.quote(service),), shell=True) | 
        
          | 668 | 	if res != 0: | 675 | 	if res != 0: | 
        
          | 669 | 		raise failedToSetService | 676 | 		raise failedToSetService | 
        
          | 670 |  | 677 |  | 
        
          | 671 |  | 678 |  | 
        
          | 672 | def _remove_service_from_localhost(service): | 679 | def _remove_service_from_localhost(service): | 
        
          | 673 | 	ud.debug(ud.MODULE, ud.PROCESS, "Remove service %s from localhost" % service) | 680 | 	ud.debug(ud.MODULE, ud.PROCESS, "Remove service %s from localhost" % service) | 
          
            
              | 674 | 	res = subprocess.call('. /usr/share/univention-lib/ldap.sh; ucs_removeServiceFromLocalhost "%s"' % service, shell=True) | 681 | 	res = subprocess.call('. /usr/share/univention-lib/ldap.sh; ucs_removeServiceFromLocalhost %s' % (pipes.quote(service),), shell=True) | 
        
          | 675 | 	if res != 0: | 682 | 	if res != 0: | 
        
          | 676 | 		raise failedToSetService | 683 | 		raise failedToSetService | 
        
          | 677 |  | 684 |  | 
  
    | Lines 977-983
          def rename_well_known_sid_objects(username, password, ucr=None):
      
      
        Link Here | 
        
          | 977 | 	ucs_domain_sid = _sid_of_ucs_sambadomain(lo, ucr) | 984 | 	ucs_domain_sid = _sid_of_ucs_sambadomain(lo, ucr) | 
        
          | 978 |  | 985 |  | 
        
          | 979 | 	domain_admins_sid = "%s-%s" % (ucs_domain_sid, security.DOMAIN_RID_ADMINS) | 986 | 	domain_admins_sid = "%s-%s" % (ucs_domain_sid, security.DOMAIN_RID_ADMINS) | 
          
            
              | 980 | 	res = lo.search(filter="(&(sambaSID=%s)(objectClass=sambaGroupMapping))" % domain_admins_sid, attr=["cn"], unique=True) | 987 | 	res = lo.search(filter=filter_format("(&(sambaSID=%s)(objectClass=sambaGroupMapping))", [domain_admins_sid]), attr=["cn"], unique=True) | 
        
          | 981 | 	if not res or "cn" not in res[0][1]: | 988 | 	if not res or "cn" not in res[0][1]: | 
        
          | 982 | 		ud.debug(ud.MODULE, ud.ERROR, "Lookup of group name for Domain Admins sid failed") | 989 | 		ud.debug(ud.MODULE, ud.ERROR, "Lookup of group name for Domain Admins sid failed") | 
        
          | 983 | 		domain_admins_name = "Domain Admins"  # sensible guess | 990 | 		domain_admins_name = "Domain Admins"  # sensible guess | 
  
    | Lines 1001-1007
          def rename_well_known_sid_objects(username, password, ucr=None):
      
      
        Link Here | 
        
          | 1001 | 		raise connectionFailed(msg) | 1008 | 		raise connectionFailed(msg) | 
        
          | 1002 |  | 1009 |  | 
        
          | 1003 | 	# Finally wait for replication and slapd restart to ensure that new LDAP ACLs are active: | 1010 | 	# Finally wait for replication and slapd restart to ensure that new LDAP ACLs are active: | 
          
            
              | 1004 | 	res = lo.search(filter="(&(sambaSID=%s)(objectClass=sambaGroupMapping))" % domain_admins_sid, attr=["cn"], unique=True) | 1011 | 	res = lo.search(filter=filter_format("(&(sambaSID=%s)(objectClass=sambaGroupMapping))", [domain_admins_sid]), attr=["cn"], unique=True) | 
        
          | 1005 | 	if not res or "cn" not in res[0][1]: | 1012 | 	if not res or "cn" not in res[0][1]: | 
        
          | 1006 | 		ud.debug(ud.MODULE, ud.ERROR, "Lookup of new group name for Domain Admins sid failed") | 1013 | 		ud.debug(ud.MODULE, ud.ERROR, "Lookup of new group name for Domain Admins sid failed") | 
        
          | 1007 | 		new_domain_admins_name = "Domain Admins" | 1014 | 		new_domain_admins_name = "Domain Admins" | 
  
    | Lines 1075-1081
          def prepare_dns_reverse_settings(ad_domain_info, ucr=None):
      
      
        Link Here | 
        
          | 1075 | 	except (socket.herror, socket.gaierror) as exc: | 1082 | 	except (socket.herror, socket.gaierror) as exc: | 
        
          | 1076 | 		ud.debug(ud.MODULE, ud.INFO, "Resolving %s failed: %s" % (ad_domain_info['DC IP'], exc.args[1])) | 1083 | 		ud.debug(ud.MODULE, ud.INFO, "Resolving %s failed: %s" % (ad_domain_info['DC IP'], exc.args[1])) | 
        
          | 1077 |  | 1084 |  | 
          
            
              | 1078 | 	## Set a hosts/static anyway, to be safe from DNS issues (Bug #38285) | 1085 | 	# Set a hosts/static anyway, to be safe from DNS issues (Bug #38285) | 
        
          | 1079 | 	previous_ucr_set = [] | 1086 | 	previous_ucr_set = [] | 
        
          | 1080 | 	previous_ucr_unset = [] | 1087 | 	previous_ucr_unset = [] | 
        
          | 1081 |  | 1088 |  | 
  
    | Lines 1097-1102
          def prepare_dns_reverse_settings(ad_domain_info, ucr=None):
      
      
        Link Here | 
        
          | 1097 |  | 1104 |  | 
        
          | 1098 | 	return (previous_ucr_set, previous_ucr_unset) | 1105 | 	return (previous_ucr_set, previous_ucr_unset) | 
        
          | 1099 |  | 1106 |  | 
            
              |  |  | 1107 |  | 
        
          | 1100 | def prepare_kerberos_ucr_settings(realm=None, ucr=None): | 1108 | def prepare_kerberos_ucr_settings(realm=None, ucr=None): | 
        
          | 1101 | 	ud.debug(ud.MODULE, ud.PROCESS, "Prepare Kerberos UCR settings") | 1109 | 	ud.debug(ud.MODULE, ud.PROCESS, "Prepare Kerberos UCR settings") | 
        
          | 1102 |  | 1110 |  | 
  
    | Lines 1252-1258
          def run_samba_join_script(username, password, ucr=None):
      
      
        Link Here | 
        
          | 1252 | 	ud.debug(ud.MODULE, ud.PROCESS, "Running samba join script") | 1260 | 	ud.debug(ud.MODULE, ud.PROCESS, "Running samba join script") | 
        
          | 1253 |  | 1261 |  | 
        
          | 1254 | 	lo = univention.uldap.getMachineConnection() | 1262 | 	lo = univention.uldap.getMachineConnection() | 
          
            
              | 1255 | 	res = lo.searchDn(filter="(&(uid=%s)(objectClass=shadowAccount))" % (username,), unique=True) | 1263 | 	res = lo.searchDn(filter=filter_format("(&(uid=%s)(objectClass=shadowAccount))", (username,)), unique=True) | 
        
          | 1256 | 	if not res: | 1264 | 	if not res: | 
        
          | 1257 | 		ud.debug(ud.MODULE, ud.ERROR, "No UCS LDAP search result for uid=%s" % username) | 1265 | 		ud.debug(ud.MODULE, ud.ERROR, "No UCS LDAP search result for uid=%s" % username) | 
        
          | 1258 | 		raise sambaJoinScriptFailed() | 1266 | 		raise sambaJoinScriptFailed() | 
  
    | Lines 1283-1291
          def add_host_record_in_ad(uid=None, binddn=None, bindpw=None, bindpwdfile=None,
      
      
        Link Here | 
        
          | 1283 | 	domainname = ucr.get('domainname') | 1291 | 	domainname = ucr.get('domainname') | 
        
          | 1284 |  | 1292 |  | 
        
          | 1285 | 	if binddn: | 1293 | 	if binddn: | 
          
            
              | 1286 | 		for i in binddn.split(','): | 1294 | 		uids = [y[1] for x in ldap.dn.str2dn(binddn) for y in x if ('uid' in y)] | 
            
              | 1287 | 			if i.lower().startswith('uid='): | 1295 | 		if uids: | 
            
              | 1288 | 				uid = i.split('=', 1)[1] | 1296 | 			uid = uids[0] | 
        
          | 1289 | 	if bindpwdfile: | 1297 | 	if bindpwdfile: | 
        
          | 1290 | 		create_pwdfile = False | 1298 | 		create_pwdfile = False | 
        
          | 1291 | 		pwdfile = bindpwdfile | 1299 | 		pwdfile = bindpwdfile | 
  
    | Lines 1328-1334
          def add_host_record_in_ad(uid=None, binddn=None, bindpw=None, bindpwdfile=None,
      
      
        Link Here | 
        
          | 1328 | 		print('%s A record for %s found' % (fqdn, ip)) | 1336 | 		print('%s A record for %s found' % (fqdn, ip)) | 
        
          | 1329 | 		return True | 1337 | 		return True | 
        
          | 1330 |  | 1338 |  | 
          
            
              | 1331 | 	# create host record | 1339 | 	# create host record  # FIXME; missing quoting | 
        
          | 1332 | 	fd = tempfile.NamedTemporaryFile(delete=False) | 1340 | 	fd = tempfile.NamedTemporaryFile(delete=False) | 
        
          | 1333 | 	fd.write('server %s\n' % ad_ip) | 1341 | 	fd.write('server %s\n' % ad_ip) | 
        
          | 1334 | 	fd.write('update add %s 86400 A %s\n' % (fqdn, ip)) | 1342 | 	fd.write('update add %s 86400 A %s\n' % (fqdn, ip)) | 
  
    | Lines 1410-1415
          def add_domaincontroller_srv_record_in_ad(ad_ip, username, password, ucr=None):
      
      
        Link Here | 
        
          | 1410 | 		with tempfile.NamedTemporaryFile() as fd, tempfile.NamedTemporaryFile() as fd2: | 1418 | 		with tempfile.NamedTemporaryFile() as fd, tempfile.NamedTemporaryFile() as fd2: | 
        
          | 1411 | 			fd2.write(password) | 1419 | 			fd2.write(password) | 
        
          | 1412 | 			fd2.flush() | 1420 | 			fd2.flush() | 
            
              |  |  | 1421 | 			# FIXME: missing quoting | 
        
          | 1413 | 			fd.write('server %s\n' % ad_ip) | 1422 | 			fd.write('server %s\n' % ad_ip) | 
        
          | 1414 | 			fd.write('update delete %s. SRV\n' % (srv_record,)) | 1423 | 			fd.write('update delete %s. SRV\n' % (srv_record,)) | 
        
          | 1415 | 			fd.write('send\n') | 1424 | 			fd.write('send\n') | 
  
    | Lines 1424-1429
          def add_domaincontroller_srv_record_in_ad(ad_ip, username, password, ucr=None):
      
      
        Link Here | 
        
          | 1424 | 				ud.debug(ud.MODULE, ud.ERROR, "failed to remove SRV record. Ignoring error.") | 1433 | 				ud.debug(ud.MODULE, ud.ERROR, "failed to remove SRV record. Ignoring error.") | 
        
          | 1425 | 			subprocess.call(['kdestroy']) | 1434 | 			subprocess.call(['kdestroy']) | 
        
          | 1426 |  | 1435 |  | 
            
              |  |  | 1436 | 	# FIXME: missing quoting | 
        
          | 1427 | 	fd = tempfile.NamedTemporaryFile(delete=False) | 1437 | 	fd = tempfile.NamedTemporaryFile(delete=False) | 
        
          | 1428 | 	fd.write('server %s\n' % ad_ip) | 1438 | 	fd.write('server %s\n' % ad_ip) | 
        
          | 1429 | 	fd.write('update add %s. 10800 SRV 0 0 0 %s\n' % | 1439 | 	fd.write('update add %s. 10800 SRV 0 0 0 %s\n' % | 
  
    | Lines 1454-1460
          def add_domaincontroller_srv_record_in_ad(ad_ip, username, password, ucr=None):
      
      
        Link Here | 
        
          | 1454 | def get_ucr_variable_from_ucs(host, server, var): | 1464 | def get_ucr_variable_from_ucs(host, server, var): | 
        
          | 1455 | 	cmd = ['univention-ssh', '/etc/machine.secret'] | 1465 | 	cmd = ['univention-ssh', '/etc/machine.secret'] | 
        
          | 1456 | 	cmd += ['%s\$@%s' % (host, server)] | 1466 | 	cmd += ['%s\$@%s' % (host, server)] | 
          
            
              | 1457 | 	cmd += ['/usr/sbin/ucr get %s' % var] | 1467 | 	cmd += ['/usr/sbin/ucr get %s' % (pipes.quote(var),)] | 
        
          | 1458 | 	p1 = subprocess.Popen(cmd, close_fds=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | 1468 | 	p1 = subprocess.Popen(cmd, close_fds=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | 
        
          | 1459 | 	stdout, stderr = p1.communicate() | 1469 | 	stdout, stderr = p1.communicate() | 
        
          | 1460 | 	if p1.returncode: | 1470 | 	if p1.returncode: |