#! /bin/bash source $(cd $(dirname $0);pwd)/core.sh source $(cd $(dirname $0);pwd)/cert/acme.sh source $(cd $(dirname $0);pwd)/nginx/init.sh source $(cd $(dirname $0);pwd)/nginx/server.sh source $(cd $(dirname $0);pwd)/nginx/proxy.sh source $(cd $(dirname $0);pwd)/nginx/stream.sh source $(cd $(dirname $0);pwd)/nginx/upstream.sh show_menu() { choice=$2 if [[ ! -n $2 ]]; then echo "> Nginx管理" echo "------------------------" echo "1. 添加站点" echo "2. 管理站点" echo "3. 添加负载均衡" echo "4. 管理负载均衡" echo "5. 添加TCP转发" echo "6. 添加UDP转发" echo "7. 管理端口转发" echo "8. 绑定xray自动转发" echo "------------------------" echo "11. 启动服务" echo "12. 停止服务" echo "13. 重启服务" echo "14. 检测配置" echo "15. 启动xray自动转发" echo "16. 关闭xray自动转发" echo "------------------------" echo "00. 安装nginx" echo "99. 卸载nginx" echo "------------------------" echo "0. 返回主菜单" echo "------------------------" echo if [[ -n $1 ]]; then echo -e "${red}$1${plain}" echo fi read -p "请输入选择: " choice fi case $choice in 1) clear is_nginx_env get_nginx_env sub_title="添加站点\n------------------------" echo -e $sub_title while read -p "域名: " domain do goback $domain "clear;show_menu" if [[ -n $domain ]]; then is_param_true "is_domain" "${domain[*]}" if [[ $? == 1 ]]; then warning "绑定域名中存在格式错误" "$sub_title" continue fi name=`echo "${domain[*]}" | awk -F " " '{print $1}'` if [[ -n $(ls $CONFDIR | grep -E "^(\[[0-9]{2}\])?$name\.conf(\.bak)?$") ]]; then warning "存在相同域名配置" "$sub_title" continue fi else domain="localhost" fi break done sub_title="$sub_title\n域名: ${domain[*]}" clear && echo -e $sub_title while read -p "端口(80): " port do goback $port "clear;show_menu" if [[ ! -n $port ]]; then port=80 fi if [[ ! -n $(is_port "$port") && -n $port ]]; then warning "请填写正确的端口" "$sub_title" continue fi if [[ $domain == "localhost" && $port == "80" ]]; then warning "您没有设定域名,为了避免冲突请选择其他端口" "$sub_title" continue fi break done sub_title="$sub_title\n端口(80): $port" clear && echo -e $sub_title while read -p "静态目录: " wwwroot do goback $wwwroot "clear;show_menu" if [[ -n $wwwroot ]]; then wwwroot=`parse_path $wwwroot` fi break done sub_title="$sub_title\n静态目录: $wwwroot" clear && echo -e $sub_title if [[ $domain == "localhost" ]]; then while read -p "配置命名: " name do goback $name "clear;show_menu" if [[ ! -n $name ]]; then warning "请为配置命名" "$sub_title" continue fi if [[ ! -n $(echo "$name" | gawk '/([a-zA-Z0-9_\-\.]+)$/{print $0}') ]]; then warning "命名请用英文字母数字下划线中划线组成" "$sub_title" continue fi if [[ -n $(ls $CONFDIR | grep -E "^(\[[0-9]{2}\])?$name\.conf(\.bak)?$") ]]; then warning "命名名称已存在" "$sub_title" continue fi break done sub_title="$sub_title\n配置命名: $name" clear && echo -e $sub_title fi echo # 创建配置及文件 create_server $(to_array_param --domain "${domain[*]}") --port $port --wwwroot "$wwwroot" --name "$name" echo echo -e "- ${yellow}站点配置已添加${plain}" echo read -n1 -p "按任意键继续" key clear show_menu ;; 2) clear is_nginx_env echo "管理站点" echo "------------------------" echo get_nginx_env get_server_list echo if [[ -n $3 ]]; then echo -e "${red}$3${plain}" echo fi while read -p "输入名称: " name do goback $name "clear;show_menu" "show_menu \"\" 2" if [[ ! -n $name ]]; then show_menu "" 2 "请输入名称" continue fi if [[ ! -n $(ls $CONFDIR | grep -E "^(\[[0-9]{2}\])?$name\.conf(\.bak)?$") ]]; then show_menu "" 2 "输入的名称不存在" continue fi break done echo server_options "$(ls $CONFDIR | grep -E "^(\[[0-9]{2}\])?$name\.conf(\.bak)?$")" 2 echo read -n1 -p "按任意键继续" key clear show_menu ;; 3) clear is_nginx_env get_nginx_env sub_title="添加负载均衡\n------------------------" echo -e $sub_title while read -p "名称: " name do goback $name "clear;show_menu" if [[ ! -n $name ]]; then warning "请填写名称" "$sub_title" continue fi if [[ ! -n $(echo "$name" | gawk '/([a-zA-Z0-9_]+)$/{print $0}') ]]; then warning "名称请用英文字母数字下划线组成" "$sub_title" continue fi break done sub_title="$sub_title\n名称: $name" clear && echo -e $sub_title while read -p "服务器: " server do goback $server "clear;show_menu" if [[ ! -n $server ]]; then warning "请填写服务器" "$sub_title" continue fi if [[ ! -n $(is_webadress "$server") ]]; then warning "服务器地址格式错误,请正确写" "$sub_title" continue fi break done sub_title="$sub_title\n服务器: $server" clear && echo -e $sub_title echo create_upstream --name "$name" --server "$server" echo echo -e "- ${yellow}站点配置已添加${plain}" echo read -n1 -p "按任意键继续" key clear show_menu ;; 4) clear is_nginx_env echo "管理负载均衡" echo "------------------------" echo get_nginx_env get_upstream_list echo if [[ -n $3 ]]; then echo -e "${red}$3${plain}" echo fi while read -p "输入名称: " name do goback $name "clear;show_menu" "show_menu \"\" 4" if [[ ! -n $name ]]; then show_menu "" 4 "请输入名称" continue fi if [[ ! -n $(ls $WORKDIR/upstream | grep -E "^(\[[0-9]{2}\])?$name\.(conf|hash)(\.bak)?$") ]]; then show_menu "" 4 "输入的名称不存在" continue fi break done echo upstream_options "$(ls $WORKDIR/upstream | grep -E "^(\[[0-9]{2}\])?$name\.(conf|hash)(\.bak)?$")" 4 echo read -n1 -p "按任意键继续" key clear show_menu ;; 5|6) clear is_nginx_env get_nginx_env case $choice in 5) sub_title="添加TCP转发\n------------------------" udp_mode="" ;; 6) sub_title="添加UDP转发\n------------------------" udp_mode="true" ;; esac echo -e $sub_title echo while read -p "转发端口: " port do goback $port "clear;show_menu" if [[ ! -n $port ]]; then warning "请填写转发端口" "$sub_title" continue fi if [[ ! -n $(is_port "$port") ]]; then warning "请填写正确的端口" "$sub_title" continue fi break done sub_title="$sub_title\n转发端口: $port" clear && echo -e $sub_title while read -p "代理地址: " proxy_pass do goback $proxy_pass "clear;show_menu" if [[ ! -n $proxy_pass ]]; then warning "请填写代理地址" "$sub_title" continue fi if [[ -n $(echo "$proxy_pass" | grep ":") ]]; then if [[ ! -n $(is_webadress "$proxy_pass") ]]; then warning "代理地址格式错误,请填写或负载均衡名称" "$sub_title" continue fi else if [[ ! -n $(echo "$proxy_pass" | gawk '/([a-zA-Z0-9_\-\.]+)$/{print $0}') ]]; then warning "代理地址格式错误,请填写或负载均衡名称" "$sub_title" continue fi fi break done sub_title="$sub_title\n代理地址: $proxy_pass" clear && echo -e $sub_title while read -p "响应超时: " timeout do goback $timeout "clear;show_menu" if [[ -n $timeout && ! -n $(echo "$timeout" | gawk '/^[1-9]{1}[0-9]{1,2}?$/{print $0}') ]]; then warning "响应超时时间必须是1-999的数字" "$sub_title" continue fi break done sub_title="$sub_title\n响应超时: $timeout" clear && echo -e $sub_title while read -p "连接超时: " connect_timeout do goback $connect_timeout "clear;show_menu" if [[ -n $connect_timeout && ! -n $(echo "$connect_timeout" | gawk '/^[1-9]{1}[0-9]{1,2}?$/{print $0}') ]]; then warning "连接超时时间必须是1-999的数字" "$sub_title" continue fi break done sub_title="$sub_title\n连接超时: $connect_timeout" clear && echo -e $sub_title while read -p "配置命名: " name do goback $name "clear;show_menu" if [[ ! -n $name ]]; then warning "请为配置命名" "$sub_title" continue fi if [[ ! -n $(echo "$name" | gawk '/([a-zA-Z0-9_\-\.]+)$/{print $0}') ]]; then warning "命名请用英文字母数字下划线中划线组成" "$sub_title" continue fi if [[ -n $(ls $WORKDIR/stream/conf | grep -E "^(\[[0-9]{2}\])?$name\.conf(\.bak)?$") ]]; then warning "命名名称已存在" "$sub_title" continue fi break done sub_title="$sub_title\n配置命名: $name" clear && echo -e $sub_title echo create_stream --name "$name" --port "$port" --proxy_pass "$proxy_pass" --timeout "$timeout" --connect_timeout "$connect_timeout" --udp "$udp_mode" echo read -n1 -p "按任意键继续" key clear show_menu ;; 7) clear is_nginx_env echo "管理端口转发" echo "------------------------" echo get_nginx_env get_stream_list echo if [[ -n $3 ]]; then echo -e "${red}$3${plain}" echo fi while read -p "输入名称: " name do goback $name "clear;show_menu" "show_menu \"\" 7" if [[ ! -n $name ]]; then show_menu "" 7 "请输入名称" continue fi if [[ ! -n $(ls $WORKDIR/stream/conf | grep -E "^(\[[0-9]{2}\])?$name\.conf(\.bak)?$") ]]; then show_menu "" 7 "输入的名称不存在" continue fi break done echo stream_options "$(ls $WORKDIR/stream/conf | grep -E "^(\[[0-9]{2}\])?$name\.conf(\.bak)?$")" 7 echo read -n1 -p "按任意键继续" key clear show_menu ;; 8) clear is_nginx_env echo "绑定xray自动转发" echo "------------------------" echo get_nginx_env get_server_list echo if [[ -n $3 ]]; then echo -e "${red}$3${plain}" echo fi while read -p "输入名称: " name do goback $name "clear;show_menu" "show_menu \"\" 2" if [[ ! -n $name ]]; then show_menu "" 2 "请输入名称" continue fi if [[ ! -n $(ls $CONFDIR | grep -E "^(\[[0-9]{2}\])?$name\.conf(\.bak)?$") ]]; then show_menu "" 2 "输入的名称不存在" continue fi break done echo files=$(ls $CONFDIR | grep -E "*.conf(\.bak)?$") for file in ${files[@]} do sed -i "/\*.inbound;/d" $CONFDIR/$file done sleep 3 filename=$(ls $CONFDIR | grep -E "^(\[[0-9]{2}\])?$name\.conf(\.bak)?$") mkdir -p $WORKDIR/inbounds sed -i "/*.conf;/a\ include $WORKDIR/inbounds/\*.inbound;" $CONFDIR/$filename systemctl restart nginx echo -e "xray自动转发已绑定到域名 -- $name" echo read -n1 -p "按任意键继续" key clear show_menu ;; 11) clear is_nginx_env if [[ $(systemctl status nginx | grep "active" | cut -d '(' -f2|cut -d ')' -f1) == 'running' ]]; then systemctl restart nginx else systemctl start nginx fi systemctl status nginx echo read -n1 -p "按任意键继续" key clear show_menu ;; 12) clear is_nginx_env if [[ $(systemctl status nginx | grep "active" | cut -d '(' -f2|cut -d ')' -f1) == 'running' ]]; then systemctl stop nginx fi systemctl status nginx echo read -n1 -p "按任意键继续" key clear show_menu ;; 13) clear is_nginx_env systemctl restart nginx systemctl status nginx echo read -n1 -p "按任意键继续" key clear show_menu ;; 14) clear echo "检测配置" echo "------------------------" echo is_nginx_env nginx -v echo echo "-- $(systemctl status nginx | grep "active" | cut -d '(' -f2|cut -d ')' -f1) --" echo nginx -t echo read -n1 -p "按任意键继续" key clear show_menu ;; 15) clear is_nginx_env echo "启动xray自动转发" echo "------------------------" echo if [[ ! -n $(find /etc -name "rc.local") ]]; then echo -e "\#\!/bin/bash -e\n" | sed 's/\\//g' > /etc/rc.local echo -e "" > /etc/rc.local fi rcfile=$(find /etc -name "rc.local" | tail -n1) if [[ ! -n $(cat $rcfile | grep "inbound.sh") ]]; then curl -Lso- $KENOTE_BASH_MIRROR/base.sh | bash -s -- --init inbounds bash $KENOTE_NGINX_HOME/inbound.sh --init echo "nohup bash $KENOTE_NGINX_HOME/inbound.sh>$KENOTE_NGINX_HOME/logs/inbounds/inbounds.txt 2>&1 &" >> $rcfile chmod +x $rcfile systemctl daemon-reload systemctl enable rc-local.service systemctl restart rc-local.service echo fi echo -e "xray自动转发已启动" echo read -n1 -p "按任意键继续" key clear show_menu ;; 16) clear is_nginx_env echo "关闭xray自动转发" echo "------------------------" echo if [[ -n $(cat /etc/rc.d/rc.local | grep "inbound.sh") ]]; then sed -i "/inbound.sh/d" /etc/rc.d/rc.local systemctl daemon-reload systemctl restart rc-local.service rm -rf $KENOTE_NGINX_HOME/inbounds/* systemctl restart nginx echo fi echo -e "xray自动转发已关闭" echo read -n1 -p "按任意键继续" key clear show_menu ;; 00) clear if !(nginx -v &> /dev/null); then echo install_nginx fi get_nginx_env if [[ $CONFDIR == $CONFLINK ]]; then echo init_nginx_conf $KENOTE_NGINX_HOME fi echo echo -e "- ${green}初始化完成${plain}" echo read -n1 -p "按任意键继续" key clear show_menu ;; 99) clear if (nginx -v &> /dev/null); then echo confirm "确定要卸载 nginx 吗?" "n" if [[ $? == 0 ]]; then remove_nginx echo echo -e "- ${green}nginx 卸载完成${plain}" else clear show_menu return fi else echo echo -e "- ${yellow}nginx 尚未安装${plain}" fi echo read -n1 -p "按任意键继续" key clear show_menu ;; 0) run_script start.sh ;; *) clear show_menu "请输入正确的数字" ;; esac } clear show_menu