sexta-feira, 12 de junho de 2015

Conectando sua impressora convencional ao Google Cloud Print com Raspberry PI e Debian

O Google Cloud Print é um serviço do Google que possibilita realizar impressão de documentos, fotos e outros tipos de arquivo utilizando a internet. Isso significa que você pode conectar suas impressoras em qualquer dispositivo compatível, como tablets e telefones, e realizar impressões diretamente deles. O mais bacana: é possível configurar tudo via software!

Neste post nós vamos aprender como configurar o Google Cloud Print no Linux, utilizando o Raspberry PI. O motivo de eu utilizar este equipamento é que ele pode ficar ligado o tempo todo, gastando bem menos energia do que um computador convencional. Além disso, o Pi pode ser usado para outras tarefas, como servir arquivos de mídia ou rodar alguns joguinhos, ou servir de equipamento de vigilância com câmera. Isso ficará para os próximos posts :)

Você vai precisar de:

  • Uma impressora
  • Um Raspberry PI (com Raspbian) ou um Computador (com Debian/Ubuntu)
  • Conhecimentos básicos de comandos do Linux
  • Uma conta do Google

Conecte o Pi à internet

Estou assumindo que você já possui o Pi funcional ou um computador com Linux. Eu recomendo usar no Pi o Raspbian e em um computador convencional o Debian.

O primeiro passo é ligar e acessar seu Raspberry, e conectá-lo com a sua rede de internet. Você pode ligar o Pi e conectar nele um teclado, e ligar ele na TV pela saída HDMI. Se você possui um Wifi USB, pode deixar a conexão sem fio, senão, pode conectá-lo via rede cabeada mesmo. Com ele na rede, você também pode usar um computador para conectar-se via SSH no Pi.

Importante: o seu Pi precisa estar conectado à internet, caso contrário o Cloud Print não vai funcionar.

Instale o software necessário

Importante: neste tutorial iremos executar diferentes comandos, como diferentes usuários: isso serve para garantir a adequada execução do Cloud Print Proxy. Eu vou assinalar os comandos a serem executados como o usuário padrão (geralmente pi) que possui o sudo habilitado, bem como os comandos que iremos executar com a conta dedicada ao Cloud Print (googlecloudprint). A parte em cinza serve apenas para isso, os comandos são apenas a parte em negrito.

Primeiro, faça um upgrade para obter as atualizações de segurança:

pi@pi$ sudo apt-get update && sudo apt-get upgrade

Em seguida, vamos instalar o Chromium, que é a versão do Google Chrome para o Debian, e o servidor de impressão chamado CUPS:

pi@pi$ sudo apt-get install chromium cups unzip
pi@pi$ sudo apt-get clean

Adicione sua Impressora ao Pi

Agora que temos o software necessário, vamos à configuração. Primeiro, vamos criar uma conta dedicada à impressão, chamaremos o usuário de googlecloudprint e vamos dar a ele acesso à gestão de impressoras, pelo grupo lpadmin.

Para isso, execute o comando abaixo e preencha os campos para criar o usuário. Você definirá um senha para este usuário que iremos precisar logo em seguida, tome nota da mesma e não deixe essa ser uma senha fraca.

pi@pi$ sudo adduser --ingroup lpadmin googlecloudprint

Agora, vamos configurar o CUPs para que possamos adicionar impressoras ao Pi, que serão depois configuradas como impressoras do Cloud Print. O CUPS possui uma interface web que permite gerenciar as impressoras, e nós vamos ativar esta interface web na rede local, assim podemos fazer a gestão das impressoras de outros computadores e o Pi não precisa ficar conectado a teclado ou monitor.

Para isso nós vamos editar o arquivo de configuração do CUPS que está na pasta /etc/cups:

pi@pi$ sudo nano /etc/cups/cupsd.conf

A primeira modificação é no parâmetro Listen, que está restrito ao próprio computador, e nós vamos modificar para não restringir apenas à maquina local. No arquivo, procure por:

# Only listen for connections from the local machine.
Listen localhost:631
Listen /var/run/cups/cups.sock

E modifique para:

# Only listen for connections from the local machine.
# Listen localhost:631
Listen /var/run/cups/cups.sock
Port 631

Agora, mais abaixo no mesmo arquivo, vamos ajustar as configurações de segurança. Procure pelas linhas abaixo, e inclua Allow @local, semelhante ao que está destacado em negrito:

< Location / >

# Restrict access to the server...
Order allow,deny
Allow @local
< /Location >

< Location /admin >
# Restrict access to the admin pages...
Order allow,deny
Allow @local
< /Location >

< Location /admin/conf >
AuthType Default
Require user @SYSTEM

# Restrict access to the configuration files...
Order allow,deny
Allow @local
< /Location >

Depois de salvar as alterações no arquivo (no nano, utilize CTRL+X depois Y ENTER), reinicie o CUPS:

pi@pi$ sudo service cups restart

Agora que está tudo configurado, tente acessar o CUPS pelo endereço IP do seu Raspberry, na porta 631, a partir de qualquer outro computador na rede ou mesmo de se seu smartphone, se ele estiver conectado à mesma rede que o Pi: https://ip-do-seu-raspberry:631/.  Dica: conecte-se via HTTPS, e confirme a exceção de segurança se o navegador exibir essa pergunta.

Uma vez conectado ao CUPS, clique em Administration:


E em seguida, no botão Add Printer:


O CUPS vai pedir uma usuário e senha. Informe o usuário e senha que criamos antereiormente: googlecloudprint. Escolha a impressora na lista. Você pode adicionar impressoras de rede que estiverem acessíveis ao Pi, ou a impressora conectada por USB. Em seguida, clique em Continue.

Informe um nome para sua impressora, sem espaços, informe uma descrição, que pode ter espaços, e uma localização, com "Casa" ou "Escritório". Clique em ContinueDica: ao marcar Share this printer, sua impressora ficará visível para outros computadores da rede local, assim você poderá utilizá-la como impressora de rede, mesmo sem o Cloud Print.

Escolha o modelo, normalmente ele estará pré-selecionado, dê um nome para ela e em seguida clique em Add Printer.

Pode ser que o CUPS exiba também uma página para configurar alguns valores padrão, como orientação de papel, etc. Faça as escolhas que julgar necessário e clique em Set Default Options.

Eu sugiro que você imprima uma página de testes via CUPS, só para ter certeza que está tudo OK e que o Pi consegue enviar a impressão corretamente.

Configure o serviço do Google Cloud Print

Agora, para por nossa impressora na núvem, vamos utilizar o Chromium. As etapas para configurar o Cloud Print em modo servidor podem ser obtidas na documentação oficial, mas eu traduzi e adicionei algumas etapas para a configuração ficar mais robusta.

Primeiro, vamos trocar de usuário para o que criamos anteriormente. Observe que no seu shell, o nome do usuário vai mudar de pi para googlecloudprint:

pi@pi$ sudo su googlecloudprint
googlecloudprint@pi$ cd ~/

Agora, faça o download do arquivo generate_cloudprint_config.py.zip:

googlecloudprint@pi$ wget http://www.google.com/support/enterprise/static/chromeos/docs/admin/en/generate_cloudprint_config.py.zip
googlecloudprint@pi$ unzip generate_cloudprint_config.py.zip
googlecloudprint@pi$ chmod +x generate_cloudprint_config.py

Agora, para concluir, nós vamos utilizar este script para configurar nossa conta do Google para nosso servidor de impressão:

googlecloudprint@pi$ ./generate_cloudprint_config.py

Dica: se você utiliza Two Factor Authentication, vai ter que definir uma Senha de Aplicativo para utilizar. Não se engane: ao por a sua senha do Google o script acima termina sem erros, mas não gera tokens de acesso.

Siga os passos apresentados pelo script. Informe seu usuário e senha do Google, ou senha de aplicativo se tiver two factor authentication ativo. A sua saída será algo mais ou menos assim:

Email Address: ******@gmail.com
Password for ******@gmail.com
Connector Id: raspberrypi
Printserver URL with port (keep empty to skip): http://localhost:631/
Config file raspberrypi.conf generated for proxy raspberrypi

É importante que você informe o nome do conector raspberrypi e a URL do servidor de impressão CUPS na configuração. Depois que o comando terminar, você terá um arquivo chamado raspberrypi.conf, que deve ser renomeado para Service State:

googlecloudprint@pi$ mv raspberrypi.conf 'Service State'

Agora, vamos criar um script de configuração para o serviço iniciar automaticamente quando ligarmos o Pi.

Dica: Você pode usar o comando: googlecloudprint@pi$  cat > google-cloud-print  e em seguida colar o conteúdo e pressionar CTRL+D para salvar. 

Salve o arquivo abaixo com o nome google-cloud-print na pasta /home/googlecloudprint:

#!/bin/bash

### BEGIN INIT INFO
# Provides:          google-cloud-print
# Required-Start:    $remote_fs $syslog $networking
# Required-Stop:     $remote_fs $syslog $networking
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Google Cloud Print Service
# Description:       This service launches a Google Cloud Print.
### END INIT INFO

export HOME="/home/googlecloudprint/"
unset DISPLAY

start_service() {
        echo "Starting service ..."
        cd $HOME
        start-stop-daemon --start \
                --chuid googlecloudprint \
                --chdir /home/googlecloudprint \
                --background --verbose \
                -x /usr/lib/chromium/chromium -- \
                        --type=service \
                        --enable-cloud-print-proxy \
                        --no-service-autorun \
                        --noerrdialogs \
                        --user-data-dir=/home/googlecloudprint/ \
                        --enable-logging --v=1
}

find_pid() {
        ps fax | grep enable-cloud-print-proxy |\
                grep -v grep | awk '{print $1}'
}

stop_service() {
        echo "Stopping service ..."
        PID="$(find_pid)"
        case "$PID" in
                [0-9]*)
                        echo "Killing $PID ..."
                        kill -9 $PID 2>/dev/null
                ;;
                *)
                        echo "Not running ..."
                ;;
        esac
}

case $1 in
        start)
                start_service
        ;;
        stop)
                stop_service
        ;;
        restart)
                stop_service
                start_service
        ;;
esac

Agora, vamos instalar este script que criamos como um serviço no sistema:

googlecloudprint@pi$ chmod +x google-cloud-print
googlecloudprint@pi$ exit #para retornar ao usuário que possui acesso sudo (pi no meu caso)
pi@pi$ sudo ln -s /home/googlecloudprint/google-cloud-print /etc/init.d/google-cloud-print
pi@pi$ sudo update-rc.d google-cloud-print defaults
pi@pi$ sudo service google-cloud-print start

Agora, navegue até a página do Google Cloud Print e confirme se a impressora está disponível e online:


Veja nos detalhes avançados da impressora, e note que o campo Proxy será o mesmo nome que definimos em nossa configuração.

Prontinho, agora você pode enviar trabalhos de impressão a partir de qualquer programa ou equipamento compatível com o Google Cloud Print, e eles são encaminhados à sua impressora via internet.

Happy hacking!