A simple utility to manage Nginx configurations.
at main 153 lines 5.5 kB view raw
1#!/bin/bash 2 3# Configuration 4AVAILABLE=${NX_SITES_AVAILABLE_PATH:-/etc/nginx/sites-available} 5ENABLED=${NX_SITES_ENABLED_PATH:-/etc/nginx/sites-enabled} 6TEST_CMD=${NX_TEST_CMD:-"nginx -t"} 7RELOAD_CMD=${NX_RELOAD_CMD:-"systemctl reload nginx"} 8ACTION=$1 9SITE=$2 10 11# Colors 12BOLD=$(tput bold) 13GREEN=$(tput setaf 2) 14RED=$(tput setaf 1) 15NC=$(tput sgr0) 16 17case $ACTION in 18 list|l) 19 # We store the output in a variable to pipe it into 'column' at the end 20 table_output="${BOLD}SITE${NC}${NC};${BOLD}STATUS${NC}\n" 21 table_output+="${NC}${NC}----------------------------------------;----------\n" 22 23 # 1. Get unique names. 2. Reverse dots for sorting (com.google). 3. Sort. 4. Restore original. 24 all_sites=$( (cd "$AVAILABLE" 2>/dev/null && ls -1; cd "$ENABLED" 2>/dev/null && ls -1) | \ 25 sed 's/\.conf$//' | sort -u | \ 26 awk -F. '{ for (i=NF; i>1; i--) printf "%s.", $i; print $1 }' | \ 27 sort | \ 28 awk -F. '{ for (i=NF; i>1; i--) printf "%s.", $i; print $1 }') 29 30 for s in $all_sites; do 31 [[ -z "$s" ]] && continue 32 33 # Identify if parent exists 34 parent_domain=$(echo "$s" | cut -d. -f2-) 35 is_sub=0 36 if [[ "$s" == *.* ]] && echo "$all_sites" | grep -qxw "$parent_domain"; then 37 is_sub=1 38 fi 39 40 # Check for existence with and without .conf 41 status="Disabled" 42 [[ -L "$ENABLED/$s" || -L "$ENABLED/$s.conf" ]] && status="Enabled" 43 44 # Filtering logic 45 if [[ "$SITE" == "--enabled" && "$status" == "Disabled" ]]; then continue; fi 46 if [[ "$SITE" == "--disabled" && "$status" == "Enabled" ]]; then continue; fi 47 48 display_name="$s" 49 if [[ $is_sub -eq 1 ]]; then 50 [[ "$status" == "Enabled" ]] && display_name="└── ${BOLD}${GREEN}${NC} ${s}${NC}" || display_name="└── ${s}${NC}${NC}" 51 else 52 [[ "$status" == "Enabled" ]] && display_name="${BOLD}${GREEN}${NC} ${BOLD}${s}${NC}" || display_name="${BOLD}${s}${NC}${NC}" 53 fi 54 55 [[ "$status" == "Enabled" ]] && display_status="${BOLD}${GREEN}Enabled${NC}" || display_status="Disabled" 56 table_output+="${display_name};${display_status}\n" 57 done 58 59 # Render the table using column 60 echo -e "$table_output" | column -ts ';' 61 ;; 62 63 enable) 64 [[ -z "$SITE" ]] && { echo "Usage: nx enable <site>"; exit 1; } 65 [[ ! -f "$AVAILABLE/$SITE" ]] && SITE="$SITE.conf" 66 67 if [ -f "$AVAILABLE/$SITE" ]; then 68 ln -sfr "$AVAILABLE/$SITE" "$ENABLED/$SITE" 69 echo "Enabled $SITE" 70 eval "${TEST_CMD}" && eval "${RELOAD_CMD}" && echo "Nginx configuration reloaded successfully!" 71 else 72 echo "${RED}Error${NC}: $SITE not found in $AVAILABLE" 73 fi 74 ;; 75 76 disable) 77 [[ -z "$SITE" ]] && { echo "Usage: nx disable <site>"; exit 1; } 78 [[ ! -f "$AVAILABLE/$SITE" ]] && SITE="$SITE.conf" 79 80 if [ -L "$ENABLED/$SITE" ]; then 81 rm "$ENABLED/$SITE" 82 echo "Disabled $SITE" 83 eval "${TEST_CMD}" && eval "${RELOAD_CMD}" && echo "Nginx configuration reloaded successfully!" 84 else 85 echo "${RED}Error${NC}: $SITE is not enabled" 86 fi 87 ;; 88 89 edit|e) 90 [[ -z "$SITE" ]] && { echo "Usage: nx {edit|e} <site>"; exit 1; } 91 [[ ! -f "$AVAILABLE/$SITE" ]] && SITE="$SITE.conf" 92 93 if [ -f "$AVAILABLE/$SITE" ]; then 94 ${EDITOR:-nano} "$AVAILABLE/$SITE" 95 96 echo "Check syntax and reload? (y/n)" 97 read -r answer 98 if [[ "$answer" == "y" ]]; then 99 eval "${TEST_CMD}" && eval "${RELOAD_CMD}" && echo "Nginx configuration reloaded successfully!" 100 fi 101 else 102 echo "${RED}Error${NC}: $SITE not found in $AVAILABLE" 103 fi 104 ;; 105 106 cat|print|p) 107 [[ -z "$SITE" ]] && { echo "Usage: nx {cat|print|p} <site>"; exit 1; } 108 [[ ! -f "$AVAILABLE/$SITE" ]] && SITE="$SITE.conf" 109 110 if [ -f "$AVAILABLE/$SITE" ]; then 111 if command -v batcat &> /dev/null; then 112 batcat "$AVAILABLE/$SITE" 113 elif command -v bat &> /dev/null; then 114 bat "$AVAILABLE/$SITE" 115 else 116 cat "$AVAILABLE/$SITE" 117 fi 118 else 119 echo "${RED}Error${NC}: $SITE not found in $AVAILABLE" 120 fi 121 ;; 122 123 *) 124 echo -e "$(cat << EOF 125${BOLD}NX - Nginx Site Manager${NC} 126A simple utility to manage Nginx configurations. 127 128${BOLD}USAGE:${NC} 129 nx <command> [arguments] 130 131${BOLD}COMMANDS:${NC} 132 ${GREEN}list, l${NC} List all sites. Supports ${GREEN}--enabled${NC} or ${GREEN}--disabled${NC} filters. 133 ${GREEN}enable${NC} <site> Enable a site by creating a symlink. 134 ${GREEN}disable${NC} <site> Disable a site by removing the symlink. 135 ${GREEN}edit, e${NC} <site> Open site config in ${BOLD}\$EDITOR${NC}. 136 ${GREEN}cat, print, p${NC} <site> Preview site config using batcat or cat. 137 138${BOLD}EXAMPLES:${NC} 139 sudo nx list 140 sudo nx enable example.com 141 sudo nx e example.com 142 143${BOLD}ENVIRONMENT:${NC} 144 EDITOR Currently set to ${BOLD}${EDITOR:-nano}${NC} 145 NX_SITES_AVAILABLE_PATH Currently set to ${BOLD}${AVAILABLE}${NC} 146 NX_SITES_ENABLED_PATH Currently set to ${BOLD}${ENABLED}${NC} 147 NX_RELOAD_CMD Currently set to ${BOLD}${RELOAD_CMD}${NC} 148 NX_TEST_CMD Currently set to ${BOLD}${TEST_CMD}${NC} 149EOF 150)" 151 exit 1 152 ;; 153esac