15.8. Printing to a NetWare Print Queue

The ncpfs package contains a small utility called nprint that sends print jobs across an NCP connection to a NetWare print queue. This command creates the connection if it doesn't currently exist and uses the ~/.nwclient file that we described earlier to hide the username and password from prying eyes. The command-line arguments used to manage the login process are the same as those used by the ncpmount, so we won't go through those again here. We will cover the most important command-line options in our examples; refer to the nprint(1) manual page for details.

The only required option for nprint is the name of the file to print. If the filename specified is – or if no filename is specified at all, nprint will accept the print job from stdin. The most important nprint options specify the fileserver and print queue to which you wish the job to be sent. Table 15-4 lists the most important options.

Table 15-4. nprint Command-Line Options

OptionDescription
-S server_name

The name of the NetWare fileserver supporting the print queue to which you wish to print. Usually it is convenient for the server to have an entry in ~/.nwclient. This option is mandatory.

-q queue_name

The print queue to which to send the print job. This option is mandatory.

-d job_description

Text that will appear in the print console utility when displaying the list of queued jobs.

-l lines

The number of lines per printed page. This defaults to 66.

-r columns

The number of columns per printed page. This defaults to 80.

-c copies

The number of copies of the job that will be printed. The default is 1.

A simple example using nprint would look like:

$ nprint -S REDS01 -q PSLASER -c 2 /home/matt/ethylene.ps
This command would print two copies of the file /home/matt/ethylene.ps to the printer named PSLASER on the REDS01 fileserver using a username and password obtained from the ~/.nwclient file.

15.8.1. Using nprint with the Line Printer Daemon

You will recall we previously mentioned that the –c option for the ncpmount is useful for printing. At last we'll explain why and how.

Linux usually uses BSD-style line printer software. The line printer daemon (lpd ) is a daemon that checks a local spool directory for queued jobs that are to be printed. lpd reads the printer name and some other parameters from the specially formatted spool file and writes the data to the printer, optionally passing the data through a filter to transform or manipulate it in some way.

The lpd daemon uses a simple database called /etc/printcap to store printer configuration information, including what filters are to be run. lpd usually runs with the permissions of a special system user called lp.

You could configure nprint as a filter for the lpd to use, which allows users of your Linux machine to output directly to remote printers hosted by a NetWare fileserver. To do this, the lp user must be able to write NCP requests to the NCP connection to the server.

An easy way to achieve this without requiring the lp user to establish its own connection and login is to specify lp as the owner of a connection established by another user. A complete example of how to set up the Linux printing system to handle print jobs from clients over NetWare is listed in three steps:

  1. Write a wrapper script.

    The /etc/printcap file doesn't permit options to be supplied to filters. Therefore, you need to write a short script that invokes the command you want along with its options. The wrapper script could be as simple as:

    #!/bin/sh
    # p2pslaser - simple script to redirect stdin to the
    # PSLASER queue on the REDS01 server
    #
    /usr/bin/nprint -S REDS01 -U stuart -q PSLASER
    #

    Store the script in the file /usr/local/bin/p2pslaser.

  2. Write the /etc/printcap entry.

    We'll need to configure the p2pslaser script we created as the output filter in the /etc/printcap. This would look something like:

    pslaser|Postscript Laser Printer hosted by NetWare server:\                     
    :lp=/dev/null:\                                                         
    :sd=/var/spool/lpd/pslaser:\                                            
    :if=/usr/local/bin/p2pslaser:\
    :af=/var/log/lp-acct:\
    :lf=/var/log/lp-errs:\
    :pl#66:\                                                                
    :pw#80:\                                                                
    :pc#150:\                                                               
    :mx#0:\                                                                 
    :sh:                                                                    

  3. Add the –c option to the ncpmount.

    ncpmount -S REDS01 .... -c lp ....

    Our local user stuart must specify the lp user as the owner of the connection when he mounts the remote NetWare server.

Now any Linux user may choose to specify pslaser as the printer name when invoking lp. The print job will be sent to the specified NetWare server and spooled for printing.

15.8.2. Managing Print Queues

The pqlist command lists all of the print queues available to you on the specified server. If you do not specify a fileserver on the command line using the -S option, or a login name and password, these will be taken from the default entry in your ~/.nwclient file:

# pqlist -S vbrew_f1 -U guest -n
Server: ALES_F1
Print queue name                                    Queue ID  
------------------------------------------------------------
TEST                                                AA02009E
Q2                                                  EF0200D9
NPI223761_P1                                        DA03007C
Q1                                                  F1060004
I-DATA                                              0D0A003B
NPI223761_P3                                        D80A0031

Our example shows a list of the print queues available to the guest user on the ALES_F1 fileserver.[1]

To view the print jobs on a print queue, use the pqstat command. It takes the print queue name as an argument and lists all of the jobs in that queue. You may optionally supply another argument indicating how many of the jobs in the queue you'd like to list. The following sample output has been compressed a bit to fit the width of this book's page:

$ pqstat -S ALES_F1 NPI223761_P1

Server: ALES_F1     Queue: NPI223761_P1          Queue ID: 6A0E000C
   Seq  Name      Description                    Status   Form  Job ID  
------------------------------------------------------------------------
     1  TOTRAN    LyX document - proposal.lyx    Active      0  02660001

We can see just one print job in the queue, owned by user TOTRAN. The rest of the options include a description of the job, its status, and its job identifier.

The pqrm command is used to remove print jobs from a specified print queue. To remove the job in the queue we've just obtained the status of, we'd use:

$ pqrm -S ALES_F1 NPI223761_P1 02660001

The command is pretty straightforward but is clumsy to use in a hurry. It would be a worthwhile project to write a basic script to simplify this operation.

Notes

[1]

It looks like the system administrators had been sampling some of the Virtual Brewery's wares before they chose some of those print queue names. Hopefully your print queue names are more meaningful!