Source code for univention.lib.misc

#!/usr/bin/python3
# SPDX-FileCopyrightText: 2012-2025 Univention GmbH
# SPDX-License-Identifier: AGPL-3.0-only

"""Univention Common Python Library"""

import subprocess

from univention.config_registry import ConfigRegistry
from univention.lib.ucs import UCS_Version
from univention.uldap import getMachineConnection


[docs] def primaryVersionGreaterEqual(version: str) -> bool: """ Returns True if UCS_Version of primary is greater or equal to given version. :param UCS_Version version: the UCS version to check :returns: True if UCS version of primary is greater or equal version :rtype: bool """ version = UCS_Version(version) lo = getMachineConnection() # TODO: is this enough to search for the primary, or do we need cn=ucr[ldap/master]? res = lo.search('univentionObjectType=computers/domaincontroller_master') if len(res) != 1: return False primary_version = res[0][1].get('univentionOperatingSystemVersion') if not primary_version: return False primary_version = UCS_Version(primary_version[0].decode('UTF-8')) return primary_version >= version
[docs] def createMachinePassword() -> str: """ Returns a $(pwgen) generated password according to the requirements in |UCR| variables `machine/password/length` and `machine/password/complexity`. :returns: A password. :rtype: str """ ucr = ConfigRegistry() ucr.load() length = ucr.get('machine/password/length', '20') compl = ucr.get('machine/password/complexity', 'scn') p = subprocess.Popen(["pwgen", "-1", "-" + compl, length], stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdout, _stderr) = p.communicate() if not isinstance(stdout, str): # Python 3 return stdout.decode('ASCII', 'replace').strip() return stdout.strip()
[docs] def getLDAPURIs(ucr: ConfigRegistry | None = None, sep: str = ' ') -> str: """ Returns a space separated list of all configured |LDAP| servers, according to |UCR| variables `ldap/server/name` and `ldap/server/addition`. :param ConfigRegistry ucr: An optional |UCR| instance. :returns: A space separated list of |LDAP| |URI|. :rtype: str """ if ucr is None: ucr = ConfigRegistry() ucr.load() uri_string = '' ldaphosts = [] port = ucr.get('ldap/server/port', '7389') ldap_server_name = ucr.get('ldap/server/name') ldap_server_addition = ucr.get('ldap/server/addition') if ldap_server_name: ldaphosts.append(ldap_server_name) if ldap_server_addition: ldaphosts.extend(ldap_server_addition.split()) if ldaphosts: urilist = ["ldap://%s:%s" % (host, port) for host in ldaphosts] uri_string = sep.join(urilist) return uri_string
[docs] def getLDAPServersCommaList(ucr: ConfigRegistry | None = None) -> str: """ Returns a comma-separated string with all configured |LDAP| servers, `ldap/server/name` and `ldap/server/addition`. :param ConfigRegistry ucr: An optional |UCR| instance. :returns: A space separated list of |LDAP| host names. :rtype: str """ if ucr is None: ucr = ConfigRegistry() ucr.load() ldap_servers = '' ldaphosts = [] ldap_server_name = ucr.get('ldap/server/name') ldap_server_addition = ucr.get('ldap/server/addition') if ldap_server_name: ldaphosts.append(ldap_server_name) if ldap_server_addition: ldaphosts.extend(ldap_server_addition.split()) if ldaphosts: ldap_servers = ','.join(ldaphosts) return ldap_servers
[docs] def custom_username(name: str, ucr: ConfigRegistry | None = None) -> str: """ Returns the customized user name configured via |UCR| `users/default/*`. :param str name: A user name. :param ConfigRegistry ucr: An optional |UCR| instance. :returns: The translated user name. :rtype: str :raises ValueError: if no name is given. """ if not name: raise ValueError() if ucr is None: ucr = ConfigRegistry() ucr.load() return ucr.get("users/default/" + name.lower().replace(" ", ""), name)
[docs] def custom_groupname(name: str, ucr: ConfigRegistry | None = None) -> str: """ Returns the customized group name configured via |UCR| `groups/default/*`. :param str name: A group name. :param ConfigRegistry ucr: An optional |UCR| instance. :returns: The translated group name. :rtype: str :raises ValueError: if no name is given. """ if not name: raise ValueError() if ucr is None: ucr = ConfigRegistry() ucr.load() return ucr.get("groups/default/" + name.lower().replace(" ", ""), name)