Nunca fui à bola com o Linux; por uma questão prática – a minha área de interesse principal era em aplicações desktop, desenvolvidas em .Net – sempre usei sistemas operativos Microsoft, desde o Windows 3.11 até ao 7 (passando por NT’s, Server’s e até o ME de má memória). Quando vim parar ao webdev, tive que aprender o suficiente sobre Linux para me desenrascar nas tarefas mais tradicionais associadas a um servidor, ao estilo tough love.

Apesar das várias distros mais comuns, como o Ubuntu, o Red Hat (ou a sua variante community Fedora) ou até o CentOS, acabei por me habituar a uma mais levezinha para não-conhecedores como eu, o Gentoo. O Gentoo tem uma particularidade que dá um jeitaço para quem está menos à vontade com compilações e instalações de pacotes, o Portage, onde apenas uma linha (curta) é o suficiente para instalar um pacote e suas dependências. Claro que depois tem opções específicas de cada pacote, mas as que vêm por defeito já são uma boa ajuda. Quando precisei de um servidor em casa, para projectos pessoais, pesquisa e investigação, escolhi esta distribuição.

Durante o ano passado cheguei mesmo a ter um servidor físico, um Athlon XP 1200+ com 256 MB de RAM, que se aguentou surpreendentemente bem à bomboca. Ironicamente, precisamente enquanto estava a configurar a minha máquina principal nova e tinha os backups feitos nesse servidor, o disco falhou e a partição que continha os dados ficou corrompida (um sistema de ficheiros ter sido inventado por alguém que assassinou a esposa devia ser indicador de alguma coisa). Depois duma luta de algumas semanas, consegui recuperar os dados, mas nunca mais confiei nesse disco, e acabei por abater o servidor, instalando um servidor virtual, com o Windows Virtual PC. Entretanto, troquei de hardware, com consequente reinstalação do Windows 7, e não tive paciência para voltar a configurar o servidor – até ao início deste mês, em que queria experimentar algumas coisas novas, e não o queria fazer em servidores live.

O Windows Virtual PC, vá-se lá saber porquê, não achou muita piada à nova distribuição do Gentoo – crashava a máquina virtual ao instalar – e forçou-me a mudar de sistema de virtualização; uma pesquisa rápida e algumas instalações mais tarde e decidi-me pelo Oracle VM VirtualBox, que é gratuito e open-source. Instalado o Gentoo numa máquina virtual, segui para os pacotes necessários para um servidor web com múltiplos sites: o Bind9 para o DNS, o Apache para HTTP, o PHP como linguagem e o MySQL como motor de base de dados e, finalmente, o vsftpd para acesso FTP. Assim, cada site tem o seu domínio (que é igual ao domínio lá fora, mas em vez de começar por www., começa por www2.) e utilizador FTP, devidamente enjaulado na pasta relativa ao site.

Uma das coisas mais chatas de se fazer é criar tudo isto quando queremos um site novo – e eu quero sites novos muitas vezes. Por cada coisa nova que eu quero experimentar, normalmente, crio um site novo para não interferir com outros projectos/experiências. Os passos necessários são os seguintes:

  1. criar a zona no sistema de DNS;
  2. criar o virtual host no Apache;
  3. criar as pastas do site;
  4. criar um utilizador para usar por ftp;
  5. associar o utilizador à pasta do site e modificar as permissões da mesma;
  6. reiniciar os serviços.

Isto ainda era coisa para 10 a 15 minutos, a editar ficheiros e a fartar-me de escrever – isto partindo do princípio que não me enganava nem num pintelho, e que a coisa ficava a rolar logo à primeira, o que era raro. Nesta última encarnação do meu servidor privado, e tendo que criar todos os sites de novo, decidi que enough is enough: prefiro perder um serão a enjorcar um sistema automatizado, do que perder meia-hora de cada vez que preciso de criar um site novo.

Escolhi a shell Bash por ser a que já conhecia minimamente e encontrei mais exemplos na ‘Net.

Problema #1 – Passar parâmetros para o script

Este foi relativamente fácil de resolver: uma pesquisa breve ensinou-me que os parâmetros passados na invocação ficam disponíveis como variáveis numeradas. Se passarmos dois parâmetros, o primeiro estará em $1 e o segundo em $2. A variável $0 é a chamada ao próprio script, o que permite execuções recursivas.

Problema #2 – login de utilizador a partir do domínio

Um dos meus requisitos era que o nome de utilizador a criar fosse igual ao domínio, sem o (ou os) TLD. Ou seja, a criação do site dreamsincode.com deveria criar um utilizador dreamsincode. Felizmente, a Bash tem alguns operadores para partir strings:

str="um teste simples"

# as pesquisas seguintes são sempre um espaço

# operador # - remove tudo à esquerda da primeira ocorrência da pesquisa
echo ${str#* }
# vai mostrar "teste simples"

# operador ## - remove tudo à esquerda da última ocorrência da pesquisa
echo ${str##* }
# vai mostrar "simples"

# operador % - remove tudo à direita desde a última ocorrência
echo ${str% *}
# vai mostrar "um teste"

# operador %% - remove tudo à direita desde a primeira ocorrência
echo $(str%% *}
# vai mostrar "um"

Atentem na posição do asterisco; foi uma coisa que demorei a entender, quando se pesquisa pela esquerda é antes do(s) termo(s), e quando se pesquisa pela direita é depois.

Posto isto, como o que eu queria era a string antes do primeiro ponto que aparecesse, bastava-me usar o operador %%, em conjunto com uma pesquisa por “.”.

Problema #3 – mudar a password do utilizador acabado de criar

A primeira coisa que me veio à cabeça foi usar o comando passwd, que é o que toda a gente usa para mudar passwords. Mas, neste caso, há um catch: é que essa instrução fica à espera de dois inputs, a password e respectiva confirmação. Como é que se envia isto de um script que está a correr? Nas minhas pesquisas, até encontrei algumas soluções elaboradas, mas, aparentemente, o meu Gentoo não lhes achou grande piada, porque nada funcionou. Mas, pelo caminho, encontrei um comando que nem sabia que existia, o chpasswd, que aceita um ou mais pares utilizador:password e muda em massa. Só que esse comando é de uso exclusivo pelo root.

Isto pode ser um bocadinho assustador para quem está habituado ao Linux: o utilizador root não é para usar! No entanto, convém lembrar que o meu caso é o de um servidor privado e virtual, sem acesso do exterior, e ao qual só acedo à consola precisamente para isto e nada mais. Zero problemas de segurança.

Script completo

Aqui fica o script completo, com comentários.

#!/bin/bash
# a linha acima indica que o ficheiro é para ser interpretado pela Bash


# criar zona de DNS
# reparem no uso da variável $1 e no uso de \ para escapar as aspas
# finalmente, reparem também no uso de >> para redireccionar o echo
# para o final do ficheiro correspondente

echo "
zone \"www2.$1\" IN {
    type master;
    file \"pri/www2.$1.zone\";
    allow-update { none; };
    notify no;
};
" >> /etc/bind/named.conf


# variável temporária para guardar um número de série único (a partir da data)
myData=`date +%Y%m%d01`


# criar ficheiro de zona de DNS
# a assinalar o escape do $, via \
# neste caso, o echo é redireccionado para um ficheiro novo, com apenas um >

echo "\$ORIGIN www2.$1.
\$TTL 1200

@    IN    SOA    www2.$1.    m.www2.$1. (
                $myData
                1800
                900
                1209600
                1200
            )
            NS    www2.$1.

            A    192.168.123.180
" > /etc/bind/pri/www2.$1.zone


# criar vhost
# nada de extraordinário que não tenhamos já abordado...

echo "
<VirtualHost *:80>
    ServerName www2.$1
    Include /etc/apache2/vhosts.d/www2.$1_vhost.include

    <IfModule mpm_peruser_module>
        ServerEnvironment apache apache
    </IfModule>
</VirtualHost>
" >> /etc/apache2/vhosts.d/00_default_vhost.conf


# criar include vhost
# nada de mais, também...

echo "DocumentRoot \"/var/www/www2.$1/public_html\"

<Directory \"/var/www/www2.$1/public_html\">
    Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>
" > /etc/apache2/vhosts.d/www2.$1_vhost.include


# criar pastas
# tudo comandos triviais - uso public_html porque me habituei assim;
# normalmente, é htdocs, mas os hosters costumam criar um symlink do
# public_html para o htdocs

mkdir /var/www/www2.$1
mkdir /var/www/www2.$1/public_html


# criar utilizador
# aqui é onde eu escapo o(s) TLD(s) para ficar com o nome de utilizador

myUser=${1%%.*}

# reparem como defino logo a pasta correcta para o utilizador
useradd -d /var/www/www2.$1 -s /bin/bash -g ftp $myUser

# o tal comando para mudar passwords em massa - esta password é fraquita
echo "$myUser:123456" | chpasswd
# o pipe ("|") acima serve para indicar que o primeiro comando (o echo) será dado
# a alimentar ao segundo; é possível encadear muitos comandos desta forma


# atribuir pastas

chown $myUser:ftp -R /var/www/www2.$1
chmod 755 -R /var/www/www2.$1

# reiniciar servicos
# podia ter usado restart em vez de stop e start; como já me aconteceu granel
# com o restart, prefiro fazer assim - como não sou eu a escrever...

/etc/init.d/named stop
/etc/init.d/named start

apache2ctl stop
apache2ctl start

/etc/init.d/vsftpd stop
/etc/init.d/vsftpd start

# fim
exit
Partilhar no Sapo Links Partilhar no del.icio.us Partilhar no Digg Partilhar no Twitter Partilhar no StumbleUpon Partilhar no MySpace Partilhar no Facebook

Comentários Deixar um comentário

 Categorias
 Arquivo
 Projectos em Destaque
 Últimas Postas no Blog
 Últimos Comentários do Blog