def createAddGroupIfNotExists(self, user_dn, user_name, gid_number): if user_dn is None or user_name is None or gid_number is None: return index = PluginRegistry.getInstance("ObjectIndex") res = index.search({ "_type": "PosixGroup", "gidNumber": gid_number }, {"dn": 1}) if len(res) == 0: # create group user = ObjectProxy(user_dn) group = ObjectProxy(user.get_adjusted_parent_dn(), "PosixGroup") group.cn = user_name group.description = N_("Group of user %s" % user_name) group.autoGid = False group.gidNumber = gid_number group.memberUid = [user_name] group.commit() elif len(res) == 1: group = ObjectProxy(res[0]["dn"]) if user_name not in group.memberUid: group.memberUid.append(user_name) group.commit() else: raise GosaException( C.make_error('GROUP_ID_IS_AMBIGUOUS', gid=gid_number))
def createAddGroupIfNotExists(self, user_dn, user_name, gid_number): if user_dn is None or user_name is None or gid_number is None: return index = PluginRegistry.getInstance("ObjectIndex") res = index.search({"_type": "PosixGroup", "gidNumber": gid_number}, {"dn": 1}) if len(res) == 0: # create group user = ObjectProxy(user_dn) group = ObjectProxy(user.get_adjusted_parent_dn(), "PosixGroup") group.cn = user_name group.description = N_("Group of user %s" % user_name) group.autoGid = False group.gidNumber = gid_number group.memberUid = [user_name] group.commit() elif len(res) == 1: group = ObjectProxy(res[0]["dn"]) if user_name not in group.memberUid: group.memberUid.append(user_name) group.commit() else: raise GosaException(C.make_error('GROUP_ID_IS_AMBIGUOUS', gid=gid_number))
def __collect_user_configuration(self, client_id, users): """ :param client_id: deviceUUID or hostname :param users: list of currently logged in users on the client """ if isinstance(client_id, ObjectProxy): client = client_id else: client = self.__open_device(client_id, read_only=True) group = None index = PluginRegistry.getInstance("ObjectIndex") res = index.search({"_type": "GroupOfNames", "member": client.dn}, {"dn": 1}) if len(res) > 0: group = ObjectProxy(res[0]["dn"], read_only=True) config = {} resolution = None if group is not None and group.is_extended_by("GotoEnvironment") and group.gotoXResolution is not None: resolution = group.gotoXResolution if client.is_extended_by("GotoEnvironment") and client.gotoXResolution is not None: resolution = client.gotoXResolution release = None if client.is_extended_by("GotoMenu"): release = client.getReleaseName() elif group is not None and group.is_extended_by("ForemanHostGroup"): release = group.getReleaseName() parent_group = group while release is None and parent_group is not None and parent_group.parent_id is not None: res = index.search({"_type": "GroupOfNames", "extension": "ForemanHostGroup", "foremanGroupId": parent_group.parent_id}, {"dn": 1}) if len(res) == 0: break else: parent_group = ObjectProxy(res[0]["dn"], read_only=True) release = parent_group.getReleaseName() if release is None: self.log.error("no release found for client/user combination (%s/%s)" % (client_id, users)) client_menu = None if hasattr(client, "gotoMenu") and client.gotoMenu is not None: client_menu = loads(client.gotoMenu) # collect users DNs query_result = index.search({"_type": "User", "uid": {"in_": users}}, {"dn": 1}) for entry in query_result: user = ObjectProxy(entry["dn"], read_only=True) config[user.uid] = {} if release is not None: menus = [] if client_menu is not None: menus.append(client_menu) # get all groups the user is member of which have a menu for the given release query = {'_type': 'GroupOfNames', "member": user.dn, "extension": "GotoMenu", "gotoLsbName": release} for res in index.search(query, {"gotoMenu": 1}): # collect user menus for m in res.get("gotoMenu", []): menus.append(loads(m)) if len(menus): user_menu = None for menu_entry in menus: if user_menu is None: user_menu = self.get_submenu(menu_entry) else: self.merge_submenu(user_menu, self.get_submenu(menu_entry)) config[user.uid]["menu"] = user_menu # collect printer settings for user, starting with the clients printers settings = self.__collect_printer_settings(group) printer_names = [x["cn"] for x in settings["printers"]] # get all GroupOfNames with GotoEnvironment the user or client is member of for res in index.search({'_type': 'GroupOfNames', "member": {"in_": [user.dn, client.dn]}, "extension": "GotoEnvironment"}, {"dn": 1}): user_group = ObjectProxy(res["dn"], read_only=True) if group is not None and user_group.dn == group.dn: # this group has already been handled continue s = self.__collect_printer_settings(user_group) if user_group.gotoXResolution is not None: resolution = user_group.gotoXResolution for p in s["printers"]: if p["cn"] not in printer_names: settings["printers"].append(p) printer_names.append(p["cn"]) if s["defaultPrinter"] is not None: settings["defaultPrinter"] = s["defaultPrinter"] # override group environment settings if the client has one s = self.__collect_printer_settings(client) if len(s["printers"]) > 0: settings["printers"] = s["printers"] settings["defaultPrinter"] = s["defaultPrinter"] if user.is_extended_by("GosaAccount") and user.gosaDefaultPrinter is not None: # check if the users default printer is send to the client found = False for printer_settings in settings["printers"]: if printer_settings["cn"] == user.gosaDefaultPrinter: found = True break def process(res): if len(res) == 0: self.log.warning("users defaultPrinter not found: %s" % user.gosaDefaultPrinter) return None elif len(res) == 1: # add this one to the result set printer = ObjectProxy(res[0]["dn"], read_only=True) p_conf = {} for attr in self.printer_attributes: p_conf[attr] = getattr(printer, attr) return p_conf return False if found is False: # find the printer and add it to the settings res = index.search({"_type": "GotoPrinter", "cn": user.gosaDefaultPrinter}, {"dn": 1}) printer_config = process(res) if printer_config is False: # more than 1 printers found by this CN, try to look in the users subtree res = index.search({ "_type": "GotoPrinter", "cn": user.gosaDefaultPrinter, "_adjusted_parent_dn": user.get_adjusted_parent_dn() }, {"dn": 1}) printer_config = process(res) if isinstance(printer_config, dict): settings["printers"].append(printer_config) settings["defaultPrinter"] = user.gosaDefaultPrinter else: self.log.warning("users defaultPrinter not found: %s" % user.gosaDefaultPrinter) else: settings["defaultPrinter"] = user.gosaDefaultPrinter config[user.uid]["printer-setup"] = settings config[user.uid]["resolution"] = None if resolution is not None: config[user.uid]["resolution"] = [int(x) for x in resolution.split("x")] # TODO: collect and send login scripts to client return config
def __collect_user_configuration(self, client_id, users): """ :param client_id: deviceUUID or hostname :param users: list of currently logged in users on the client """ if isinstance(client_id, ObjectProxy): client = client_id else: client = self.__open_device(client_id) group = None index = PluginRegistry.getInstance("ObjectIndex") res = index.search({ "_type": "GroupOfNames", "member": client.dn }, {"dn": 1}) if len(res) > 0: group = ObjectProxy(res[0]["dn"]) config = {} resolution = None if group is not None and group.is_extended_by( "GotoEnvironment") and group.gotoXResolution is not None: resolution = group.gotoXResolution if client.is_extended_by( "GotoEnvironment") and client.gotoXResolution is not None: resolution = client.gotoXResolution release = None if client.is_extended_by("GotoMenu"): release = client.getReleaseName() elif group is not None and group.is_extended_by("ForemanHostGroup"): release = group.getReleaseName() parent_group = group while release is None and parent_group is not None and parent_group.parent_id is not None: res = index.search( { "_type": "GroupOfNames", "extension": "ForemanHostGroup", "foremanGroupId": parent_group.parent_id }, {"dn": 1}) if len(res) == 0: break else: parent_group = ObjectProxy(res[0]["dn"]) release = parent_group.getReleaseName() if release is None: self.log.error( "no release found for client/user combination (%s/%s)" % (client_id, users)) client_menu = None if hasattr(client, "gotoMenu") and client.gotoMenu is not None: client_menu = loads(client.gotoMenu) # collect users DNs query_result = index.search({ "_type": "User", "uid": { "in_": users } }, {"dn": 1}) for entry in query_result: user = ObjectProxy(entry["dn"]) config[user.uid] = {} if release is not None: menus = [] if client_menu is not None: menus.append(client_menu) # get all groups the user is member of which have a menu for the given release query = { '_type': 'GroupOfNames', "member": user.dn, "extension": "GotoMenu", "gotoLsbName": release } for res in index.search(query, {"gotoMenu": 1}): # collect user menus for m in res["gotoMenu"]: menus.append(loads(m)) if len(menus): user_menu = None for menu_entry in menus: if user_menu is None: user_menu = self.get_submenu(menu_entry) else: self.merge_submenu(user_menu, self.get_submenu(menu_entry)) config[user.uid]["menu"] = user_menu # collect printer settings for user, starting with the clients printers settings = self.__collect_printer_settings(group) printer_names = [x["cn"] for x in settings["printers"]] for res in index.search( { '_type': 'GroupOfNames', "member": user.dn, "extension": "GotoEnvironment" }, {"dn": 1}): user_group = ObjectProxy(res["dn"]) if user_group.dn == group.dn: continue s = self.__collect_printer_settings(user_group) if user_group.gotoXResolution is not None: resolution = user_group.gotoXResolution for p in s["printers"]: if p["cn"] not in printer_names: settings["printers"].append(p) printer_names.append(p["cn"]) if s["defaultPrinter"] is not None: settings["defaultPrinter"] = s["defaultPrinter"] # override group environment settings if the client has one s = self.__collect_printer_settings(client) if len(s["printers"]) > 0: settings["printers"] = s["printers"] settings["defaultPrinter"] = s["defaultPrinter"] if user.is_extended_by( "GosaAccount") and user.gosaDefaultPrinter is not None: # check if the users default printer is send to the client found = False for printer_settings in settings["printers"]: if printer_settings["cn"] == user.gosaDefaultPrinter: found = True break def process(res): if len(res) == 0: self.log.warning("users defaultPrinter not found: %s" % user.gosaDefaultPrinter) return None elif len(res) == 1: # add this one to the result set printer = ObjectProxy(res[0]["dn"]) p_conf = {} for attr in self.printer_attributes: p_conf[attr] = getattr(printer, attr) return p_conf return False if found is False: # find the printer and add it to the settings res = index.search( { "_type": "GotoPrinter", "cn": user.gosaDefaultPrinter }, {"dn": 1}) printer_config = process(res) if printer_config is False: # more than 1 printers found by this CN, try to look in the users subtree res = index.search( { "_type": "GotoPrinter", "cn": user.gosaDefaultPrinter, "_adjusted_parent_dn": user.get_adjusted_parent_dn() }, {"dn": 1}) printer_config = process(res) if isinstance(printer_config, dict): settings["printers"].append(printer_config) settings["defaultPrinter"] = user.gosaDefaultPrinter else: self.log.warning("users defaultPrinter not found: %s" % user.gosaDefaultPrinter) else: settings["defaultPrinter"] = user.gosaDefaultPrinter config[user.uid]["printer-setup"] = settings config[user.uid]["resolution"] = None if resolution is not None: config[user.uid]["resolution"] = [ int(x) for x in resolution.split("x") ] # TODO: collect and send login scripts to client return config