diff options
Diffstat (limited to 'src/account/Cura_MemberOfGroupProvider.c')
-rw-r--r-- | src/account/Cura_MemberOfGroupProvider.c | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/src/account/Cura_MemberOfGroupProvider.c b/src/account/Cura_MemberOfGroupProvider.c new file mode 100644 index 0000000..1190fb6 --- /dev/null +++ b/src/account/Cura_MemberOfGroupProvider.c @@ -0,0 +1,280 @@ +#include <konkret/konkret.h> +#include "Cura_MemberOfGroup.h" +#include "Cura_Group.h" +#include "Cura_Identity.h" + +#include "aux_lu.h" +#include "macros.h" +#include "globals.h" + +#include <libuser/entity.h> +#include <libuser/user.h> + +static const CMPIBroker* _cb; + +static void Cura_MemberOfGroupInitialize() +{ +} + +static CMPIStatus Cura_MemberOfGroupCleanup( + CMPIInstanceMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Cura_MemberOfGroupEnumInstanceNames( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + return KDefaultEnumerateInstanceNames( + _cb, mi, cc, cr, cop); +} + +static CMPIStatus Cura_MemberOfGroupEnumInstances( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + Cura_GroupRef lgref; + Cura_IdentityRef liref; + Cura_MemberOfGroup lmog; + + struct lu_context *luc = NULL; + struct lu_error *error = NULL; + GPtrArray *groups = NULL; + GValueArray *accounts = NULL; + struct lu_ent *lueg = NULL; + struct lu_ent *luea = NULL; + + size_t i, j; + const char *nameSpace = KNameSpace(cop); + char *uid = NULL; + + luc = lu_start(NULL, 0, NULL, NULL, lu_prompt_console_quiet, NULL, &error); + if (!luc) + { + fprintf(stderr, "Error initializing: %s\n", lu_strerror(error)); + exit(1); + } + uid = malloc(256 * sizeof(char)); + /* Go through each group */ + groups = lu_groups_enumerate_full(luc, "*", &error); + for (i = 0; (groups != NULL) && (i < groups->len); i++) + { + lueg = g_ptr_array_index(groups, i); + Cura_GroupRef_Init(&lgref, _cb, nameSpace); + Cura_GroupRef_Set_CreationClassName(&lgref, Cura_Group_ClassName); + Cura_GroupRef_Set_Name(&lgref, aux_lu_get_str(lueg, LU_GROUPNAME)); + + /* For each user in the group */ + accounts = lu_users_enumerate_by_group(luc, + aux_lu_get_str(lueg, LU_GROUPNAME), &error); + for (j = 0; (accounts != NULL) && (j < accounts->n_values); j++) + { + luea = lu_ent_new(); + lu_user_lookup_name(luc, + g_value_get_string(g_value_array_get_nth(accounts, j)), + luea, &error); + snprintf(uid, 255, ORGID":UID:%ld", + aux_lu_get_long(luea, LU_UIDNUMBER)); + Cura_IdentityRef_Init(&liref, _cb, nameSpace); + Cura_IdentityRef_Set_InstanceID(&liref, uid); + + Cura_MemberOfGroup_Init(&lmog, _cb, nameSpace); + Cura_MemberOfGroup_Set_Collection(&lmog, &lgref); + Cura_MemberOfGroup_Set_Member(&lmog, &liref); + + KReturnInstance(cr, lmog); + lu_ent_free(luea); + } /* for users */ + if (accounts) + { + g_value_array_free(accounts); + } + + + lu_ent_free(lueg); + } /* for groups */ + free(uid); + + if (groups) + { + g_ptr_array_free(groups, TRUE); + } + + lu_end(luc); + + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Cura_MemberOfGroupGetInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + return KDefaultGetInstance( + _cb, mi, cc, cr, cop, properties); +} + +static CMPIStatus Cura_MemberOfGroupCreateInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Cura_MemberOfGroupModifyInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci, + const char**properties) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Cura_MemberOfGroupDeleteInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Cura_MemberOfGroupExecQuery( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* lang, + const char* query) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Cura_MemberOfGroupAssociationCleanup( + CMPIAssociationMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Cura_MemberOfGroupAssociators( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* resultClass, + const char* role, + const char* resultRole, + const char** properties) +{ + return KDefaultAssociators( + _cb, + mi, + cc, + cr, + cop, + Cura_MemberOfGroup_ClassName, + assocClass, + resultClass, + role, + resultRole, + properties); +} + +static CMPIStatus Cura_MemberOfGroupAssociatorNames( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* resultClass, + const char* role, + const char* resultRole) +{ + return KDefaultAssociatorNames( + _cb, + mi, + cc, + cr, + cop, + Cura_MemberOfGroup_ClassName, + assocClass, + resultClass, + role, + resultRole); +} + +static CMPIStatus Cura_MemberOfGroupReferences( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* role, + const char** properties) +{ + return KDefaultReferences( + _cb, + mi, + cc, + cr, + cop, + Cura_MemberOfGroup_ClassName, + assocClass, + role, + properties); +} + +static CMPIStatus Cura_MemberOfGroupReferenceNames( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* role) +{ + return KDefaultReferenceNames( + _cb, + mi, + cc, + cr, + cop, + Cura_MemberOfGroup_ClassName, + assocClass, + role); +} + +CMInstanceMIStub( + Cura_MemberOfGroup, + Cura_MemberOfGroup, + _cb, + Cura_MemberOfGroupInitialize()) + +CMAssociationMIStub( + Cura_MemberOfGroup, + Cura_MemberOfGroup, + _cb, + Cura_MemberOfGroupInitialize()) + +KONKRET_REGISTRATION( + "root/cimv2", + "Cura_MemberOfGroup", + "Cura_MemberOfGroup", + "instance association") |