/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * ident "%Z%%M% %I% %E% SMI" * * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * * DoPrinterAdd class * Worker class for adding local and remote printers. */ package com.sun.admin.pm.server; import java.io.*; import java.util.*; public class DoPrinterAdd { public static void main(String[] args) { // // Set attributes for testing // NameService ns = new NameService(); String file_contents[] = new String[1]; file_contents[0] = "any"; String user_allow_list[] = new String[1]; user_allow_list[0] = "allow1"; String user_deny_list[] = new String[1]; user_deny_list[0] = "deny1"; Printer p = new Printer(ns); p.setPrinterName("javatest"); p.setPrinterType("PS"); p.setPrintServer("zelkova"); p.setComment("This is a comment"); p.setDevice("/var/tmp/test"); p.setNotify("none"); p.setProtocol("bsd"); p.setDestination(null); p.setFileContents(file_contents); p.setUserAllowList(user_allow_list); p.setIsDefaultPrinter(false); p.setBanner("never"); p.setEnable(true); p.setAccept(true); p.setLocale(null); try { add(p, ns); } catch (Exception e) { System.out.println(e); System.exit(1); } System.out.println("Commands:\n" + p.getCmdLog()); System.out.println("Errors:\n" + p.getErrorLog()); System.out.println("Warnings:\n" + p.getWarnLog()); System.exit(0); } // // Interface to Printer object. // public static void add( Printer p, NameService ns) throws Exception { Debug.message("SVR: DoPrinterAdd.add()"); String device = p.getDevice(); if (device == null) { addRemote(p, ns); } else { addLocal(p, ns); } return; } // // Do the work of adding a local printer. // private static void addLocal( Printer p, NameService ns) throws Exception { Debug.message("SVR: DoPrinterAdd.addLocal()"); int exitvalue = 0; String err = null; String cmd = null; SysCommand syscmd = null; // Since it's local set extensions. // Eventually the gui should do this. p.setExtensions("Solaris"); String printername = p.getPrinterName(); String printertype = p.getPrinterType(); String printserver = p.getPrintServer(); String comment = p.getComment(); String device = p.getDevice(); String make = p.getMake(); String model = p.getModel(); String ppd = p.getPPD(); String notify = p.getNotify(); String protocol = p.getProtocol(); String destination = p.getDestination(); String[] file_contents = p.getFileContents(); String[] user_allow_list = p.getUserAllowList(); String[] user_deny_list = p.getUserDenyList(); boolean default_printer = p.getIsDefaultPrinter(); String banner = p.getBanner(); boolean enable = p.getEnable(); boolean accept = p.getAccept(); String nameservice = ns.getNameService(); String ppdfile = null; // // "uri" is a pseudo protocol and means that the device is // specified in the destination. // if ((protocol != null) && (protocol.equals("uri"))) { device = destination; destination = null; protocol = null; } if (ppd != null) { ppdfile = new String( DoPrinterUtil.getPPDFile(make, model, ppd)); } cmd = "/usr/sbin/lpadmin -p " + printername; if (printserver != null) cmd = cmd.concat(" -s " + printserver); if (device != null) { cmd = cmd.concat(" -v " + device); if (device.indexOf("://") != -1) cmd = cmd.concat(" -m uri"); else { if (destination != null) cmd = cmd.concat(" -m netstandard"); else cmd = cmd.concat(" -m standard"); if (ppd != null) cmd = cmd.concat("_foomatic"); } } if (printertype != null) cmd = cmd.concat(" -T " + printertype); if (notify != null) cmd = cmd.concat(" -A " + notify); if (ppdfile != null) { cmd = cmd.concat(" -n " + ppdfile); } if (destination != null) cmd = cmd.concat(" -o dest=" + destination); if (protocol != null) cmd = cmd.concat(" -o protocol=" + protocol); if (banner != null) cmd = cmd.concat(" -o banner=" + banner); if ((file_contents != null) && (file_contents.length != 0)) { String tmpstr = file_contents[0]; for (int i = 1; i < file_contents.length; i++) { tmpstr = tmpstr.concat("," + file_contents[i]); } cmd = cmd.concat(" -I " + tmpstr); } else { cmd = cmd.concat(" -I postscript"); } if ((user_allow_list != null) && (user_allow_list.length != 0)) { String tmpstr = user_allow_list[0]; for (int i = 1; i < user_allow_list.length; i++) { tmpstr = tmpstr.concat("," + user_allow_list[i]); } cmd = cmd.concat(" -u allow:" + tmpstr); } p.setCmdLog(cmd); syscmd = new SysCommand(); syscmd.exec(cmd); err = syscmd.getError(); if (syscmd.getExitValue() != 0) { syscmd = null; p.setErrorLog(err); throw new pmCmdFailedException(err); } else { p.setWarnLog(err); } syscmd = null; // // lpadmin won't take allow and deny lists together // so do the deny seperately. // if ((user_deny_list != null) && (user_deny_list.length != 0)) { String tmpstr = user_deny_list[0]; for (int i = 1; i < user_deny_list.length; i++) { tmpstr = tmpstr.concat("," + user_deny_list[i]); } cmd = "/usr/sbin/lpadmin -p " + printername + " -u deny:" + tmpstr; p.setCmdLog(cmd); syscmd = new SysCommand(); syscmd.exec(cmd); err = syscmd.getError(); if (err != null) { p.setWarnLog(err); } syscmd = null; } if ((comment != null) && (!comment.equals(""))) { // // Have to use a command array here since // exec(String) doesn't parse quoted strings. // String cmd_array[] = { "/usr/sbin/lpadmin", "-p", printername, "-D", comment }; cmd = "/usr/sbin/lpadmin -p " + printername + " -D " + "\"" + comment + "\""; p.setCmdLog(cmd); syscmd = new SysCommand(); syscmd.exec(cmd_array); err = syscmd.getError(); if (err != null) { p.setWarnLog(err); } syscmd = null; } // If this is the default printer set it. // If it fails warn user. if (default_printer) { cmd = "/usr/sbin/lpadmin -d " + printername; p.setCmdLog(cmd); syscmd = new SysCommand(); syscmd.exec(cmd); err = syscmd.getError(); if (err != null) { p.setWarnLog(err); } syscmd = null; } // Check to see if we should enable it. // If it fails warn user. if (enable) { cmd = "/usr/bin/enable " + printername; p.setCmdLog(cmd); syscmd = new SysCommand(); syscmd.exec(cmd); err = syscmd.getError(); if (err != null) { p.setWarnLog(err); } syscmd = null; } // Check to see if we should accept it. // If it fails warn user. if (accept) { cmd = "/usr/sbin/accept " + printername; p.setCmdLog(cmd); syscmd = new SysCommand(); syscmd.exec(cmd); err = syscmd.getError(); if (err != null) { p.setWarnLog(err); } syscmd = null; } doFilters(p); // // Take care of name service now. // if (!nameservice.equals("system")) { try { DoPrinterNS.set("add", p, ns); } catch (Exception e) { p.clearLogs(); NameService localns = new NameService(); // // Back out the local printer. // try { DoPrinterDelete.delete(p, localns); } catch (Exception e2) { Debug.message("SVR:" + e2.getMessage()); } p.clearLogs(); throw (e); } } return; } // // Do the work of adding a remote printer. // private static void addRemote( Printer p, NameService ns) throws Exception { Debug.message("SVR: DoPrinterAdd.addRemote()"); int exitvalue = 0; String err = null; String cmd = ""; String cmd_array[] = new String[7]; SysCommand syscmd = null; String printername = p.getPrinterName(); String printserver = p.getPrintServer(); String comment = p.getComment(); boolean default_printer = p.getIsDefaultPrinter(); String nameservice = ns.getNameService(); boolean isnismaster = false; if (nameservice.equals("nis")) { // // Find out if we are the nis master // String nshost = ns.getNameServiceHost(); Host h = new Host(); String lh = h.getLocalHostName(); if (lh.equals(nshost)) isnismaster = true; h = null; } // // If the name service is not system and we are // not the nis master then do the name service // update and return. // if ((!nameservice.equals("system")) && (!isnismaster)) { DoPrinterNS.set("add", p, ns); return; } cmd_array[0] = "/usr/sbin/lpadmin"; cmd_array[1] = "-p"; cmd_array[2] = printername; cmd_array[3] = "-s"; cmd_array[4] = printserver; if ((comment != null) && (!comment.equals(""))) { cmd_array[5] = "-D"; cmd_array[6] = comment; } // // Fix up cmd so we can log it. // for (int i = 0; i < cmd_array.length; i++) { if (cmd_array[i] == null) continue; if (i == 6) { cmd = cmd.concat("\"" + comment + "\""); continue; } cmd = cmd.concat(cmd_array[i] + " "); } p.setCmdLog(cmd); syscmd = new SysCommand(); syscmd.exec(cmd_array); err = syscmd.getError(); if (syscmd.getExitValue() != 0) { p.setErrorLog(err); syscmd = null; throw new pmCmdFailedException(err); } if (err != null) { p.setWarnLog(err); } syscmd = null; // If this is the default printer set it. // If it fails warn user. if (default_printer) { cmd = "/usr/sbin/lpadmin -d " + printername; p.setCmdLog(cmd); syscmd = new SysCommand(); syscmd.exec(cmd); err = syscmd.getError(); if (err != null) { p.setWarnLog(err); } syscmd = null; } // // If it's nis and we are here then we are the nis // master. This call will do the make for us. // if (nameservice.equals("nis")) { try { DoPrinterNS.set("add", p, ns); } catch (Exception e) { p.clearLogs(); try { // // Back out the local printer. // DoPrinterDelete.delete(p, ns); } catch (Exception e2) { Debug.message("SVR:" + e2.getMessage()); } p.clearLogs(); throw e; } } return; } // // Configure filters // Look in /etc/lp/fd and configure each filter if it hasn't // already been configured. We'll add warning messages if // there are problems but don't consider anything here fatal. // private static void doFilters(Printer p) throws Exception { Debug.message("SVR: DoPrinterAdd.doFilters()"); int i = 0; int j = 0; String o = null; String err = null; String cmd = null; String psfilters[] = null; SysCommand syscmd = null; // // Get list of potential filters // cmd = "/usr/bin/ls /etc/lp/fd"; syscmd = new SysCommand(); syscmd.exec(cmd); if (syscmd.getExitValue() != 0) { syscmd = null; return; } o = syscmd.getOutput(); syscmd = null; if (o == null) { return; } StringTokenizer st = new StringTokenizer(o); if (st.countTokens() == 0) { return; } psfilters = new String[st.countTokens()]; for (i = 0; st.hasMoreTokens(); i++) { psfilters[i] = st.nextToken(); } // // Remove .fd suffix and empty slots that aren't filters. // for (i = 0; i < psfilters.length; i++) { if (psfilters[i].endsWith(".fd")) { j = psfilters[i].indexOf(".fd"); psfilters[i] = psfilters[i].substring(0, j); } else { psfilters[i] = ""; } } // Get list of currently configured filters cmd = "/usr/sbin/lpfilter -l -f all"; syscmd = new SysCommand(); syscmd.exec(cmd); o = null; if (syscmd.getExitValue() != 0) { err = syscmd.getError(); if (err != null) { p.setWarnLog(err); } syscmd = null; return; } else { o = syscmd.getOutput(); } for (i = 0; i < psfilters.length; i++) { if (psfilters[i].equals("")) continue; // If we have filters see if this one is // already configured. if (o != null) { if (o.indexOf("\"" + psfilters[i] + "\"") > -1) continue; } // Add the filter cmd = "/usr/sbin/lpfilter -f " + psfilters[i] + " -F /etc/lp/fd/" + psfilters[i] + ".fd"; p.setCmdLog(cmd); syscmd = new SysCommand(); syscmd.exec(cmd); if (syscmd.getExitValue() != 0) { err = syscmd.getError(); if (err != null) { p.setWarnLog(err); } } syscmd = null; } } }