]>
git.slaskete.net - einar-bin/blob - addfollowmeprint.sh
53937aa03d4783b97b1408a29a37f0a5e8d57b6b
2 # This script installs the FollowMe print queue at NTNU on Linux (and possibly Mac) systems.
3 # The targeted and tested distros are: Debian, Ubuntu (and derivates), Fedora, CentOS, OpenSUSE and Mint
4 # Copyright © 2017-2019 einar.haraldseid@ntnu.no
8 echo "Usage: ./ $(basename "${0}") [OPTIONS]"
10 echo " -m, --model {ricoh|generic} Printer model to install (default: generic)"
11 echo " -d, --driver {pcl,postscript} Printer driver to use (default: postscript)"
12 echo " -f, --force Force running script as if on Linux systems"
13 echo " -p, --plaintext Store credentials as plaintext in /etc/cups/printers.conf (Linux only)"
14 echo " -h, --help Display this help text"
17 # Print errors to STDERR
18 function printerror
() {
22 # Set default options that may be overridden by passed options below
26 # Set other default options
27 PrintServer
= "followprint.win.ntnu.no"
28 PrintFile
= "ntnuprint-ricoh"
29 Workgroup
= "WIN-NTNU-NO"
32 while [[ $# -gt 0 ]]; do
37 Model
= $(echo "${2}" | tr "[:upper:]" "[:lower:]")
38 if [ " ${Model} " != "ricoh" ] && [ " ${Model} " != "generic" ]; then
39 printerror
"Unknown model ${Model} , please choose one of ricoh or generic"
42 shift # Jump to next argument
46 shift # Jump to next argument
49 Driver
= $(echo "${2}" | tr "[:upper:]" "[:lower:]")
50 if [ " ${Driver} " != "postscript" ] && [ " ${Driver} " != "pcl" ]; then
51 printerror
"Unknown driver ${Driver} , plase choose one of postscript or pcl"
54 shift # Jump to next argument
58 shift # Jump to next argument
66 echo "Unknown argument: ${Key} "
71 shift # past argument or value
74 # Make sure we have sudo powers when we need it
76 printerror
"This script requires sudo to function"
80 # But don't run as super user, otherwise we can't access the keyring
81 if [ ${UID} -eq 0 ]; then
82 if [ " ${Plaintext} " != "YES" ]; then
83 printerror
"Please run this script as your normal user, we will prompt you for your sudo password when needed. Or you can use the --plaintext option"
87 echo "Please provide sudo password, as some parts of this script requires it"
89 printerror
"Sorry, this script requires working sudo privileges to function"
94 # Test for supported OS
95 Uname
= $(uname | tr "[:upper:]" "[:lower:]")
96 if [ " ${Uname} " != "darwin" ] && [ " ${Uname} " != "linux" ] && [ " ${Force} " != "YES" ]; then
97 printerror
"I don't think I can run on ${Uname} , but if you insist, please use -f to force Linux detection. This may not work, though."
101 # Set Uname to linux if we are forcing running the script
102 if [ " ${Force} " = "YES" ]; then
106 # Set printer driver path based on driver (we will override these if we're specific distros
107 if [ " ${Driver} " = "postscript" ]; then
108 DriverPath
= "drv:///sample.drv/generic.ppd"
110 DriverPath
= "drv:///sample.drv/generpcl.ppd"
114 if ! sudo bash
-c "command -v lpadmin" > / dev
/ null
2 >& 1 ; then
115 printerror
"You must have CUPS installed to add printers. Please install CUPS."
119 # Tests for Linux systems
120 if [ " ${Uname} " = "linux" ]; then
121 # Test if smbclient is installed
122 if ! command -v smbclient
>/ dev
/ null
2 >& 1 ; then
123 printerror
"You must have smbclient installed to print to NTNU followprint. Please install smbclient."
127 # Test if secret-tool is installed
128 if ! command -v secret
-tool >/ dev
/ null
2 >& 1 ; then
129 printerror
"You must have secret-tool installed for this script to work. Please install libsecret-tools (Debian-systems) or secret-tool (Fedora/CentOS)."
133 # Try to determine if the necessary printer drivers are installed, and set correct driver paths
135 # This should match OpenSUSE, and probably SUSE Enterprise, and other derivates that use zypper as the primary package manager
136 if command -v zypper
>/ dev
/ null
2 >& 1 ; then
137 if [ " ${Driver} " = "postscript" ]; then
138 if [ " ${Model} " = "ricoh" ]; then
139 if ! sudo rpm
-q OpenPrintingPPDs
-postscript >/ dev
/ null
2 >& 1 ; then
140 printerror
"You don't seem to have the correct printer drivers installed, please run:"
141 printerror
" sudo zypper install OpenPrintingPPDs-postscript"
142 printerror
"first, or use the generic model instead."
145 DriverPath
= "OpenPrintingPPDs/postscript/Ricoh-MP_C6003.Postscript-Ricoh.ppd.gz"
148 DriverPath
= "Postscript.ppd.gz"
151 if ! sudo rpm
-q OpenPrintingPPDs
-ghostscript >/ dev
/ null
2 >& 1 ; then
152 printerror
"You don't seem to have the correct printer drivers installed, please run:"
153 printerror
" sudo zypper install OpenPrintingPPDs-ghostscript"
154 printerror
"first, or use the generic model instead."
157 if [ " ${Model} " = "ricoh" ]; then
158 DriverPath
= "OpenPrintingPPDs/ghostscript/Ricoh-MP_C6003.pxlcolor-Ricoh.ppd.gz"
160 DriverPath
= "OpenPrintingPPDs/ghostscript/Generic-PCL_6_PCL_XL_Printer.pxlcolor.ppd.gz"
165 # The rest of the systems can use drv:/// paths for the generic drivers, but we need to detect various distros for advice on installing Ricoh drivers
166 if [ " ${Model} " = "ricoh" ]; then
167 # This should match Fedora and other modern rpm based systems that have dnf as the primary package manager
168 if command -v dnf
>/ dev
/ null
2 >& 1 ; then
169 if ! sudo rpm
-q foomatic
-db-ppds 2 >& 1 ; then
170 printerror
"You don't seem to have the correct printer drivers installed, please run:"
171 printerror
" sudo dnf install foomatic-db-ppds"
172 printerror
"first, or use the generic model instead."
175 if [ " ${Driver} " = "postscript" ]; then
176 DriverPath
= "foomatic-db-ppds/Ricoh/PS/Ricoh-MP_C6003_PS.ppd.gz"
178 DriverPath
= "foomatic-db-ppds/Ricoh/PXL/Ricoh-MP_C6003_PXL.ppd.gz"
182 # This should match CentOS, RHEL and other RHEL based distros that have yum as the primary package manager
183 if command -v yum
>/ dev
/ null
2 >& 1 ; then
184 if ! sudo rpm
-q foomatic
-filters >/ dev
/ null
2 >& 1 ; then
185 printerror
"You don't seem to have the foomatic-filters package installed, please run:"
186 printerror
" sudo yum install foomatic-filters"
187 printerror
"first, or use the generic model instead."
190 if ! sudo rpm
-q foomatic
-db-ppds >/ dev
/ null
2 >& 1 ; then
191 printerror
"You don't seem to have the correct printer drivers installed, please run:"
192 printerror
" sudo yum install foomatic-db-ppds"
193 printerror
"first, or use the generic model instead."
196 if [ " ${Driver} " = "postscript" ]; then
197 DriverPath
= "foomatic-db-ppds/Ricoh/PS/Ricoh-MP_C6003_PS.ppd.gz"
199 DriverPath
= "foomatic-db-ppds/Ricoh/PXL/Ricoh-MP_C6003_PXL.ppd.gz"
203 # This should match Debian, Ubuntu and most if not all derivates that use dpkg as the primary package manager
204 if command -v dpkg
>/ dev
/ null
2 >& 1 ; then
205 if ! sudo dpkg
-s openprinting
-ppds > / dev
/ null
2 >& 1 ; then
206 printerror
"You must have the correct printer drivers installed, please run:"
207 printerror
" sudo apt-get install openprinting-ppds"
208 printerror
"first, or use the generic model instead."
211 if [ " ${Driver} " = "postscript" ]; then
212 DriverPath
= "openprinting-ppds:0/ppd/openprinting/Ricoh/PS/Ricoh-MP_C6003_PS.ppd"
214 DriverPath
= "openprinting-ppds:0/ppd/openprinting/Ricoh/PXL/Ricoh-MP_C6003_PXL.ppd"
222 echo "This script will add a new printer called ${QueueName} , connecting to the
223 print server ${PrintServer} using your user name and password from NTNU."
225 # Get username and password
236 # Some further tests for Linux systems
237 if [ " ${Uname} " = "linux" ]; then
238 # Test for valid username and password
239 # Bonus: find out if the print share is actually available
240 PrintServerIP
= $(getent ahostsv4 ${PrintServer} | head -n 1 | cut -d " " -f 1)
241 if ! smbclient
-U " ${Workgroup} / ${Username} % ${Password} " -L "// ${PrintServer} " -I " ${PrintServerIP} " > / dev
/ null
2 >& 1 ; then
242 printerror
"User name or password incorrect, or no contact with the print server ${PrintServer} ."
245 ShareFound
= $(smbclient -U "${Workgroup}/${Username}%${Password}" -L "//${PrintServer}" -I "${PrintServerIP}" -g 2>/dev/null | grep ${PrintFile} | cut -d "|" -f 1)
246 if [ " ${ShareFound} " != "Printer" ]; then
247 printerror
"Could not find printer share called ${PrintFile} on the server"
248 printerror
"This script must be broken or outdated. Please contact orakel@ntnu.no for further assistance."
253 # Similar tests for OSX
254 if [ " ${Uname} " = "darwin" ]; then
255 if ! smbutil view
-A "// ${Workgroup} ; ${Username} : ${Password} @ ${PrintServer} " > / dev
/ null
2 >& 1 ; then
256 printerror
"User name or password incorrect, or no contact with the print server ${PrintServer} ."
259 ShareFound
= $(smbutil view "//${Workgroup};${Username}:${Password}@${PrintServer}" 2>/dev/null | grep ${PrintFile} | cut -d " " -f 1)
260 if [ " ${ShareFound} " != " ${PrintFile} " ]; then
261 printerror
"Could not find printer share called ${PrintFile} on the server"
262 printerror
"This script must be broken or outdated. Please contact orakel@ntnu.no for further assistance."
267 # Finally we can add the printer, let's remove any existing printer share with the same name first
268 sudo lpadmin
-x ${QueueName} > / dev
/ null
2 >& 1
271 if [ " ${Uname} " = "linux" ]; then
272 if [ " ${Plaintext} " = "YES" ]; then
273 PrinterShare
= "smb:// ${Workgroup} / ${Username} : ${Password} @ ${PrintServer} / ${PrintFile} "
275 echo -e " \n NOTE: Your credentials will be stored in plaintext in /etc/cups/printers.conf. \n This is usually only necessary on headless systems or on systems that don't run a dbus-daemon and/or a keyring that can provide the org.freedesktop.secrets service. \n Needless to say, this is not a good idea on multi-user systems. \n "
277 PrinterShare
= "smb:// ${Workgroup} / ${PrintServer} / ${PrintFile} "
278 AuthInfo
= "username,password"
280 if ! sudo lpadmin
-p ${QueueName} \
281 -D "FollowMe print queue at NTNU" \
282 -L "Many locations" \
283 -v " ${PrinterShare} " \
285 -o auth
-info-required = " $AuthInfo " \
286 -u allow
: all
-E ; then
287 printerror
"Could not connect to printer share. See above error for details."
290 if [ " ${Plaintext} " != "YES" ]; then
291 # Add credentials to the keyring
292 if ! echo -n " ${Password} " | secret
-tool store \
293 --label "ipp://localhost:631/printers/ $QueueName " \
294 uri
"ipp://localhost:631/printers/ ${QueueName} " \
295 user
" ${Username} " ; then
296 printerror
"Could not store credentials to the keyring, see above error for details. A workaround can be to use the option --plaintext"
302 if [ " ${Uname} " = "darwin" ]; then
303 if ! sudo lpadmin
-p ${QueueName} \
304 -D "FollowMe print queue at NTNU" \
305 -L "Many locations" \
306 -v "smb:// ${PrintServer} / ${PrintFile} " \
308 -o printer
-is-shared = false
-o printer
-op-policy = authenticated \
309 -u allow
: all
-E ; then
310 printerror
"Could not connect to printer share. See above error for details."
314 sudo cupsenable
" ${QueueName} "
315 sudo cupsaccept
" ${QueueName} "
317 # Add credentials to the keychain if they are missing
318 # Shamelessly stolen^W^WBorrowed from https://github.com/Orakeltjenesten/scripts/blob/33abfb353524f449f0bbdee27adb2f1f0a9756a2/print/ntnuprint-mac.sh
319 # TODO: Since we should have a known-good username and password at this stage it's unwise to re-use the existing credentials, can we simply drop the test?
320 if ! security
find -internet-password -s ${PrintServer} >/ dev
/ null
2 >& 1 ; then
321 security
-v add
-internet-password -a " ${Workgroup} \\ ${Username} " -s ${PrintServer} \
322 -w " ${Password} " -D "Network Password" -r "smb " -l " ${QueueName} " \
323 -T / System
/ Library
/ CoreServices
/ NetAuthAgent.app
-T 'group://NetAuth' \
324 -T / System
/ Library
/ CoreServices
/ NetAuthAgent.app
/ Contents
/ MacOS
/ NetAuthSysAgent
>/ dev
/ null
2 >& 1
328 # Set correct paper size and enable the duplexer option
329 if ! sudo lpadmin
-p ${QueueName} -o PageSize
= A4
-o Option1
= True
; then
330 printerror
"Could not set default options on the print queue ${QueueName} . See above error for details."
335 if ! sudo lpadmin
-d ${QueueName} ; then
336 printerror
"Could not set the print queue ${QueueName} as default printer. See above error for details."
340 echo "Printer successfully installed."
342 if [ " ${Uname} " = "linux" ] && [ " ${Plaintext} " != "YES" ]; then
343 echo -e " \n Please note: due to the way credentials are stored and accessed on Linux, some print operations will still halt for credentials, notably the \" Print test page \" function. In those cases, supply your normal NTNU username and password."