X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/c461aa3e6266bd8f3ed37759666f35ef88362d0a..refs/heads/moira2:/gen/nfs.qc diff --git a/gen/nfs.qc b/gen/nfs.qc index 01e639bf..65e8e162 100644 --- a/gen/nfs.qc +++ b/gen/nfs.qc @@ -9,20 +9,19 @@ #include #include -#include -#include +#include +#include #include #include #include -#undef NFS_DIR -#define NFS_DIR "/u1/sms/dcm/nfs" #define min(x,y) ((x) < (y) ? (x) : (y)) char *whoami = "nfs.gen"; char *malloc(), *strsave(); char *ingres_date_and_time(), *ingres_time(), *ingres_date(); +char nfs_dir[64]; main(argc, argv) int argc; @@ -35,10 +34,13 @@ char **argv; if (argc > 2) { fprintf(stderr, "usage: %s [outfile]\n", argv[0]); - exit(SMS_ARGS); + exit(MR_ARGS); } IIseterr(ingerr); + initialize_sms_error_table(); + sprintf(nfs_dir, "%s/nfs", DCM_DIR); + ## ingres sms ## set lockmode session where level = table @@ -49,16 +51,17 @@ char **argv; if (!changed) { fprintf(stderr, "No files updated.\n"); if (argc == 2 && stat(argv[1], &sb) == 0) - exit(SMS_NO_CHANGE); + exit(MR_NO_CHANGE); } if (argc == 2) { - sprintf(cmd, "cd %s; cp /u1/sms/bin/install_* .; tar cf %s .", NFS_DIR, argv[1]); + sprintf(cmd, "cd %s; cp %s/nfs/* .; tar cf %s .", + nfs_dir, SMS_DIR, argv[1]); if (system(cmd)) - exit(SMS_TAR_FAIL); + exit(MR_TAR_FAIL); } - exit(SMS_SUCCESS); + exit(MR_SUCCESS); } @@ -77,12 +80,12 @@ static int ingerr(num) switch (*num) { case INGRES_DEADLOCK: - ingres_errno = SMS_DEADLOCK; + ingres_errno = MR_DEADLOCK; break; default: - ingres_errno = SMS_INGRES_ERR; + ingres_errno = MR_INGRES_ERR; } - com_err(whoami, SMS_INGRES_ERR, " code %d\n", *num); + com_err(whoami, MR_INGRES_ERR, " code %d\n", *num); critical_alert("DCM", "NFS build encountered INGRES ERROR %d", *num); exit(ingres_errno); } @@ -99,10 +102,11 @@ int do_nfs() machs = sq_create(); lists = sq_create(); ## range of s is serverhosts -## retrieve (machname = trim(machine.name), listname = trim(s.value3)) -## where machine.mach_id = s.mach_id and s.enable != 0 { - sq_save_unique_string(machs, strsave(machname)); - sq_save_unique_string(lists, strsave(listname)); +## retrieve (machname = machine.name, listname = s.value3) +## where machine.mach_id = s.mach_id and s.service = "NFS" +## and s.enable != 0 { + sq_save_unique_string(machs, strsave(strtrim(machname))); + sq_save_unique_string(lists, strsave(strtrim(listname))); ## } changed = do_lists(lists); @@ -117,7 +121,6 @@ int do_nfs() int do_lists(lists) struct save_queue *lists; ##{ - struct save_queue *sq, *members; char file[64], *u; struct hash *users, *do_everyone(); struct stat sb; @@ -125,7 +128,7 @@ struct save_queue *lists; ## char *listname, *lsname, lname[33], uname[9], *filetime; ## int uid, id, flag1, flag2, flag3, flag4; - sprintf(file, "%s/list-", NFS_DIR); + sprintf(file, "%s/list-", nfs_dir); if (stat(file, &sb) == 0) { filetime = ingres_date_and_time(sb.st_mtime); ## retrieve (flag1 = int4(interval("min", tblstats.modtime - filetime))) @@ -133,7 +136,7 @@ struct save_queue *lists; ## retrieve (flag2 = int4(interval("min", tblstats.modtime - filetime))) ## where tblstats.table = "list" ## retrieve (flag3 = int4(interval("min", tblstats.modtime - filetime))) -## where tblstats.table = "members" +## where tblstats.table = "imembers" ## retrieve (flag4 = int4(interval("min", tblstats.modtime - filetime))) ## where tblstats.table = "serverhosts" if (flag1 < 0 && flag2 < 0 && flag3 < 0 && flag4 < 0) { @@ -156,42 +159,26 @@ struct save_queue *lists; /* now do each of the lists used by an NFS server */ ## range of l is list ## range of l1 is list -## range of m is members +## range of m is imembers ## range of u is users while (sq_get_data(lists, &listname)) { if (strlen(listname) == 0) continue; - sprintf(file, "%s/list-%s", NFS_DIR, listname); + sprintf(file, "%s/list-%s", nfs_dir, listname); fd = fopen(file, "w"); if (!fd) { fprintf(stderr, "cannot open %s for output\n", file); - exit(SMS_OCONFIG); - } - sq = sq_create(); - sq_save_data(sq, listname); - members = sq_create(); - while (sq_get_data(sq, &lsname)) { -## repeat retrieve (lname = trim(l.name)) -## where m.list_id = l1.list_id and l1.name = @lsname and -## m.member_type = "LIST" and m.member_id = l.list_id { - sq_save_unique_string(sq, strsave(lname)); -## } -## repeat retrieve (id = m.member_id) -## where m.list_id = l1.list_id and l1.name = @lsname and -## m.member_type = "USER" { - if (u = hash_lookup(users, id)) { - sq_save_unique_data(members, u); - } -## } + exit(MR_OCONFIG); } - while (sq_get_data(members, &lsname)) - fprintf(fd, "%s\n", lsname); -/* test to see if this speeds things up; don't free anything! - sq_destroy(members); - sq_destroy(sq); - */ if (fclose(fd)) { +## repeat retrieve (id = m.member_id) +## where m.list_id = l1.list_id and l1.name = @listname and +## m.member_type = "USER" { + if (u = hash_lookup(users, id)) + fprintf(fd, "%s\n", u); +## } + if (fclose(fd)) { fprintf(stderr, "error closing %s\n", file); - exit(SMS_CCONFIG); + exit(MR_CCONFIG); } } /* don't free here either @@ -205,7 +192,7 @@ struct save_queue *lists; /* Build the list of everybody. */ struct grp { struct grp *next; - int id; + char *lid; }; struct user { char name[9]; @@ -227,11 +214,11 @@ struct hash *do_everyone() struct save_queue *sq; fprintf(stderr, "Building the list of everybody\n"); - sprintf(buf, "%s/list-", NFS_DIR); + sprintf(buf, "%s/list-", nfs_dir); fd = fopen(buf, "w"); if (!fd) { fprintf(stderr, "cannot open %s for output\n", buf); - exit(SMS_OCONFIG); + exit(MR_OCONFIG); } /* make space for group list */ @@ -245,41 +232,6 @@ struct hash *do_everyone() hash_store(groups, lid, strsave(buf)); ## } - /* get special cases: lists that aren't groups themselves but are - * members of groups. */ - sq = sq_create(); -## range of m is members -## retrieve (gid = list.#gid, lid = l.list_id) -## where l.active != 0 and list.active != 0 and m.member_type = "LIST" and -## m.member_id = l.list_id and m.list_id = list.list_id and -## list.group != 0 { - if (l = hash_lookup(groups, lid)) { - sprintf(buf, "%s:%d", l, gid); - free(l); - } else { - sprintf(buf, ":%d", gid); - } - hash_store(groups, lid, strsave(buf)); - sq_save_data(sq, lid); -## } - - while (sq_get_data(sq, &id)) { -## repeat retrieve (lid = l.list_id) where l.active != 0 and -## m.member_type = "LIST" and m.member_id = l.list_id and -## m.list_id = @id { - if (l = hash_lookup(groups, lid)) { - sprintf(buf, "%s%s", l, hash_lookup(groups, id)); - free(l); - l = strsave(buf); - } else { - l = hash_lookup(groups, id); - } - hash_store(groups, lid, l); - sq_save_unique_data(sq, lid); -## } - } - sq_destroy(sq); - /* now do grplists */ users = create_hash(10000); ## range of u is users @@ -292,31 +244,23 @@ struct hash *do_everyone() hash_store(users, id, u); ## } -## repeat retrieve (lid = m.list_id, id = m.member_id) -## where m.member_type = "USER" { +## range of m is imembers +## retrieve (lid = m.list_id, id = m.member_id) where m.member_type = "USER" { if ((u = (struct user *) hash_lookup(users, id)) && - (hash_lookup(groups, lid) != NULL)) { + ((l = hash_lookup(groups, lid)) != NULL)) { g = (struct grp *) malloc(sizeof(struct grp)); g->next = u->lists; u->lists = g; - g->id = lid; + g->lid = l; } ## } for (p = &(users->data[users->size - 1]); p >= users->data; p--) { for (b = *p; b; b = b->next) { - i = 0; u = (struct user *)b->data; sprintf(buf, "%s:%d", u->name, u->uid); for (g = u->lists; g; g = g->next) - if (l = hash_lookup(groups, g->id)) { - i++; - strcat(buf, l); - } - /* should free stuff here... */ - if (i > 1) { - remove_duplicate_groups(buf); - } + strcat(buf, g->lid); b->data = strsave(buf); fprintf(fd, "%s\n", buf); } @@ -327,36 +271,6 @@ struct hash *do_everyone() return(users); ##} -#define MAXGROUPS 256 - -remove_duplicate_groups(p) -register char *p; -{ - register char *pp; - char *index(); - register int *mp; - int memory[MAXGROUPS], i, *mg = &memory[MAXGROUPS-1]; - - bzero(memory, MAXGROUPS * sizeof(int)); - p = index(p, ':'); - p++; - while (p = index(p, ':')) { - i = atoi(++p); - pp = p; - for (mp = memory; *mp && mp < mg; mp++) - if (*mp == i) { - if (p = index(p, ':')) - strcpy(pp, ++p); - else { - *(--pp) = 0; - } - p = pp - 2; - break; - } - *mp = i; - } -} - /* Now do each of the servers, linking the credentials list file and * compiling the quota and dirs files. @@ -365,108 +279,146 @@ register char *p; int do_machs(machs) struct save_queue *machs; ##{ -## char *machname, listname[33], dev[33], *device, dir[64], fstype[9]; -## char *filetime; +## char *machname, listname[33], dev[33], dir[81], fstype[9]; ## int uid, quota, id, gid, flag1, flag2, flag3, flag4; char file[64], f1[64], f2[64], *cp, *index(); - int prevuid, quotasum; + int prevuid, quotasum, olddev, oldmach; FILE *fd; - struct stat sb; - struct save_queue *sq; - -/* - sprintf(file, "%s/list-", NFS_DIR); - if (stat(file, &sb) == 0) { - filetime = ingres_date_and_time(sb.st_mtime); - # retrieve (flag1 = int4(interval("min", tblstats.modtime - filetime))) - # where tblstats.table = "serverhosts" - # retrieve (flag2 = int4(interval("min", tblstats.modtime - filetime))) - # where tblstats.table = "filesys" - # retrieve (flag3 = int4(interval("min", tblstats.modtime - filetime))) - # where tblstats.table = "nfsquota" - # retrieve (flag4 = int4(interval("min", tblstats.modtime - filetime))) - # where tblstats.table = "nfsphys" - if (flag1 < 0 && flag2 < 0 && flag3 < 0 && flag4 < 0) { - fprintf(stderr, "The machine files do not need to be rebuilt.\n"); - return(0); - } - } -*/ + struct hash *machines; fprintf(stderr, "Building machine files\n"); -## begin transaction ## range of s is serverhosts ## range of m is machine ## range of n is nfsphys -## range of q is nfsquota +## range of q is #quota ## range of f is filesys ## range of u is users ## range of l is list + +/* acquire locks on machines & filesystems */ +## begin transaction +## retrieve (listname = u.modtime) where u.users_id = 0 +## retrieve (listname = m.modtime) where m.mach_id = 0 +## retrieve (listname = f.modtime) where f.filsys_id = 0 + + machines = create_hash(100); while (sq_get_data(machs, &machname)) { -## repeat retrieve (listname = trim(s.value3)) +## repeat retrieve (listname = s.value3, id = m.mach_id) ## where s.mach_id = m.mach_id and m.name = @machname strtrim(machname); - sprintf(f1, "%s/list-%s", NFS_DIR, listname); - sprintf(f2, "%s/%s.cred", NFS_DIR, machname); + sprintf(f1, "%s/list-%s", nfs_dir, strtrim(listname)); + sprintf(f2, "%s/%s.cred", nfs_dir, machname); unlink(f2); /* ignore errors on this unlink */ if (link(f1, f2)) { fprintf(stderr, "Cannot link %s to %s\n", f1, f2); - exit(SMS_OCONFIG); - } - sq = sq_create(); -## repeat retrieve (dev = trim(n.#device)) -## where n.mach_id = m.mach_id and m.name = @machname { - sq_save_data(sq, strsave(dev)); -## } - while (sq_get_data(sq, &device)) { -## repeat retrieve (id = n.nfsphys_id) where n.mach_id = m.mach_id and -## m.#name = @machname and n.#device = @device - while (cp = index(device, '/')) *cp = '@'; - sprintf(file, "%s/%s.%s.quotas", NFS_DIR, machname, device); - fd = fopen(file, "w"); - if (!fd) { - fprintf(stderr, "cannot open %s for output\n", file); - exit(SMS_OCONFIG); - } - prevuid = -1; - quotasum = 0; -## repeat retrieve (uid = u.#uid, quota = q.#quota) -## where q.users_id = u.users_id and q.filsys_id = f.filsys_id and -## f.phys_id = @id and u.status != 0 sort by #uid { - if (uid != prevuid) { - if (quotasum) - fprintf(fd, "%d %d\n", prevuid, quotasum); - prevuid = uid; - quotasum = quota; - } else { - quotasum += quota; - } -## } - if (quotasum) - fprintf(fd, "%d %d\n", prevuid, quotasum); - if (fclose(fd)) { - fprintf(stderr, "error closing %s", file); - exit(SMS_CCONFIG); - } - sprintf(file, "%s/%s.%s.dirs", NFS_DIR, machname, device); - fd = fopen(file, "w"); - if (!fd) { - fprintf(stderr, "cannot open %s for output\n", file); - exit(SMS_OCONFIG); - } -## repeat retrieve (dir = trim(f.#name), fstype = trim(f.lockertype), -## uid = u.#uid, gid = l.#gid) -## where f.phys_id = @id and f.owner = u.users_id and -## f.owners = l.list_id and f.createflg != 0 { - fprintf(fd, "%s %d %d %s\n", dir, uid, gid, fstype); -## } - if (fclose(fd)) { - fprintf(stderr, "error closing %s", file); - exit(SMS_CCONFIG); - } + exit(MR_OCONFIG); } - sq_destroy(sq); + hash_store(machines, id, machname); + } + + olddev = oldmach = -1; + fd = stdin; +## retrieve (quota = q.#quota, uid = u.#uid, flag1 = q.phys_id, +## dev = n.device, flag2 = n.mach_id) +## where u.users_id = q.entity_id and n.nfsphys_id = q.phys_id and +## q.phys_id != 0 and n.status < 16 and q.type = "USER" +## sort by #flag2, #flag1, #uid { + if (flag1 != olddev || flag2 != oldmach) { + fclose(fd); + olddev = flag1; + oldmach = flag2; + while (cp = index(dev, '/')) *cp = '@'; + sprintf(file, "%s/%s.%s.quotas", nfs_dir, + hash_lookup(machines, flag2), strtrim(dev)); + fd = fopen(file, "w"); + if (!fd) { + fprintf(stderr, "cannot open %s for output\n", file); + exit(MR_OCONFIG); + } + prevuid = -1; + quotasum = 0; + } + if (uid != prevuid) { + if (quotasum) + fprintf(fd, "%d %d\n", prevuid, quotasum); + prevuid = uid; + quotasum = quota; + } else { + quotasum += quota; + } +## } + if (quotasum) + fprintf(fd, "%d %d\n", prevuid, quotasum); + if (fd != stdin && fclose(fd)) { + fprintf(stderr, "error closing %s", file); + exit(MR_CCONFIG); + } + + olddev = oldmach = -1; + fd = stdin; +## retrieve (quota = q.#quota, gid = l.#gid, flag1 = q.phys_id, +## dev = n.device, flag2 = n.mach_id, flag3 = n.status) +## where l.list_id = q.entity_id and n.nfsphys_id = q.phys_id and +## q.phys_id != 0 and n.status > 15 and q.type = "GROUP" +## sort by #flag2, #flag1, #gid { + if (flag1 != olddev || flag2 != oldmach) { + fclose(fd); + olddev = flag1; + oldmach = flag2; + while (cp = index(dev, '/')) *cp = '@'; + sprintf(file, "%s/%s.%s.quotas", nfs_dir, + hash_lookup(machines, flag2), strtrim(dev)); + fd = fopen(file, "w"); + if (!fd) { + fprintf(stderr, "cannot open %s for output\n", file); + exit(MR_OCONFIG); + } + prevuid = -1; + quotasum = 0; + } + if (gid != prevuid) { + if (quotasum) + fprintf(fd, "%d %d\n", prevuid, quotasum); + prevuid = gid; + quotasum = quota; + } else { + quotasum += quota; + } +## } + if (quotasum) + fprintf(fd, "%d %d\n", prevuid, quotasum); + if (fd != stdin && fclose(fd)) { + fprintf(stderr, "error closing %s", file); + exit(MR_CCONFIG); + } + + olddev = oldmach = -1; +## retrieve (dir = f.#name, fstype = f.lockertype, uid = u.#uid, +## gid = l.#gid, flag1 = f.phys_id, flag2 = f.mach_id, +## dev = n.device) +## where u.users_id = f.owner and l.list_id = f.owners and +## f.createflg != 0 and f.phys_id != 0 and f.type = "NFS" and +## f.phys_id = n.nfsphys_id +## sort by #flag2, #flag1 { + if (flag1 != olddev || flag2 != oldmach) { + fclose(fd); + olddev = flag1; + oldmach = flag2; + while (cp = index(dev, '/')) *cp = '@'; + sprintf(file, "%s/%s.%s.dirs", nfs_dir, + hash_lookup(machines, flag2), strtrim(dev)); + fd = fopen(file, "w"); + if (!fd) { + fprintf(stderr, "cannot open %s for output\n", file); + exit(MR_OCONFIG); + } + } + fprintf(fd, "%s %d %d %s\n", strtrim(dir), uid, gid, strtrim(fstype)); +## } + if (fclose(fd)) { + fprintf(stderr, "error closing %s", file); + exit(MR_CCONFIG); } ## end transaction return(1);