diff --git management/univention-ldap/conffiles/etc/ldap/slapd.conf.d/25univention-ldap-server_local-schema management/univention-ldap/conffiles/etc/ldap/slapd.conf.d/25univention-ldap-server_local-schema index df71d806fb..d628098f79 100644 --- management/univention-ldap/conffiles/etc/ldap/slapd.conf.d/25univention-ldap-server_local-schema +++ management/univention-ldap/conffiles/etc/ldap/slapd.conf.d/25univention-ldap-server_local-schema @@ -1,8 +1,9 @@ -@!@ +@!@ import os +import os.path import re -import subprocess +from univention.config_registry.handler import run_filter def getRegisteredFiles(): @@ -11,18 +12,21 @@ def getRegisteredFiles(): for f in os.listdir(registeredDirectory): for line in open(os.path.join(registeredDirectory, f), 'r').readlines(): if line.startswith('File: '): - files.append(line.replace('File: ', '').strip()) + fn = line.replace('File: ', '').strip() + if fn.startswith('etc/ldap/slapd.conf.d'): + files.append(fn) elif line.startswith('Subfile: '): - files.append(line.replace('Subfile: ', '').strip()) + fn = line.replace('Subfile: ', '').strip() + if fn.startswith('etc/ldap/slapd.conf.d'): + files.append(fn) return files -def isSchemaFileIncluded(schemaFile): +def ucr_filter_files(registeredFiles): directoryPath = '/etc/univention/templates/files/etc/ldap/slapd.conf.d/' - registeredFiles = getRegisteredFiles() - + checklist = [] for f in os.listdir(directoryPath): if f == '25univention-ldap-server_local-schema' or f.startswith('.'): continue @@ -31,21 +35,27 @@ def isSchemaFileIncluded(schemaFile): if not 'etc/ldap/slapd.conf.d/%s' % f in registeredFiles: continue - p1 = subprocess.Popen(["cat", "/etc/univention/templates/files/etc/ldap/slapd.conf.d/%s" % f], stdout=subprocess.PIPE) - p2 = subprocess.Popen(["ucr", "filter"], stdin=p1.stdout, stdout=subprocess.PIPE) - p1.stdout.close() - output = p2.communicate()[0].decode('utf-8', 'replace') - pattern = re.compile('include.*%s' % schemaFile) - for line in output.split('\n'): - if line and pattern.match(line): - return True + checklist.append(f) + + output = "" + if checklist: + for fn in checklist: + with open('/etc/univention/templates/files/etc/ldap/slapd.conf.d/%s' % (fn,), 'r') as f: + output += run_filter(f.read(), configRegistry) + return output - return False + +def isSchemaFileIncluded(schemaFile, ucr_filtered_output): + return re.search('\ninclude.*%s\n' % schemaFile, ucr_filtered_output) is not None if configRegistry.get('ldap/server/type', 'slave') == 'master': if os.path.exists('/var/lib/univention-ldap/local-schema'): - for schemaFile in sorted(os.listdir('/var/lib/univention-ldap/local-schema')): - if not isSchemaFileIncluded(schemaFile): + + registeredFiles = getRegisteredFiles() + ucr_filtered_output = ucr_filter_files(registeredFiles) + + for schemaFile in os.listdir('/var/lib/univention-ldap/local-schema'): + if not isSchemaFileIncluded(schemaFile, ucr_filtered_output): print('include /var/lib/univention-ldap/local-schema/%s' % schemaFile) @!@