Install script:
usage:
./nm-nginx-7g-firewall-instalar.sh %username% %domain% [restart:no]
./nm-nginx-7g-firewall-instalar.sh myuser mydomain.com
./nm-nginx-7g-firewall-instalar.sh myuser mydomain.com no
nm-nginx-7g-firewall-instalar.sh
#!/bin/bash
nginx -t > /dev/null 2>&1 || abort "Nginx está mal configurado. Hay que configurarlo correctamente antes de usar esta herramienta."
#No reiniciar nginx si el parámetro $3 es "no" - NO SUFICIENTEMENTE PROBADO
if [ "$3" == "no" ]; then
reiniciarnginx="0"
else
reiniciarnginx="1"
fi
#echo "Reiniciar Nginx: $reiniciarnginx"
#importo funciones
source /opt/nm-bin/functions.sh
#compruebo que se ejecuta como root.
comoroot
#pido usuario y dominio
get_username_domain $1 $2
#si está instalado salgo
if [ -f /home/$username/conf/web/$domain/nginx.conf_7g ]; then
msg "7g firewall ya estaba instalado para $domain."
exit 0
#else
#msg "7g firewall no instalado en $domain procedo con la instalación"
fi
#si no está instalado, compruebo que está puesto en la máquina
if [ -f /etc/nginx/conf.d/7g-firewall.conf ] && [ -f /etc/nginx/7g/7g.conf ] ; then
#msg "7g firewall instalado en la máquina."
echo > /dev/null 2>&1
else
msg "7g firewall no instalado en la máquina. Procedo con la instalación."
#instalación para la máquina
##############################
SEVENGURL="https://perishablepress.com/7g-firewall-nginx/"
DOWNLOADURL=$(curl -s $SEVENGURL | sed -E -n -e "/^<div class=\"download\">$/{n;p}" \
| cut -d"\"" -f2)
if echo "$DOWNLOADURL" | grep -E "^https://perishablepress.com/downloads/[0-9]+/?$" -q; then
PROCEED=1
fi
if [[ $PROCEED ]]; then
#me muevo al home para descargar el .zip
cd ~ || exit
wget -O 7g.zip "$DOWNLOADURL"
#si se descargó bien
if file -i 7g.zip | grep "application/zip" -q; then
#si falla es porque no está instalada atool. instalo y repito comando.
aunpack 7g.zip || apt install atool -y && aunpack 7g.zip
mkdir /etc/nginx/7g
find ~/7g -name '7g.conf' -exec cp {} /etc/nginx/7g \;
find ~/7g -name '7g-firewall.conf' -exec sudo cp {} /etc/nginx/conf.d \;
if [[ ! -f /etc/nginx/7g/7g.conf ]]; then
echo "7g.conf cannot be found in the archive."
fi
if [[ ! -f /etc/nginx/conf.d/7g-firewall.conf ]]; then
echo "7g-firewall.conf cannot be found in the archive."
else
#dejo la marca para encontrarlo con nginx -T | grep 7G
sed -i "s/7G FIREWALL - NGINX v1.5/7G firewall - General rules and filters/g" /etc/nginx/conf.d/7g-firewall.conf
fi
#no se descargó
else
echo "7G Firewall cannot be downloaded."
echo "URL was $DOWNLOADURL"
fi
else
#la url no cumple con la expresión regular para ser válida
echo "7G Firewall will not be installed."
echo "URL was $DOWNLOADURL"
fi
##############################
fi
#ahora lo instalo para el dominio
cp /etc/nginx/7g/7g.conf /home/$username/conf/web/$domain/nginx.conf_7g
#Dejo constancia de que está instalado para encontrarlo al hacer "nginx -T | grep 7g"
sed -i "s/7G FIREWALL - NGINX v1.5/7G firewall - $domain/g" /home/$username/conf/web/$domain/nginx.conf_7g
msg "Listo - 7G firewall - $domain"
echo "reiniciar nginx - $domain: $reiniciarnginx"
if [ "$reinciarnginx" == "1" ]; then
nginx -t > /dev/null 2>&1 && service nginx restart || error "Fallo en la configuración de Nginx. No puedo reiniciar porque se caerían todas las webs."
else
nginx -t > /dev/null 2>&1 && msg "Configuración Nginx Correcta. $domain" || error "Fallo en la configuración de Nginx. $domain"
fi
disable 7g firewall in one domain: nm-nginx-7g-firewall-quitar.sh
usage:
./nm-nginx-7g-firewall-quitar.sh %username% %domain%
./nm-nginx-7g-firewall-instalar.sh myuser mydomain.com
nm-nginx-7g-firewall-quitar.sh
#!/bin/bash
nginx -t > /dev/null 2>&1 || abort "Nginx está mal configurado. Hay que configurarlo correctamente antes de usar esta herramienta."
#importo funciones
source /opt/nm-bin/functions.sh
#compruebo que se ejecuta como root.
comoroot
#pido usuario y dominio
get_username_domain $1 $2
#si está instalado salgo
if [ ! -f /home/$username/conf/web/$domain/nginx.conf_7g ]; then
msg "7g firewall no está instalado para $domain."
exit 0
else
msg "7g firewall está instalado en $domain procedo con la desinstalación"
rm /home/$username/conf/web/$domain/nginx.conf_7g
fi
msg "Listo"
nginx -t > /dev/null 2>&1 && service nginx restart || error "Fallo en la configuración de Nginx. No puedo reiniciar porque se caerían todas las webs."
support functions:
They should be in this path: /opt/nm-bin/functions.sh
#Para importar estas funciones hay que poner este código en los scripts
#source /opt/nm-bin/functions.sh
function serverncpu {
grep -c ^processor /proc/cpuinfo
}
function serverload {
uptime | cut -d',' -f4 | cut -d':' -f2
}
function servermaindiskfree {
#df -h | grep '^/dev.*% /$' | cut -c27-32 | sed 's/[[:space:]]//g'
df -h | grep '^/dev.*% /$' | tr -s ' ' | cut -d' ' -f4
}
function servermaindisktotal {
#df -h | grep '^/dev.*% /$' | cut -c21-26 | sed 's/[[:space:]]//g'
df -h | grep '^/dev.*% /$' | tr -s ' ' | cut -d' ' -f2
}
function servermaindiskpfree {
xfree=$(df | grep '^/dev.*% /$' | tr -s ' ' | cut -d' ' -f4)
xtotal=$(df | grep '^/dev.*% /$' | tr -s ' ' | cut -d' ' -f2)
echo "$xfree * 100 / $xtotal" | bc
}
function serverdiskusage {
df -h | grep "Filesystem\|^/dev/.*% /$\|^/dev/.*% /home.*"
}
#Escribe en el fichero log
#Sintaxis: logwrite "Mensaje" [fichero.log]
#Ejemplo: logwrite "Todo genial"
# Salida: /opt/nm-bin/logs/nm-logfile.log
# 2022-12-01 14:30:52 nm-script.sh: "Mensaje"
function logwrite {
if [ -z "$1" ]; then
msg "No puedo escribir en el log. No hay mensaje"
else
if [ -z "$2" ]; then
logfile="/opt/nm-bin/logs/nm-logfile.log"
else
logfile="$2"
fi
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "$timestamp - ${0##*/}: $1" >> $logfile
fi
}
#para evitar la ejecución de scripts auxiliares
function prevenir_ejecucion {
if [ ${0##*/} == ${BASH_SOURCE[0]##*/} ]; then
abort "Este es un script auxiliar que contiene funciones para otros scripts pero no hace nada."
fi
}
#prevenir_ejecucion
#hay que probar si funciona con functions.sh o con otros scripts
#Compruebo los permisos de un fichero
function permisos_comprobar {
if [ ! -f $1 ]; then
error "No existe el fichero $1"
permisos="0"
else
#si el fichero tiene los permisos buscados
permisos=$(stat -c '%a' $1)
if [ "$2" = "$permisos" ]; then
return 0
echo "return 0"
else
return 1
echo "return 1"
fi
fi
}
#Me da el día de hoy en formato YYYYMMDD: 20220629
hoy=$(date +'%Y%m%d')
#Me da el directorio desde el que se ejecutan los scripts
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
#comoroot: fuerza que el script sea ejecutado como root.
function comoroot {
if [ "$EUID" -ne 0 ]; then
error "Este comando debe ejecutarse como root."
fi
}
#compruebo mínimo de argumentos
#ejemplo: minargs 2 $#
# hay que pasar la variable $# que contiene el número de argumentos con el que fue llamado el script.
# $# no se puede usar dentro de la función porque devolverá el número de argumentos con los que la función fue llamada.
function minargs {
if [ -z $2 ]; then
abort "El script $0 tiene un error: Has llamado a la función maxargs sin pasarle el número de argumentos. Habla con el desarrollador."
fi
if [ $2 -lt $1 ]; then
abort "Este comando necesita al menos $1 argumentos."
fi
}
#ejemplo: maxargs 2 $#
function maxargs {
if [ -z $2 ]; then
abort "El script $0 tiene un error: Has llamado a la función maxargs sin pasarle el número de argumentos. Habla con el desarrollador."
fi
if [ $2 -gt $1 ]; then
abort "Este comando acepta como máximo $1 argumentos."
fi
}
#ejemplo: exactargs 2 $#
function exactargs {
if [ -z $2 ]; then
abort "El script $0 tiene un error: Has llamado a la función maxargs sin pasarle el número de argumentos. Habla con el desarrollador."
fi
if [ $2 -ne $1 ]; then
abort "Este comando acepta solo $1 argumentos."
fi
}
#useralta: crea un nuevo usuario en el sistema y le pone bash.
#useralta user passwordhaseado
function useralta {
# $1 user
# $2 password hasheado
useradd -m -p $2 $1
chsh -s /bin/bash $1
cat /opt/nm-bin/instalar/bashrc_include >> /home/$1/.bashrc
}
#testabort: comprueba que el último comando fue ejecutado con éxito. Si se ejecutó, continua, si hubo error, aborta.
function testabort {
if [ $? -eq 0 ]; then
#hecho
true
else
abort "${1}"
fi
}
#testerror: comprueba que el último comando fue ejecutado con éxito. Si se ejecutó, continua, si hubo error, avisa y continua.
#testerror "Msg si OK" "Msg si ERROR"
function testerror {
if [ $? -eq 0 ]; then
#pongo la línea porque a veces el stdout no cambia de líneas
echo
msg "$1"
else
#pongo la línea porque a veces el stdout no cambia de líneas
echo
error "$2"
fi
}
#instalación silenciosa
function instalar {
apt install -qq -o=Dpkg::Use-Pty=0 ${1} ${2} ${3} ${4} ${5} ${6} ${7} ${8} ${9} > /dev/null
}
#Muestra mensaje de avance
function msg {
echo -e "[ * ] $1..."
}
function warn {
echo -e "/ ! \ $1..."
}
#Mensaje de error pero no aborta
function error {
echo -e "[ !!! ] Error: $1"
logwrite "Error: $1"
}
function hecho {
echo " Hecho."
}
#tira error y aborta
function abort {
echo -e "[ !!! ] Error: $1"
logwrite "Error: $1"
exit 1
}
function titulo {
echo " "
echo " "
echo -e "[ $1 ]"
echo " "
echo " "
}
function pause {
#descarto la variable descartar
read -p "Pulsa Enter para continuar... (Ctrl + C para salir)" descartar
}
#Captura los valores de username y domain si no están en $1 y $2
function get_username_domain {
#si está vacío el parámetro 1 pido el username
if [ -z "$1" ]
then
echo
echo "Datos del panel HESTIA: Asegúrate de que coinciden."
echo
read -p 'Username: ' username
read -p 'Dominio: ' domain
else
username=$1
#su está vacío el parámetro 2 pido el dominio
if [ -z "$2" ]
then
read -p 'Dominio: ' domain
else
domain=$2
fi
fi
}
# username no puede tener más de 15 caracteres
function get_domain_username {
#si está vacío el parámetro 1 pido el domain
if [ -z "$1" ]
then
echo
echo "Datos del panel HESTIA: Asegúrate de que coinciden."
echo
read -p 'Dominio: ' domain
#busco si hay un username ya para ese domain
search_username_domain $domain
read -p 'Username: ' username
else
username=$1
#si está vacío el parámetro 2 pido el dominio
if [ -z "$2" ]
then
read -p 'Dominio: ' domain
else
domain=$2
fi
fi
}
#search_username_domain: busca el usuario dado un dominio
#Sintaxis: search_username_domain dominio.com
#devuelve $username $domain
function search_username_domain {
local dominio="$1"
local file="/opt/nm-bin/listado-usuarios-dominios-web"
#Me la juego con un método rápido
if [ -d /home/$dominio/web/$dominio ]; then
username=$dominio
domain=$dominio
msg "Existe /home/$dominio/web/$dominio => username: $username | domain: $domain"
return 0
else
#resto del código
#si no existe el fichero lo creo.
#if [ ! -f "$file" ]; then
# /opt/nm-bin/nm-listar-dominios-web.sh
#else
# #compruebo si tiene más de 7 días
# if test `find "$file" -mtime +6`
# then
# msg "$file tiene más de 7 días. Lo regenero"
# /opt/nm-bin/nm-listar-dominios-web.sh
# fi
#fi
#regenero el fichero
/opt/nm-bin/nm-listar-dominios-web.sh
#compruebo si el dominio está en la columna 2
cat $file | cut -d',' -f2 | grep -w "$dominio" > /dev/null
if [ $? -eq 0 ]; then
#asumo que solo puede haber el dominio una vez.
username=$(cat $file | grep ",$dominio" | head -n 1 | cut -d',' -f1)
domain=$dominio
return 0
else
error "No encontrado: $dominio en $file"
return 1
fi
fi
}
#Leo los valores de un fichero de configuración
#ejemplo: read_properties config.txt
read_properties()
{
if [ ! -f "$1" ]; then
abort "Falta el fichero $1"
fi
file="$1"
while IFS="=" read -r key value; do
case "$key" in
'#'*) ;;
*)
eval "$key=\"$value\""
esac
done < "$file"
}
#iterar por todos los $domains para todos los $usernames
function iterar_username_domain {
for username in $($HESTIA/bin/v-list-users | cut -d' ' -f1 | tail -n +3); do
for domain in $($HESTIA/bin/v-list-web-domains $username | cut -d' ' -f1 | grep "\."); do
#comprobaciones
if [ "$username" != "admin" ]; then
#el usuario no es admin
if [ ! -z "$domain" ]; then
#el usuario no es admin y además tiene dominio
if [ ! -z "$cmd1" ]; then
echo "CMD 1: $cmd1"
eval "$cmd1"
else
abort "No hay comando que ejecutar"
fi
if [ ! -z "$cmd2" ]; then
echo "CMD 2: $cmd2"
eval "$cmd2"
fi
if [ ! -z "$cmd3" ]; then
echo "CMD 3: $cmd3"
eval "$cmd3"
fi
fi
fi
done
done
}
#Quitar suspensión de usuario
function unsuspend_username_domain {
msg "Quito las suspensiones de usuario:$username y dominio:$domain"
$HESTIA/bin/v-unsuspend-user $username > /dev/null 2>&1
$HESTIA/bin/v-unsuspend-web-domain $username $domain > /dev/null 2>&1
}
#comprobar que son correctos $username y $domain
function check_username_domain {
check_username $1
check_domain $2
}
function check_username {
if [ "$1" == "" ]; then
error "El usuario no puede estar vacío"
fi
#Listo los usuarios a ver si está en la lista...
$HESTIA/bin/v-list-users | grep "${1}" > /dev/null
if [ $? -eq 1 ]; then
error "El usuario: $1 no existe en el sistema."
fi
if [ $? -gt 1 ]; then
error "Error no identificado."
fi
}
function check_domain {
if [ "$1" == "" ]; then
error "El dominio no puede estar vacío"
return 2
fi
#Listo los usuarios a ver si está en la lista...
$HESTIA/bin/v-search-domain-owner "${1}" > /dev/null
if [ $? -eq 3 ]; then
error "El dominio: $1 no existe en el sistema."
return 1
fi
if [ $? -gt 0 ]; then
error "Error no identificado."
return 1
fi
return 0
}
function validateip {
ip=$1
if [ -z "$ip" ]; then
abort "No se ha suministrado una IP"
fi
if [[ "$ip" =~ ^(([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\.){3}([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))$ ]]; then
return 0
else
abort "La IP: $ip - no es válida."
fi
}