3 * Do AFS incremental updates
5 * Copyright (C) 1989 by the Massachusetts Institute of Technology
6 * for copying and distribution information, please see the file
11 #include <moira_site.h>
14 #define file_exists(file) (access((file), F_OK) == 0)
24 int beforec, afterc, i;
25 char *table, **before, **after;
30 for (i = getdtablesize() - 1; i > 2; i--)
34 beforec = atoi(argv[2]);
36 afterc = atoi(argv[3]);
37 after = &argv[4 + beforec];
41 sprintf(buf, "%s (", table);
42 for (i = 0; i < beforec; i++) {
45 strcat(buf, before[i]);
48 for (i = 0; i < afterc; i++) {
51 strcat(buf, after[i]);
54 write(1,buf,strlen(buf));
57 initialize_sms_error_table();
58 initialize_krb_error_table();
59 sprintf(prs, "%s/prs", BIN_DIR);
60 sprintf(fs, "%s/fs", BIN_DIR);
62 if (!strcmp(table, "users")) {
63 do_user(before, beforec, after, afterc);
64 } else if (!strcmp(table, "list")) {
65 do_list(before, beforec, after, afterc);
66 } else if (!strcmp(table, "members")) {
67 do_member(before, beforec, after, afterc);
68 } else if (!strcmp(table, "filesys")) {
69 do_filesys(before, beforec, after, afterc);
70 } else if (!strcmp(table, "nfsquota")) {
71 do_quota(before, beforec, after, afterc);
80 int success = 0, tries = 0;
82 while (success == 0 && tries < 3) {
83 com_err(whoami, 0, "Executing command: %s", cmd);
92 critical_alert("incremental", "failed command: %s", cmd);
96 do_user(before, beforec, after, afterc)
105 cmd[0] = bstate = astate = 0;
106 if (afterc > U_STATE)
107 astate = atoi(after[U_STATE]);
108 if (beforec > U_STATE)
109 bstate = atoi(before[U_STATE]);
110 if (astate == 2) astate = 1;
111 if (bstate == 2) bstate = 1;
113 if (astate != 1 && bstate != 1)
115 if (astate == 1 && bstate != 1) {
116 sprintf(cmd, "%s newuser -name %s -id %s",
117 prs, after[U_NAME], after[U_UID]);
120 } else if (astate != 1 && bstate == 1) {
121 sprintf(cmd, "%s delete %s", prs, before[U_NAME]);
126 if (beforec > U_UID && afterc > U_UID &&
127 strcmp(before[U_UID], after[U_UID])) {
128 /* change UID, & possibly user name here */
132 if (beforec > U_NAME && afterc > U_NAME &&
133 strcmp(before[U_NAME], after[U_NAME])) {
134 sprintf(cmd, "%s chname -oldname %s -newname %s",
135 prs, before[U_NAME], after[U_NAME]);
142 do_list(before, beforec, after, afterc)
151 cmd[0] = agid = bgid = 0;
152 if (beforec > L_GID && atoi(before[L_ACTIVE]) && atoi(before[L_GROUP]))
153 bgid = atoi(before[L_GID]);
154 if (afterc > L_GID && atoi(after[L_ACTIVE]) && atoi(after[L_GROUP]))
155 agid = atoi(after[L_GID]);
157 if (bgid == 0 && agid != 0) {
159 "%s create -name system:%s -id %s -owner system:administrators",
160 prs, after[L_NAME], after[L_GID]);
164 if (agid == 0 && bgid != 0) {
165 sprintf(cmd, "%s delete -name system:%s", prs, before[L_NAME]);
169 if (agid == 0 && bgid == 0)
171 if (strcmp(before[L_NAME], after[L_NAME])) {
173 "%s chname -oldname system:%s -newname system:%s",
174 prs, before[L_NAME], after[L_NAME]);
181 do_member(before, beforec, after, afterc)
189 if (beforec == 0 && !strcmp(after[LM_TYPE], "USER")) {
190 sprintf(cmd, "%s add -user %s -group system:%s",
191 prs, after[LM_MEMBER], after[LM_LIST]);
195 if (afterc == 0 && !strcmp(before[LM_TYPE], "USER")) {
196 sprintf(cmd, "%s remove -user %s -group system:%s",
197 prs, before[LM_MEMBER], before[LM_LIST]);
204 do_filesys(before, beforec, after, afterc)
210 if (afterc < FS_CREATE)
212 if (!strcmp("AFS", after[FS_TYPE]) &&
213 !strncmp("/afs/", after[FS_PACK], 5) &&
214 atoi(after[FS_CREATE]) &&
215 !file_exists(after[FS_PACK])) {
216 critical_alert("incremental", "unable to create locker %s",
222 do_quota(before, beforec, after, afterc)
230 if (!(afterc >= Q_DIRECTORY && !strncmp("/afs", after[Q_DIRECTORY], 4)) &&
231 !(beforec >= Q_DIRECTORY && !strncmp("/afs", before[Q_DIRECTORY], 4)))
233 if (afterc >= Q_LOGIN && strcmp("\\[nobody\\]", after[Q_LOGIN]))
236 sprintf(cmd, "%s setquota -dir %s -quota %s",
237 fs, after[Q_DIRECTORY], after[Q_QUOTA]);