]> andersk Git - moira.git/blob - incremental/afs.c
made clname & entity buffers instead of pointers;
[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 #define LOCALCELL "sms_test.mit.edu"
22 #define PRS     "/u1/sms/bin/prs"
23 #define FS      "/u1/sms/bin/fs"
24
25
26 char *whoami;
27
28 main(argc, argv)
29 char **argv;
30 int argc;
31 {
32     int beforec, afterc;
33     char *table, **before, **after;
34
35     table = argv[1];
36     beforec = atoi(argv[2]);
37     before = &argv[4];
38     afterc = atoi(argv[3]);
39     after = &argv[4 + beforec];
40     whoami = argv[0];
41
42     initialize_sms_error_table();
43     initialize_krb_error_table();
44
45     if (!strcmp(table, "users")) {
46         do_user(before, beforec, after, afterc);
47     } else if (!strcmp(table, "list")) {
48         do_list(before, beforec, after, afterc);
49     } else if (!strcmp(table, "members")) {
50         do_member(before, beforec, after, afterc);
51     } else if (!strcmp(table, "filesys")) {
52         do_filesys(before, beforec, after, afterc);
53     } else if (!strcmp(table, "nfsquota")) {
54         do_quota(before, beforec, after, afterc);
55     }
56     unlog();
57     exit(0);
58 }
59
60
61 do_cmd(cmd)
62 char *cmd;
63 {
64     char realm[REALM_SZ + 1];
65     static int inited = 0;
66     int success = 0, tries = 0;
67     CREDENTIALS *c, *get_ticket();
68     struct passwd *pw;
69     char buf[128];
70
71     while (success == 0 && tries < 3) {
72         if (!inited) {
73             if (krb_get_lrealm(realm) != KSUCCESS)
74               (void) strcpy(realm, KRB_REALM);
75             sprintf(buf, "/tmp/tkt_%d_afsinc", getpid());
76             krb_set_tkt_string(buf);
77             
78             if (((pw = getpwnam("smsdba")) == NULL) ||
79                 ((c = get_ticket("sms", "", realm, LOCALCELL)) == NULL) ||
80                 (setpag() < 0) ||
81                 (setreuid(pw->pw_uid, pw->pw_uid) < 0) ||
82                 aklog(c, LOCALCELL)) {
83                 com_err(whoami, 0, "failed to authenticate");
84             } else
85               inited++;
86         }
87
88         if (inited) {
89             com_err(whoami, 0, "Executing command: %s", cmd);
90             if (system(cmd) == 0)
91               success++;
92         }
93         if (!success) {
94             tries++;
95             sleep(5 * 60);
96         }
97     }
98     if (!success)
99       critical_alert("incremental", "failed command: %s", cmd);
100 }
101
102
103 do_user(before, beforec, after, afterc)
104 char **before;
105 int beforec;
106 char **after;
107 int afterc;
108 {
109     int bstate, astate;
110     char cmd[512];
111
112     cmd[0] = bstate = astate = 0;
113     if (afterc > U_STATE)
114       astate = atoi(after[U_STATE]);
115     if (beforec > U_STATE)
116       bstate = atoi(before[U_STATE]);
117
118     if (astate != 1 && bstate != 1)
119       return;
120     if (astate == 1 && bstate != 1) {
121         sprintf(cmd, "%s newuser -name %s -id %s -cell %s",
122                 PRS, after[U_NAME], after[U_UID], LOCALCELL);
123         do_cmd(cmd);
124         return;
125     } else if (astate != 1 && bstate == 1) {
126         sprintf(cmd, "%s delete %s -cell %s", PRS, before[U_NAME], LOCALCELL);
127         do_cmd(cmd);
128         return;
129     }
130
131     if (beforec > U_UID && afterc > U_UID &&
132         strcmp(before[U_UID], after[U_UID])) {
133         /* change UID, & possibly user name here */
134         exit(1);
135     }
136
137     if (beforec > U_NAME && afterc > U_NAME &&
138         strcmp(before[U_NAME], after[U_NAME])) {
139         sprintf(cmd, "%s chname -oldname %s -newname %s -cell %s",
140                 PRS, before[U_NAME], after[U_NAME], LOCALCELL);
141         do_cmd(cmd);
142     }
143 }
144
145
146
147 do_list(before, beforec, after, afterc)
148 char **before;
149 int beforec;
150 char **after;
151 int afterc;
152 {
153     char cmd[512];
154     int agid, bgid;
155
156     cmd[0] = agid = bgid = 0;
157     if (beforec > L_GID && atoi(before[L_ACTIVE]) && atoi(before[L_GROUP]))
158       bgid = atoi(before[L_GID]);
159     if (afterc > L_GID && atoi(after[L_ACTIVE]) && atoi(after[L_GROUP]))
160       agid = atoi(after[L_GID]);
161
162     if (bgid == 0 && agid != 0) {
163         sprintf(cmd, "%s create -name system:%s -id %s -cell %s",
164                 PRS, after[L_NAME], after[L_GID], LOCALCELL);
165         do_cmd(cmd);
166         return;
167     }
168     if (agid == 0 && bgid != 0) {
169         sprintf(cmd, "%s delete -name system:%s -cell %s",
170                 PRS, before[L_NAME], LOCALCELL);
171         do_cmd(cmd);
172         return;
173     }
174     if (agid == 0 && bgid == 0)
175       return;
176     if (strcmp(before[L_NAME], after[L_NAME])) {
177         sprintf(cmd,
178                 "%s chname -oldname system:%s -newname system:%s -cell %s",
179                 PRS, before[L_NAME], after[L_NAME], LOCALCELL);
180         do_cmd(cmd);
181         return;
182     }
183 }
184
185
186 do_member(before, beforec, after, afterc)
187 char **before;
188 int beforec;
189 char **after;
190 int afterc;
191 {
192     char cmd[512];
193
194     if (beforec == 0 && !strcmp(after[LM_TYPE], "USER")) {
195         sprintf(cmd, "%s add -user %s -group system:%s -cell %s",
196                 PRS, after[LM_MEMBER], after[LM_LIST], LOCALCELL);
197         do_cmd(cmd);
198         return;
199     }
200     if (afterc == 0 && !strcmp(before[LM_TYPE], "USER")) {
201         sprintf(cmd, "%s remove -user %s -group system:%s -cell %s",
202                 PRS, before[LM_MEMBER], before[LM_LIST], LOCALCELL);
203         do_cmd(cmd);
204         return;
205     }
206 }
207
208
209 do_filesys(before, beforec, after, afterc)
210 char **before;
211 int beforec;
212 char **after;
213 int afterc;
214 {
215     if (afterc < FS_CREATE)
216       return;
217     if (!strcmp("AFS", after[FS_TYPE]) && !strncmp("/afs", after[FS_PACK]) &&
218                 !file_exists(after[FS_PACK])) {
219         critical_alert("incremental", "unable to create locker %s",
220                        after[FS_PACK]);
221     }
222 }
223
224
225 do_quota(before, beforec, after, afterc)
226 char **before;
227 int beforec;
228 char **after;
229 int afterc;
230 {
231     char cmd[512];
232
233     if (!(afterc >= Q_DIRECTORY && !strncmp("/afs", after[Q_DIRECTORY], 4)) &&
234         !(beforec >= Q_DIRECTORY && !strncmp("/afs", before[Q_DIRECTORY], 4)))
235       return;
236     if (afterc >= Q_LOGIN && strcmp("[nobody]", after[Q_LOGIN]))
237       return;
238     if (afterc != 0) {
239         sprintf(cmd, "%s setquota -dir %s -quota %s",
240                 FS, after[Q_DIRECTORY], after[Q_QUOTA]);
241         do_cmd(cmd);
242         return;
243     }
244 }
245
246
247 CREDENTIALS *get_ticket(name, instance, realm, cell)
248 char *name;
249 char *instance;
250 char *realm;
251 char *cell;
252 {
253     static CREDENTIALS c;
254     int status;
255
256     status = krb_get_svc_in_tkt(name, instance, realm,
257                                 "krbtgt", realm, 1, KEYFILE);
258     if (status != 0) {
259         com_err(whoami, status+ERROR_TABLE_BASE_krb, "getting initial ticket from srvtab");
260         return(NULL);
261     }
262     status = krb_get_cred("afs", cell, realm, &c);
263     if (status != 0) {
264         status = get_ad_tkt("afs", cell, realm, 255);
265         if (status == 0)
266           status = krb_get_cred("afs", cell, realm, &c);
267     }
268     if (status != 0) {
269         com_err(whoami, status+ERROR_TABLE_BASE_krb, "getting service ticket");
270         return(NULL);
271     }
272     return(&c);
273 }
274
275
276 aklog(c, cell)
277 CREDENTIALS *c;
278 char *cell;
279 {
280         struct ktc_principal aserver;
281         struct ktc_token atoken;
282         
283         atoken.kvno = c->kvno;
284         strcpy(aserver.name, "afs");
285         strcpy(aserver.instance, "");
286         strcpy(aserver.cell, cell);
287
288         atoken.startTime = c->issue_date;
289         atoken.endTime = c->issue_date + (c->lifetime * 5 * 60);
290         bcopy (c->session, &atoken.sessionKey, 8);
291         atoken.ticketLen = c->ticket_st.length;
292         bcopy (c->ticket_st.dat, atoken.ticket, atoken.ticketLen);
293         
294         return(ktc_SetToken(&aserver, &atoken, NULL));
295 }
296
297
298 unlog()
299 {
300     ktc_ForgetToken("afs");
301     dest_tkt();
302 }
This page took 0.064958 seconds and 5 git commands to generate.