Jaká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.
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í :-)
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 :