"Fossies" - the Fresh Open Source Software Archive

Member "apsfilter/SETUP.in" (9 Jul 2006, 67029 Bytes) of archive /linux/misc/apsfilter-7.2.8.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format (assuming markdown format). Alternatively you can here view or download the uninterpreted source code file. A member file download can also be achieved by clicking within a package contents listing on the according byte size field.

! @shell@

-- sh --

#

$ApsCVS: src/apsfilter/SETUP.in,v 1.123.2.20 2006/07/09 15:54:22 andreas Exp $

#

apsfilter setup tool

#

written by Andreas Klemm andreas@apsfilter.org

modified for V6.0 by Michael Loßin phallobst@web.de

#

#

exit status 0 on successfull printer installation

exit status 1 indicates failures or if the user simply quit the program

#

umask 022

PATH=“/usr/local/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/bin:/bin” : ${TMPDIR:=/tmp} ${AWK:=@awk@}

APS_TMPDIR=“$TMPDIR/apsfilter$$” rm -rf “$APS_TMPDIR” mkdir -m 700 “$APS_TMPDIR” if [ $? -ne 0 ]; then APS_TMPDIR=mktemp -q -d "$TMPDIR/apsfilter.XXXXXX" || \ echo 1>&2 “SETUP error: couldn’t create temporary directory” chmod 700 “$APS_TMPDIR” fi export TEMP=“$APS_TMPDIR” TMPDIR=“$APS_TMPDIR” PATH

trap ‘rm -rf “$APS_TMPDIR”’ 0

on BSD systems and most other Unices lpd runs under permissions “daemon”

spooldirs have the permissions “root:daemon”

to enable lpd to read config files for remote printing

we have to use “640” as permission for the config file

# PASSWD_PROTECT=640

#

display text with a pager like “more”

# do_pager() { case “$1” in -) ${PAGER-more} ;; .Z) zcat “$1” | ${PAGER-more} ;; .gz|.z) gzip -cd “$1” | ${PAGER-more} ;; ) ${PAGER-more} < “$1” ;; esac }

#

Copyright note and license

#

do_copyright() { clear cat << !EOM // // / / / / / /// /// / / //// // / // //// / / // //// / / / //// // / / / / // / / / / / / / / /// /// / / / // /// / / /

Hi, welcome to the apsfilter setup and thanks for using apsfilter!

Before we begin with the setup, I'd like to make you familiar
with the apsfilters license:
1. apsfilter follows the GNU public license (GPL), see COPYRIGHT
2. and this little "Postcard License":

"I'd like to get a postcard from you! I'm interested in,
 who is using apsfilter, where you live, and where in the
 world apsfilter is doing it's job."

Please send me an e-mail to  apsfilter-snailmail@apsfilter.org  to
get my postal address; we'll get there later in this setup...

!EOM echo $n “Accept license [Y|y|J|j|N|n] ? $c”; read answer echo case $answer in Y|y|J|j) echo “License accepted, thanks!” echo sleep 2 ;; *) echo “License not accepted – sorry, terminating setup…” exit 1 ;; esac }

#

Request snail mail address for “Postcard License”

#

do_request_snailmail() { clear cat << !EOM / / / / // // // /// / /// / /// / / / / / / / ///// / //// / / / / / / / / / / / / / / /// / / /// / /// / / //

Is Internet Mail up and running on this machine to request my postal address to follow the rules of the “Postcard License” ?

!EOM echo $n “Request my snail mail address now [Y|y|N|n] ? $c”; read answer echo case $answer in Y|y|J|j) # Find out mail address… while [ -z “$EMAIL_OK” ]; do echo echo “To what address may I send you my postal address?” echo “Does mail to \”$USER@$HOST\“ reach you?” echo echo “Enter RETURN to accept or type in your” echo $n “complete mail address: $c”; read $read_r answer if [ -z “$answer” ]; then # use $USER@$HOST REPLYTO=“$USER@$HOST” echo echo “Thanks, using $REPLYTO …” sleep 2 echo EMAIL_OK=true else # check for fqdn and use his address case $answer in @.) REPLYTO=“$answer” echo “using $REPLYTO …” sleep 2 EMAIL_OK=true ;; ) echo echo “!!! $answer is not a valid !!!” echo “!!! e-mail address…. !!!” sleep 2 ;; esac fi done

    { 
    echo "To: apsfilter-snailmail@apsfilter.org"
    echo "Reply-To: $REPLYTO"
    echo "Subject: get snailmail for apsfilter version @VERSION@"
    } | "@sendmail@" apsfilter-snailmail@apsfilter.org
    touch "$CONF_DIR/.requested_snailmail"
    ;;
*)
    echo
    echo "o.k. for now ..."
    echo
    echo "... but please don't forget to request it later ..."
    sleep 4
    ;;
esac

}

#

START SEQUENCE

- introduce apsfilter, version, copyright

#

do_start() { clear cat << !EOM ================================================================ A P S F I L T E R V @VERSION@ The Unix Print Solution ================================================================

                   copyright Andreas Klemm, 1993-2002

                          andreas@apsfilter.org

            http://www.apsfilter.org/

                ----------------------------------------
                  for Unix systems with BSD compatible 
                      line printer scheduler (lpd)
            or with LPRng
                   FreeBSD / NetBSD / OpenBSD / BSDI
                    Linux and other flavours of Unix
                ----------------------------------------

        ++++ INSTALLATION PROGRAM ++++

                    [ press <RETURN> to continue ]

!EOM read answer clear cat << !EOM ================================================================ A P S F I L T E R S E T U P – PROGRAM INFO – ================================================================

    This SETUP script supports the user/administrator by

    - configuring serial/parallel/remote printers
    - creating printer spool directories as needed
    - auto-creation of printcap config-file
      for apsfilter (add / overwrite printer)
    - setting up apsfilter (which gs driver to use,
      paper size, print resolutions and color depth)
    - printing a test page (settings may be modified
      until successfull ouput of a testpage)
    - saves some SETUP settings in apsfilterrc config file

    it does not:

    - complete printer management in printcap
      (delete/modify printer)
    ----------------------------------------------------------------

                    [ press <RETURN> to continue ]

!EOM read answer }

#

Check which ghostscript release we have

Now we can offer gs version dependent

- driver description

- driver selection

#

do_check_gs_version() { GS_VERSION=gs --version case $GS_VERSION in 7) GS_BASE=7.00 ;; 6.[5-9]) GS_BASE=6.50 ;; *) GS_BASE=6.50

    cat <<EOF

Found ghostscript version $GS_VERSION … You have to upgrade at least to gs version 6.50! But you should upgrade to gs 7.00 for full driver support prior installing printers with SETUP. EOF echo $n “Do you you want to continue? [Y/n] $c”; read answer case $answer in N|n) echo “o.k., terminating.” exit 1 ;; esac ;; esac }

#

if user selects a “non-PS printer” and if ghostscript is not installed

(needed by do_choose_driver)

#

warn_about_missing_gs() { clear cat << !EOM ================================================================ A P S F I L T E R S E T U P – WARNING – ================================================================

Attention 
=========
As I see now, you are installing apsfilter for a printer that needs
gs (ghostscript) as postscript emulator, but apsfilter's SETUP was
unable to locate the ghostscript emulator.

One reason might be that ghostscript is installed in an unusual
directory and SETUP was unable to auto-detect this path.

Then please add this path at the top of SETUP and run it again.

Otherwise you have to get the ghostscript sources and fonts
and install ghostscript by hand and run setup again afterwards.

!EOM exit 1 }

#

Show the ghostscript devices that are compiled into gs (pretty-print).

#

show_gs_devices() { { echo “Devices known to ghostscript version $GS_VERSION:”; echo gs -q -dNODISPLAY -c “devicenames == quit” | tr -d “/[]” | \ tr “ ” “\n” | sort | pr -5 -t -w 80 } | do_pager - }

#

Loop until suitable driver found and confirmed by the user

#

do_choose_driver() { clear cat << !EOM PRINTER DRIVER SELECTION

Please select the type of printer you want to install:

1)  PostScript printer (generic)
2)  PostScript printer (with ghostscript drivers)
3)  printer driver natively supported by ghostscript
4)  gimp-print (stp driver; version 4.2.x)
5)  gimp-print (ijs driver; version 4.2.1 and later)
6)  hpdj
7)  pcl3 (successor to hpdj)
8)  IBM Omni
9)  various HP Deskjet drivers
10) PPA printer
11) official HP DeskJet drivers (hpijs 0.97)
12) official HP DeskJet drivers (hpijs 1.1 and later)
13) Epson printer (official drivers)
14) Lexmark inkjet printer
15) miscellaneous other drivers
16) non-printer devices (caution! -- read the handbook)
17) sound (let apsfilter act as jukebox)
0)  return to main menu

!EOM echo $n “Your choice: $c”; read answer case $answer in 1) PRINTER=PS; return ;; 2) PRINTER=PSgs check_for_gs_support pswrite psgray psmono || do_choose_driver return ;; 3) PRINTER_LIST=setup/printer-$GS_BASE ;; 4) PRINTER_LIST=setup/printer-stp ;; 5) PRINTER_LIST=setup/printer-gimp ;; 6) PRINTER_LIST=setup/printer-hpdj ;; 7) PRINTER_LIST=setup/printer-pcl3 ;; 8) PRINTER_LIST=setup/printer-omni ;; 9) PRINTER_LIST=setup/printer-cdj ;; 10) PRINTER_LIST=setup/printer-ppa ;; 11) PRINTER_LIST=setup/printer-hpijs ;; 12) PRINTER_LIST=setup/printer-ijs ;; 13) PRINTER_LIST=setup/printer-epson ;; 14) PRINTER_LIST=setup/printer-lexmark ;; 15) PRINTER_LIST=setup/printer-misc ;; 16) PRINTER_LIST=setup/non-printer ;; 17) PRINTER_LIST=setup/sound ;; *) return ;; esac

# for sanity checks in while loop
# no of entries in PRINTER_LIST
MAXNO=`grep -c -v "^#" $PRINTER_LIST`

clear
cat <<!EOM

Choose printer driver from the following list; remember the number.

Hint: Navigation in more: SPACE - page down b - backward one screen RETURN - line forward /pattern - search for pattern (i.e.: driver name) k - backward one line G - jump to end of file 1G - jump to beginning of file q - quit browsing file h - help

Press to continue !EOM read answer

PRINTER=""
while [ -z "$PRINTER" ]; do
# list available gs driver preceeded by number
grep -v "^#" $PRINTER_LIST \
    | "$AWK" -F "|" '{ printf("%d - %s [%s]\n", FNR, $1, $2) }' \
    | do_pager -
echo "Which driver do you want to choose?"
echo "[Hit RETURN to see the list again, enter 0 to choose new type.]"
echo
echo $n "Enter number: $c"; read answer
if [ -z "$answer" ]; then
    : # show the list again
elif [ $answer = 0 ]; then
    # choose a different printer type
    do_choose_driver
    return
elif [ $answer -lt 1 -o $answer -gt $MAXNO ]; then
    echo "wrong selection: enter value between 1 and $MAXNO !"
    sleep 2
else
    # get the driver specified by number
    PRINTER="`grep -v "^#" $PRINTER_LIST \
        | "$AWK" -F "|" "{ if (FNR == $answer) print \\$2 }"`"
fi

# check if gs has this driver compiled in
if [ -n "$PRINTER" ]; then
    case "$PRINTER" in
    # print-to-file drivers
    bmp)    check_for_gs_support bmp32b bmpgray bmpmono ;;
    jpeg)   check_for_gs_support jpeg jpeggray ;;
    pcx)    check_for_gs_support pcx24b pcxgray pcxmono ;;
    png)    check_for_gs_support png16m pnggray pngmono ;;
    pnm)    check_for_gs_support ppmraw pgmraw pbmraw ;;
    tiff)   check_for_gs_support tiff24nc tiffpack ;;

    # printer drivers
    *.upp)  check_for_gs_support uniprint ;;
    ppa/*|printiva|lexmark1100)
        check_for_gs_support ppmraw pgmraw pbmraw ;;
    gimp/*)
        check_for_gs_support ijs ;;
    stp/*|omni/*|hpdj/*|pcl3/*|hpijs/*|ijs/*)
        check_for_gs_support "${PRINTER%%/*}" ;;
    lexmark2030|lexmark2070|samsung85)
        check_for_gs_support pbmraw ;;
    lexmark2050c|lexmark2070c|lexmarkZ11)
        check_for_gs_support bitcmyk ;;
    cjet)
        check_for_gs_support ljet3 ;;
    ljet4l)
        check_for_gs_support ljet4 ;;
    stylewriter)
        check_for_gs_support bitcmyk pbmraw ;;
    pips/*)
        check_for_gs_support png16m pnggray pngmono ;;
    st800)
        check_for_gs_support stcolor ;;
    bjc50|bjc70|bjc4000|bjc7000)
        check_for_gs_support bjc600 ;;

    sound)  # set all other variables to default to sound
        INTERFACE=sound
        XRESOL=sound
        YRESOL=sound
        RESOLUTION=sound
        COLOR=sound
        QUALITY=sound
        METHOD=sound
        PAPER=sound
        ;;

    # simple default for printer and non-printer devices
    *)  check_for_gs_support "$PRINTER" ;;
    esac
fi

if [ -n "$PRINTER" ]; then
    echo
    echo "You selected driver: $PRINTER"
    echo
    echo "Driver $PRINTER supports the following printer(s):"
    grep "|$PRINTER$" $PRINTER_LIST
    echo
    echo $n "Do you want to use $PRINTER? [Y|n] $c"; read answer
    case $answer in
    N|n)    PRINTER="" ;;
    esac
fi
done

}

check_for_gs_support() { local req

# check for gs
type gs >/dev/null 2>&1 || warn_about_missing_gs

for req; do
# check if gs has driver compiled in
if ! gs -h | sed -e '1,/Available devices:/d' -e '/Search path:/,$ d' \
    | grep -w "$req" >/dev/null; then
    cat <<EOF

Error: Your gs version doesn’t have driver “$req” compiled in… Select another driver or build a new gs version with complete or customized driver support.

Now you’ll see a list of drivers supported by your gs version…

Press to continue EOF read answer show_gs_devices # to enter selection loop PRINTER=“” return 1 fi done return 0 }

#

called by do_setup_interface (parallel setup)

#

do_ask_parallel_device() { clear cat << !EOM —————————————————————- A P S F I L T E R Parallel Interface Settings – Device – —————————————————————-

Depending on your flavour of Unix, you have to enter the
*full path* to your parallel Interface. In case of trouble please
contact your local system administrator or read your operating
systems technical documentation, FreeBSD handbook or Linux HowTo.
Some examples:

FreeBSD, NetBSD, OpenBSD:   LPT1: /dev/lpt0   LPT2: /dev/lpt1
    USB under *BSD:           /dev/ulpt0        /dev/ulpt1
    USB (no reset):           /dev/unlpt0       /dev/unlpt1
Linux:                      LPT1: /dev/lp0    LPT2: /dev/lp1
    with devfsd:              /dev/printers/0   /dev/printers/1
    USB under Linux:          /dev/usb/lp0      /dev/usb/lp1
SunOS4:                           /dev/bpp0         /dev/bpp1

currently selected:               Interface:  [$INTERFACE]
                                      Device:     [$DEVICE] 

!EOM echo $n “Full path of parallel print device: $c”; read $read_r answer [ “$answer” ] && DEVICE=“$answer”

if [ ! -c "$DEVICE" ]; then
echo; echo "Warning! Device node '$DEVICE' is not a character"
echo $n "device. Proceed anyway (y/n)? $c"; read $read_r answer
[ "$answer" != y -a "$answer" != Y ] && unset DEVICE
fi

}

#

called by do_setup_interface (remote printer setup)

#

do_ask_remote_printer() { clear cat << !EOM —————————————————————- A P S F I L T E R Remote Printer SETUP via lpd print protocol —————————————————————-

If you have FreeBSD (3.x or later) with an enhanced lpd or
another Unix System with LPRng, it's possible to use apsfilter
with remote printer. Restrictions of original Berkeley lpd
made it impossible in the past, to use lineprinter input filter
when printing to a remote printer.

Please enter the full qualified hostname or IP address of the
remote system as well as the remote printer name.
See the manpage: printcap(5). Fields "rm" and "rp"

currently selected:
machine name for remote printer : [ $rm ]
remote printer name             : [ $rp ]   

!EOM echo $n “Machine name for remote printer: $c”; read $read_r rm echo echo “Hint for remote printing onto network printer with HP JetDirect card” echo “Enter ‘raw’ as remote printer queuename !” echo echo $n “Remote Printer Name: $c”; read $read_r rp [ “$rm” ] && DEVICE=“$rm” }

#

called by do_setup_interface (samba printer setup)

#

do_ask_samba_printer() { clear cat << !EOM —————————————————————- A P S F I L T E R Samba Printer SETUP —————————————————————-

Take care that smbclient is in apsfilters search path.
You can fine tune paths in $CONF_DIR/apsfilterrc.
See smbclient manual page for more options if needed.

currently selected:
NetBIOS name of Windows Server  : [ $SMB_SERVER ]
Windows Server IP               : [ $SMB_IP ]   
Printer Share  Name             : [ $SMB_PRINTER ]  
Workgroup                       : [ $SMB_WORKGROUP ]    
Windows Username                : [ $SMB_USER ] 
Windows Password                : [ $SMB_PASSWD ]   

(you can fine tune some more values in the smbclient.conf
file in the printer's configuration directory later)

!EOM echo $n “NetBIOS name of Windows Server: $c”; read $read_r SMB_SERVER echo $n “Windows Server IP Address : $c”; read $read_r SMB_IP echo $n “Printer Share Name : $c”; read $read_r SMB_PRINTER echo $n “Workgroup Name : $c”; read $read_r SMB_WORKGROUP echo $n “Print as Windows GUEST user (no: use real account)? [y/n] $c” read answer case $answer in n|N) echo $n “Windows Username : $c” read $read_r SMB_USER echo $n “Windows Password : $c” read $read_r SMB_PASSWD ;; *) echo “O.K. using user GUEST, to print on Windows Printer…” SMB_USER=“”; SMB_PASSWD=“” ;; esac

[ "$SMB_SERVER" ] && DEVICE="$SMB_SERVER"

}

#

called by do_setup_interface (netware printer setup)

#

do_ask_netware_printer() { clear cat << !EOM —————————————————————- A P S F I L T E R NetWare Printer SETUP —————————————————————-

Take care that ncprint/nprint is in apsfilters search path.
You can fine tune paths in $CONF_DIR/apsfilterrc.
See ncprint/nprint manual page for more options if needed.

currently selected:
NetWare server name  : [ $NCP_SERVER ]
Printer queue name   : [ $NCP_PRINTER ]
NetWare username     : [ $NCP_USER ]
NetWare password     : [ $NCP_PASSWD ]

(you can fine tune some more values in the netware.conf
file in the printer's configuration directory later)

!EOM echo $n “NetWare server name : $c”; read $read_r NCP_SERVER echo $n “Printer queue name : $c”; read $read_r NCP_PRINTER echo $n “NetWare username : $c”; read $read_r NCP_USER echo $n “NetWare password : $c”; read $read_r NCP_PASSWD

[ "$NCP_SERVER" ] && DEVICE="$NCP_SERVER"

}

#

called by do_setup_interface (apple remote printer setup)

#

do_ask_atalk_printer() { clear cat << !EOM —————————————————————- A P S F I L T E R AppleTalk Remote Printer SETUP —————————————————————-

Take care that pap is installed in apsfilters search path.
You can fine tune paths in $CONF_DIR/apsfilterrc.
See pap manual page for more options if needed.

currently selected:
NBP name of Apple Printer  : [ $PAP_NBPNAME ]

!EOM echo $n “Name (NBP Name) of Apple Printer: $c”; read $read_r PAP_NBPNAME

[ "$PAP_NBPNAME" ] && DEVICE="$PAP_NBPNAME"

}

#

Some routines for serial interface options, line discipline…

#

do_read_serial_device() { clear cat << !EOM —————————————————————- A P S F I L T E R Serial Interface Settings – Device – —————————————————————-

Depending on your flavour of Unix, you have to enter the
*full path* to your serial Interface. In case of trouble please
contact your local system administrator or read your operating
systems technical documentation, FreeBSD handbook or Linux HowTo.
Some examples:

FreeBSD, NetBSD, OpenBSD:   COM1: /dev/cuaa0  COM2: /dev/cuaa1
Linux:                      COM1: /dev/ttyS0  COM2: /dev/ttyS1
SunOS4:                           /dev/ttya         /dev/ttyb

currently selected:                    Interface: [$INTERFACE]
                                           Device   : [$DEVICE]

!EOM echo $n “Your choice? $c”; read $read_r answer [ “$answer” ] && DEVICE=“$answer”

if [ ! -c "$DEVICE" ]; then
echo; echo "Warning! Device node '$DEVICE' is not a character"
echo $n "device. Proceed anyway (y/n)? $c"; read $read_r answer
[ "$answer" != y -a "$answer" != Y ] && unset DEVICE
fi

}

do_read_serial_baud() { clear cat << !EOM —————————————————————- A P S F I L T E R Serial Interface Settings – Baudrate – —————————————————————-

The Baud Rate is the transfer rate at which the asynchronous
serial interface is sending bits from the computer to the printer.

The higher the Baudrate the better and shorter your cable should
be. I recommend 5m cable as a maximum for 38400 Baud and perhaps
2-3m for speeds higher than that. It depends heavily on the
quality of your cables, interfaces, handshaking and printer.

Another rule of thumb is, that hardware handshaking works best
with higher Baudrates, but needs a special cable depending on
your machine and the printer.

Valid and useable Baudrates are (a good starting point is 9600)

1) 4800     2) 9600     3) 19200
4) 38400    5) 57600    6) 115200

Please note: you have to configure your printer as well for that
speed and don't forget to power off and on the printer after that.

!EOM echo $n “Your choice? $c”; read answer case $answer in 1) BAUDRATE=4800 ;; 2) BAUDRATE=9600 ;; 3) BAUDRATE=19200 ;; 4) BAUDRATE=38400 ;; 5) BAUDRATE=57600 ;; 6) BAUDRATE=115200 ;; esac }

do_read_serial_handshake() { clear cat << !EOM —————————————————————- A P S F I L T E R Serial Interface Settings – Handshaking – —————————————————————-

There are two possible handshaking methods, often called
Hardware and Software handshaking. This determines, how
the printer tells your computers start or stop sending data
to avoid data lossage.

Directly forget about using ghostscript as Postscript Emulator
with the software handshaking (xon/xoff protocol), because gs
(ghostscript) sends a binary data stream to the printer containing
these start/stop characters. But I will allow you to select this
as an option, you'll certainly know better than I what you want.

Hardware handshaking isn't as standardized as it could. So
different computer/printers use different pins/signals of the
serial interface, to stop/start the data transfer. You'll
certainly need a special printer cable !

1 - software handshaking (xon/xoff, 3 wires, avoid this)
2 - hardware handshaking (crtscts, RTS/CTS flow control)

!EOM echo $n “Your choice? $c”; read answer case $answer in 1) HANDSHAKE=“ixon,ixoff,ixany,-crtscts” HANDSHAKE_FOR_COMMAND=“ixon ixoff ixany -crtscts” ;; 2) HANDSHAKE=“-ixon,-ixoff,-ixany,crtscts” HANDSHAKE_FOR_COMMAND=“-ixon -ixoff -ixany crtscts” ;; esac }

do_read_serial_wordlength() { clear cat << !EOM —————————————————————- A P S F I L T E R Serial Interface Settings – Wordlength – —————————————————————-

Computer and Printer must have the same settings how many
"bits" long a "data word" is.

We have to use "8 Bit" long data words, otherwise it isn't
possible to transmit characters above a value of 127.
We need 8 Bit here!

1)  8 Bit       (a must !)
2)  7 Bit       (please do not use this !)

!EOM echo $n “Your choice? $c”; read answer case $answer in 1) WORDLENGTH=8; WORDLENGTH_COMMAND=cs8 ;; 2) WORDLENGTH=7; WORDLENGTH_COMMAND=cs7 ;; esac }

do_read_serial_parity() { clear cat << !EOM —————————————————————- A P S F I L T E R Serial Interface Settings – Parity – —————————————————————-

Computer and Printer must have the same settings if they
use parity or not. Parity is a kind of a checksum to detect
garbage on the line.

Usually we use no parity. If there is a need for parity,
you have to decide if you use even or odd parity.

1)  no parity   (take this)
2)  even
3)  odd

!EOM echo $n “Your choice? $c”; read answer case $answer in 1) PARITY=“no parity”; PARITY_COMMAND=-parenb ;; 2) PARITY=“even”; PARITY_COMMAND=“parenb -parodd” ;; 3) PARITY=“odd”; PARITY_COMMAND=“parenb parodd” ;; esac }

do_read_serial_stopbits() { clear cat << !EOM —————————————————————- A P S F I L T E R Serial Interface Settings – Stop Bits – —————————————————————-

Your computer and printer must have the same amount of stopbits
configured that are sent/accepted after transmitting a "Data
word" - and parity information, if you selected one -.

Standard is to use one stopbit. Please configure your printer's
serial interface to use one stopbit, if possible, otherwise use
two stopbits.

1)  1 Stopbit
2)  2 Stopbits

!EOM echo $n “Your choice? $c”; read answer case $answer in 1) STOPBITS=1; STOPBIT_COMMAND=-cstopb ;; 2) STOPBITS=2; STOPBIT_COMMAND=cstopb ;; esac }

#

called by do_setup_interface (serial setup)

#

do_ask_serial_settings() { clear cat << !EOM —————————————————————- A P S F I L T E R S E T U P – Serial Interface Settings – —————————————————————-

Important for a successfull configuration is, that the computers
_and_ the printers interface do have exactly the same settings !

Operating system dependent
   1) Printer device            [$DEVICE]

General operating characteristics
   2) Baud rate             [$BAUDRATE]
   3) Handshaking           [$HANDSHAKE]

Data format
   4) Data Word Length (in bits)    [$WORDLENGTH]
   5) Parity                [$PARITY]
   6) Stopbits              [$STOPBITS]
   7) Startbits (UNIMPLEMENTED)     [$STARTBITS]

!EOM echo $n “Your choice? $c”; read answer case $answer in 1) do_read_serial_device ;; 2) do_read_serial_baud ;; 3) do_read_serial_handshake ;; 4) do_read_serial_wordlength ;; 5) do_read_serial_parity ;; 6) do_read_serial_stopbits ;; esac }

#

Print Device serial or parallel?

#

do_setup_interface() { clear cat << !EOM —————————————————————- A P S F I L T E R S E T U P – Interface Setup – —————————————————————-

The easiest way, to connect a printer to your computer is by
using the parallel interface, because it's usually *faster*,
more standardized and therefore much easier to configure.
 When configuring a serial printer, the installation dialogue
asks you many questions about how to configure the serial
interface of your computer, so that it works well with your
printers current settings.
 When using the serial interface, then you have to choose special
cables, depending on the communication protocol between computer
and printer (hardware/software handshaking). Many pitfalls here !

currently selected:               Interface:  [$INTERFACE]
                                      Device:     [$DEVICE] 
configure local / remote printer
1) local parallel/USB       2) local serial
3) Unix/network printer (lpd)   4) Windows / NT (samba)
5) AppleTalk                    6) Novell NetWare
7) Sound (Jukebox)

!EOM echo $n “Your choice? $c”; read answer case $answer in 2) INTERFACE=serial; do_ask_serial_settings ;; 3) INTERFACE=network; do_ask_remote_printer ;; 4) INTERFACE=samba; do_ask_samba_printer ;; 5) INTERFACE=atalk; do_ask_atalk_printer ;; 6) INTERFACE=netware; do_ask_netware_printer ;; 7) INTERFACE=sound ;; *) INTERFACE=parallel; do_ask_parallel_device ;; esac [ “$DEVICE” ] || unset INTERFACE }

#

Choose the print resolution

#

do_choose_resolution() { clear cat << !EOM —————————————————————- A P S F I L T E R S E T U P – Print Resolution – —————————————————————-

You can set the default printing resolution here, but keep in
mind that the quality setting (right now: $QUALITY) has
greater priority for most drivers.

You must set the resolution in this dialog for PostScript
printers (PS, PSgs) and for drivers that don't have a driver
script (e.g. uniprint profiles).

Some typical settings to play with:

1) 150dpi   2) 300dpi   3) 600dpi   4) 1200dpi
5) 180dpi   6) 360dpi   7) 360x180dpi   8) 720dpi
9) sound

c) custom settings

!EOM echo $n “Your choice? $c”; read answer case $answer in 1) XRESOL=150; YRESOL=150 ;; 2) XRESOL=300; YRESOL=300 ;; 3) XRESOL=600; YRESOL=600 ;; 4) XRESOL=1200; YRESOL=1200 ;; 5) XRESOL=180; YRESOL=180 ;; 6) XRESOL=360; YRESOL=360 ;; 7) XRESOL=360; YRESOL=180 ;; 8) XRESOL=720; YRESOL=720 ;; 9) XRESOL=“sound” ;; *) # custom settings echo $n “Please input x-resolution in dpi: $c”; read XRESOL echo $n “Please input y-resolution in dpi: $c”; read YRESOL if [ -z “$XRESOL” ]; then if [ -z “$YRESOL” ]; then XRESOL=300; YRESOL=300 else XRESOL=$YRESOL fi else [ “$YRESOL” ] || YRESOL=$XRESOL fi ;; esac if [ “$XRESOL” == “sound” ]; then RESOLUTION=“sound” else RESOLUTION=${XRESOL}x${YRESOL} fi }

#

Choose default color mode

#

do_choose_color() { clear cat << !EOM —————————————————————- A P S F I L T E R S E T U P – Color Setup – —————————————————————-

Please choose whether you want to print in full color, grayscale
or monochrome mode. Not all drivers support all of these three
modes.

If you don't know what to do, use "full color".

1)  full color mode     (usually 24bpp or 32bpp)
2)  grayscale mode      (usually 3bpp, 4bpp or 8bpp)
3)  monochrome mode     (usually 1bpp)
4)  sound

0)  keep setting [$COLOR]

!EOM echo $n “Your choice? $c”; read answer case $answer in 1) COLOR=full ;; 2) COLOR=gray ;; 3) COLOR=mono ;; 4) COLOR=sound ;; esac }

#

Choose default printing quality

#

do_choose_quality() { clear cat << !EOM —————————————————————- A P S F I L T E R S E T U P – Quality Setup – —————————————————————-

This sets the printing quality. Usually, this has an impact on
the printing resolution and the dithering quality. For some
drivers, some modes are merely aliases for other modes.

1)  draft   (usually: lowest resolution, fastest dithering)
2)  low (usually: low resolution, fast dithering)
3)  medium  (usually: medium resolution, normal dithering)
4)  high    (usually: high resolution, good dithering)
5)  photo   (usually: highest resolution, best dithering)
6)  sound

0)  keep setting [$QUALITY]

!EOM echo $n “Your choice? $c”; read answer case $answer in 1) QUALITY=draft ;; 2) QUALITY=low ;; 3) QUALITY=medium ;; 4) QUALITY=high ;; 5) QUALITY=photo ;; 6) QUALITY=sound ;; esac }

#

Choose default printing method

#

do_choose_method() { clear cat << !EOM —————————————————————- A P S F I L T E R S E T U P – Method Setup – —————————————————————-

Please choose how apsfilter should handle the incoming data.

1)  auto    (automatic data conversion)
2)  ascii   (treat everything as text)
3)  raw (do not modify data; ignores paper size,
         quality, color and resolution settings)
4)  sound   (use apsfilter as mp3 jukebox)

0)  keep setting [$METHOD]

!EOM echo $n “Your choice? $c”; read answer case $answer in 1) METHOD=auto ;; 2) METHOD=ascii ;; 3) METHOD=raw ;; 4) METHOD=sound ;; esac }

#

Choose paper size

#

do_setup_paper_format() { clear cat << !EOM —————————————————————- A P S F I L T E R S E T U P – Paper Format – —————————————————————-

What paper format do you want to use for printing?

1) DIN A4   (21.0cm x 29.7cm)
2) DIN A3   (29.7cm x 42.0cm)
3) US letter    ( 8.5in x 11.0in)
4) US legal ( 8.5in x 14.0in)
5) US tabloid   (11.0in x 17.0in)
6) US ledger    (17.0in x 11.0in)
7) Sound

!EOM echo $n “Your choice? $c”; read answer case $answer in 1) PAPER=a4 ;; 2) PAPER=a3 ;; 3) PAPER=letter ;; 4) PAPER=legal ;; 5) PAPER=tabloid ;; 6) PAPER=ledger ;; 7) PAPER=sound ;; esac }

do_print_test_page() { local sv_printer sv_resolution gs_device paper

sv_printer=$PRINTER; sv_resolution=$RESOLUTION
[ "$PAPER" = tabloid ] && paper=11x17 || paper="$PAPER"

# the tmp file containing the print data
# a) PS content if you have a PS printer
# b) gs output (translated PS file) using printer driver of your choice

TESTOUT="$APS_TMPDIR/test_page.aps"

### call driver script to adjust options
unset GS_FEATURES POST_FILTER POST_FILTER_OPTS
DRIVER_SCRIPT="$PRINTER"
if [ ! -e "driver/$DRIVER_SCRIPT" ]; then
# get the script name from the mapping file
DRIVER_SCRIPT=$(grep ":$PRINTER:" "driver/MAPPING" | sed "s/:.*//")
fi
if [ -n "$DRIVER_SCRIPT" -a -e "driver/$DRIVER_SCRIPT" ]; then
. "driver/$DRIVER_SCRIPT"
fi

# construct test print command, that will be evaluated later; idea is to
# separate time to create print data and actual time to print it

case "$PRINTER" in
omni/*|hpijs/*)
    GS_FEATURES="$GS_FEATURES -sDeviceName=${PRINTER#*/}"
    PRINTER=${PRINTER%%/*} ;;
stp/*|hpdj/*)
    GS_FEATURES="$GS_FEATURES -sModel=${PRINTER#*/}"
    PRINTER=${PRINTER%%/*} ;;
pcl3/*)
    GS_FEATURES="$GS_FEATURES -sSubdevice=${PRINTER#pcl3/}"
    PRINTER=pcl3 ;;
gimp/*)
    GS_FEATURES="$GS_FEATURES -sDeviceModel='${PRINTER#gimp/}' \
    -sIjsServer=ijsgimpprint -dIjsUseOutputFD"
    PRINTER=ijs ;;
ijs/*)
    GS_FEATURES="$GS_FEATURES -sDeviceModel='${PRINTER#ijs/}' \
    -sIjsServer=hpijs -dIjsUseOutputFD"
    PRINTER=ijs ;;
esac
case "$PRINTER" in
PS)
    # real PS printer
    CREATE_TESTPAGE_CMD="cp setup/test.ps '$TESTOUT'"
    ;;
*.upp)
    # uniprint profiles
    CREATE_TESTPAGE_CMD="gs -q -dBATCH -dNOPAUSE -dPARANOIDSAFER \
    -dSAFER @$PRINTER -sPAPERSIZE=$paper -sOutputFile='$TESTOUT' \
    setup/test.ps"
    ;;
sound)
    CREATE_TESTPAGE_CMD=""
    ;;
*)
    # generic drivers
    CREATE_TESTPAGE_CMD="gs -q -dBATCH -dNOPAUSE -dPARANOIDSAFER \
    -dSAFER -r$RESOLUTION -sDEVICE=$PRINTER -sPAPERSIZE=$paper \
    $GS_FEATURES $PS_INIT -sOutputFile='$TESTOUT' setup/test.ps"
    ;;
esac

# reset settings (might have been mangled by the driver script)
PRINTER=$sv_printer; RESOLUTION=$sv_resolution

# maybe we need an additional filter (e.g. pnm2ppa)
if [ "$POST_FILTER" ]; then
if type "$POST_FILTER" > /dev/null 2>&1; then
    CREATE_TESTPAGE_CMD="$CREATE_TESTPAGE_CMD | '$POST_FILTER' \
    $POST_FILTER_OPTS"
else
    echo
    echo "ERROR: additional filter '$POST_FILTER' was not found;"
    echo "       can't create test page"
    echo
    echo "[ press RETURN to continue ]"
    read answer
    return
fi
fi

# Tell the magic command ...
echo
echo "Printing Test page using:"
echo "$CREATE_TESTPAGE_CMD"
echo
echo $n "Ok to print testpage? [y/n] $c"; read answer
case $answer in
N|n)
    # do nothing
    ;;
*)
    # print...
    echo
    echo "Creating test page..."
    {
    date
    echo "$PRINTER $RESOLUTION $QUALITY $COLOR"
    echo "Time for ghostscript:"
    }  >> "$CONF_DIR/perf.log"

    # for time to be saved into logfile
    # stderr has to be redir. before pipe
    eval time $CREATE_TESTPAGE_CMD 2>&1 | tee -a "$CONF_DIR/perf.log"

    # check if command was successful
    # only then print
    EXIT_STATUS=$?
    if [ "$EXIT_STATUS" = 0 ]; then
    echo
    echo "Printing test page... "
    echo "Time for printer:" >> "$CONF_DIR/perf.log"
    if [ "$INTERFACE" = samba ]; then
        if [ -n "$SMB_USER" ]; then
        export PASSWD="$SMB_PASSWD"
        SMB_LOGIN="-U ${SMB_USER}"
        else
        SMB_LOGIN=""
        fi
        PRINT_TESTP_CMD="smbclient < '$TESTOUT' \
        '//${SMB_SERVER}/${SMB_PRINTER}' ${SMB_IP:+-I $SMB_IP} \
        ${SMB_LOGIN} ${SMB_WORKGROUP:+-W} ${SMB_WORKGROUP} \
        -b 1400 -N -c 'print -'"
    elif [ "$INTERFACE" = netware ]; then
        # hide password in temporary configuration file
        if type ncprint >/dev/null 2>&1; then
        PRINT_TESTP_CMD=ncprint
        {
            echo "[${NCP_SERVER}:${NCP_USER}]"
            echo "password=$NCP_PASSWD"
        } > "$APS_TMPDIR/.nwfsrc"
        chmod $PASSWD_PROTECT "$APS_TMPDIR/.nwfsrc"
        else
        PRINT_TESTP_CMD=nprint
        echo "$NCP_SERVER/$NCP_USER ${NCP_PASSWD:--}" \
            > "$APS_TMPDIR/.nwclient"
        chmod $PASSWD_PROTECT "$APS_TMPDIR/.nwclient"
        fi
        PRINT_TESTP_CMD="$PRINT_TESTP_CMD < '$TESTOUT' \
        -S $NCP_SERVER -U $NCP_USER -q $NCP_PRINTER"
    elif [ "$INTERFACE" = atalk ]; then
        PRINT_TESTP_CMD="pap -e -p '$PAP_NBPNAME' < '$TESTOUT'"
    elif [ "$INTERFACE" = network ]; then
        PRINT_TESTP_CMD="lpr -P'${rp}@${rm}' '$TESTOUT'"
    else
        PRINT_TESTP_CMD="cat '$TESTOUT' > $DEVICE"
    fi

    ls -l "$TESTOUT" | tee -a "$CONF_DIR/perf.log"
    # temporarily set HOME for NetWare printing commands
    HOME="$APS_TMPDIR" eval time $PRINT_TESTP_CMD 2>&1 | \
        tee -a "$CONF_DIR/perf.log"
    echo "[ press RETURN to continue ]"
    read answer
    else
    echo "last command terminated with exit status: $EXIT_STATUS"
    echo "Error creating testpage!"
    echo "[ press RETURN to continue ]"
    read answer
    fi
    ;;
esac
# remove temporary files
rm -f "$TESTOUT" "$APS_TMPDIR/.nwfsrc" "$APS_TMPDIR/.nwclient"

}

do_print_test_menue() { clear cat << !EOM —————————————————————- A P S F I L T E R S E T U P – Test Page – —————————————————————-

In most cases it's relatively easy to choose a suitable
ghostscript driver from the list of supported printers.

If you're printer is not in the list of supported printers:
    - guess a suitable driver by "trial and error"
    - consult your printers handbook to what ghostscript printer
      driver your printer "claims" to be compatible

If this test produces unacceptable results, then please choose
another driver or try another (perhaps lower) print quality,
because it might be a memory problem. Only use print resolutions
that are supported by your printer, consult the printers manual!

Creating the test output might take some time, please be patient.

T)  Print a test page
*)  Back to main menue

!EOM echo $n “Your choice? $c”; read answer case $answer in t|T) do_print_test_page ;; esac }

do_view_perflog() { if [ -f “$CONF_DIR/perf.log” ]; then do_pager “$CONF_DIR/perf.log” else do_pager - << !EOM

You’ll have to print a test page first.

!EOM fi }

do_save_environment() { # # Save some settings for another SETUP attempt … # Gooood for testing ;-)) # cat > “$CONF_DIR/SETUP.cfg” <<EOF PRINTER=‘$PRINTER’ RESOLUTION=‘$RESOLUTION’ COLOR=‘$COLOR’ PAPER=‘$PAPER’ METHOD=‘$METHOD’ QUALITY=‘$QUALITY’ INTERFACE=‘$INTERFACE’ DEVICE=‘$DEVICE’ BAUDRATE=‘$BAUDRATE’ HANDSHAKE=‘$HANDSHAKE’ WORDLENGTH=‘$WORDLENGTH’ PARITY=‘$PARITY’ STARTBITS=‘$STARTBITS’ STOPBITS=‘$STOPBITS’ SMB_SERVER=‘$SMB_SERVER’ SMB_IP=‘$SMB_IP’ SMB_PRINTER=‘$SMB_PRINTER’ SMB_WORKGROUP=‘$SMB_WORKGROUP’ SMB_USER=‘$SMB_USER’ SMB_PASSWD=‘$(echo $SMB_PASSWD | sed “s/’/‘\\’‘/g”)’ NCP_SERVER=‘$NCP_SERVER’ NCP_PRINTER=‘$NCP_PRINTER’ NCP_USER=‘$NCP_USER’ NCP_PASSWD=‘$(echo $NCP_PASSWD | sed “s/’/‘\\’‘/g”)’ rm=‘$rm’ rp=‘$rp’ EOF if [ “${SMB_PASSWD}${NCP_PASSWD}” ]; then echo “read protect SETUP.cfg, since it contains password…” chmod $PASSWD_PROTECT “$CONF_DIR/SETUP.cfg” chown root:$LP_GROUP “$CONF_DIR/SETUP.cfg” fi }

do_main_menue() { MENU_DONE=“”

while [ -z "$MENU_DONE" ]; do
# printer that need a special PS init file in GS_LIBDIR
case $PRINTER in
    stcolor)    PS_INIT=stcolor.ps ;;
    *)      PS_INIT="" ;;
esac

clear
#
# display the main menu
#
cat << !EOM
    ==================================================================
      A P S F I L T E R   S E T U P                   -- MAIN MENUE --
    ==================================================================

(D) Available Device Drivers in your gs binary
(R) Read Ghostscript driver documentation        (devices.txt)

(1) Printer Driver Selection        [$PRINTER]
(2) Interface Setup             [$INTERFACE]
(3) Paper Format                [$PAPER]
(4) Printing Quality            [$QUALITY]
(5) Color Mode              [$COLOR]
(6) Print Resolution in "dots per inch" [$RESOLUTION]
(7) Default Printing Method         [$METHOD]

!EOM

if [ -z "$PRINTER" -o -z "$INTERFACE" -o -z "$PAPER" ]; then
    # you need to set PRINTER, INTERFACE and PAPER before
    # anything else can be done
    unset proceed
    cat << !EOM
(A) Abort installation (don't do anything)
(Q) ==> Finish installation

!EOM else proceed=true cat << !EOM (T) Print Test Page (V) View performance log (times of print attempts)

(A) Abort installation (don't do anything)
(I) ==> Install printer with values shown above - repeat this
        step for installing multiple printers
(Q) ==> Finish installation

!EOM fi echo $n “ Your choice? $c”; read answer case $answer in d|D) show_gs_devices ;; r|R) do_pager setup/devices-$GS_BASE ;; 1) do_choose_driver ;; 2) do_setup_interface ;; 3) do_setup_paper_format ;; 4) do_choose_quality ;; 5) do_choose_color ;; 6) do_choose_resolution ;; 7) do_choose_method ;; t|T) [ “$proceed” ] && do_print_test_menue ;; v|V) [ “$proceed” ] && do_view_perflog ;; a|A) exit 1 ;; i|I) [ “$proceed” ] && MENU_DONE=true ;; q|Q) FINISH_SETUP=true; MENU_DONE=true ;; esac done }

#

full check for permissions of files and directories

only call this when being root

#

do_check_permissions() { clear echo “Checking permissions of $APS_BASEDIR”

DIR_OWNER=`ls -lgd | "$AWK" '{ print $3 }'`
DIR_GROUP=`ls -lgd | "$AWK" '{ print $4 }'`
case $DIR_OWNER in
root|daemon|bin|lp)
    # ok, secure directory owner found
    echo "found dir owner=$DIR_OWNER, ok!" ;;
*)
    # set secure directory owner
    echo "found dir owner=$DIR_OWNER, not ok!"
    echo "setting dir owner=bin!"
    DIR_OWNER=bin ;;
esac
case $DIR_GROUP in
root|wheel|other|bin|lp)
    # ok, secure directory group found
    echo "found dir group=$DIR_GROUP, ok!" ;;
*)
    # set secure directory group
    echo "found dir group=$DIR_OWNER, not ok!"
    echo "setting dir group=bin!"
    DIR_GROUP=bin ;;
esac

# after having set sane defaults, fix permissions
echo $n "changing permissions of $APS_BASEDIR... $c"
chmod 555 .
chown -R $DIR_OWNER:$DIR_GROUP .
find . -type d -print | xargs chmod 555
find . -type f -print | xargs chmod a+r,a-w
echo "done."
echo
echo "Now we are checking file permissions in spooldir"

set -- `ls -ld "$SPOOL"`
LP_OWNER=$3; LP_GROUP=$4

while [ ! "$PERM_OK" ]; do
echo
echo "Your line printer scheduler's spooldir seems to be: $SPOOL"
echo
ls -ld "$SPOOL"
echo
echo "The Owner of your spooldir seems to be: $LP_OWNER"
echo "The Group of your spooldir seems to be: $LP_GROUP"
echo
echo $n "Is this correct? [y/n] $c"; read answer
case $answer in
    n|N)
    # ask the user
    echo $n "Path of Spool Dir? [default: $SPOOL] $c"
    read $read_r answer
    [ "$answer" ] && SPOOL="$answer"
    mkdir -p "$SPOOL"

    echo $n "Owner of Spool Dir? [default: $LP_OWNER] $c"
    read $read_r answer
    [ "$answer" ] && LP_OWNER="$answer"

    echo $n "Group of Spool Dir? [default: $LP_GROUP] $c"
    read $read_r answer
    [ "$answer" ] && LP_GROUP="$answer"
    ;;
    *)
    # o.k., do nothing
    PERM_OK=1
    ;;
esac
done

}

#

Save printcap

- save the original printcap -> printcap.orig

- make a work copy of the printcap file -> printcap.old

#

do_save_printcaps() { echo if [ -f “@printcap@” ]; then if [ ! -f “@printcap@.orig” ]; then echo “saving original printcap -> @printcap@.orig” cp “@printcap@” “@printcap@.orig” fi echo “creating a working copy of printcap -> @printcap@.old” cp “@printcap@” “@printcap@.old” else touch “@printcap@” fi }

#

Was printcap already created by apsfilter?

If so: keep entries or overwrite?

#

do_check_for_old_apsfilter_installation() { if [ -d “$CONF_DIR” ]; then if [ -d “$CONF_DIR/basedir” ]; then OLD_BASEDIR=$(ls -l “$CONF_DIR/basedir” | sed ’s/.*-> //‘) if [ “$APS_BASEDIR” != “$OLD_BASEDIR” ]; then echo echo “WARNING! A previous installation of apsfilter is located” echo “in ’$OLD_BASEDIR'.” echo echo $n “Do you want to continue? $c”; read answer case $answer in n|N) exit 1 ;; esac fi fi echo echo “It seems you have configured a printer with this script before.” echo echo “Do you want to (a)dd another printer entry or” echo “ to (o)verwrite the existing entries?” echo $n “a/o? $c”; read answer

case $answer in
    o|O)
    echo "Ok, erasing old apsfilter entries..."
    sed -e "/# APS.*BEGIN/,/# APS.*END/ d" \
        < "@printcap@.old" > "@printcap@"
    chmod 644 "@printcap@"
    ;;
    *)
    echo "Ok, adding another apsfilter printer..."
    ;;
esac
fi

}

#

The real work:

- create printer configuration directory under $CONF_DIR

- install filter link in that directory

- create printer specific configuration file

#

do_install_filter() { clear

#
# Determine highest number of Apsfilter Printer in printcap
#
PRINTER_ENTRIES=`grep "APS.*_BEGIN" "@printcap@" | sort -n`
PRINTER_ENTRIES=${PRINTER_ENTRIES##*printer}
N=`expr ${PRINTER_ENTRIES:-0} + 1` 

{ # create printer start label
echo "# APS${N}_BEGIN:printer$N"
echo "# - don't delete start label for apsfilter printer$N"
echo "# - no other printer defines between BEGIN and END LABEL"
} >> "@printcap@"

while :; do
# set printer queue name; use "lp" if not already present
if grep -E "^lp[|:]|^[^#].*\|lp[|:]" "@printcap@" >/dev/null; then
    nr=1  # get a free "aps$nr" printer name
    while grep -E "^aps${nr}[|:]|^[^#].*\|aps${nr}[|:]" "@printcap@" >/dev/null; do
    nr=`expr $nr + 1`
    done
    QUEUE="aps$nr"
else
    QUEUE=lp
fi
cat <<EOF

Please enter a printer queue name for printer ‘$PRINTER’. The default name is ‘$QUEUE’.

EOF echo $n “Your choice: $c”; read $read_r answer [ “$answer” ] && QUEUE=“$answer”

if grep -E "^${QUEUE}[|:]|^[^#].*\|${QUEUE}[|:]" "@printcap@" >/dev/null
then
    echo
    echo "I'm sorry, but '$QUEUE' is already in use."
else
    break
fi
done

# create configuration directory for this printer and cd into it
mkdir -p "$CONF_DIR/$QUEUE"
cd "$CONF_DIR/$QUEUE"

# printer name in printcap
echo "** creating printcap entry for printer $QUEUE..."

{ # append following output to printcap

echo "$QUEUE|$PRINTER;r=$RESOLUTION;q=$QUALITY;c=$COLOR;p=$PAPER;m=$METHOD:\\"

# interface configuration
case $INTERFACE in
    parallel)
    echo "    :lp=$DEVICE:\\"
    ;;
    serial)
    echo "    :lp=$DEVICE:\\"
    echo "    :br#$BAUD:\\"
    echo "    :ms=ixon,-imaxbel,-ixany,-ixoff,-crtscts:\\"
    ;;
    network)
    echo "    :lp=:\\"
    echo "    :rm=$rm:\\"
    echo "    :rp=$rp:\\"
    ;;
    samba|atalk|netware|sound)
    echo "    :lp=/dev/null:\\"
    ;;
esac

# filter and spooldir configuration in printcap
echo "    :if=$CONF_DIR/basedir/bin/apsfilter:\\"
SPOOLDIR="$SPOOL/$QUEUE"
echo "    :sd=$SPOOLDIR:\\"

# logfile configuration in printcap
echo "    :lf=$SPOOLDIR/log:\\"

# accounting file configuration in printcap
echo "    :af=$SPOOLDIR/acct:\\"

# no size limitation for printjob in printcap
echo "    :mx#0:\\"

# suppress formfeed when printing raw
[ "$METHOD" = raw ] && echo "    :sf:\\"

# last entry, suppress printing of burst page
echo "    :sh:"

# create printer end label
echo "# APS${N}_END - don't delete this"
} >> "@printcap@"

# create spooldir in Unix filesystem
echo "   creating spooldir ..."
mkdir -m 755 -p "$SPOOLDIR"
# maybe chmod knows "--reference" to clone the permissions
chmod --reference="$SPOOL" "$SPOOLDIR" 2>/dev/null

# create needed empty files under Spooldir
: > "$SPOOLDIR/log"
: > "$SPOOLDIR/acct"

# that's needed specially for Linux Slackware
: > "$SPOOLDIR/lock"
chmod 664 "$SPOOLDIR/lock"

# set sane permissions for spooldir
[ `id -u` -eq 0 ] && chown -R $LP_OWNER:$LP_GROUP "$SPOOLDIR"

if [ "$INTERFACE" = samba ]; then
echo "   creating samba config file ..."

{ # write all output to smbclient.conf

    echo "SMB_SERVER='$SMB_SERVER'"
    echo "SMB_IP='$SMB_IP'"
    echo "SMB_PRINTER='$SMB_PRINTER'"
    echo "SMB_WORKGROUP='$SMB_WORKGROUP'"
    echo "SMB_BUFFER=1400"
    echo "SMB_FLAGS='-N'"

    # print on remote windows machine as real user...
    if [ "$SMB_USER" ]; then
    echo "SMB_USER='$SMB_USER'"
    echo "SMB_PASSWD='$(echo $SMB_PASSWD | sed "s/'/'\\\''/g")'"
    fi

} > smbclient.conf

# protect smbclient file, if it contains password information
if [ "$SMB_PASSWD" ]; then
    echo "   read protect password information..."
    chmod $PASSWD_PROTECT smbclient.conf
    chown $LP_OWNER:$LP_GROUP smbclient.conf
fi
elif [ "$INTERFACE" = atalk ]; then
echo "   creating AppleTalk config file ..."
echo "PAP_NBPNAME='$PAP_NBPNAME'" > pap.conf
elif [ "$INTERFACE" = netware ]; then
echo "   creating NetWare config file ..."
{
    echo "NCP_SERVER='$NCP_SERVER'"
    echo "NCP_PRINTER='$NCP_PRINTER'"
    echo "NCP_USER='$NCP_USER'"
    echo "NCP_PASSWD='$(echo $NCP_PASSWD | sed "s/'/'\\\''/g")'"
} > netware.conf

# protect netware file if it contains password information
if [ "$NCP_PASSWD" ]; then
    echo "   read protect password information..."
    chmod $PASSWD_PROTECT netware.conf
    chown $LP_OWNER:$LP_GROUP netware.conf
fi
fi

# Save some settings from this SETUP session
echo "   remember SETUP settings in printers apsfilterrc file..."

{
echo "#"
echo "# don't delete these settings"
echo "#"
echo "PRINTER='$PRINTER'"
echo "PAPERSIZE='$PAPER'"
echo "METHOD='$METHOD'"
echo "QUALITY='$QUALITY'"
echo "COLOR='$COLOR'"
echo "RESOLUTION='$RESOLUTION'"
echo "# apsfilter as jukebox"
echo "# important if audio playback device is a network print queue"
echo "# INTERFACE='network'"
echo "INTERFACE='$INTERFACE'"
echo
echo "#"
echo "# additional configuration follows"
echo "# insert settings as seen in $CONF_DIR/apsfilterrc"
echo "#"
[ "$PS_INIT" ] && echo "PS_INIT='$PS_INIT'"
} > apsfilterrc

# in case LPRng is used: checkpc does a nice cleanup
type checkpc > /dev/null 2>&1 && checkpc -f >/dev/null 2>&1

echo "** done."
echo
echo $n "[ press <RETURN> to continue ] $c"; read answer
cd "$APS_BASEDIR"

}

#

print error message and quit

# fail() { echo >&2 “SETUP error: $@” exit 1 }

#
#
#

#

M A I N

#

#
#
#

export APS_BASEDIR=“@datadir@/apsfilter” cd “$APS_BASEDIR” CONF_DIR=“@sysconfdir@/apsfilter” SPOOL=“@spooldir@”

check read/write permissions

[ -w . ] || fail “no write access to $APS_BASEDIR” if [ -d “$CONF_DIR” ]; then [ -w “$CONF_DIR” ] || fail “no write access to $CONF_DIR” elif [ -d “@sysconfdir@” ]; then [ -w “@sysconfdir@” ] || fail “no write access to @sysconfdir@” else mkdir -p “@sysconfdir@” || fail “couldn’t create @sysconfdir@” fi if [ -f “@printcap@” ]; then [ -r “@printcap@” -a -w “@printcap@” ] || fail “no r/w access to @printcap@” fi printcap_dir=dirname "@printcap@" if [ -d “$printcap_dir” ]; then [ -w “$printcap_dir” ] || fail “no write access to $printcap_dir” else mkdir -p “$printcap_dir” || fail “couldn’t create $printcap_dir” fi if [ -d “$SPOOL” ]; then [ -w “$SPOOL” ] || fail “no write access to $SPOOL” else mkdir -p “$SPOOL” || fail “couldn’t create $SPOOL” [ id -u -eq 0 ] && { chown lp “$SPOOL” || chown daemon “$SPOOL”; } fi

check if we must use the “-r” flag for “read” operations

if echo dummy | read -r dummy 2>/dev/null; then read_r=“-r” else unset read_r fi

how to suppress newlines on echo

if echo “\c” | grep -c . >/dev/null; then n=‘-n’; c=‘’ else n=‘’; c=‘\c’ fi

do_check_gs_version do_copyright

some people got nerved, me too ;-)

if [ -f “$CONF_DIR/.requested_snailmail” ]; then echo “You already requested my snailmail address to write a postcard” echo $n “Request it again? [y/n] $c”; read answer case $answer in y|Y|j|J) do_request_snailmail ;; esac else do_request_snailmail fi

do_start

provide some (more or less) sane default values

PRINTER= PAPER= INTERFACE= DEVICE= QUALITY=medium COLOR=full RESOLUTION=300x300 METHOD=auto MEDIA=plain

read old settings from SETUP.cfg if present

[ -f “$CONF_DIR/SETUP.cfg” ] && . “$CONF_DIR/SETUP.cfg”

do a full check when being root

[ id -u -eq 0 ] && do_check_permissions

prepare filter installation

clear do_save_printcaps do_check_for_old_apsfilter_installation

Create - an apsfilter directory under /etc (if not already present)

- a link $CONF_DIR/basedir -> APS_BASEDIR

- a global configuration file (if not already present)

mkdir -p -m 755 “$CONF_DIR” rm -f “$CONF_DIR/basedir” ln -s “$APS_BASEDIR” “$CONF_DIR/basedir” [ -f “$CONF_DIR/apsfilterrc” ] || cp template/apsfilterrc “$CONF_DIR”

#

Main loop

# do_main_menue while [ -z “$FINISH_SETUP” ]; do do_install_filter do_main_menue done

#

End of creating

- printcap entries

- filesystem operations (spooldir, symlink, … -creation)

#
#

#

now proceed with installation, save environment

do_save_environment

clear cat <<EOF

Finished creating/updating @printcap@ and $CONF_DIR/ …

To let the printer scheduler know of the new printers, it has to be restarted. Be sure that no print jobs are in the queue.

For LPRng use: lpc reread For *BSD use: lpc restart all

For Linux BSD-lpr use the vendor supplied script, i.e.: /etc/rc.d/init.d/lpd restart or similar.

Now some important news/information follow…

Please read them carefully!

[ press to continue ] EOF read answer

clear cat << !EOM / / // / // / / / /// / / / //// / / / // / // / / / / / // / / /// / / //_/

See the ANNOUNCE and ChangeLog files for more informations.
New: read the manual pages apsfilter(1) and apsfilterrc(5)

New CLASS support (lpr -C) allows you to set one ore more options
for gs (PS Emulator), separated by colons (":").

CLASS support is currently available for some gs drivers. Look into
apsfilter script, which driver dependent options are supported.

Example: stcolor print driver: set 
    - print resolution to high resolution (720dpi)
    - color depth to 30 bits per pixel

  lpr -C high:30bpp file1..fileN

!EOM echo $n “[ press to continue ]$c”; read answer

clear cat << !EOM / / // / // / / / /// / / / //// / / / // / // / / / / / // / / /// / / //_/

New: apsfilterrc config files per single printer!
New: name and location change in apsfilterrc config files!
New: manual page for apsfilter(1) and apsfilterrc(5) config files!

A) global apsfilter config file, set by admin
    $CONF_DIR/apsfilterrc

B) printer specific config file for printer N, set by admin
    $CONF_DIR/QUEUE/apsfilterrc

C) user supplied config options on per printer basis, set by admin
    $CONF_DIR/QUEUE/apsfilterrc.USER

D) user controllable config file on per printer basis;
   *SECURITY*HOLE*, needs USE_USER_CODE set in A), B) or C)
    $HOME/.apsfilter/apsfilterrc.QUEUE

!EOM echo $n “[ press to continue ]$c”; read answer

clear cat << !EOM / / // / // / / / /// / / / //// / / / // / // / / / / / // / / /// / / //_/

For printing ASCII files apsfilter now uses a2ps V. 4.12 or higher.
Old patched a2ps and rewindstdin have gone!

You can also use mpage or recode; see apsfilterrc for this setting.

remote printing is fully supported by apsfilter:
- on Unix remote printer (lpd) and
- Windows 95/98/NT/2000 Remote Printer

!EOM echo $n “[ press to continue ]$c”; read answer

clear cat << !EOM / / // // /// // // //// // // //// / / / / / / //// / / / / / / / / / / /// / / / // // /// / / _/

You need SAMBAs smbclient utility, to print on Windows remote printer. SETUP makes the necessary entries in printcap(5).

You need a line printer scheduler (fixed lpd or LPRng) on your system that allows to use input filters (printcap: if=…) when printing to remote printers (printcap: rm:…, rp:…)

FreeBSD 3.x and later have a fixed lpd, no problem here.

Otherwise use the lpd successor LPRng (lineprinter next generation) or configure lpr.conf in the lineprinters spool directory (new!)

!EOM echo $n “[ press to continue ]$c”; read answer

clear cat << !EOM /// / / / // /// /// /// / / //// // / / / / / / / / // / / / / / /// /// /// / /// / / / / / / /_/

Apsfilter can be installed on a Server or Desktop machine. Best is to install it on a dedicated Server, where printers are locally connected to, since ghostscript Postscript emulation might become a CPU intensive process. The faster the CPU, the faster the Postscript emulation and printing in general.

If you want to print on Network printer using the lpd protocol, you should install apsfilter on a machine which has a fixed lineprinter scheduler and is able to use input filters (apsfilter) when printing to a remote printer. FreeBSD 3.x and later has a fixed lpd, otherwise use the lpd successor LPRng.

Since apsfilter 5.2.0 you can also print to Windows remote printers, that are printers on Windows machines, which are shared in the network. You need to install SAMBA on the Unix apsfilter hosts, who want to use Windows printers.

!EOM echo $n “[ press to continue ]$c”; read answer

clear cat << !EOM /// / / / // // /// // // /// // / / / / / / / / / / / / / / / / / / // / / / // / / /

I’d really like to get some mails from you, - why you like apsfilter - how apsfilter saved your or your companies printing problems

Please send apsfilter promotion e-mails to the following e-mail address: apsfilter-promo@apsfilter.org

In return you get the possibility to introduce you and your company and how apsfilter solved your or your companies printing problems ;-)

!EOM echo $n “[ press to continue ]$c”; read answer

clear cat << !EOM /// / / /// / / / / / / / //// /// /// //// /// / / // / / / / / / / // // / /// / // //_/

Our band “64Bits”: Please visit our band’s homepage, from there you get band informations and you can download cool songs.

Official band pages: http://www.64bits.de/

Inofficial band pages: http://www.apsfilter.org/64bits.html

Please send us e-mail, how you find the song, etc. Since we only have few time to probe because of job (you know ;-) we currently are unable to make live concerts.

So YOU are our virtual audience and we’d LOVE to get some feedback ;-) Thanks!

!EOM echo $n “[ press to continue ]$c” read answer

#

This for the last screen with most important infos…

# clear cat << !EOM


Apsfilter Internet Resources

Apsfilter’s homepage (News, Updates, Patches, …):

http://www.apsfilter.org/

Read the ANNOUNCE file about Apsfilter Internet Resources and how to use them:

- Apsfilter developement machine
- Apsfilter mailing lists
- Apsfilter CVS repository
- Apsfilter Anonymous CVS server
- Apsfilter CVS repository browser (cvsweb, enhanced Zeller version)

Please report questions and bugs to the offical apsfilter help channel:

apsfilter-help@apsfilter.org

SETUP done !EOM

exit 0