From: mar Date: Mon, 22 Nov 1993 14:32:25 +0000 (+0000) Subject: Initial revision X-Git-Tag: release77~56 X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/commitdiff_plain/2289e07e4f9f96faa42fd91a35c8277f4c807998 Initial revision --- diff --git a/gen/hosts.dc b/gen/hosts.dc new file mode 100644 index 00000000..0e396a5f --- /dev/null +++ b/gen/hosts.dc @@ -0,0 +1,149 @@ +/* $Header$ + * + * This generates the hstath.txt hosttable. + * + * (c) Copyright 1993 by the Massachusetts Institute of Technology. + * For copying and distribution information, please see the file + * . + */ + +#include +#include +#include +#include +#include +#include +EXEC SQL INCLUDE sqlca; + +extern int errno; +char *whoami = "hosts.gen"; + + +main(argc, argv) +int argc; +char **argv; +{ + FILE *out = stdout; + char *outf = NULL, outft[64], *p, buf[256]; + struct stat sb; + struct timeval now; + int flag1, flag2, i; + struct hash *aliases; + EXEC SQL BEGIN DECLARE SECTION; + int id; + char name[65], vendor[33], model[33], os[33], addr[17]; + EXEC SQL END DECLARE SECTION; + +#ifsql INGRES + EXEC SQL CONNECT moira; + EXEC SQL SET LOCKMODE SESSION WHERE LEVEL=TABLE, READLOCK=SHARED; +#endsql +#ifsql INFORMIX + EXEC SQL DATABASE moira; +#endsql + + if (argc == 2) { + if (stat(argv[1], &sb) == 0) { + if (ModDiff(&flag1, "machine", sb.st_mtime) || + ModDiff(&flag2, "subnet", sb.st_mtime)) + exit(MR_DATE); + if (flag1 < 0 && flag2 < 0) { + fprintf(stderr, "File %s does not need to be rebuilt.\n", + argv[1]); + exit(MR_NO_CHANGE); + } + } + outf = argv[1]; + sprintf(outft, "%s~", outf); + if ((out = fopen(outft, "w")) == NULL) { + fprintf(stderr, "unable to open %s for output\n", outf); + exit(MR_OCONFIG); + } + } else if (argc != 1) { + fprintf(stderr, "usage: %s [outfile]\n", argv[0]); + exit(MR_ARGS); + } else { + outf = NULL; + } + + EXEC SQL WHENEVER SQLERROR GOTO sqlerr; + + gettimeofday(&now, NULL); + fprintf(out, "; Host table generated %s;\n", ctime(&now.tv_sec)); + + EXEC SQL DECLARE y CURSOR FOR SELECT + mach_id, name FROM hostalias; + EXEC SQL OPEN y; + aliases = create_hash(1001); + while (1) { + EXEC SQL FETCH y INTO :id, :name; + if (sqlca.sqlcode != 0) break; + if (*strtrim(name) == 0) continue; + if ((i = strlen(name)) < 9 || strcmp(&name[i-8], ".MIT.EDU")) { + fprintf(stderr, "Name %s not in MIT domain\n", name); + continue; + } else { + name[i-8] = 0; + } + if (p = hash_lookup(aliases, id)) { + sprintf(buf, "%s,%s", p, name); + free(p); + hash_update(aliases, id, strsave(buf)); + } else + hash_store(aliases, id, strsave(name)); + } + + EXEC SQL DECLARE x CURSOR FOR SELECT + name, mach_id, vendor, model, os, address + FROM machine WHERE status=1 ORDER BY address; + EXEC SQL OPEN x; + while (1) { + EXEC SQL FETCH x INTO :name, :id, :vendor, :model, :os, :addr; + if (sqlca.sqlcode != 0) break; + if (*strtrim(name) == 0) continue; + if ((i = strlen(name)) < 9 || strcmp(&name[i-8], ".MIT.EDU")) { + fprintf(stderr, "Name %s not in MIT domain\n", name); + continue; + } else { + name[i-8] = 0; + } + strtrim(vendor); + strtrim(model); + strtrim(os); + strtrim(addr); + if (*addr == 0) + continue; + if (p = hash_lookup(aliases, id)) + sprintf(buf, "%s,%s", name, p); + else + strcpy(buf, name); + fprintf(out, "HOST : %s : %s : ", addr, buf); + if (*vendor && *model) + fprintf(out, "%s/%s : %s :\n", vendor, model, os); + else + fprintf(out, "%s%s : %s :\n", vendor, model, os); + } + + EXEC SQL CLOSE x; +#ifsql INGRES + EXEC SQL DISCONNECT; +#endsql +#ifsql INFORMIX + EXEC SQL CLOSE DATABASE; +#endsql + + fprintf(out, "; End of automatically generated host table\n"); + if (fclose(out)) { + perror("close failed"); + exit(MR_CCONFIG); + } + if (outf) + fix_file(outf); + exit(MR_SUCCESS); + + sqlerr: + com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode); + critical_alert("DCM", "Hosts build encountered INGRES ERROR %d", + sqlca.sqlcode); + exit(MR_INGRES_ERR); +}