Updating Print Spooler Software and Startup Scripts

LPRng Reference Manual: 24 Sep 2004 (For LPRng-3.8.28)
Prev | Chapter 2. Installation | Next

# 2.10. Updating Print Spooler Software and Startup Scripts

If you are replacing your existing print spooling spooling system, you must shut down and remove the existing print spooler software before installing the LPRng software. This process is fairly system dependent, and requires a small amount of system expertise.

To assist in this process the LPRng installation has a set of preinstall, postinstall, preremove, and postremove scripts in the distribution that may be suitable for your local system use. If these fail to work during the system installation, you will need to carry out the steps described here by hand.

## 2.10.1. SunOS, Linux, and BSD Derived Systems

The SunOS, Linux, and BSD derived systems such as BSDi, FreeBSD, OpenBSD, and others use a version of the legacy or vintage lpd print server and the lpr, lprm, lpq, and lpc client programs. By convention, most of the printing related programs are in the `/usr/bin`, `/usr/sbin`, `/usr/libexec`, and `/usr/ucb` directories.

The lpd print spooler is started by either the `rc` startup script or by a startup script file in the `/etc/rc.d/init.d` or `/etc/init.d` directory. You can first locate the startup commands as follows.

1. Use the find(1) utility to search the `/etc` directory for the file that contains the startup command.

           h4: {23} # cd /etc
           h4: {24} # find . -type f -exec grep -l lpd {} \; -print
           ./rc.local

2. Examine each of the files found find the one that starts the lpd print spooler. You can simply comment out the command or change it to start the LPRng lpd print server.

           h4: {25} # more /etc/rc.local
           if [ -f /etc/printcap  -a -f /usr/libexec/lpd ] ; then
             /usr/libexec/lpd ;
           fi

           --- change this to
           if [ -f /etc/printcap  -a -f /usr/sbin/lpd ] ; then
             /usr/sbin/lpd ;
           fi

3. If you have an existing `printcap` file, then you should either copy this to the location used by LPRng or make a symbolic link to it.

Next we kill the currently running lpd process.

        h4: {26} # ps -auxw |grep lpd
        papowell 23932  0.0  0.3  224  184  p3  S+  10:40AM  0:00.01 grep lpd
        daemon  17763  0.0  0.2  448  120  ??  IWs  29Mar99  0:01.35 (lpd)
        h4: {27} % kill 135
        h4: {28} % kill 135
        135: No such process

Next, you should remove or rename the existing print system executables. The following example shows how to use the find utility to track down candidates.

        h4: {29} # find /usr -type f -name lp\*  -print >/tmp/candidates
        h4: {30} # find /sbin -type f -name lp\*  -print >>/tmp/candidates
        h4: {31} # cat /tmp/candidates
        /usr/bin/lpunlock
        /usr/bin/lpqall.faces
        /usr/bin/lpq             <---- old
        /usr/bin/lpr             <---- old
        /usr/bin/lprm            <---- old
        /usr/bin/lptest
        /usr/doc/samba-1.9.18p10/examples/printer-accounting/lp-acct
        /usr/man/man1/lpq.1
        /usr/man/man1/lpr.1
        /usr/man/man1/lprm.1
        /usr/man/man1/lptest.1
        /usr/man/man4/lp.4
        /usr/man/man8/lpc.8
        /usr/man/man8/lpd.8
        /usr/sbin/lpc            <--- old
        /usr/sbin/lpd            <--- old
        /usr/sbin/lpf            <--- old
        h4: {32} # mv /usr/bin/lpq  /usr/bin/lpq.old
        h4: {33} # mv /usr/bin/lpr  /usr/bin/lpr.old
        h4: {34} # mv /usr/bin/lprm /usr/bin/lprm.old
        h4: {35} # mv /usr/sbin/lpc /usr/sbin/lpc.old
        h4: {36} # mv /usr/sbin/lpd /usr/sbin/lpd.old
        h4: {37} # mv /usr/sbin/lpf /usr/sbin/lpf.old

After all this, you should now run `checkpc -f` (as root) to make sure that the LPRng configuration is present and correctly set up, and then start lpd by hand. You should try to use lpq to see if the spool queues are present and set up correctly and the system is functional.

        h4: {38} # checkpc -f
        h4: {39} # lpd
        h4: {40} # lpq
        Printer: lw4@h2  'Hp : LaserWriter'
         Queue: no printable jobs in queue
         Status: job 'root@h2+884' removed at 11:27:25.864
         Filter_status: done at 11:27:25.766
        h4: {41} # lpr /etc/motd
        h4: {42} # lpq
        Printer: lw4@h2  'Hp : LaserWriter'
         Queue: no printable jobs in queue
         Status: job 'root@h2+888' removed at 11:27:25.864
         Filter_status: done at 11:33:17.020

Finally, you should reboot your machine and make sure that the lpd print server starts correctly.

## 2.10.2. Solaris, HP-UX, and other SysVR4 Derived Systems

The original SysVR4 (System V, Release 4) software did not have any support for RFC1179 network printing (Berkeley lpd). Support for this was added in a wide variety of different ways. There are a wide range of different ways that this was done, but most are based on the following system or process structure.

The lpsched process (`/usr/lib/lp/lpsched/`) process performs many of the functions of the LPRng and BSD lpd server. This process is responsible for overseeing job printing and starting processes for handling the print queues on the local host. This process must be shut down and the running print spooling servers terminated before LPRng can be correctly installed. While there is no simple and reliable method of shutting down a running lpsched process and the associated network services, it is simple to prevent the process from being started.

The `preinstall.solaris` script is a file in the LPRng distribution that contains most of the commands needed to remove the Solaris System V printing software. These are explained in detail in the sections below. The procedures outlined below can be used on other SystemVR4 systems.

        #!/bin/sh
        # This is an effort to automate the setup
        #  needed to install the LPRng software on the
        #  Solaris OS.  This is effectively a one way path.
        #  You are warned.
        PATH=/etc:/usr/etc:/usr/bin:/bin:/sbin:/usr/sbin:$PATH
        # remove the init.d entry and links
        for i in /etc/rc*.d/*lp ; do
            b=`basename $i`;
            d=`dirname $i`;
            mv $i $d/UNUSED.$b.UNUSED
        done
        # rename files
        renameit () {
            for i in $* ; do
                if [ -f $i -a '!' -f $i.old ] ; then
                    echo "renaming $i $i.old";
                    mv $i $i.old
                fi
            done
        }
        renameit /usr/bin/lp /usr/bin/lpstat /usr/sbin/lpadmin \
          /usr/sbin/lpfilter /usr/sbin/lpforms /usr/sbin/lpmove \
          /usr/sbin/lpshut /usr/sbin/lpsystem /usr/sbin/lpusers \
          /usr/ucb/lpc /usr/ucb/lpq /usr/ucb/lpr /usr/ucb/lprm \
          /usr/ucb/lptest /usr/lib/lp/lpsched /usr/lib/lp/lpNet
        # remove the cron entry
        if [ -f /var/spool/cron/crontabs/lp ] ; then
            mv /var/spool/cron/crontabs/lp \
               /var/spool/cron/UNUSED.crontabs.lp
        fi
        # comment out inetd.conf entry
        if egrep '^printer' /etc/inetd.conf >/dev/null 2>& ; then
            mv /etc/inetd.conf /etc/inetd.conf.bak
            sed -e 's/^printer/# printer/' </etc/inetd.conf.bak \
               >/etc/inetd.conf
        fi
        # remove the nlsadmin entry
        nlsadmin -r lpd tcp
        nlsadmin -r lp tcp
        echo REBOOT SYSTEM and then install LPRng

First, you will need to remove the `/etc/rc` startup files in the `/etc/rc*.d` directories that start the lpsched process; see the init program man page for details. You can find these files by using:

        h4: {43} # cd /
        h4: {44} # find . -type f -exec grep -l lpsched {} \; -print >/tmp/files
        h4: {45} # cat /tmp/files
        /etc/rc0.d/K20lp
        /etc/rc2.d/K20lp
        /etc/rc2.d/S80lp
        /etc/init.d/lp
        h4: {46} # ls -l ` cat /tmp/files `
        lrwxrwxr-x 1 root bin 1 Dec 29 23:39 /etc/rc0.d/K20lp -> ../../init.d/lp
        lrwxrwxr-x 1 root bin 1 Dec 29 23:39 /etc/rc2.d/K20lp -> ../../init.d/lp
        lrwxrwxr-x 1 root bin 1 Dec 29 23:39 /etc/rc2.d/S80lp -> ../../init.d/lp
        -rwxr--r-- 5 root sys 460 Sep 1 1998 /etc/rcS.d/K39lp

You can remove these files, or simply comment out all of the executable commands in the `/etc/init.d/lp` file. Next, find all of the printing related commands and rename them. For example:

        h4: {47} # find /usr -type f -name lp\* -print >/etc/printingfiles
        h4: {48} # cat /tmp/printingfiles
        /usr/bin/lp
        /usr/bin/lpstat
        /usr/lib/lp/bin/lp.cat
        /usr/lib/lp/bin/lp.set
        /usr/lib/lp/bin/lp.tell
        /usr/lib/lp/lpNet
        /usr/lib/lp/lpsched
        /usr/lib/lp/lpdata
        /usr/sbin/lpadmin
        /usr/sbin/lpfilter
        /usr/sbin/lpforms
        /usr/sbin/lpmove
        /usr/sbin/lpshut
        /usr/sbin/lpsystem
        /usr/sbin/lpusers
        /usr/ucb/lpc
        /usr/ucb/lpq
        /usr/ucb/lpr
        /usr/ucb/lprm
        /usr/ucb/lptest
        h4: {49} # vi /tmp/printingfiles  # remove ones you want to save
        h4: {50} # for i in ` cat /tmp/printingfiles ` ; do
        >  if [ -f $i -a '!' -f $i.old ] ; then  mv $i $i.old ; fi;
        > done

On some systems there may be a `cron` file `/var/spool/cron/crontabs/lp` which is used to to periodically update and roll over error logs. You may want to remove this file or comment out its contents.

Check the `/etc/inetd.conf` file for a line like the one below and comment it out. This line is not present on all systems.

        printer stream tcp nowait root /usr/lib/print/in.lpd in.lpd

Use `nlsadmin` to force the TCP/IP listener to release the port, as illustrated below. This may not be present on all system.

        h4: {51} # nlsadmin -v tcp
        lpd  \x00020203000000000000000000000000  ENABLED  \
          NORPC  root  NOMODULES  /var/spool/lp/fifos/listenBSD  #
        0  \x00020ACE000000000000000000000000  ENABLED    \
          NORPC  root  NOMODULES  /usr/lib/saf/nlps_server  #
        lp  NOADDR  ENABLED  NORPC  root  NOMODULES \
          /var/spool/lp/fifos/listenS5  #
        h4: {52} # nlsadmin -r lpd tcp
        h4: {53} # nlsadmin -r lp tcp

Run `pmadm -l` as shown below.

        h2.private: {2} # pmadm -l
        PMTAG    PMTYPE   SVCTAG   FLGS ID    <PMSPECIFIC>
        zsmon    ttymon   ttya     u    root  /dev/term/a I - /usr/bin/login ...
        zsmon    ttymon   ttyb     u    root  /dev/term/b I - /usr/bin/login ...

If you see `zsmon` entries for SystemV `lpsched` support, then use `pmadm -r` to remove them. These may not be present on all system. See the `pmadm` man page for details on the -r literal.

You must now `reboot` the host.

        h4: {54} # shutdown -y "Whooga! Whooga! Dive! Dive! System going down."

When the system reboots, make sure that there is no process listening on port 515 (printer port) by using:

        h4: {55} # telnet localhost 515

If you can connect, then there is a problem beyond the scope of these instructions.

Compile and/or install the LPRng software. Make sure that the LPRng startup files have been installed correctly in `/etc/init.d/lprng` and that the symbolic links to the file have been made correctly. The LPRng startup file will usually have the following contents and you should use the same filename formats that the lp startup files had for the links to the `/etc/init.d/lprng` startup file:

        LPD_PATH=/usr/sbin/lpd
        SHOWALL=-e
        case "$1" in
          start)
                # Start daemons.
                /bin/echo "Starting lpd: \c"
                ${LPD_PATH}
                /bin/echo ""
                ;;
          stop)
                # Stop daemons.
                /bin/echo "Shutting down lpd: \c"
                kill -INT `ps ${SHOWALL} \
                   | awk '/lpd/{ print $1;}'` >/dev/null 2>&1
                /bin/echo " server stopped";
                ;;
          *)
                echo "Usage: $0 {start|stop}"
                exit 1
                ;;
        esac

Start the lpd server and then test it:

        h4: {56} # checkpc -f
        h4: {57} # /usr/sbin/lpd (or /usr/local/sbin/lpd)
        h4: {58} # lpq
        Printer: lp
         Queue: no printable jobs in queue

Prev | Home | Next
Installation Problems | Up | Emulation for UNIX SystemV lp and lpstat