int show_mcm_mach(void *id);
int show_mcm_clu(void *id);
+int show_mcntmap_mach(void *id);
+int show_mcntmap_cnt(void *id);
int show_hostalias(void *id);
int show_printer_mach(void *id);
int show_printer_server(void *id);
void fix_printer_ac(void *id);
void fix_printer_lpc_acl(void *id);
void user_check(int id, void *user, void *hint);
+void clear_user_sponsor(struct user *u);
int maybe_fixup_unref_string(int sid, int oid, char *oname, char *table,
char *field, char *idfield);
int maybe_fixup_modby(int sid, int oid, char *oname, char *table,
int show_mem_list(void *id);
int show_mem_str(void *id);
int show_mem_krb(void *id);
+int show_mem_mach(void *id);
void del_mem_user(void *id);
void del_mem_list(void *id);
void del_mem_str(void *id);
void del_mem_krb(void *id);
+void del_mem_mach(void *id);
int show_sh(void *id);
void del_sh_mach(void *id);
void fsmatch(int id, void *nfsphys, void *filesys);
void check_fs(int id, void *filesys, void *hint);
void check_nfsphys(int id, void *nfsphys, void *hint);
void check_ps(int id, void *printserver, void *hint);
+void check_container(int id, void *container, void *hint);
+void fix_container_acl(int id);
+void fix_container_memacl(int id);
int show_fsg_missing(void *id);
int show_fsg_type(void *filesys);
void fix_fsg_type(void *filesys);
return found;
}
+int show_mcntmap_mach(void *id)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int iid = (int)id, found = 1;
+ char name[CONTAINERS_NAME_SIZE];
+ EXEC SQL END DECLARE SECTION;
+
+ EXEC SQL DECLARE csr_show_mcnt_mach CURSOR FOR
+ SELECT cnt.name FROM container cnt, mcntmap mc
+ WHERE cnt.cnt_id = mc.cnt_id AND mc.mach_id = :iid;
+ EXEC SQL OPEN csr_show_mcnt_mach;
+ while (1)
+ {
+ EXEC SQL FETCH csr_show_mcnt_mach INTO :name;
+ if (sqlca.sqlcode)
+ break;
+
+ strtrim(name);
+ found = 0;
+ printf("Container %s, non-existant machine %d in container map\n",
+ name, iid);
+ }
+ EXEC SQL CLOSE csr_show_mcnt_mach;
+ return found;
+}
+
+int show_mcntmap_cnt(void *id)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int iid = (int)id, found = 1;
+ char name[MACHINE_NAME_SIZE];
+ EXEC SQL END DECLARE SECTION;
+
+ EXEC SQL DECLARE csr_show_mcnt_cnt CURSOR FOR
+ SELECT m.name FROM machine m, mcntmap mc
+ WHERE m.mach_id = mc.mach_id AND mc.cnt_id = :iid;
+ EXEC SQL OPEN csr_show_mcnt_cnt;
+ while (1)
+ {
+ EXEC SQL FETCH csr_show_mcnt_cnt INTO :name;
+ if (sqlca.sqlcode)
+ break;
+
+ strtrim(name);
+
+ found = 0;
+ printf("Machine %s, non-existant container %d in container map\n",
+ name, iid);
+ }
+ EXEC SQL CLOSE csr_show_mcnt_cnt;
+ return found;
+}
+
int show_hostalias(void *id)
{
EXEC SQL BEGIN DECLARE SECTION;
u->sigwho = maybe_fixup_unref_string(u->sigwho, id, u->login, "users",
"sigwho", "users_id");
+ switch (u->sponsor_type)
+ {
+ case 'U':
+ if (!hash_lookup(users, u->sponsor_id))
+ {
+ printf("User %s has non-existant USER sponsor %d\n",
+ u->login, u->sponsor_id);
+ if (single_fix("Set to no sponsor", 1))
+ clear_user_sponsor(u);
+ }
+ break;
+ case 'L':
+ if (!hash_lookup(lists, u->sponsor_id))
+ {
+ printf("User %s has non-existant LIST sponsor %d\n",
+ u->login, u->sponsor_id);
+ if (single_fix("Set to no sponsor", 1))
+ clear_user_sponsor(u);
+ }
+ break;
+ case 'S':
+ case 'K':
+ if (u->sponsor_id)
+ u->sponsor_id = maybe_fixup_unref_string(u->sponsor_id, id, u->login,
+ "users", "sponsor_id",
+ "users_id");
+ if (u->sponsor_id == 0)
+ clear_user_sponsor(u);
+ }
+
pobox_check(id, u);
}
}
break;
+ case 'E':
+ if (!hash_lookup(machines, u->pobox_id))
+ {
+ printf("User %s(%s) has P.O.Box on non-existant machine %d\n",
+ u->login, u->fullname, u->pobox_id);
+ if (single_fix("Delete", 0))
+ {
+ remove_pobox(u->users_id);
+ u->potype = 'N';
+ }
+ }
+ break;
+
case 'S':
if (hash_lookup(string_dups, u->pobox_id))
{
"modby", "snet_id");
}
+void clear_user_sponsor(struct user *u)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int rowcount, id = u->users_id;
+ EXEC SQL END DECLARE SECTION;
+
+ EXEC SQL UPDATE users SET sponsor_type = 'NONE', sponsor_id = 0
+ WHERE users_id = :id;
+ rowcount = sqlca.sqlerrd[2];
+ if (rowcount > 0)
+ printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
+ else
+ printf("Not fixed\n");
+ modified("users");
+}
+
void clear_subnet_owner(struct subnet *s)
{
EXEC SQL BEGIN DECLARE SECTION;
return found;
}
+int show_mem_mach(void *id)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int lid, iid = (int)id, found = 1;
+ EXEC SQL END DECLARE SECTION;
+ struct list *l;
+
+ EXEC SQL DECLARE csr208a CURSOR FOR
+ SELECT list_id FROM imembers
+ WHERE member_id = :iid AND member_type = 'MACHINE';
+ EXEC SQL OPEN csr208a;
+ while (1)
+ {
+ EXEC SQL FETCH csr208a INTO :lid;
+ if (sqlca.sqlcode)
+ break;
+ l = hash_lookup(lists, lid);
+ if (!l)
+ continue;
+
+ found = 0;
+ printf("List %s has nonexistant machine member, id %d\n",
+ l->name, iid);
+ }
+ EXEC SQL CLOSE csr208a;
+ return found;
+}
void del_mem_user(void *id)
{
modified("imembers");
}
+void del_mem_mach(void *id)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int iid = (int)id, rowcount;
+ EXEC SQL END DECLARE SECTION;
+
+ EXEC SQL DELETE FROM imembers WHERE member_type = 'MACHINE' AND
+ member_id = :iid;
+ rowcount = sqlca.sqlerrd[2];
+ if (rowcount > 0)
+ printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
+ else
+ printf("Not deleted\n");
+ modified("imembers");
+}
int show_sh(void *id)
{
}
}
+static void clear_container_list(struct container *cnt)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int rowcount, id = cnt->cnt_id;
+ EXEC SQL END DECLARE SECTION;
+
+ EXEC SQL UPDATE containers SET list_id = 0
+ WHERE cnt_id = :id;
+ rowcount = sqlca.sqlerrd[2];
+ if (rowcount > 0)
+ printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
+ else
+ printf("Not fixed\n");
+ modified("containers");
+}
+
+void fix_container_acl(int id)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int rowcount, iid = (int)id;
+ EXEC SQL END DECLARE SECTION;
+
+ EXEC SQL UPDATE containers SET acl_id = 0, acl_type = 'NONE'
+ WHERE cnt_id = :iid;
+ rowcount = sqlca.sqlerrd[2];
+ if (rowcount > 0)
+ printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
+ else
+ printf("Not fixed\n");
+ modified("containers");
+}
+
+void fix_container_memacl(int id)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int rowcount, iid = (int)id;
+ EXEC SQL END DECLARE SECTION;
+
+ EXEC SQL UPDATE containers SET memacl_id = 0, memacl_type = 'NONE'
+ WHERE cnt_id = :iid;
+ rowcount = sqlca.sqlerrd[2];
+ if (rowcount > 0)
+ printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
+ else
+ printf("Not fixed\n");
+ modified("containers");
+}
+
+void check_container(int id, void *container, void *hint)
+{
+ struct container *cnt = container;
+
+ if (!hash_lookup(lists, cnt->list_id))
+ {
+ printf("Container %s has non-existent associated list_id %d\n",
+ cnt->name, cnt->list_id);
+ if (single_fix("Set to no associated list", 1))
+ clear_container_list(cnt);
+ }
+
+ switch (cnt->acl_type)
+ {
+ case 'L':
+ if (!hash_lookup(lists, cnt->acl_id))
+ {
+ printf("Container %s has bad LIST acl %d\n", cnt->name, cnt->acl_id);
+ if (single_fix("Patch", 1))
+ fix_container_acl(cnt->cnt_id);
+ }
+ break;
+ case 'U':
+ if (!hash_lookup(users, cnt->acl_id))
+ {
+ printf("Container %s has bad USER acl %d\n", cnt->name, cnt->acl_id);
+ if (single_fix("Patch", 1))
+ fix_container_acl(cnt->cnt_id);
+ }
+ break;
+ case 'K':
+ cnt->acl_id = maybe_fixup_unref_string(cnt->acl_id, id, cnt->name,
+ "container", "acl_id", "cnt_id");
+ if (!cnt->acl_id)
+ {
+ printf("Container %s has bad KERBEROS acl %d\n", cnt->name,
+ cnt->acl_id);
+ if (single_fix("Patch", 1))
+ fix_container_acl(cnt->cnt_id);
+ }
+ break;
+ }
+
+ switch (cnt->memacl_type)
+ {
+ case 'L':
+ if (!hash_lookup(lists, cnt->memacl_id))
+ {
+ printf("Container %s has bad LIST memacl %d\n", cnt->name,
+ cnt->memacl_id);
+ if (single_fix("Patch", 1))
+ fix_container_memacl(cnt->cnt_id);
+ }
+ break;
+ case 'U':
+ if (!hash_lookup(users, cnt->memacl_id))
+ {
+ printf("Container %s has bad USER memacl %d\n", cnt->name,
+ cnt->memacl_id);
+ if (single_fix("Patch", 1))
+ fix_container_memacl(cnt->cnt_id);
+ }
+ break;
+ case 'K':
+ cnt->memacl_id = maybe_fixup_unref_string(cnt->memacl_id, id, cnt->name,
+ "container", "memacl_id",
+ "cnt_id");
+ if (!cnt->memacl_id)
+ {
+ printf("Container %s has bad KERBEROS memacl %d\n", cnt->name,
+ cnt->memacl_id);
+ if (single_fix("Patch", 1))
+ fix_container_memacl(cnt->cnt_id);
+ }
+ break;
+ }
+
+ cnt->modby = maybe_fixup_modby(cnt->modby, id, cnt->name, "containers",
+ "modby", "cnt_id");
+}
+
int show_fsg_missing(void *id)
{
EXEC SQL BEGIN DECLARE SECTION;
sq3 = sq_create();
sq4 = sq_create();
sq5 = sq_create();
+ sq6 = sq_create();
EXEC SQL DECLARE csr223 CURSOR FOR
SELECT list_id, member_type, member_id, tag, ref_count, direct, rowid
sq_save_unique_data(sq4, (void *)id);
else if (type[0] == 'K' && !maybe_fixup_unref_string2("imembers", "member_id", rowid, id))
sq_save_unique_data(sq5, (void *)id);
+ else if (type[0] == 'M' && !hash_lookup(machines, id))
+ sq_save_unique_data(sq6, (void *)id);
else
l->members++;
maybe_fixup_unref_string2("imembers", "tag", rowid, tag);
generic_fix(sq3, show_mem_list, "Delete", del_mem_list, 1);
generic_fix(sq4, show_mem_str, "Delete", del_mem_str, 1);
generic_fix(sq5, show_mem_krb, "Delete", del_mem_krb, 1);
+ generic_fix(sq6, show_mem_mach, "Delete", del_mem_mach, 1);
dprintf("Checking servers...\n");
sq1 = sq_create();
}
EXEC SQL CLOSE csr231;
- dprintf("Checking hostaliases\n");
+ dprintf("Checking hostaliases...\n");
sq1 = sq_create();
EXEC SQL DECLARE csr232 CURSOR FOR
SELECT mach_id FROM hostalias;
EXEC SQL CLOSE csr232;
generic_delete(sq1, show_hostalias, "hostalias", "mach_id", 1);
- dprintf("Checking printers\n");
+ dprintf("Checking printers...\n");
sq1 = sq_create();
sq2 = sq_create();
sq3 = sq_create();
generic_fix(sq4, show_printer_ac, "Clear", fix_printer_ac, 1);
generic_fix(sq5, show_printer_lpc_acl, "Clear", fix_printer_lpc_acl, 1);
- dprintf("Checking printservers\n");
+ dprintf("Checking printservers...\n");
hash_step(printservers, check_ps, NULL);
+
+ dprintf("Checking containers...\n");
+ hash_step(containers, check_container, NULL);
+
+ dprintf("Checking mcntmap...\n");
+ sq1 = sq_create();
+ sq2 = sq_create();
+ EXEC SQL DECLARE csr_mcntmap CURSOR FOR
+ SELECT mach_id, cnt_id FROM mcntmap;
+ EXEC SQL OPEN csr_mcntmap;
+ while (1)
+ {
+ EXEC SQL BEGIN DECLARE SECTION;
+ int mach_id, cnt_id;
+ EXEC SQL END DECLARE SECTION;
+
+ EXEC SQL FETCH csr_mcntmap INTO :mach_id, :cnt_id;
+ if (sqlca.sqlcode)
+ break;
+
+ if (!(m = hash_lookup(machines, mach_id)))
+ sq_save_unique_data(sq1, (void *)mach_id);
+ else if (!hash_lookup(containers, cnt_id))
+ sq_save_unique_data(sq2, (void *)cnt_id);
+ }
+ EXEC SQL CLOSE csr_mcntmap;
+ generic_delete(sq1, show_mcntmap_mach, "mcntmap", "mach_id", 1);
+ generic_delete(sq2, show_mcntmap_cnt, "mcntmap", "cnt_id", 1);
+
}