RCSID("$Header$");
+struct owner_type {
+ int type;
+ char *name;
+};
+
+#define M_ANY 0
+#define M_USER 1
+#define M_LIST 2
+#define M_KERBEROS 3
+#define M_NONE 4
+
#ifdef ATHENA
-#define DEFAULT_SHELL "/bin/athena/tcsh"
+#define DEFAULT_SHELL "/bin/athena/bash"
#else
-#define DEFAULT_SHELL "/bin/csh"
+#define DEFAULT_SHELL "/bin/bash"
#endif
#define DEFAULT_WINCONSOLESHELL "cmd"
+#define DEFAULT_WINHOMEDIR "[DFS]"
+#define DEFAULT_WINPROFILEDIR "[DFS]"
/* flags from command line */
char *class, *comment, *status_str, *shell, *winconsoleshell, *filename;
-int reg_only, reg, verbose, nodupcheck, securereg;
+char *expiration;
+int reg_only, reg, verbose, nodupcheck, securereg, nocaps;
+struct owner_type *sponsor;
/* argument parsing macro */
#define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
void usage(char **argv);
int usercheck(int argc, char **argv, void *qargv);
int get_uid(int argc, char **argv, void *qargv);
+struct owner_type *parse_member(char *s);
int main(int argc, char **argv)
{
FILE *input;
/* clear all flags & lists */
- reg_only = reg = verbose = lineno = nodupcheck = errors = securereg = 0;
+ reg_only = reg = verbose = lineno = nodupcheck = errors = securereg = nocaps = 0;
+ sponsor = NULL;
server = NULL;
filename = "-";
shell = DEFAULT_SHELL;
winconsoleshell = DEFAULT_WINCONSOLESHELL;
class = "TEMP";
comment = "";
+ expiration = "";
status_str = "0";
whoami = argv[0];
else
usage(argv);
}
+ else if (argis("sp", "sponsor"))
+ {
+ if (arg - argv < argc - 1)
+ {
+ ++arg;
+ sponsor = parse_member(*arg);
+ }
+ else
+ usage(argv);
+ }
+ else if (argis("e", "expiration"))
+ {
+ if (arg - argv < argc - 1)
+ {
+ ++arg;
+ expiration = *arg;
+ }
+ else
+ usage(argv);
+ }
else if (argis("6", "secure"))
securereg++;
else if (argis("r", "reg_only"))
verbose++;
else if (argis("d", "nodupcheck"))
nodupcheck++;
+ else if (argis("n", "nocaps"))
+ nocaps++;
else if (argis("S", "server") || argis("db", "database"))
{
if (arg - argv < argc - 1)
}
/* fire up Moira */
- if (mrcl_connect(server, "addusr", 3, 1) != MRCL_SUCCESS)
+ if (mrcl_connect(server, "addusr", 12, 1) != MRCL_SUCCESS)
exit(2);
qargv[U_NAME] = UNIQUE_LOGIN;
qargv[U_UID] = UNIQUE_UID;
qargv[U_SHELL] = shell;
qargv[U_WINCONSOLESHELL] = winconsoleshell;
+ qargv[U_WINHOMEDIR] = DEFAULT_WINHOMEDIR;
+ qargv[U_WINPROFILEDIR] = DEFAULT_WINPROFILEDIR;
+ qargv[U_EXPIRATION] = expiration;
qargv[U_STATE] = status_str;
qargv[U_CLASS] = class;
qargv[U_COMMENT] = comment;
qargv[U_SIGNATURE] = "";
qargv[U_SECURE] = securereg ? "1" : "0";
+
while (fgets(buf, BUFSIZ, input))
{
/* throw away terminating newline */
continue;
}
*p++ = '\0';
- first = p;
+ first = strtrim(p);
while (*p) /* find end-of-line */
p++;
if (reg_only || reg)
qargv[U_MIDDLE] = strtrim(middle);
qargv[U_LAST] = strtrim(last);
qargv[U_MITID] = strtrim(id);
- FixCase(qargv[U_FIRST]);
- FixCase(qargv[U_MIDDLE]);
- FixCase(qargv[U_LAST]);
+ if (!nocaps)
+ {
+ FixCase(qargv[U_FIRST]);
+ FixCase(qargv[U_MIDDLE]);
+ FixCase(qargv[U_LAST]);
+ }
RemoveHyphens(qargv[U_MITID]);
if (!reg_only)
{
{
com_err(whoami, status,
"checking to see if user %s %s already exists",
- qargv[0], qargv[1]);
+ qargv[U_FIRST], qargv[U_LAST]);
com_err(whoami, 0, "NOT ADDING USER");
errors++;
continue;
if (duplicate > 0)
{
com_err(whoami, MR_EXISTS, "user %s %s already exists",
- qargv[0], qargv[1]);
+ qargv[U_FIRST], qargv[U_LAST]);
com_err(whoami, 0, "NOT ADDING USER");
errors++;
continue;
com_err(whoami, 0, "ADDING user anyway");
}
}
- status = mr_query("add_user_account", U_SECURE + 1, qargv,
- NULL, NULL);
+
+ if (sponsor)
+ {
+ qargv[U_SPONSOR_NAME] = sponsor->name;
+ switch (sponsor->type)
+ {
+ case M_ANY:
+ case M_USER:
+ qargv[U_SPONSOR_TYPE] = "USER";
+ status = mr_query("add_user_account", 18, qargv, NULL, NULL);
+ if (sponsor->type != M_ANY || status != MR_USER)
+ break;
+
+ case M_LIST:
+ qargv[U_SPONSOR_TYPE] = "LIST";
+ status = mr_query("add_user_account", 18, qargv, NULL, NULL);
+ break;
+
+ case M_KERBEROS:
+ qargv[U_SPONSOR_TYPE] = "KERBEROS";
+ status = mrcl_validate_kerberos_member(qargv[U_SPONSOR_NAME],
+ &qargv[U_SPONSOR_NAME]);
+ if (mrcl_get_message())
+ mrcl_com_err(whoami);
+ if (status == MRCL_REJECT)
+ exit(1);
+ status = mr_query("add_user_account", 18, qargv, NULL, NULL);
+ break;
+
+ case M_NONE:
+ qargv[U_SPONSOR_TYPE] = "NONE";
+ status = mr_query("add_user_account", 18, qargv, NULL, NULL);
+ break;
+ }
+ }
+ else
+ {
+ qargv[U_SPONSOR_TYPE] = "NONE";
+ qargv[U_SPONSOR_NAME] = "NONE";
+
+ status = mr_query("add_user_account", 18, qargv, NULL, NULL);
+ }
+
if (status)
{
com_err(whoami, status, "adding user %s %s", first, last);
fprintf(stderr, " -h | -shell shell (default %s)\n", DEFAULT_SHELL);
fprintf(stderr, " -w | -winshell windows console shell (default %s)\n",
DEFAULT_WINCONSOLESHELL);
+ fprintf(stderr, " -sp | -sponsor sponsor (default NONE)\n");
+ fprintf(stderr, " -e | -expiration \"expiration date\" (default \"\")\n");
fprintf(stderr, " -r | -reg_only\n");
fprintf(stderr, " -R | -register (and add to database)\n");
fprintf(stderr, " -v | -verbose\n");
fprintf(stderr, " -d | -nodupcheck (don't check for duplicates)\n");
+ fprintf(stderr, " -n | -nocaps (don't fix capitalization of names)\n");
fprintf(stderr, " -db | -database host:port\n");
exit(1);
}
return MR_CONT;
}
+
+/* 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;
+}