Tiskový server z Raspberry Pi přes Google Cloud Print

raspberry_pi_logoJakákoli tiskárna podporovaná v Linuxu (CUPS) se může snadno stát síťovou tiskárnou dostupnou z celého internetu, pokud se připojí na Raspberry Pi (2). Podařilo se mi takto propojit obě domácí USB tiskárny do Google Cloud Print. Výhodou Cloud Print oproti běžnému nasdílení tiskáren přes SAMBA a nebo CUPS je to, že pak na těchto tiskárnách jde tisknout snadno i z Android telefonů a tabletů.

Takže co na to potřebujeme?

  • Raspbery Pi s Raspbianem, připojené úspěšně do sítě
  • nainstalovat CUPS a Chromium (mám Raspberry Pi 2 s 1 GB RAM, kde mám i plnohodnotný X server, nevím jak to bude fungovat u RPi 1 co má jen polovinu RAM nebo dokonce (RPi 1 model A) čtvrtinu RAM.
    sudo apt-get install cups chromium
  • V případě některých tiskáren je krom samotného CUPS tiskového serveru potřeba i další ovladače u HP doporučuji hplip, u Epsonu gutenprint, jiné tiskárny nemám a neznám
    sudo apt-get install hplip cups-driver-gutenprint
  • Nainstalujeme regulérně místní (USB) tiskárny přes CUPS (http://ip.adresa.raspberry:631)
  • Na účtu Google, zejména používáme-li dvoufaktorové přihlášení, si vygenerujeme „heslo aplikace“ a to potom použijeme u skriptu od googlu místo normálního hesla
  • stáhneme si od googlu skript, přes chmod mu nastavíme spustitelnost a zadáme mu svou gmailovou adresu, heslo aplikace, libovolný identifikátor a pole pro server necháme prázdné. Vytvoříme adresář v /etc (mkdir -p /etc/cloudprint) a přesuneme vytvořený konfigurační soubor (pojmenovaný podle námi zvoleného identifikátoru) (mv connector_id.conf "/etc/cloudprint/Service State")
  • Dále si můžeme buď  vystačit s návodem poskytnutým Googlem jak spustit chromium ručně na https://support.google.com/a/answer/2906017?hl=en, což sice fungovat bude (změníme-li cestu z chromu na chromium), ale doporučuji to raději celé udělat jako službu, co se sama bude spouštět po startu RPi – to popisuje tenhle návod, ze kterého tu vlastně jednotlivé fragmenty vykrádám: http://blog.rebeiro.net/2012/12/google-cloud-print-daemon-for-ubuntu.html a funguje i pro Raspberry Pi s Raspbianem, jen s tou výjimkou, že potřebujeme v tom spouštěcím souboru změnit cestu DAEMON z Google Chromu na Chromium:
    # DAEMON=/opt/google/chrome/chrome
    DAEMON=/usr/bin/chromium

A to je všechno, na https://www.google.com/cloudprint?user=0#printers pak lze zkontrolovat, že se objevily nové tiskárny a třeba na tabletu nabo telefonu lze zkusit vytisknout na některé takové tiskárně nějaké PDFko.

googlecloudprint-seznamtiskaren

 

Takhle to vypadá u mě – Raspberry Pi 2 je ta mrňavá černá krabička, co stojí na tom větším černém NASu. NAS ani ten vedlejší stříbrný disk tam být pro funkčnost nemusí :-)

rpi-cloudprint_punkisnotdead

Dodatek: upravený spouštěcí soubor /etc/init.d/cloudprintproxy

  • je nutné mu nastavit spustitelnost (sudo chmod +x /etc/init.d/cloudprintproxy)
  • a případně nastavit automatický start (sudo update-rc.d cloudprintproxy defaults)
#!/bin/sh
### BEGIN INIT INFO
# Provides:          cloudprintproxy
# Required-Start:    cups $network $syslog
# Required-Stop:     cups $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Google Cloud Print Proxy
# Description:       Starts a Google Cloud Print Proxy
### END INIT INFO

# Author: Jeff Rebeiro <jeff@rebeiro.net>
# Modification for Chromium: Martin Malec <martin@brozkeff.net>

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Google Cloud Print Proxy"
NAME=cloudprintproxy
#DAEMON=/opt/google/chrome/chrome
DAEMON=/usr/bin/chromium
DAEMON_ARGS="--type=service --enable-cloud-print-proxy --no-service-autorun --noerrdialogs --user-data-dir=/etc/cloudprint/"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Exit if the Cloud Print configuration is not present
[ -r "/etc/cloudprint/Service State" ] || exit 0

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
 # Return
 #   0 if daemon has been started
 #   1 if daemon was already running
 #   2 if daemon could not be started

 # Ensure CUPS is running
 lpstat &> /dev/null || return 2

 # Test if daemon is already running
 start-stop-daemon --start --quiet --pidfile $PIDFILE -m --exec $DAEMON --test > /dev/null \
  || return 1

 # Start daemon
 start-stop-daemon --start --quiet --pidfile $PIDFILE -m -b --exec $DAEMON -- \
  $DAEMON_ARGS \
  || return 2
}

#
# Function that stops the daemon/service
#
do_stop()
{
 # Return
 #   0 if daemon has been stopped
 #   1 if daemon was already stopped
 #   2 if daemon could not be stopped
 #   other if a failure occurred
 start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
 RETVAL="$?"
 [ "$RETVAL" = 2 ] && return 2
 # Wait for children to finish too if this is a daemon that forks
 # and if the daemon is only ever run from this initscript.
 # If the above conditions are not satisfied then add some other code
 # that waits for the process to drop all resources that could be
 # needed by services started subsequently.  A last resort is to
 # sleep for some time.
 start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
 [ "$?" = 2 ] && return 2
 # Many daemons don't delete their pidfiles when they exit.
 rm -f $PIDFILE
 return "$RETVAL"
}

case "$1" in
  start)
 [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
 do_start
 case "$?" in
  0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
  2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
 esac
 ;;
  stop)
 [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
 do_stop
 case "$?" in
  0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
  2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
 esac
 ;;
  status)
       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  restart)
 log_daemon_msg "Restarting $DESC" "$NAME"
 do_stop
 case "$?" in
   0|1)
  do_start
  case "$?" in
   0) log_end_msg 0 ;;
   1) log_end_msg 1 ;; # Old process is still running
   *) log_end_msg 1 ;; # Failed to start
  esac
  ;;
   *)
    # Failed to stop
  log_end_msg 1
  ;;
 esac
 ;;
  *)
 echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
 exit 3
 ;;
esac

:

Autor

Martin

Pracuji jako ajťák a grafik na volné noze, zejména ale pro brněnskou firmičku vyrábějící ekodrogerii. Dále působím v brněnském systému místní směny Rozleťse, Českém zahrádkářském svazu, České psychedelické společnosti, spolku Archetypal a Mezinárodní komunitě dzogčhenu. Asi mě baví kumulovat různé funkce a přidávat si spoustu práce. Lidi o mě říkají, že jsem multifunkční, což je asi trochu pravda :-)

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *