Posted on 04-06-2017 02:28 PM
Hello,
Im looking for the best way to install printers via bash script. I download drivers from canon and it provides two options: PS driver with the size of 40mb and a UFRII pkg with the size of 71mb. We used to install using generic drivers but some docs dont print well. Im not to familiar with the differences between the two and was wondering if the entire pkg is needed to install for quality printing and have all printer options or can I just grab the PPD in /Library/Printers once installed and script it that way? The pkg's seem to have a ton more printers that i don't need and the largest file called canon_ps_core.pkg which I am not sure exactly it is. Any ideas or suggestions?
Script below fails right now with error: Permission denied
lpadmin: Unable to copy PPD file. (1)
#!/bin/bash
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
"${SCRIPTDIR}/CNMCIRAC5250S2.ppd.gz"
SysPrinter1="30th_North"
DispPrinter1="30th_North"
Addr1="lpd://10.71.30.17/"
Bldg1="Office"
sudo lpadmin -p $SysPrinter1 -v $Addr1 -D $DispPrinter1 -L $Bldg1 -m "$SCRIPTDIR" -E -o printer-is-shared=false
Posted on 04-06-2017 02:36 PM
This is what we use on problem child printers that don't want to play nice:
printername="BC334-P001"
location="BC334"
gui_display_name="BC334-P001"
address="lpd://print.server.here/printername"
driver_ppd="/Library/Printers/PPDs/Contents/Resources/HP LaserJet P2055d.gz"
option_1="HPOption_Tray3=True"
option_2="PageSize=Letter"
option_3=""
/usr/bin/lpstat -p $printername
if [ $? -eq 0 ]; then
/usr/sbin/lpadmin -x $printername
fi
/usr/sbin/lpadmin -p "$printername" -L "$location" -D "$gui_display_name" -v "$address" -P "$driver_ppd" -o "$option_1" -o "$option_2" -o "$option_3" -o printer-is-shared=false -E
/usr/sbin/cupsenable $(lpstat -p | grep -w "printer" | awk '{print$2}')
exit 0
Posted on 04-06-2017 02:57 PM
Awesome very helpful thank you! Could you search by IP rather then printer name if you wanted to remove existing printers?
Posted on 04-06-2017 03:03 PM
@yurypanasyuk Yes
Posted on 04-07-2017 06:38 AM
My big question is if the entire package is good to install or is the single PPD file ok? What advantage does the 40mb package provide? I want to embed the driver inside my application bundle but a 69kb PPD vs a 40mb pkg is a little bizarre.
Posted on 04-07-2017 08:25 AM
I just install the entire package. I'm not concerned about a 40mb file when I have applications that are more than 15GB in size.
My driver package from Ricoh is only 9.4mb
Posted on 04-07-2017 08:44 AM
I've had many issues mapping printers...
Best way I found was to use the CUPS web interface to add a printer, then add it via Casper Admin.
Seems to work fine..
Posted on 04-07-2017 10:32 AM
I had a tech go around with a laptop to where the printer was, install and set up the printer on the laptop, then added them thru Casper Admin. Works good
Posted on 04-07-2017 10:56 AM
Heres my completed script. I have a bash shell working with an AppleScript. The logic goes as follows:
set theAlertText to "Printer Installation"
set theAlertMessage to "This script will install printers to your machine. Any duplicate printers will be removed!
Would you like to continue?"
display alert theAlertText message theAlertMessage as critical buttons {"Don't Continue", "Continue"} default button "Continue" cancel button "Don't Continue"
--> Result: {button returned:"Continue"}
set progress description to "Script is in progress"
set progress additional description to "Preparing, please wait..."
set progress total steps to -1
delay 1
set progress total steps to 2
set progress completed steps to 0
set thePathToTheSourceFolder to (POSIX path of (path to me)) & "Contents/Resources/Printers/"
set PrinterInstall to quoted form of (POSIX path of (path to resource "PrinterInstall.sh"))
set theDestFolder to "/etc/cups"
tell application "Finder"
set myFolder to (quoted form of (POSIX path of ((path to me) as string))) & "Contents/Resources/Drivers/"
end tell
set progress completed steps to 1
set progress additional description to "Installing Printer Driver"
delay 1
tell application "Finder"
if POSIX file "/Library/Printers/PPDs/Contents/Resources/CNMCIRAC5550S2.ppd.gz" exists then
else
do shell script ¬
"installer -allowUntrusted -pkg " & myFolder & ¬
"Canon_PS_Installer.pkg -target /" with administrator privileges
end if
end tell
set progress completed steps to 2
set progress additional description to "Configuring Printers"
delay 1
do shell script PrinterInstall with administrator privileges
delay 2
tell application "Finder"
display dialog "Script has completed successfully!" buttons {"Restart", "Cancel"} default button "Cancel" with icon caution
if button returned of result is "Restart" then
do shell script "(sleep 5 ; shutdown -r now) &>/dev/null &" with administrator privileges
end if
end tell
#!/bin/bash
###############################
#
# Variables
#
###############################
# Set the appropriate values below
# PPD is the location of the printer-specific PPD file *this should be installed locally prior to running the script
# SysPrinter is the printer name
# DispPrinter is the printer display name (this appears in the Printers list)
# Addr is the IPV4 Path to printer (http://xx.xx.xx.xx/)
# Example: lpadmin -p 'ricoh4503copier' -v 'lpd://10.0.01/' -D 'Ricoh 4503 Copier' -L 'Main Office' -P '/Library/Printers/PPDs/Contents/Resources/RICOH MP C4503' -E -o printer-is-shared=false -o OptionTray=2Cassette -o LargeCapacityTray=Installed -o Finisher=FinAMUR -o Duplex=None -o PageSize=Letter -o ColorModel=Gray
# Bldg is the physical campus location of the printer
PPD1='/Library/Printers/PPDs/Contents/Resources/CNMCIRAC5550S2.ppd.gz'
SysPrinter1="17th_South"
DispPrinter1="17th South"
Addr1="lpd://10.18.26.17/"
Bldg1="Bell Office"
#PPD2=
SysPrinter2="18th_South"
DispPrinter2="18th South"
Addr2="lpd://10.18.28.17/"
Bldg2="Bell Office"
#PPD3=
SysPrinter3="19th_South"
DispPrinter3="19th South"
Addr3="lpd://10.18.28.18/"
Bldg3="Office"
###############################
#
# Script
#
###############################
# Printer Destroyer Script
# Get full list of printers & search for socket connection using IP
printer1=$(lpstat -s | grep '10.18.28.17' | awk -F'/' '{print $3}')
printer01=$(lpstat -s | grep 'smb://xxxxxxxxxxxxx' | awk -F'/' '{print $3}')
# If Printer variable is empty, then don't act. Else. Try to remove
if [ -z $printer1 ]; then
# I didn't find anything. End it here.
echo "[INFO] Printer Not Found. No removal necessary."
else
# Printer IP was found. Lets try to remove it.
echo "[INFO] $printer1 Printer Found. Attempting to remove."
# Use lpstat command to find that printer again and get the name,
# then clean up the string by removing the trailing colon.
# After that, use the lpadmin -x command to remove the printer.
remove_printer=$(lpstat -s | grep '10.18.28.17' | awk -F ' ' '{print $3}' | sed s/://g)
lpadmin -x $remove_printer
# Check if what we did actually worked.
printer_check=$(lpstat -s | grep '10.18.28.17' | awk -F'/' '{print $3}')
if [ -z $printer_check ]; then
echo "[INFO] Success! Old Printer Removed."
else
echo "[ERROR] Something went wrong. Likely two printers with 1 IP. Otherwise, I'm all out of ideas"
fi
fi
if [ -z $printer01 ]; then
echo "[INFO] Printer Not Found. No removal necessary."
else
echo "[INFO] $printer1 Printer Found. Attempting to remove."
remove_printer=$(lpstat -s | grep 'smb://xxxxxxxxxxx' | awk -F ' ' '{print $3}' | sed s/://g)
lpadmin -x $remove_printer
printer_check=$(lpstat -s | grep 'smb://xxxxxxxxxxx' | awk -F'/' '{print $3}')
if [ -z $printer_check ]; then
echo "[INFO] Success! Old Printer Removed."
else
echo "[ERROR] Something went wrong. Likly two printers with 1 IP. Otherwise, I'm all out of ideas"
fi
fi
#---------------------------------------------------------------------------------------------------------
printer2=$(lpstat -s | grep '10.18.26.17' | awk -F'/' '{print $3}')
printer02=$(lpstat -s | grep 'smb://xxxxxxxxxxxxx' | awk -F'/' '{print $3}')
if [ -z $printer2 ]; then
echo "[INFO] Printer Not Found. No removal necessary."
else
echo "[INFO] $printer2 Printer Found. Attempting to remove."
remove_printer=$(lpstat -s | grep '10.18.26.17' | awk -F ' ' '{print $3}' | sed s/://g)
lpadmin -x $remove_printer
printer_check=$(lpstat -s | grep '10.18.26.17' | awk -F'/' '{print $3}')
if [ -z $printer_check ]; then
echo "[INFO] Success! Old Printer Removed."
else
echo "[ERROR] Something went wrong. Likly two printers with 1 IP. Otherwise, I'm all out of ideas"
fi
fi
if [ -z $printer02 ]; then
echo "[INFO] Printer Not Found. No removal necessary."
else
echo "[INFO] $printer2 Printer Found. Attempting to remove."
remove_printer=$(lpstat -s | grep 'smb://xxxxxxxxxxx' | awk -F ' ' '{print $3}' | sed s/://g)
lpadmin -x $remove_printer
printer_check=$(lpstat -s | grep 'smb:xxxxxxxxxxxx' | awk -F'/' '{print $3}')
if [ -z $printer_check ]; then
echo "[INFO] Success! Old Printer Removed."
else
echo "[ERROR] Something went wrong. Likly two printers with 1 IP. Otherwise, I'm all out of ideas"
fi
fi
#----------------------------------------------------------------------------------------------------------
printer3=$(lpstat -s | grep '10.18.28.18' | awk -F'/' '{print $3}')
printer03=$(lpstat -s | grep 'xxxxxxxxxxxxxx' | awk -F'/' '{print $3}')
if [ -z $printer3 ]; then
echo "[INFO] Printer Not Found. No removal necessary."
else
echo "[INFO] $printer3 Printer Found. Attempting to remove."
remove_printer=$(lpstat -s | grep '10.18.28.18' | awk -F ' ' '{print $3}' | sed s/://g)
lpadmin -x $remove_printer
printer_check=$(lpstat -s | grep '10.18.28.18' | awk -F'/' '{print $3}')
if [ -z $printer_check ]; then
echo "[INFO] Success! Old Printer Removed."
else
echo "[ERROR] Something went wrong. Likly two printers with 1 IP. Otherwise, I'm all out of ideas"
fi
fi
if [ -z $printer03 ]; then
echo "[INFO] Printer Not Found. No removal necessary."
else
echo "[INFO] $printer3 Printer Found. Attempting to remove."
remove_printer=$(lpstat -s | grep 'smb://xxxxxxxxxxxx' | awk -F ' ' '{print $3}' | sed s/://g)
lpadmin -x $remove_printer
printer_check=$(lpstat -s | grep 'smb://xxxxxxxxxxxxx' | awk -F'/' '{print $3}')
if [ -z $printer_check ]; then
echo "[INFO] Success! Old Printer Removed."
else
echo "[ERROR] Something went wrong. Likly two printers with 1 IP. Otherwise, I'm all out of ideas"
fi
fi
#----------------------------------------------------------------------------------------------------------
sleep 2
#----------------------------------------------------------------------------------------------------------
sudo lpadmin -p "$SysPrinter1" -v $Addr1 -D "$DispPrinter1" -L "$Bldg1" -m "$PPD1" -E -o printer-is-shared=false
sudo lpadmin -p "$SysPrinter2" -v $Addr2 -D "$DispPrinter2" -L "$Bldg2" -m "$PPD1" -E -o printer-is-shared=false
sudo lpadmin -p "$SysPrinter3" -v $Addr3 -D "$DispPrinter3" -L "$Bldg3" -m "$PPD1" -E -o printer-is-shared=false
#Clears every print job and then reenables every printer that currently has a status of disabled.
sudo /usr/sbin/cupsenable -c `/usr/bin/lpstat -p | /usr/bin/grep disabled | /usr/bin/awk '{print $2}'`
# man lpadmin
# -p = Named printer or class
# -v = device URI
# -D = textual description of destination
# -L = location of destination
# -m = model (ppd)
# -E (at end) enables device
# CUPS Options
# man lptoptions
# -o printer-is-shared=false disables sharing
# -o Duplex=None disables two-sided printing
# -o Duplex=DuplexNoTumble enables two-sided printing long edge
# -o Duplex=DuplexTumble enables two-sided printing short edge
# Printer has Large Capacity Tray
# lpadmin -p $cupsName -o LargeCapacityTray=Installed
# The following options must be manually commented in/out
# If a Ricoh SP4100 then do not uncomment any options
# If a Ricoh C5502 then uncomment the following line
# lpadmin -p $SysPrinter -o LargeCapacityTray=Installed -o PageSize=Letter -o Duplex=DuplexNoTumble -o ColorModel=Gray -o Finisher=FinKINGB
# If a Ricoh MP6002 then uncomment the following line
# lpadmin -p $SysPrinter -o PageSize=Letter -o Duplex=DuplexNoTumble -o Finisher=FinEUPHRATESE
exit
Posted on 04-07-2017 12:34 PM
The only thing I CANNOT figure out is why duplex printing is enabled by default. I cant find the setting by searching using this command and output below:
lpoptions -p 34th Floor -l | grep -i duplex
Output: CNDuplex/Print Style: None *DuplexFront Booklet
Could it be the option above? If so how do view options to change them?
Here is the duplex section in the PPD:
*OpenUI *CNDuplex/Print Style: PickOne
*DefaultCNDuplex: DuplexFront
*CNDuplex None/1-sided Printing: "<< >>setpagedevice"
*CNDuplex DuplexFront/2-sided Printing: "<< >>setpagedevice"
*CNDuplex Booklet/Booklet Printing: "<< >>setpagedevice"
*CloseUI: *CNDuplex
Posted on 04-08-2017 02:28 PM
Regarding UFRII or PS - that's the language used to communicate with the printer. PS is PostScript and UFRII is Canon's native proprietary language.
What you use would depend on what your specific printers support and perhaps whether you're using a managed print system in between your Macs and your printers. PostScript arguably gives higher quality output but your printers will have to be able to support it. When we were setting up our managed print system, uniFLOW, the PostScript drivers were recommended for the Macs. However, the Canon MFDs we have required extra licensed firmware to support PostScript and this had a cost implication per unit.
If your printers do have PostScript support, use that driver IMO. There are accounts of more accurate colour rendering output with PostScript drivers vs UFRII as well if you do a quick web search - UFRII compresses the data sent to the printer which is more efficient for your network etc but at the expense of quality.
Posted on 04-10-2017 04:14 AM
@yurypanasyuk I ran into this before, have a look at this
Posted on 04-10-2017 08:15 AM
Thanks Neil! I thought UFRII was the choice primarily if you were using a fiery controller. Good to know PS is the way to go.
Bentoms: I saw this post too and figured out how to do it. Fairly simple just a bunch of testing. Except no need to use lpoptions. I strictly added another option to my current lpadmin command:
sudo lpadmin -p "$SysPrinter1" -v $Addr1 -D "$DispPrinter1" -L "$Bldg1" -m "$PPD1" -E -o printer-is-shared=false -o CNDuplex=None
Posted on 04-10-2017 08:18 AM
FYI, formatting doesn't work when adding text as code in a prompt.
**-o CNDuplex=None**
Posted on 04-10-2017 08:21 AM
Thanks Neil! I thought UFRII was the choice primarily if you were using a fiery controller. Good to know PS is the way to go.
Bentoms: I saw this post too and figured out how to do it. Fairly simple just a bunch of testing. Except no need to use lpoptions. I strictly added another option to my current lpadmin command:
sudo lpadmin -p "$SysPrinter1" -v $Addr1 -D "$DispPrinter1" -L "$Bldg1" -m "$PPD1" -E -o printer-is-shared=false -o CNDuplex=None