Browse Source

update printer

BuildTools 2 years ago
parent
commit
b53e9be797
1 changed files with 397 additions and 0 deletions
  1. 397 0
      options/tools/canon_lbp_setup.sh

+ 397 - 0
options/tools/canon_lbp_setup.sh

@@ -0,0 +1,397 @@
+#!/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