char *whoami = "cups-print.gen";
char *db = "moira/moira";
+const int krbvers = 5; /* use Kerberos 5 */
+
/* OMG, I hate this, but it's cleaner, I guess? */
const char *alterjob = "<Limit Hold-Job Release-Job\
CUPS-Accept-Jobs CUPS-Reject-Jobs>";
const char *canceljob = "<Limit Cancel-Job CUPS-Authenticate-Job>";
const char *catchall = "<Limit All>";
+const char *phost = "printers.MIT.EDU";
void do_host(char *host);
void sqlerr(void);
EXEC SQL DECLARE csr_hosts CURSOR FOR
SELECT m.name FROM machine m, serverhosts sh
- WHERE m.mach_id = sh.mach_id AND sh.service = 'CUPS-PRINT' AND sh.enable = 1;
+ WHERE m.mach_id = sh.mach_id AND (sh.service = 'CUPS-PRINT' OR sh.service = 'CUPS-CLUSTER')
+ AND sh.enable = 1;
EXEC SQL OPEN csr_hosts;
while (1)
{
{
struct save_queue *sq;
struct imember *m;
+ char kbuf[MAX_K_NAME_SZ];
+ char *cp;
sq = get_acl(type, id, NULL);
while (sq_remove_data(sq, &m))
{
- if (m->type == 'U')
- fprintf(out, "%s %s\n", str, m->name);
+ if (m->type != 'S' && m->type != NULL) {
+ /* CUPS wants mmanley/root, not mmanley.root@ATHENA.MIT.EDU */
+ canon_krb(m, krbvers, kbuf, sizeof(kbuf));
+
+ /* now, take out all the @realm */
+ for (cp=kbuf; *cp; cp++) {
+ if (*cp == '@') *cp = '\0';
+ }
+ fprintf(out, "%s %s\n", str, kbuf);
+ }
freeimember(m);
}
sq_destroy(sq);
sprintf(filename, "%s/cups-print/%s", DCM_DIR, host);
tf = tarfile_open(filename);
- /* printers.conf */
+ /* printers.conf entries for locally run queues */
out = tarfile_start(tf, "/etc/cups/printers.conf", 0644, 0, 0,
- "root", "lp", now);
+ "lp", "lp", now);
EXEC SQL DECLARE csr_printers CURSOR FOR
SELECT pr.rp, pr.name, pr.duplexname, pr.hwtype,
m.name, pr.banner, pr.location, pr.contact, pr.ka,
- pr.ac
+ pr.ac, pr.lpc_acl
FROM printers pr, machine m
WHERE pr.rm = :rm AND m.mach_id = pr.mach_id
AND pr.type != 'ALIAS';
while (1)
{
EXEC SQL FETCH csr_printers INTO :rp, :name, :duplexname,
- :hwtype, :hostname, :banner, :location, :contact, :ka, :ac;
+ :hwtype, :hostname, :banner, :location, :contact, :ka, :ac, :lpc_acl;
if (sqlca.sqlcode)
break;
strtrim(location);
strtrim(contact);
strcpy(lowerhwtype, hwtype);
+ for (p = rp; *p; p++) /* Because uppercased printer names suck */
+ *p = tolower(*p);
for (p = lowerhwtype; *p; p++)
*p = tolower(*p);
fprintf(out, "PageLimit 0\n");
fprintf(out, "Klimit 0\n");
fprintf(out, "Option sides one-sided\n");
+ fprintf(out, "Filter application/vnd.cups-raw 0 -\n");
+ fprintf(out, "Filter application/vnd.cups-postscript 100 foomatic-rip\n");
+ fprintf(out, "Filter application/vnd.cups-pdf 0 foomatic-rip\n");
+ fprintf(out, "Filter application/vnd.apple-pdf 25 foomatic-rip\n");
+ fprintf(out, "Filter application/vnd.cups-command 0 commandtops\n");
if (location[0])
fprintf(out, "Location %s\n", location);
fprintf(out, "ErrorPolicy abort-job\n");
- if (! ka || ! lpc_acl)
- fprintf(out, "OpPolicy default\n");
- else
+ if (ka || lpc_acl)
fprintf(out, "OpPolicy %s-policy\n", rp);
+ else
+ fprintf(out, "OpPolicy default\n");
/* Access-control list. */
if (ac)
if (ka)
fprintf(out, "AuthType Negotiate\n");
else
- fprintf(out, "AuthType Negotiate\n");
+ fprintf(out, "AuthType Default\n");
printer_user_list(out, "LIST", ac, "AllowUser");
}
}
EXEC SQL CLOSE csr_printers;
+
+ /* printers.conf entries for non-local CUPS queues */
+ EXEC SQL DECLARE csr_remote_printers CURSOR FOR
+ SELECT pr.rp, pr.name, pr.duplexname, pr.hwtype,
+ m.name, pr.banner, pr.location, pr.contact, pr.ka,
+ pr.ac, pr.lpc_acl, m.name as cupshosts
+ FROM printers pr, machine m, serverhosts sh
+ WHERE pr.rm = m.mach_id
+ AND pr.type != 'ALIAS' AND m.name <> :spoolhost AND
+ m.mach_id = sh.mach_id AND (sh.service = 'CUPS-PRINT' OR sh.service = 'CUPS-CLUSTER')
+ AND sh.enable = 1 AND m.mach_id = sh.mach_id;
+
+ EXEC SQL OPEN csr_remote_printers;
+ while (1)
+ {
+ EXEC SQL FETCH csr_remote_printers INTO :rp, :name, :duplexname,
+ :hwtype, :hostname, :banner, :location, :contact, :ka, :ac, :lpc_acl, :cupshosts;
+ if (sqlca.sqlcode)
+ break;
+
+ strtrim(rp);
+ strtrim(name);
+ strtrim(duplexname);
+ strtrim(hwtype);
+ strtrim(hostname);
+ strtrim(location);
+ strtrim(contact);
+ strtrim(cupshosts);
+ strcpy(lowerhwtype, hwtype);
+ for (p = rp; *p; p++) /* Because uppercased printer names suck */
+ *p = tolower(*p);
+ for (p = lowerhwtype; *p; p++)
+ *p = tolower(*p);
+
+ fprintf(out, "<Printer %s>\n",rp);
+ fprintf(out, "Info %s:%s\n", rp, hwtype);
+ fprintf(out, "DeviceURI ipp://%s:631/printers/%s\n", cupshosts, rp);
+ fprintf(out, "State Idle\n"); // Always with the Idle
+ fprintf(out, "StateTime %ld\n", (long)time(NULL));
+ fprintf(out, "Accepting Yes\n");
+ fprintf(out, "Shared Yes\n");
+ fprintf(out, "QuotaPeriod 0\n");
+ fprintf(out, "PageLimit 0\n");
+ fprintf(out, "Klimit 0\n");
+ fprintf(out, "Option sides one-sided\n");
+ fprintf(out, "Filter application/vnd.cups-raw 0 -\n");
+ fprintf(out, "Filter application/vnd.cups-postscript 100 foomatic-rip\n");
+ fprintf(out, "Filter application/vnd.cups-pdf 0 foomatic-rip\n");
+ fprintf(out, "Filter application/vnd.apple-pdf 25 foomatic-rip\n");
+ fprintf(out, "Filter application/vnd.cups-command 0 commandtops\n");
+ if (location[0])
+ fprintf(out, "Location %s\n", location);
+ fprintf(out, "ErrorPolicy abort-job\n");
+ if (ka || lpc_acl)
+ fprintf(out, "OpPolicy %s-policy\n", rp);
+ else
+ fprintf(out, "OpPolicy default\n");
+
+ /* Access-control list. */
+ if (ac)
+ {
+ if (ka)
+ fprintf(out, "AuthType Negotiate\n");
+ else
+ fprintf(out, "AuthType Default\n");
+ printer_user_list(out, "LIST", ac, "AllowUser");
+ }
+
+ if (banner == PRN_BANNER_NONE)
+ fprintf(out, "JobSheets none none\n");
+ else
+ fprintf(out, "JobSheets athena none\n");
+ fprintf(out, "</Printer>\n");
+
+ }
+ EXEC SQL CLOSE csr_remote_printers;
+
+ /* printers.conf entries for non-local LPRng queues */
+ EXEC SQL DECLARE csr_lprng_printers CURSOR FOR
+ SELECT pr.rp, pr.name, pr.duplexname, pr.hwtype,
+ m.name, pr.banner, pr.location, pr.contact, pr.ka,
+ pr.ac, pr.lpc_acl, m.name as cupshosts
+ FROM printers pr, machine m, serverhosts sh
+ WHERE pr.rm = m.mach_id
+ AND pr.type != 'ALIAS' AND m.name <> :spoolhost AND
+ m.mach_id = sh.mach_id AND sh.service = 'PRINT' AND
+ sh.enable = 1;
+
+ EXEC SQL OPEN csr_lprng_printers;
+ while (1)
+ {
+ EXEC SQL FETCH csr_lprng_printers INTO :rp, :name, :duplexname,
+ :hwtype, :hostname, :banner, :location, :contact, :ka, :ac, :lpc_acl, :cupshosts;
+ if (sqlca.sqlcode)
+ break;
+
+ strtrim(rp);
+ strtrim(name);
+ strtrim(duplexname);
+ strtrim(hwtype);
+ strtrim(hostname);
+ strtrim(location);
+ strtrim(contact);
+ strtrim(cupshosts);
+ strcpy(lowerhwtype, hwtype);
+ for (p = rp; *p; p++) /* Because uppercased printer names suck */
+ *p = tolower(*p);
+ for (p = lowerhwtype; *p; p++)
+ *p = tolower(*p);
+
+ fprintf(out, "<Printer %s>\n",rp);
+ fprintf(out, "Info %s:LPRng Queue on %s\n", rp, cupshosts);
+ fprintf(out, "DeviceURI lpd://%s/%s\n", cupshosts, rp);
+ fprintf(out, "State Idle\n"); // Always with the Idle
+ fprintf(out, "StateTime %ld\n", (long)time(NULL));
+ fprintf(out, "Accepting Yes\n");
+ fprintf(out, "Shared Yes\n");
+ fprintf(out, "QuotaPeriod 0\n");
+ fprintf(out, "PageLimit 0\n");
+ fprintf(out, "Klimit 0\n");
+ fprintf(out, "Option sides one-sided\n");
+ fprintf(out, "Filter application/vnd.cups-raw 0 -\n");
+ fprintf(out, "Filter application/vnd.cups-postscript 100 foomatic-rip\n");
+ fprintf(out, "Filter application/vnd.cups-pdf 0 foomatic-rip\n");
+ fprintf(out, "Filter application/vnd.apple-pdf 25 foomatic-rip\n");
+ fprintf(out, "Filter application/vnd.cups-command 0 commandtops\n");
+ if (location[0])
+ fprintf(out, "Location %s\n", location);
+ fprintf(out, "ErrorPolicy abort-job\n");
+ fprintf(out, "OpPolicy default\n");
+ fprintf(out, "JobSheets none none\n");
+ fprintf(out, "</Printer>\n");
+
+ }
+ EXEC SQL CLOSE csr_lprng_printers;
tarfile_end(tf);
/* aliases are in classes.conf */
out = tarfile_start(tf, "/etc/cups/classes.conf", 0644, 0, 0,
- "root", "root", now);
+ "lp", "lp", now);
EXEC SQL DECLARE csr_duplexqs CURSOR FOR
SELECT pr.rp, pr.name, pr.duplexname, pr.hwtype,
m.name, pr.banner, pr.location, pr.contact, pr.ka,
pr.type as prtype, pr.ac
- FROM printers pr, machine m
- WHERE pr.rm = :rm AND m.mach_id = pr.mach_id;
+ FROM printers pr, machine m, serverhosts sh
+ WHERE pr.rm = m.mach_id
+ AND m.mach_id = sh.mach_id AND sh.enable = 1
+ AND (sh.service = 'CUPS-PRINT' OR sh.service = 'PRINT' OR sh.service = 'CUPS-CLUSTER');
EXEC SQL OPEN csr_duplexqs;
while (1)
{
fprintf(out, "PageLimit 0\n");
if (location[0])
fprintf(out, "Location %s\n", location);
- fprintf(out, "ErrorPolicy abort-job\n");
- if (! ka || ! lpc_acl)
- fprintf(out, "OpPolicy default\n");
- else
+ /* fprintf(out, "ErrorPolicy abort-job\n"); */
+ if (ka || lpc_acl)
fprintf(out, "OpPolicy %s-policy\n", rp);
+ else
+ fprintf(out, "OpPolicy default\n");
/* Access-control list. */
if (ac)
if (ka)
fprintf(out, "AuthType Negotiate\n");
else
- fprintf(out, "AuthType Negotiate\n");
+ fprintf(out, "AuthType Default\n");
printer_user_list(out, "LIST", ac, "AllowUser");
}
if (location[0])
fprintf(out, "Location %s\n", location);
fprintf(out, "ErrorPolicy abort-job\n");
- if (! ka || ! lpc_acl)
- fprintf(out, "OpPolicy default\n");
- else
+ if (ka || lpc_acl)
fprintf(out, "OpPolicy %s-policy\n", rp);
+ else
+ fprintf(out, "OpPolicy default\n");
/* Access-control list. */
if (ac)
if (ka)
fprintf(out, "AuthType Negotiate\n");
else
- fprintf(out, "AuthType Negotiate\n");
+ fprintf(out, "AuthType Default\n");
printer_user_list(out, "LIST", ac, "AllowUser");
}
fprintf(out, "ServerCertificate /etc/cups/ssl/%s-ipp-crt.pem\n", lhost);
fprintf(out, "ServerKey /etc/cups/ssl/%s-ipp-key.pem\n", lhost);
fprintf(out, "ServerName %s\n", lhost);
+ fprintf(out, "ServerAlias %s\n", phost);
fprintf(out, "Krb5Keytab /etc/krb5-ipp.keytab\n");
- /* fprintf(out, "Browsing On\n"); */
- /* fprintf(out, "BrowseProtocols cups\n"); */
/* The other CUPS servers should be aware of the other hosts'
queues, so we'll let them browse each other. */
fprintf(out, "Include cups.local.conf\n");
- fprintf(out, "Include cups.hosts.conf\n");
fprintf(out, "Include cups.locations.conf\n");
fprintf(out, "Include cups.policies.conf\n");
tarfile_end(tf);
EXEC SQL DECLARE csr_lpc CURSOR FOR
SELECT UNIQUE rp, ka, ac, lpc_acl
FROM printers
- WHERE rm = :rm AND ( ac != 0 OR lpc_acl != 0);
+ WHERE (ac != 0 OR lpc_acl != 0) AND rm in (SELECT m.mach_id FROM machine m, serverhosts sh
+ WHERE m.mach_id = sh.mach_id AND (sh.service = 'CUPS-PRINT' OR sh.service = 'CUPS-CLUSTER')
+ AND sh.enable = 1);
EXEC SQL OPEN csr_lpc;
while (1)
{