A simple utility to manage Nginx configurations.
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