123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- #!/bin/bash
- ##################################################
- #Version 3.3 updated on September 13, 2019
- #http://help.ubuntu.ru/wiki/canon_capt
- #http://forum.ubuntu.ru/index.php?topic=189049.0
- #Translated into English and modified by @hieplpvip
- ##################################################
- #Check if we are running as root
- [ $USER != 'root' ] && exec sudo "$0"
- #Current user
- LOGIN_USER=$(logname)
- [ -z "$LOGIN_USER" ] && LOGIN_USER=$(who | head -1 | awk '{print $1}')
- #Load the file containing the path to the desktop
- if [ -f ~/.config/user-dirs.dirs ]; then
- source ~/.config/user-dirs.dirs
- else
- XDG_DESKTOP_DIR="$HOME/Desktop"
- fi
- #Driver version
- DRIVER_VERSION='2.71-1'
- DRIVER_VERSION_COMMON='3.21-1'
- #Links to driver packages
- declare -A URL_DRIVER=([amd64_common]='https://github.com/hieplpvip/canon_printer/raw/master/Packages/cndrvcups-common_3.21-1_amd64.deb' \
- [amd64_capt]='https://github.com/hieplpvip/canon_printer/raw/master/Packages/cndrvcups-capt_2.71-1_amd64.deb' \
- [i386_common]='https://github.com/hieplpvip/canon_printer/raw/master/Packages/cndrvcups-common_3.21-1_i386.deb' \
- [i386_capt]='https://github.com/hieplpvip/canon_printer/raw/master/Packages/cndrvcups-capt_2.71-1_i386.deb')
- #Links to autoshutdowntool
- declare -A URL_ASDT=([amd64]='https://github.com/hieplpvip/canon_printer/raw/master/Packages/autoshutdowntool_1.00-1_amd64_deb.tar.gz' \
- [i386]='https://github.com/hieplpvip/canon_printer/raw/master/Packages/autoshutdowntool_1.00-1_i386_deb.tar.gz')
- #ppd files and printer models mapping
- declare -A LASERSHOT=([LBP-810]=1120 [LBP1120]=1120 [LBP1210]=1210 \
- [LBP2900]=2900 [LBP3000]=3000 [LBP3010]=3050 [LBP3018]=3050 [LBP3050]=3050 \
- [LBP3100]=3150 [LBP3108]=3150 [LBP3150]=3150 [LBP3200]=3200 [LBP3210]=3210 \
- [LBP3250]=3250 [LBP3300]=3300 [LBP3310]=3310 [LBP3500]=3500 [LBP5000]=5000 \
- [LBP5050]=5050 [LBP5100]=5100 [LBP5300]=5300 [LBP6000]=6018 [LBP6018]=6018 \
- [LBP6020]=6020 [LBP6020B]=6020 [LBP6200]=6200 [LBP6300n]=6300n [LBP6300]=6300 \
- [LBP6310]=6310 [LBP7010C]=7018C [LBP7018C]=7018C [LBP7200C]=7200C [LBP7210C]=7210C \
- [LBP9100C]=9100C [LBP9200C]=9200C)
- #Sort printer names
- NAMESPRINTERS=$(echo "${!LASERSHOT[@]}" | tr ' ' '\n' | sort -n -k1.4)
- #Models supported by autoshutdowntool
- declare -A ASDT_SUPPORTED_MODELS=([LBP6020]='MTNA002001 MTNA999999' \
- [LBP6020B]='MTMA002001 MTMA999999' [LBP6200]='MTPA00001 MTPA99999' \
- [LBP6310]='MTLA002001 MTLA999999' [LBP7010C]='MTQA00001 MTQA99999' \
- [LBP7018C]='MTRA00001 MTRA99999' [LBP7210C]='MTKA002001 MTKA999999')
- #OS architecture
- if [ "$(uname -m)" == 'x86_64' ]; then
- ARCH='amd64'
- else
- ARCH='i386'
- fi
- #Determine the init system
- if [[ $(ps -p1 | grep systemd) ]]; then
- INIT_SYSTEM='systemd'
- else
- INIT_SYSTEM='upstart'
- fi
- #Move to the current directory
- cd "$(dirname "$0")"
- function valid_ip() {
- local ip=$1
- local stat=1
- if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
- ip=($(echo "$ip" | tr '.' ' '))
- [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
- stat=$?
- fi
- return $stat
- }
- function check_error() {
- if [ $2 -ne 0 ]; then
- case $1 in
- 'WGET') echo "Error while downloading file $3"
- [ -n "$3" ] && [ -f "$3" ] && rm "$3";;
- 'PACKAGE') echo "Error installing package $3";;
- *) echo 'Error';;
- esac
- echo 'Press any key to exit'
- read -s -n1
- exit 1
- fi
- }
- function canon_uninstall() {
- if [ -f /usr/sbin/ccpdadmin ]; then
- installed_model=$(ccpdadmin | grep LBP | awk '{print $3}')
- if [ -n "$installed_model" ]; then
- echo "Found printer $installed_model"
- echo "Closing captstatusui"
- killall captstatusui 2> /dev/null
- echo 'Stopping ccpd'
- service ccpd stop
- echo 'Removing the printer from the ccpd daemon configuration file'
- ccpdadmin -x $installed_model
- echo 'Removing the printer from CUPS'
- lpadmin -x $installed_model
- fi
- fi
- echo 'Removing driver packages'
- dpkg --purge cndrvcups-capt
- dpkg --purge cndrvcups-common
- echo 'Removing unused libraries and packages'
- apt-get -y autoremove
- echo 'Deleting settings'
- [ -f /etc/init/ccpd-start.conf ] && rm /etc/init/ccpd-start.conf
- [ -f /etc/udev/rules.d/85-canon-capt.rules ] && rm /etc/udev/rules.d/85-canon-capt.rules
- [ -f "${XDG_DESKTOP_DIR}/captstatusui.desktop" ] && rm "${XDG_DESKTOP_DIR}/captstatusui.desktop"
- [ -f /usr/bin/autoshutdowntool ] && rm /usr/bin/autoshutdowntool
- [ $INIT_SYSTEM == 'systemd' ] && update-rc.d -f ccpd remove
- echo 'Uninstall completed'
- echo 'Press any key to exit'
- read -s -n1
- return 0
- }
- function canon_install() {
- echo
- PS3='Please choose your printer: '
- select NAMEPRINTER in $NAMESPRINTERS
- do
- [ -n "$NAMEPRINTER" ] && break
- done
- echo "Selected printer: $NAMEPRINTER"
- echo
- PS3='How is the printer connected to the computer: '
- select CONECTION in 'Via USB' 'Through network (LAN, NET)'
- do
- if [ "$REPLY" == "1" ]; then
- CONECTION="usb"
- while true
- do
- #Looking for a device connected to the USB port
- NODE_DEVICE=$(ls -1t /dev/usb/lp* 2> /dev/null | head -1)
- if [ -n "$NODE_DEVICE" ]; then
- #Find the serial number of that device
- PRINTER_SERIAL=$(udevadm info --attribute-walk --name=$NODE_DEVICE | sed '/./{H;$!d;};x;/ATTRS{product}=="Canon CAPT USB \(Device\|Printer\)"/!d;' | awk -F'==' '/ATTRS{serial}/{print $2}')
- #If the serial number is found, that device is a Canon printer
- [ -n "$PRINTER_SERIAL" ] && break
- fi
- echo -ne "Turn on the printer and plug in USB cable\r"
- sleep 2
- done
- PATH_DEVICE="/dev/canon$NAMEPRINTER"
- break
- elif [ "$REPLY" == "2" ]; then
- CONECTION="lan"
- read -p 'Enter the IP address of the printer: ' IP_ADDRES
- until valid_ip "$IP_ADDRES"
- do
- echo 'Invalid IP address format, enter four decimal numbers'
- echo -n 'from 0 to 255, separated by dots: '
- read IP_ADDRES
- done
- PATH_DEVICE="net:$IP_ADDRES"
- echo 'Turn on the printer and press any key'
- read -s -n1
- sleep 5
- break
- fi
- done
- echo '************Driver Installation************'
- COMMON_FILE=cndrvcups-common_${DRIVER_VERSION_COMMON}_${ARCH}.deb
- CAPT_FILE=cndrvcups-capt_${DRIVER_VERSION}_${ARCH}.deb
- if [ ! -f $COMMON_FILE ]; then
- sudo -u $LOGIN_USER wget -O $COMMON_FILE ${URL_DRIVER[${ARCH}_common]}
- check_error WGET $? $COMMON_FILE
- fi
- if [ ! -f $CAPT_FILE ]; then
- sudo -u $LOGIN_USER wget -O $CAPT_FILE ${URL_DRIVER[${ARCH}_capt]}
- check_error WGET $? $CAPT_FILE
- fi
- apt-get -y update
- apt-get -y install libglade2-0 libcanberra-gtk-module
- check_error PACKAGE $?
- echo 'Installing common module for CUPS driver'
- dpkg -i $COMMON_FILE
- check_error PACKAGE $? $COMMON_FILE
- echo 'Installing CAPT Printer Driver Module'
- dpkg -i $CAPT_FILE
- check_error PACKAGE $? $CAPT_FILE
- #Replace /etc/init.d/ccpd
- echo '#!/bin/bash
- # startup script for Canon Printer Daemon for CUPS (ccpd)
- ### BEGIN INIT INFO
- # Provides: ccpd
- # Required-Start: $local_fs $remote_fs $syslog $network $named
- # Should-Start: $ALL
- # Required-Stop: $syslog $remote_fs
- # Default-Start: 2 3 4 5
- # Default-Stop: 0 1 6
- # Description: Start Canon Printer Daemon for CUPS
- ### END INIT INFO
- # If the CUPS print server is not running, wait until it starts
- if [ `ps awx | grep cupsd | grep -v grep | wc -l` -eq 0 ]; then
- while [ `ps awx | grep cupsd | grep -v grep | wc -l` -eq 0 ]
- do
- sleep 3
- done
- sleep 5
- fi
- ccpd_start ()
- {
- echo -n "Starting ${DAEMON}: "
- start-stop-daemon --start --quiet --oknodo --exec ${DAEMON}
- }
- ccpd_stop ()
- {
- echo -n "Shutting down ${DAEMON}: "
- start-stop-daemon --stop --quiet --oknodo --retry TERM/30/KILL/5 --exec ${DAEMON}
- }
- DAEMON=/usr/sbin/ccpd
- case $1 in
- start)
- ccpd_start
- ;;
- stop)
- ccpd_stop
- ;;
- status)
- echo "${DAEMON}:" $(pidof ${DAEMON})
- ;;
- restart)
- while true
- do
- ccpd_stop
- ccpd_start
- # if the ccpd process does not appear after 5 seconds, we restart it again
- for (( i = 1 ; i <= 5 ; i++ ))
- do
- sleep 1
- set -- $(pidof ${DAEMON})
- [ -n "$1" -a -n "$2" ] && exit 0
- done
- done
- ;;
- *)
- echo "Usage: ccpd {start|stop|status|restart}"
- exit 1
- ;;
- esac
- exit 0' > /etc/init.d/ccpd
- #Installation utilities for managing AppArmor
- apt-get -y install apparmor-utils
- #Set AppArmor security profile for cupsd to complain mode
- aa-complain /usr/sbin/cupsd
- echo 'Restarting CUPS'
- service cups restart
- if [ $ARCH == 'amd64' ]; then
- echo 'Installing 32-bit libraries required to run 64-bit printer driver'
- apt-get -y install libatk1.0-0:i386 libcairo2:i386 libgtk2.0-0:i386 libpango1.0-0:i386 libstdc++6:i386 libpopt0:i386 libxml2:i386 libc6:i386
- check_error PACKAGE $?
- fi
- echo 'Installing the printer in CUPS'
- /usr/sbin/lpadmin -p $NAMEPRINTER -P /usr/share/cups/model/CNCUPSLBP${LASERSHOT[$NAMEPRINTER]}CAPTK.ppd -v ccp://localhost:59687 -E
- echo "Setting $NAMEPRINTER as the default printer"
- /usr/sbin/lpadmin -d $NAMEPRINTER
- echo 'Registering the printer in the ccpd daemon configuration file'
- /usr/sbin/ccpdadmin -p $NAMEPRINTER -o $PATH_DEVICE
- #Verify printer installation
- installed_printer=$(ccpdadmin | grep $NAMEPRINTER | awk '{print $3}')
- if [ -n "$installed_printer" ]; then
- if [ "$CONECTION" == "usb" ]; then
- echo 'Creating a rule for the printer'
- #A rule is created to provides an alternative name (a symbolic link) to our printer so as not to depend on the changing values of lp0, lp1,...
- echo 'KERNEL=="lp[0-9]*", SUBSYSTEMS=="usb", ATTRS{serial}=='$PRINTER_SERIAL', SYMLINK+="canon'$NAMEPRINTER'"' > /etc/udev/rules.d/85-canon-capt.rules
- #Update the rules
- udevadm control --reload-rules
- #Check the created rule
- until [ -e $PATH_DEVICE ]
- do
- echo -ne "Turn off the printer, wait 2 seconds, then turn on the printer\r"
- sleep 2
- done
- fi
- echo -e "\e[2KRunning ccpd"
- service ccpd restart
- #Autoload ccpd
- if [ $INIT_SYSTEM == 'systemd' ]; then
- update-rc.d ccpd defaults
- else
- echo 'description "Canon Printer Daemon for CUPS (ccpd)"
- author "LinuxMania <customer@linuxmania.jp>"
- start on (started cups and runlevel [2345])
- stop on runlevel [016]
- expect fork
- respawn
- exec /usr/sbin/ccpd start' > /etc/init/ccpd-start.conf
- fi
- #Create captstatusui shortcut on desktop
- echo '#!/usr/bin/env xdg-open
- [Desktop Entry]
- Version=1.0
- Name='$NAMEPRINTER'
- GenericName=Status monitor for Canon CAPT Printer
- Exec=captstatusui -P '$NAMEPRINTER'
- Terminal=false
- Type=Application
- Icon=/usr/share/icons/Humanity/devices/48/printer.svg' > "${XDG_DESKTOP_DIR}/$NAMEPRINTER.desktop"
- chmod 775 "${XDG_DESKTOP_DIR}/$NAMEPRINTER.desktop"
- chown $LOGIN_USER:$LOGIN_USER "${XDG_DESKTOP_DIR}/$NAMEPRINTER.desktop"
- #Install autoshutdowntool for supported models
- if [[ "${!ASDT_SUPPORTED_MODELS[@]}" =~ "$NAMEPRINTER" ]]; then
- SERIALRANGE=(${ASDT_SUPPORTED_MODELS[$NAMEPRINTER]})
- SERIALMIN=${SERIALRANGE[0]}
- SERIALMAX=${SERIALRANGE[1]}
- if [[ ${#PRINTER_SERIAL} -eq ${#SERIALMIN} && $PRINTER_SERIAL > $SERIALMIN && $PRINTER_SERIAL < $SERIALMAX || $PRINTER_SERIAL == $SERIALMIN || $PRINTER_SERIAL == $SERIALMAX ]]; then
- echo "Installing the autoshutdowntool utility"
- ASDT_FILE=autoshutdowntool_1.00-1_${ARCH}_deb.tar.gz
- if [ ! -f $ASDT_FILE ]; then
- wget -O $ASDT_FILE ${URL_ASDT[$ARCH]}
- check_error WGET $? $ASDT_FILE
- fi
- tar --gzip --extract --file=$ASDT_FILE --totals --directory=/usr/bin
- fi
- fi
- #Start captstatusui
- if [[ -n "$DISPLAY" ]] ; then
- sudo -u $LOGIN_USER nohup captstatusui -P $NAMEPRINTER > /dev/null 2>&1 &
- sleep 5
- fi
- echo 'Installation completed. Press any key to exit'
- read -s -n1
- exit 0
- else
- echo 'Driver for $NAMEPRINTER is not installed!'
- echo 'Press any key to exit'
- read -s -n1
- exit 1
- fi
- }
- function canon_help {
- clear
- echo 'Installation Notes
- If you have already installed driver for this series,
- uninstall it before using this script.
- If the driver packages are not found, they will be automatically
- downloaded from the Internet and saved in the script folder.
- To update the driver, first uninstall the old version using this script,
- then install a new one.
- Notes on printing problems:
- If the printer stops printing, run captstatusui via the shortcut
- on desktop or from terminal: captstatusui -P <printer_name>
- The captstatusui window shows the current status of the printer.
- If an error occurs, its description is displayed.
- Here you can try pressing button "Resume Job" to continue printing
- or "Cancel Job" button to cancel the job.
- If this does not help, try running canon_restart.sh
- Printer configuration command: cngplp
- Additional settings command: captstatusui -P <printer_name>
- Turn on auto-off (not for all models): autoshutdowntool
- To log the installation process, run the script like this:
- logsave log.txt ./canon_lbp_setup.sh
- '
- }
- clear
- echo 'Installing the Linux CAPT Printer Driver v'${DRIVER_VERSION}' for Canon LBP printers on Ubuntu (both 32-bit and 64-bit)
- Supported printers:'
- echo "$NAMESPRINTERS" | sed ':a; /$/N; s/\n/, /; ta' | fold -s
- PS3='Please enter your choice: '
- select opt in 'Install' 'Uninstall' 'Help' 'Exit'
- do
- if [ "$opt" == 'Install' ]; then
- canon_install
- break
- elif [ "$opt" == 'Uninstall' ]; then
- canon_uninstall
- break
- elif [ "$opt" == 'Help' ]; then
- canon_help
- elif [ "$opt" == 'Exit' ]; then
- break
- fi
- done
|