sexta-feira, 25 de outubro de 2013

Router/Firewall interno com bloqueio de tráfego e gestão web


Criação de um router interno que permita gerir o acesso à Internet através de um GUI web em PHP.

0. Pré-requisitos

1x máquina com duas placas de rede eth0 = WAN e eth1 = LAN

1. Instalação e Configuração como Router

Adicionar ao ficheiro /etc/init.d/nat:


#! /bin/bash
# Author: Mario Pinto
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="NAT router"
NAME=nat
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
WAN=eth0
# Function that starts the daemon/service
do_start()
{
   echo -n "Starting $DESC... "
   [ ! -e $PIDFILE ] || return 1
   touch $PIDFILE
   modprobe iptable_nat
   modprobe ip_conntrack_tftp # Allow TFTP UDP traffic
   modprobe ip_nat_tftp # Allow TFTP UDP traffic
   iptables -t nat -F
   iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE

   echo 1 > /proc/sys/net/ipv4/ip_forward

   return 0
}
# Function that stops the daemon/service
do_stop()
{
   echo -n "Stopping $DESC... "
   [ -e $PIDFILE ] || return 1
   iptables -t nat -F
   echo 0 > /proc/sys/net/ipv4/ip_forward
   rm $PIDFILE
   return 0
}
# MAIN OPTIONS
case "$1" in
   start)
      do_start
      case "$?" in
             0) echo "done" ;;
             1) echo "already running" ;;
             2) echo "error" ;;
      esac
      ;;
   stop)
      do_stop
      case "$?" in
                  0) echo "done" ;;
                  1) echo "not running" ;;
                  2) echo "error" ;;
      esac
      ;;
   restart)
      do_stop
          case "$?" in
                  0) echo "done" ;;
                  1) echo "not running" ;;
                  2) echo "error" ;;
          esac
      do_start
          case "$?" in
                  0) echo "done" ;;
                  1) echo "already running" ;;
                  2) echo "error" ;;
          esac
          ;;
   status)
      echo "Status: IPTABLES" >&2
      iptables -t nat -L
      echo "";echo "IP forward: ";cat /proc/sys/net/ipv4/ip_forward
      ;;

   *)
      echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
      exit 3
      ;;
esac
:


Tornar o script executável:
chmod 755 /etc/init.d/nat

Testar o serviço com:
service nat start
Starting NAT router... done

O serviço pode ser instalado para arrancar automaticamente com:

update-rc.d nat defaults


[Ainda faltam as partes de gestão e controlo]

2. Configuração do iptables

3. Scripts para configuração iptables

4. Aplicação web para gestão



Tutorial iptables:
https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
TFTP UDP Traffic passthrough:
http://keystoneit.wordpress.com/2007/11/25/tftp-through-ipcop-or-other-iptables-firewalls/
Accounting:
http://www.catonmat.net/blog/traffic-accounting-with-iptables/
Bandwith:
http://jim-zimmerman.com/?p=798

quarta-feira, 2 de outubro de 2013

Configuração do Netbeans 7.3 para o JDK7

O Netbeans 7.3 tem alguns problemas com a última atualização do java 1.6u27.
Assim é necessário instalar a versão 1.7 e alterar o ficheiro de configuração do Netbeans disponível aqui: /usr/local/netbeans-7.3/etc/netbeans.conf e alterar a home do JDK:
netbeans_jdkhome="/usr/lib/jvm/java-7-oracle"

Depois para configurar 13 postos com Caixa Mágica 18 (ubuntu 12.04 LTS) foi necessário:

  • Copiar ficheiro de configuração correto (está no server em /tmp/netbeans.conf)

for IP in {1..13}; do ssh -t 192.168.1.$IP "sudo scp admin@server:/tmp/netbeans.conf /usr/local/netbeans-7.3/etc/"; done;

  • Instalar oracle-jdk7-installer:


for IP in {1..13}; do echo "Conecting to 192.168.1.$IP";ssh -t 192.168.1.$IP "echo Installing oracle-jdk7-installer...;sudo apt-get -y install oracle-jdk7-installer"; done;

Controlar o som remotamente

Utilizando ubuntu 12.04 LTS é possível controlar o volume através da linha de comandos:

Sem som
$ sudo amixer sset Master playback 0 on

No máximo
$ sudo amixer sset Master playback 64 on

No meio
$ sudo amixer sset Master playback 46 on

sexta-feira, 7 de junho de 2013

Obter informações do Hardware - dmidecode

Até agora encontrei sempre o dmidecode que permite listar todas as informações referentes ao hardware das máquinas, como modelos, características, velocidades, capacidades, etc.

Por exemplo:
# dmidecode -t system
System Information
Manufacturer: Dell Inc.
Product Name: Latitude 13
Version: Not Specified
Serial Number: .......................
UUID: ...........................
Wake-up Type: Power Switch
SKU Number: Not Specified
Family:

Handle 0x2000, DMI type 32, 11 bytes
System Boot Information
   Status: No errors detected

Para obter informações sobre o processador:
# dmidecode -t processor
Processor Information
Socket Designation: Microprocessor
Type: Central Processor
Family: Core 2 Duo
Manufacturer: Intel
.........
Core Count: 2
Core Enabled: 2
Thread Count: 2
Characteristics:
64-bit capable

Para obter informações sobre a RAM:
# dmidecode -t memory
Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: None
Maximum Capacity: 8 GB
Number Of Devices: 2

Memory Device
 Size: 4096 MB
Form Factor: DIMM
Locator: DIMM_A
Type: DDR3
Type Detail: Synchronous
Speed: 1333 MHz
 .....

Memory Device
Size: No Module Installed
Form Factor: DIMM
 Locator: DIMM_B
 Type: DDR3
Type Detail: Synchronous
....

sábado, 2 de março de 2013

Proxmox - Aumentar disco de VM

Para aumentar o espaço do disco de uma máquina virtual (VM) com Windows 2003 Server é necessário fazer algumas considerações:

  • É necessário desligar a VM
  • Aumentar o disco de boot (C:) não é suportado pelo Windows 2003 Server
  • Convém efetuar backup dos dados contidos no disco a dimensionar

1. Redimensionar o disco no Proxmox

Depois de desligar a máquina convém efetuar um backup da mesma, que é uma operação algo demorada, acedendo à aba Backup e criando um novo backup.

Resta depois aceder por SSH ao servidor e efetuar o redimensionamento do disco (ficheiro) associado à VM, da qual é necessário saber o identificador, neste caso aparecerá XXX, e o nome do ficheiro, neste caso diskimage.zzz.

cd /var/lib/vz/images/XXX

Depois, utilizando o comando qemu-img é possível redimensionar o ficheiro do disco, neste caso, acrescentando 100 gigabytes ao seu tamanho atual.

qemu-img resize diskimage.zzz +100G

2. Aumentar a partição para o tamanho do disco

Após o seu redimensionamento, o disco é visto no Proxmox como tendo o novo tamanho, contudo a partição de sistema (C:) continua com o mesmo tamanho e é necessário aumentá-la.

O grande problema é que o Windows 2003 Server apenas permite efetuar o redimensionamento de partições básicas (sem ser a de sistema). Assim, será necessário utilizar um software que proceda a este redimensionamento.

Nota: No caso do Windows 7, Vista ou 2008 Server, o próprio sistema permite, no serviço de gestão de discos, efetuar o redimensionamento da partição de sistema (C:).

Assim, a forma mais simples é executar um LiveCD que possua o Gparted (por exemplo, Parted Magic ou o Grml). Neste caso, foi possível efetuar o arranque por PXE (para saber mais sobre isto veja aqui) e carregar o Grml.

Após o arranque em modo gráfico é possível aceder ao Gnome Partition Editor, onde facilmente se consegue redimensionar a partição de sistema, gravar as alterações e reiniciar a VM.

3. Arrancar o Windows 2003 Server

Ao arrancar a VM após o redimensionamento da partição, será feito um CHKDSK à partição, que permitirá assim corrigir qualquer erro que possa ter havido no processo de redimensionamento.

Após a conclusão deste processo a VM estará a funcionar como antes, apenas possuindo mais espaço em disco.

domingo, 24 de fevereiro de 2013

Raspberry Pi - Ler valores do GPIO


A primeira experiência no âmbito da leitura de valores para o Raspberry Pi, é feita com base no tutorial proposto por Matthew Kirk aqui.

0. Material necessário

  • Raspberry Pi
  • Sensor Digital de temperatura DS18B20
  • Resistência 4,7 kΩ

1. Esquema para sensor de temperatura

O sensor de temperatura utilizado é um DS18B20, que permite efetuar leituras digitais (9-bits a 12-bist) do valor da temperatura (em Celsius).
Esquema do sensor de temperatura DS18B20
Neste esquema a ligação ao Raspberry Pi efetuou-se atravé do pin7 do Raspberry Pi, correspondendo ao GPIO04.
Esquema de ligações dos componentes

2. Implementação do circuito

Novamente, muito cuidado ao ligar o circuito para não danificar o Raspberry Pi.
Breadboard com o circuito implementado e conectado ao Rpi

3. Carregar módulos necessários

A leitura da temperatura deste sensor pressupõe alguns passos iniciais de configuração, pois por defeito o Raspberry Pi não carrega os módulos que permitem a "conversa" com outros componentes.
Assim, é necessário ativar estes dois módulos:
$ sudo modprobe w1-gpio
$ sudo modprobe w1_therm

Após este passo é necessário verificar qual o número de série carregado para o sensor de temperatura.
$ ls /sys/bus/w1/devices/
28-0000025d1522  w1_bus_master1

É através deste número de série (único para cada sensor) que será possível obter a informação da temperatura do sensor.

4. Obter a temperatura

Para obter a temperatura atual basta ver o conteúdo do ficheiro:
$ cat /sys/bus/w1/devices/28-0000025d1522/w1_slave 
5c 01 4b 46 7f ff 04 10 a1 : crc=a1 YES
5c 01 4b 46 7f ff 04 10 a1 t=21750

Para ficar apenas com o valor é possível:
$ tail -n 1 /sys/bus/w1/devices/28-0000025d1522/w1_slave | tail -c 6
21875

5. Integração com PHP

Em PHP é muito fácil aceder ao ficheiro anterior e obter valor pretendido:
      if (isset($_GET['temp'])&&$_GET['temp']!=''){
        exec("sudo gpio -g mode 4 in"); // Iniciar GPIO04 = pin 7
        if ($_GET['temp']=='on'){
          // Ler do ficheiro
          $filename = '/sys/bus/w1/devices/28-0000025d1522/w1_slave';
          $mode = "r";
          $file = fopen($filename, $mode);
          if ($file){
            fgets($file); // Ler primeira linha e descartar
            $buffer = fgets($file); // Ler linha da temperatura
            fclose($file);
            $temp = substr($buffer, -6); // Obter os últimos 6 caracteres com a temperatura
            echo ""+$temp/1000+"ºC
"; // Converter para as unidades corretas
          }
        }
      }


Para executar basta aceder ao URL do ficheiro PHP e adicionar a variável temp com o valor on:
http://rpi/temp.php?temp=on


domingo, 17 de fevereiro de 2013

Raspberry Pi - Controlar GPIO em PHP

Para controlar o GPIO do Raspberry Pi através do PHP é necessário efetuar algumas configurações.

1. Configuração da execução do gpio

Adicionar no final do ficheiro de sudoers para dar permissão a www-data de execução apenas do comando gpio.
$ whereis gpio
gpio: /usr/local/bin/gpio
$ sudo visudo
...
# GPIO
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/gpio


Em PHP depois é possível fazer a chamadas à ferramenta gpio com sudo.

2. Exemplo de ficheiro PHP para controlar LED

Seguindo o setup eletrónico feito aqui, é possível criar o ficheiro led.php que acende e apaga o led através do PHP.

Exemplo led.php:

if (isset($_GET['led'])&&$_GET['led']!=''){
  exec("sudo gpio -g mode 7 out"); // Iniciar o GPIO07 = pino 26
  if ($_GET['led']=='on'){
    exec("sudo gpio -g write 7 1"); // Acender LED
  }else{
    exec("sudo gpio -g write 7 0"); // Apagar LED
  }
}

Para verificar basta ter uma hiperligação ou inserir o URL que passe a variável led com o valor on para acender o LED e qualquer outro para o apagar.

Para acender:
http://rpi/led.php?led=on

Para apagar:
http://rpi/led.php?led=off

WiringPi - GPIO na linha de comandos

Já foi visto um método que permite aceder ao GPIO do Rpi através de python, aqui.

Outra forma de interação com o GPIO é através do wiringPi que implementa uma ferramenta para a linha de comandos que pode ser invocada de várias formas.
Diretamente pelo utilizador, dentro de shell scripts, em PHP através de exec(), etc.

Esta ferramenta é da autoria de Gordon Henderson e para instalar basta seguir os passos daqui.
O manual da mesma encontra-se aqui ou na linha de comandos: man gpio.

1. Instalar o wiringPi

Instalar o git-clone:
$ sudo apt-get install git-clone

Obter o código:
$ git clone git://git.drogon.net/wiringPi

Instalar:
$ cd wiringPi
$ ./build

A partir daqui é possível utilizar a ferramenta wiringPi.

2. Utilizar o wiringPi

Implementando este circuito é possível através da linha de comandos efetuar o ligar e desligar do led.
Neste caso é indicado 7 para o GPIO07, ou seja, o pino 26. Depois escreve-se 1 para ligar ou 0 para desligar o led.
$ gpio -g mode 7 out
$ gpio -g write 7 1
$ gpio -g write 7 0

Raspberry Pi - webserver

A instalação de um webserver no Raspberry Pi permitirá ter um webserver com muito baixo consumo energético.
Mais para a frente será pretendido ter o webserver a controlar o Raspberry Pi através de PHP.

Normalmente utiliza-se o apache2 como webserver e o mysql-server para base de dados, mas devido às limitações do Raspberry Pi, a utilização do lighttpd webserver deverá ser mais adequada.

Também o mysql-server revela-se muito voraz em RAM... Após a sua instalação a RAM livre passou de 210MB para apenas 96MB...

Assim, ainda se procuram alternativas... 

1. Instalar lighttpd + php5

Para fazer este setup basta:
$ sudo apt-get install lighttpd php5-cgi

2. Configurar o webserver

A configuração básica necessária implica apenas ativar e configurar o suporte para PHP.

Para ativar o suporte para PHP no lighttpd:
$ sudo lighty-enable-mod fastcgi-php

Depois é necessário localizar o binário do php5-cgi para indicar na configuração do lighttpd:
$ whereis php5-cgi
php5-cgi: /usr/bin/php5-cgi ... ...

$ sudo nano /etc/lighttpd/conf-enabled/15-fastcgi-php.conf 

Confirmar se a o binário está correto:
"bin-path" => "/usr/bin/php5-cgi",

Caso esteja tudo correto, carregar as definições:
$ sudo service lighttpd force-reload

3. Testar o funcionamento

Depois de instalado e configurado resta testar. Para tal basta criar um ficheiro .php, por exemplo:
$ sudo nano /var/www/info.php
<?php
phpinfo();
?>

Abrir um browser e introduzir http://a.b.c.d/info.php
Onde a.b.c.d é o IP do Raspberry Pi.

Eletrónica e Raspberry Pi

Para além da excelente vertente relativa ao Sistema Operativo e demais software possível de correr no Raspberry Pi, existe a Eletrónica.

1. Interface Eletrónica do Rpi

O Raspberry Pi possui uma interface com esta finalidade que se designa de GPIO (General Purpose Input Output).
Esta interface possui 26 pinos que podem ser: 5V, 3V3, GND ou de Input/Output.

Consoante o modelo do Rpi existem diferentes layouts destes pinos.

Uma boa fonte de informação sobre isto está no Raspberry Pi Spy (http://www.raspberrypi-spy.co.uk/2012/06/simple-guide-to-the-rpi-gpio-header-and-pins/).

GPIO Revision 2

2. Esquema para Pisca-Pisca controlado pelo Rpi

Atenção!
Algumas das chamadas de atenção existentes em diversos lados são relativas ao cuidado no desenho e, principalmente, implementação dos circuitos de forma a não "queimar" o Raspberry Pi, pois os pinos de IO do GPIO estão ligados diretamente ao chip da CPU.
Por isso, deve verificar-se sempre o circuito que se vai implementar!

A partir do site indicado anteriormente é possível aceder a inúmeros artigos de interesse.
Um dos mais interessantes para quem se inicia nestas lides é o relativo ao led Pisca-Pisca controlado pelo Raspberry Pi, que se encontra aqui.

Aquando da implementação do circuito numa breadboard convém confirmar tudo. Assim, convém confirmar as ligações do transistor T1 (neste caso um BC547C).

3. Implementação do circuito

Breadboard com o circuito ligado ao Rpi e LED aceso
  • O LED deve ser ligado com o pino mais comprido à resistência R1 e o mais curto ao pino 1 do transistor T1.
  • A resistência R2 deverá ser ligada ao pino 2 do transistor T1.
  • O pino 3 do transistor T1 deverá ser ligado ao GND do Rpi (pino 6).
  • A resistência R1 deve ligar também ao Rpi, neste caso no pino 1 (+3V3).
  • A resistência R2 deve ligar também ao Rpi, neste caso no pino 26 (IO).


4. Python e o GPIO

Para se poder controlar o input e output dos pinos do GPIO através de código python é necessário instalar uma biblioteca, por exemplo: raspberry-gpio-python, disponível para download aqui.

Para saber qual a versão a utilizar é possível executar no terminal do Rpi:
$ python --version
Python 2.7.3

Neste caso será necessário descarregar a biblioteca para a versão 2.

Depois de descarregado o ficheiro, é necessário instalá-lo com:
$ sudo dpkg -i python-rpi.gpio_0.4.2a-1_armhf.deb

Após esta instalação é possível importar para o python a biblioteca que interage com o GPIO.

5. Código Pisca-Pisca em Python

Para testar resta agora criar um ficheiro, por exemplo led.py com o conteúdo:
import RPi.GPIO as GPIO
import time

# Use physical pin numbers
GPIO.setmode(GPIO.BOARD)
# Set up header pin 26 (GPIO7) as an input
pin=26
print "Setup Pin %i" % (pin)
GPIO.setup(pin, GPIO.OUT)

var=1
print "Start loop"
while var==1 :
  print "Set Output False"
  GPIO.output(pin, False)
  time.sleep(1)
  print "Set Output True"
  GPIO.output(pin, True)
  time.sleep(1)

Como o código tem que interagir com o GPIO, é necessário executá-lo com privilégios de root, ou seja:
$ sudo python led.py

Portátil com acesso ao Rpi por SSH e execução do código led.py


sexta-feira, 11 de janeiro de 2013

XBMC no Raspberry Pi

Uma utilização possível para o Raspberry Pi é como Media Center de uma qualquer televisão.

Para este efeito existem várias alternativas: http://wiki.xbmc.org/index.php?title=Raspberry_Pi

  • Raspbian + XBMC - permite ter um ambiente gráfico LXDE para tarefas genéricas, podendo depois carregar o XBMC. Contudo, este fica bastante lento e tem vários problemas com os conteúdos via DLNA.
  • OpenELEC - sistema media center muito rápido, mas que tem alguns problemas com os Add-ons de vídeo.
  • Raspbmc - sistema muito rápido e que teve o melhor suporte para reprodução de conteúdos.

Raspbmc - Rpi

Raspbmc implementa o XBMC  numa distribuição Linux baseada em Debian e criada especificamente para o Raspberry Pi.
No site alguns utilizadores indicam que é muito mais rápida que o OpenELEC que testei anteriormente.

Outra funcionalidade que salta à vista é o suporte para GPIO.

1. Instalação do Raspbmc

O processo de instalação tem duas fases, sendo a primeira feita numa máquina com leitor de cartões e a segunda no próprio Raspberry Pi.

Fase 1:

wget http://svn.stmlabs.com/svn/raspbmc/testing/installers/python/install.py

Introduzir o SD card e executar
sudo python install.py

Este processo descarrega 15MB da internet e formata o SD card convenientemente.

No final deve desmontar-se o SD card

Fase 2:
Introduzir o SD card no Rpi e ligar.
Após o arranque, é necessário iniciar o processo de instalação, muito simples, que descarrega à vez todos os componentes para o sistema: root, kernel, kernel modules, xbmc, etc...

Após isto tudo não reconheceu o teclado sem fios...

2. Resolução de Problemas

2.1. Problemas com a deteção do teclado

Como não se pode utilizar o sistema, é necessário aceder por SSH ao mesmo:
ssh pi@192.168.2.220
(A password por defeito é raspberry)

É possível depois carregar manualmente o módulo e ficar com o teclado funcional:
modprobe hid-logitech-dj

Mas a solução definitiva do Jan Karger proposta aqui, apesar de ter funcionado com o raspbian, continuava sem funcionar.
Após algumas pesquisas outra solução consiste em reiniciar (por SSH, sudo reboot) algumas vezes até o teclado ser detetado.

E após reiniciar duas vezes ficou sempre operacional... Explicação?...

3. Utilização

Com os problemas do teclado resolvidos não houve qualquer problema em aceder e reproduzir grande parte dos conteúdos do servidor DLNA.

Contrariamente ao que aconteceu com o OpenELEC, os Add-Ons para vídeo, nomeadamente do Youtube, Vimeo e NBA funcionam em pleno.

quarta-feira, 9 de janeiro de 2013

OpenELEC - Rpi

OpenELEC (Open Embedded Linux Entertainment Center) é uma distribuição Linux independente orientada especificamente para a criação de um media center baseado no XBMC e nas suas inúmeras funcionalidades.
Possui instalações para diferentes plataformas, incluindo o Raspberry Pi.

Instalar o OpenELEC

1. Descarregar daqui a imagem para Raspberry Pi.

2. Extrair os ficheiros
tar xvf OpenELEC-RPi.arm-devel-20121124031454-r12577.tar.bz2

3. Inserir o SD Card e verificar qual a sua designação (normalmente /dev/sdb)
ls /dev/sd*

4. Executar o instalador como root:
cd OpenELEC-RPi.arm-devel-20121124031454-r12577/
sudo ./create_sdcard /dev/sdb

5. Esperar, ejetar com segurança o SD card e experimentar.

Utilização do OpenELEC

Da curta utilização deu para perceber que o sistema dica extremamente rápido e responsivo.
Não houve qualquer problema em aceder e reproduzir grande parte dos conteúdos do servidor DLNA.

Contudo os Add-Ons para vídeo, nomeadamente do Youtube, Vimeo e NBA estavam broken e não era possível instalá-los... 

Alternativas? Raspbmc...