#!/bin/bash # Configuration AVAILABLE=${NX_SITES_AVAILABLE_PATH:-/etc/nginx/sites-available} ENABLED=${NX_SITES_ENABLED_PATH:-/etc/nginx/sites-enabled} TEST_CMD=${NX_TEST_CMD:-"nginx -t"} RELOAD_CMD=${NX_RELOAD_CMD:-"systemctl reload nginx"} ACTION=$1 SITE=$2 # Colors BOLD=$(tput bold) GREEN=$(tput setaf 2) RED=$(tput setaf 1) NC=$(tput sgr0) case $ACTION in list|l) # We store the output in a variable to pipe it into 'column' at the end table_output="${BOLD}SITE${NC}${NC};${BOLD}STATUS${NC}\n" table_output+="${NC}${NC}----------------------------------------;----------\n" # 1. Get unique names. 2. Reverse dots for sorting (com.google). 3. Sort. 4. Restore original. all_sites=$( (cd "$AVAILABLE" 2>/dev/null && ls -1; cd "$ENABLED" 2>/dev/null && ls -1) | \ sed 's/\.conf$//' | sort -u | \ awk -F. '{ for (i=NF; i>1; i--) printf "%s.", $i; print $1 }' | \ sort | \ awk -F. '{ for (i=NF; i>1; i--) printf "%s.", $i; print $1 }') for s in $all_sites; do [[ -z "$s" ]] && continue # Identify if parent exists parent_domain=$(echo "$s" | cut -d. -f2-) is_sub=0 if [[ "$s" == *.* ]] && echo "$all_sites" | grep -qxw "$parent_domain"; then is_sub=1 fi # Check for existence with and without .conf status="Disabled" [[ -L "$ENABLED/$s" || -L "$ENABLED/$s.conf" ]] && status="Enabled" # Filtering logic if [[ "$SITE" == "--enabled" && "$status" == "Disabled" ]]; then continue; fi if [[ "$SITE" == "--disabled" && "$status" == "Enabled" ]]; then continue; fi display_name="$s" if [[ $is_sub -eq 1 ]]; then [[ "$status" == "Enabled" ]] && display_name="└── ${BOLD}${GREEN}●${NC} ${s}${NC}" || display_name="└── ${s}${NC}${NC}" else [[ "$status" == "Enabled" ]] && display_name="${BOLD}${GREEN}●${NC} ${BOLD}${s}${NC}" || display_name="${BOLD}${s}${NC}${NC}" fi [[ "$status" == "Enabled" ]] && display_status="${BOLD}${GREEN}Enabled${NC}" || display_status="Disabled" table_output+="${display_name};${display_status}\n" done # Render the table using column echo -e "$table_output" | column -ts ';' ;; enable) [[ -z "$SITE" ]] && { echo "Usage: nx enable "; exit 1; } [[ ! -f "$AVAILABLE/$SITE" ]] && SITE="$SITE.conf" if [ -f "$AVAILABLE/$SITE" ]; then ln -sfr "$AVAILABLE/$SITE" "$ENABLED/$SITE" echo "Enabled $SITE" eval "${TEST_CMD}" && eval "${RELOAD_CMD}" && echo "Nginx configuration reloaded successfully!" else echo "${RED}Error${NC}: $SITE not found in $AVAILABLE" fi ;; disable) [[ -z "$SITE" ]] && { echo "Usage: nx disable "; exit 1; } [[ ! -f "$AVAILABLE/$SITE" ]] && SITE="$SITE.conf" if [ -L "$ENABLED/$SITE" ]; then rm "$ENABLED/$SITE" echo "Disabled $SITE" eval "${TEST_CMD}" && eval "${RELOAD_CMD}" && echo "Nginx configuration reloaded successfully!" else echo "${RED}Error${NC}: $SITE is not enabled" fi ;; edit|e) [[ -z "$SITE" ]] && { echo "Usage: nx {edit|e} "; exit 1; } [[ ! -f "$AVAILABLE/$SITE" ]] && SITE="$SITE.conf" if [ -f "$AVAILABLE/$SITE" ]; then ${EDITOR:-nano} "$AVAILABLE/$SITE" echo "Check syntax and reload? (y/n)" read -r answer if [[ "$answer" == "y" ]]; then eval "${TEST_CMD}" && eval "${RELOAD_CMD}" && echo "Nginx configuration reloaded successfully!" fi else echo "${RED}Error${NC}: $SITE not found in $AVAILABLE" fi ;; cat|print|p) [[ -z "$SITE" ]] && { echo "Usage: nx {cat|print|p} "; exit 1; } [[ ! -f "$AVAILABLE/$SITE" ]] && SITE="$SITE.conf" if [ -f "$AVAILABLE/$SITE" ]; then if command -v batcat &> /dev/null; then batcat "$AVAILABLE/$SITE" elif command -v bat &> /dev/null; then bat "$AVAILABLE/$SITE" else cat "$AVAILABLE/$SITE" fi else echo "${RED}Error${NC}: $SITE not found in $AVAILABLE" fi ;; *) echo -e "$(cat << EOF ${BOLD}NX - Nginx Site Manager${NC} A simple utility to manage Nginx configurations. ${BOLD}USAGE:${NC} nx [arguments] ${BOLD}COMMANDS:${NC} ${GREEN}list, l${NC} List all sites. Supports ${GREEN}--enabled${NC} or ${GREEN}--disabled${NC} filters. ${GREEN}enable${NC} Enable a site by creating a symlink. ${GREEN}disable${NC} Disable a site by removing the symlink. ${GREEN}edit, e${NC} Open site config in ${BOLD}\$EDITOR${NC}. ${GREEN}cat, print, p${NC} Preview site config using batcat or cat. ${BOLD}EXAMPLES:${NC} sudo nx list sudo nx enable example.com sudo nx e example.com ${BOLD}ENVIRONMENT:${NC} EDITOR Currently set to ${BOLD}${EDITOR:-nano}${NC} NX_SITES_AVAILABLE_PATH Currently set to ${BOLD}${AVAILABLE}${NC} NX_SITES_ENABLED_PATH Currently set to ${BOLD}${ENABLED}${NC} NX_RELOAD_CMD Currently set to ${BOLD}${RELOAD_CMD}${NC} NX_TEST_CMD Currently set to ${BOLD}${TEST_CMD}${NC} EOF )" exit 1 ;; esac