12-09-2022 06:19 PM - edited 12-09-2022 06:22 PM
This is the path I took to create a recurring scheduled Command in JumpCloud to install a printer to a group of macOS devices. If you're like me and were asked to programmatically add a printer using JumpCloud to your macOS machines, you quickly discover the built-in macOS programs lpadmin and lpstat. lpstat provides you with information on already installed printers and drivers. Whereas lpadmin can add, change, and remove printers. Learn more about both programs here https://www.cups.org/doc/admin.html
The printer we will be installing is called Printer XYZ and is at IP address 1.2.3.4. We also need drivers to be installed for Printer XYZ. After manually installing the latest driver, the driver location and name can be confirmed by navigating to /Library/Printers/PPDs/Contents/Resources/ then searched for the printer Brand and Model number. In this case I found Printer XYZ and dragged the printer driver into Terminal to grab the full path. Save this.
/Library/Printers/PPDs/Contents/Resources/Printer\ XYZ
Now we have enough information to start building out our script using lpadmin. -p is our printer name. -D is our queue name, but we are using it hear to make the printer name that appears in System Preferences -> Printers & Scanners more human readable. -v is where our printer is located at on the network. -P is the location of our printers drivers -o can be called numerous time to add options to your printer, but we're making sure the printer is not shared by this computer here. Lastly, -E enables the printer and finishes mapping it in macOS.
lpadmin -p Printer_XYZ -D "Printer XYZ" -v ipp://1.2.3.4/ipp/print -P /Library/Printers/PPDs/Contents/Resources/Printer\ XYZ -o printer-is-shared=false -E
In this example, I uploaded the driver package to Dropbox, but you could do this to any fileshare your organization may have such as an AWS S3 bucket. When you share the file from Dropbox, you want to replace the domain www.dropbox.com with dl.dropboxusercontent.com in order for it to work with curl consistently.
curl "https://dl.dropboxusercontent.com/s/XXXXX/Printer_Driver.pkg" --output /tmp/Printer_Driver.pkg
installer -pkg /tmp/Printer_Driver.pkg -target /
echo "Installing Printer"
sleep 30
rm /tmp/Printer_Driver.pkg
if lpstat -s | grep "1.2.3.4" ; then
echo "VERIFIED: Printer is installed"
else
echo "Printer not installed"
fi
if lpstat -s | grep "1.2.3.4" ; then
echo "VERIFIED: Printer is installed"
else
curl "https://dl.dropboxusercontent.com/s/XXXXX/Printer_Driver.pkg" --output /tmp/Printer_Driver.pkg
installer -pkg /tmp/Printer_Driver.pkg -target /
echo "Installing Printer"
sleep 30
rm /tmp/Printer_Driver.pkg
lpadmin -p Printer_XYZ -D "Printer XYZ" -v ipp://1.2.3.4/ipp/print -P /Library/Printers/PPDs/Contents/Resources/Printer\ XYZ -o printer-is-shared=false -E
fi
I would like to thank @BryanDalzell in the Slack Lounge for their help in tightening up the finished script by providing example code from their other App Install projects. This helped clarify for me how to best use of if, else, and fi statements to make this an ongoing Command.
New to the site? Take a look at these additional resources:
Ready to join us? You can register here.