]> andersk Git - moira.git/blob - incremental/afs.c
2ee887d7559ebb3481a30fb3956ed0d86969ba61
[moira.git] / incremental / afs.c
1 /* $Header$
2  *
3  * Do AFS incremental updates
4  *
5  * Copyright (C) 1989 by the Massachusetts Institute of Technology
6  * for copying and distribution information, please see the file
7  * <mit-copyright.h>.
8  */
9
10 #include <sms.h>
11 #include <sms_app.h>
12 #include <sys/param.h>
13 #include <krb.h>
14 #include <krb_et.h>
15 #include <afs/auth.h>
16 #include <pwd.h>
17 #include <sys/file.h>
18
19 #define file_exists(file) (access((file), F_OK) == 0)
20
21 char prs[64], fs[64];
22
23 char *whoami;
24
25 main(argc, argv)
26 char **argv;
27 int argc;
28 {
29     int beforec, afterc;
30     char *table, **before, **after;
31 #ifdef DEBUG
32     char buf[1024];
33     int i;
34 #endif
35
36     table = argv[1];
37     beforec = atoi(argv[2]);
38     before = &argv[4];
39     afterc = atoi(argv[3]);
40     after = &argv[4 + beforec];
41     whoami = argv[0];
42
43 #ifdef DEBUG
44     sprintf(buf, "%s (", table);
45     for (i = 0; i < beforec; i++) {
46         if (i > 0)
47           strcat(buf, ",");
48         strcat(buf, before[i]);
49     }
50     strcat(buf, ")->(");
51     for (i = 0; i < afterc; i++) {
52         if (i > 0)
53           strcat(buf, ",");
54         strcat(buf, after[i]);
55     }
56     strcat(buf, ")\n");
57     write(1,buf,strlen(buf));
58 #endif
59
60     initialize_sms_error_table();
61     initialize_krb_error_table();
62     sprintf(prs, "%s/prs", BIN_DIR);
63     sprintf(fs, "%s/fs", BIN_DIR);
64
65     if (!strcmp(table, "users")) {
66         do_user(before, beforec, after, afterc);
67     } else if (!strcmp(table, "list")) {
68         do_list(before, beforec, after, afterc);
69     } else if (!strcmp(table, "members")) {
70         do_member(before, beforec, after, afterc);
71     } else if (!strcmp(table, "filesys")) {
72         do_filesys(before, beforec, after, afterc);
73     } else if (!strcmp(table, "nfsquota")) {
74         do_quota(before, beforec, after, afterc);
75     }
76     unlog();
77     exit(0);
78 }
79
80
81 do_cmd(cmd)
82 char *cmd;
83 {
84     char realm[REALM_SZ + 1];
85     static int inited = 0;
86     int success = 0, tries = 0, fd, cc;
87     CREDENTIALS *c, *get_ticket();
88     struct passwd *pw;
89     char buf[128], localcell[128], *p, *index();
90
91     while (success == 0 && tries < 3) {
92         if (!inited) {
93             if (krb_get_lrealm(realm) != KSUCCESS)
94               (void) strcpy(realm, KRB_REALM);
95             sprintf(buf, "/tmp/tkt_%d_afsinc", getpid());
96             krb_set_tkt_string(buf);
97
98             if ((fd = open("/usr/vice/etc/ThisCell", O_RDONLY, 0)) < 0) {
99                 critical_alert("incremental", "unable to find AFS cell");
100                 unlog();
101                 exit(1);
102             }
103             if ((cc = read(fd, localcell, sizeof(localcell))) < 0) {
104                 critical_alert("incremental", "unable to read AFS cell");
105                 unlog();
106                 exit(1);
107             }
108             close(fd);
109             p = index(localcell, '\n');
110             if (p) *p = 0;
111
112             if (((pw = getpwnam("smsdba")) == NULL) ||
113                 ((c = get_ticket("sms", "", realm, localcell)) == NULL) ||
114                 (setpag() < 0) ||
115                 (setreuid(pw->pw_uid, pw->pw_uid) < 0) ||
116                 aklog(c, localcell)) {
117                 com_err(whoami, 0, "failed to authenticate");
118             } else
119               inited++;
120         }
121
122         if (inited) {
123             com_err(whoami, 0, "Executing command: %s", cmd);
124             if (system(cmd) == 0)
125               success++;
126         }
127         if (!success) {
128             tries++;
129             sleep(5 * 60);
130         }
131     }
132     if (!success)
133       critical_alert("incremental", "failed command: %s", cmd);
134 }
135
136
137 do_user(before, beforec, after, afterc)
138 char **before;
139 int beforec;
140 char **after;
141 int afterc;
142 {
143     int bstate, astate;
144     char cmd[512];
145
146     cmd[0] = bstate = astate = 0;
147     if (afterc > U_STATE)
148       astate = atoi(after[U_STATE]);
149     if (beforec > U_STATE)
150       bstate = atoi(before[U_STATE]);
151     if (astate == 2) astate = 1;
152     if (bstate == 2) bstate = 1;
153
154     if (astate != 1 && bstate != 1)
155       return;
156     if (astate == 1 && bstate != 1) {
157         sprintf(cmd, "%s newuser -name %s -id %s",
158                 prs, after[U_NAME], after[U_UID]);
159         do_cmd(cmd);
160         return;
161     } else if (astate != 1 && bstate == 1) {
162         sprintf(cmd, "%s delete %s", prs, before[U_NAME]);
163         do_cmd(cmd);
164         return;
165     }
166
167     if (beforec > U_UID && afterc > U_UID &&
168         strcmp(before[U_UID], after[U_UID])) {
169         /* change UID, & possibly user name here */
170         unlog();
171         exit(1);
172     }
173
174     if (beforec > U_NAME && afterc > U_NAME &&
175         strcmp(before[U_NAME], after[U_NAME])) {
176         sprintf(cmd, "%s chname -oldname %s -newname %s",
177                 prs, before[U_NAME], after[U_NAME]);
178         do_cmd(cmd);
179     }
180 }
181
182
183
184 do_list(before, beforec, after, afterc)
185 char **before;
186 int beforec;
187 char **after;
188 int afterc;
189 {
190     char cmd[512];
191     int agid, bgid;
192
193     cmd[0] = agid = bgid = 0;
194     if (beforec > L_GID && atoi(before[L_ACTIVE]) && atoi(before[L_GROUP]))
195       bgid = atoi(before[L_GID]);
196     if (afterc > L_GID && atoi(after[L_ACTIVE]) && atoi(after[L_GROUP]))
197       agid = atoi(after[L_GID]);
198
199     if (bgid == 0 && agid != 0) {
200         sprintf(cmd,
201                 "%s create -name system:%s -id %s -owner system:administrators",
202                 prs, after[L_NAME], after[L_GID]);
203         do_cmd(cmd);
204         return;
205     }
206     if (agid == 0 && bgid != 0) {
207         sprintf(cmd, "%s delete -name system:%s", prs, before[L_NAME]);
208         do_cmd(cmd);
209         return;
210     }
211     if (agid == 0 && bgid == 0)
212       return;
213     if (strcmp(before[L_NAME], after[L_NAME])) {
214         sprintf(cmd,
215                 "%s chname -oldname system:%s -newname system:%s",
216                 prs, before[L_NAME], after[L_NAME]);
217         do_cmd(cmd);
218         return;
219     }
220 }
221
222
223 do_member(before, beforec, after, afterc)
224 char **before;
225 int beforec;
226 char **after;
227 int afterc;
228 {
229     char cmd[512];
230
231     if (beforec == 0 && !strcmp(after[LM_TYPE], "USER")) {
232         sprintf(cmd, "%s add -user %s -group system:%s",
233                 prs, after[LM_MEMBER], after[LM_LIST]);
234         do_cmd(cmd);
235         return;
236     }
237     if (afterc == 0 && !strcmp(before[LM_TYPE], "USER")) {
238         sprintf(cmd, "%s remove -user %s -group system:%s",
239                 prs, before[LM_MEMBER], before[LM_LIST]);
240         do_cmd(cmd);
241         return;
242     }
243 }
244
245
246 do_filesys(before, beforec, after, afterc)
247 char **before;
248 int beforec;
249 char **after;
250 int afterc;
251 {
252     if (afterc < FS_CREATE)
253       return;
254     if (!strcmp("AFS", after[FS_TYPE]) &&
255         !strncmp("/afs/", after[FS_PACK], 5) &&
256         atoi(after[FS_CREATE]) &&
257         !file_exists(after[FS_PACK])) {
258         critical_alert("incremental", "unable to create locker %s",
259                        after[FS_PACK]);
260     }
261 }
262
263
264 do_quota(before, beforec, after, afterc)
265 char **before;
266 int beforec;
267 char **after;
268 int afterc;
269 {
270     char cmd[512];
271
272     if (!(afterc >= Q_DIRECTORY && !strncmp("/afs", after[Q_DIRECTORY], 4)) &&
273         !(beforec >= Q_DIRECTORY && !strncmp("/afs", before[Q_DIRECTORY], 4)))
274       return;
275     if (afterc >= Q_LOGIN && strcmp("[nobody]", after[Q_LOGIN]))
276       return;
277     if (afterc != 0) {
278         sprintf(cmd, "%s setquota -dir %s -quota %s",
279                 fs, after[Q_DIRECTORY], after[Q_QUOTA]);
280         do_cmd(cmd);
281         return;
282     }
283 }
284
285
286 CREDENTIALS *get_ticket(name, instance, realm, cell)
287 char *name;
288 char *instance;
289 char *realm;
290 char *cell;
291 {
292     static CREDENTIALS c;
293     int status;
294
295     status = krb_get_svc_in_tkt(name, instance, realm,
296                                 "krbtgt", realm, 1, KEYFILE);
297     if (status != 0) {
298         com_err(whoami, status+ERROR_TABLE_BASE_krb, "getting initial ticket from srvtab");
299         return(NULL);
300     }
301     status = krb_get_cred("afs", cell, realm, &c);
302     if (status != 0) {
303         status = get_ad_tkt("afs", cell, realm, 255);
304         if (status == 0)
305           status = krb_get_cred("afs", cell, realm, &c);
306     }
307     if (status != 0) {
308         com_err(whoami, status+ERROR_TABLE_BASE_krb, "getting service ticket");
309         return(NULL);
310     }
311     return(&c);
312 }
313
314
315 aklog(c, cell)
316 CREDENTIALS *c;
317 char *cell;
318 {
319         struct ktc_principal aserver;
320         struct ktc_token atoken;
321         
322         atoken.kvno = c->kvno;
323         strcpy(aserver.name, "afs");
324         strcpy(aserver.instance, "");
325         strcpy(aserver.cell, cell);
326
327         atoken.startTime = c->issue_date;
328         atoken.endTime = c->issue_date + (c->lifetime * 5 * 60);
329         bcopy (c->session, &atoken.sessionKey, 8);
330         atoken.ticketLen = c->ticket_st.length;
331         bcopy (c->ticket_st.dat, atoken.ticket, atoken.ticketLen);
332         
333         return(ktc_SetToken(&aserver, &atoken, NULL));
334 }
335
336
337 unlog()
338 {
339     ktc_ForgetToken("afs");
340     dest_tkt();
341 }
This page took 0.108509 seconds and 3 git commands to generate.