X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/20e540e7b29535f0ea903c19acd9c70e30b9a253..0041862dcee4646f8bc7fea981e1fb7007cc066f:/gen/print.pc diff --git a/gen/print.pc b/gen/print.pc index 103a0783..6399b6fc 100644 --- a/gen/print.pc +++ b/gen/print.pc @@ -28,7 +28,6 @@ char *whoami = "print.gen"; char *db = "moira/moira"; void do_host(char *host); -void dump_acl(FILE *out, int id, int realms); void sqlerr(void); #ifndef MAX #define MAX(a, b) ( (a) > (b) ? (a) : (b) ) @@ -40,6 +39,8 @@ int main(int argc, char **argv) char name[MACHINE_NAME_SIZE]; EXEC SQL END DECLARE SECTION; + init_acls(); + EXEC SQL CONNECT :db; EXEC SQL WHENEVER SQLERROR DO sqlerr(); @@ -67,37 +68,39 @@ void do_host(char *host) EXEC SQL BEGIN DECLARE SECTION; char rp[PRINTERS_RP_SIZE], name[PRINTERS_NAME_SIZE]; char duplexname[PRINTERS_DUPLEXNAME_SIZE], location[PRINTERS_LOCATION_SIZE]; - char hwtype[PRINTERS_HWTYPE_SIZE], hostname[MACHINE_NAME_SIZE]; - char rm[MACHINE_NAME_SIZE], rq[MACHINE_NAME_SIZE]; + char hwtype[PRINTERS_HWTYPE_SIZE], lowerhwtype[PRINTERS_HWTYPE_SIZE]; char modtime[PRINTERS_MODTIME_SIZE], lmodtime[LIST_MODTIME_SIZE]; - char contact[PRINTERS_CONTACT_SIZE]; - char *spoolhost = host, *unixtime_fmt = UNIXTIME_FMT; - int ka, pc, ac, lpc_acl, banner; + char contact[PRINTERS_CONTACT_SIZE], hostname[MACHINE_NAME_SIZE]; + char *spoolhost = host, *unixtime_fmt = UNIXTIME_FMT, *p; + int ka, pc, ac, lpc_acl, banner, rm; EXEC SQL END DECLARE SECTION; TARFILE *tf; FILE *out; - char filename[MAXPATHLEN]; + char filename[MAXPATHLEN], *duptc; time_t mtime, now = time(NULL); + EXEC SQL SELECT mach_id INTO :rm FROM machine + WHERE name = :spoolhost; + sprintf(filename, "%s/print/%s", DCM_DIR, host); tf = tarfile_open(filename); + /* printcap */ out = tarfile_start(tf, "/etc/printcap.moira", 0644, 0, 0, "root", "root", now); EXEC SQL DECLARE csr_printcap CURSOR FOR SELECT pr.rp, pr.name, pr.duplexname, pr.hwtype, - m.name, mrm.name, mrq.name, pr.ka, pr.pc, pr.ac, - pr.location, pr.contact - FROM printers pr, machine m, machine mrm, machine mrq - WHERE m.mach_id = pr.mach_id AND mrq.mach_id = pr.rq - AND mrm.mach_id = pr.rm AND mrm.name = :spoolhost - AND pr.type != 'ALIAS'; + m.name, pr.banner, pr.location, pr.contact + FROM printers pr, machine m + WHERE pr.rm = :rm AND m.mach_id = pr.mach_id + AND pr.type != 'ALIAS' + AND ( pr.hwtype LIKE 'HP%' OR pr.hwtype LIKE 'LPR%' ); EXEC SQL OPEN csr_printcap; while (1) { EXEC SQL FETCH csr_printcap INTO :rp, :name, :duplexname, - :hwtype, :hostname, :rm, :rq, :ka, :pc, :ac, :location, :contact; + :hwtype, :hostname, :banner, :location, :contact; if (sqlca.sqlcode) break; @@ -106,10 +109,11 @@ void do_host(char *host) strtrim(duplexname); strtrim(hwtype); strtrim(hostname); - strtrim(rm); - strtrim(rq); strtrim(location); strtrim(contact); + strcpy(lowerhwtype, hwtype); + for (p = lowerhwtype; *p; p++) + *p = tolower(*p); if (location[0]) fprintf(out, "# %s: %s\n", name, location); @@ -118,89 +122,156 @@ void do_host(char *host) if (strcmp(location, contact)) fprintf(out, "# contact: %s\n", contact); - fprintf(out, "%s|%s %s", rp, location, hwtype); - if (*duplexname) - fprintf(out, "|%s", duplexname); - fprintf(out, ":\\\n\t:lp=/dev/null:rp=%s:rm=%s:\\\n" - "\t:sd=/var/spool/printer/%s:\\\n" - "\t:lf=/var/spool/printer/%s/%s-log:\\\n" - "\t:af=/var/spool/printer/%s/%s-acct:\\\n" - "\t:ka#%d:pc#%d:\\\n", - !strcmp(hwtype, "LPR") ? "raw" : rp, - !strcmp(hwtype, "HP") ? rm : hostname, - rp, rp, rp, rp, rp, ka, pc); - if (strcmp(rq, "[NONE]")) - fprintf(out, "\t:rq=%s:\\\n", rq); - if (ac) - fprintf(out, "\t:ac=/var/spool/printer/%s/restrict.list:pa:\\\n", rp); + fprintf(out, "%s\n\t:server:cm=%s %s\n\t", rp, hwtype, location); + if (banner == PRN_BANNER_NONE) + fprintf(out, ":sh"); + else if (banner == PRN_BANNER_LAST) + fprintf(out, ":hl"); - if (!strcmp(hwtype, "HP")) + if (!strncmp(hwtype, "HP", 2)) { - fprintf(out, "\t:if=/usr/athena/lib/lpdfilters/hpif:\\\n" - "\t:of=/usr/athena/lib/lpdfilters/hpof:\\\n" - "\t:gf=/usr/athena/lib/lpdfilters/hpgf:\\\n" - "\t:nf=/usr/athena/lib/lpdfilters/hpnf:\\\n" - "\t:tf=/usr/athena/lib/lpdfilters/hptf:\\\n" - "\t:rf=/usr/athena/lib/lpdfilters/hprf:\\\n" - "\t:vf=/usr/athena/lib/lpdfilters/hpvf:\\\n" - "\t:cf=/usr/athena/lib/lpdfilters/hpcf:\\\n" - "\t:df=/usr/athena/lib/lpdfilters/hpdf:\\\n" - "\t:sf:sb:mx#0:\n\n"); + fprintf(out, ":lp=%s%%9100:ifhp=model=%s:tc=.hp\n\n", + hostname, lowerhwtype); + duptc = ".hp2"; + } + else if (!strncmp(hwtype, "LPR", 3)) + { + fprintf(out, ":lp=raw@%s:tc=.apple\n\n", hostname); + duptc = ".apple2"; + } + + if (*duplexname) + { + fprintf(out, "%s\n\t:server:bq=%s:cm=%s duplex queue\n\t", + duplexname, rp, rp); + if (!strncmp(hwtype, "HP", 2)) + fprintf(out, ":ifhp=model=%s", lowerhwtype); + fprintf(out, ":tc=%s\n\n", duptc); } - else - fprintf(out, "\t:mx#0:\n\n"); } EXEC SQL CLOSE csr_printcap; tarfile_end(tf); - EXEC SQL DECLARE csr_spool CURSOR FOR - SELECT UNIQUE pr.rp, pr.duplexname, pr.hwtype, m.name, pr.ac, - pr.lpc_acl, pr.banner, TO_CHAR(pr.modtime, :unixtime_fmt) - FROM printers pr, machine m, machine mrm - WHERE m.mach_id = pr.mach_id - AND mrm.mach_id = pr.rm AND mrm.name = :spoolhost; - EXEC SQL OPEN csr_spool; + /* lpd.perms */ + out = tarfile_start(tf, "/etc/lpd.perms", 0755, 1, 1, + "daemon", "daemon", now); + fprintf(out, "# Allow anybody to connect, get status, list queue, or " + "print (once a\n# job is spooled)\n"); + fprintf(out, "ACCEPT SERVICE=X,S,Q,P\nACCEPT LPC=status,lpq,printcap\n\n"); + + fprintf(out, "# Only trust certain host keys to forward jobs/commands\n"); + fprintf(out, "REJECT SERVICE=R AUTHFROM=?* " + "PRINTER=