]> andersk Git - moira.git/blobdiff - incremental/afs.c
specify path to synctree
[moira.git] / incremental / afs.c
index 22f5c09e432a330e4019d45adee086270367cf34..69539a348384c9fab429e50e3b121f44360dab8a 100644 (file)
@@ -10,7 +10,8 @@
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/file.h>
-#include <strings.h>
+#include <string.h>
+#include <unistd.h>
 
 #include <krb.h>
 #include <moira.h>
 #define STOP_FILE "/moira/afs/noafs"
 #define file_exists(file) (access((file), F_OK) == 0)
 
-#if defined(vax) && !defined(__STDC__)
-#define volatile
-#endif
-
 char *whoami;
 
 /* Main stub routines */
@@ -41,10 +38,10 @@ int do_quota();
 /* Support stub routines */
 int run_cmd();
 int add_user_lists();
-int get_members();
+int add_list_members();
 int check_user();
 int edit_group();
-int pr_try();
+long pr_try();
 int check_afs();
 
 /* libprot.a routines */
@@ -78,14 +75,15 @@ int argc;
     for (i = getdtablesize() - 1; i > 2; i--)
       close(i);
 
+    whoami = ((whoami = strrchr(argv[0], '/')) ? whoami+1 : argv[0]);
+
     table = argv[1];
     beforec = atoi(argv[2]);
     before = &argv[4];
     afterc = atoi(argv[3]);
     after = &argv[4 + beforec];
-    whoami = argv[0];
 
-    setlinebuf(stdout);
+    setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
 
     strcpy(tbl_buf, table);
     strcat(tbl_buf, " (");
@@ -102,7 +100,7 @@ int argc;
     }
     strcat(tbl_buf, ")");
 #ifdef DEBUG
-    printf("%s\n", tbl_buf);
+    com_err(whoami, 0, "%s", tbl_buf);
 #endif
 
     initialize_sms_error_table();
@@ -112,7 +110,7 @@ int argc;
        do_user(before, beforec, after, afterc);
     } else if (!strcmp(table, "list")) {
        do_list(before, beforec, after, afterc);
-    } else if (!strcmp(table, "members")) {
+    } else if (!strcmp(table, "imembers")) {
        do_member(before, beforec, after, afterc);
     } else if (!strcmp(table, "filesys")) {
        do_filesys(before, beforec, after, afterc);
@@ -152,6 +150,9 @@ int afterc;
 
     if (astate == bstate) {
        /* Only a modify has to be done */
+       com_err(whoami, 0, "Changing user %s (uid %d) to %s (uid %d)",
+              before[U_NAME], buid, after[U_NAME], auid);
+
        code = pr_try(pr_ChangeEntry, before[U_NAME], after[U_NAME], auid, "");
        if (code) {
            critical_alert("incremental",
@@ -162,6 +163,9 @@ int afterc;
        return;
     }
     if (bstate == 1) {
+       com_err(whoami, 0, "Deleting user %s (uid %d)",
+              before[U_NAME], buid);
+
        code = pr_try(pr_DeleteByID, buid);
        if (code && code != PRNOENT) {
            critical_alert("incremental",
@@ -171,6 +175,10 @@ int afterc;
        return;
     }
     if (astate == 1) {
+       com_err(whoami, 0, "%s user %s (uid %d)",
+              ((bstate != 0) ? "Reactivating" : "Creating"),
+              after[U_NAME], auid);
+       
        code = pr_try(pr_CreateUser, after[U_NAME], &auid);
        if (code) {
            critical_alert("incremental",
@@ -235,6 +243,10 @@ int afterc;
            strcpy(g2, "system:");
            strcat(g1, before[L_NAME]);
            strcat(g2, after[L_NAME]);
+
+           com_err(whoami, 0, "Changing group %s (gid %d) to %s (gid %d)",
+                  before[L_NAME], bgid, after[L_NAME], agid);
+
            code = pr_try(pr_ChangeEntry, g1, g2, -agid, "");
            if (code) {
                critical_alert("incremental",
@@ -244,6 +256,9 @@ int afterc;
            }
        }
        if (ahide != bhide) {
+           com_err(whoami, 0, "Making group %s (gid %d) %s",
+                  after[L_NAME], agid,
+                  (ahide ? "hidden" : "visible"));
            code = pr_try(pr_SetFieldsEntry, -agid, PR_SF_ALLBITS,
                          (ahide ? PRP_STATUS_ANY : PRP_GROUP_DEFAULT) >>PRIVATE_SHIFT,
                          0 /*ngroups*/, 0 /*nusers*/);
@@ -256,6 +271,8 @@ int afterc;
        return;
     }
     if (bgid) {
+       com_err(whoami, 0, "Deleting group %s (gid %d)",
+              before[L_NAME], bgid);
        code = pr_try(pr_DeleteByID, -bgid);
        if (code && code != PRNOENT) {
            critical_alert("incremental",
@@ -269,6 +286,8 @@ int afterc;
        strcat(g1, after[L_NAME]);
        strcpy(g2, "system:administrators");
        id = -agid;
+       com_err(whoami, 0, "Creating %s group %s (gid %d)",
+              (ahide ? "hidden" : "visible"), after[L_NAME], agid);
        code = pr_try(pr_CreateGroup, g1, g2, &id);
        if (code) {
            critical_alert("incremental",
@@ -297,16 +316,28 @@ int afterc;
                           after[L_NAME], error_message(code));
            return;
        }
-       av[0] = "LIST";
-       av[1] = after[L_NAME];
-       get_members(2, av, after[L_NAME]);
-
+       av[0] = after[L_NAME];
+       code = mr_query("get_end_members_of_list", 1, av,
+                       add_list_members, after[L_NAME]);
+       if (code)
+           critical_alert("incremental",
+                          "Couldn't retrieve full membership of list %s: %s",
+                          after[L_NAME], error_message(code));
        moira_disconnect();
        return;
     }
 }
 
 
+    
+#define LM_EXTRA_ACTIVE          (LM_END)
+#define LM_EXTRA_PUBLIC   (LM_END+1)
+#define LM_EXTRA_HIDDEN   (LM_END+2)
+#define LM_EXTRA_MAILLIST (LM_END+3)
+#define LM_EXTRA_GROUP    (LM_END+4)
+#define LM_EXTRA_GID      (LM_END+5)
+#define LM_EXTRA_END      (LM_END+6)
+
 do_member(before, beforec, after, afterc)
 char **before;
 int beforec;
@@ -315,15 +346,23 @@ int afterc;
 {
     int code;
     char *p;
-    
-    if ((beforec < 4 || !atoi(before[LM_END])) &&
-       (afterc < 4 || !atoi(after[LM_END])))
-       return;
 
-    if (afterc) 
-       edit_group(1, after[LM_LIST], after[LM_TYPE], after[LM_MEMBER]);
-    if (beforec)
+    if (afterc) {
+       if (afterc < LM_EXTRA_END) {
+           return;
+       } else
+         if (!atoi(after[LM_EXTRA_ACTIVE]) || !atoi(after[LM_EXTRA_GROUP]))
+           return;
+       
+       edit_group(1, after[LM_LIST], after[LM_TYPE], after[LM_MEMBER]);
+    } else if (beforec) {
+       if (beforec < LM_EXTRA_END) {
+           return;
+       } else
+         if (!atoi(before[LM_EXTRA_ACTIVE]) || !atoi(before[LM_EXTRA_GROUP]))
+           return;
        edit_group(0, before[LM_LIST], before[LM_TYPE], before[LM_MEMBER]);
+    }
 }
 
 
@@ -334,7 +373,7 @@ char **after;
 int afterc;
 {
     char cmd[1024];
-    int acreate, atype, btype;
+    int acreate, atype, bcreate, btype;
 
     if (afterc < FS_CREATE) {
        atype = acreate = 0;
@@ -356,8 +395,9 @@ int afterc;
     }
     
     btype = !strcmp(before[FS_TYPE], "AFS");
+    bcreate = atoi(before[FS_CREATE]);
     if (afterc < FS_CREATE) {
-       if (btype)
+       if (btype && bcreate)
            critical_alert("incremental",
                           "Cannot delete AFS filesystem %s: Operation not supported",
                           before[FS_NAME]);
@@ -445,22 +485,17 @@ add_user_lists(ac, av, user)
 {
     if (atoi(av[L_ACTIVE]) && atoi(av[L_GROUP]))       /* active group ? */
        edit_group(1, av[L_NAME], "USER", user);
+    return 0;
 }
 
 
-get_members(ac, av, group)
+add_list_members(ac, av, group)
     int ac;
     char *av[];
     char *group;
 {
-    int code=0;
-
-    code = mr_query("get_end_members_of_list", 1, &av[1], get_members, group);
-    if (code)
-       critical_alert("incremental",
-                      "Couldn't retrieve full membership of %s: %s",
-                      group, error_message(code));
-    return code;
+    edit_group(1, group, av[0], av[1]);
+    return 0;
 }
 
 
@@ -470,6 +505,7 @@ check_user(ac, av, ustate)
     int *ustate;
 {
     *ustate = atoi(av[U_STATE]);
+    return 0;
 }
 
 
@@ -491,7 +527,7 @@ edit_group(op, group, type, member)
     if (!local_realm[0])
        krb_get_lrealm(local_realm, 1);
     if (!strcmp(type, "KERBEROS")) {
-       p = index(member, '@');
+       p = strchr(member, '@');
        if (p && !strcasecmp(p+1, local_realm))
            *p = 0;
     } else if (strcmp(type, "USER"))
@@ -518,6 +554,10 @@ edit_group(op, group, type, member)
 
     strcpy(buf, "system:");
     strcat(buf, group);
+    com_err(whoami, 0, "%s %s %s group %s",
+          (op ? "Adding" : "Removing"), member,
+          (op ? "to" : "from"), group);
+    code = 0;
     code=pr_try(op ? pr_AddToGroup : pr_RemoveUserFromGroup, member, buf);
     if (code) {
        if (op==1 && code == PRIDEXIST) return; /* Already added */
@@ -536,8 +576,15 @@ edit_group(op, group, type, member)
                               "Error contacting Moira server to lookup user %s: %s",
                               member, error_message(code));
            }
-           moira_disconnect();
+
+           /* We don't use moira_disconnect()
+            * because we may already be in the routine.
+            */
+           mr_disconnect();
+           mr_connections--;
+
            if (!code && ustate!=1 && ustate!=2) return; /* inactive user */
+           code = PRNOENT;
        }
 
        critical_alert("incremental",
@@ -554,23 +601,27 @@ long pr_try(fn, a1, a2, a3, a4, a5, a6, a7, a8)
     char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
 {
     static int initd=0;
-    volatile register long code;
+    register long code;
     register int tries = 0;
 #ifdef DEBUG
     char fname[64];
 #endif
 
     check_afs();
-    
-    if (!initd) {
-       code=pr_Initialize(1, AFSCONF_CLIENTNAME, 0);
-       if (code) {
-           critical_alert("incremental", "Couldn't initialize libprot: %s",
-                          error_message(code));
-           return;
-       }
+
+    if (initd) {
+       code=pr_Initialize(0, AFSCONF_CLIENTNAME, 0);
+    } else {
+       code = 0;
        initd = 1;
     }
+    if (!code) code=pr_Initialize(1, AFSCONF_CLIENTNAME, 0);
+    if (code) {
+       critical_alert("incremental", "Couldn't initialize libprot: %s",
+                      error_message(code));
+       return;
+    }
+
     sleep(1);                                  /* give ptserver room */
 
     while (code = (*fn)(a1, a2, a3, a4, a5, a6, a7, a8)) {
@@ -645,13 +696,12 @@ moira_disconnect()
     struct member *m;
     
     if (!--mr_connections) {
-       while(member_head) {
-           m = member_head;
+       mr_disconnect();
+       while(m = member_head) {
            edit_group(m->op, m->list, m->type, m->member);
            member_head = m->next;
            free(m);
        }
-       mr_disconnect();
     }
     return 0;
 }
This page took 0.043622 seconds and 4 git commands to generate.