2024-01-29 21:55:01 +01:00
|
|
|
package admin_service
|
2024-01-28 17:38:37 +03:30
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"crypto/tls"
|
|
|
|
|
"fmt"
|
|
|
|
|
"net/http"
|
2024-02-03 15:55:59 +01:00
|
|
|
"os"
|
2024-01-28 17:38:37 +03:30
|
|
|
"strconv"
|
2024-01-29 21:55:01 +01:00
|
|
|
|
|
|
|
|
"github.com/hiddify/libcore/global"
|
|
|
|
|
"github.com/hiddify/libcore/utils"
|
2024-01-28 17:38:37 +03:30
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
serverCertPath = "cert/server-cert.pem"
|
|
|
|
|
serverKeyPath = "cert/server-key.pem"
|
|
|
|
|
clientCertPath = "cert/client-cert.pem"
|
|
|
|
|
clientKeyPath = "cert/client-key.pem"
|
|
|
|
|
)
|
|
|
|
|
|
2024-01-29 21:55:01 +01:00
|
|
|
func StartWebServer(Port int, TLS bool) {
|
2024-01-28 17:38:37 +03:30
|
|
|
http.HandleFunc("/start", startHandler)
|
|
|
|
|
http.HandleFunc("/stop", StopHandler)
|
2024-02-03 15:55:59 +01:00
|
|
|
http.HandleFunc("/exit", ExitHandler)
|
2024-01-28 17:38:37 +03:30
|
|
|
server := &http.Server{
|
|
|
|
|
Addr: "127.0.0.1:" + fmt.Sprintf("%d", Port),
|
2024-01-29 21:55:01 +01:00
|
|
|
}
|
|
|
|
|
var err error
|
|
|
|
|
if TLS {
|
|
|
|
|
server.TLSConfig = &tls.Config{
|
2024-01-28 17:38:37 +03:30
|
|
|
MinVersion: tls.VersionTLS12,
|
|
|
|
|
Certificates: []tls.Certificate{utils.LoadCertificate(serverCertPath, serverKeyPath)},
|
|
|
|
|
ClientAuth: tls.RequireAndVerifyClientCert,
|
|
|
|
|
ClientCAs: utils.LoadClientCA(clientCertPath),
|
2024-01-29 21:55:01 +01:00
|
|
|
}
|
|
|
|
|
err = server.ListenAndServeTLS(serverCertPath, serverKeyPath)
|
|
|
|
|
} else {
|
|
|
|
|
err = server.ListenAndServe()
|
2024-01-28 17:38:37 +03:30
|
|
|
}
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic("Error: " + err.Error())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
func startHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
queryParams := r.URL.Query()
|
2024-01-29 21:55:01 +01:00
|
|
|
ipv6, err := strconv.ParseBool(queryParams.Get("Ipv6"))
|
2024-01-28 17:38:37 +03:30
|
|
|
if err != nil {
|
2024-01-29 21:55:01 +01:00
|
|
|
fmt.Printf("ipv6 Error: %v ==>using false\n", err)
|
|
|
|
|
ipv6 = false
|
2024-01-28 17:38:37 +03:30
|
|
|
}
|
2024-01-29 21:55:01 +01:00
|
|
|
serverPort, err := strconv.Atoi(queryParams.Get("ServerPort"))
|
2024-01-28 17:38:37 +03:30
|
|
|
if err != nil {
|
2024-01-29 21:55:01 +01:00
|
|
|
fmt.Printf("serverPort Error: %v ==>using 2334\n", err)
|
|
|
|
|
serverPort = 2334
|
2024-01-28 17:38:37 +03:30
|
|
|
}
|
2024-01-29 21:55:01 +01:00
|
|
|
strictRoute, err := strconv.ParseBool(queryParams.Get("StrictRoute"))
|
2024-01-28 17:38:37 +03:30
|
|
|
if err != nil {
|
2024-01-29 21:55:01 +01:00
|
|
|
fmt.Printf("strictRoute Error: %v ==>using false\n", err)
|
|
|
|
|
strictRoute = false
|
2024-01-28 17:38:37 +03:30
|
|
|
}
|
2024-01-29 21:55:01 +01:00
|
|
|
endpointIndependentNat, err := strconv.ParseBool(queryParams.Get("EndpointIndependentNat"))
|
2024-01-28 17:38:37 +03:30
|
|
|
if err != nil {
|
2024-01-29 21:55:01 +01:00
|
|
|
fmt.Printf("endpointIndependentNat Error: %v ==>using false\n", err)
|
|
|
|
|
endpointIndependentNat = false
|
2024-01-28 17:38:37 +03:30
|
|
|
}
|
2024-01-29 21:55:01 +01:00
|
|
|
theStack := GetStack(queryParams.Get("Stack"))
|
2024-01-28 17:38:37 +03:30
|
|
|
|
2024-01-29 21:55:01 +01:00
|
|
|
parameters := global.Parameters{Ipv6: ipv6, ServerPort: serverPort, StrictRoute: strictRoute, EndpointIndependentNat: endpointIndependentNat, Stack: theStack}
|
2024-01-28 17:38:37 +03:30
|
|
|
|
2024-02-02 13:47:41 +01:00
|
|
|
// err = global.WriteParameters(parameters.Ipv6, parameters.ServerPort, parameters.StrictRoute, parameters.EndpointIndependentNat, GetStringFromStack(parameters.Stack))
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// http.Error(w, fmt.Sprintf("Error: %v", err), http.StatusBadRequest)
|
|
|
|
|
// return
|
|
|
|
|
// }
|
2024-01-29 21:55:01 +01:00
|
|
|
err = global.SetupC("./", "./", "./tmp", false)
|
|
|
|
|
|
2024-01-28 17:38:37 +03:30
|
|
|
if err != nil {
|
|
|
|
|
http.Error(w, fmt.Sprintf("Error: %v", err), http.StatusBadRequest)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
err = global.StartServiceC(true, global.MakeConfig(parameters.Ipv6, parameters.ServerPort, parameters.StrictRoute, parameters.EndpointIndependentNat, GetStringFromStack(parameters.Stack)))
|
|
|
|
|
if err != nil {
|
|
|
|
|
http.Error(w, fmt.Sprintf("Error: %v", err), http.StatusBadRequest)
|
|
|
|
|
return
|
|
|
|
|
}
|
2024-01-29 21:55:01 +01:00
|
|
|
http.Error(w, fmt.Sprintf("Ok"), http.StatusOK)
|
2024-01-28 17:38:37 +03:30
|
|
|
}
|
|
|
|
|
func StopHandler(w http.ResponseWriter, r *http.Request) {
|
2024-02-02 13:47:41 +01:00
|
|
|
err := global.StopServiceC()
|
2024-01-28 17:38:37 +03:30
|
|
|
if err != nil {
|
|
|
|
|
http.Error(w, fmt.Sprintf("Error: %v", err), http.StatusBadRequest)
|
|
|
|
|
return
|
|
|
|
|
}
|
2024-02-02 13:47:41 +01:00
|
|
|
http.Error(w, fmt.Sprintf("Ok"), http.StatusOK)
|
2024-01-28 17:38:37 +03:30
|
|
|
}
|
2024-02-03 15:55:59 +01:00
|
|
|
func ExitHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
global.StopServiceC()
|
|
|
|
|
os.Exit(0)
|
|
|
|
|
http.Error(w, fmt.Sprintf("Ok"), http.StatusOK)
|
|
|
|
|
}
|
2024-01-28 17:38:37 +03:30
|
|
|
func GetStack(stack string) global.Stack {
|
2024-01-29 21:55:01 +01:00
|
|
|
|
2024-01-28 17:38:37 +03:30
|
|
|
switch stack {
|
|
|
|
|
case "system":
|
|
|
|
|
return global.System
|
2024-01-29 21:55:01 +01:00
|
|
|
case "gvisor":
|
2024-01-28 17:38:37 +03:30
|
|
|
return global.GVisor
|
|
|
|
|
case "mixed":
|
|
|
|
|
return global.Mixed
|
2024-01-29 21:55:01 +01:00
|
|
|
// case "LWIP":
|
|
|
|
|
// return global.LWIP
|
2024-01-28 17:38:37 +03:30
|
|
|
default:
|
2024-01-29 21:55:01 +01:00
|
|
|
fmt.Printf("Stack Error: %s is not valid==> using GVisor\n", stack)
|
|
|
|
|
return global.GVisor
|
2024-01-28 17:38:37 +03:30
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
func GetStringFromStack(stack global.Stack) string {
|
|
|
|
|
switch stack {
|
|
|
|
|
case global.System:
|
|
|
|
|
return "system"
|
|
|
|
|
case global.GVisor:
|
2024-01-29 21:55:01 +01:00
|
|
|
return "gvisor"
|
2024-01-28 17:38:37 +03:30
|
|
|
case global.Mixed:
|
|
|
|
|
return "mixed"
|
2024-01-29 21:55:01 +01:00
|
|
|
// case global.LWIP:
|
|
|
|
|
// return "LWIP"
|
2024-01-28 17:38:37 +03:30
|
|
|
default:
|
|
|
|
|
return "UNKNOWN"
|
|
|
|
|
}
|
|
|
|
|
}
|