feat: Node info includes country code, and added cli flag

This commit is contained in:
HeshamTB 2024-03-28 22:35:17 +03:00
parent 64880261c2
commit f0018bbd2f
5 changed files with 40 additions and 1 deletions

View File

@ -16,6 +16,7 @@ import (
"github.com/urfave/cli/v2" "github.com/urfave/cli/v2"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes" "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
"github.com/biter777/countries"
hvpnnode3 "gitea.hbanafa.com/HeshamTB/hvpn-node3" hvpnnode3 "gitea.hbanafa.com/HeshamTB/hvpn-node3"
) )
@ -33,6 +34,8 @@ var InterfaceName string
var WgPort int var WgPort int
var wgLink *hvpnnode3.WGLink var wgLink *hvpnnode3.WGLink
var Country countries.CountryCode
var httpPort int var httpPort int
var TLS_ENABLED bool var TLS_ENABLED bool
var tlsConfig *tls.Config var tlsConfig *tls.Config
@ -57,6 +60,7 @@ func run(ctx *cli.Context) {
wgLink.StartedAT = time.Now().UTC() wgLink.StartedAT = time.Now().UTC()
slog.Info(fmt.Sprintf("Started at %s", wgLink.StartedAT)) slog.Info(fmt.Sprintf("Started at %s", wgLink.StartedAT))
slog.Info(fmt.Sprintf("Country set to %s (%s)", Country.Alpha2(), Country.String()))
hvpnnode3.StartMonitor(wgLink, *slog.Default()) hvpnnode3.StartMonitor(wgLink, *slog.Default())
apiMux := http.NewServeMux() apiMux := http.NewServeMux()
@ -68,6 +72,7 @@ func run(ctx *cli.Context) {
apiMux.HandleFunc("GET /peer", hvpnnode3.HandleGetCreatePeer(wgLink)) apiMux.HandleFunc("GET /peer", hvpnnode3.HandleGetCreatePeer(wgLink))
var handler http.Handler = apiMux var handler http.Handler = apiMux
handler = hvpnnode3.WithCountryCtx(handler, Country)
handler = hvpnnode3.HttpAuthToken(handler, ctx.String("http-api-key")) handler = hvpnnode3.HttpAuthToken(handler, ctx.String("http-api-key"))
handler = hvpnnode3.HttpLogHandler2(handler) handler = hvpnnode3.HttpLogHandler2(handler)
@ -197,6 +202,22 @@ func createCliApp() *cli.App {
} }
app.Flags = append(app.Flags, &apiSecret) app.Flags = append(app.Flags, &apiSecret)
countryFlag := cli.StringFlag{
Name: "country",
Usage: "The contry code for this VPN instance. Accepts ISO 3166 codes",
Value: "SA",
Action: func(ctx *cli.Context, s string) error {
c := countries.ByName(s)
if c == countries.Unknown {
return errors.New(fmt.Sprintf("Country code %s is unknown", s))
}
Country = c
return nil
},
EnvVars: []string{ "HVPN_COUNTRY" },
}
app.Flags = append(app.Flags, &countryFlag)
/* TLS Flags */ /* TLS Flags */

1
go.mod
View File

@ -3,6 +3,7 @@ module gitea.hbanafa.com/HeshamTB/hvpn-node3
go 1.22.0 go 1.22.0
require ( require (
github.com/biter777/countries v1.7.4
github.com/felixge/httpsnoop v1.0.4 github.com/felixge/httpsnoop v1.0.4
github.com/google/uuid v1.6.0 github.com/google/uuid v1.6.0
github.com/urfave/cli/v2 v2.27.1 github.com/urfave/cli/v2 v2.27.1

2
go.sum
View File

@ -1,3 +1,5 @@
github.com/biter777/countries v1.7.4 h1:590JZkxrv+/JBTAw2GHULx9l7vUZxz2HWMZ9HkruiOc=
github.com/biter777/countries v1.7.4/go.mod h1:1HSpZ526mYqKJcpT5Ti1kcGQ0L0SrXWIaptUWjFfv2E=
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=

View File

@ -11,6 +11,7 @@ import (
"text/template" "text/template"
"time" "time"
"github.com/biter777/countries"
"github.com/felixge/httpsnoop" "github.com/felixge/httpsnoop"
"github.com/google/uuid" "github.com/google/uuid"
@ -20,6 +21,7 @@ import (
type CtxKey string type CtxKey string
const CtxReqID CtxKey = "request_id" const CtxReqID CtxKey = "request_id"
const CtxCountryCode CtxKey = "country"
func HandleGetNodeInfo(wgLink *WGLink) http.HandlerFunc { func HandleGetNodeInfo(wgLink *WGLink) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
@ -31,10 +33,13 @@ func HandleGetNodeInfo(wgLink *WGLink) http.HandlerFunc {
return return
} }
c := r.Context().Value(CtxCountryCode).(countries.CountryCode)
json.NewEncoder(w).Encode( json.NewEncoder(w).Encode(
proto.NodePublicInfo{ proto.NodePublicInfo{
PublicKey: dev.PublicKey.String(), PublicKey: dev.PublicKey.String(),
UDPPort: dev.ListenPort, UDPPort: dev.ListenPort,
Country: c.String(),
CountryCode: c.Alpha2(),
Endpoint: wgLink.Endpoint, Endpoint: wgLink.Endpoint,
Type: dev.Type.String(), Type: dev.Type.String(),
StartedAt: wgLink.StartedAT, StartedAt: wgLink.StartedAT,
@ -236,6 +241,14 @@ func HttpAuthToken(h http.Handler, token string) http.Handler {
return http.HandlerFunc(fn) return http.HandlerFunc(fn)
} }
func WithCountryCtx(h http.Handler, country countries.CountryCode) http.Handler {
fn := func(w http.ResponseWriter, r* http.Request) {
rr := r.WithContext(context.WithValue(r.Context(), CtxCountryCode, country))
h.ServeHTTP(w, rr)
}
return http.HandlerFunc(fn)
}
func debugf(format string, reqID uuid.UUID, args ...any) { func debugf(format string, reqID uuid.UUID, args ...any) {
format = format + " " + reqID.String() format = format + " " + reqID.String()
slog.Debug(fmt.Sprintf(format, args...)) slog.Debug(fmt.Sprintf(format, args...))

View File

@ -6,7 +6,9 @@ type NodePublicInfo struct {
PublicKey string `json:"public_key"` PublicKey string `json:"public_key"`
UDPPort int `json:"udp_port"` UDPPort int `json:"udp_port"`
Endpoint string `json:"endpoint"` Endpoint string `json:"endpoint"`
Country string `json:"country"`
CountryCode string `json:"country_code"`
Type string `json:"type"` Type string `json:"type"`
StartedAt time.Time `json:"started_at"` StartedAt time.Time `json:"started_at"`
Uptime time.Duration `json:"uptime"` Uptime time.Duration `json:"uptime_ns"`
} }