Gerenciar hosts virtuais do Apache
Publicado por Diogo Alexsander Cavilha (última atualização em 16/09/2015)
[ Hits: 4.210 ]
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
Música com a real beleza da matemática
Juntar arquivos divididos por HJsplit
Somar e exibir resultados gerados pelo monitoramento do DNS
vid2mp3 - extrai áudio em mp3 de arquivos de vídeo com mplayer
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)