int createflag, setinfo, active, public, hidden, maillist, grouplist;
int nfsgroup, mailman;
struct member *owner, *memacl;
-char *desc, *newname, *mailman_server;
+char *desc, *newname, *mailman_server, *gid;
/* various member lists */
struct save_queue *addlist, *dellist, *memberlist, *synclist, *taglist;
noauth = showusers = showstrings = showkerberos = showlists = 0;
showtags = showmachines = createflag = setinfo = 0;
active = public = hidden = maillist = grouplist = nfsgroup = mailman = -1;
- listname = newname = desc = NULL;
+ listname = newname = desc = gid = NULL;
owner = NULL;
memacl = NULL;
addlist = sq_create();
else
usage(argv);
}
+ else if (argis("g", "gid"))
+ {
+ if (arg - argv < argc - 1)
+ {
+ setinfo++;
+ ++arg;
+ gid = *arg;
+ }
+ else
+ usage(argv);
+ }
else
usage(argv);
}
/* If none of {users,strings,lists,kerberos,machines} specified,
turn them all on */
- if (!(showusers || showstrings || showlists || showkerberos))
+ if (!(showusers || showstrings || showlists || showkerberos || showmachines))
showusers = showstrings = showlists = showkerberos = showmachines = 1;
/* fire up Moira */
argv[L_HIDDEN] = (hidden == 1) ? "1" : "0";
argv[L_MAILLIST] = (maillist == 0) ? "0" : "1";
argv[L_GROUP] = (grouplist == 1) ? "1" : "0";
- argv[L_GID] = UNIQUE_GID;
+
+ if (gid)
+ argv[L_GID] = gid;
+ else
+ argv[L_GID] = UNIQUE_GID;
+
argv[L_NFSGROUP] = (nfsgroup == 1) ? "1" : "0";
argv[L_MAILMAN] = (mailman == 1) ? "1" : "0";
argv[L_DESC] = desc ? desc : "none";
argv[L_MAILLIST + 1] = maillist ? "1" : "0";
if (grouplist != -1)
argv[L_GROUP + 1] = grouplist ? "1" : "0";
+ if (gid)
+ argv[L_GID + 1] = gid;
if (nfsgroup != -1)
argv[L_NFSGROUP + 1] = nfsgroup ? "1" : "0";
if (mailman != -1)
argv[L_MAILMAN + 1] = mailman ? "1" : "0";
+
+ /* If someone toggled the mailman bit, but didn't specify a server,
+ * default to [ANY].
+ */
if (mailman_server)
argv[L_MAILMAN_SERVER + 1] = mailman_server;
+ else if ((mailman == 1) && !strcmp(argv[L_MAILMAN_SERVER + 1], "[NONE]"))
+ argv[L_MAILMAN_SERVER + 1] = "[ANY]";
+
if (desc)
argv[L_DESC + 1] = desc;
memberlist = sq_create();
}
+ /* Process the delete list */
+ while (sq_get_data(dellist, &memberstruct))
+ {
+ membervec[0] = listname;
+ membervec[2] = memberstruct->name;
+ if (verbose)
+ {
+ printf("Deleting member ");
+ show_list_member(memberstruct);
+ }
+ switch (memberstruct->type)
+ {
+ case M_ANY:
+ case M_USER:
+ membervec[1] = "USER";
+ status = mr_query("delete_member_from_list", 3, membervec,
+ NULL, NULL);
+ if (status == MR_SUCCESS)
+ break;
+ else if ((status != MR_USER && status != MR_NO_MATCH) ||
+ memberstruct->type != M_ANY)
+ {
+ com_err(whoami, status, "while deleting member %s from %s",
+ memberstruct->name, listname);
+ success = 0;
+ break;
+ }
+ case M_LIST:
+ membervec[1] = "LIST";
+ status = mr_query("delete_member_from_list", 3, membervec,
+ NULL, NULL);
+ if (status == MR_SUCCESS)
+ break;
+ else if ((status != MR_LIST && status != MR_NO_MATCH) ||
+ memberstruct->type != M_ANY)
+ {
+ if (status == MR_PERM && memberstruct->type == M_ANY &&
+ !strcmp(membervec[2], get_username()))
+ {
+ /* M_ANY means we've fallen through from the user
+ * case. The user is trying to remove himself from a
+ * list, but we got MR_USER or MR_NO_MATCH above,
+ * meaning he's not really on it, and we got MR_PERM
+ * when trying to remove LIST:$USER because he's not
+ * on the acl. That error is useless, so return
+ * MR_NO_MATCH instead. However, this will generate
+ * the wrong error if the user was trying to remove
+ * the list with his username from a list he doesn't
+ * administrate without explicitly specifying
+ * "list:".
+ */
+ status = MR_NO_MATCH;
+ }
+ com_err(whoami, status, "while deleting member %s from %s",
+ memberstruct->name, listname);
+ success = 0;
+ break;
+ }
+ case M_STRING:
+ membervec[1] = "STRING";
+ status = mr_query("delete_member_from_list", 3, membervec,
+ NULL, NULL);
+ if (status == MR_STRING && memberstruct->type == M_ANY)
+ {
+ com_err(whoami, 0, " Unable to find member %s to delete from %s",
+ memberstruct->name, listname);
+ success = 0;
+ if (!strcmp(membervec[0], get_username()))
+ {
+ fprintf(stderr, "(If you were trying to remove yourself "
+ "from the list \"%s\",\n", membervec[2]);
+ fprintf(stderr, "the correct command is \"blanche %s -d "
+ "%s\".)\n", membervec[2], membervec[0]);
+ }
+ }
+ else if (status != MR_SUCCESS)
+ {
+ com_err(whoami, status, "while deleting member %s from %s",
+ memberstruct->name, listname);
+ success = 0;
+ }
+ break;
+ case M_KERBEROS:
+ membervec[1] = "KERBEROS";
+ status = mr_query("delete_member_from_list", 3, membervec,
+ NULL, NULL);
+ if (status == MR_STRING || status == MR_NO_MATCH)
+ {
+ /* Try canonicalizing the Kerberos principal and trying
+ * again. If we succeed, print the message from mrcl.
+ * Otherwise, just pretend we never did this and print
+ * the original error message.
+ */
+ mrcl_validate_kerberos_member(membervec[2], &membervec[2]);
+ if (mrcl_get_message())
+ {
+ if (mr_query("delete_member_from_list", 3, membervec,
+ NULL, NULL) == MR_SUCCESS)
+ mrcl_com_err(whoami);
+ status = MR_SUCCESS;
+ }
+ }
+ if (status != MR_SUCCESS)
+ {
+ com_err(whoami, status, "while deleting member %s from %s",
+ memberstruct->name, listname);
+ success = 0;
+ }
+ break;
+ case M_MACHINE:
+ membervec[1] = "MACHINE";
+ membervec[2] = canonicalize_hostname(memberstruct->name);
+ status = mr_query("delete_member_from_list", 3, membervec,
+ NULL, NULL);
+ if (status != MR_SUCCESS)
+ {
+ com_err(whoami, status, "while deleting member %s from %s",
+ memberstruct->name, listname);
+ success = 0;
+ }
+ free(membervec[2]);
+ }
+ }
+
/* Process the add list */
while (sq_get_data(addlist, &memberstruct))
{
}
}
- /* Process the delete list */
- while (sq_get_data(dellist, &memberstruct))
- {
- membervec[0] = listname;
- membervec[2] = memberstruct->name;
- if (verbose)
- {
- printf("Deleting member ");
- show_list_member(memberstruct);
- }
- switch (memberstruct->type)
- {
- case M_ANY:
- case M_USER:
- membervec[1] = "USER";
- status = mr_query("delete_member_from_list", 3, membervec,
- NULL, NULL);
- if (status == MR_SUCCESS)
- break;
- else if ((status != MR_USER && status != MR_NO_MATCH) ||
- memberstruct->type != M_ANY)
- {
- com_err(whoami, status, "while deleting member %s from %s",
- memberstruct->name, listname);
- success = 0;
- break;
- }
- case M_LIST:
- membervec[1] = "LIST";
- status = mr_query("delete_member_from_list", 3, membervec,
- NULL, NULL);
- if (status == MR_SUCCESS)
- break;
- else if ((status != MR_LIST && status != MR_NO_MATCH) ||
- memberstruct->type != M_ANY)
- {
- if (status == MR_PERM && memberstruct->type == M_ANY &&
- !strcmp(membervec[2], get_username()))
- {
- /* M_ANY means we've fallen through from the user
- * case. The user is trying to remove himself from
- * a list, but we got MR_USER or MR_NO_MATCH above,
- * meaning he's not really on it, and we got MR_PERM
- * when trying to remove LIST:$USER because he's not
- * on the acl. That error is useless, so return
- * MR_NO_MATCH instead. However, this will generate the
- * wrong error if the user was trying to remove the list
- * with his username from a list he doesn't administrate
- * without explicitly specifying "list:".
- */
- status = MR_NO_MATCH;
- }
- com_err(whoami, status, "while deleting member %s from %s",
- memberstruct->name, listname);
- success = 0;
- break;
- }
- case M_STRING:
- membervec[1] = "STRING";
- status = mr_query("delete_member_from_list", 3, membervec,
- NULL, NULL);
- if (status == MR_STRING && memberstruct->type == M_ANY)
- {
- com_err(whoami, 0, " Unable to find member %s to delete from %s",
- memberstruct->name, listname);
- success = 0;
- if (!strcmp(membervec[0], get_username()))
- {
- fprintf(stderr, "(If you were trying to remove yourself "
- "from the list \"%s\",\n", membervec[2]);
- fprintf(stderr, "the correct command is \"blanche %s -d "
- "%s\".)\n", membervec[2], membervec[0]);
- }
- }
- else if (status != MR_SUCCESS)
- {
- com_err(whoami, status, "while deleting member %s from %s",
- memberstruct->name, listname);
- success = 0;
- }
- break;
- case M_KERBEROS:
- membervec[1] = "KERBEROS";
- status = mr_query("delete_member_from_list", 3, membervec,
- NULL, NULL);
- if (status == MR_STRING || status == MR_NO_MATCH)
- {
- /* Try canonicalizing the Kerberos principal and trying
- * again. If we succeed, print the message from mrcl.
- * Otherwise, just pretend we never did this and print
- * the original error message.
- */
- mrcl_validate_kerberos_member(membervec[2], &membervec[2]);
- if (mrcl_get_message())
- {
- if (mr_query("delete_member_from_list", 3, membervec,
- NULL, NULL) == MR_SUCCESS)
- mrcl_com_err(whoami);
- status = MR_SUCCESS;
- }
- }
- if (status != MR_SUCCESS)
- {
- com_err(whoami, status, "while deleting member %s from %s",
- memberstruct->name, listname);
- success = 0;
- }
- break;
- case M_MACHINE:
- membervec[1] = "MACHINE";
- membervec[2] = canonicalize_hostname(memberstruct->name);
- status = mr_query("delete_member_from_list", 3, membervec,
- NULL, NULL);
- if (status != MR_SUCCESS)
- {
- com_err(whoami, status, "while deleting member %s from %s",
- memberstruct->name, listname);
- success = 0;
- }
- free(membervec[2]);
- }
- }
-
/* Process the tag list */
while (sq_get_data(taglist, &memberstruct))
{
memberstruct->name, listname);
success = 0;
}
+ case M_MACHINE:
+ membervec[1] = "MACHINE";
+ status = mr_query("tag_member_of_list", 4, membervec,
+ NULL, NULL);
+ if (status != MR_SUCCESS)
+ {
+ com_err(whoami, status, "while adding member %s to %s",
+ memberstruct->name, listname);
+ success = 0;
+ }
}
}