Buenas,
He estado realizando un script en bash para configurar e instalar algunos servicios de manera automatica con apt-get y demás, y bueno, como ya lo tengo cerca de terminarse pues lo comparto por aqui por si a alguien le interesa y demás.
Faltan algunas cosas, comprobaciones y demás que haré en esta semana.
Nota:Esta basado en Ubuntu cliente, en una semana pegaré la versión de ubuntu server, y si tengo tiempo la de debian
No me critiqueis mucho que ando aprendiendo!
Servicios que instala y configura:Apache, dns, dhcp
Aplicaciones:Configurador de interfaces y aplicación de cálculo de redes(primer host,ultimo host, ip de red, broadcast, etc...
Código
spoiler
#! /bin/bash
#<--------------------------------------------FUNCIONES VARIAS
pause(){
echo -e " \e[43;31m[Pulse cualquier tecla para continuar]\e[00m"
read -p "";
}
#COMPRUEBA LA IP
validar_ip()
{
local ip=$ipdudosa
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]];
then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
#COMPRUEBA INSTALACIONES
comprueba_servicio()
{
existe=`ps -ef | grep $1 | wc -l`
if [ "$2" == "" ];then
numero=1;
else
numero=$2;
fi
if [ $existe -gt $numero ];then
servicio=1;
return $servicio;
fi
}
#INSERTA LAS INTERFACES EN EL ISC-DHCP-SERVER
interfaces_dhcp()
{
interfaces=`grep ^INTERFACES /etc/default/isc-dhcp-server | cut -f"2" -d"=" | tr '"' ' '`;
if [ "$interfaces" == "" ];then
echo "No hay ninguna interface configurada, por favor introduce una:"
echo "0 = eth0";
echo "1 = eth1";
echo "Y asi sucesivamente."
read int
if [ $int -ge 0 ] && [ $int -le 6 ];then
echo "Añadiendo la interface eth$int";
sleep 2
sed -i 's/INTERFACES\=\"\"/INTERFACES\=\"eth'$int'\"/g' /etc/default/isc-dhcp-server
if [ $? -eq 0 ];then
echo "Interface añadida correctamente,volviendo al menu";
sleep 2;
else
echo "No se ha podido añadir la interface, volviendo al menu"
sleep 2
fi
fi
else
unset INTERFAKES;
cont_desea=0
cont2=1
typeset -a INTERFAKES
while [ $cont_desea -eq 0 ]
do
clear
echo "Estas son las intefaces que tienes configuradas, verifica si es correcto."
echo "";
for j in $interfaces
do
echo " [$cont2] -" $j
cont2=`expr $cont2 + 1`
done
cont=0;
for i in $interfaces
do
INTERFAKES[$cont]=$i;
cont=`expr $cont + 1`;
done
echo "¿Desea añadir otra interface? s/n"
read desea
case $desea in
s)clear;echo "Por favor introduce tu interface, siendo:"
echo " ";
echo " 0 = eth0";
echo " 1 = eth1";
echo " 2 = eth2";
echo " 3 = eth3";
echo " etc...";
echo "";
echo " [Recuerda que éstas interfaces ya están activadas.]"
echo "";
echo " ${INTERFAKES[@]}"
echo "";
echo "Pon la nueva interface";
read int1
# Compruebo si la interface ya está dentro del archivo
head -23 /etc/default/isc-dhcp-server | tail -1 | grep eth$int1 >> /dev/null
if [ $? -eq 0 ];then
echo "Esa interface ya está puesta, por favor, elige otra"
else
INTERFAKES[$cont]=eth$int1;
sleep 2;
echo "Añadiendo la interface eth$int1, espere un momento por favor..."
interfaces1=`echo ${INTERFAKES[@]}`
sed -i "21 c INTERFACES\=\"$interfaces1\"" /etc/default/isc-dhcp-server
sleep 2
if [ $? -eq 0 ];then
echo "Interface añadida correctamente";
pause
cont_desea=1;
else
echo "No se ha podido añadir la interface";
fi
fi;
;;
n)cont_desea=1;
;;
*)clear;echo "Pon s o n por favor";;
esac
done
pause;
fi
}
#<--------------------------------------------SUBMENUS
int_ver()
{
unset tipo
unset iface
unset iface2
opcion=$1
set -a tinterfaces
cont_int2=1
if [ "$opcion" == "todas" ];then
unset tinterfaces
for i in `ifconfig -a | grep eth | cut -f"1" -d" "`
do
tinterfaces[$cont_int2]=$i;
cont_int2=`expr $cont_int2 + 1`
done
elif [ "$opcion" == "activas" ];then
unset tinterfaces
for i in `ifconfig | grep eth | cut -f"1" -d" "`
do
tinterfaces[$cont_int2]=$i;
cont_int2=`expr $cont_int2 + 1`
done
fi
toto=`echo ${tinterfaces[@]}`
if [ "$toto" == "" ];then
if [ $opt_int -eq 2 ];then
clear;echo "No hay ninguna interface ACTIVA en este ordenador";pause;
else
clear;echo "No hay ninguna interface en este ordenador";
pause;
fi
else
echo "Selecciona la interface para ver su configuración"
cont_int2=1
for j in `echo ${tinterfaces[@]}`
do
echo " [$cont_int2]- $j";
cont_int2=`expr $cont_int2 + 1`
done
read iface
if [ "$iface" == "" ] || [ $iface -gt $cont_int2 ] || [ $iface -lt 1 ];then
echo "No has seleccionado una interface correcta";pause;
else
iface2=`echo ${tinterfaces[$iface]}`;
tipo=`grep "iface $iface2" /etc/network/interfaces | cut -f"4" -d" "`
if [ "$tipo" == "dhcp" ];then
ifconfig -a | sed -e '/^'$iface2'/,/)$/w /etc/juju' >> /dev/null
broadcast=`cat /etc/juju | grep inet: | tr " " "-" | sed -e 's/----------//g' -e 's/--/-/g' | cut -f"3" -d"-" | cut -f"2" -d":"`
ip=`cat /etc/juju | grep inet: | tr " " "-" | sed -e 's/----------//g' -e 's/--/-/g' | cut -f"2" -d"-" | cut -f"2" -d":"`
mascara=`cat /etc/juju | grep inet: | tr " " "-" | sed -e 's/----------//g' -e 's/--/-/g' | cut -f"4" -d"-" | cut -f"2" -d":"`
mac=`cat /etc/juju | grep HW | tr " " "-" | sed -e 's/------//g' -e 's/--/-/g' | cut -f"4" -d"-"`
echo " TIPO: DHCP "
echo ""
echo " IP: $ip"
echo " MASCARA DE SUBRED: $mascara"
echo " MAC ADDRESS: $mac"
echo " DIRECCION DE BROADCAST: $broadcast"
pause;
elif [ "$tipo" == "static" ];then
ip=`grep -A 6 "iface eth$iface" /etc/network/interfaces | grep address | cut -f"2" -d" "`
mascara=`grep -A 6 "iface eth$iface" /etc/network/interfaces | grep netmask | cut -f"2" -d" "`
gateway=`grep -A 6 "iface eth$iface" /etc/network/interfaces | grep gateway | cut -f"2" -d" "`
if [ "$ip" == "" ] && [ "$gateway" == "" ] && [ "$mascara" == "" ];then
echo "La interface está configurada como estática pero no está configurada correctamente en el archivo /etc/network/interfaces"
pause;
else
echo " TIPO: ESTATICO "
echo " IP: $ip"
echo " MASCARA DE SUBRED: $mascara"
echo " DIRECCION DE BROADCAST: $broadcast"
pause;
fi
fi
fi
fi
}
int_cambiar_dhcp()
{
unset tinferfaces
cont2_int=1
set -a tinterfaces
for i in `grep "^iface eth[0-9]\+[^dhcp]" /etc/network/interfaces | cut -f"2" -d" "`
do
tinterfaces[$cont2_int]=$i
cont2_int=`expr $cont2_int + 1`
done
if [ "${tinterfaces[@]}" == "" ];then
echo "No hay interfaces configuradas de manera estática";
else
cont2_int=1
echo "Selecciona la interface que quieres pasar a configuración automática"
for j in `echo ${tinterfaces[@]}`
do
echo "[$cont2_int]- ${tinterfaces[$cont2_int]}"
done
read iface
if [ "$iface" == "" ] || [ $iface -gt $cont2_int ] || [ $iface -lt 1 ];then
echo "No has seleccionado ninguna interface";
else
sed 's/iface '${tinterfaces[$iface]}' inet static/iface '${tinterfaces[$iface]}' inet dhcp/g' /etc/network/interfaces > /etc/network/interfaces2
mv /etc/network/interfaces /etc/network/interfaces_copy
mv /etc/network/interfaces2 /etc/network/interfaces
if [ $? -eq 0 ];then
echo "Interface actualizada correctamente, reinicia el servicio con:"
echo "/etc/init.d/networking restart"
pause;
else
echo "Ha habido un problema durante el cambio, vuelve a intentarlo"
fi
fi
fi
}
menu_interface()
{
cont_int=0
while [ $cont_int -eq 0 ];
do
clear
echo " [Menu de configuracion de interfaces]";
echo " [1] - Ver interfaces del ordenador";
echo " [2] - Ver interfaces activas";
echo " [3] - Cambiar direcionamiento estático";
echo " [4] - Cambiar a direccionamiento automático(DHCP)";
echo " [5] - Volver al menu principal";
read opt_int
case $opt_int in
1)int_ver todas;;
2)int_ver activas;;
3)int_cambiar_datos;;
4)int_cambiar_dhcp;;
5)break;;
*)echo "Has introducido una opción erronea, introduce una opción del 1 al 4.";;
esac
done
}
menu_ip()
{
clear
echo "Introduce una ip"
read ip
echo "¿Cómo quieres introducir la máscara?"
echo "[1]- En formato decimal - Ejemplo 255.255.255.0"
echo "[2]- En formato contraido - Ejemplo 8 o 16 o 32"
read selmascara
case $selmascara in
1)echo "Introduce tu mascara";read mascara;binario_ip $ip $mascara decimal;;
2)echo "Introduce tu mascara";read mascara;binario_ip $ip $mascara simple;;
*)echo "El formato introducido es incorrecto"
esac
}
menu_dhcp()
{
cont_dhcp=0
while [ $cont_dhcp -eq 0 ];
do
clear
echo " [Menu de instalación de DHCP]";
echo " [1] - Instalar servicio";
echo " [2] - Seleccionar la/s interface/s para servir el DHCP";
echo " [3] - Configurar ámbito";
echo " [4] - Configurar host mediante MAC";
echo " [5] - Volver al menu principal";
read opt_dhcp
case $opt_dhcp in
1)dhcp;;
2)interfaces_dhcp;;
3)menu_ambito_dhcp;;
4);;
5)break;;
*)echo "Has introducido una opción erronea, introduce una opción del 1 al 4.";;
esac
done
}
menu_ambito_dhcp()
{
cont_ambito=0
while [ $cont_ambito -eq 0 ]
do
clear
echo " [1] - Ver los ámbitos ya configurados";
echo " [2] - Añadir nuevo ámbito";
echo " [3] - Eliminar ámbito";
echo " [4] - Volver al menu anterior";
read ambito
case $ambito in
1)dhcp_ver_ambito;;
2)dhcp_anadir_ambito;;
3)dhcp_eliminar_ambito;;
4)break;;
*)echo " ¡Opción incorrecta!";echo " Asegurate que has pulsado un numero del 1 al 4 por favor"
esac
done
}
menu_apache()
{
cont_apache=0
while [ $cont_apache -eq 0 ];
do
clear
echo " [Menu de instalación de APACHE]";
echo " [1] - Instalar servicio";
echo " [2] - Ver sitios configurados";
echo " [3] - Configurar nuevo sitio";
echo " [4] - Volver al menu principal";
read opt_apache
case $opt_apache in
1)apache;;
2)apache_ver_sitios;;
3)apache_config_sitio;;
4)break;;
*)echo "Has introducido una opción erronea, introduce una opción del 1 al 4.";;
esac
done
}
menu_dns()
{
cont_dns=0
while [ $cont_dns -eq 0 ];
do
clear
echo " [Menu de instalación de DNS(bind9)]";
echo " [1] - Instalar servicio";
echo " [2] - Añadir nueva zona";
echo " [3] - Borrar zona";
echo " [4] - Ver configuración de las zonas";
echo " [5] - Añadir subdominio a zona";
echo " [6] - Volver al menu principal";
read opt_dns
case $opt_dns in
1)dns;;
2)dns_anadir_zona;;
3)dns_borrar_zona;;
4)dns_ver_zonas;;
5)dns_menu_anadir_registro;;
6)break;;
*)echo "Has introducido una opción erronea, introduce una opción del 1 al 4.";;
esac
done
}
dns_menu_anadir_registro()
{
cont_dns1=0
while [ $cont_dns -eq 0 ];
do
clear
echo " [Menu de adición de registros DNS]";
echo "";
echo "";
echo " ¿Qué tipo de registros desea añadir?";
echo " [1] - Registro del tipo A";
echo " [2] - Registro del tipo CNAME";
echo " [3] - Volver al menu principal";
read opt_dns1
case $opt_dns1 in
1)dns_anadir_registro A;;
2)dns_anadir_registro CNAME;;
3)break;;
*)echo "Has introducido una opción erronea, introduce una opción del 1 al 4.";;
esac
done
}
#<--------------------------------------------FIN SUBMENUS
#<--------------------------------------------INSTALACION DE SERVICIOS
binario_ip()
{
#Primero compruebo que los datos obtenidos mediante teclado son correctos para continuar con la funcion
clear
typeset -a ipfinal
typeset -a ipcita
typeset -a mascarita
typeset -a octeto
octeto[1]=128
octeto[2]=64
octeto[3]=32
octeto[4]=16
octeto[5]=8
octeto[6]=4
octeto[7]=2
octeto[8]=1
let ipcita[1]=`echo $1 | cut -f"1" -d"."`
let ipcita[2]=`echo $1 | cut -f"2" -d"."`
let ipcita[3]=`echo $1 | cut -f"3" -d"."`
let ipcita[4]=`echo $1 | cut -f"4" -d"."`
let mascarita[1]=`echo $2 | cut -f"1" -d"."`
let mascarita[2]=`echo $2 | cut -f"2" -d"."`
let mascarita[3]=`echo $2 | cut -f"3" -d"."`
let mascarita[4]=`echo $2 | cut -f"4" -d"."`
#Obtengo la ip en binario dentro de un array
for i in `echo ${ipcita[*]}`
do
offset=$i;
for j in `seq 1 8`
do
resta=`expr $offset - ${octeto[$j]}`
if [ $resta -ge 0 ];then
total=`expr ${#ipfinal[@]} + 1`
ipfinal[$total]=1
offset=`expr $offset - ${octeto[$j]}`
else
total=`expr ${#ipfinal[@]} + 1`
ipfinal[$total]=0
fi
done
done
#Obtengo la máscara de subred en binario dentro de un array
if [ "$3" == "decimal" ];then
for i in `echo ${mascarita[*]}`
do
offset=$i;
for j in `seq 1 8`
do
resta=`expr $offset - ${octeto[$j]}`
if [ $resta -ge 0 ];then
total=`expr ${#mascarafinal[@]} + 1`
mascarafinal[$total]=1
offset=`expr $offset - ${octeto[$j]}`
else
total=`expr ${#mascarafinal[@]} + 1`
mascarafinal[$total]=0
fi
done
done
elif [ "$3" == "simple" ];then
if [[ $mascara =~ [0-9]{1,2}$ ]] && [ $mascara -le 30 ] && [ $mascara -ge 8 ];then
for k in `seq 1 32`
do
if [ $k -le $mascara ];then
mascarafinal[$k]=1
else
mascarafinal[$k]=0
fi
done
else
echo "Has introducido un numero superior a 30, vuelve a intentarlo de nuevo"
fi
fi
#Observo si la mascara introducida es correcta o no
#Para ello obtengo el primer bit que es 0,y a partir de él reviso si hay algun bit en 1, si lo hay,la máscara no es válida.
error=no
for k in `seq 1 32`
do
if [ ${mascarafinal[$k]} -eq 0 ];then
primero=$k
break;
fi
done
#Ahora recorro la máscara a partir del primer bit en 0.
for i in `seq $primero 32`
do
if [ ${mascarafinal[$i]} -eq 1 ];then
error=si
fi
done
pause
if [ "$error" == "si" ];then
clear
echo ""
echo ""
echo " La máscara introducida no es válida, por favor vuelve a intentarlo"
else
total=`echo ${#ipfinal[@]}`
typeset -a ipfinal3
typeset -a ipmascara
#Comparo la mascara con la ip y genero otra ip teoricamente de red en binario
cont2=1
for r in `echo ${mascarafinal[@]}`
do
if [ $r -eq 0 ];then
ipfinal3[$cont2]=0;
else
ipfinal3[$cont2]=`echo ${ipfinal[$cont2]}`;
fi
cont2=`expr $cont2 + 1`
done
#Paso la ip de binario a decimal
typeset -a requete
for y in `seq 1 4`
do
requete[$y]=0
cont=1
for g in `seq 1 8`
do
offset=`expr $y - 1`
offset=`expr 8 \* $offset`
offset=`expr $offset + $g`
if [ ${ipfinal3[$offset]} -eq 1 ];then
requete[$y]=`expr ${requete[$y]} + ${octeto[$g]}`
fi
done
done
echo "La ip red es:"
echo ${requete[1]}.${requete[2]}.${requete[3]}.${requete[4]}
#Saco la ip de broadcast
typeset -a requete
for y in `seq 1 4`
do
requete[$y]=0
cont=1
for g in `seq 1 8`
do
offset=`expr $y - 1`
offset=`expr 8 \* $offset`
offset=`expr $offset + $g`
if [ ${ipfinal3[$offset]} -eq 1 ] || [ ${mascarafinal[$offset]} -eq 0 ];then
requete[$y]=`expr ${requete[$y]} + ${octeto[$g]}`
fi
done
done
echo "La ip de broadcast es:"
echo ${requete[1]}.${requete[2]}.${requete[3]}.${requete[4]}
#Saco la primera ip de red, para ello, primero obtengo la primera posición donde el bit de la máscara de subred es 0.
typeset -a requete
for y in `seq 1 4`
do
requete[$y]=0
cont=1
for g in `seq 1 8`
do
offset=`expr $y - 1`
offset=`expr 8 \* $offset`
offset=`expr $offset + $g`
if [ ${ipfinal3[$offset]} -eq 1 ] && [ $offset -lt $primero ] ;then
requete[$y]=`expr ${requete[$y]} + ${octeto[$g]}`
elif [ ${ipfinal3[$offset]} -eq 0 ] && [ $offset -ne 32 ];then
requete[$y]=`expr ${requete[$y]}`
elif [ $offset -eq 32 ];then
requete[$y]=`expr ${requete[$y]} + 1`
fi
done
done
echo "La primera ip de red es:"
echo ${requete[1]}.${requete[2]}.${requete[3]}.${requete[4]}
for y in `seq 1 4`
do
requete[$y]=0
cont=1
for g in `seq 1 8`
do
offset=`expr $y - 1`
offset=`expr 8 \* $offset`
offset=`expr $offset + $g`
if [ ${ipfinal3[$offset]} -eq 1 ] || [ ${mascarafinal[$offset]} -eq 0 ];then
if [ $offset -eq 32 ];then
requete[$y]=`expr ${requete[$y]}`
else
requete[$y]=`expr ${requete[$y]} + ${octeto[$g]}`
fi
fi
done
done
echo "La ultima ip de red es:"
echo ${requete[1]}.${requete[2]}.${requete[3]}.${requete[4]}
echo "El total de hosts que puede albergar esta red es de:"
total=`expr $primero - 1`
total=`expr 32 - $total`
total=`echo "2^$total" | bc -l`
echo `expr $total - 2`
fi
pause;
}
#<----------------------------------------DNS
dns(){
existe=`ps -ef | grep "bind" | wc -l`
if [ $existe -gt 2 ];then
clear;
echo "El servicio de BIND9 ya está instalado, no puede instalarlo de nuevo"
pause;
else
clear;
echo "Instalando servicio BIND9 mediante apt-get, un momento por favor...";
apt-get -y install bind9;
sleep 2;
echo "";
if [ $? -eq 0 ]; then
echo "Servicio instalado correctamente";
sleep 2;
fi
fi
}
dns_borrar_zona()
{
typeset -a zonas
cont=1
no=si
for i in `grep "zone [a-z0-9]\+" /etc/bind/named.conf.local | cut -f"2" -d" "`
do
zonas[$cont]=$i
echo "[$cont] - $i"
cont=`expr $cont + 1`
no=no
done
total=`echo ${#zonas[@]}`
if [ $total -eq 0 ];then
echo "No hay zonas configuradas para borrar";
pause;
else
echo "Selecciona la zona que quieres borrar"
read zona
if [ "$zona" == "" ];then
echo "No has seleccionado ninguna zona";pause;
else
echo "entre";pause;
total=`echo ${#zonas[@]}`
if [ $zona -gt $total ] || [ $zona -lt 1 ];then
echo "Tu número seleccionado no esta dentro de la zonas mostradas"
pause;
else
zona=`echo ${zonas[$zona]}`
sed -e '/^zone '$zona'/,/};$/d' /etc/bind/named.conf.local > /etc/bind/named.conf.local1
rm /etc/bind/named.conf.local
mv /etc/bind/named.conf.local1 /etc/bind/named.conf.local
#Identifico si las zonas a borrar son directa o inversa
if [[ $zona =~ ^[a-z]+\.[a-z]{1,3}$ ]];then
rm /var/cache/bind/db.$zona
if [ $? -eq 0 ];then
echo "Zona borrada correctamente";
pause;
fi
elif [[ $zona =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.+ ]];then
zona=`echo $zona | cut -f"1,2,3" -d"."`
rm /var/cache/bind/db.$zona
if [ $? -eq 0 ];then
echo "Zona borrada correctamente";
pause;
fi
fi
fi
fi
fi
}
dns_anadir_registro()
{
typeset -a zonas
cont=1
for i in `grep "zone [a-z0-9]\+" /etc/bind/named.conf.local | cut -f"2" -d" "`
do
zonas[$cont]=$i
echo "[$cont] - $i"
cont=`expr $cont + 1`
no=no
done
total=`echo ${#zonas[@]}`
if [ $total -eq 0 ];then
echo "No hay zonas configuradas para poder añadir registros";
pause;
else
echo "Selecciona la zona en la que quiere añadir el registro"
read zona
if [ $zona -gt $total ] || [ $zona -lt 1 ] || [ "$zona" == "" ] || [[ $zona =~ ^[a-z]+ ]];then
echo "Has realizado una seleccion incorrecta";
else
zona=`echo ${zonas[$zona]}`
if [[ $zona =~ ^[a-z]+\.[a-z]{1,3}$ ]];then
dns_registro $1
elif [[ $zona =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.+ ]];then
zona=`echo $zona | cut -f"1,2,3" -d"."`
dns_registro $1
fi
fi
fi
}
dns_registro()
{
if [[ $zona =~ ^[a-z]+\.[a-z]{1,3}$ ]];then
if [ "$1" == "A" ];then
echo "Introduce el nuevo nombre a resolver."
echo "Introduce www si lo que quieres es resolver www.$zona"
read nombre
clear
echo "Introduce la ip a la que apunta."
echo "Ejemplo: si pones 192.168.1.1 $nombre.$zona apuntará a esa ip"
read ipdudosa
if validar_ip $ipdudosa && [ "$nombre" != "" ] && [[ $nombre =~ ^[a-z]+$ ]];then
echo "$nombre IN A $ipdudosa" >> /var/cache/bind/db.$zona
echo "Registro introducido correctamente";pause;
else
echo "Algun dato introducido no es correcto."
echo "Nombre: $nombre IP: $ipdudosa"
pause;
fi
fi
if [ "$1" == "CNAME" ];then
echo "Introduce el nuevo nombre a resolver."
echo "Introduce www si lo que quieres es resolver www.$zona"
read nombre
clear
echo "Introduce el registro al que se redirigirá"
echo ""
echo " Estos son los registros que hay"
typeset -a zonitas
cont=1
for i in `grep '^[a-z]' /var/cache/bind/db.iesgn.com | cut -f"1"`
do
zonitas[$cont]=$i
echo " [1] - ${zonitas[$cont]}"
cont=`expr $cont + 1`
done
echo "Ejemplo: si pones ${zonitas[1]}, $nombre apuntará a ${zonitas[1]}."
read alias
if [ "$nombre" != "" ] && [[ $nombre =~ ^[a-z]+$ ]] && [[ $alias =~ ^[a-z]+$ ]] && [ "$alias" == ""];then
echo "$nombre IN CNAME $alias.$zona." >> /var/cache/bind/db.$zona
echo "Registro introducido correctamente";pause;
else
echo "Algun dato introducido no es correcto."
echo "Nombre: $nombre Alias: $alias"
pause;
fi
fi
elif [[ $zona =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.+ ]];then
echo "hola"
fi
}
dns_anadir_zona()
{
comprueba_servicio bind
if [ $servicio -eq 1 ];then
preg=0
while [ $preg -ne 3 ]
do
preg=0
echo "Introduce la ip de este ordenador"
read ipdudosa
if [ "$ipdudosa" == "" ];then
echo "Has introducido una ip no válida"
else
if validar_ip $ipdudosa;then
ippc=$ipdudosa
preg=`expr $preg + 1`
echo "Introduce el dominio del sitio, SIN LAS WWW"
read dominio
if [ "$dominio" != "" ];then
if [[ $dominio =~ ^[a-z]+\.[a-z]{1,3}$ ]];then
preg=`expr $preg + 1`
else
echo "La sintaxis del dominio introducido es incorrecta."
echo " iesgn.com"
echo " marca.com"
echo " terra.es"
fi
else
echo "No has introducido ningun dominio"
fi
fi
fi
echo "Introduce la ip de red a resolver"
echo "Por ejemplo 192.168.0.0"
read ipdudosa
if [ "$ipdudosa" != "" ];then
if validar_ip $ipdudosa ;then
preg=`expr $preg + 1`
else
echo "La ip introducida es incorrecta"
fi
else
echo "La ip de red a resolver es incorrecta"
fi
if [ $preg -ne 3 ];then
echo "Uno o varios de los parámetros ha sido mal introducidos.";
echo "¿Quieres volver a intentarlo? s/n"
read intento
if [ "$intento" == "n" ];then
break;
fi
fi
done
if [ $preg -eq 3 ];then
#Se resuelve el dominio mediante DNS
ipdudosa1=`echo $ipdudosa | cut -f"1" -d"."`
ipdudosa2=`echo $ipdudosa | cut -f"2" -d"."`
ipdudosa3=`echo $ipdudosa | cut -f"3" -d"."`
red=$ipdudosa3.$ipdudosa2.$ipdudosa1
if [ -f /var/cache/bind/db.$dominio ] || [ -f /var/cache/bind/db.$red ];then
echo "La zona que quiere insertar ya está dentro de las zonas configuradas"
pause;
else
touch /var/cache/bind/db.$dominio
if [ $? -eq 0 ];then
touch /var/cache/bind/db.$red
if [ $? -eq 0 ]; then
dns_inserta_zona
fi
fi
fi
fi
else
echo "El servicio de DNS no está instalado"
pause;
fi
}
dns_ver_zonas()
{
typeset -a zonas
cont=1
for i in `grep "zone [a-z0-9]\+" /etc/bind/named.conf.local | cut -f"2" -d" "`
do
zonas[$cont]=$i
echo "[$cont] - $i"
cont=`expr $cont + 1`
no=no
done
total=`echo ${#zonas[@]}`
echo "Selecciona la zona que quieres visualizar"
read zona
echo $total;pause;
if [ $total -eq 0 ];then
echo "No hay zonas configuradas para poder visualizar";
pause;
else
if [ $zona -gt $total ] || [ $zona -lt 1 ];then
echo "Tu seleccion es incorrecta";pause;
else
zona=`echo ${zonas[$zona]}`
if [[ $zona =~ ^[a-z]+\.[a-z]{1,3}$ ]];then
cat /var/cache/bind/db.$zona
pause;
elif [[ $zona =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.+ ]];then
zona=`echo $zona | cut -f"1,2,3" -d"."`
cat /var/cache/bind/db.$zona
pause;
fi
fi
fi
}
dns_inserta_zona()
{
echo "zone "$dominio" {" >> /etc/bind/named.conf.local
echo " type master;" >> /etc/bind/named.conf.local
echo " file \"db.$dominio\";" >> /etc/bind/named.conf.local
echo "};" >> /etc/bind/named.conf.local
echo "zone "$red.in-addr.arpa" {" >> /etc/bind/named.conf.local
echo " type master;" >> /etc/bind/named.conf.local
echo " file \"db.$red\";" >> /etc/bind/named.conf.local
echo "};" >> /etc/bind/named.conf.local
echo "@ IN SOA $dominio. root.$dominio. (" >> /var/cache/bind/db.$dominio
echo " 1 ; serial" >> /var/cache/bind/db.$dominio
echo " 604800 ; refresco" >> /var/cache/bind/db.$dominio
echo " 86400 ; reintentos" >> /var/cache/bind/db.$dominio
echo " 2419200 ; expira (1 semana)" >> /var/cache/bind/db.$dominio
echo " 604800 ) ;" >> /var/cache/bind/db.$dominio
echo " " >> /var/cache/bind/db.$dominio
echo "@ IN NS $HOSTNAME.$dominio." >> /var/cache/bind/db.$dominio
echo "$HOSTNAME IN A $ippc" >> /var/cache/bind/db.$dominio
echo "@ IN SOA $dominio. root.$dominio. (" >> /var/cache/bind/db.$red
echo " 1 ; serial" >> /var/cache/bind/db.$red
echo " 604800 ; refresco" >> /var/cache/bind/db.$red
echo " 86400 ; reintentos" >> /var/cache/bind/db.$red
echo " 2419200 ; expira (1 semana)" >> /var/cache/bind/db.$red
echo " 604800 ) ;" >> /var/cache/bind/db.$red
echo " " >> /var/cache/bind/db.$red
echo "@ IN NS $HOSTNAME.$dominio." >> /var/cache/bind/db.$red
host=`echo $ippc | cut -f"4" -d"."`
echo "$host IN PTR $HOSTNAME.$dominio." >> /var/cache/bind/db.$red
echo "La zona directa e inversa del dominio $dominio ha sido instalada"
pause;
}
#<----------------------------------------FIN DNS
#<----------------------------------------APACHE
apache(){
existe=`ps -ef | grep apache2 | wc -l`
if [ $existe -gt 1 ];then
clear;
echo "El daemon de APACHE ya está instalado, no puede instalarlo de nuevo"
pause;
else
clear;
echo "Instalando servicio APACHE mediante apt-get, un momento por favor...";
apt-get -y install apache2;
sleep 2;
echo "";
if [ $? -eq 0 ]; then
echo "Servicio instalado correctamente";
sleep 2;
fi
fi
}
apache_ver_sitios()
{
comprueba_servicio apache;
if [ $servicio -eq 1 ];then
typeset -a SITIOS
typeset -a SITIOS2
cont_apache2=1
for i in `ls /etc/apache2/sites-enabled`
do
if [ "$i" != "000-default" ];then
SITIOS[$cont_apache2]=`grep ServerName /etc/apache2/sites-enabled/$i | cut -f"2" -d" "`;
SITIOS2[$cont_apache2]=$i;
cont_apache2=`expr $cont_apache2 + 1`;
fi
done
sititos=`echo ${SITIOS[@]}`
if [ "$sititos" == "" ];then
clear
echo -e " \e[43;31mNo hay sitios configurados en APACHE\e[00m"
else
echo "Elige el sitio del que quieres ver la configuración";
cont_apache2=1;
for i in `ls /etc/apache2/sites-enabled`
do
if [ "$i" != "000-default" ];then
echo " [$cont_apache2] - ${SITIOS[$cont_apache2]}";
cont_apache2=`expr $cont_apache2 + 1`;
fi
done
read sitio;
archivo=`echo ${SITIOS2[$sitio]`
if [ -e /etc/apache2/sites-enabled/$archivo ];then
echo "El archivo de configuración del sitio ${SITIOS[$sitio]} es el siguiente:"
more /etc/apache2/sites-enabled/${SITIOS2[$sitio]};
echo "";
pause;
fi
fi
else
echo "El servicio no está instalado"
sleep 2
fi
}
apache_config_sitio()
{
cont_apache=0
while [ $cont_apache -eq 0 ];
do
clear
echo " [Menu de instalación de APACHE]";
echo " [1] - Instalar nuevo sitio";
echo " [2] - Borrar sitio";
echo " [3] - Volver al menu APACHE";
read opt_apache
case $opt_apache in
1)apache_instalar_sitio;;
2)apache_borrar_sitio;;
3)break;;
*)echo "Has introducido una opción erronea, introduce una opción del 1 al 4.";;
esac
done
}
apache_instalar_sitio()
{
comprueba_servicio apache
if [ $servicio -eq 1 ];then
preg=0
while [ $preg -ne 2 ]
do
preg=0
echo "Introduce el dominio del sitio"
read dominio
if [ "$dominio" != "" ];then
if [ -f /etc/apache2/sites-available/$dominio ];then
echo "Este dominio ya está configurado, deberás volverlo a meter después de introducir la carpeta"
pause;
else
preg=`expr $preg + 1`
fi
fi
echo "Introduce la carpeta del sitio(con ruta absoluta)"
echo "Por ejemplo /var/www/misitio"
read carpeta
if [ "$carpeta" != "" ];then
if [ -d $carpeta ];then
echo "La carpeta ya existe";
else
preg=`expr $preg + 1`
fi
fi
if [ $preg -ne 2 ];then
echo "Uno o varios de los parámetros ha sido mal introducidos.";
echo "¿Quieres volver a intentarlo? s/n"
read intento
if [ "$intento" == "n" ];then
break;
fi
fi
done
if [ $opt_apache -eq 1 ] && [ $preg -eq 2 ];then
#Se resuelve el dominio mendiante DNS
touch /etc/apache2/sites-available/$dominio
apache_nuevo_sitio_dns
fi
else
echo "El servicio de APACHE no está instalado"
pause;
fi
}
apache_borrar_sitio()
{
comprueba_servicio apache
if [ $servicio -eq 1 ];then
typeset -a SITIOS
cont=1;
for k in `ls /etc/apache2/sites-available`
do
if [ "$k" != "default" ] && [ "$k" != "default-ssl" ];then
SITIOS[$cont]=$k
echo " [$cont]- $k"
cont=`expr $cont + 1`;
fi
done
read sitio
if [ $sitio -gt 0 ] && [ $sitio -le $cont ];then
rm /etc/apache2/sites-enabled/${SITIOS[$sitio]};
if [ $? -eq 0 ];then
rm /etc/apache2/sites-available/${SITIOS[$sitio]};
pause
if [ $? -eq 0 ]; then
echo "Sitio borrado correctamente"
fi
else
echo "No se ha podido borrar el enlace simbólico, vuelva a intentarlo";
fi
else
echo "Tu selección es erroneo, vuelve a intentarlo"
fi
fi
}
apache_nuevo_sitio_dns()
{
if [ -d /etc/apache2/sites-available/ ];then
if [ -f /etc/apache2/sites-available/$dominio ];then
echo "<VirtualHost *:80>" >> /etc/apache2/sites-available/$dominio;
echo " ServerAdmin webmaster@localhost" >> /etc/apache2/sites-available/$dominio;
echo " ServerName $dominio" >> /etc/apache2/sites-available/$dominio;
echo " DocumentRoot $carpeta" >> /etc/apache2/sites-available/$dominio;
echo " <Directory />" >> /etc/apache2/sites-available/$dominio;
echo " Options FollowSynLinks" >> /etc/apache2/sites-available/$dominio;
echo " AllowOverride None" >> /etc/apache2/sites-available/$dominio;
echo " </Directory>" >> /etc/apache2/sites-available/$dominio;
echo " <Directory $carpeta>" >> /etc/apache2/sites-available/$dominio;
echo " Options Indexes FollowSynLinks MultiViews" >> /etc/apache2/sites-available/$dominio;
echo " AloowOverride None" >> /etc/apache2/sites-available/$dominio;
echo " Order allow,deny" >> /etc/apache2/sites-available/$dominio;
echo " allow from all" >> /etc/apache2/sites-available/$dominio;
echo " </Directory>" >> /etc/apache2/sites-available/$dominio;
echo "</VirtualHost>" >> /etc/apache2/sites-available/$dominio;
echo "$dominio ha sido instalado correctamente"
pause;
ln -s /etc/apache2/sites-available/$dominio /etc/apache2/sites-enabled/$dominio;
pause;
if [ $? -eq 0 ];then
echo "$dominio ha sido instalado correctamente"
else
echo "El enlace simbólico no se ha creado, reintentelo de nuevo";
fi
fi
else
echo "La carpeta /etc/apache2/sites-available no existe, prueba a reinstalar el servicio"
pause;
fi
}
#<----------------------------------------FIN APACHE
#<----------------------------------------DHCP
dhcp(){
comprueba_servicio dhcp
echo $servicio;
sleep 2
if [ $servicio -eq 1 ];then
clear;
echo "El daemon de DHCP ya está instalado, no puede instalarlo de nuevo"
pause;
else
clear;
echo "Instalando servicio DHCP mediante apt-get, un momento por favor...";
echo "";
apt-get -y install dhcp3-server;
if [ $? -eq 0 ]; then
sleep 2;
echo "Servicio instalado correctamente";
sleep 2;
fi
fi
}
dhcp_datos(){
echo "[DATOS PARA DHCP]Si no responde correctamente la configuración de DHCP será incorrecta";
echo " Si no responde correctamente la configuración de DHCP será incorrecta";
echo "";
interface;
}
dhcp_anadir_ambito()
{
typeset -a DNSS
clear
dns_cont=0
while [ $dns_cont -eq 0 ]
do
echo " ¿Cuántos servidores DNS quieres otorgar mediante DHCP? Máximo 4."
read dns_cantidad
case $dns_cantidad in
[1-4])
for z in `seq 1 $dns_cantidad`
do
conti=1
while [ $conti -eq 1 ]
do
echo "Introduce la ip del servidor DNS número $z"
read ipdudosa
if validar_ip ipdudosa;then
DNSS[$z]=$ipdudosa;
conti=0
else
clear;echo "La ip introducida es incorrecta, por favor vuelva a intentarlo";
fi
done
done
clear;echo "Los servidores DNS que se van a otorgar mediante DHCP serán:"
echo ${DNSS[@]};
pause;clear;
echo "Introduce el nombre de dominio"
read dominio
preg=0
while [ $preg -ne 6 ]
do
preg=0
echo "Introduce la dirección de broadcast"
read ipdudosa
if validar_ip ipdudosa;then
preg=`expr $preg + 1`
broadcast=$ipdudosa
fi
echo "Introduce el gateway"
read ipdudosa
if validar_ip ipdudosa;then
preg=`expr $preg + 1`
gateway=$ipdudosa
fi
echo "Introduce la primera IP del rango que servirá DHCP"
read ipdudosa
if validar_ip ipdudosa;then
preg=`expr $preg + 1`
rango=$ipdudosa;
fi
echo "Introduce la segunda IP del rango que servirá DHCP"
read ipdudosa
if validar_ip ipdudosa;then
preg=`expr $preg + 1`
rango2=$ipdudosa;
fi
echo "Introduce la máscara de subred"
read ipdudosa
if validar_ip ipdudosa;then
preg=`expr $preg + 1`
mascara=$ipdudosa;
fi
echo "Introduce la red"
read ipdudosa
if validar_ip ipdudosa;then
preg=`expr $preg + 1`
red=$ipdudosa;
fi
if [ $preg -ne 6 ];then
echo "Uno de los parámetros ha sido mal introducido.";
echo "¿Quieres volver a intentarlo? s/n"
read intento
if [ "$intento" == "n" ];then
break;
fi
fi
done
pon_ambito_dhcp;
dns_cont=1;
;;
*)echo "Asegúrate que has introducido un número del 1 al 9";;
esac
done
}
dhcp_eliminar_ambito()
{
sed -e '/^subnet/w /etc/juju' /etc/dhcp/dhcpd.conf >> /dev/null
typeset -a AMBITOS
cont=1
for k in `cat /etc/juju | cut -f"2" -d" "`
do
AMBITOS[$cont]=$k;
cont=`expr $cont + 1`;
done
ambito=`echo ${AMBITOS[@]}`
if [ "$ambito" == "" ];then
clear;
echo "No tienes ámbitos configurados"
else
maximo=`expr $cont - 1`;
echo "¿Qúe ámbito deseas borrar?"
for i in `seq 1 $maximo`
do
echo " [$i] - ${AMBITOS[$i]}";
done
read ambito
if [ $ambito -gt 0 ] && [ $ambito -le $maximo ];then
ambito=`echo ${AMBITOS[$ambito]}`;
clear;
echo "Borrando ámbito"
sleep 2
sed -e '/^subnet '$ambito'/,/}$/d' /etc/dhcp/dhcpd.conf > /etc/dhcp/dhcpd.conf1
cat /etc/dhcp/dhcpd.conf1 > /etc/dhcp/dhcpd.conf
echo "Borrado, volviendo al menu de ámbitos"
else
echo "Has seleccionado erroneo";
fi
fi
pause;
}
dhcp_ver_ambito()
{
sed -e '/^subnet/,/}$/w /etc/juju' /etc/dhcp/dhcpd.conf >> /dev/null
cat /etc/juju;
rm /etc/juju >> /dev/null
pause;
}
pon_ambito_dhcp()
{
dnss=`echo ${DNSS[@]} | sed 's/ /\, /g'`
echo "subnet $red netmask $mascara {" >> /etc/dhcp/dhcpd.conf
echo " range $rango $rango2;" >> /etc/dhcp/dhcpd.conf
echo " option domain-name-servers $dnss;" >> /etc/dhcp/dhcpd.conf
echo " option domain-name $dominio;" >> /etc/dhcp/dhcpd.conf
echo " option routers $gateway;" >> /etc/dhcp/dhcpd.conf
echo " option broadcast-address $broadcast;" >> /etc/dhcp/dhcpd.conf
echo " default-lease-time 600;" >> /etc/dhcp/dhcpd.conf
echo " max-lease-time;" >> /etc/dhcp/dhcpd.conf
echo "}" >> /etc/dhcp/dhcpd.conf
}
interface(){
echo " Introduzca la interface donde funcionará DHCP";
echo " Ejemplo: Si es eth0, introduzca un 0";
while [ $int -eq 0 ]; do
read int
if [ $int -gt 10 ]; then
echo "Has de introducir un numero de 0 al 10";
int=0;
fi
done
}
#<--------------------------------------------FIN DHCP SERVICIO
#<--------------------------------------------MENU PRINCIPAL
menu(){
clear
echo " [Menu de instalación de servicios]";
echo " Elige el servicio";
echo " [1- DHCP]";
echo " [2- APACHE]";
echo " [3- DNS]";
echo " [4- CONFIGURAR INTERFACES]";
echo " [5- DIRECCIONAMIENTO DE REDES]";
echo " [6- SALIR]";
read option;
}
id | grep uid=0;
if [ $? -eq 0 ];then
contador=1;
while [ $contador -eq 1 ];
do
menu;
case $option in
1)menu_dhcp;;
2)menu_apache;;
3)menu_dns;;
4)menu_interface;;
5)menu_ip;;
6)exit;;
*) clear
echo "Has introducido un número equivocado, por favor introduce del 1 al 8.";;
esac
done
else
echo "No eres superusuario y no puedes ejecutar este script"
echo "¿Quieres autentificarte? s/n"
read autentificacion
if [ "$autentificacion" == "n" ];then
echo "Saliendo del programa";
sleep 2
elif [ "$autentificacion" == "s" ];then
sudo su
fi
fi
#<--------------------------------------------FIN DEL MENU PRINCIPAL