domingo, 30 de outubro de 2016

Raspberry Pi - Imagem a Preto e Branco com RCA

Nada melhor para tentar dar vida a um velho "aquário" Grundig de 35cm que não se ligava há anos e colocá-lo como display de um Raspberry Pi para entreter petizes.


Problema: A televisão apenas tem entrada SCART e a saída analógica do Raspberry Pi é RCA... Existem vários adaptadores SCART para RCA [1], mas neste processo acontecia magia...

Verificar tudo:
Rpi » RCA>SCART  » "Aquário" - Imagem a Preto e Branco...
Rpi » RCA>SCART  » TV Recente - Imagem a Cores

Conclusão, o SCART da TV velha deixou de dar a cores, mas...
Box TV » SCART » "Aquário" - Imagem a Cores

Parece que o problema reside na forma como o Raspberry Pi envia os sinais de vídeo composto (RCA) que por defeito é NTSC e o "aquário" apenas suporta PAL (daí funcionar na TV Recente). [2] e [3]

Assim, é necessário aceder ao ficheiro config.txt localizado na partição de arranque (boot) do cartão e descomentar ou adicionar a linha:
sdtv_mode=2

Os modos sdtv suportados são:  0 NTSC, 1 NTSC Japão, 2 PAL, 3 PAL Brasil.


[1] - Adaptadores SCART/RCA no Aliexpress
[2] - https://www.raspberrypi.org/forums/viewtopic.php?f=26&t=17074
[3] - http://elinux.org/R-Pi_Troubleshooting#Composite_displays_only_black_and_white_image

sábado, 22 de outubro de 2016

Servidor de Impressão Raspberry Pi

Utilização de um Raspberry Pi 2B como servidor de impressão de uma impressora HP Deskjet 1510 PSC (Print Scan Copy).

A partir de uma imagem Raspbian Jessie Lite é possível configurar todo o sistema remotamente por SSH e browser.

Há muitas informações úteis na página do projeto debian [1] permitem perceber melhor o funcionamento.

Instalação e Configuração do CUPS

sudo apt-get install cups hplip

Para configuração remota via web é necessário ativar o acesso à interface web através da alteração da configuração Listen e acrescentar os endereços que têm acesso à mesma (neste caso a rede 192.168.0.*):
sudo nano /etc/cups/cupsd.conf
(...)
ServerAlias *
Listen *:631
(...)
# Restrict access to the server...
<Location />
  Order allow,deny
  Allow 192.168.0.*
</Location>

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

Atualização: A diretiva ServerAlias * permite aceder ao servidor CUPS através do IP ou do nome.

Por defeito o CUPS permite a autenticação a utilizadores do SystemGroup [2] e o utilizador pi não pertence a nenhum destes grupos.

Adicionar pi ao grupo lpadmin.
sudo usermod -a -G lpadmin pi

Para confirmar os grupos do utilizador:
groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users input netdev spi i2c gpio lpadmin

Para reiniciar o serviço após alterações às configurações é necessário:
sudo systemctl restart cups.service 

A partir daqui é possível configurar uma nova impressora via browser acedendo a:
http://raspberrypi:631

Ao adicionar uma impressora é reconhecida a impressora e de seguida é necessário escolher o driver da lista muito numerosa, neste caso:
HP PSC 1510 Series, hpcups 3.14.6

É necessário ativar a partilha da impressora aquando da instalação ou então mais tarde na configuração CUPS (Share printers connected to this system)

A partir daqui qualquer máquina na rede com o CUPS (normalmente qualquer Linux com sistema de impressão, por exemplo, ubuntu, Mint, etc) vai ver a impressora sem ser necessário qualquer instalação.

Resolução de Problemas

1. Ao aceder através do nome do servidor na porta 631 dá erro Bad Request
É necessário utilizar a diretiva ServerAlias *, que permite aceder ao servidor CUPS através do IP ou do nome.

2. Quando se manda imprimir o trabalho não é enviado
Confirmar se a impressora não está parada ou com erro através da página de administração: https://raspberrypi:631/printers

3. Debug
Pode ajudar alterar a diretiva LogLevel de warn para debug de forma a ter mais detalhes nos logs:
sudo less /var/log/cups/error_log

Referências

quinta-feira, 20 de outubro de 2016

Kodi e CEC - Debug e alteração de teclas do comando

Com um Raspberry Pi a correr o OpenELEC, o KODI reconhece o CEC enviado pela televisão. Contudo, não há qualquer tecla no comando que faça voltar para atrás, o que traz alguns inconvenientes na interação com o KODI.

Uma forma para fazer isso trata-se em colocar uma reafetação de inputs do CEC de forma a verificar o que está a ser pressionado, se está bem, se há outras teclas, etc. Foi o que descobri no blog de Steven Occhipinti [0].

É necessário ter acesso à pasta ~/.kodi/userdata/keymaps/ e aí colocar o ficheiro remote.xml [1] que permite fazer o debug e reiniciar o openelec.

Por SSH (a senha de root é openelec)
ssh root@openelecIP
cd ~/.kodi/userdata/keymaps/

wget https://gist.github.com/stevenocchipinti/42f2eca2a9f04ed9e52f/raw/d9fbf3c20edbff85d71b99b47d202d8a0ab1a8d9/remote.xml
reboot

Ao arrancar, de cada vez que se pressionar uma tecla aparece uma notificação indicando que ação foi desencadeada.

No meu caso todas as teclas que funcionam estão corretas e não há qualquer tecla nova. No entanto, reparei que quando pressionava rapidamente tecla verde e tecla amarela, aparecia a ação Title.
Como esta ação não serve para muito, poderia utilizar esta forma para ativar a ação Back que permite voltar para trás e dá muito jeito na interação com o kodi.

Assim, para reafetar a ação da tecla Title, resta copiar um remote.xml original, encontrar a ação Title e trocar para Back.

Por SSH:
ssh root@openelecIP
cd ~/.kodi/userdata/keymaps/

cp /usr/share/kodi/system/keymaps/remote.xml .
nano remote.xml
(...)
      <rootmenu>PreviousMenu</rootmenu>
      <title>Back</title>

      <info>Info</info>
(...)

É possível então alterar todas as entradas da ação Title para que faça execute Back.
No nano para procurar CTRL+W e pode procurar-se por <title> e ir substituindo.

Após guardar e reiniciar, a conjugação de teclas verde/amarela passou a funcionar como o voltar para trás, permitindo voltar ao menu principal, por exemplo.


[0] - http://blog.stevenocchipinti.com/2015/04/04/configuring-a-hdmi-cec-remote-in-kodi/
[1] - remote.xml - https://gist.github.com/stevenocchipinti/42f2eca2a9f04ed9e52f

quinta-feira, 21 de julho de 2016

COPS | Disponibilização web de uma biblioteca do Calibre

Com a crescente digitalização dos mais diversos livros e consequente disponibilização gratuita de muitas obras no domínio público, torna-se interessante a possibilidade de ter um acesso prático e fácil a um acervo digital deste tipo.

O software Calibre [1] permite gerir uma biblioteca digital de forma muito fácil, fornecendo mecanismos rápidos para a organização e catalogação da mesma. Aceita diversos tipos de ficheiros incluindo os mais que comuns EPUB e PDF.
Resta acrescentar que é um projeto open source e que está disponível para "todos" os sistemas operativos.

O Calibre possui um diretório de trabalho onde fica registada toda a informação referente à Biblioteca Digital.

O projeto COPS [2] foi desenvolvido pelo Sébastien Lucas e permite fazer com que um servidor web com PHP possa disponibilizar de forma rápida e acessível a biblioteca digital criada pelo Calibre.

0. Pré-Requisitos

A instalação será feita num servidor ubuntu 16.04 LTS com apache2 e php com algumas extensões instaladas.

apt-get install apache2 php php-gd php-sqlite3 php-json php-intl php-xml

Deverá ser feita a criação de uma biblioteca digital com o Calibre e ter acesso à mesma.

1. Instalação do COPS

Deve obter-se o ZIP com o código do COPS disponível aqui cops-1.0.0.zip e extrair-se na pasta do webserver.

cd /var/www/html
wget https://github.com/seblucas/cops/releases/download/1.0.0/cops-1.0.0.zip
unzip cops-1.0.0.zip

Para facilitar pode renomear-se o diretório:
mv cops-1.0.0 cops

A partir de agora é possível aceder a:
http://servidor/cops

2. Configuração do COPS

Deve abrir-se o ficheiro de configuração config_default.php e alterar o necessário, com especial atenção:
  • $config['calibre_directory'] = 'ebooks/'; // deve ter o caminho para os ficheiros, neste caso ebooks.
  • $config['cops_full_url'] = 'http://servidor/cops'; // deve ter o endereço completo do servidor COPS
  • $config['cops_title_default'] = "Biblioteca Digital"; // nome que é apresentado na biblioteca digital
  • $config['cops_language'] = 'pt_PT'; // para ficar com a interface em Português

3. Disponibilização da Biblioteca

Falta apenas enviar a biblioteca digital criada pelo Calibre para o servidor, que pode ser feita recorrendo a diversos métodos (FTP, SFTP, rsync, etc), tendo o cuidado de deixar todos os ficheiros no diretório ebooks (configurado anteriormente).

A partir deste momento toda Biblioteca Digital estará disponível num browser à distâncias de uns cliques:
http://servidor/cops

Referências

[1] - https://calibre-ebook.com/
[2] - http://blog.slucas.fr/en/oss/calibre-opds-php-server

terça-feira, 19 de julho de 2016

rsync | Backups automáticos com rsync por SSH

Servidor RSYNC

Neste exemplo utiliza-se um servidor ubuntu 16.04 LTS mas esta configuração deve funcionar para qualquer outra distribuição Linux com as devidas alterações.
Foi criado um utilizador designado utilizador.

0. Instalação
apt-get install rsync

É possível criar um local de trabalho, neste caso /srv/BACKUP
mkdir /srv/BACKUP
chown utilizador:utilizador -R /srv/BACKUP

1. Configuração
O ficheiro de configuração é /etc/rsyncd.conf e um exemplo simples:
uid = utilizador
gid = utilizador
socket options = SO_KEEPALIVE

[BACKUP]
    path = /srv/BACKUP
    comment = Backup [500GB]
    read only = false
    auth users = utilizador


Após a configuração é necessário ativar o modo de serviço (daemon) do rsync:
nano /etc/default/rsync
Deve descomentar-se a linha (remover o # no início):
RSYNC_ENABLE=true

Para arrancar o serviço:
service rsync start

As opções permitem a gestão básica: stop (parar), restart (reiniciar) e status (estado).

O reload não é necessário porque o rsync lê o ficheiro de configuração a cada nova ligação que recebe.

2. Testar o serviço
Para testar é possível recorrer a outra máquina que esteja na rede com o rsync instalado e executar:
rsync rsync://servidor
BACKUP             Backup [500GB]

Ao aceder ao módulo de BACKUP irá pedir uma palavra-passe, que não foi definida na configuração inicial, e, por isso, irá falhar:
rsync rsync://servidor/BACKUP
Password:
@ERROR: auth failed on module BACKUP
rsync error: error starting client-server protocol (code 5) at main.c(1524) [Receiver=3.0.7]


Cliente para backups

Para que o cliente possa enviar os ficheiros automaticamente sem haver pedido de senhas, é necessário configurar o acesso ao servidor por SSH por chave, isto é sem ser necessário introduzir uma palavra-passe. Esta forma é mais segura e permite a automatização das tarefas de backup pretendidas.

Neste caso é utilizada uma máquina cliente com o utilizador user que será o responsável pelo envio dos backups para o servidor.

0. Configuração do acesso por SSH com chave pública ao servidor
A criação das chaves no cliente com:
mkdir ~/.ssh/
ssh-keygen -t rsa

Copiar a chave criada para o servidor e habilitar o acesso SSH sem password para o utilizador do servidor:
ssh-copy-id utilizador@servidor

Testar para verificar se já não pede password com:
ssh utilizador@servidor


1. Script para Backups
Um script para automatizar os backups poderá ser o seguinte:
#!/bin/bash
# script by Mário Pinto @ 2016.07.19

# RSYNC SERVER - Complete URI for the server including protocol
SERVER="servidor"
USER="utilizador"
RSYNC_SERVER="$USER@$SERVER:/srv/BACKUP/"
COMMAND="rsync -qzar --delete"

# HOSTNAME and LOG_FILE
HOSTNAME=`hostname`
LOG_FILE=$HOSTNAME".log"
DATE=`date +%Y.%m.%d@%H:%M:%S`
START=`date +%s`

echo -e "HOST: $HOSTNAME\t $DATE\nBacking up to $RSYNC_SERVER$HOSTNAME" > $LOG_FILE

# Directories/Files to backup separated with a space ' '
BACKUP_DIRS="/home/user/DATA /home/user/ISO"

# Execute the backup for each directory/file specified
for i in $BACKUP_DIRS
do
  echo -ne "\tBacking up $i... " >> $LOG_FILE
  if $COMMAND $i $RSYNC_SERVER$HOSTNAME  ; then
    echo "OK" >> $LOG_FILE
  else
    echo "KO" >> $LOG_FILE
  fi
done


END=`date +%s`
DURATION=$(( $END - $START ))

echo -e "Done in $DURATION seconds." >> $LOG_FILE

rsync -qraz $LOG_FILE $RSYNC_SERVER"logs/"
cat $LOG_FILE
rm $LOG_FILE
exit 0


Poderá ser guardado como ~/rBackup

Deverá ser colocado como executável:
chmod 755 ~/rBackup

E testado:
./rBackup
HOST: cliente     2016.07.19@13:00:35
Backing up to utilizador@servidor:/srv/BACKUP/cliente
    Backing up /home/user/DATA... OK
    Backing up /home/user/ISO... OK
Done in 4 seconds.


2. Automatização do Backup
Se tudo for automático, resta criar um cronjob para o script, por exemplo:
crontab -e
 2 * * * nice /home/user/rBackup

sábado, 21 de maio de 2016

MKV | Substituir faixa de áudio AC3 por AAC

Um ficheiro MKV continha uma faixa de áudio em AC3 que não permitia ser reproduzido em alguns equipamentos. Para se converter para AAC há diversas formas documentadas.

Aqui fica o registo da utilização do FFMPEG (ou avconv) para extração e substituição da faixa de áudio.

1. Extração do áudio
ffmpeg -i Video.mkv -ab 192000 audio.aac

A extração do áudio inicia-se e é feita a conversão de AC3 para AAC com uma qualidade média de 192kbps.

2. Substituição da faixa de áudio num ficheiro MKV
ffmpeg -i Video.mkv -i audio.aac -map 0:v -map 1:a -codec copy -shortest NovoVideo.mkv

São fornecidos dois inputs (-i Video.mkv - vídeo pretendido e o segundo -i audio.aac com o áudio pretendido) é feito o mapeamento dos streams de cada input (-map 0:v para obter apenas o vídeo do primeiro stream e -map:1a para obter apenas o áudio do segundo stream) e é tudo copiado como está sem encoding (-codec copy) terminando o vídeo quando terminar o stream mais curto (-shortest) e colocando tudo um novo ficheiro (NovoVideo.mkv).

terça-feira, 8 de março de 2016

Reverse Proxy com o nginx

A utilização de um reverse proxy permite que um servidor acessível a partir da Internet forneça serviços existentes na sua rede privada para a Internet.
Desta forma, basta uma única máquina com este serviço para depois permitir o acesso a, por exemplo, vários serviços web existentes na rede privada.

Requisitos

O serviço de reverse proxy será feito com recurso ao nginx num servidor ubuntu 14.04.

Servidores internos a disponibilizar na internet:

  • 192.168.1.11:80 - servidor web principal
  • 192.168.1.12:80 - servidor web de teste

Instalação do nginx

apt-get install nginx

Após isto o serviço HTTP fica disponível e acessível na porta 80
netstat -tap
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:http                  *:*                     LISTEN      8967/nginx      

Os ficheiros de configuração de cada site ficam disponíveis em: /etc/nginx/sites-available
Por defeito existe apenas o default que permite ver a página por defeito do nginx.

Configuração do reverse proxy

Como o reverse proxy não vai disponibilizar serviço web direto, a configuração default que pode ser removida:
rm /etc/nginx/sites-enabled/default

Após qualquer alteração deste género é necessário fazer o reload das configurações do servidor:
service nginx reload

Neste caso, após ser removido o site default, passará a ser dado um aviso que a página não está disponível.

Resta agora criar um ficheiro de configuração para cada servidor:
nano /etc/nginx/sites-avaiable/www
server {
    listen 80;
    server_name www.exemplo.org exemplo.org;

    location / {
       proxy_set_header X-Real-IP  $remote_addr;
       proxy_set_header X-Forwarded-For $remote_addr;
       proxy_set_header Host $host;
       proxy_pass http://192.168.1.11;
    }
}

nano /etc/nginx/sites-avaiable/test
server {
    listen 80;
    server_name test.exemplo.org;

    location / {
       proxy_set_header X-Real-IP  $remote_addr;
       proxy_set_header X-Forwarded-For $remote_addr;
       proxy_set_header Host $host;
       proxy_pass https://192.168.1.12;
    }
}

Resta agora ativar os sites, para tal é necessário criar um link simbólico de cada um dos ficheiros para o diretório sites-enabled:
ln -s /etc/nginx/sites-available/www /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/test /etc/nginx/sites-enabled/

E reiniciar o serviço
service nginx reload

Após isto caso o DNS esteja a apontar para o servidor correto e a porta 80 do router encaminhe tudo para o novo servidor, será possível aceder a cada um dos servidores pelo seu nome de domínio.

Esta configuração pode ser escalável para muitos mais serviços de forma semelhante.

Referências

[1] - Documentação Oficial: https://www.nginx.com/resources/admin-guide/reverse-proxy/
[2] - Exemplo: https://www.garron.me/en/linux/nginx-reverse-proxy.html