diff --git a/grpc.tpl b/nginx-grpc.tpl similarity index 100% rename from grpc.tpl rename to nginx-grpc.tpl diff --git a/nginx-proxy.tpl b/nginx-proxy.tpl new file mode 100644 index 0000000..a1bc622 --- /dev/null +++ b/nginx-proxy.tpl @@ -0,0 +1,3 @@ + location LOCATION { + proxy_pass http://HOST:PORT; + } \ No newline at end of file diff --git a/ws.tpl b/nginx-ws.tpl similarity index 100% rename from ws.tpl rename to nginx-ws.tpl diff --git a/run.sh b/run.sh index b38cf95..aa64b2a 100755 --- a/run.sh +++ b/run.sh @@ -10,19 +10,19 @@ XCONF=/tmp/server-xray.json usage() { echo "server-xray " echo " --lx [p=443,]d=domain.com,u=id[:level[:email]]" - echo " --lt [p=443,]d=domain.com,u=id[:level[:email]]" - echo " --ltw [p=443,]d=domain.com,u=id[:level[:email]],w=/wspath" - echo " --lpw [p=443,]u=id[:level[:email],]w=/wspath" - echo " --ltg [p=443,]d=domain.com,u=id[:level[:email]],s=svcname" + echo " --ls [p=443,]d=domain.com,u=id[:level[:email]]" + echo " --ms [p=443,]d=domain.com,u=id[:level[:email]]" + echo " --ts [p=443,]d=domain.com,u=psw[:level[:email]]" + echo " --lsw [p=443,]d=domain.com,u=id[:level[:email]],w=/wspath" + echo " --lsg [p=443,]d=domain.com,u=id[:level[:email]],s=svcname" + echo " --lss [p=442,]d=domain.com,u=id[:level[:email]],w=/webpath" + echo " --msw [p=443,]d=domain.com,u=id[:level[:email]],w=/wspath" + echo " --tsw [p=443,]d=domain.com,u=psw[:level[:email]],w=/wspath" + echo " --lpw [p=443,]u=id[:level[:email]],w=/wspath" echo " --lpg [p=443,]u=id[:level[:email]],s=svcname" - echo " --lts [p=442,]d=domain.com,u=id[:level[:email]],p=/path" - echo " --lps [p=442,]u=id[:level[:email],]p=/path" - echo " --mt [p=443,]d=domain.com,u=id[:level[:email]]" - echo " --mtw [p=443,]d=domain.com,u=id[:level[:email]],w=/webpath" - echo " --mpw [p=443,]u=id[:level[:email]],w=/webpath" - echo " --tt [p=443,]d=domain.com,u=psw[:level[:email]]" - echo " --ttw [p=443,]d=domain.com,u=psw[:level[:email]],w=/webpath" - echo " --tpw [p=443,]u=psw[:level[:email]],w=/webpath" + echo " --lps [p=442,]u=id[:level[:email]],w=/webpath" + echo " --mpw [p=443,]u=id[:level[:email]],w=/wspath" + echo " --tpw [p=443,]u=psw[:level[:email]],w=/wspath" echo " --ng-opt [p=443,]d=domain0.com[,d=domain1.com][...]" echo " --ng-proxy [d=domain0.com,][d=domain1.com][...][h=127.0.0.1,]p=port-backend,l=location,n=ws|grpc|splt" echo " -u|--user u=id0[:level[:email]][,u=id1][...]" @@ -33,7 +33,7 @@ usage() { echo " -d|--debug [Optional] Start in debug mode with verbose output" } -TEMP=`getopt -o u:k:r:c:di --long user:,hook:,request-domain:,cert-home:,lx:,lt:,ltw:,lpw:,mt:,mtw:,mpw:,tt:,ttw:,tpw:,ltg:,lpg:,ng-opt:,ng-proxy:,stdin,debug -n "$0" -- $@` +TEMP=`getopt -o u:k:r:c:di --long user:,hook:,request-domain:,cert-home:,lx:,ls:,ms:,ts:,lsw:,lsg:,lss:,msw:,tsw:,lpw:,lpg:,lps:,mpw:,tpw:,ng-opt:,ng-proxy:,stdin,debug -n "$0" -- $@` if [ $? != 0 ] ; then usage; exit 1 ; fi eval set -- "$TEMP" @@ -63,7 +63,7 @@ while true ; do UOPT+=("$2") shift 2 ;; - --lx|--lt|--ltw|--lpw|--ltg|--lpg|--mt|--mtw|--mpw|--tt|--ttw|--tpw) + --lx|--ls|--ms|--ts|--lsw|--lsg|--lss|--msw|--tsw|--lpw|--lpg|--lps|--mpw|--tpw) SVC=`echo $1|tr -d '\-\-'` SVCMD+=("${DIR}server-${SVC}.sh $2") shift 2 diff --git a/server-ltpg.sh b/server-lpg.sh similarity index 94% rename from server-ltpg.sh rename to server-lpg.sh index 39086eb..cf097a7 100755 --- a/server-ltpg.sh +++ b/server-lpg.sh @@ -1,7 +1,7 @@ #!/bin/bash usage() { - echo "Usage: server-ltpg ,,," + echo "Usage: server-lpg ,,," } options=(`echo $1 |tr ',' ' '`) diff --git a/server-lps.sh b/server-lps.sh new file mode 100755 index 0000000..5503489 --- /dev/null +++ b/server-lps.sh @@ -0,0 +1,131 @@ +#!/bin/bash + +usage() { + echo "Usage: server-lps ,,," +} + +options=(`echo $1 |tr ',' ' '`) +for option in "${options[@]}" +do + kv=(`echo $option |tr '=' ' '`) + case "${kv[0]}" in + x|xconf) + xconf="${kv[1]}" + ;; + p|port) + port="${kv[1]}" + ;; + u|user) + xuser+=("${kv[1]}") + ;; + w|wpath) + webpath="${kv[1]}" + ;; + f|fallback) + fallback+=("${kv[1]}") + ;; + esac +done + +if [ -z "${xconf}" ]; then + echo "Error: xconf undefined." + usage + exit 1 +fi + +if [ -z "${port}" ]; then + port=443 +fi + +if [ -z "${xuser}" ]; then + echo "Error: user undefined." + usage + exit 1 +fi + +if [ -z "${webpath}" ]; then + echo "Error: webpath undefined." + usage + exit 1 +fi + +if ! [ "${port}" -eq "${port}" ] 2>/dev/null; then >&2 echo "Port number must be numeric"; exit 1; fi + +XCONF=$xconf +# Remove existing port number if existing. +cat $XCONF |jq --arg port "${port}" 'del( .inbounds[] | select(.port == ($port|tonumber)) )' |sponge $XCONF +cat $XCONF |jq --arg port "${port}" '.inbounds +=[{"port":($port|tonumber), "protocol":"vless", "settings":{"clients":[]}}]' |sponge $XCONF + +for xu in "${xuser[@]}" +do + IFS=':' + uopt=(${xu}) + uopt=(${uopt[@]}) + + if [ -z "${uopt[0]}" ]; then + echo "Incorrect user format: ${xu}" + echo "Correct user format: user=[:level:email]" + echo "Like: user=myid:0:me@g.cn" + echo "Like: user=myid::me@g.cn" + echo "Like: user=myid:0" + echo "Like: user=myid" + exit 1 + fi + if [ -z "${uopt[1]}" ]; then + uopt[1]=0 + fi + cat $XCONF |jq --arg port "${port}" --arg uid "${uopt[0]}" --arg level "${uopt[1]}" --arg email "${uopt[2]}" \ + '( .inbounds[] | select(.port == ($port|tonumber)) | .settings.clients ) += [ {"id":$uid, "level":($level|tonumber), "email":$email} ] ' \ + |sponge $XCONF +done + +cat $XCONF |jq --arg port "${port}" \ +'( .inbounds[] | select(.port == ($port|tonumber)) | .settings.decryption ) += "none" ' \ +|sponge $XCONF + +for fb in "${fallback[@]}" +do + IFS=':' + fopt=(${fb}) + fopt=(${fopt[@]}) + + fhost="${fopt[0]}" + fport="${fopt[1]}" + fpath="${fopt[2]}" + + if [ -z "${fport}" ]; then + echo "Incorrect fallback format: ${fb}" + echo "Correct fallback: fallback=[host]<:port>[:path]" + echo "Like: fallback=baidu.com:443:/websocket" + echo "Like: fallback=:1443:/websocket" + echo "Like: fallback=:1443" + exit 1 + fi + + if [ -z "${fhost}" ]; then + if [ -z "${fpath}" ]; then + Jfallback=`echo '{}' |jq --arg fport "${fport}" --arg fpath "${fpath}" '. += {"dest":($fport|tonumber), "xver":1}'` + else + Jfallback=`echo '{}' |jq --arg fport "${fport}" --arg fpath "${fpath}" '. += {"dest":($fport|tonumber), "path":$fpath, "xver":1}'` + fi + else + if [ -z "${fpath}" ]; then + fdest="${fhost}:${fport}" + Jfallback=`echo '{}' |jq --arg fdest "${fdest}" --arg fpath "${fpath}" '. += {"dest":$fdest, "xver":1}'` + else + Jfallback=`echo '{}' |jq --arg fdest "${fdest}" --arg fpath "${fpath}" '. += {"dest":$fdest, "path":$fpath, "xver":1}'` + fi + fi + + cat $XCONF |jq --arg port "${port}" --argjson jfallback "$Jfallback" \ + '( .inbounds[] | select(.port == ($port|tonumber)) | .settings.fallbacks ) += [ $jfallback ] ' \ + |sponge $XCONF +done + +cat $XCONF |jq --arg port "${port}" \ +'( .inbounds[] | select(.port == ($port|tonumber)) | .streamSettings ) += {"network":"splithttp", "security":"none" } ' \ +|sponge $XCONF + +cat $XCONF |jq --arg port "${port}" --arg webpath "${webpath}" \ +'( .inbounds[] | select(.port == ($port|tonumber)) | .streamSettings ) += {"splithttpSettings":{"path":$webpath}} ' \ +|sponge $XCONF diff --git a/server-ltpw.sh b/server-lpw.sh similarity index 95% rename from server-ltpw.sh rename to server-lpw.sh index 6e4edf5..579298e 100755 --- a/server-ltpw.sh +++ b/server-lpw.sh @@ -1,7 +1,7 @@ #!/bin/bash usage() { - echo "Usage: server-ltpw ,,,[,fallback=www.baidu.com:443:/html][,fallback=:2443:/websocket2]" + echo "Usage: server-lpw ,,," } options=(`echo $1 |tr ',' ' '`) diff --git a/server-ltt.sh b/server-ls.sh similarity index 95% rename from server-ltt.sh rename to server-ls.sh index 14fd6e4..006a5cc 100755 --- a/server-ltt.sh +++ b/server-ls.sh @@ -1,7 +1,7 @@ #!/bin/bash usage() { - echo "Usage: server-ltt ,,,,[,fallback=www.baidu.com:443:/html][,fallback=:2443:/websocket2]" + echo "Usage: server-ls ,,,," } options=(`echo $1 |tr ',' ' '`) diff --git a/server-lttg.sh b/server-lsg.sh similarity index 95% rename from server-lttg.sh rename to server-lsg.sh index 78e96dc..9b3ba5a 100755 --- a/server-lttg.sh +++ b/server-lsg.sh @@ -1,7 +1,7 @@ #!/bin/bash usage() { - echo "Usage: server-lttg ,,,,," + echo "Usage: server-lsg ,,,,," } options=(`echo $1 |tr ',' ' '`) diff --git a/server-lss.sh b/server-lss.sh new file mode 100755 index 0000000..570f61b --- /dev/null +++ b/server-lss.sh @@ -0,0 +1,169 @@ +#!/bin/bash + +usage() { + echo "Usage: server-lss ,,,,," +} + +options=(`echo $1 |tr ',' ' '`) +for option in "${options[@]}" +do + kv=(`echo $option |tr '=' ' '`) + case "${kv[0]}" in + x|xconf) + xconf="${kv[1]}" + ;; + c|certhome) + certhome="${kv[1]}" + ;; + p|port) + port="${kv[1]}" + ;; + d|domain) + domain="${kv[1]}" + ;; + u|user) + xuser+=("${kv[1]}") + ;; + w|wpath) + webpath="${kv[1]}" + ;; + f|fallback) + fallback+=("${kv[1]}") + ;; + esac +done + +if [ -z "${certhome}" ]; then + echo "Error: certhome undefined." + usage + exit 1 +fi + +if [ -z "${xconf}" ]; then + echo "Error: xconf undefined." + usage + exit 1 +fi + +if [ -z "${port}" ]; then + port=443 +fi + +if [ -z "${domain}" ]; then + echo "Error: domain undefined." + usage + exit 1 +fi + +if [ -z "${xuser}" ]; then + echo "Error: user undefined." + usage + exit 1 +fi + +if [ -z "${webpath}" ]; then + echo "Error: webpath undefined." + usage + exit 1 +fi + +if ! [ "${port}" -eq "${port}" ] 2>/dev/null; then >&2 echo "Port number must be numeric"; exit 1; fi + +XCONF=$xconf +# Remove existing port number if existing. +cat $XCONF |jq --arg port "${port}" 'del( .inbounds[] | select(.port == ($port|tonumber)) )' |sponge $XCONF +cat $XCONF |jq --arg port "${port}" '.inbounds +=[{"port":($port|tonumber), "protocol":"vless", "settings":{"clients":[]}}]' |sponge $XCONF + +for xu in "${xuser[@]}" +do + IFS=':' + uopt=(${xu}) + uopt=(${uopt[@]}) + + if [ -z "${uopt[0]}" ]; then + echo "Incorrect user format: ${xu}" + echo "Correct user format: user=[:level:email]" + echo "Like: user=myid:0:me@g.cn" + echo "Like: user=myid::me@g.cn" + echo "Like: user=myid:0" + echo "Like: user=myid" + exit 1 + fi + if [ -z "${uopt[1]}" ]; then + uopt[1]=0 + fi + cat $XCONF |jq --arg port "${port}" --arg uid "${uopt[0]}" --arg level "${uopt[1]}" --arg email "${uopt[2]}" \ + '( .inbounds[] | select(.port == ($port|tonumber)) | .settings.clients ) += [ {"id":$uid, "level":($level|tonumber), "email":$email} ] ' \ + |sponge $XCONF +done + +cat $XCONF |jq --arg port "${port}" \ +'( .inbounds[] | select(.port == ($port|tonumber)) | .settings.decryption ) += "none" ' \ +|sponge $XCONF + +for fb in "${fallback[@]}" +do + IFS=':' + fopt=(${fb}) + fopt=(${fopt[@]}) + + fhost="${fopt[0]}" + fport="${fopt[1]}" + fpath="${fopt[2]}" + + if [ -z "${fport}" ]; then + echo "Incorrect fallback format: ${fb}" + echo "Correct fallback: fallback=[host]<:port>[:path]" + echo "Like: fallback=baidu.com:443:/websocket" + echo "Like: fallback=:1443:/websocket" + echo "Like: fallback=:1443" + exit 1 + fi + + if [ -z "${fhost}" ]; then + if [ -z "${fpath}" ]; then + Jfallback=`echo '{}' |jq --arg fport "${fport}" --arg fpath "${fpath}" '. += {"dest":($fport|tonumber), "xver":1}'` + else + Jfallback=`echo '{}' |jq --arg fport "${fport}" --arg fpath "${fpath}" '. += {"dest":($fport|tonumber), "path":$fpath, "xver":1}'` + fi + else + if [ -z "${fpath}" ]; then + fdest="${fhost}:${fport}" + Jfallback=`echo '{}' |jq --arg fdest "${fdest}" --arg fpath "${fpath}" '. += {"dest":$fdest, "xver":1}'` + else + Jfallback=`echo '{}' |jq --arg fdest "${fdest}" --arg fpath "${fpath}" '. += {"dest":$fdest, "path":$fpath, "xver":1}'` + fi + fi + + cat $XCONF |jq --arg port "${port}" --argjson jfallback "$Jfallback" \ + '( .inbounds[] | select(.port == ($port|tonumber)) | .settings.fallbacks ) += [ $jfallback ] ' \ + |sponge $XCONF +done + +cat $XCONF |jq --arg port "${port}" \ +'( .inbounds[] | select(.port == ($port|tonumber)) | .streamSettings ) += {"network":"splithttp", "security":"tls"} ' \ +|sponge $XCONF + +cat $XCONF |jq --arg port "${port}" \ +'( .inbounds[] | select(.port == ($port|tonumber)) | .streamSettings ) += {"tlsSettings":{"alpn":["http/1.1"]}} ' \ +|sponge $XCONF + +cat $XCONF |jq --arg port "${port}" --arg webpath "${webpath}" \ +'( .inbounds[] | select(.port == ($port|tonumber)) | .streamSettings ) += {"splithttpSettings":{"path":$webpath}} ' \ +|sponge $XCONF + +if [ -f "${certhome}/${domain}/fullchain.cer" ] && [ -f "${certhome}/${domain}/${domain}.key" ]; then + fullchain="${certhome}/${domain}/fullchain.cer" + prvkey="${certhome}/${domain}/${domain}.key" + break +fi + +if [ ! -f "${fullchain}" ] || [ ! -f "${prvkey}" ]; then + echo "TLS cert missing?" + echo "Abort." + exit 2 +fi + +cat $XCONF |jq --arg port "${port}" --arg fullchain "${fullchain}" --arg prvkey "${prvkey}" \ +'( .inbounds[] | select(.port == ($port|tonumber)) | .streamSettings.tlsSettings ) += {"certificates":[{"certificateFile":$fullchain, "keyFile":$prvkey}]} ' \ +|sponge $XCONF diff --git a/server-lttw.sh b/server-lsw.sh similarity index 95% rename from server-lttw.sh rename to server-lsw.sh index 5fde94b..8d78a51 100755 --- a/server-lttw.sh +++ b/server-lsw.sh @@ -1,7 +1,7 @@ #!/bin/bash usage() { - echo "Usage: server-lttw ,,,,,[,fallback=www.baidu.com:443:/html][,fallback=:2443:/websocket2]" + echo "Usage: server-lsw ,,,,," } options=(`echo $1 |tr ',' ' '`) diff --git a/server-ltx.sh b/server-lx.sh similarity index 95% rename from server-ltx.sh rename to server-lx.sh index 66b5787..9713cfe 100755 --- a/server-ltx.sh +++ b/server-lx.sh @@ -1,7 +1,7 @@ #!/bin/bash usage() { - echo "Usage: server-ltx ,,,,[,fallback=www.baidu.com:443:/html][,fallback=:2443:/websocket2]" + echo "Usage: server-lx ,,,," } options=(`echo $1 |tr ',' ' '`) diff --git a/server-mtpw.sh b/server-mpw.sh similarity index 95% rename from server-mtpw.sh rename to server-mpw.sh index 4d9d2b7..fbcc818 100755 --- a/server-mtpw.sh +++ b/server-mpw.sh @@ -1,7 +1,7 @@ #!/bin/bash usage() { - echo "Usage: server-mtpw ,,,[,fallback=www.baidu.com:443:/html][,fallback=:2443:/websocket2]" + echo "Usage: server-mpw ,,," } options=(`echo $1 |tr ',' ' '`) diff --git a/server-mtt.sh b/server-ms.sh similarity index 95% rename from server-mtt.sh rename to server-ms.sh index a783122..7811bbb 100755 --- a/server-mtt.sh +++ b/server-ms.sh @@ -1,7 +1,7 @@ #!/bin/bash usage() { - echo "Usage: server-mtt ,,,,[,fallback=www.baidu.com:443:/html][,fallback=:2443:/websocket2]" + echo "Usage: server-ms ,,,," } options=(`echo $1 |tr ',' ' '`) diff --git a/server-mttw.sh b/server-msw.sh similarity index 95% rename from server-mttw.sh rename to server-msw.sh index 2ac6653..e9eeccf 100755 --- a/server-mttw.sh +++ b/server-msw.sh @@ -1,7 +1,7 @@ #!/bin/bash usage() { - echo "Usage: server-mttw ,,,,,[,fallback=www.baidu.com:443:/html][,fallback=:2443:/websocket2]" + echo "Usage: server-msw ,,,,," } options=(`echo $1 |tr ',' ' '`) diff --git a/server-nginx.sh b/server-nginx.sh index e9c23ad..6070827 100755 --- a/server-nginx.sh +++ b/server-nginx.sh @@ -5,9 +5,9 @@ DIR="$(cd $DIR; pwd)" TPL="site-ssl.conf.tpl" usage() { - echo "server-nginx --ng-opt [,p=443] --ng-proxy [,h=127.0.0.1]" + echo "server-nginx --ng-opt [,p=443] --ng-proxy [,h=127.0.0.1]" echo " --ng-opt [,p=443]" - echo " --ng-proxy [,h=127.0.0.1][,d=host-domain]" + echo " --ng-proxy [,h=127.0.0.1][,d=host-domain]" } TEMP=`getopt -o o:x: --long ng-opt:,ng-proxy: -n "$0" -- $@` @@ -130,10 +130,13 @@ do # Replace the last(only) single line '}' with specific tpl file, hence insert a new section into the Nginx config file case "${xnetwork}" in ws|websocket) - sed -i -e "/^\}$/r ws.tpl" -e "/^\}$/d" ${domain}.conf + sed -i -e "/^\}$/r nginx-ws.tpl" -e "/^\}$/d" ${domain}.conf ;; grpc) - sed -i -e "/^\}$/r grpc.tpl" -e "/^\}$/d" ${domain}.conf + sed -i -e "/^\}$/r nginx-grpc.tpl" -e "/^\}$/d" ${domain}.conf + ;; + splt|proxy) + sed -i -e "/^\}$/r nginx-proxy.tpl" -e "/^\}$/d" ${domain}.conf ;; esac # Then add '}' to the end of the Nginx config file diff --git a/server-ttpw.sh b/server-tpw.sh similarity index 95% rename from server-ttpw.sh rename to server-tpw.sh index 7e65785..03fc0aa 100755 --- a/server-ttpw.sh +++ b/server-tpw.sh @@ -1,7 +1,7 @@ #!/bin/bash usage() { - echo "Usage: server-ttpw ,,[,fallback=www.baidu.com:443:/html][,fallback=:2443:/websocket2]" + echo "Usage: server-tpw ,," } options=(`echo $1 |tr ',' ' '`) diff --git a/server-ttt.sh b/server-ts.sh similarity index 95% rename from server-ttt.sh rename to server-ts.sh index 0859cad..501dbe4 100755 --- a/server-ttt.sh +++ b/server-ts.sh @@ -1,7 +1,7 @@ #!/bin/bash usage() { - echo "Usage: server-ttt ,,,,[,fallback=www.baidu.com:443:/html][,fallback=:2443:/websocket2]" + echo "Usage: server-ts ,,,," } options=(`echo $1 |tr ',' ' '`) diff --git a/server-tttw.sh b/server-tsw.sh similarity index 95% rename from server-tttw.sh rename to server-tsw.sh index e79317e..64782fb 100755 --- a/server-tttw.sh +++ b/server-tsw.sh @@ -1,7 +1,7 @@ #!/bin/bash usage() { - echo "Usage: server-tttw ,,,,[,fallback=www.baidu.com:443:/html][,fallback=:2443:/websocket2]" + echo "Usage: server-tsw ,,,," } options=(`echo $1 |tr ',' ' '`)