]> andersk Git - moira.git/blobdiff - clients/stanley/stanley.c
tcsh is dead. Long live bash.
[moira.git] / clients / stanley / stanley.c
index 78f3f9372ae24515aae39ed42776166cd6e61bd5..e12cf334460b308f838ce7391f2dea3c1aaf27a6 100644 (file)
 
 RCSID("$Header$");
 
+struct owner_type {
+  int type;
+  char *name;
+};
+
 struct string_list {
   char *string;
   struct string_list *next;
 };
 
+#define M_ANY          0
+#define M_USER         1
+#define M_LIST         2
+#define M_KERBEROS     3
+#define M_NONE         4
+
 /* argument parsing macro */
 #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
 
@@ -35,12 +46,15 @@ struct string_list {
 int info_flag, update_flag, create_flag, deact_flag, reg_flag;
 int list_res_flag, update_res_flag, unformatted_flag, verbose, noauth;
 
+struct owner_type *sponsor;
 struct string_list *reservation_add_queue, *reservation_remove_queue;
 
 char *username, *whoami;
 
 char *newlogin, *uid, *shell, *winshell, *last, *first, *middle, *u_status;
-char *clearid, *class, *comment, *secure;
+char *clearid, *class, *comment, *secure, *winhomedir, *winprofiledir, *expiration;
+
+struct owner_type *parse_member(char *s);
 
 static char *states[] = {
   "Registerable (0)",
@@ -50,7 +64,9 @@ static char *states[] = {
   "Not registerable (4)",
   "Enrolled/Registerable (5)",
   "Enrolled/Not Registerable (6)",
-  "Half Enrolled (7)"
+  "Half Enrolled (7)",
+  "Registerable, Kerberos only (8)",
+  "Active, Kerberos only (9)"
 };
 
 static char *UserState(int state)
@@ -86,7 +102,9 @@ int main(int argc, char **argv)
   list_res_flag = update_res_flag = unformatted_flag = verbose = noauth = 0;
   newlogin = uid = shell = winshell = last = first = middle = NULL;
   u_status = clearid = class = comment = secure = NULL;
+  winhomedir = winprofiledir = expiration = NULL;
   reservation_add_queue = reservation_remove_queue = NULL;
+  sponsor = NULL;
   whoami = argv[0];
 
   /* parse args */
@@ -176,7 +194,7 @@ int main(int argc, char **argv)
            } else
              usage(argv);
          }
-         else if (argis("I", "clearid")) {
+         else if (argis("I", "mitid")) {
            if (arg - argv < argc - 1) {
              arg++;
              update_flag++;
@@ -208,6 +226,38 @@ int main(int argc, char **argv)
            } else
              usage(argv);
          }
+         else if (argis("wh", "winhomedir")) {
+           if (arg - argv < argc - 1) {
+             arg++;
+             update_flag++;
+             winhomedir = *arg;
+           } else
+             usage(argv);
+         }
+         else if (argis("wp", "winprofiledir")) {
+           if (arg - argv < argc - 1) {
+             arg++;
+             update_flag++;
+             winprofiledir = *arg;
+           } else
+             usage(argv);
+         }
+         else if (argis("sp", "sponsor")) {
+           if (arg - argv < argc - 1) {
+             arg++;
+             update_flag++;
+             sponsor = parse_member(*arg);
+           } else
+             usage(argv);
+         }
+         else if (argis("e", "expiration")) {
+           if (arg - argv < argc - 1) {
+             arg++;
+             update_flag++;
+             expiration = *arg;
+           } else
+             usage(argv);
+         }
          else if (argis("ar", "addreservation")) {
            if (arg - argv < argc - 1) {
              arg++;
@@ -262,7 +312,7 @@ int main(int argc, char **argv)
   }
 
   /* fire up Moira */
-  status = mrcl_connect(server, "stanley", 8, !noauth);
+  status = mrcl_connect(server, "stanley", 12, !noauth);
   if (status == MRCL_AUTH_ERROR)
     {
       com_err(whoami, 0, "Try the -noauth flag if you don't "
@@ -277,7 +327,7 @@ int main(int argc, char **argv)
       char *argv[20];
       int cnt;
 
-      for (cnt = 0; cnt < 14; cnt++) {
+      for (cnt = 0; cnt < 20; cnt++) {
        argv[cnt] = "";
       }
 
@@ -292,7 +342,7 @@ int main(int argc, char **argv)
       if (shell)
        argv[U_SHELL] = shell;
       else
-       argv[U_SHELL] = "/bin/athena/tcsh";
+       argv[U_SHELL] = "/bin/athena/bash";
       if (winshell)
        argv[U_WINCONSOLESHELL] = winshell;
       else
@@ -319,8 +369,58 @@ int main(int argc, char **argv)
        argv[U_SECURE] = secure;
       else
        argv[U_SECURE] = "0";
-
-      status = wrap_mr_query("add_user_account", 13, argv, NULL, NULL);
+      if (winhomedir)
+       argv[U_WINHOMEDIR] = winhomedir;
+      else
+       argv[U_WINHOMEDIR] = "[DFS]";
+      if (winprofiledir)
+       argv[U_WINPROFILEDIR] = winprofiledir;
+      else
+       argv[U_WINPROFILEDIR] = "[DFS]";
+      if (expiration)
+       argv[U_EXPIRATION] = expiration;
+      if (sponsor)
+       {
+         argv[U_SPONSOR_NAME] = sponsor->name;
+         switch (sponsor->type)
+           {
+           case M_ANY:
+           case M_USER:
+             argv[U_SPONSOR_TYPE] = "USER";
+             status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
+             if (sponsor->type != M_ANY || status != MR_USER)
+               break;
+
+           case M_LIST:
+             argv[U_SPONSOR_TYPE] = "LIST";
+             status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
+             break;
+
+           case M_KERBEROS:
+             argv[U_SPONSOR_TYPE] = "KERBEROS";
+             status = mrcl_validate_kerberos_member(argv[U_SPONSOR_NAME],
+                                                    &argv[U_SPONSOR_NAME]);
+             if (mrcl_get_message())
+               mrcl_com_err(whoami);
+             if (status == MRCL_REJECT)
+               exit(1);
+             status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
+             break;
+
+           case M_NONE:
+             argv[U_SPONSOR_TYPE] = "NONE";
+             status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
+             break;
+           }
+       }
+      else
+       {
+         argv[U_SPONSOR_TYPE] = "NONE";
+         argv[U_SPONSOR_NAME] = "NONE";
+         
+         status = wrap_mr_query("add_user_account", 18, argv, NULL, NULL);
+       }
+             
       if (status)
        {
          com_err(whoami, status, "while adding user account.");
@@ -356,6 +456,11 @@ int main(int argc, char **argv)
       argv[11] = old_argv[10];
       argv[12] = old_argv[11];
       argv[13] = old_argv[12];
+      argv[14] = old_argv[13];
+      argv[15] = old_argv[14];
+      argv[16] = old_argv[15];
+      argv[17] = old_argv[16];
+      argv[18] = old_argv[17];
       
       argv[0] = username;
       if (newlogin)
@@ -382,8 +487,51 @@ int main(int argc, char **argv)
        argv[11] = comment;
       if (secure)
        argv[13] = secure;
-
-      status = wrap_mr_query("update_user_account", 14, argv, NULL, NULL);
+      if (winhomedir)
+       argv[14] = winhomedir;
+      if (winprofiledir)
+       argv[15] = winprofiledir;
+      if (expiration)
+       argv[18] = expiration;
+      if (sponsor)
+       {
+         argv[17] = sponsor->name;
+         switch (sponsor->type)
+           {
+           case M_ANY:
+           case M_USER:
+             argv[16] = "USER";
+             status = wrap_mr_query("update_user_account", 19, argv, NULL, 
+                                    NULL);
+             if (sponsor->type != M_ANY || status != MR_USER)
+               break;
+
+           case M_LIST:
+             argv[16] = "LIST";
+             status = wrap_mr_query("update_user_account", 19, argv, NULL,
+                                    NULL);
+             break;
+
+           case M_KERBEROS:
+             argv[16] = "KERBEROS";
+             status = mrcl_validate_kerberos_member(argv[17], &argv[17]);
+             if (mrcl_get_message())
+               mrcl_com_err(whoami);
+             if (status == MRCL_REJECT)
+               exit(1);
+             status = wrap_mr_query("update_user_account", 19, argv, NULL,
+                                    NULL);
+             break;
+
+           case M_NONE:
+             argv[16] = "NONE";
+             status = wrap_mr_query("update_user_account", 19, argv, NULL,
+                                    NULL);
+             break;
+           }
+       }
+      else
+       status = wrap_mr_query("update_user_account", 19, argv, NULL, NULL);
 
       if (status)
        com_err(whoami, status, "while updating user.");
@@ -411,12 +559,12 @@ int main(int argc, char **argv)
       status = wrap_mr_query("get_list_info", 1, args, save_query_info, argv);
       if (status == MR_SUCCESS)
        {
-         for (i = 13; i > 0; i--)
+         for (i = 15; i > 0; i--)
            argv[i + 1] = argv[i];
          argv[1] = username;
          argv[L_ACTIVE + 1] = "0";
          
-         status = wrap_mr_query("update_list", 14, argv, NULL, NULL);
+         status = wrap_mr_query("update_list", 16, argv, NULL, NULL);
          if (status)
            {
              com_err(whoami, status, "while updating list, "
@@ -623,8 +771,13 @@ void show_user_info(char **argv)
   printf("User id: %-23s Login shell: %-10s\n", argv[U_UID], argv[U_SHELL]);
   printf("Class: %-25s Windows Console Shell: %-10s\n", argv[U_CLASS],
         argv[U_WINCONSOLESHELL]);
+  sprintf(tbuf, "%s %s", argv[U_SPONSOR_TYPE],
+         strcmp(argv[U_SPONSOR_TYPE], "NONE") ? argv[U_SPONSOR_NAME] : "");
+  printf("Sponsor: %-23s Expiration date: %s\n", tbuf, argv[U_EXPIRATION]);
   printf("Account is: %-20s MIT ID number: %s\n",
         UserState(atoi(argv[U_STATE])), argv[U_MITID]);
+  printf("Windows Home Directory: %s\n", argv[U_WINHOMEDIR]);
+  printf("Windows Profile Directory: %s\n", argv[U_WINPROFILEDIR]);
   status = atoi(argv[U_STATE]);
   if (status == 0 || status == 2)
     {
@@ -632,26 +785,41 @@ void show_user_info(char **argv)
              atoi(argv[U_SECURE]) ? "needs" : "does not need");
     }
   printf("Comments: %s\n", argv[U_COMMENT]);
+  printf("Created  by %s on %s.\n", argv[U_CREATOR], argv[U_CREATED]);
   printf("Last mod by %s at %s with %s.\n", argv[U_MODBY], argv[U_MODTIME],
         argv[U_MODWITH]);
 }
 
 void show_user_info_unformatted(char **argv)
 {
-  printf("Login name:            %s\n", argv[U_NAME]);
-  printf("Full name:             %s, %s %s\n", argv[U_LAST], argv[U_FIRST], 
+  char tbuf[BUFSIZ];
+  int status;
+
+  printf("Login name:                %s\n", argv[U_NAME]);
+  printf("Full name:                 %s, %s %s\n", argv[U_LAST], argv[U_FIRST],
         argv[U_MIDDLE]);
-  printf("User id:               %s\n", argv[U_UID]);
-  printf("Class:                 %s\n", argv[U_CLASS]);
-  printf("Login shell:           %s\n", argv[U_SHELL]);
-  printf("Windows Console Shell: %s\n", argv[U_WINCONSOLESHELL]);
-  printf("Account is:            %s\n", UserState(atoi(argv[U_STATE])));
-  printf("MIT ID number:         %s\n", argv[U_MITID]);
-  printf("Secure:                %s\n", argv[U_SECURE]);
-  printf("Comments:              %s\n", argv[U_COMMENT]);
-  printf("Last mod by:           %s\n", argv[U_MODBY]);
-  printf("Last mod on:           %s\n", argv[U_MODTIME]);
-  printf("Last mod with:         %s\n", argv[U_MODWITH]);
+  printf("User id:                   %s\n", argv[U_UID]);
+  printf("Class:                     %s\n", argv[U_CLASS]);
+  sprintf(tbuf, "%s %s", argv[U_SPONSOR_TYPE],
+         strcmp(argv[U_SPONSOR_TYPE], "NONE") ? argv[U_SPONSOR_NAME] : "");
+  printf("Sponsor:                   %s\n", tbuf);
+  printf("Expiration date:           %s\n", argv[U_EXPIRATION]);
+  printf("Login shell:               %s\n", argv[U_SHELL]);
+  printf("Windows Console Shell:     %s\n", argv[U_WINCONSOLESHELL]);
+  printf("Account is:                %s\n", UserState(atoi(argv[U_STATE])));
+  printf("MIT ID number:             %s\n", argv[U_MITID]);
+  printf("Windows Home Directory:    %s\n", argv[U_WINHOMEDIR]);
+  printf("Windows Profile Directory: %s\n", argv[U_WINPROFILEDIR]);
+  status = atoi(argv[U_STATE]);
+  if (status == 0 || status == 2)
+    printf("Secure:                  %s secure Account Coupon to register\n",
+          atoi(argv[U_SECURE]) ? "Needs" : "Does not need");
+  printf("Comments:                  %s\n", argv[U_COMMENT]);
+  printf("Created by:                %s\n", argv[U_CREATOR]);
+  printf("Created on:                %s\n", argv[U_CREATED]);
+  printf("Last mod by:               %s\n", argv[U_MODBY]);
+  printf("Last mod on:               %s\n", argv[U_MODTIME]);
+  printf("Last mod with:             %s\n", argv[U_MODWITH]);
 }
 
 void usage(char **argv)
@@ -671,17 +839,75 @@ void usage(char **argv)
   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-F   | -first firstname",
          "-L   | -last lastname");
   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-M   | -middle middlename",
-         "-I   | -clearid mitid");
+         "-I   | -mitid mitid");
   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-cl  | -class class",
          "-c   | -comment comment");
   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-6   | -secure 0|1",
          "-lr  | -listreservation");
   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ar  | -addreservation reservation",
          "-dr  | -deletereservation reservation");
+  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-wh  | -winhomedir winhomedir",
+         "-wp  | -winprofiledir winprofiledir");
+  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-sp  | -sponsor sponsor",
+         "-e   | -expiration expiration date");
   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-u   | -unformatted",
-         "-n   | -noauth");
+          "-n   | -noauth");
   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-v   | -verbose",
          "-db  | -database host[:port]");
 
   exit(1);
 }
+
+/* Parse a line of input, fetching a member.  NULL is returned if a member
+ * is not found.  ';' is a comment character.
+ */
+struct owner_type *parse_member(char *s)
+{
+  struct owner_type *m;
+  char *p, *lastchar;
+
+  while (*s && isspace(*s))
+    s++;
+  lastchar = p = s;
+  while (*p && *p != '\n' && *p != ';')
+    {
+      if (isprint(*p) && !isspace(*p))
+       lastchar = p++;
+      else
+       p++;
+    }
+  lastchar++;
+  *lastchar = '\0';
+  if (p == s || strlen(s) == 0)
+    return NULL;
+
+  if (!(m = malloc(sizeof(struct owner_type))))
+    return NULL;
+
+  if ((p = strchr(s, ':')))
+    {
+      *p = '\0';
+      m->name = ++p;
+      if (!strcasecmp("user", s))
+       m->type = M_USER;
+      else if (!strcasecmp("list", s))
+       m->type = M_LIST;
+      else if (!strcasecmp("kerberos", s))
+       m->type = M_KERBEROS;
+      else if (!strcasecmp("none", s))
+       m->type = M_NONE;
+      else
+       {
+         m->type = M_ANY;
+         *(--p) = ':';
+         m->name = s;
+       }
+      m->name = strdup(m->name);
+    }
+  else
+    {
+      m->name = strdup(s);
+      m->type = strcasecmp(s, "none") ? M_ANY : M_NONE;
+    }
+  return m;
+}
This page took 1.529211 seconds and 4 git commands to generate.