]> andersk Git - moira.git/blobdiff - clients/mmoira/queries.c
reorder fields in filsys forms; don't try to remove window in tty mode
[moira.git] / clients / mmoira / queries.c
index ae29b4e7278168ebbecb073da5417da82f8260ca..3585edace8110caf369769af3b4cf71cf58d4c63 100644 (file)
@@ -2,9 +2,12 @@
  */
 
 #include <stdio.h>
+#include <strings.h>
+#include <ctype.h>
 #include <moira.h>
 #include <moira_site.h>
 #include <sys/types.h>
+#include <sys/time.h>
 #include <netdb.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
@@ -68,8 +71,23 @@ EntryForm *form;
        count = L_MODTIME;
        break;
     case MM_MOD_FILSYS:
-       fn = "mod_filsys";
-       count = FS_MODTIME;
+       f = GetAndClearForm("mod_filsys");
+       if (f == NULL) {
+           display_error("Unknown form in ModifyCallback!\n");
+           return;
+       }
+       f->extrastuff = form->extrastuff;
+       f->menu = form->menu;
+       StoreField(f, FS_NAME, argv[FS_NAME + offset]);
+       StoreField(f, FS_TYPE, argv[FS_TYPE + offset]);
+       for (i = FS_TYPE+1; i < FS_MODTIME-1; i++)
+         if (f->inputlines[i+1]->type == FT_BOOLEAN)
+           f->inputlines[i+1]->returnvalue.booleanvalue =
+             strcmp(argv[i + offset], "0") ? 1 : 0;
+         else
+           StoreField(f, i+1, argv[i + offset]);
+       StoreField(f, FS_TYPE+1, argv[FS_L_TYPE + offset]);
+       return;
        break;
     case MM_MOD_NFS:
        f = GetAndClearForm("mod_nfs");
@@ -84,11 +102,12 @@ EntryForm *form;
        StoreField(f, 2, argv[2]);
        f->inputlines[3]->keywords = nfs_states;
        for (i = 0; nfs_states[i]; i++)
-         if ((atoi(nfs_states[i]) & ~MR_FS_GROUPQUOTA) == atoi(argv[3]))
+         if (atoi(nfs_states[i]) & atoi(argv[3]))
            StoreField(f, 3, nfs_states[i]);
-       StoreField(f, 3, argv[3]);
-       if (atoi(argv[3]) && MR_FS_GROUPQUOTA)
+       if (atoi(argv[3]) & MR_FS_GROUPQUOTA)
          f->inputlines[4]->returnvalue.booleanvalue = 1;
+       else
+         f->inputlines[4]->returnvalue.booleanvalue = 0;
        StoreField(f, 5, argv[4]);
        StoreField(f, 6, argv[5]);
        return;
@@ -100,6 +119,41 @@ EntryForm *form;
        fn = "mod_cluster";
        count = C_MODTIME;
        break;
+    case MM_MOD_PCAP:
+       fn = "mod_printer";
+       count = PCAP_MODTIME;
+       break;
+    case MM_MOD_SERVICE:
+       f = GetAndClearForm("mod_service");
+       if (f == NULL) {
+           display_error("Unknown form in ModifyCallback of mod_service\n");
+           return;
+       }
+       f->extrastuff = form->extrastuff;
+       f->menu = form->menu;
+       for (i = 0; i < 4; i++) StoreField(f, i, argv[i]);
+       StoreField(f, 4, argv[6]);
+       f->inputlines[5]->returnvalue.booleanvalue = atoi(argv[7]);
+       StoreField(f, 6, argv[11]);
+       StoreField(f, 7, argv[12]);
+       return;
+       break;
+    case MM_MOD_HOST:
+       f = GetAndClearForm("mod_host");
+       if (f == NULL) {
+           display_error("Unknown form in ModifyCallback of mod_host\n");
+           return;
+       }
+       f->extrastuff = form->extrastuff;
+       f->menu = form->menu;
+       StoreField(f, 0, argv[0]);
+       StoreField(f, 1, argv[1]);
+       f->inputlines[2]->returnvalue.booleanvalue = atoi(argv[2]);
+       StoreField(f, 3, argv[10]);
+       StoreField(f, 4, argv[11]);
+       StoreField(f, 5, argv[12]);
+       return;
+       break;
     }
 
     if (count > 0) {
@@ -198,9 +252,12 @@ EntryForm *form;
      */
     count = 0;
     for (p = form->inputlines; *p; p++)
-      count++;
+      if (!((*p)->insensitive))
+       count++;
     while (count-- > 1)
       _XmMgrTraversal(form->formpointer, XmTRAVERSE_PREV_TAB_GROUP);
+    MoiraFocusOut(form->inputlines[0]->mywidget,
+                 (XEvent *)NULL, (String *)NULL, 0);
     process_form(form, FALSE);
 }
 
@@ -346,6 +403,7 @@ int remove;
          argv[0] = "*";
        if (!*stringval(form, 1))
          argv[1] = "*";
+       AppendToLog("Kerberos mappings:\n");
        break;
     case MM_SET_POBOX:
        if (!strcmp(argv[1], "POP"))
@@ -354,8 +412,11 @@ int remove;
     case MM_SHOW_ACE_USE:
        if (boolval(form, 2)) {
            sprintf(buf, "R%s", stringval(form, 0));
-           argv[0] = buf;
+           argv[0] = strsave(buf);
        }
+       sprintf(buf, "Objects %s %s can administer\n",
+               stringval(form, 0), stringval(form, 1));
+       AppendToLog(buf);
        break;
     case MM_MOD_LIST:
        if (!strcmp(form->formname, "mod_list")) {
@@ -382,7 +443,11 @@ int remove;
            argv[1] = stringval(form, 2);
            argc = 2;
        } else {
-           sprintf(buf, "Members of list: %s\n", argv[0]);
+           if (boolval(form, 3)) {
+               qy = "get_end_members_of_list";
+               sprintf(buf, "Recursive members of list: %s\n", argv[0]);
+           } else 
+             sprintf(buf, "Members of list: %s\n", argv[0]);
            AppendToLog(buf);
        }
        break;
@@ -409,39 +474,137 @@ int remove;
            qy = "get_filesys_by_group";
            argv[0] = stringval(form, 3);
            argc = 1;
+       } else if (*stringval(form, 4)) {
+           qy = "get_filesys_by_path";
+           argv[0] = stringval(form, 4);
+           argc = 1;
        }
        /* fall through to */
     case MM_SHOW_FSGROUP:
        form->extrastuff = (caddr_t) sq_create();
        break;
     case MM_ADD_FILSYS:
-       StoreHost(form, FS_MACHINE, &argv[FS_MACHINE]);
-       if (!strcmp(stringval(form, FS_TYPE), "AFS") ||
-           !strcmp(stringval(form, FS_TYPE), "FSGROUP") ||
+       for (i = FS_TYPE+1; i < FS_MODTIME-1; i++)
+         argv[i] = StringValue(form, i+1);
+       argv[FS_L_TYPE] = StringValue(form, FS_TYPE+1);
+       StoreHost(form, FS_MACHINE+1, &argv[FS_MACHINE]);
+       if (!strcmp(stringval(form, FS_TYPE), "FSGROUP") ||
            !strcmp(stringval(form, FS_TYPE), "MUL"))
-         argv[FS_MACHINE] = "\\[NONE\\]";
+         argv[FS_MACHINE+1] = "\\[NONE\\]";
        break;
     case MM_MOD_FILSYS:
        if (!strcmp(form->formname, "mod_filsys")) {
            qy = "update_filesys";
-           for (i = 0; i < FS_MODTIME; i++)
-             argv[i + 1] = StringValue(form, i);
-           StoreHost(form, FS_MACHINE, &argv[FS_MACHINE + 1]);
            argv[0] = form->extrastuff;
+           argv[1] = StringValue(form, 0);
+           argv[2] = StringValue(form, 1);
+           argv[FS_L_TYPE+1] = StringValue(form, 2);
+           StoreHost(form, FS_MACHINE+1, &argv[FS_MACHINE + 1]);
+           for (i = FS_MACHINE+1; i < FS_L_TYPE; i++)
+             argv[i] = StringValue(form, i);
            argc = FS_MODTIME + 1;
            break;
        }
        form->extrastuff = (caddr_t) "mod_filsys";
        retfunc = ModifyCallback;
        break;
+    case MM_MOV_FSGROUP:
+       argv[1] = strsave(stringval(form, 1));
+       s = index(argv[1], ' ');
+       if (s) *s = 0;
+       i = MoiraQuery("remove_filesys_from_fsgroup", 2, argv, ModifyCallback,
+                      (char *)form);
+       if (i) {
+           com_err(program_name, i, " removing filesystem from FS group");
+           return;
+       }
+       argc = 3;
+       /* fall through to: */
     case MM_ADD_FSGROUP:
-       
+       /* find the two keys to sort between */
+       argv[2] = strsave(argv[2]);
+       s = index(argv[2], ' ');
+       if (s) {
+           argv[2] = s+2;
+           s = index(argv[2], ')');
+           if (s) *s = 0;
+       } else
+         argv[2] = "";
+       if (*argv[2] == 0) argv[2] = "A";
+       /* Finding the after key is gross.  We look through the widgets
+        * in the radiobox to find the one selected and the one after
+        * it.  The name of the widget is also the member name.
+        */
+       if (!tty) { 
+           Widget w, kid;
+
+           argv[3] = "";
+           w = form->inputlines[2]->mywidget;
+           for (i = 0; i < NumChildren(w); i++) {
+               kid = NthChild(w, i);
+               if (!strcmp(XtName(kid), stringval(form, 2))) {
+                   i++;
+                   if (i < NumChildren(w)) {
+                       argv[3] = strsave(XtName(NthChild(w, i)));
+                       s = index(argv[3], ' ');
+                       if (s) {
+                           argv[3] = s+2;
+                           s = index(argv[3], ')');
+                           if (s) *s = 0;
+                       } else
+                         argv[3] = "";
+                   }
+                   break;
+               }
+           }
+       } else {
+           printf("Don't know how to do this\007\007!\n");
+       }
+       if (*argv[3] == 0) argv[3] = "Z";
+#ifdef DEBUG
+       printf("Got before key of \"%s\" and after key of \"%s\"\n",
+              argv[2], argv[3]);
+#endif /* DEBUG */
+       /* copy the matching chars */
+       for  (s = buf; *argv[2] && *argv[2] == *argv[3]; argv[3]++)
+         *s++ = *argv[2]++;
+       /* and set the last char */
+       if (*argv[2] == 0)
+         *argv[2] = i = 'A';
+       else
+         i = argv[2][1];
+       if (i == 0) i = 'A';
+       if (*argv[3] == 0) *argv[3] = 'Z';
+       if (*argv[3] - *argv[2] > 1) {
+           *s++ = (*argv[3] + *argv[2])/2;
+       } else {
+           *s++ = *argv[2];
+           *s++ = (i + 'Z')/2;
+       }
+       *s = 0;
+       argv[2] = strsave(buf);
+       break;
+    case MM_DEL_FSGROUP:
+       argv[1] = strsave(stringval(form, 1));
+       s = index(argv[1], ' ');
+       if (s) *s = 0;
        break;
     case MM_SHOW_FS_ALIAS:
+       if (!*stringval(form, 0))
+         argv[2] = "*";
+       else
+         argv[2] = stringval(form, 0);
+       if (!*stringval(form, 1))
+         argv[0] = "*";
+       else
+         argv[0] = stringval(form, 1);
+       argv[1] = "FILESYS";
+       break;
     case MM_ADD_FS_ALIAS:
     case MM_DEL_FS_ALIAS:
+       argv[0] = stringval(form, 1);
        argv[1] = "FILESYS";
-       argv[2] = stringval(form, 1);
+       argv[2] = stringval(form, 0);
        break;
     case MM_SHOW_NFS:
        StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
@@ -461,6 +624,12 @@ int remove;
        if (!strcmp(form->formname, "mod_nfs")) {
            qy = "update_nfsphys";
            argc = NFS_MODTIME;
+           StoreHost(form, NFS_NAME, &argv[NFS_NAME]);
+           sprintf(buf, "%d", atoi(stringval(form, NFS_STATUS)) +
+                   (boolval(form, 4) ? MR_FS_GROUPQUOTA : 0));
+           argv[NFS_STATUS] = buf;
+           argv[NFS_ALLOC] = stringval(form, 5);
+           argv[NFS_SIZE] = stringval(form, 6);
            break;
        }
        form->extrastuff = (caddr_t) "mod_nfs";
@@ -532,13 +701,62 @@ int remove;
     case MM_SHOW_CLDATA:
        if (!*stringval(form, 1))
          argv[1] = "*";
+       AppendToLog("Cluster data:\n");
        break;
     case MM_ADD_PCAP:
        StoreHost(form, PCAP_SPOOL_HOST, &argv[PCAP_SPOOL_HOST]);
        StoreHost(form, PCAP_QSERVER, &argv[PCAP_QSERVER]);
        break;
+    case MM_MOD_PCAP:
+       if (!strcmp(form->formname, "mod_printer")) {
+           qy = "update_printcap_entry";
+           argc = PCAP_MODTIME;
+           break;
+       }
+       form->extrastuff = (caddr_t) "mod_printer";
+       retfunc = ModifyCallback;
+       break;
+    case MM_MOD_SERVICE:
+       if (!strcmp(form->formname, "mod_service")) {
+           qy = "update_server_info";
+           argc = SC_END;
+           break;
+       }
+       form->extrastuff = (caddr_t) "mod_service";
+       retfunc = ModifyCallback;
+       break;
+    case MM_RESET_SERVICE:
+       argv[1] = argv[2] = argv[3] = argv[4] = "0";
+       argv[5] = "";
+       break;
+    case MM_RESET_HOST:
+       StoreHost(form, 1, &argv[1]);
+       argv[2] = argv[3] = argv[4] = argv[5] = argv[7] = argv[8] = "0";
+       argv[6] = "";
+       break;
+    case MM_CLEAR_HOST:
+       StoreHost(form, 1, &argv[1]);
+       break;
+    case MM_SHOW_HOST:
+       if (!*stringval(form, 0))
+         argv[0] = "*";
+       if (!*stringval(form, 1))
+         argv[1] = "*";
+       else
+         StoreHost(form, 1, &argv[1]);
+       break;
+    case MM_MOD_HOST:
+       if (!strcmp(form->formname, "mod_host")) {
+           qy = "update_server_host_info";
+           argc = SHI_END;
+           break;
+       }
+       StoreHost(form, 1, &argv[1]);
+       form->extrastuff = (caddr_t)  "mod_host";
+       retfunc = ModifyCallback;
+       break;
     case MM_SAVE_LOG:
-       if (!write_log_to_file(stringval(form, 0)) && remove)
+       if (!write_log_to_file(stringval(form, 0)) && !tty && remove)
          XtUnmanageChild(form->formpointer);
        return;
     case MM_NEW_VALUE:
@@ -548,6 +766,17 @@ int remove;
        for (s = argv[2]; *s; s++)
          if (islower(*s)) *s = toupper(*s);
        break;
+    case MM_TRIGGER_DCM:
+       if (form->inputlines[0]->returnvalue.booleanvalue) {
+           i = mr_do_update();
+           if (i)
+             com_err(program_name, i, " starting DCM");
+           else
+             AppendToLog("DCM started.\n");
+       }
+       if (!tty && remove)
+         XtUnmanageChild(form->formpointer);
+       return;
     }
 
     if (argc == -1) {
@@ -590,14 +819,20 @@ int remove;
        } else
          AppendToLog("Done.\n");         
        break;
+    case MM_MOD_SERVICE:
+       if (f) {
+           GetKeywords(f, SC_TYPE, "service");
+           GetKeywords(f, SC_ACE_TYPE, "ace_type");
+       }
+       break;
     case MM_MOD_FILSYS:
        if (f) {
            GetKeywords(f, FS_TYPE, "filesys");
            sprintf(buf, "fs_access_%s", stringval(f, FS_TYPE));
-           GetKeywords(f, FS_ACCESS, buf);
-           GetKeywords(f, FS_L_TYPE, "lockertype");
-           if (!strcmp(stringval(f, FS_MACHINE), "[NONE]"))
-             StoreField(f, FS_MACHINE, "\\[NONE\\]");
+           GetKeywords(f, FS_ACCESS+1, buf);
+           GetKeywords(f, FS_TYPE+1, "lockertype");
+           if (!strcmp(stringval(f, FS_MACHINE+1), "[NONE]"))
+             StoreField(f, FS_MACHINE+1, "\\[NONE\\]");
            f->inputlines[FS_TYPE]->valuechanged = MoiraValueChanged;
        } else
          AppendToLog("Done.\n");         
@@ -621,9 +856,7 @@ int remove;
            sprintf(buf, "Delete %s %s from list %s?", StringValue(form, 0),
                    StringValue(form, 1), argv[0]);
            if (!boolval(form, 2) ||
-               AskQuestion(buf, "If you answer yes, this member will be deleted from the named list.\n\
-Answer no to avoid the deletion.  In either case, you will continue to\n\
-be prompted with the other lists the member belongs to.")) {
+               AskQuestion(buf, "confirm_del_all")) {
                i = MoiraQuery("delete_member_from_list", 3, argv,
                               DisplayCallback, NULL);
                if (i)
@@ -654,7 +887,6 @@ be prompted with the other lists the member belongs to.")) {
     case MM_CLEAR_SERVICE:
     case MM_RESET_SERVICE:
     case MM_ENABLE_DCM:
-    case MM_TRIGGER_DCM:
     case MM_ADD_ZEPHYR:
     case MM_DEL_ZEPHYR:
     case MM_ADD_PCAP:
@@ -694,6 +926,15 @@ be prompted with the other lists the member belongs to.")) {
     case MM_RESET_POBOX:
        AppendToLog("Done.\n");
        break;
+    case MM_SHOW_KRBMAP:
+    case MM_SHOW_CLDATA:
+    case MM_SHOW_MCMAP:
+    case MM_SHOW_MEMBERS:
+    case MM_STATS:
+    case MM_CLIENTS:
+    case MM_SHOW_ACE_USE:
+       AppendToLog("\n");
+       break;
     case MM_NEW_VALUE:
        CacheNewValue(GetForm(form->menu->form), (int) form->menu->accel,
                      form->extrastuff, StringValue(form, 0));
@@ -702,10 +943,12 @@ be prompted with the other lists the member belongs to.")) {
     if (remove && form->formpointer)
       XtUnmanageChild(form->formpointer);
 
-    if (f)
-      DisplayForm(f);
-    else
-      AppendToLog("\n");
+    if (f) {
+       if (tty)
+         TtyForm(f);
+       else
+         DisplayForm(f);
+    }
 }
 
 
@@ -736,13 +979,15 @@ MenuItem *m;
        AppendToLog("Services and Hosts with failed updates:\n");
        argv[0] = argv[2] = "DONTCARE";
        argv[1] = "TRUE";
-       i = MoiraQuery("qualified_get_server", 3, argv, retfunc, NULL);
+       i = MoiraQuery("qualified_get_server", 3, argv, retfunc,
+                      (char *)&dummy);
        if (i && i != MR_NO_MATCH)
          com_err(program_name, i, " executing database query");
        argv[0] = "*";
        argv[1] = argv[2] = argv[3] = argv[5] = "DONTCARE";
        argv[4] = "TRUE";
-       i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc, NULL);
+       i = MoiraQuery("qualified_get_server_host", 6, argv, retfunc,
+                      (char *)&dummy);
        if (i && i != MR_NO_MATCH)
          com_err(program_name, i, " executing database query");
        AppendToLog("\n");
@@ -751,6 +996,8 @@ MenuItem *m;
     case MM_HELP_WILDCARDS:
     case MM_HELP_AUTHORS:
     case MM_HELP_BUGS:
+    case MM_HELP_MOUSE:
+    case MM_HELP_KEYBOARD:
        help(m->query);
        return;
     case MM_QUIT:
This page took 0.064615 seconds and 4 git commands to generate.