]> andersk Git - moira.git/blame - dbck/phase2.pc
check duplicate/unref on imembers tags
[moira.git] / dbck / phase2.pc
CommitLineData
7ac48069 1/* $Id$
68bbc9c3 2 *
7ac48069 3 * (c) Copyright 1988-1998 by the Massachusetts Institute of Technology.
4 * For copying and distribution information, please see the file
5 * <mit-copyright.h>.
68bbc9c3 6 */
7
8#include <mit-copyright.h>
68bbc9c3 9#include <moira.h>
10#include "dbck.h"
7ac48069 11
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15
208a4f4a 16EXEC SQL INCLUDE sqlca;
68bbc9c3 17
7ac48069 18RCSID("$Header$");
68bbc9c3 19
4b9e5c72 20EXEC SQL WHENEVER SQLERROR DO dbmserr();
68bbc9c3 21
7ac48069 22int show_mcm_mach(void *id);
23int show_mcm_clu(void *id);
24int show_hostalias(void *id);
dabf20aa 25int show_printer_mach(void *id);
fe0a844a 26int show_printer_server(void *id);
dabf20aa 27int show_printer_loghost(void *id);
28int show_printer_spool(void *id);
29int show_printer_quota(void *id);
30int show_printer_ac(void *id);
31int show_printer_lpc_acl(void *id);
c96b70a5 32void fix_printer_ac(void *id);
33void fix_printer_lpc_acl(void *id);
7ac48069 34void user_check(int id, void *user, void *hint);
35int maybe_fixup_unref_string(int sid, int oid, char *oname, char *table,
36 char *field, char *idfield);
37int maybe_fixup_modby(int sid, int oid, char *oname, char *table,
38 char *field, char *idfield);
c978c079 39int maybe_fixup_unref_string2(char *table, char *field, char *rowid, int sid);
40int maybe_fixup_modby2(char *table, char *field, char *rowid, int id);
7ac48069 41void pobox_check(int id, struct user *u);
42void remove_pobox(int id);
43void fix_smtp_pobox(int id, int sid);
44void mach_check(int id, void *machine, void *hint);
45void subnet_check(int id, void *subnet, void *hint);
46void clear_subnet_owner(struct subnet *s);
47void clear_mach_owner(struct machine *m);
48void cluster_check(int id, void *cluster, void *hint);
49int show_svc(void *id);
50void list_check(int id, void *list, void *hint);
51void fix_list_acl(int id);
52int show_member_list(void *id);
53int show_mem_user(void *id);
54int show_mem_list(void *id);
55int show_mem_str(void *id);
56int show_mem_krb(void *id);
57void del_mem_user(void *id);
58void del_mem_list(void *id);
59void del_mem_str(void *id);
60void del_mem_krb(void *id);
61int show_sh(void *id);
62void del_sh_mach(void *id);
63void fsmatch(int id, void *nfsphys, void *filesys);
64void check_fs(int id, void *filesys, void *hint);
65void check_nfsphys(int id, void *nfsphys, void *hint);
fe0a844a 66void check_ps(int id, void *printserver, void *hint);
7ac48069 67int show_fsg_missing(void *id);
68int show_fsg_type(void *filesys);
69void fix_fsg_type(void *filesys);
70int show_fsg_nomember(void *id);
71int show_quota_nouser(void *id);
72int show_quota_nolist(void *id);
73void fix_quota_nouser(void *id);
74void fix_quota_nolist(void *id);
75int show_quota_nofs(void *id);
76void fix_quota_nofs(void *id);
77int show_quota_wrongpid(void *id);
78void fix_quota_physid(void *id);
79int show_srv_user(void *id);
80int show_srv_list(void *id);
81void zero_srv_user(void *id);
82void zero_srv_list(void *id);
83int show_krb_usr(void *id);
84int show_krb_str(void *id);
85int show_pdm_mach(void *id);
86
87int show_mcm_mach(void *id)
208a4f4a 88{
5eaef520 89 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 90 int iid = (int)id, found = 1;
cfc4f91e 91 char name[CLUSTERS_NAME_SIZE];
5eaef520 92 EXEC SQL END DECLARE SECTION;
93
94 EXEC SQL DECLARE csr201 CURSOR FOR
95 SELECT clusters.name FROM clusters, mcmap
96 WHERE clusters.clu_id = mcmap.clu_id AND mcmap.mach_id = :iid;
97 EXEC SQL OPEN csr201;
98 while (1)
99 {
100 EXEC SQL FETCH csr201 INTO :name;
101 if (sqlca.sqlcode)
102 break;
103
104 strtrim(name);
105 found = 0;
7ac48069 106 printf("Cluster %s, non-existant machine %d in cluster map\n",
107 name, iid);
208a4f4a 108 }
5eaef520 109 EXEC SQL CLOSE csr201;
110 return found;
208a4f4a 111}
68bbc9c3 112
7ac48069 113int show_mcm_clu(void *id)
208a4f4a 114{
5eaef520 115 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 116 int iid = (int)id, found = 1;
cfc4f91e 117 char name[MACHINE_NAME_SIZE];
5eaef520 118 EXEC SQL END DECLARE SECTION;
119
120 EXEC SQL DECLARE csr202 CURSOR FOR
121 SELECT machine.name FROM machine, mcmap
122 WHERE machine.mach_id = mcmap.mach_id AND mcmap.clu_id = :iid;
123 EXEC SQL OPEN csr202;
124 while (1)
125 {
126 EXEC SQL FETCH csr202 INTO :name;
127 if (sqlca.sqlcode)
128 break;
129
130 strtrim(name);
131
132 found = 0;
7ac48069 133 printf("Machine %s, non-existant cluster %d in cluster map\n",
134 name, iid);
208a4f4a 135 }
5eaef520 136 EXEC SQL CLOSE csr202;
137 return found;
208a4f4a 138}
68bbc9c3 139
7ac48069 140int show_hostalias(void *id)
ab05f33a 141{
5eaef520 142 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 143 int iid = (int)id, found = 1;
cfc4f91e 144 char name[HOSTALIAS_NAME_SIZE];
5eaef520 145 EXEC SQL END DECLARE SECTION;
146
147 EXEC SQL DECLARE csr234 CURSOR FOR
148 SELECT name FROM hostalias WHERE mach_id = :iid;
149 EXEC SQL OPEN csr234;
150 while (1)
151 {
152 EXEC SQL FETCH csr234 INTO :name;
153 if (sqlca.sqlcode)
154 break;
155
156 strtrim(name);
157
158 found = 0;
7ac48069 159 printf("Alias %s, non-existant machine %d in hostalias map\n",
160 name, iid);
ab05f33a 161 }
5eaef520 162 EXEC SQL CLOSE csr234;
163 return found;
ab05f33a 164}
165
dabf20aa 166int show_printer_mach(void *id)
ab05f33a 167{
5eaef520 168 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 169 int iid = (int)id, found = 1;
dabf20aa 170 char name[PRINTERS_NAME_SIZE];
5eaef520 171 EXEC SQL END DECLARE SECTION;
172
173 EXEC SQL DECLARE csr235 CURSOR FOR
dabf20aa 174 SELECT name FROM printers WHERE mach_id = :iid;
5eaef520 175 EXEC SQL OPEN csr235;
176 while (1)
177 {
178 EXEC SQL FETCH csr235 INTO :name;
179 if (sqlca.sqlcode)
180 break;
181
182 strtrim(name);
183
184 found = 0;
dabf20aa 185 printf("Printer %s, non-existant machine %d in printers table\n",
7ac48069 186 name, iid);
ab05f33a 187 }
5eaef520 188 EXEC SQL CLOSE csr235;
189 return found;
ab05f33a 190}
191
fe0a844a 192int show_printer_server(void *id)
193{
194 EXEC SQL BEGIN DECLARE SECTION;
195 int iid = (int)id, found = 1;
196 char name[PRINTERS_NAME_SIZE];
197 EXEC SQL END DECLARE SECTION;
198
199 EXEC SQL DECLARE csr_sps CURSOR FOR
200 SELECT name FROM printers WHERE mach_id = :iid;
201 EXEC SQL OPEN csr_sps;
202 while (1)
203 {
204 EXEC SQL FETCH csr_sps INTO :name;
205 if (sqlca.sqlcode)
206 break;
207
208 strtrim(name);
209
210 found = 0;
211 printf("Printer %s, non-existant printserver %d in printers table\n",
212 name, iid);
213 }
214 EXEC SQL CLOSE csr_sps;
215 return found;
216}
217
dabf20aa 218int show_printer_loghost(void *id)
ab05f33a 219{
5eaef520 220 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 221 int iid = (int)id, found = 1;
dabf20aa 222 char name[PRINTERS_NAME_SIZE];
223 EXEC SQL END DECLARE SECTION;
224
c96b70a5 225 EXEC SQL DECLARE csr236 CURSOR FOR
dabf20aa 226 SELECT name FROM printers WHERE loghost = :iid;
c96b70a5 227 EXEC SQL OPEN csr236;
dabf20aa 228 while (1)
229 {
c96b70a5 230 EXEC SQL FETCH csr236 INTO :name;
dabf20aa 231 if (sqlca.sqlcode)
232 break;
233
234 strtrim(name);
235
236 found = 0;
237 printf("Printer %s, non-existant spool machine %d in printers table\n",
238 name, iid);
239 }
c96b70a5 240 EXEC SQL CLOSE csr236;
dabf20aa 241 return found;
242}
243
244int show_printer_spool(void *id)
245{
246 EXEC SQL BEGIN DECLARE SECTION;
247 int iid = (int)id, found = 1;
248 char name[PRINTERS_NAME_SIZE];
249 EXEC SQL END DECLARE SECTION;
250
c96b70a5 251 EXEC SQL DECLARE csr237 CURSOR FOR
dabf20aa 252 SELECT name FROM printers WHERE rm = :iid;
c96b70a5 253 EXEC SQL OPEN csr237;
dabf20aa 254 while (1)
255 {
c96b70a5 256 EXEC SQL FETCH csr237 INTO :name;
dabf20aa 257 if (sqlca.sqlcode)
258 break;
259
260 strtrim(name);
261
262 found = 0;
263 printf("Printer %s, non-existant spool machine %d in printers table\n",
264 name, iid);
265 }
c96b70a5 266 EXEC SQL CLOSE csr237;
dabf20aa 267 return found;
268}
269
270int show_printer_quota(void *id)
271{
272 EXEC SQL BEGIN DECLARE SECTION;
273 int iid = (int)id, found = 1;
274 char name[PRINTERS_NAME_SIZE];
275 EXEC SQL END DECLARE SECTION;
276
c96b70a5 277 EXEC SQL DECLARE csr238 CURSOR FOR
dabf20aa 278 SELECT name FROM printers WHERE rq = :iid;
c96b70a5 279 EXEC SQL OPEN csr238;
dabf20aa 280 while (1)
281 {
c96b70a5 282 EXEC SQL FETCH csr238 INTO :name;
dabf20aa 283 if (sqlca.sqlcode)
284 break;
285
286 strtrim(name);
287
288 found = 0;
289 printf("Printer %s, non-existant quota server %d in printers table\n",
290 name, iid);
291 }
c96b70a5 292 EXEC SQL CLOSE csr238;
dabf20aa 293 return found;
294}
295
296int show_printer_ac(void *id)
297{
298 EXEC SQL BEGIN DECLARE SECTION;
299 int iid = (int)id, found = 1;
300 char name[PRINTERS_NAME_SIZE];
5eaef520 301 EXEC SQL END DECLARE SECTION;
302
c96b70a5 303 EXEC SQL DECLARE csr239 CURSOR FOR
dabf20aa 304 SELECT name FROM printers WHERE ac = :iid;
c96b70a5 305 EXEC SQL OPEN csr239;
5eaef520 306 while (1)
307 {
c96b70a5 308 EXEC SQL FETCH csr239 INTO :name;
5eaef520 309 if (sqlca.sqlcode)
310 break;
311
312 strtrim(name);
313
314 found = 0;
dabf20aa 315 printf("Printer %s, non-existant restrict list %d in printers table\n",
7ac48069 316 name, iid);
ab05f33a 317 }
c96b70a5 318 EXEC SQL CLOSE csr239;
5eaef520 319 return found;
ab05f33a 320}
321
dabf20aa 322int show_printer_lpc_acl(void *id)
323{
324 EXEC SQL BEGIN DECLARE SECTION;
325 int iid = (int)id, found = 1;
326 char name[PRINTERS_NAME_SIZE];
327 EXEC SQL END DECLARE SECTION;
328
c96b70a5 329 EXEC SQL DECLARE csr240 CURSOR FOR
dabf20aa 330 SELECT name FROM printers WHERE lpc_acl = :iid;
c96b70a5 331 EXEC SQL OPEN csr240;
dabf20aa 332 while (1)
333 {
c96b70a5 334 EXEC SQL FETCH csr240 INTO :name;
dabf20aa 335 if (sqlca.sqlcode)
336 break;
337
338 strtrim(name);
339
340 found = 0;
341 printf("Printer %s, non-existant lpc ACL %d in printers table\n",
342 name, iid);
343 }
c96b70a5 344 EXEC SQL CLOSE csr240;
dabf20aa 345 return found;
346}
347
c96b70a5 348void fix_printer_ac(void *id)
dabf20aa 349{
350 EXEC SQL BEGIN DECLARE SECTION;
351 int rowcount, iid = (int)id;
352 EXEC SQL END DECLARE SECTION;
353
354 EXEC SQL UPDATE printers SET ac = 0 WHERE ac = :iid;
355 rowcount = sqlca.sqlerrd[2];
356 if (rowcount > 0)
357 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
358 else
359 printf("Not fixed\n");
360 modified("printers");
361}
362
c96b70a5 363void fix_printer_lpc_acl(void *id)
dabf20aa 364{
365 EXEC SQL BEGIN DECLARE SECTION;
366 int rowcount, iid = (int)id;
367 EXEC SQL END DECLARE SECTION;
368
369 EXEC SQL UPDATE printers SET lpc_acl = 0 WHERE lpc_acl = :iid;
370 rowcount = sqlca.sqlerrd[2];
371 if (rowcount > 0)
372 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
373 else
374 printf("Not fixed\n");
375 modified("printers");
376}
377
7ac48069 378void user_check(int id, void *user, void *hint)
ab05f33a 379{
7ac48069 380 struct user *u = user;
381
5eaef520 382 u->comment = maybe_fixup_unref_string(u->comment, id, u->login, "users",
383 "comments", "users_id");
384
385 u->modby = maybe_fixup_modby(u->modby, id, u->login, "users",
386 "modby", "users_id");
ab05f33a 387
5eaef520 388 u->fmodby = maybe_fixup_modby(u->fmodby, id, u->login, "users",
389 "fmodby", "users_id");
ab05f33a 390
5eaef520 391 u->pmodby = maybe_fixup_modby(u->pmodby, id, u->login, "users",
392 "pmodby", "users_id");
ab05f33a 393
5eaef520 394 u->sigwho = maybe_fixup_unref_string(u->sigwho, id, u->login, "users",
395 "sigwho", "users_id");
ab05f33a 396
7ac48069 397 pobox_check(id, u);
ab05f33a 398}
399
5eaef520 400int maybe_fixup_unref_string(int sid, int oid, char *oname, char *table,
401 char *field, char *idfield)
ab05f33a 402{
5eaef520 403 int ret = (sid < 0) ? -sid : sid, doit = 0, newid;
ab05f33a 404 EXEC SQL BEGIN DECLARE SECTION;
405 int rowcount;
406 char stmt_buf[500];
407 EXEC SQL END DECLARE SECTION;
5eaef520 408
7ac48069 409 if ((newid = (int)hash_lookup(string_dups, ret)))
5eaef520 410 {
411 printf("%s entry %s(%d) has a %s with duplicate string %d\n",
412 table, oname, oid, field, ret);
413 if (single_fix("Replace duplicate", 0))
414 {
415 ret = newid;
5eaef520 416 doit = 1;
417 }
fd3a1fc5 418 string_check(ret);
ab05f33a 419 }
5eaef520 420 else if (!string_check(ret))
421 {
422 printf("%s entry %s(%d) has a %s with non-existant string %d\n",
423 table, oname, oid, field, ret);
424 if (single_fix("Delete", 1))
425 {
426 ret = 0;
427 doit = 1;
428 }
429 }
430
431 if (doit)
432 {
433 sprintf(stmt_buf, "UPDATE %s SET %s = %d WHERE %s = %d",
434 table, field, (sid < 0) ? -ret : ret, idfield, oid);
435 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
436 rowcount = sqlca.sqlerrd[2];
437 if (rowcount == 1)
438 printf("Fixed\n");
439 else
440 printf("Not fixed, rowcount = %d\n", rowcount);
441 modified(table);
ab05f33a 442 }
ab05f33a 443
5eaef520 444 return (sid < 0) ? -ret : ret;
ab05f33a 445}
446
5eaef520 447int maybe_fixup_modby(int sid, int oid, char *oname, char *table,
448 char *field, char *idfield)
ab05f33a 449{
450 EXEC SQL BEGIN DECLARE SECTION;
451 char stmt_buf[500];
452 int rowcount;
453 EXEC SQL END DECLARE SECTION;
454
5eaef520 455 if (sid < 0)
ab05f33a 456 return maybe_fixup_unref_string(sid, oid, oname, table, field, idfield);
5eaef520 457 else
458 {
459 if (!hash_lookup(users, sid))
460 {
461 printf("%s entry %s(%d) has a %s with non-existant user %d\n",
462 table, oname, oid, field, sid);
463 if (single_fix("Delete", 1))
464 {
465 sprintf(stmt_buf, "UPDATE %s SET %s = 0 WHERE %s = %d",
466 table, field, idfield, oid);
467 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
468 rowcount = sqlca.sqlerrd[2];
469 if (rowcount == 1)
470 printf("Fixed\n");
471 else
472 printf("Not fixed, rowcount = %d\n", rowcount);
473 modified(table);
474 }
475 return 0;
476 }
ab05f33a 477 }
ab05f33a 478 return sid;
479}
480
c978c079 481int maybe_fixup_unref_string2(char *table, char *field, char *rowid, int sid)
ab05f33a 482{
5eaef520 483 int ret = (sid < 0) ? -sid : sid, doit = 0, newid;
ab05f33a 484 EXEC SQL BEGIN DECLARE SECTION;
485 int rowcount;
486 char stmt_buf[500];
487 EXEC SQL END DECLARE SECTION;
5eaef520 488
7ac48069 489 if ((newid = (int)hash_lookup(string_dups, ret)))
5eaef520 490 {
491 printf("%s entry has a %s with duplicate string %d\n",
492 table, field, ret);
493 if (single_fix("Replace duplicate", 0))
494 {
495 ret = newid;
5eaef520 496 doit = 1;
497 }
fd3a1fc5 498 string_check(ret);
5eaef520 499 }
500 else if (!string_check(ret))
501 {
502 printf("%s entry has a %s with non-existant string %d\n",
503 table, field, ret);
11975951 504 if (single_fix("Clear", 1))
5eaef520 505 {
506 ret = 0;
507 doit = 1;
508 }
ab05f33a 509 }
5eaef520 510
511 if (doit)
512 {
c978c079 513 sprintf(stmt_buf, "UPDATE %s SET %s = %d WHERE rowid = '%s'",
514 table, field, (sid < 0) ? -ret : ret, rowid);
5eaef520 515 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
516 rowcount = sqlca.sqlerrd[2];
517 if (rowcount == 1)
518 printf("Fixed\n");
519 else
520 printf("Not fixed, rowcount = %d\n", rowcount);
521 modified(table);
ab05f33a 522 }
5eaef520 523 return (sid < 0) ? -ret : ret;
ab05f33a 524}
525
c978c079 526int maybe_fixup_modby2(char *table, char *field, char *rowid, int id)
ab05f33a 527{
528 EXEC SQL BEGIN DECLARE SECTION;
529 char stmt_buf[500];
530 int rowcount;
531 EXEC SQL END DECLARE SECTION;
532
5eaef520 533 if (id < 0)
c978c079 534 return maybe_fixup_unref_string2(table, field, rowid, id);
5eaef520 535 else
536 {
537 if (!hash_lookup(users, id))
538 {
539 printf("%s entry has a %s with non-existant user %d\n",
540 table, field, id);
11975951 541 if (single_fix("Clear", 1))
5eaef520 542 {
c978c079 543 sprintf(stmt_buf, "UPDATE %s SET %s = 0 WHERE rowid = '%s'",
544 table, field, rowid);
5eaef520 545 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
546 rowcount = sqlca.sqlerrd[2];
547 if (rowcount == 1)
548 printf("Fixed\n");
549 else
550 printf("Not fixed, rowcount = %d\n", rowcount);
551 modified(table);
552 }
553 return 0;
554 }
ab05f33a 555 }
ab05f33a 556 return 1;
557}
558
7ac48069 559void pobox_check(int id, struct user *u)
68bbc9c3 560{
fc6165db 561 struct filesys *fs;
562
5eaef520 563 switch (u->potype)
564 {
565 case 'P':
566 if (!hash_lookup(machines, u->pobox_id))
567 {
568 printf("User %s(%s) has P.O.Box on non-existant machine %d\n",
569 u->login, u->fullname, u->pobox_id);
570 if (single_fix("Delete", 0))
571 {
572 remove_pobox(u->users_id);
573 u->potype = 'N';
574 }
575 }
576 break;
fc6165db 577
5eaef520 578 case 'S':
7ac48069 579 if (hash_lookup(string_dups, u->pobox_id))
5eaef520 580 {
581 printf("User %s(%s) has P.O.Box with duplicate string %d\n",
582 u->login, u->fullname, u->pobox_id);
583 if (single_fix("Update", 0))
584 {
585 printf("Replacing box_id dup string ID %d with %d\n",
586 u->pobox_id,
7ac48069 587 (int)hash_lookup(string_dups, u->pobox_id));
588 u->pobox_id = (int)hash_lookup(string_dups, u->pobox_id);
5eaef520 589 fix_smtp_pobox(u->users_id, u->pobox_id);
590 string_check(u->pobox_id);
591 }
592 }
593 else if (!string_check(u->pobox_id))
594 {
595 printf("User %s(%s) has P.O.Box with non-existant string %d\n",
596 u->login, u->fullname, u->pobox_id);
597 if (single_fix("Delete", 0))
598 {
599 remove_pobox(u->users_id);
600 u->potype = 'N';
601 }
602 }
603 break;
fc6165db 604
605 case 'I':
606 fs = hash_lookup(filesys, u->pobox_id);
607 if (!fs)
608 {
609 printf("User %s(%s) has P.O.Box on non-existant filesystem %d\n",
610 u->login, u->fullname, u->pobox_id);
611 if (single_fix("Delete", 0))
612 {
613 remove_pobox(u->users_id);
614 u->potype = 'N';
615 }
616 }
617 else if (fs->type != 'I')
618 {
619 printf("User %s(%s) has IMAP P.O.Box on non-IMAP filesystem %s\n",
620 u->login, u->fullname, fs->name);
621 if (single_fix("Delete", 0))
622 {
623 remove_pobox(u->users_id);
624 u->potype = 'N';
625 }
626 }
627 break;
628
5eaef520 629 default:
630 ;
68bbc9c3 631 }
632}
633
634
7ac48069 635void remove_pobox(int id)
208a4f4a 636{
5eaef520 637 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 638 int rowcount, iid = (int)id;
5eaef520 639 EXEC SQL END DECLARE SECTION;
640
641 EXEC SQL UPDATE users SET potype = 'NONE' WHERE users.users_id = :iid;
642 rowcount = sqlca.sqlerrd[2];
643 if (rowcount > 0)
644 printf("%d entr%s removed\n", rowcount, rowcount == 1 ? "y" : "ies");
645 else
646 printf("Not removed\n");
647 modified("users");
208a4f4a 648}
68bbc9c3 649
7ac48069 650void fix_smtp_pobox(int id, int sid)
ab05f33a 651{
5eaef520 652 EXEC SQL BEGIN DECLARE SECTION;
653 int rowcount, iid = id, isid = sid;
654 EXEC SQL END DECLARE SECTION;
655
656 EXEC SQL UPDATE users SET box_id = :isid WHERE users.users_id = :iid;
657 rowcount = sqlca.sqlerrd[2];
658 if (rowcount > 0)
659 printf("%d entr%s updated\n", rowcount, rowcount == 1 ? "y" : "ies");
660 else
661 printf("Not updated\n");
662 modified("users");
ab05f33a 663}
772b7afc 664
7ac48069 665void mach_check(int id, void *machine, void *hint)
772b7afc 666{
7ac48069 667 struct machine *m = machine;
668
5eaef520 669 if (!hash_lookup(subnets, m->snet_id))
670 {
671 printf("Machine %s is on a non-existant subnet %d\n",
672 m->name, m->snet_id);
673 if (single_fix("Move to null-subnet", 1))
674 {
675 EXEC SQL BEGIN DECLARE SECTION;
676 int rowcount, iid = id;
677 EXEC SQL END DECLARE SECTION;
678
679 EXEC SQL UPDATE machine SET snet_id = 0 WHERE mach_id = :iid;
680 rowcount = sqlca.sqlerrd[2];
681 if (rowcount > 0)
682 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
683 else
684 printf("Not fixed\n");
685 modified("machine");
772b7afc 686 }
687 }
688
5eaef520 689 switch (m->owner_type)
690 {
772b7afc 691 case 'U':
5eaef520 692 if (!hash_lookup(users, m->owner_id))
693 {
694 printf("Machine %s has non-existant USER owner %d\n",
695 m->name, m->owner_id);
696 if (single_fix("Set to no owner", 1))
697 clear_mach_owner(m);
772b7afc 698 }
5eaef520 699 break;
772b7afc 700 case 'L':
5eaef520 701 if (!hash_lookup(lists, m->owner_id))
702 {
703 printf("Machine %s has non-existant LIST owner %d\n",
704 m->name, m->owner_id);
705 if (single_fix("Set to no owner", 1))
706 clear_mach_owner(m);
772b7afc 707 }
5eaef520 708 break;
ab05f33a 709 case 'S':
710 case 'K':
5eaef520 711 if (m->owner_id)
712 m->owner_id = maybe_fixup_unref_string(m->owner_id, id, m->name,
713 "machine", "owner_id",
714 "mach_id");
715 if (m->owner_id == 0)
ab05f33a 716 clear_mach_owner(m);
772b7afc 717 }
ab05f33a 718
5eaef520 719 if (m->acomment)
720 m->acomment = maybe_fixup_unref_string(m->acomment, id, m->name,
ab05f33a 721 "machine", "acomment", "mach_id");
5eaef520 722 if (m->ocomment)
723 m->ocomment = maybe_fixup_unref_string(m->ocomment, id, m->name,
ab05f33a 724 "machine", "ocomment", "mach_id");
5eaef520 725
726 m->creator = maybe_fixup_modby(m->creator, id, m->name, "machine",
ab05f33a 727 "creator", "mach_id");
5eaef520 728 m->modby = maybe_fixup_modby(m->modby, id, m->name, "machine",
ab05f33a 729 "modby", "mach_id");
772b7afc 730}
731
7ac48069 732void subnet_check(int id, void *subnet, void *hint)
ab05f33a 733{
7ac48069 734 struct subnet *s = subnet;
735
5eaef520 736 switch (s->owner_type)
737 {
ab05f33a 738 case 'U':
5eaef520 739 if (!hash_lookup(users, s->owner_id))
740 {
741 printf("Subnet %s has non-existant USER owner %d\n",
742 s->name, s->owner_id);
743 if (single_fix("Set to no owner", 1))
744 clear_subnet_owner(s);
ab05f33a 745 }
5eaef520 746 break;
ab05f33a 747 case 'L':
5eaef520 748 if (!hash_lookup(lists, s->owner_id))
749 {
750 printf("Machine %s has non-existant LIST owner %d\n",
751 s->name, s->owner_id);
752 if (single_fix("Set to no owner", 1))
753 clear_subnet_owner(s);
ab05f33a 754 }
5eaef520 755 break;
ab05f33a 756 case 'S':
757 case 'K':
5eaef520 758 if (s->owner_id)
759 s->owner_id = maybe_fixup_unref_string(s->owner_id, id, s->name,
760 "machine", "owner_id",
761 "mach_id");
762 if (s->owner_id == 0)
ab05f33a 763 clear_subnet_owner(s);
764 }
765
5eaef520 766 s->modby = maybe_fixup_modby(s->modby, id, s->name, "subnet",
ab05f33a 767 "modby", "snet_id");
768}
769
7ac48069 770void clear_subnet_owner(struct subnet *s)
ab05f33a 771{
5eaef520 772 EXEC SQL BEGIN DECLARE SECTION;
773 int rowcount, id = s->snet_id;
774 EXEC SQL END DECLARE SECTION;
775
776 EXEC SQL UPDATE subnet SET owner_type = 'NONE', owner_id = 0
777 WHERE snet_id = :id;
778 rowcount = sqlca.sqlerrd[2];
779 if (rowcount > 0)
780 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
781 else
782 printf("Not fixed\n");
783 modified("subnet");
ab05f33a 784}
772b7afc 785
7ac48069 786void clear_mach_owner(struct machine *m)
772b7afc 787{
5eaef520 788 EXEC SQL BEGIN DECLARE SECTION;
789 int rowcount, id = m->mach_id;
790 EXEC SQL END DECLARE SECTION;
791
792 EXEC SQL UPDATE machine SET owner_type = 'NONE', owner_id = 0
793 WHERE mach_id = :id;
794 rowcount = sqlca.sqlerrd[2];
795 if (rowcount > 0)
796 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
797 else
798 printf("Not fixed\n");
799 modified("machine");
772b7afc 800}
801
7ac48069 802void cluster_check(int id, void *cluster, void *hint)
ab05f33a 803{
7ac48069 804 struct cluster *c = cluster;
805
5eaef520 806 c->modby = maybe_fixup_modby(c->modby, id, c->name, "clusters",
ab05f33a 807 "modby", "clu_id");
808}
809
7ac48069 810int show_svc(void *id)
5eaef520 811{
812 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 813 int iid = (int)id, found = 1;
cfc4f91e 814 char label[SVC_SERV_LABEL_SIZE], data[SVC_SERV_CLUSTER_SIZE];
5eaef520 815 EXEC SQL END DECLARE SECTION;
ab05f33a 816
5eaef520 817 EXEC SQL DECLARE csr203 CURSOR FOR
818 SELECT serv_label, serv_cluster FROM svc
819 WHERE clu_id = :iid;
820 EXEC SQL OPEN csr203;
821 while (1)
822 {
823 EXEC SQL FETCH csr203 INTO :label, :data;
824 if (sqlca.sqlcode)
825 break;
772b7afc 826
5eaef520 827 strtrim(label);
828 strtrim(data);
829 found = 0;
830 printf("Cluster data [%s] %s for non-existant cluster %d\n",
7ac48069 831 label, data, iid);
208a4f4a 832 }
5eaef520 833 EXEC SQL CLOSE csr203;
834 return found;
208a4f4a 835}
68bbc9c3 836
7ac48069 837void list_check(int id, void *list, void *hint)
68bbc9c3 838{
7ac48069 839 struct list *l = list;
840
cfc4f91e 841 l->modby = maybe_fixup_modby(l->modby, id, l->name, "list",
842 "modby", "list_id");
843
5eaef520 844 switch (l->acl_type)
845 {
68bbc9c3 846 case 'L':
5eaef520 847 if (!hash_lookup(lists, l->acl_id))
848 {
849 printf("List %s has bad LIST acl %d\n", l->name, l->acl_id);
850 if (single_fix("Patch", 1))
851 fix_list_acl(l->list_id);
68bbc9c3 852 }
5eaef520 853 break;
68bbc9c3 854 case 'U':
5eaef520 855 if (!hash_lookup(users, l->acl_id))
856 {
857 printf("List %s has bad USER acl %d\n", l->name, l->acl_id);
858 if (single_fix("Patch", 1))
859 fix_list_acl(l->list_id);
68bbc9c3 860 }
5eaef520 861 break;
ab05f33a 862 case 'K':
5eaef520 863 l->acl_id = maybe_fixup_unref_string(l->acl_id, id, l->name,
864 "list", "acl_id", "list_id");
865 if (!l->acl_id)
866 {
867 printf("List %s has bad KERBEROS acl %d\n", l->name, l->acl_id);
868 if (single_fix("Patch", 1))
869 fix_list_acl(l->list_id);
ab05f33a 870 }
5eaef520 871 break;
68bbc9c3 872 }
873}
874
7ac48069 875void fix_list_acl(int id)
208a4f4a 876{
5eaef520 877 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 878 int rowcount, iid = (int)id;
5eaef520 879 EXEC SQL END DECLARE SECTION;
68bbc9c3 880
5eaef520 881 EXEC SQL UPDATE list SET acl_id = :iid, acl_type = 'LIST'
882 WHERE list_id = :iid;
883 rowcount = sqlca.sqlerrd[2];
884 if (rowcount > 0)
885 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
886 else
887 printf("Not fixed\n");
888 modified("list");
889}
68bbc9c3 890
7ac48069 891int show_member_list(void *id)
208a4f4a 892{
5eaef520 893 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 894 int mid, iid = (int)id, found = 1;
8d1c466f 895 char mtype[IMEMBERS_MEMBER_TYPE_SIZE], *name = NULL;
5eaef520 896 EXEC SQL END DECLARE SECTION;
897
898 EXEC SQL DECLARE csr204 CURSOR FOR
899 SELECT member_type, member_id FROM imembers
8d1c466f 900 WHERE list_id = :iid;
5eaef520 901 EXEC SQL OPEN csr204;
902 while (1)
903 {
904 EXEC SQL FETCH csr204 INTO :mtype, :mid;
905 if (sqlca.sqlcode)
906 break;
907
908 strtrim(mtype);
909 found = 0;
910 if (mtype[0] == 'L')
8d1c466f 911 {
912 struct list *l = hash_lookup(lists, mid);
913 if (l)
914 name = l->name;
915 }
5eaef520 916 else if (mtype[0] == 'U')
8d1c466f 917 {
918 struct user *u = hash_lookup(users, mid);
919 if (u)
920 name = u->login;
921 }
5eaef520 922 else if (mtype[0] == 'S' || mtype[0] == 'K')
8d1c466f 923 {
924 struct string *s = hash_lookup(strings, mid);
925 if (s)
926 name = s->name;
927 }
928 if (name)
929 printf("Non-existant list %d has member %s %s\n", iid, mtype, name);
930 else
931 {
932 printf("Non-existant list %d has non-existent member %s %d\n",
933 iid, mtype, mid);
934 }
208a4f4a 935 }
5eaef520 936 EXEC SQL CLOSE csr204;
937 return found;
208a4f4a 938}
68bbc9c3 939
7ac48069 940int show_mem_user(void *id)
208a4f4a 941{
5eaef520 942 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 943 int lid, iid = (int)id, found = 1;
5eaef520 944 EXEC SQL END DECLARE SECTION;
8d1c466f 945 struct list *l;
5eaef520 946
947 EXEC SQL DECLARE csr205 CURSOR FOR
948 SELECT list_id FROM imembers
8d1c466f 949 WHERE member_id = :iid AND member_type = 'USER';
5eaef520 950 EXEC SQL OPEN csr205;
951 while (1)
952 {
953 EXEC SQL FETCH csr205 INTO :lid;
954 if (sqlca.sqlcode)
955 break;
8d1c466f 956 l = hash_lookup(lists, lid);
957 if (!l)
958 continue;
5eaef520 959
960 found = 0;
8d1c466f 961 printf("List %s has non-existant user member, id %d\n", l->name, iid);
208a4f4a 962 }
5eaef520 963 EXEC SQL CLOSE csr205;
964 return found;
208a4f4a 965}
68bbc9c3 966
7ac48069 967int show_mem_list(void *id)
208a4f4a 968{
5eaef520 969 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 970 int lid, iid = (int)id, found = 1;
5eaef520 971 EXEC SQL END DECLARE SECTION;
8d1c466f 972 struct list *l;
5eaef520 973
974 EXEC SQL DECLARE csr206 CURSOR FOR
975 SELECT list_id FROM imembers
8d1c466f 976 WHERE member_id = :iid AND member_type = 'LIST';
5eaef520 977 EXEC SQL OPEN csr206;
978 while (1)
979 {
980 EXEC SQL FETCH csr206 INTO :lid;
981 if (sqlca.sqlcode)
982 break;
8d1c466f 983 l = hash_lookup(lists, lid);
984 if (!l)
985 continue;
5eaef520 986
987 found = 0;
8d1c466f 988 printf("List %s has non-existant list member, id %d\n", l->name, iid);
208a4f4a 989 }
5eaef520 990 EXEC SQL CLOSE csr206;
991 return found;
208a4f4a 992}
68bbc9c3 993
7ac48069 994int show_mem_str(void *id)
208a4f4a 995{
5eaef520 996 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 997 int lid, iid = (int)id, found = 1;
5eaef520 998 EXEC SQL END DECLARE SECTION;
8d1c466f 999 struct list *l;
5eaef520 1000
1001 EXEC SQL DECLARE csr207 CURSOR FOR
1002 SELECT list_id FROM imembers
8d1c466f 1003 WHERE member_id = :iid AND member_type = 'STRING';
5eaef520 1004 EXEC SQL OPEN csr207;
1005 while (1)
1006 {
1007 EXEC SQL FETCH csr207 INTO :lid;
1008 if (sqlca.sqlcode)
1009 break;
8d1c466f 1010 l = hash_lookup(lists, lid);
1011 if (!l)
1012 continue;
5eaef520 1013
1014 found = 0;
8d1c466f 1015 printf("List %s has non-existant string member, id %d\n", l->name, iid);
208a4f4a 1016 }
5eaef520 1017 EXEC SQL CLOSE csr207;
1018 return found;
208a4f4a 1019}
68bbc9c3 1020
1021
7ac48069 1022int show_mem_krb(void *id)
208a4f4a 1023{
5eaef520 1024 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1025 int lid, iid = (int)id, found = 1;
5eaef520 1026 EXEC SQL END DECLARE SECTION;
8d1c466f 1027 struct list *l;
5eaef520 1028
1029 EXEC SQL DECLARE csr208 CURSOR FOR
1030 SELECT list_id FROM imembers
8d1c466f 1031 WHERE member_id = :iid AND member_type = 'KERBEROS';
5eaef520 1032 EXEC SQL OPEN csr208;
1033 while (1)
1034 {
1035 EXEC SQL FETCH csr208 INTO :lid;
1036 if (sqlca.sqlcode)
1037 break;
8d1c466f 1038 l = hash_lookup(lists, lid);
1039 if (!l)
1040 continue;
5eaef520 1041
1042 found = 0;
1043 printf("List %s has non-existant kerberos member, id %d\n",
8d1c466f 1044 l->name, iid);
208a4f4a 1045 }
5eaef520 1046 EXEC SQL CLOSE csr208;
1047 return found;
208a4f4a 1048}
68bbc9c3 1049
68bbc9c3 1050
7ac48069 1051void del_mem_user(void *id)
208a4f4a 1052{
5eaef520 1053 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1054 int iid = (int)id, rowcount;
5eaef520 1055 EXEC SQL END DECLARE SECTION;
1056
1057 EXEC SQL DELETE FROM imembers WHERE member_type = 'USER' AND
8d1c466f 1058 member_id = :iid;
5eaef520 1059 rowcount = sqlca.sqlerrd[2];
1060 if (rowcount > 0)
1061 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1062 else
1063 printf("Not deleted\n");
1064 modified("imembers");
208a4f4a 1065}
68bbc9c3 1066
7ac48069 1067void del_mem_list(void *id)
208a4f4a 1068{
5eaef520 1069 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1070 int iid = (int)id, rowcount;
5eaef520 1071 EXEC SQL END DECLARE SECTION;
1072
1073 EXEC SQL DELETE FROM imembers WHERE member_type = 'LIST' AND
8d1c466f 1074 member_id = :iid;
5eaef520 1075 rowcount = sqlca.sqlerrd[2];
1076 if (rowcount > 0)
1077 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1078 else
1079 printf("Not deleted\n");
1080 modified("imembers");
208a4f4a 1081}
68bbc9c3 1082
7ac48069 1083void del_mem_str(void *id)
208a4f4a 1084{
5eaef520 1085 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1086 int iid = (int)id, rowcount;
5eaef520 1087 EXEC SQL END DECLARE SECTION;
1088
1089 EXEC SQL DELETE FROM imembers WHERE member_type = 'STRING' AND
8d1c466f 1090 member_id = :iid;
5eaef520 1091 rowcount = sqlca.sqlerrd[2];
1092 if (rowcount > 0)
1093 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1094 else
1095 printf("Not deleted\n");
1096 modified("imembers");
208a4f4a 1097}
68bbc9c3 1098
68bbc9c3 1099
7ac48069 1100void del_mem_krb(void *id)
208a4f4a 1101{
5eaef520 1102 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1103 int iid = (int)id, rowcount;
5eaef520 1104 EXEC SQL END DECLARE SECTION;
1105
1106 EXEC SQL DELETE FROM imembers WHERE member_type = 'KERBEROS' AND
8d1c466f 1107 member_id = :iid;
5eaef520 1108 rowcount = sqlca.sqlerrd[2];
1109 if (rowcount > 0)
1110 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1111 else
1112 printf("Not deleted\n");
1113 modified("imembers");
208a4f4a 1114}
68bbc9c3 1115
1116
7ac48069 1117int show_sh(void *id)
208a4f4a 1118{
5eaef520 1119 EXEC SQL BEGIN DECLARE SECTION;
cfc4f91e 1120 char name[SERVERHOSTS_SERVICE_SIZE];
7ac48069 1121 int iid = (int)id;
5eaef520 1122 EXEC SQL END DECLARE SECTION;
1123 int found = 1;
1124
1125 EXEC SQL DECLARE csr209 CURSOR FOR
1126 SELECT service FROM serverhosts
1127 WHERE mach_id = :iid;
1128 EXEC SQL OPEN csr209;
1129 while (1)
1130 {
1131 EXEC SQL FETCH csr209 INTO :name;
1132 if (sqlca.sqlcode)
1133 break;
1134
1135 found = 0;
1136 printf("ServerHost entry for service %s non-existant host %d\n",
7ac48069 1137 name, iid);
208a4f4a 1138 }
5eaef520 1139 EXEC SQL CLOSE csr209;
1140 return found;
208a4f4a 1141}
68bbc9c3 1142
7ac48069 1143void del_sh_mach(void *id)
208a4f4a 1144{
5eaef520 1145 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1146 int iid = (int)id, rowcount;
5eaef520 1147 EXEC SQL END DECLARE SECTION;
1148
1149 EXEC SQL DELETE FROM serverhosts WHERE mach_id = :iid;
1150 rowcount = sqlca.sqlerrd[2];
1151 if (rowcount > 0)
1152 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1153 else
1154 printf("Not deleted\n");
1155 modified("serverhosts");
208a4f4a 1156}
68bbc9c3 1157
1158
1159static int fnchecklen;
1160
7ac48069 1161void fsmatch(int id, void *nfsphys, void *filesys)
68bbc9c3 1162{
7ac48069 1163 struct nfsphys *n = nfsphys;
1164 struct filesys *f = filesys;
1165
5eaef520 1166 if (n->mach_id == f->mach_id &&
1167 !strncmp(f->dir, n->dir, strlen(n->dir)) &&
1168 strlen(n->dir) > fnchecklen)
1169 {
1170 f->phys_id = id;
1171 fnchecklen = strlen(n->dir);
68bbc9c3 1172 }
1173}
1174
1175
7ac48069 1176void check_fs(int id, void *filesys, void *hint)
208a4f4a 1177{
5eaef520 1178 EXEC SQL BEGIN DECLARE SECTION;
1179 int iid = id, id1, id2, id3, rowcount;
1180 char *dir;
1181 EXEC SQL END DECLARE SECTION;
7ac48069 1182 struct filesys *f = filesys;
5eaef520 1183 struct nfsphys *n;
1184 struct machine *m;
1185
1186 if (!hash_lookup(machines, f->mach_id))
1187 {
1188 printf("Filesys %s with bad machine %d\n", f->name, f->mach_id);
1189 if (single_fix("Fix", 0))
1190 {
1191 EXEC SQL UPDATE filesys SET mach_id = 0 WHERE filsys_id = :iid;
1192 rowcount = sqlca.sqlerrd[2];
1193 if (rowcount > 0)
1194 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1195 else
1196 printf("Not fixed\n");
1197 modified("filesys");
1198 f->mach_id = 0;
68bbc9c3 1199 }
1200 }
1201
5eaef520 1202 if (!hash_lookup(users, f->owner))
1203 {
1204 printf("Filesys %s with bad owning user %d\n", f->name, f->owner);
1205 if (single_fix("Fix", 1))
1206 {
1207 zero_fix("filesys", "owner", "filsys_id", f->filsys_id);
1208 f->owner = 0;
68bbc9c3 1209 }
1210 }
5eaef520 1211 if (!hash_lookup(lists, f->owners))
1212 {
1213 printf("Filesys %s with bad owning group %d\n", f->name, f->owners);
1214 if (single_fix("Fix", 1))
1215 {
1216 zero_fix("filesys", "owners", "filsys_id", f->filsys_id);
1217 f->owners = 0;
68bbc9c3 1218 }
1219 }
1220
fc6165db 1221 if (f->type == 'N' || f->type == 'I')
5eaef520 1222 {
1223 if (!hash_lookup(nfsphys, f->phys_id))
1224 {
7ac48069 1225 m = hash_lookup(machines, f->mach_id);
5eaef520 1226 printf("Filesys %s with bad phys_id %d\n", f->name, f->phys_id);
1227 if (single_fix("Fix", 1))
1228 {
1229 fnchecklen = 0;
1230 hash_step(nfsphys, fsmatch, f);
1231 if (fnchecklen != 0)
1232 {
68bbc9c3 1233 id1 = f->phys_id;
1234 id2 = f->filsys_id;
1235 id3 = f->mach_id;
5eaef520 1236 EXEC SQL UPDATE filesys SET phys_id = :id1
1237 WHERE filsys_id = :id2;
4b9e5c72 1238 rowcount = sqlca.sqlerrd[2];
68bbc9c3 1239 if (rowcount > 0)
5eaef520 1240 printf("%d entr%s fixed\n", rowcount,
1241 rowcount == 1 ? "y" : "ies");
68bbc9c3 1242 else
1243 printf("Not fixed\n");
1244 modified("filesys");
5eaef520 1245 }
1246 else
1247 {
1248 printf("No NFSphys exsits for %s:%s\n", m->name, f->dir);
1249 if (single_fix("Create", 0))
1250 {
1251 dir = f->dir;
1252 id1 = f->phys_id;
1253 id2 = f->filsys_id;
1254 id3 = f->mach_id;
1255 if (set_next_object_id("nfsphys_id", "nfsphys") !=
1256 MR_SUCCESS)
1257 {
1258 printf("Unable to assign unique ID\n");
1259 return;
68bbc9c3 1260 }
5eaef520 1261 EXEC SQL SELECT COUNT(*) INTO :rowcount FROM numvalues
1262 WHERE name = 'nfsphys_id';
1263 if (rowcount != 1)
1264 {
1265 printf("Unable to retrieve unique ID\n");
1266 return;
68bbc9c3 1267 }
5eaef520 1268 EXEC SQL INSERT INTO nfsphys
1269 (nfsphys_id, mach_id, device, dir, status, allocated,
1270 size, modtime, modby, modwith) VALUES
1271 (:id1, :id3, '\?\?\?', :dir, 0, 0, 0, SYSDATE, 0,
1272 'dbck');
4b9e5c72 1273 rowcount = sqlca.sqlerrd[2];
68bbc9c3 1274 if (rowcount > 0)
5eaef520 1275 {
1276 printf("%d entr%s created\n", rowcount,
1277 rowcount == 1 ? "y" : "ies");
1278 }
68bbc9c3 1279 else
1280 printf("Not created\n");
1281 modified("nfsphys");
5eaef520 1282 n = malloc(sizeof(struct nfsphys));
1283 if (!n)
68bbc9c3 1284 out_of_mem("storing new nfsphys");
1285 strcpy(n->dir, dir);
1286 n->mach_id = id3;
1287 n->nfsphys_id = id1;
1288 n->allocated = 0;
1289 n->count = 0;
5eaef520 1290 if (hash_store(nfsphys, id1, n) == -1)
ab05f33a 1291 out_of_mem("storing nfsphys in hash table");
208a4f4a 1292 EXEC SQL UPDATE filesys SET phys_id = :id1
5eaef520 1293 WHERE filsys_id = :id2;
4b9e5c72 1294 rowcount = sqlca.sqlerrd[2];
68bbc9c3 1295 if (rowcount > 0)
5eaef520 1296 {
1297 printf("%d filesys entr%s fixed\n", rowcount,
1298 rowcount == 1 ? "y" : "ies");
1299 }
68bbc9c3 1300 else
1301 printf("Not fixed\n");
1302 modified("filesys");
1303 }
1304 }
1305 }
1306 }
1307 }
208a4f4a 1308}
68bbc9c3 1309
7ac48069 1310void check_nfsphys(int id, void *nfsphys, void *hint)
68bbc9c3 1311{
7ac48069 1312 struct nfsphys *n = nfsphys;
1313
cfc4f91e 1314 n->modby = maybe_fixup_modby(n->modby, id, n->dir, "nfsphys",
1315 "modby", "nfsphys_id");
1316
5eaef520 1317 if (!hash_lookup(machines, n->mach_id))
1318 {
1319 printf("NFSphys %d(%s) on non-existant machine %d\n",
1320 id, n->dir, n->mach_id);
1321 if (single_fix("Delete", 0))
1322 single_delete("nfsphys", "nfsphys_id", id);
68bbc9c3 1323 }
1324}
1325
fe0a844a 1326static void clear_ps_owner(struct printserver *ps)
1327{
1328 EXEC SQL BEGIN DECLARE SECTION;
1329 int rowcount, id = ps->mach_id;
1330 EXEC SQL END DECLARE SECTION;
1331
1332 EXEC SQL UPDATE printserver SET owner_type = 'NONE', owner_id = 0
1333 WHERE mach_id = :id;
1334 rowcount = sqlca.sqlerrd[2];
1335 if (rowcount > 0)
1336 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1337 else
1338 printf("Not fixed\n");
1339 modified("printservers");
1340}
1341
1342static void clear_ps_lpc(struct printserver *ps)
1343{
1344 EXEC SQL BEGIN DECLARE SECTION;
1345 int rowcount, id = ps->mach_id;
1346 EXEC SQL END DECLARE SECTION;
1347
1348 EXEC SQL UPDATE printserver SET lpc_acl = 0
1349 WHERE mach_id = :id;
1350 rowcount = sqlca.sqlerrd[2];
1351 if (rowcount > 0)
1352 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1353 else
1354 printf("Not fixed\n");
1355 modified("printservers");
1356}
1357
1358void check_ps(int id, void *printserver, void *hint)
1359{
1360 struct printserver *ps = printserver;
1361 struct machine *m;
1362 char *name;
1363
1364 m = hash_lookup(machines, id);
1365 if (!m)
1366 {
1367 printf("Printserver on non-existant machine %d\n", id);
1368 if (single_fix("Delete", 0))
1369 {
1370 single_delete("printserver", "mach_id", id);
1371 return;
1372 }
1373 else
1374 name = "[UNKNOWN]";
1375 }
1376 else
1377 name = m->name;
1378
1379 ps->modby = maybe_fixup_modby(ps->modby, id, name, "printserver",
1380 "modby", "mach_id");
1381 ps->printer_types = maybe_fixup_unref_string(ps->printer_types, id, name,
1382 "printservers", "printer_types",
1383 "mach_id");
1384
1385 switch (ps->owner_type)
1386 {
1387 case 'U':
1388 if (!hash_lookup(users, ps->owner_id))
1389 {
1390 printf("Printserver %s has non-existant USER owner %d\n",
1391 name, ps->owner_id);
1392 if (single_fix("Set to no owner", 1))
1393 clear_ps_owner(ps);
1394 }
1395 break;
1396 case 'L':
1397 if (!hash_lookup(lists, ps->owner_id))
1398 {
1399 printf("Printserver %s has non-existant LIST owner %d\n",
1400 name, ps->owner_id);
1401 if (single_fix("Set to no owner", 1))
1402 clear_ps_owner(ps);
1403 }
1404 break;
1405 case 'K':
1406 if (ps->owner_id)
1407 ps->owner_id = maybe_fixup_unref_string(ps->owner_id, id, name,
1408 "printserver", "owner_id",
1409 "mach_id");
1410 if (ps->owner_id == 0)
1411 clear_ps_owner(ps);
1412 }
1413
1414 if (!hash_lookup(lists, ps->lpc_acl))
1415 {
1416 printf("Printserver %s has non-existent lpc_acl %d\n",
1417 name, ps->lpc_acl);
1418 if (single_fix("Set to no lpc_acl", 1))
1419 clear_ps_lpc(ps);
1420 }
1421}
1422
7ac48069 1423int show_fsg_missing(void *id)
208a4f4a 1424{
5eaef520 1425 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1426 int iid = (int)id, id1, found = 1;
5eaef520 1427 EXEC SQL END DECLARE SECTION;
1428 struct filesys *f;
1429
1430 EXEC SQL DECLARE csr210 CURSOR FOR
1431 SELECT filsys_id FROM fsgroup
1432 WHERE group_id = :iid;
1433 EXEC SQL OPEN csr210;
1434 while (1)
1435 {
1436 EXEC SQL FETCH csr210 INTO :id1;
1437 if (sqlca.sqlcode)
1438 break;
1439
1440 found = 0;
7ac48069 1441 if ((f = hash_lookup(filesys, id1)))
1442 printf("Missing fsgroup %d has member filesystem %s\n", iid, f->name);
5eaef520 1443 else
7ac48069 1444 printf("Missing fsgroup %d has member filesystem %d\n", iid, id1);
208a4f4a 1445 }
5eaef520 1446 EXEC SQL CLOSE csr210;
1447 return found;
208a4f4a 1448}
68bbc9c3 1449
7ac48069 1450int show_fsg_type(void *filesys)
68bbc9c3 1451{
7ac48069 1452 struct filesys *f = filesys;
5eaef520 1453 char *t;
68bbc9c3 1454
5eaef520 1455 switch (f->type)
1456 {
68bbc9c3 1457 case 'N':
5eaef520 1458 t = "NFS";
1459 break;
68bbc9c3 1460 case 'R':
5eaef520 1461 t = "RVD";
1462 break;
68bbc9c3 1463 case 'A':
5eaef520 1464 t = "AFS";
1465 break;
68bbc9c3 1466 case 'E':
5eaef520 1467 t = "ERR";
1468 break;
68bbc9c3 1469 case 'F':
5eaef520 1470 t = "FSGROUP";
1471 break;
68bbc9c3 1472 case 'M':
5eaef520 1473 t = "MUL";
1474 break;
68bbc9c3 1475 default:
5eaef520 1476 t = "\?\?\?";
68bbc9c3 1477 }
5eaef520 1478 printf("FSGroup %s has type %s instead of FSGROUP\n", f->name, t);
1479 return 0;
68bbc9c3 1480}
1481
7ac48069 1482void fix_fsg_type(void *filesys)
208a4f4a 1483{
7ac48069 1484 struct filesys *f = filesys;
5eaef520 1485 EXEC SQL BEGIN DECLARE SECTION;
1486 int rowcount, id = f->filsys_id;
1487 EXEC SQL END DECLARE SECTION;
1488
1489 EXEC SQL UPDATE filesys SET type = 'FSGROUP' WHERE filsys_id = :id;
1490 rowcount = sqlca.sqlerrd[2];
1491 if (rowcount > 0)
1492 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1493 else
1494 printf("Not fixed\n");
1495 modified("filesys");
208a4f4a 1496}
68bbc9c3 1497
7ac48069 1498int show_fsg_nomember(void *id)
208a4f4a 1499{
5eaef520 1500 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1501 int iid = (int)id, id1, found = 1;
5eaef520 1502 EXEC SQL END DECLARE SECTION;
1503 struct filesys *f;
1504
1505 EXEC SQL DECLARE csr211 CURSOR FOR
1506 SELECT group_id FROM fsgroup
1507 WHERE filsys_id = :iid;
1508 EXEC SQL OPEN csr211;
1509 while (1)
1510 {
1511 EXEC SQL FETCH csr211 INTO :id1;
1512 if (sqlca.sqlcode)
1513 break;
1514
1515 found = 0;
7ac48069 1516 if ((f = hash_lookup(filesys, id1)))
1517 printf("FSGroup %s has missing member %d\n", f->name, iid);
5eaef520 1518 else
7ac48069 1519 printf("FSGroup %d has missing member %d\n", id1, iid);
208a4f4a 1520 }
5eaef520 1521 EXEC SQL CLOSE csr211;
1522 return found;
208a4f4a 1523}
1524
7ac48069 1525int show_quota_nouser(void *id)
208a4f4a 1526{
5eaef520 1527 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1528 int iid = (int)id, id1, found = 1;
5eaef520 1529 EXEC SQL END DECLARE SECTION;
1530
1531 EXEC SQL DECLARE csr212 CURSOR FOR
1532 SELECT filsys_id FROM quota
1533 WHERE entity_id = :iid AND type = 'USER';
1534 EXEC SQL OPEN csr212;
1535 while (1)
1536 {
1537 EXEC SQL FETCH csr212 INTO :id1;
1538 if (sqlca.sqlcode)
1539 break;
1540
1541 found = 0;
7ac48069 1542 printf("Quota on fs %d for non-existant user %d\n", id1, iid);
208a4f4a 1543 }
5eaef520 1544 EXEC SQL CLOSE csr212;
1545 return found;
208a4f4a 1546}
1547
7ac48069 1548int show_quota_nolist(void *id)
208a4f4a 1549{
5eaef520 1550 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1551 int iid = (int)id, id1, found = 1;
5eaef520 1552 EXEC SQL END DECLARE SECTION;
1553
1554 EXEC SQL DECLARE csr213 CURSOR FOR
1555 SELECT filsys_id FROM quota
1556 WHERE entity_id = :iid AND type = 'GROUP';
1557 EXEC SQL OPEN csr213;
1558 while (1)
1559 {
1560 EXEC SQL FETCH csr213 INTO :id1;
1561 if (sqlca.sqlcode)
1562 break;
1563
1564 found = 0;
7ac48069 1565 printf("Quota on fs %d for non-existant list %d\n", id1, iid);
208a4f4a 1566 }
5eaef520 1567 EXEC SQL CLOSE csr213;
1568 return found;
208a4f4a 1569}
68bbc9c3 1570
7ac48069 1571void fix_quota_nouser(void *id)
208a4f4a 1572{
5eaef520 1573 EXEC SQL BEGIN DECLARE SECTION;
11975951 1574 int iid = (int)id, rowcount;
5eaef520 1575 EXEC SQL END DECLARE SECTION;
1576
5eaef520 1577 EXEC SQL DELETE FROM quota
1578 WHERE entity_id = :iid AND type = 'USER';
1579 rowcount = sqlca.sqlerrd[2];
1580 if (rowcount > 0)
1581 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1582 else
1583 printf("Not deleted\n");
1584 modified("quota");
208a4f4a 1585}
68bbc9c3 1586
7ac48069 1587void fix_quota_nolist(void *id)
208a4f4a 1588{
5eaef520 1589 EXEC SQL BEGIN DECLARE SECTION;
11975951 1590 int iid = (int)id, rowcount;
5eaef520 1591 EXEC SQL END DECLARE SECTION;
1592
5eaef520 1593 EXEC SQL DELETE FROM quota WHERE entity_id = :iid AND type = 'GROUP';
1594 rowcount = sqlca.sqlerrd[2];
1595 if (rowcount > 0)
1596 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1597 else
1598 printf("Not deleted\n");
1599 modified("quota");
208a4f4a 1600}
1601
7ac48069 1602int show_quota_nofs(void *id)
208a4f4a 1603{
5eaef520 1604 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1605 int iid = (int)id, id1, found = 1;
cfc4f91e 1606 char type[QUOTA_TYPE_SIZE];
5eaef520 1607 EXEC SQL END DECLARE SECTION;
1608
1609 EXEC SQL DECLARE csr214 CURSOR FOR
1610 SELECT entity_id, type FROM quota
1611 WHERE filsys_id = :iid;
1612 EXEC SQL OPEN csr214;
1613 while (1)
1614 {
1615 EXEC SQL FETCH csr214 INTO :id1, :type;
1616 if (sqlca.sqlcode)
1617 break;
1618
1619 found = 0;
7ac48069 1620 printf("Quota for %s %d on non-existant filesys %d\n", type, id1, iid);
208a4f4a 1621 }
5eaef520 1622 EXEC SQL CLOSE csr214;
1623 return found;
208a4f4a 1624}
68bbc9c3 1625
7ac48069 1626void fix_quota_nofs(void *id)
68bbc9c3 1627{
7ac48069 1628 single_delete("quota", "filsys_id", (int)id);
68bbc9c3 1629}
1630
7ac48069 1631int show_quota_wrongpid(void *id)
208a4f4a 1632{
5eaef520 1633 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1634 int iid = (int)id, id1, found = 1;
cfc4f91e 1635 char type[QUOTA_TYPE_SIZE];
5eaef520 1636 EXEC SQL END DECLARE SECTION;
5eaef520 1637 struct filesys *f;
1638
7ac48069 1639 f = hash_lookup(filesys, iid);
5eaef520 1640 EXEC SQL DECLARE csr215 CURSOR FOR
1641 SELECT entity_id, type FROM quota
1642 WHERE filsys_id = :iid;
1643 EXEC SQL OPEN csr215;
1644 while (1)
1645 {
1646 EXEC SQL FETCH csr215 INTO :id1, :type;
1647 if (sqlca.sqlcode)
1648 break;
1649
1650 found = 0;
1651 printf("Quota for %s %d on filesys %s has wrong phys_id %d\n",
7ac48069 1652 type, id1, f->name, iid);
208a4f4a 1653 }
5eaef520 1654 EXEC SQL CLOSE csr215;
1655 return found;
208a4f4a 1656}
68bbc9c3 1657
7ac48069 1658void fix_quota_physid(void *id)
208a4f4a 1659{
5eaef520 1660 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1661 int iid = (int)id, rowcount, id1;
5eaef520 1662 EXEC SQL END DECLARE SECTION;
1663
7ac48069 1664 id1 = ((struct filesys *)hash_lookup(filesys, iid))->phys_id;
5eaef520 1665 EXEC SQL UPDATE quota SET phys_id = :id1
1666 WHERE filsys_id = :iid AND phys_id != :id1;
1667 rowcount = sqlca.sqlerrd[2];
1668 if (rowcount > 0)
1669 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1670 else
1671 printf("Not fixed\n");
1672 modified("quota");
208a4f4a 1673}
68bbc9c3 1674
7ac48069 1675int show_srv_user(void *id)
208a4f4a 1676{
5eaef520 1677 EXEC SQL BEGIN DECLARE SECTION;
cfc4f91e 1678 char name[SERVERS_NAME_SIZE];
7ac48069 1679 int iid = (int)id;
5eaef520 1680 EXEC SQL END DECLARE SECTION;
1681 int found = 1;
1682
1683 EXEC SQL DECLARE csr216 CURSOR FOR
1684 SELECT name FROM servers
1685 WHERE acl_type = 'USER' and acl_id = :iid;
1686 EXEC SQL OPEN csr216;
1687 while (1)
1688 {
1689 EXEC SQL FETCH csr216 INTO :name;
1690 if (sqlca.sqlcode)
1691 break;
1692
1693 strtrim(name);
7ac48069 1694 printf("Service %s has acl non-existant user %d\n", name, iid);
5eaef520 1695 found = 0;
208a4f4a 1696 }
5eaef520 1697 EXEC SQL CLOSE csr216;
1698 return found;
208a4f4a 1699}
68bbc9c3 1700
7ac48069 1701int show_srv_list(void *id)
208a4f4a 1702{
5eaef520 1703 EXEC SQL BEGIN DECLARE SECTION;
cfc4f91e 1704 char name[SERVERS_NAME_SIZE];
7ac48069 1705 int iid = (int)id;
5eaef520 1706 EXEC SQL END DECLARE SECTION;
1707 int found = 1;
1708
1709 EXEC SQL DECLARE csr217 CURSOR FOR
1710 SELECT name FROM servers
1711 WHERE acl_type = 'LIST' AND acl_id = :iid;
1712 EXEC SQL OPEN csr217;
1713 while (1)
1714 {
1715 EXEC SQL FETCH csr217 INTO :name;
1716 if (sqlca.sqlcode)
1717 break;
1718
1719 strtrim(name);
7ac48069 1720 printf("Service %s has acl non-existant list %d\n", name, iid);
5eaef520 1721 found = 0;
208a4f4a 1722 }
5eaef520 1723 EXEC SQL CLOSE csr217;
1724 return found;
208a4f4a 1725}
68bbc9c3 1726
7ac48069 1727void zero_srv_user(void *id)
208a4f4a 1728{
5eaef520 1729 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1730 int iid = (int)id, rowcount;
5eaef520 1731 EXEC SQL END DECLARE SECTION;
1732
1733 EXEC SQL UPDATE servers SET acl_id = 0 WHERE acl_id = :iid AND
1734 acl_type = 'USER';
1735 rowcount = sqlca.sqlerrd[2];
1736 if (rowcount > 0)
1737 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1738 else
1739 printf("Not fixed\n");
1740 modified("servers");
208a4f4a 1741}
68bbc9c3 1742
7ac48069 1743void zero_srv_list(void *id)
208a4f4a 1744{
5eaef520 1745 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1746 int iid = (int)id, rowcount;
5eaef520 1747 EXEC SQL END DECLARE SECTION;
68bbc9c3 1748
5eaef520 1749 EXEC SQL UPDATE servers SET acl_id = 0 WHERE acl_id = :iid AND
1750 acl_type = 'LIST';
1751 rowcount = sqlca.sqlerrd[2];
1752 if (rowcount > 0)
1753 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1754 else
1755 printf("Not fixed\n");
1756 modified("servers");
1757}
68bbc9c3 1758
7ac48069 1759int show_krb_usr(void *id)
208a4f4a 1760{
5eaef520 1761 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1762 int iid = (int)id, found = 1, id1;
5eaef520 1763 EXEC SQL END DECLARE SECTION;
1764 struct string *s;
1765 char *ss;
1766
1767 EXEC SQL DECLARE csr218 CURSOR FOR
1768 SELECT string_id FROM krbmap
1769 WHERE users_id = :iid;
1770 EXEC SQL OPEN csr218;
1771 while (1)
1772 {
1773 EXEC SQL FETCH csr218 INTO :id1;
1774 if (sqlca.sqlcode)
1775 break;
1776
7ac48069 1777 if ((s = hash_lookup(strings, id1)))
5eaef520 1778 ss = s->name;
1779 else
1780 ss = "[unknown]";
1781 found = 0;
1782 printf("Kerberos map for non-existant user %d to principal %s\n",
7ac48069 1783 iid, ss);
208a4f4a 1784 }
5eaef520 1785 EXEC SQL CLOSE csr218;
1786 return found;
208a4f4a 1787}
68bbc9c3 1788
7ac48069 1789int show_krb_str(void *id)
208a4f4a 1790{
5eaef520 1791 EXEC SQL BEGIN DECLARE SECTION;
7ac48069 1792 int iid = (int)id, found = 1, id1;
5eaef520 1793 EXEC SQL END DECLARE SECTION;
1794 struct user *u;
1795 char *s;
1796
1797 EXEC SQL DECLARE csr219 CURSOR FOR
1798 SELECT users_id FROM krbmap
1799 WHERE string_id = :iid;
1800 EXEC SQL OPEN csr219;
1801 while (1)
1802 {
1803 EXEC SQL FETCH csr219 INTO :id1;
1804 if (sqlca.sqlcode)
1805 break;
68bbc9c3 1806
7ac48069 1807 if ((u = hash_lookup(users, id1)))
5eaef520 1808 s = u->login;
1809 else
1810 s = "[\?\?\?]";
1811 found = 0;
1812 printf("Kerberos map for user %s (%d) to non-existant string %d\n",
7ac48069 1813 s, id1, iid);
5eaef520 1814 }
1815 EXEC SQL CLOSE csr219;
1816 return found;
1817}
68bbc9c3 1818
7ac48069 1819void phase2(void)
208a4f4a 1820{
fe0a844a 1821 struct save_queue *sq, *sq1, *sq2, *sq3, *sq4, *sq5, *sq6;
5eaef520 1822 struct filesys *f;
1823 struct list *l;
1824 struct nfsphys *n;
1825 struct machine *m;
c978c079 1826 char rowid[32];
5eaef520 1827
1828 printf("Phase 2 - Checking references\n");
1829
1830 dprintf("Checking users...\n");
1831 hash_step(users, user_check, NULL);
1832
1833 dprintf("Checking machines...\n");
1834 hash_step(machines, mach_check, NULL);
1835
1836 dprintf("Checking subnets...\n");
1837 hash_step(subnets, subnet_check, NULL);
1838
1839 dprintf("Checking clusters...\n");
1840 hash_step(clusters, cluster_check, NULL);
1841
1842 dprintf("Checking mcmap...\n");
1843 sq1 = sq_create();
1844 sq2 = sq_create();
1845 EXEC SQL DECLARE csr221 CURSOR FOR
1846 SELECT mach_id, clu_id FROM mcmap;
1847 EXEC SQL OPEN csr221;
1848 while (1)
1849 {
cfc4f91e 1850 EXEC SQL BEGIN DECLARE SECTION;
1851 int mach_id, clu_id;
1852 EXEC SQL END DECLARE SECTION;
1853
1854 EXEC SQL FETCH csr221 INTO :mach_id, :clu_id;
5eaef520 1855 if (sqlca.sqlcode)
1856 break;
1857
cfc4f91e 1858 if (!(m = hash_lookup(machines, mach_id)))
1859 sq_save_unique_data(sq1, (void *)mach_id);
1860 else if (!hash_lookup(clusters, clu_id))
1861 sq_save_unique_data(sq2, (void *)clu_id);
5eaef520 1862 if (m)
1863 m->clucount++;
ab05f33a 1864 }
5eaef520 1865 EXEC SQL CLOSE csr221;
1866 generic_delete(sq1, show_mcm_mach, "mcmap", "mach_id", 1);
1867 generic_delete(sq2, show_mcm_clu, "mcmap", "clu_id", 1);
1868
1869 dprintf("Checking service clusters...\n");
1870 sq1 = sq_create();
1871 EXEC SQL DECLARE csr222 CURSOR FOR
1872 SELECT clu_id FROM svc;
1873 EXEC SQL OPEN csr222;
1874 while (1)
1875 {
cfc4f91e 1876 EXEC SQL BEGIN DECLARE SECTION;
1877 int clu_id;
1878 EXEC SQL END DECLARE SECTION;
1879
1880 EXEC SQL FETCH csr222 INTO :clu_id;
5eaef520 1881 if (sqlca.sqlcode)
1882 break;
1883
cfc4f91e 1884 if (!hash_lookup(clusters, clu_id))
1885 sq_save_unique_data(sq1, (void *)clu_id);
208a4f4a 1886 }
5eaef520 1887 EXEC SQL CLOSE csr222;
1888 generic_delete(sq1, show_svc, "svc", "clu_id", 1);
1889
1890 dprintf("Checking lists...\n");
1891 hash_step(lists, list_check, NULL);
1892
1893 dprintf("Checking members...\n");
1894 sq1 = sq_create();
1895 sq2 = sq_create();
1896 sq3 = sq_create();
1897 sq4 = sq_create();
1898 sq5 = sq_create();
1899
1900 EXEC SQL DECLARE csr223 CURSOR FOR
c0a94410 1901 SELECT list_id, member_type, member_id, tag, ref_count, direct, rowid
5eaef520 1902 FROM imembers FOR UPDATE OF member_id;
1903 EXEC SQL OPEN csr223;
1904 while (1)
1905 {
cfc4f91e 1906 EXEC SQL BEGIN DECLARE SECTION;
c0a94410 1907 int list_id, id, tag, ref_count, direct;
cfc4f91e 1908 char type[IMEMBERS_MEMBER_TYPE_SIZE];
1909 EXEC SQL END DECLARE SECTION;
1910
c0a94410 1911 EXEC SQL FETCH csr223 INTO :list_id, :type, :id, :tag
c978c079 1912 :ref_count, :direct, :rowid;
5eaef520 1913 if (sqlca.sqlcode)
1914 break;
c0a94410 1915 strtrim(rowid);
5eaef520 1916
cfc4f91e 1917 if (!(l = hash_lookup(lists, list_id)))
1918 sq_save_unique_data(sq1, (void *)list_id);
1919 else if (type[0] == 'U' && !hash_lookup(users, id))
1920 sq_save_unique_data(sq2, (void *)id);
1921 else if (type[0] == 'L' && !hash_lookup(lists, id))
1922 sq_save_unique_data(sq3, (void *)id);
c0a94410 1923 else if (type[0] == 'S' && !maybe_fixup_unref_string2("imembers", "member_id", rowid, id))
cfc4f91e 1924 sq_save_unique_data(sq4, (void *)id);
c0a94410 1925 else if (type[0] == 'K' && !maybe_fixup_unref_string2("imembers", "member_id", rowid, id))
cfc4f91e 1926 sq_save_unique_data(sq5, (void *)id);
5eaef520 1927 else
1928 l->members++;
c0a94410 1929 maybe_fixup_unref_string2("imembers", "tag", rowid, tag);
208a4f4a 1930 }
5eaef520 1931 EXEC SQL CLOSE csr223;
1932 generic_delete(sq1, show_member_list, "imembers", "list_id", 1);
1933 generic_fix(sq2, show_mem_user, "Delete", del_mem_user, 1);
1934 generic_fix(sq3, show_mem_list, "Delete", del_mem_list, 1);
1935 generic_fix(sq4, show_mem_str, "Delete", del_mem_str, 1);
1936 generic_fix(sq5, show_mem_krb, "Delete", del_mem_krb, 1);
1937
1938 dprintf("Checking servers...\n");
1939 sq1 = sq_create();
1940 sq2 = sq_create();
1941 EXEC SQL DECLARE csr224 CURSOR FOR
c978c079 1942 SELECT name, acl_type, acl_id, modby, rowid FROM servers
5eaef520 1943 FOR UPDATE of modby;
1944 EXEC SQL OPEN csr224;
1945 while (1)
1946 {
cfc4f91e 1947 EXEC SQL BEGIN DECLARE SECTION;
1948 int acl_id, modby;
1949 char name[SERVERS_NAME_SIZE], acl_type[SERVERS_ACL_TYPE_SIZE];
1950 EXEC SQL END DECLARE SECTION;
1951
c978c079 1952 EXEC SQL FETCH csr224 INTO :name, :acl_type, :acl_id, :modby, :rowid;
5eaef520 1953 if (sqlca.sqlcode)
1954 break;
1955
11975951 1956 maybe_fixup_modby2("servers", "modby", strtrim(rowid), modby);
cfc4f91e 1957 strtrim(acl_type);
1958 if (!strcmp(acl_type, "USER") && !hash_lookup(users, acl_id))
1959 sq_save_data(sq1, (void *)acl_id);
1960 else if (!strcmp(acl_type, "LIST") && !hash_lookup(lists, acl_id))
1961 sq_save_data(sq2, (void *)acl_id);
5eaef520 1962 }
1963 EXEC SQL CLOSE csr224;
1964 generic_fix(sq1, show_srv_user, "Fix", zero_srv_user, 1);
1965 generic_fix(sq2, show_srv_list, "Fix", zero_srv_list, 1);
1966
1967 dprintf("Checking serverhosts...\n");
1968 sq = sq_create();
1969 EXEC SQL DECLARE csr225 CURSOR FOR
c978c079 1970 SELECT mach_id, modby, rowid FROM serverhosts
5eaef520 1971 FOR UPDATE OF modby;
1972 EXEC SQL OPEN csr225;
1973 while (1)
1974 {
cfc4f91e 1975 EXEC SQL BEGIN DECLARE SECTION;
1976 int mach_id, modby;
1977 EXEC SQL END DECLARE SECTION;
1978
c978c079 1979 EXEC SQL FETCH csr225 INTO :mach_id, :modby, :rowid;
5eaef520 1980 if (sqlca.sqlcode)
1981 break;
1982
11975951 1983 maybe_fixup_modby2("serverhosts", "modby", strtrim(rowid), modby);
cfc4f91e 1984 if (!hash_lookup(machines, mach_id))
1985 sq_save_data(sq, (void *)mach_id);
5eaef520 1986 }
1987 EXEC SQL CLOSE csr225;
1988 generic_fix(sq, show_sh, "Delete", del_sh_mach, 0);
1989
1990 dprintf("Checking nfsphys...\n");
1991 hash_step(nfsphys, check_nfsphys, NULL);
1992
1993 dprintf("Checking filesys...\n");
1994 hash_step(filesys, check_fs, NULL);
1995
1996 dprintf("Checking filesystem groups...\n");
1997 sq1 = sq_create();
1998 sq2 = sq_create();
1999 sq3 = sq_create();
2000 EXEC SQL DECLARE csr226 CURSOR FOR
2001 SELECT group_id, filsys_id FROM fsgroup;
2002 EXEC SQL OPEN csr226;
2003 while (1)
2004 {
cfc4f91e 2005 EXEC SQL BEGIN DECLARE SECTION;
2006 int group_id, filsys_id;
2007 EXEC SQL END DECLARE SECTION;
2008
2009 EXEC SQL FETCH csr226 INTO :group_id, :filsys_id;
5eaef520 2010 if (sqlca.sqlcode)
2011 break;
2012
cfc4f91e 2013 if (!(f = hash_lookup(filesys, group_id)))
2014 sq_save_data(sq1, (void *)group_id);
2015 if (!hash_lookup(filesys, filsys_id))
2016 sq_save_data(sq3, (void *)filsys_id);
208a4f4a 2017 }
5eaef520 2018 EXEC SQL CLOSE csr226;
2019 generic_delete(sq1, show_fsg_missing, "fsgroup", "group_id", 0);
2020 generic_delete(sq3, show_fsg_nomember, "fsgroup", "filsys_id", 1);
2021
2022 dprintf("Checking quotas...\n");
2023 sq1 = sq_create();
2024 sq2 = sq_create();
2025 sq3 = sq_create();
2026 sq4 = sq_create();
2027 EXEC SQL DECLARE csr227 CURSOR FOR
c978c079 2028 SELECT entity_id, type, filsys_id, phys_id, quota, modby, rowid
5eaef520 2029 FROM quota FOR UPDATE OF modby;
2030 EXEC SQL OPEN csr227;
2031 while (1)
2032 {
cfc4f91e 2033 EXEC SQL BEGIN DECLARE SECTION;
2034 int entity_id, filsys_id, phys_id, quota, modby;
2035 char type[QUOTA_TYPE_SIZE];
2036 EXEC SQL END DECLARE SECTION;
2037
2038 EXEC SQL FETCH csr227 INTO :entity_id, :type, :filsys_id,
c978c079 2039 :phys_id, :quota, :modby, :rowid;
5eaef520 2040 if (sqlca.sqlcode)
2041 break;
2042
11975951 2043 maybe_fixup_modby2("quota", "modby", strtrim(rowid), modby);
cfc4f91e 2044 if (type[0] == 'U' && entity_id != 0 && !hash_lookup(users, entity_id))
2045 sq_save_data(sq1, (void *)entity_id);
2046 else if (type[0] == 'G' && !hash_lookup(lists, entity_id))
2047 sq_save_data(sq4, (void *)entity_id);
2048 else if (!(f = hash_lookup(filesys, filsys_id)))
2049 sq_save_data(sq2, (void *)filsys_id);
2050 else if (phys_id != f->phys_id || !(n = hash_lookup(nfsphys, phys_id)))
2051 sq_save_data(sq3, (void *)phys_id);
5eaef520 2052 else
cfc4f91e 2053 n->count += quota;
208a4f4a 2054 }
5eaef520 2055 EXEC SQL CLOSE csr227;
2056 generic_fix(sq1, show_quota_nouser, "Delete", fix_quota_nouser, 1);
2057 generic_fix(sq2, show_quota_nofs, "Delete", fix_quota_nofs, 0);
2058 generic_fix(sq3, show_quota_wrongpid, "Fix", fix_quota_physid, 1);
2059 generic_fix(sq4, show_quota_nolist, "Delete", fix_quota_nolist, 1);
2060
2061 dprintf("Not checking zephyr.\n");
2062
2063 dprintf("Checking hostaccess...\n");
2064 EXEC SQL DECLARE csr228 CURSOR FOR
c978c079 2065 SELECT mach_id, acl_type, acl_id, modby, rowid FROM hostaccess
5eaef520 2066 FOR UPDATE OF modby;
2067 EXEC SQL OPEN csr228;
2068 while (1)
2069 {
cfc4f91e 2070 EXEC SQL BEGIN DECLARE SECTION;
2071 int mach_id, acl_id, modby;
2072 char acl_type[HOSTACCESS_ACL_TYPE_SIZE];
2073 EXEC SQL END DECLARE SECTION;
2074
c978c079 2075 EXEC SQL FETCH csr228 INTO :mach_id, :acl_type, :acl_id, :modby, :rowid;
5eaef520 2076 if (sqlca.sqlcode)
2077 break;
2078
11975951 2079 maybe_fixup_modby2("hostaccess", "modby", strtrim(rowid), modby);
cfc4f91e 2080 strtrim(acl_type);
2081 if (!hash_lookup(machines, mach_id))
5eaef520 2082 {
cfc4f91e 2083 printf("Hostaccess for non-existant host %d\n", mach_id);
5eaef520 2084 printf("Not fixing this error\n");
68bbc9c3 2085 }
cfc4f91e 2086 if (!strcmp(acl_type, "USER") && !hash_lookup(users, acl_id))
5eaef520 2087 {
cfc4f91e 2088 printf("Hostaccess for %d is non-existant user %d\n", mach_id, acl_id);
5eaef520 2089 printf("Not fixing this error\n");
68bbc9c3 2090 }
cfc4f91e 2091 else if (!strcmp(acl_type, "LIST") && !hash_lookup(lists, acl_id))
5eaef520 2092 {
cfc4f91e 2093 printf("Hostaccess for %d is non-existant list %d\n", mach_id, acl_id);
5eaef520 2094 printf("Not fixing this error\n");
68bbc9c3 2095 }
208a4f4a 2096 }
5eaef520 2097 EXEC SQL CLOSE csr228;
2098
5eaef520 2099 dprintf("Checking krbmap...\n");
2100 sq1 = sq_create();
2101 sq2 = sq_create();
2102 EXEC SQL DECLARE csr230 CURSOR FOR
c978c079 2103 SELECT users_id, string_id, rowid FROM krbmap
5eaef520 2104 FOR UPDATE OF string_id;
2105 EXEC SQL OPEN csr230;
2106 while (1)
2107 {
cfc4f91e 2108 EXEC SQL BEGIN DECLARE SECTION;
2109 int users_id, string_id;
2110 EXEC SQL END DECLARE SECTION;
2111
c978c079 2112 EXEC SQL FETCH csr230 INTO :users_id, :string_id, :rowid;
5eaef520 2113 if (sqlca.sqlcode)
2114 break;
2115
cfc4f91e 2116 if (!hash_lookup(users, users_id))
2117 sq_save_unique_data(sq1, (void *)users_id);
11975951 2118 else if (!maybe_fixup_unref_string2("krbmap", "string_id", strtrim(rowid), string_id))
cfc4f91e 2119 sq_save_unique_data(sq2, (void *)string_id);
5eaef520 2120 }
2121 EXEC SQL CLOSE csr230;
2122 generic_delete(sq1, show_krb_usr, "krbmap", "users_id", 1);
2123 generic_delete(sq2, show_krb_str, "krbmap", "string_id", 1);
2124
2125 dprintf("Checking capacls...\n");
2126 EXEC SQL DECLARE csr231 CURSOR FOR
2127 SELECT list_id, tag FROM capacls;
2128 EXEC SQL OPEN csr231;
2129 while (1)
2130 {
cfc4f91e 2131 EXEC SQL BEGIN DECLARE SECTION;
2132 int list_id;
2133 char tag[CAPACLS_TAG_SIZE];
2134 EXEC SQL END DECLARE SECTION;
2135
2136 EXEC SQL FETCH csr231 INTO :list_id, :tag;
5eaef520 2137 if (sqlca.sqlcode)
2138 break;
2139
cfc4f91e 2140 if (!hash_lookup(lists, list_id))
5eaef520 2141 {
cfc4f91e 2142 printf("Capacl for %s is non-existant list %d\n", tag, list_id);
5eaef520 2143 printf("Not fixing this error\n");
68bbc9c3 2144 }
208a4f4a 2145 }
5eaef520 2146 EXEC SQL CLOSE csr231;
2147
2148 dprintf("Checking hostaliases\n");
2149 sq1 = sq_create();
2150 EXEC SQL DECLARE csr232 CURSOR FOR
2151 SELECT mach_id FROM hostalias;
2152 EXEC SQL OPEN csr232;
2153 while (1)
2154 {
cfc4f91e 2155 EXEC SQL BEGIN DECLARE SECTION;
2156 int mach_id;
2157 EXEC SQL END DECLARE SECTION;
2158
2159 EXEC SQL FETCH csr232 INTO :mach_id;
5eaef520 2160 if (sqlca.sqlcode)
2161 break;
2162
cfc4f91e 2163 if (!hash_lookup(machines, mach_id))
2164 sq_save_unique_data(sq1, (void *)mach_id);
ab05f33a 2165 }
5eaef520 2166 EXEC SQL CLOSE csr232;
2167 generic_delete(sq1, show_hostalias, "hostalias", "mach_id", 1);
2168
dabf20aa 2169 dprintf("Checking printers\n");
5eaef520 2170 sq1 = sq_create();
2171 sq2 = sq_create();
dabf20aa 2172 sq3 = sq_create();
2173 sq4 = sq_create();
2174 sq5 = sq_create();
fe0a844a 2175 sq6 = sq_create();
5eaef520 2176 EXEC SQL DECLARE csr233 CURSOR FOR
c978c079 2177 SELECT mach_id, loghost, rm, rq, ac, lpc_acl, modby, rowid FROM printers;
5eaef520 2178 EXEC SQL OPEN csr233;
2179 while (1)
2180 {
cfc4f91e 2181 EXEC SQL BEGIN DECLARE SECTION;
c96b70a5 2182 int mach_id, loghost, rm, rq, ac, lpc_acl, modby;
cfc4f91e 2183 EXEC SQL END DECLARE SECTION;
2184
11975951 2185 EXEC SQL FETCH csr233 INTO :mach_id, :loghost, :rm, :rq, :ac,
c978c079 2186 :lpc_acl, :modby, :rowid;
5eaef520 2187 if (sqlca.sqlcode)
2188 break;
2189
11975951 2190 maybe_fixup_modby2("printers", "modby", strtrim(rowid), modby);
cfc4f91e 2191 if (!hash_lookup(machines, mach_id))
2192 sq_save_unique_data(sq1, (void *)mach_id);
dabf20aa 2193 else if (!hash_lookup(machines, rm))
2194 sq_save_unique_data(sq2, (void *)rm);
fe0a844a 2195 else if (!hash_lookup(printservers, rm))
2196 sq_save_unique_data(sq6, (void *)mach_id);
dabf20aa 2197 else if (!hash_lookup(machines, rq))
2198 sq_save_unique_data(sq3, (void *)rq);
2199 else {
2200 if (!hash_lookup(lists, ac))
2201 sq_save_unique_data(sq4, (void *)ac);
2202 if (!hash_lookup(lists, lpc_acl))
2203 sq_save_unique_data(sq5, (void *)lpc_acl);
2204 if (!hash_lookup(machines, loghost))
2205 {
2206 show_printer_loghost((void *)loghost);
c96b70a5 2207 cant_fix();
dabf20aa 2208 }
c96b70a5 2209 }
ab05f33a 2210 }
5eaef520 2211 EXEC SQL CLOSE csr233;
dabf20aa 2212 generic_delete(sq1, show_printer_mach, "printers", "mach_id", 1);
fe0a844a 2213 generic_delete(sq6, show_printer_server, "printers", "mach_id", 1);
dabf20aa 2214 generic_delete(sq2, show_printer_spool, "printers", "rm", 1);
2215 generic_delete(sq3, show_printer_quota, "printers", "rq", 1);
2216 generic_fix(sq4, show_printer_ac, "Clear", fix_printer_ac, 1);
2217 generic_fix(sq5, show_printer_lpc_acl, "Clear", fix_printer_lpc_acl, 1);
fe0a844a 2218
2219 dprintf("Checking printservers\n");
2220 hash_step(printservers, check_ps, NULL);
ab05f33a 2221}
c96b70a5 2222
This page took 0.449755 seconds and 5 git commands to generate.