[1977] in Moira

home help back first fref pref prev next nref lref last post

changes to winad incremental update to manage

daemon@ATHENA.MIT.EDU (Qing Dong)
Mon Aug 5 15:06:20 2002

Message-Id: <5.1.0.14.2.20020805150324.00ad6298@hesiod>
Date: Mon, 05 Aug 2002 15:06:18 -0400
To: moiradev@mit.edu
From: Qing Dong <dongq@MIT.EDU>
Cc: jcalz@mit.edu
Mime-Version: 1.0
Content-Type: text/plain; charset="us-ascii"; format=flowed

Hi. The WinAthena group needs to create lists associated with
containers. The lists' creation, deletion, membership management
are all handled by winad incremental update.

Thanks.

Qing

Index: winad.c
===================================================================
RCS file: 
\\dongq-afs\all\athena.mit.edu\astaff\project\moiradev\repository/moira/incremental/winad/winad.c,v
retrieving revision 1.29
diff -c -r1.29 winad.c
*** winad.c	2002/04/30 02:21:25	1.29
--- winad.c	2002/08/05 19:02:11
***************
*** 81,101 ****
    * filesys 12 0 username AFS ATHENA.MIT.EDU 
/afs/athena.mit.edu/user/n/e/username /mit/username w descripton username 
wheel 1 HOMEDIR 101727
    *
    * arguments when moira creates a container (OU).
!  * containers 0 7 machines/test/bottom description location contact USER 
105316 2222
    *
    * arguments when moira deletes a container (OU).
!  * containers 7 0 machines/test/bottom description location contact USER 
105316 2222
    *
    * arguments when moira modifies a container information (OU).
!  * containers 7 7 machines/test/bottom description location contact USER 
105316 2222 machines/test/bottom description1 location contact USER 105316 2222
    *
    * arguments when moira adds a machine from an OU
    * table name, beforec, afterc, machine_name, container_name, mach_id, 
cnt_id
!  * mcntmap 0 4 DAVIDT.MIT.EDU dttest/dttest1 76767 46
    *
    * arguments when moira removes a machine from an OU
    * table name, beforec, afterc, machine_name, container_name, mach_id, 
cnt_id
!  * mcntmap 0 4 DAVIDT.MIT.EDU dttest/dttest1 76767 46
    *
   */
   #include <mit-copyright.h>
--- 81,101 ----
    * filesys 12 0 username AFS ATHENA.MIT.EDU 
/afs/athena.mit.edu/user/n/e/username /mit/username w descripton username 
wheel 1 HOMEDIR 101727
    *
    * arguments when moira creates a container (OU).
!  * containers 0 8 machines/test/bottom description location contact USER 
105316 2222 [none]
    *
    * arguments when moira deletes a container (OU).
!  * containers 8 0 machines/test/bottom description location contact USER 
105316 2222 groupname
    *
    * arguments when moira modifies a container information (OU).
!  * containers 8 8 machines/test/bottom description location contact USER 
105316 2222 groupname machines/test/bottom description1 location contact 
USER 105316 2222 groupname
    *
    * arguments when moira adds a machine from an OU
    * table name, beforec, afterc, machine_name, container_name, mach_id, 
cnt_id
!  * mcntmap 0 5 DAVIDT.MIT.EDU dttest/dttest1 76767 46 groupname
    *
    * arguments when moira removes a machine from an OU
    * table name, beforec, afterc, machine_name, container_name, mach_id, 
cnt_id
!  * mcntmap 0 5 DAVIDT.MIT.EDU dttest/dttest1 76767 46 groupname
    *
   */
   #include <mit-copyright.h>
***************
*** 246,257 ****
--- 246,259 ----
   #define CONTAINER_TYPE     4
   #define CONTAINER_ID       5
   #define CONTAINER_ROWID    6
+ #define CONTAINER_GROUP_NAME 7

   /*mcntmap arguments*/
   #define OU_MACHINE_NAME        0
   #define OU_CONTAINER_NAME      1
   #define OU_MACHINE_ID          2
   #define OU_CONTAINER_ID        3
+ #define OU_CONTAINER_GROUP     4

   typedef struct lk_entry {
     int     op;
***************
*** 284,289 ****
--- 286,292 ----
     mods[n]->mod_type = t; 		\
     mods[n++]->mod_values = v

+
   LK_ENTRY *member_base = NULL;
   LK_ENTRY *sid_base = NULL;
   LK_ENTRY **sid_ptr = NULL;
***************
*** 343,348 ****
--- 346,360 ----
   int get_group_membership(char *group_membership, char *group_ou,
                            int *security_flag, char **av);
   int get_machine_ou(LDAP *ldap_handle, char *dn_path, char *member, char 
*machine_ou);
+ int Moira_container_group_create(char **after);
+ int Moira_container_group_delete(char **before);
+ int Moira_groupname_create(char *GroupName, char *ContainerName, char 
*ContainerRowID);
+ int Moira_container_group_update(char **before, char **after);
+ int Moira_process_machine_container_group(char *MachineName, char* 
groupName, int DeleteMachine);
+ int Moira_addGroupToParent(char *origContainerName, char *GroupName);
+ int Moira_getContainerGroup(int ac, char **av, void *ptr);
+ int Moira_getGroupName(char *origContainerName, char *GroupName, int 
ParentFlag);
+ int Moira_setContainerGroup(char *ContainerName, char *GroupName);
   int ProcessAce(LDAP *ldap_handle, char *dn_path, char *group_name, char 
*Type,
                  int UpdateGroup, int *ProcessGroup);
   int process_group(LDAP *ldap_handle, char *dn_path, char *MoiraId,
***************
*** 532,540 ****
       char    ADContainerName[128];
       char    MachineName[128];
       long    rc;

!     memset(MoiraContainerName, '\0', sizeof(MoiraContainerName));
       memset(ADContainerName, '\0', sizeof(ADContainerName));
       if ((beforec == 0) && (afterc == 0))
           return;

--- 544,556 ----
       char    ADContainerName[128];
       char    MachineName[128];
       long    rc;
+     int     DeleteMachine;
+     char    MoiraContainerGroup[64];

!     DeleteMachine = 0;
       memset(ADContainerName, '\0', sizeof(ADContainerName));
+     memset(MoiraContainerGroup, 0, sizeof(MoiraContainerGroup));
+
       if ((beforec == 0) && (afterc == 0))
           return;

***************
*** 549,574 ****
--- 565,600 ----
       if ((beforec != 0) && (afterc == 0)) /*remove a machine*/
       {
           strcpy(MachineName, before[OU_MACHINE_NAME]);
+ 	strcpy(MoiraContainerGroup, before[OU_CONTAINER_GROUP]);
+         DeleteMachine = 1;
           com_err(whoami, 0, "removing machine %s from %s", MachineName, 
before[OU_CONTAINER_NAME]);
       }
       else if ((beforec == 0) && (afterc != 0)) /*add a machine*/
       {
           strcpy(MachineName, after[OU_MACHINE_NAME]);
+ 	strcpy(MoiraContainerGroup, after[OU_CONTAINER_GROUP]);
           com_err(whoami, 0, "adding machine %s to container %s", 
MachineName, after[OU_CONTAINER_NAME]);
       }
       else
+     {
+         moira_disconnect();
           return;
+     }

+     Moira_process_machine_container_group(MachineName, 
MoiraContainerGroup, DeleteMachine);
       if (machine_check(ldap_handle, dn_path, MachineName))
       {
           com_err(whoami, 0, "machine %s not found in AD.", MachineName);
+         moira_disconnect();
           return;
       }
+     memset(MoiraContainerName, '\0', sizeof(MoiraContainerName));
       machine_get_moira_container(ldap_handle, dn_path, MachineName, 
MoiraContainerName);
       if (strlen(MoiraContainerName) == 0)
       {
           com_err(whoami, 0, "machine %s container not found in Moira - 
moving to orphans OU.", MachineName);
           machine_move_to_ou(ldap_handle, dn_path, MachineName, 
orphans_machines_ou);
+         moira_disconnect();
           return;
       }
       container_get_dn(MoiraContainerName, ADContainerName);
***************
*** 576,595 ****
--- 602,634 ----
          strcat(MoiraContainerName, "/");
       container_check(ldap_handle, dn_path, MoiraContainerName);
       machine_move_to_ou(ldap_handle, dn_path, MachineName, ADContainerName);
+
+     moira_disconnect();
       return;
   }

   void do_container(LDAP *ldap_handle, char *dn_path, char *ldap_hostname,
                char **before, int beforec, char **after, int afterc)
   {
+   long rc;

     if ((beforec == 0) && (afterc == 0))
       return;

+   if (rc = moira_connect())
+   {
+       critical_alert("AD incremental",
+                      "Error contacting Moira server : %s",
+                      error_message(rc));
+       return;
+   }
+
     if ((beforec != 0) && (afterc == 0)) /*delete a new container*/
       {
         com_err(whoami, 0, "deleting container %s", before[CONTAINER_NAME]);
         container_delete(ldap_handle, dn_path, beforec, before);
+       Moira_container_group_delete(before);
+       moira_disconnect();
         return;
       }
     if ((beforec == 0) && (afterc != 0)) /*create a container*/
***************
*** 597,602 ****
--- 636,643 ----
         com_err(whoami, 0, "creating container %s", after[CONTAINER_NAME]);
         container_check(ldap_handle, dn_path, after[CONTAINER_NAME]);
         container_create(ldap_handle, dn_path, afterc, after);
+       Moira_container_group_create(after);
+       moira_disconnect();
         return;
       }

***************
*** 604,613 ****
--- 645,658 ----
       {
         com_err(whoami, 0, "renaming container %s to %s", 
before[CONTAINER_NAME], after[CONTAINER_NAME]);
         container_rename(ldap_handle, dn_path, beforec, before, afterc, 
after);
+       Moira_container_group_update(before, after);
+       moira_disconnect();
         return;
       }
     com_err(whoami, 0, "updating container %s information", 
after[CONTAINER_NAME]);
     container_update(ldap_handle, dn_path, beforec, before, afterc, after);
+   Moira_container_group_update(before, after);
+   moira_disconnect();
     return;
   }

***************
*** 5036,5038 ****
--- 5081,5398 ----
       return(0);
   }

+ int Moira_container_group_create(char **after)
+ {
+     long rc;
+     char GroupName[64];
+     char *argv[13];
+
+     memset(GroupName, '\0', sizeof(GroupName));
+     rc = Moira_groupname_create(GroupName, after[CONTAINER_NAME], 
after[CONTAINER_ROWID]);
+     if (rc)
+       return rc;
+
+     argv[L_NAME] = GroupName;
+     argv[L_ACTIVE] = "1";
+     argv[L_PUBLIC] = "0";
+     argv[L_HIDDEN] = "0";
+     argv[L_MAILLIST] = "0";
+     argv[L_GROUP] = "1";
+     argv[L_GID] = UNIQUE_GID;
+     argv[L_NFSGROUP] = "0";
+     argv[L_DESC] = "auto created container group";
+     argv[L_ACE_TYPE] = "USER";
+     argv[L_MEMACE_TYPE] = "USER";
+     argv[L_ACE_NAME] = "sms";
+     argv[L_MEMACE_NAME] = "sms";
+
+     if (rc = mr_query("add_list", 13, argv, NULL, NULL))
+     {
+         com_err(whoami, 0, "couldn't create container group %s for 
container %s: %s",
+                 GroupName, after[CONTAINER_NAME], error_message(rc));
+     }
+
+     Moira_setContainerGroup(after[CONTAINER_NAME], GroupName);
+     Moira_addGroupToParent(after[CONTAINER_NAME], GroupName);
+
+     return(rc);
+ }
+
+ int Moira_container_group_update(char **before, char **after)
+ {
+     long rc;
+     char BeforeGroupName[64];
+     char AfterGroupName[64];
+     char *argv[15];
+
+     if (!strcasecmp(after[CONTAINER_NAME], before[CONTAINER_NAME]))
+         return(0);
+
+     memset(BeforeGroupName, '\0', sizeof(BeforeGroupName));
+     Moira_getGroupName(after[CONTAINER_NAME], BeforeGroupName, 0);
+     if (strlen(BeforeGroupName) == 0)
+         return(0);
+
+     memset(AfterGroupName, '\0', sizeof(AfterGroupName));
+ 	rc = Moira_groupname_create(AfterGroupName, after[CONTAINER_NAME], 
after[CONTAINER_ROWID]);
+     if (rc)
+         return rc;
+
+     if (strcasecmp(BeforeGroupName, AfterGroupName))
+     {
+         argv[L_NAME] = BeforeGroupName;
+         argv[L_NAME + 1] = AfterGroupName;
+         argv[L_ACTIVE + 1] = "1";
+         argv[L_PUBLIC + 1] = "0";
+         argv[L_HIDDEN + 1] = "1";
+         argv[L_MAILLIST + 1] = "0";
+         argv[L_GROUP + 1] = "1";
+         argv[L_GID + 1] = UNIQUE_GID;
+         argv[L_NFSGROUP + 1] = "0";
+         argv[L_DESC + 1] = "auto created container group";
+         argv[L_ACE_TYPE + 1] = "USER";
+         argv[L_MEMACE_TYPE + 1] = "USER";
+         argv[L_ACE_NAME + 1] = "sms";
+         argv[L_MEMACE_NAME + 1] = "sms";
+
+         if (rc = mr_query("update_list", 14, argv, NULL, NULL))
+         {
+             com_err(whoami, 0, "couldn't rename container group from %s 
to %s: %s",
+                     BeforeGroupName, AfterGroupName, error_message(rc));
+         }
+     }
+
+     return(rc);
+ }
+
+ int Moira_container_group_delete(char **before)
+ {
+     long rc = 0;
+     char *argv[13];
+     char GroupName[64];
+     char ParentGroupName[64];
+
+     memset(ParentGroupName, '\0', sizeof(ParentGroupName));
+     Moira_getGroupName(before[CONTAINER_NAME], ParentGroupName, 1);
+
+
+     memset(GroupName, '\0', sizeof(GroupName));
+     if (strcmp(before[CONTAINER_GROUP_NAME], "[none]"))
+ 	{
+ 	  strcpy(GroupName, before[CONTAINER_GROUP_NAME]);
+ 	}
+
+
+     if ((strlen(ParentGroupName) != 0) && (strlen(GroupName) != 0))
+     {
+         argv[0] = ParentGroupName;
+         argv[1] = "LIST";
+         argv[2] = GroupName;
+         if (rc = mr_query("delete_member_from_list", 3, argv, NULL, NULL))
+         {
+             com_err(whoami, 0, "couldn't delete container group %s from 
list: %s",
+                     GroupName, ParentGroupName, error_message(rc));
+         }
+     }
+
+     if (strlen(GroupName) != 0)
+     {
+         argv[0] = GroupName;
+         if (rc = mr_query("delete_list", 1, argv, NULL, NULL))
+         {
+             com_err(whoami, 0, "couldn't delete container group %s : %s",
+                     GroupName, error_message(rc));
+         }
+     }
+
+     return(rc);
+ }
+
+ int Moira_groupname_create(char *GroupName, char *ContainerName, char 
*ContainerRowID)
+ {
+     char *ptr;
+     char *ptr1;
+     char temp[64];
+     char newGroupName[64];
+     char tempGroupName[64];
+     char *argv[1];
+     int  i;
+     long rc;
+
+     strcpy(temp, ContainerName);
+
+     ptr1 = strrchr(temp, '/');
+     if (ptr1 != NULL)
+ 		ptr = ++ptr1;
+     else
+       ptr = temp;
+
+
+ 	if (strlen(ptr) > 25)
+ 		ptr[25] ='\0';
+
+
+     sprintf(newGroupName, "cnt-%s", ptr);
+
+     /* change everything to lower case */
+     ptr = newGroupName;
+     while (*ptr)
+       {
+ 	if (isupper(*ptr))
+ 	  *ptr = tolower(*ptr);
+ 	if (*ptr == ' ')
+ 	  *ptr = '-';
+         ptr++;
+       }
+
+     strcpy(tempGroupName, newGroupName);
+ 	i = (int)'0';
+ 	/* append 0-9 then a-z if a duplicate is found */
+ 	while(1)
+ 	{
+ 		argv[0] = newGroupName;
+         if (rc = mr_query("get_list_info", 1, argv, NULL, NULL))
+         {
+ 			if (rc == MR_NO_MATCH)
+ 				break;
+             com_err(whoami, 0, "Moira error while creating group name for 
container %s : %s",
+                         ContainerName, error_message(rc));
+ 			return rc;
+         }
+ 		sprintf(newGroupName, "%s-%c", tempGroupName, i);
+ 		if (i == (int)'z')
+ 		{
+ 			com_err(whoami, 0, "Can not find a unique group name for container %s: 
too many duplicate container names",
+ 				ContainerName);
+ 			return 1;
+ 		}
+ 		if (i == '9')
+ 			i = 'a';
+ 		else
+ 			i++;
+ 	}
+
+     strcpy(GroupName, newGroupName);
+     return(0);
+ }
+
+ int Moira_setContainerGroup(char *origContainerName, char *GroupName)
+ {
+     long rc;
+     char *argv[3];
+
+ //det
+ //Garry has to implement the Moira API, I guessed as to what the API 
might look like.
+     argv[0] = origContainerName;
+     argv[1] = GroupName;
+
+     if ((rc = mr_query("set_container_list", 2, argv, NULL, NULL)))
+     {
+         com_err(whoami, 0, "couldn't set container group %s in container 
%s: %s",
+                 GroupName, origContainerName, error_message(rc));
+     }
+
+     return(0);
+ }
+
+ int Moira_addGroupToParent(char *origContainerName, char *GroupName)
+ {
+     char ContainerName[64];
+     char ParentGroupName[64];
+     char *argv[3];
+     long rc;
+
+     strcpy(ContainerName, origContainerName);
+
+     Moira_getGroupName(ContainerName, ParentGroupName, 1);
+     //top-level container
+     if (strlen(ParentGroupName) == 0)
+         return(0);
+
+     argv[0] = ParentGroupName;
+     argv[1] = "LIST";
+     argv[2] = GroupName;
+     if ((rc = mr_query("add_member_to_list", 3, argv, NULL, NULL)))
+     {
+         com_err(whoami, 0, "couldn't add container group %s to parent 
group %s: %s",
+                 GroupName, ParentGroupName, error_message(rc));
+     }
+     return(0);
+ }
+
+ int Moira_getContainerGroup(int ac, char **av, void *ptr)
+ {
+   char **call_args;
+
+   call_args = ptr;
+   strcpy(call_args[0], av[1]);
+   return(0);
+ }
+
+ int Moira_getGroupName(char *origContainerName, char *GroupName, int 
ParentFlag)
+ {
+     int  i;
+     char ContainerName[64];
+     char *argv[3];
+     char *call_args[3];
+     char *ptr;
+     long rc;
+
+     strcpy(ContainerName, origContainerName);
+
+     if (ParentFlag)
+     {
+         ptr = strrchr(ContainerName, '/');
+         if (ptr != NULL)
+             (*ptr) = '\0';
+         else
+             return(0);
+     }
+
+
+ 	argv[0] = ContainerName;
+ 	argv[1] = NULL;
+     call_args[0] = GroupName;
+ 	call_args[1] = NULL;
+
+ //det
+ //Garry has to implement the Moira API, I guessed as to what the API 
might look like.
+ 	if (!(rc = mr_query("get_container_list", 1, argv, 
Moira_getContainerGroup, call_args)))
+ 	{
+ 		if (strlen(GroupName) != 0)
+                 return(0);
+ 	}
+ 	
+
+ 	if (rc)
+ 		com_err(whoami, 0, "couldn't get container group from container %s: %s",
+                     ContainerName, error_message(rc));
+ 	else
+ 		com_err(whoami, 0, "couldn't get container group from container %s",
+                     ContainerName);
+
+     return(0);
+ }
+
+ int Moira_process_machine_container_group( char *MachineName, char* 
GroupName, int DeleteMachine)
+ {
+     char *argv[3];
+     long rc;
+
+     if (strcmp(GroupName, "[none]") == 0)
+       return 0;
+
+     argv[0] = GroupName;
+     argv[1] = "MACHINE";
+     argv[2] = MachineName;
+     if (!DeleteMachine)
+         rc = mr_query("add_member_to_list", 3, argv, NULL, NULL);
+     else
+         rc = mr_query("delete_member_from_list", 3, argv, NULL, NULL);
+     if (rc)
+     {
+         com_err(whoami, 0, "couldn't add machine %s to container group%s: 
%s",
+                 MachineName, GroupName, error_message(rc));
+     }
+     return(0);
+ }


home help back first fref pref prev next nref lref last post