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
> /dev
/null
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"
181 # This should match CentOS, RHEL and other RHEL based distros that have yum as the primary package manager
182 elif command -v yum
>/dev
/null
2>&1; then
183 if ! sudo rpm
-q foomatic-filters
> /dev
/null
2>&1; then
184 printerror
"You don't seem to have the foomatic-filters package installed, please run:"
185 printerror
" sudo yum install foomatic-filters"
186 printerror
"first, or use the generic model instead."
189 if ! sudo rpm
-q foomatic-db-ppds
> /dev
/null
2>&1; then
190 printerror
"You don't seem to have the correct printer drivers installed, please run:"
191 printerror
" sudo yum install foomatic-db-ppds"
192 printerror
"first, or use the generic model instead."
195 if [ "${Driver}" = "postscript" ]; then
196 DriverPath
="foomatic-db-ppds/Ricoh/PS/Ricoh-MP_C6003_PS.ppd.gz"
198 DriverPath
="foomatic-db-ppds/Ricoh/PXL/Ricoh-MP_C6003_PXL.ppd.gz"
202 # This should match Debian, Ubuntu and most if not all derivates that use dpkg as the primary package manager
203 if command -v dpkg
>/dev
/null
2>&1; then
204 if ! sudo dpkg
-s openprinting-ppds
> /dev
/null
2>&1; then
205 printerror
"You must have the correct printer drivers installed, please run:"
206 printerror
" sudo apt-get install openprinting-ppds"
207 printerror
"first, or use the generic model instead."
210 if [ "${Driver}" = "postscript" ]; then
211 DriverPath
="openprinting-ppds:0/ppd/openprinting/Ricoh/PS/Ricoh-MP_C6003_PS.ppd"
213 DriverPath
="openprinting-ppds:0/ppd/openprinting/Ricoh/PXL/Ricoh-MP_C6003_PXL.ppd"
221 echo "This script will add a new printer called ${QueueName}, connecting to the
222 print server ${PrintServer} using your user name and password from NTNU."
224 # Get username and password
235 # Some further tests for Linux systems
236 if [ "${Uname}" = "linux" ]; then
237 # Test for valid username and password
238 # Bonus: find out if the print share is actually available
239 PrintServerIP
=$
(getent ahostsv4
${PrintServer} |
head -n 1 | cut
-d " " -f 1)
240 if ! smbclient
-U "${Workgroup}/${Username}%${Password}" -L "//${PrintServer}" -I "${PrintServerIP}" > /dev
/null
2>&1; then
241 printerror
"User name or password incorrect, or no contact with the print server ${PrintServer}."
244 ShareFound
=$
(smbclient
-U "${Workgroup}/${Username}%${Password}" -L "//${PrintServer}" -I "${PrintServerIP}" -g 2>/dev/null | grep ${PrintFile} | cut -d "|
" -f 1)
245 if [ "${ShareFound}" != "Printer
" ]; then
246 printerror "Could not
find printer share called
${PrintFile} on the server
"
247 printerror "This
script must be broken or outdated. Please contact orakel@ntnu.no
for further assistance.
"
252 # Similar tests for OSX
253 if [ "${Uname}" = "darwin
" ]; then
254 if ! smbutil view -A "//${Workgroup};${Username}:${Password}@${PrintServer}" > /dev/null 2>&1; then
255 printerror "User name or password incorrect
, or no contact with the print server
${PrintServer}.
"
258 ShareFound=$(smbutil view "//${Workgroup};${Username}:${Password}@${PrintServer}" 2>/dev/null | grep ${PrintFile} | cut
-d " " -f 1)
259 if [ "${ShareFound}" != "${PrintFile}" ]; then
260 printerror
"Could not find printer share called ${PrintFile} on the server"
261 printerror
"This script must be broken or outdated. Please contact orakel@ntnu.no for further assistance."
266 # Finally we can add the printer, let's remove any existing printer share with the same name first
267 sudo lpadmin
-x ${QueueName} > /dev
/null
2>&1
270 if [ "${Uname}" = "linux" ]; then
271 if [ "${Plaintext}" = "YES" ]; then
272 PrinterShare
="smb://${Workgroup}/${Username}:${Password}@${PrintServer}/${PrintFile}"
274 echo -e "\nNOTE: Your credentials will be stored in plaintext in /etc/cups/printers.conf.\nThis 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.\nNeedless to say, this is not a good idea on multi-user systems.\n"
276 PrinterShare
="smb://${Workgroup}/${PrintServer}/${PrintFile}"
277 AuthInfo
="username,password"
279 if ! sudo lpadmin
-p ${QueueName} \
280 -D "FollowMe print queue at NTNU" \
281 -L "Many locations" \
282 -v "${PrinterShare}" \
284 -o auth-info-required
="$AuthInfo" \
285 -u allow
:all
-E; then
286 printerror
"Could not connect to printer share. See above error for details."
289 if [ "${Plaintext}" != "YES" ]; then
290 # Add credentials to the keyring
291 if ! echo -n "${Password}" | secret-tool store \
292 --label "ipp://localhost:631/printers/$QueueName" \
293 uri
"ipp://localhost:631/printers/${QueueName}" \
294 user
"${Username}"; then
295 printerror
"Could not store credentials to the keyring, see above error for details. A workaround can be to use the option --plaintext"
301 if [ "${Uname}" = "darwin" ]; then
302 if ! sudo lpadmin
-p ${QueueName} \
303 -D "FollowMe print queue at NTNU" \
304 -L "Many locations" \
305 -v "smb://${PrintServer}/${PrintFile}" \
307 -o printer-is-shared
=false
-o printer-op-policy
=authenticated \
308 -u allow
:all
-E; then
309 printerror
"Could not connect to printer share. See above error for details."
313 sudo cupsenable
"${QueueName}"
314 sudo cupsaccept
"${QueueName}"
316 # Add credentials to the keychain if they are missing
317 # Shamelessly stolen^W^WBorrowed from https://github.com/Orakeltjenesten/scripts/blob/33abfb353524f449f0bbdee27adb2f1f0a9756a2/print/ntnuprint-mac.sh
318 # 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?
319 if ! security find-internet-password
-s ${PrintServer} >/dev
/null
2>&1; then
320 security
-v add-internet-password
-a "${Workgroup}\\${Username}" -s ${PrintServer} \
321 -w "${Password}" -D "Network Password
" -r "smb
" -l "${QueueName}" \
322 -T /System/Library/CoreServices/NetAuthAgent.app -T 'group://NetAuth' \
323 -T /System/Library/CoreServices/NetAuthAgent.app/Contents/MacOS/NetAuthSysAgent >/dev/null 2>&1
327 # Set correct paper size and enable the duplexer option
328 if ! sudo lpadmin -p ${QueueName} -o PageSize=A4 -o Option1=True; then
329 printerror "Could not
set default options on the print queue
${QueueName}. See above error
for details.
"
334 if ! sudo lpadmin -d ${QueueName}; then
335 printerror "Could not
set the print queue
${QueueName} as default printer. See above error
for details.
"
339 echo "Printer successfully installed.
"
341 if [ "${Uname}" = "linux
" ] && [ "${Plaintext}" != "YES
" ]; then
342 echo -e "\nPlease 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.
"