Gerenciar hosts virtuais do Apache
Publicado por Diogo Alexsander Cavilha (última atualização em 16/09/2015)
[ Hits: 4.475 ]
Homepage: https://github.com/diogocavilha
Download 1426732092.vhost.sh (versão 2)
Download 1441248482.vhost.sh (versão 3)
Boa noite, pessoal.
Essa é o meu primeiro compartilhamento aqui na comunidade. Espero que seja útil para muitos de vocês.
Sou desenvolvedor web e muitas vezes me deparei com a situação de criar hosts virtuais para rodar projetos.
Pois bem, depois de tanto tempo tendo que fazer o trabalho manual, resolvi fazer um script para tomar conta dessa tarefa por mim.
Antes de resolver criá-lo eu fiz uma breve pesquisa pra ver se o que eu queria já não tinha sido desenvolvido por outra pessoa. Encontrei muitos scripts que faziam o que eu queria, mas não faziam da forma que eu imaginava, todos funcionavam como um gatilho para gerar os arquivos sem que houvesse qualquer tipo de interação com o usuário. Confesso que não me empenhei muito na pesquisa porque eu realmente estava com vontade de fazer meu próprio script =D
Então, como a vontade de criar algo de forma diferente foi maior, acabei desenvolvendo meu próprio gerenciador de hosts virtuais.
P.S.: Não sou um profundo conhecedor de shell script, então esse projetinho acabou sendo também como um laboratório pra mim.
Caso alguém se interesse e queira contribuir para melhorar o script, é só acessar o repositório no bitbucket:
https://bitbucket.org/diogocavilha/vhost/src/207b0814e947bfbf0e4e55a3308df3dfb91df216/?at=apache2
Lá no repositório também tem uma branch com a versão do script para o servidor nginx.
Toda ajuda é bem vinda.
É isso. Espero ter facilitado a vida de alguém com esse script :)
Versão 2 - Enviado por Diogo Alexsander Cavilha em 18/03/2015
Changelog: Melhoria na expressão regular que remove o server name do arquivo /etc/hosts.
Versão 3 - Enviado por Diogo Alexsander Cavilha em 02/09/2015
Changelog: - Criação de menus. Interatividade na execução.
- Gerenciamento de host do Apache e do Nginx.
- Menu para selecionar o servidor desejado.
- Listagem de hosts habilitados e desabilitados
- Confirmação para ações de gerenciamento.
P.S: Projeto movido para: https://github.com/diogocavilha/vhost
#!/bin/bash
#==================================================================#
# Autor: Diogo Alexsander Cavilha <diogocavilha@gmail.com>
# Data: 06/05/2014
#
# Descrição:
# Cria a configuração de virtual host.
# Gera o link simbólico para /etc/apache2/sites-enabled
# Adiciona IP e Server name no arquivo /etc/hosts
# Reinicia o servidor Apache
#==================================================================#
#. config.ini
VERSION="2.0"
HOSTS_FILE="/etc/hosts"
SITES_AVAILABLE="/etc/apache2/sites-available"
SITES_ENABLED="/etc/apache2/sites-enabled"
IP_ADDRESS="127.0.0.1"
SERVER_NAME="Apache"
#. messages
messageRed()
{
echo -e "\033[0;31m$1\033[0m"
sleep 1
}
messageYellow()
{
echo -e "\033[1;33m$1\033[0m"
}
messageBlue()
{
echo -e "\033[0;34m$1\033[0m"
sleep 1
}
messageGreen()
{
echo -e "\033[0;32m$1\033[0m"
sleep 1
}
environmentVars=""
#------------------------------------------------------------------#
# This function checks whether or not the user who is running this
# script is root.
#------------------------------------------------------------------#
requireRoot()
{
if [ ! "$USER" == "root" ]; then
messageRed "\nVocê precisa estar logado como root.\n"
exit 1
fi
}
#------------------------------------------------------------------#
# This function receives a file name in order to check whether or
# not it exists.
# Returned value:
# 0 - File does not exist.
# 1 - File exists.
#------------------------------------------------------------------#
fileExists()
{
if [ -e "$1" ]; then
return 1
else
return 0
fi
}
#------------------------------------------------------------------#
# This function receives a directory name in order to check whether
# or not it exists.
# Returned value:
# 0 - Diretory does not exist.
# 1 - Diretory exists.
#------------------------------------------------------------------#
folderExists()
{
if [ -d "$1" ]; then
return 1
else
return 0
fi
}
#------------------------------------------------------------------#
# This function receives a port number in order to check whether
# or not it is available.
# Returned value:
# 0 - This port number is available.
# 1 - This port number is not available.
#------------------------------------------------------------------#
isUsedPort()
{
$(nc -z -w5 $IP_ADDRESS $1)
if [ $? -eq 0 ]; then
return 1
else
return 0
fi
}
#------------------------------------------------------------------#
# This function requests the environment variable name.
#------------------------------------------------------------------#
requireEnvironmentVarName()
{
echo -n " Nome: "
read evName
if [ -z $evName ]; then
requireEnvironmentVarName
fi
}
#------------------------------------------------------------------#
# This function requests the environment variable value.
#------------------------------------------------------------------#
requireEnvironmentVarValue()
{
echo -n " Valor: "
read evValue
if [ -z $evValue ]; then
requireEnvironmentVarValue
fi
}
#------------------------------------------------------------------#
# This function joins all environment variables to a single string.
#------------------------------------------------------------------#
appendEnvironmentVars()
{
requireEnvironmentVarName
requireEnvironmentVarValue
environmentVars+="\tSetEnv $evName \"$evValue\"\n"
echo -e -n "\n Adicionar mais uma? [S/N]: "
read oneMore
case $oneMore in
"s"|"S") appendEnvironmentVars;;
*) ;;
esac
}
#------------------------------------------------------------------#
# This function requests the file name that will be created
# in order to store the configuration code.
#------------------------------------------------------------------#
requireFileName()
{
echo -n -e "\n Nome do arquivo que conterá a configuração do host: "
read vhFileName
if [ ! -z $vhFileName ]; then
vhFileName+=".conf"
$(fileExists "$SITES_AVAILABLE/$vhFileName")
if [ $? -eq 1 ]; then
messageRed "\n [$SITES_AVAILABLE/$vhFileName] Arquivo já existe.\n"
requireFileName
fi
else
requireFileName
fi
}
#------------------------------------------------------------------#
# This function requests the application directory.
#------------------------------------------------------------------#
requireApplicationFolder()
{
echo -n " Caminho da aplicação (Ex: /diretorio/contendo/aplicacao): "
read vhPath
if [ ! -z $vhPath ]; then
$(folderExists "$vhPath")
if [ $? -eq 0 ]; then
messageRed "\n [$vhPath] O diretório não existe.\n"
requireApplicationFolder
fi
else
requireApplicationFolder
fi
}
#------------------------------------------------------------------#
# This function requires the port number on which the
# application will run.
#------------------------------------------------------------------#
requireApplicationPort()
{
echo -n " Porta: "
read vhPort
if [ ! -z $vhPort ]; then
$(isUsedPort "$vhPort")
if [ $? -eq 1 ]; then
messageRed "\n [$vhPort] Esta porta já está sendo utilizada.\n"
requireApplicationPort
fi
fi
}
#------------------------------------------------------------------#
# This function requires the application's server name.
#------------------------------------------------------------------#
requireApplicationServerName()
{
echo -n " Server Name: "
read vhServerName
if [ -z $vhServerName ]; then
requireApplicationServerName
fi
}
#------------------------------------------------------------------#
# This function writes the host configuration code on its
# correspondent file.
#------------------------------------------------------------------#
writeConfiguration()
{
vhPort=$1
vhServerName=$2
if [ -z $vhPort ]; then
`echo "<VirtualHost *:80>" >> $SITES_AVAILABLE/$vhFileName`
else
`echo "Listen $vhPort" >> $SITES_AVAILABLE/$vhFileName`
`echo "<VirtualHost *:$vhPort>" >> $SITES_AVAILABLE/$vhFileName`
fi
`echo -e "\tDocumentRoot $vhPath" >> $SITES_AVAILABLE/$vhFileName`
if [ ! -z $vhServerName ]; then
`echo -e "\tServerName $vhServerName" >> $SITES_AVAILABLE/$vhFileName`
`echo "" >> $SITES_AVAILABLE/$vhFileName`
else
`echo -e "\t#ServerName $vhFileName.local" >> $SITES_AVAILABLE/$vhFileName`
fi
if [ ${#environmentVars} -gt 0 ]; then
`echo -e $environmentVars >> $SITES_AVAILABLE/$vhFileName`
else
`echo -e "\t#SetEnv VAR_NAME\t\"value\"" >> $SITES_AVAILABLE/$vhFileName`
fi
`echo -e "\t<Directory $vhPath/>" >> $SITES_AVAILABLE/$vhFileName`
`echo -e "\t\tOptions Indexes FollowSymLinks MultiViews" >> $SITES_AVAILABLE/$vhFileName`
`echo -e "\t\tAllowOverride All" >> $SITES_AVAILABLE/$vhFileName`
`echo -e "\t\tOrder allow,deny" >> $SITES_AVAILABLE/$vhFileName`
`echo -e "\t\tallow from all" >> $SITES_AVAILABLE/$vhFileName`
`echo -e "\t</Directory>" >> $SITES_AVAILABLE/$vhFileName`
`echo "</VirtualHost>" >> $SITES_AVAILABLE/$vhFileName`
}
restartApache()
{
messageBlue " * Reiniciando o apache..."
service apache2 restart
}
#------------------------------------------------------------------#
# This function creates the files within sites-enabled and
# sites-available folders.
#------------------------------------------------------------------#
addHost()
{
requireRoot
requireFileName
requireApplicationFolder
requireApplicationPort
if [ ${#vhPort} -eq 0 ]; then
requireApplicationServerName
fi
echo -e -n "\n Deseja adicionar variáveis de ambiente? [S/N]: "
read addEnvironmentVar
case $addEnvironmentVar in
"s"|"S") appendEnvironmentVars;;
*) ;;
esac
messageBlue "\n * Criando host..."
touch $SITES_AVAILABLE/$vhFileName
writeConfiguration "$vhPort" "$vhServerName"
messageBlue " * Habilitando host..."
a2ensite $vhFileName
if [ ${#vhServerName} -gt 0 ]; then
messageBlue "\n * Fazendo backup do arquivo $HOSTS_FILE"
cp /etc/hosts /etc/hosts.backup
messageBlue " * Adicionando entrada no arquivo $HOSTS_FILE"
`echo -e "$IP_ADDRESS $vhServerName" >> $HOSTS_FILE`
fi
restartApache
address="http://"
if [ ${#vhPort} -gt 0 ]; then
address+="$IP_ADDRESS:$vhPort"
else
if [ ${#vhServerName} -gt 0 ]; then
address+="$vhServerName"
fi
fi
messageBlue " Host criado com sucesso --> [$address]"
}
#------------------------------------------------------------------#
# This function receives the file name and remove it from
# sites-enabled and sites-available folders.
#------------------------------------------------------------------#
removeHost()
{
requireRoot
host=$1
exists=0
serverName=$(grep ServerName $SITES_ENABLED/$host | awk '{print $2}')
documentRoot=$(grep DocumentRoot $SITES_ENABLED/$host | awk '{print $2}')
messageBlue "\n * Removendo entrada do arquivo /etc/hosts"
sed "s/$IP_ADDRESS $serverName//" /etc/hosts > /etc/hosts2
mv -f /etc/hosts2 /etc/hosts
if [ ${#host} -gt 0 ]; then
if [ -e "$SITES_ENABLED/$host" ]; then
messageBlue " * Removendo link..."
rm "$SITES_ENABLED/$host"
exists=1
fi
if [ -e "$SITES_AVAILABLE/$host" ]; then
messageBlue " * Removendo host..."
rm "$SITES_AVAILABLE/$host"
exists=1
fi
if [ $exists -eq 0 ]; then
messageRed "\n Este host não existe.\n"
else
restartApache
fi
else
messageRed "\n Host não informado."
fi
}
#------------------------------------------------------------------#
# This function shows an available and enabled hosts list.
#------------------------------------------------------------------#
listHosts()
{
echo ""
messageYellow "[ $SITES_AVAILABLE ]\n"
for hostName in $(ls $SITES_AVAILABLE); do
echo -e "\t$SITES_AVAILABLE/\033[1;33m$hostName\033[0m"
done
echo ""
messageYellow "[ $SITES_ENABLED ]\n"
for hostName in $(ls $SITES_ENABLED); do
echo -e "\t$SITES_AVAILABLE/\033[1;33m$hostName\033[0m"
done
echo ""
}
#------------------------------------------------------------------#
# This function shows the script version.
#------------------------------------------------------------------#
showVersion()
{
echo -e VirtualHostAutomat v.$VERSION"\n"
}
#------------------------------------------------------------------#
# This function shows the script help.
#------------------------------------------------------------------#
helpScript()
{
echo "Modo de usar: vhost [opções]"
echo ""
echo "Opções:"
echo -e " -a, --add\t\t\t Adiciona/Cria um host de forma interativa."
echo -e " -d, -r, --delete, --remove <nome do host>\t Deleta um host."
echo -e " -l, --list\t\t\t Exibe uma lista dos hosts criados."
echo -e " -h, --help\t\t\t Exibe este help ;)"
echo -e " -v, --version\t\t\t Exibe a versão do script."
echo ""
}
#------------------------------------------------------------------#
# This function manages this script call.
#------------------------------------------------------------------#
case $1 in
"-a"|"--add") addHost;;
"-d"|"-r"|"--delete"|"--remove") removeHost "$2";;
"-l"|"--list") listHosts;;
"-h"|"--help") helpScript;;
"-v"|"--version") showVersion;;
esac
Backup Simples de tabela MYSQL
Script para instalação Gerix Wi-fi Cracker no Kali Linux
Script para adicionar bordas às imagens de uma pasta
Instalar MP3 (e outros formatos) no ubuntu dapper automaticamente
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
ERRO: LAZARUS 4.2 64 no Linux MINT não entra mais apos ajustar desktop... (0)
Pergunta: Meu teclado não está respondendo direito como e consertar? (2)
Secure boot, artigo interessante, nada técnico. (6)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (0)









