From 4966d0458a10b2e4a5566267fc2ec64ddb5acd6a Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 2 Sep 2023 17:13:41 +0000 Subject: [PATCH] first commit --- Makefile | 16 +++ README.md | 0 luasrc/controller/admin/tgsstp.lua | 4 + luasrc/model/cbi/torguard/tgsstp.lua | 75 ++++++++++ root/etc/config/tgsstp_cfg | 4 + root/etc/init.d/tgsstp | 76 ++++++++++ root/etc/sstp/sstp.sh | 130 ++++++++++++++++++ root/etc/uci-defaults/tgsstp_def | 12 ++ .../lib/lua/luci/controller/admin/tgsstp.lua | 4 + .../lua/luci/model/cbi/torguard/tgsstp.lua | 75 ++++++++++ root/usr/lib/pppd/2.4.9/sstp-pppd-plugin.so | Bin 0 -> 8221 bytes 11 files changed, 396 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100644 luasrc/controller/admin/tgsstp.lua create mode 100644 luasrc/model/cbi/torguard/tgsstp.lua create mode 100644 root/etc/config/tgsstp_cfg create mode 100755 root/etc/init.d/tgsstp create mode 100755 root/etc/sstp/sstp.sh create mode 100644 root/etc/uci-defaults/tgsstp_def create mode 100644 root/usr/lib/lua/luci/controller/admin/tgsstp.lua create mode 100644 root/usr/lib/lua/luci/model/cbi/torguard/tgsstp.lua create mode 100644 root/usr/lib/pppd/2.4.9/sstp-pppd-plugin.so diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1886398 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ + + +include $(TOPDIR)/rules.mk + + +LUCI_TITLE:=LuCI support for TorGuard SSTP VPN +LUCI_PKGARCH:=all +LUCI_DEPENDS:=+sstp-client +luci-proto-sstp + +define Package/tgsstp/conffiles +/etc/config/tgsstp_cfg +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/luasrc/controller/admin/tgsstp.lua b/luasrc/controller/admin/tgsstp.lua new file mode 100644 index 0000000..8f584bf --- /dev/null +++ b/luasrc/controller/admin/tgsstp.lua @@ -0,0 +1,4 @@ +module("luci.controller.admin.tgsstp", package.seeall) +function index() + entry({"admin", "vpn", "tgsstp"}, cbi("torguard/tgsstp"), _("TorGuard SSTP"), 102) +end \ No newline at end of file diff --git a/luasrc/model/cbi/torguard/tgsstp.lua b/luasrc/model/cbi/torguard/tgsstp.lua new file mode 100644 index 0000000..b6ee68e --- /dev/null +++ b/luasrc/model/cbi/torguard/tgsstp.lua @@ -0,0 +1,75 @@ +-- Import the necessary LuCI modules +local uci = require("luci.model.uci").cursor() +local sys = require("luci.sys") +local util = require("luci.util") + +-- Define the model +m = Map("tgsstp_cfg", "TorGuard SSTP VPN Setup") + +-- Define the section for the SSTP settings +s = m:section(TypedSection, "sstpconfig", "SSTP VPN Settings") +s.anonymous = true +s.addremove = false + +-- Define the input fields for the SSTP settings +user = s:option(Value, "username", translate("VPN Username")) +pass = s:option(Value, "password", translate("VPN Password")) +pass.password = true + +svr = s:option(ListValue, "server", translate("VPN Server")) +-- Add all servers here +svr:value("ar.torguard.org", "Argentina") +svr:value("au.torguard.org", "Australia Sydney") +svr:value("br.torguard.org", "Brazil Sau Paulo") +svr:value("br2.torguard.org", "Brazil Sau Paulo 2") +svr:value("us-la.torguard.org", "USA LA") +svr:value("us-fl.torguard.org", "USA Miami") +svr:value("us-ny.torguard.org", "USA NY") +svr:value("us-lv.torguard.org", "USA Las Vegas") +svr:value("us-sa.torguard.org", "USA Seattle") +svr:value("us-slc.torguard.org", "USA Salt Lake City") +svr:value("dn.torguard.org", "Denmark Copenhagen") +svr:value("fn.torguard.org", "Finland Helsinki") +svr:value("dn.torguard.org", "Denmark Copenhagen") +svr:value("fr.torguard.org", "France Paris") +svr:value("ger.torguard.org", "Germany Frankfurt") +svr:value("ice.torguard.org", "Iceland Reykjavik") +svr:value("ire.torguard.org", "Ireland Dublin") +svr:value("it.torguard.org", "Italy Milan") +svr:value("nl.torguard.org", "Netherlands Amsterdam") +svr:value("ru.torguard.org", "Russia Moscow") +svr:value("swe.torguard.org", "Sweden Stockholm") +svr:value("tk.torguard.org", "Turkey Istanbul") +svr:value("uk.man.torguard.org", "United Kingdom Manchester") +svr:value("hk.torguard.org", "Hong Kong") +svr:value("id.torguard.org", "Indonesia Jakarta") +svr:value("sk.torguard.org", "South Korea Seoul") +svr:value("nz.torguard.org", "New Zealand Auckland") +svr:value("sg.torguard.org", "Singapore") +svr:value("tw.torguard.org", "Taiwan Taipei") +svr:value("th.torguard.org", "Thailand Bangkok") +svr:value("bh.torguard.org", "Bahrain Manama") +svr:value("in.torguard.org", "India Mumbai") +svr:value("isr-loc1.torguard.org", "Israel Tel Aviv") +svr:value("isr-loc2.torguard.org", "Israel Petah Tikva") +svr:value("sa.torguard.org", "South Africa Johannesburg") + + + +-- VPN Control: Start/Stop SSTP VPN +ctrl = m:section(TypedSection, "sstpconfig", "VPN Control: Start/Stop SSTP") +ctrl.anonymous = true +ctrl.addremove = false + +btnStop = ctrl:option(Button, "_btn_start", translate("Click to Stop SSTP")) +function btnStop.write() + io.popen("/etc/init.d/tgsstp stop") +end + +btnStart = ctrl:option(Button, "_btn_stop", translate("Click to Start SSTP")) +function btnStart.write() + io.popen("/etc/init.d/tgsstp start") +end + +-- Return the configuration page +return m diff --git a/root/etc/config/tgsstp_cfg b/root/etc/config/tgsstp_cfg new file mode 100644 index 0000000..4a01918 --- /dev/null +++ b/root/etc/config/tgsstp_cfg @@ -0,0 +1,4 @@ +config sstpconfig 'settings' + option server 'fr.torguard.org' + option username '' + option password '' \ No newline at end of file diff --git a/root/etc/init.d/tgsstp b/root/etc/init.d/tgsstp new file mode 100755 index 0000000..9ccbba9 --- /dev/null +++ b/root/etc/init.d/tgsstp @@ -0,0 +1,76 @@ +#!/bin/bash /etc/rc.common +# TorGuard SSTP init script + +START=10 +STOP=15 + +USE_PROCD=0 + +NAME=tgsstp +LOGFILE=/var/log/${NAME}.log + +log() { + local timestamp=$(date +"%Y-%m-%d %H:%M:%S") + echo "${timestamp} ${NAME}: $@" >> ${LOGFILE} +} + +stop_service() { + log "Stopping service" + procd_kill sstpc + ifdown sstp + uci commit network + /etc/init.d/network reload + ifdown wan + ifup wan + ifdown wwan + ifup wwan + log "sstp service stopped" +} + +start_service() { + log "Starting sstp service" + config_load tgsstp_cfg + + local server + local username + local password + + config_get server settings server + config_get username settings username + config_get password settings password + + #add sstp script with custom port + rm /lib/netifd/proto/sstp.sh + cp /etc/sstp/sstp.sh /lib/netifd/proto/sstp.sh + + #copy missing plugin path + cp /usr/lib/sstp-pppd-plugin.so /usr/lib/pppd/2.4.9/sstp-pppd-plugin.so + + + # check if the sstp entry already exists in the firewall + local sstp_exists=$(uci show firewall | grep -wc " 'sstp'") + if [ "$sstp_exists" -eq 0 ]; then + uci add_list firewall.wan.network="sstp" + uci commit firewall + reload_config + fi + + uci -q delete network.sstp + uci set network.sstp="interface" + uci set network.sstp.proto="sstp" + uci set network.sstp.server="${server}" + uci set network.sstp.username="${username}" + uci set network.sstp.password="${password}" + uci commit network + + procd_open_instance + procd_set_param command /usr/sbin/sstpc "$server:9443" --user "$username" --pass "$password" + procd_set_param stdout 1 # forward stdout of the command to logd + procd_set_param stderr 1 # same for stderr + procd_set_param respawn # automatically restart the service if it dies + procd_close_instance + /etc/init.d/network reload + ifdown sstp + ifup sstp + log "sstp service started" +} diff --git a/root/etc/sstp/sstp.sh b/root/etc/sstp/sstp.sh new file mode 100755 index 0000000..a9ff808 --- /dev/null +++ b/root/etc/sstp/sstp.sh @@ -0,0 +1,130 @@ +#!/bin/sh + +[ -x /usr/bin/sstpc ] || exit 0 + +[ -n "$INCLUDE_ONLY" ] || { + . /lib/functions.sh + . ../netifd-proto.sh + init_proto "$@" +} + +proto_sstp_init_config() { + proto_config_add_string "server" + proto_config_add_string "username" + proto_config_add_string "password" + proto_config_add_string "pppd_options" + proto_config_add_string "sstp_options" + proto_config_add_int "log_level" + proto_config_add_int "mtu" + proto_config_add_boolean "ipv6" + proto_config_add_boolean "defaultroute" + proto_config_add_boolean "peerdns" + available=1 + no_device=1 +} + +proto_sstp_setup() { + local config="$1"; shift + local iface="$2" + local ifname="sstp-$config" + + local ip serv_addr server ipv6 defaultroute peerdns + json_get_var server server && { + for ip in $(resolveip -t 5 "$server"); do + ( proto_add_host_dependency "$config" "$ip" ) + serv_addr=1 + done + } + [ -n "$serv_addr" ] || { + echo "Could not resolve server address" + sleep 5 + proto_setup_failed "$config" + exit 1 + } + + json_get_vars username password pppd_options sstp_options log_level ipv6 defaultroute peerdns + if [ "$ipv6" = 1 ]; then + ipv6=1 + else + ipv6="" + fi + if [ "$defaultroute" = 0 ]; then + defaultroute="" + else + defaultroute=1 + fi + + if [ "$peerdns" = 0 ]; then + peerdns="" + else + peerdns=1 + fi + + [ -n "$mtu" ] || json_get_var mtu mtu + [ -n "$log_level" ] || log_level=0 + + local load + for module in slhc ppp_generic ppp_async ppp_mppe ip_gre gre pptp; do + grep -q "^$module " /proc/modules && continue + /sbin/insmod $module 2>&- >&- + load=1 + done + [ "$load" = "1" ] && sleep 1 + + proto_init_update "$ifname" 1 + proto_send_update "$config" + + proto_run_command "$config" sstpc \ + --cert-warn \ + --password $password \ + --user $username \ + --log-level $log_level \ + --save-server-route \ + --ipparam $config \ + $sstp_options \ + $server:9443 \ + ifname $ifname \ + require-mschap-v2 \ + ${ipv6:++ipv6} \ + refuse-pap \ + noauth \ + ${defaultroute:+replacedefaultroute defaultroute} \ + ${peerdns:+usepeerdns} \ + ip-up-script /lib/netifd/ppp-up \ + ipv6-up-script /lib/netifd/ppp-up \ + ip-down-script /lib/netifd/ppp-down \ + ipv6-down-script /lib/netifd/ppp-down \ + ${mtu:+mtu $mtu mru $mtu} \ + $pppd_options + + # WORKAROUND: Workaround to properly register the sstp interface (As seeen in: https://forum.archive.openwrt.org/viewtopic.php?id=58007) + # WORKAROUND: Start + sleep 10 + proto_init_update "$ifname" 1 + proto_send_update "$config" + # WORKAROUND: End + + # if use pppoe and sstp at same time , firewall need reload . + # but don't konw why + /etc/init.d/firewall reload 2>&- >&- +} + +proto_sstp_teardown() { + local interface="$1" + + case "$ERROR" in + 11|19) + proto_notify_error "$interface" AUTH_FAILED + proto_block_restart "$interface" + ;; + 2) + proto_notify_error "$interface" INVALID_OPTIONS + proto_block_restart "$interface" + ;; + esac + proto_kill_command "$interface" +} + +[ -n "$INCLUDE_ONLY" ] || { + add_protocol sstp +} diff --git a/root/etc/uci-defaults/tgsstp_def b/root/etc/uci-defaults/tgsstp_def new file mode 100644 index 0000000..83824d7 --- /dev/null +++ b/root/etc/uci-defaults/tgsstp_def @@ -0,0 +1,12 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@tgsstp_def[-1] + add ucitrack tgsstp + set ucitrack.@tgsstp[-1].init=tgsstp + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 + diff --git a/root/usr/lib/lua/luci/controller/admin/tgsstp.lua b/root/usr/lib/lua/luci/controller/admin/tgsstp.lua new file mode 100644 index 0000000..8f584bf --- /dev/null +++ b/root/usr/lib/lua/luci/controller/admin/tgsstp.lua @@ -0,0 +1,4 @@ +module("luci.controller.admin.tgsstp", package.seeall) +function index() + entry({"admin", "vpn", "tgsstp"}, cbi("torguard/tgsstp"), _("TorGuard SSTP"), 102) +end \ No newline at end of file diff --git a/root/usr/lib/lua/luci/model/cbi/torguard/tgsstp.lua b/root/usr/lib/lua/luci/model/cbi/torguard/tgsstp.lua new file mode 100644 index 0000000..b6ee68e --- /dev/null +++ b/root/usr/lib/lua/luci/model/cbi/torguard/tgsstp.lua @@ -0,0 +1,75 @@ +-- Import the necessary LuCI modules +local uci = require("luci.model.uci").cursor() +local sys = require("luci.sys") +local util = require("luci.util") + +-- Define the model +m = Map("tgsstp_cfg", "TorGuard SSTP VPN Setup") + +-- Define the section for the SSTP settings +s = m:section(TypedSection, "sstpconfig", "SSTP VPN Settings") +s.anonymous = true +s.addremove = false + +-- Define the input fields for the SSTP settings +user = s:option(Value, "username", translate("VPN Username")) +pass = s:option(Value, "password", translate("VPN Password")) +pass.password = true + +svr = s:option(ListValue, "server", translate("VPN Server")) +-- Add all servers here +svr:value("ar.torguard.org", "Argentina") +svr:value("au.torguard.org", "Australia Sydney") +svr:value("br.torguard.org", "Brazil Sau Paulo") +svr:value("br2.torguard.org", "Brazil Sau Paulo 2") +svr:value("us-la.torguard.org", "USA LA") +svr:value("us-fl.torguard.org", "USA Miami") +svr:value("us-ny.torguard.org", "USA NY") +svr:value("us-lv.torguard.org", "USA Las Vegas") +svr:value("us-sa.torguard.org", "USA Seattle") +svr:value("us-slc.torguard.org", "USA Salt Lake City") +svr:value("dn.torguard.org", "Denmark Copenhagen") +svr:value("fn.torguard.org", "Finland Helsinki") +svr:value("dn.torguard.org", "Denmark Copenhagen") +svr:value("fr.torguard.org", "France Paris") +svr:value("ger.torguard.org", "Germany Frankfurt") +svr:value("ice.torguard.org", "Iceland Reykjavik") +svr:value("ire.torguard.org", "Ireland Dublin") +svr:value("it.torguard.org", "Italy Milan") +svr:value("nl.torguard.org", "Netherlands Amsterdam") +svr:value("ru.torguard.org", "Russia Moscow") +svr:value("swe.torguard.org", "Sweden Stockholm") +svr:value("tk.torguard.org", "Turkey Istanbul") +svr:value("uk.man.torguard.org", "United Kingdom Manchester") +svr:value("hk.torguard.org", "Hong Kong") +svr:value("id.torguard.org", "Indonesia Jakarta") +svr:value("sk.torguard.org", "South Korea Seoul") +svr:value("nz.torguard.org", "New Zealand Auckland") +svr:value("sg.torguard.org", "Singapore") +svr:value("tw.torguard.org", "Taiwan Taipei") +svr:value("th.torguard.org", "Thailand Bangkok") +svr:value("bh.torguard.org", "Bahrain Manama") +svr:value("in.torguard.org", "India Mumbai") +svr:value("isr-loc1.torguard.org", "Israel Tel Aviv") +svr:value("isr-loc2.torguard.org", "Israel Petah Tikva") +svr:value("sa.torguard.org", "South Africa Johannesburg") + + + +-- VPN Control: Start/Stop SSTP VPN +ctrl = m:section(TypedSection, "sstpconfig", "VPN Control: Start/Stop SSTP") +ctrl.anonymous = true +ctrl.addremove = false + +btnStop = ctrl:option(Button, "_btn_start", translate("Click to Stop SSTP")) +function btnStop.write() + io.popen("/etc/init.d/tgsstp stop") +end + +btnStart = ctrl:option(Button, "_btn_stop", translate("Click to Start SSTP")) +function btnStart.write() + io.popen("/etc/init.d/tgsstp start") +end + +-- Return the configuration page +return m diff --git a/root/usr/lib/pppd/2.4.9/sstp-pppd-plugin.so b/root/usr/lib/pppd/2.4.9/sstp-pppd-plugin.so new file mode 100644 index 0000000000000000000000000000000000000000..fb7c8e827a4d008438797c9b645609b2a8b2f318 GIT binary patch literal 8221 zcmeHMTWl2989uYVU>r&pV+f^9G9iYL2)kqIsuZ=&wrL}zP|08_5eap?-kn{Kyq+2D zjJY&OwVD?mu#AEuSt`x$0}lwHinghQs?d_s3u<^kf=D!Km0df7odmUxls2fTy#2m2 zvvAnvAum<)up|BZ{g-q8^Pm4*=IogterNYHnx={R(;~JCO0RSXF;G{winalvi#FK! z+$$XwIQ>~6NNur|_5%--G)b>Pv6K*^J+^}tS=h6%lQzIkqP-QgCk(Q(Xu}WfNzh){ zRsW|^m&CdNu?DmWMEMJ#hd}E=-JlJiwIDPv9tAxDS`GRfXd~$JAaq@}qXR$b6ZJhR z-3eHsRD2-jKcncnz$0a1Rjgyo>p&|(55~Hd7};;~jG6soTQByA*8q3>vE|r@f4wmE z{_4_!myW)7{qOA3e?60NP%ZW7bb6!jHKI=`t%FZ1GGpzEib^eGeXha&euMne23gGq z$L606_DhP)F+SBGKd;D)=Sd|Vmj9z-r`*$ESEjgN{g0ILl=n2q#}%3W{;bF>Z#MY< zc7uIygZ-HXx!6$tSw&`h6-8!yoWJ!)2eT9YDwsTn!FOTSq#$#AIp@1Dz7FJ-m|&bc zYs3R`-t5N&jO>`9X3lnOVVar4X|m~p{R0bP)+$#F7zL#_1(;v z6^L9qNEd`36rGHBL}XmYu`&UwSjD2_ngutL4s6$90chN!@cqCu)1GaP`+3u`4vBHk zv&=E;h;Q1y4~J6DTY>3YPL_syRnkFFG}GCv$d2R-ZvI};qLn!)i;i34^l@J!1q;o? zmtZN8DY!nn>Idn}n3)+JGjnOXaGxSSkuIVQYh)rXe8+V?^dJ65U3W})g^9fFATM?x z5Q*t}?4B=q#|`Y9Z54&>nG>FQSM)qDYaX+kd3zOPVIkGI!= zDpC|^?CD3*-(Fi{jrzZ1Bf`>rwAG5tIA`5tDz0 zh;=bb#KwM#2!CZFmceNvHs~`%tfzBCtdsLZte;ni*zhh8u@GM+;stVvh!@K5h}gKV z5Ye%#M7(6K5%E&FLBxyYCJ`@}zYy_Kst^&kmg;>+OI=)ixc0?rYo#}At(3ymmFY^y z(yznHgIL6Wn4Vknr{i;#4_^)I{7r?wrtnu3{*uC9Q26r-e@5ZU3O}pxClvme!cQvv zVTJb;epKOy6@I_M4=VgFg-0q50(G#SOb* zZ!u;TDC4ZrnW8L83%{z>-rLb&+a^k(5Yv@gu=T*E>E(IpQ@!7YPL{%M_|=k(X}U61tG#Q$$0+Jv1@1uot(#~s&-ZKx zigI=7>E3tpZ+&+zp-)%3e?*@zE(pZZG0Fa&3}^bMLSdBW&mvBd8k|GF&Ms+D>_3BU zF^yOTr{*-2X@kE4>i*ogRB0ccuCyo1)sraWK-UJo6?TVy#Na%Z!r4*sgXJn#P55K- zdbxUvzKxec)@2`Np`SSc|A=`d>icn>Nh18<{LtAtJT<4o-VVF;=?%_d3BB2Fl&dS? zlXV%}_fRL*&pysBux}hEEcH$UZPv@Kh}#`P*}Bi?*j9tjMC>yK+if|v_xr4192$Lo zgFcZ95y!e0GUFPde*=2NTF=wt)S-XO_iQ{@7(dH(DEZt1T}M=|Glh=8xuq8_F221^69p)50JmX(8^%0Z z#(u~5|1W`Q&{LqDpbyq!zG8h043@%yR4Hs5#2o5>0--q3ZgL6%; z8U2OO!@NJxt%+ms6Tm;$nlP?~W%#OLthm!RK@)0e0A#;HSBj}_$>6LB2$`8TY!6ylzZW8a6d;26k0B+K)=&=kn#E3O6 zWq^F1b|(s19fuR$^(;q^j&XY6>KS)@e8RDDV6*f?b}*{TBSofQGG&9i5Kr;i)3^X&)%)qBN17E|%1HU8lUgCND5T{~% zImUA_UX1Z|Ag=kvb>Kt51t9M|_-%{#ApC}fYjycuf!}Iz6(+yi^7{h6^-?C?0R3aR z=AJ=)-lyEbg%z${#ZAckZ*SqU1=s%aJ1