sysadmin_scripts/autonginx/autonginx
2026-01-10 12:41:26 +01:00

124 lines
2.7 KiB
Bash
Executable file

#!/usr/bin/env sh
USAGE="usage: ./autonginx <URL> <IP> <PORT>
URL: url à laquelle le service sera accessible (sub.domain.tld)
IP: adresse ip locale du service
PORT: port utilisé par le service (entre 1 et 65535; certains ports peuvent être déjà utilisés)"
error() {
printf "%s\n" "$@" >&2
exit 1
}
isvalid() {
if [ "$1" -lt "$2" ] || [ "$1" -gt "$3" ]; then
error "BAD NUMBER IN IP" "$USAGE"
fi
}
sanitize() {
if ! [ "$PORT" -eq "$PORT" ] 2> /dev/null; then
error "PORT IS NAN" "$USAGE"
fi
if [ "$PORT" -lt 1 ] || [ "$PORT" -gt 65535 ]; then
error "BAD PORT" "$USAGE"
fi
#case "$URL" in
# *.urlab.be) SUBDOMAIN=${URL%.urlab.be} ;;
# *) error "$USAGE";;
#esac
#if [ "$SUBDOMAIN" = "" ]; then
# error "$USAGE"
#fi
#if [ "$(expr "$SUBDOMAIN" : '[A-Za-z0-9][A-Za-z0-9\-]\{0,61\}[A-Za-z0-9]\{0,1\}')" != "${#SUBDOMAIN}" ]; then
# error "$USAGE"
#fi
case "$IP" in
localhost)
;;
127.0.0.1)
;;
10.[0-9]*.[0-9]*.[0-9]*)
LAST=${IP#10.[0-9]*.[0-9]*.}
REST=${IP%?"$LAST"}
BEFLAST=${REST#10.[0-9]*.}
REST=${REST%?"$BEFLAST"}
BEFBEFLAST=${REST#10.}
isvalid "$LAST" 2 254
isvalid "$BEFLAST" 2 254
isvalid "$BEFBEFLAST" 2 254
;;
172.[0-9]*.[0-9]*.[0-9]*)
LAST=${IP#172.[0-9]*.[0-9]*.}
REST=${IP%?"$LAST"}
BEFLAST=${REST#172.[0-9]*.}
REST=${REST%?"$BEFLAST"}
BEFBEFLAST=${REST#172.}
isvalid "$LAST" 2 254
isvalid "$BEFLAST" 2 254
isvalid "$BEFBEFLAST" 16 31
;;
192.168.[0-9]*.[0-9]*)
LAST=${IP#192.168.[0-9]*.}
REST=${IP%?"$LAST"}
BEFLAST=${REST#192.168.}
isvalid "$LAST" 2 254
isvalid "$BEFLAST" 2 254
;;
*)
error "BAD IP" "$USAGE"
;;
esac
}
verify() {
if ! ping -c 1 -W 1 "$IP" >/dev/null 2>/dev/null ; then
error "Error : Cannot reach host $IP"
fi
if ! timeout 1 sh -c "(echo > /dev/tcp/$IP/$PORT) >/dev/null 2>&1"; then
error "Error : Port $PORT isn't open"
fi
}
main() {
if [ "$(id -u)" -ne 0 ]; then
error "Please run as root." >&2
fi
if [ $# != 3 ]; then
error "BAD ARG NUM" "$USAGE"
fi
URL="$1"
IP="$2"
PORT="$3"
NGINX="server {
listen 80;
listen [::]:80;
server_name $URL;
location / {
proxy_pass http://$IP:$PORT/;
include proxy_params;
}
}"
sanitize
verify
mkdir -p /etc/nginx/sites-available
mkdir -p /etc/nginx/sites-enabled
sh -c 'echo "${0}" > /etc/nginx/sites-available/${1}' "$NGINX" "$URL"
ln -s "/etc/nginx/sites-available/$URL" "/etc/nginx/sites-enabled/$URL"
if ! nginx -t >/dev/null 2>/dev/null; then
rm -f "/etc/nginx/sites-available/$URL" "/etc/nginx/sites-enabled/$URL"
error "Error : Nginx config failed"
fi
if ! certbot run --nginx -d "$URL"; then
rm -f "/etc/letsencrypt/live/$URL" "/etc/letsencrypt/archive/$URL"
error "Error : certbot failure"
fi
}
main "$@"