2023-08-16 15:16:02 +03:30
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
#include "stdint.h"
|
|
|
|
|
*/
|
|
|
|
|
import "C"
|
|
|
|
|
import (
|
2023-09-01 14:52:30 +03:30
|
|
|
"encoding/json"
|
2024-01-19 17:55:58 +03:30
|
|
|
"fmt"
|
2023-08-19 14:09:49 +03:30
|
|
|
"os"
|
2023-08-28 13:08:43 +03:30
|
|
|
"unsafe"
|
2023-08-19 14:09:49 +03:30
|
|
|
|
2023-08-28 13:08:43 +03:30
|
|
|
"github.com/hiddify/libcore/bridge"
|
2024-01-15 17:17:05 +03:30
|
|
|
"github.com/hiddify/libcore/config"
|
2024-03-03 04:15:19 +01:00
|
|
|
pb "github.com/hiddify/libcore/hiddifyrpc"
|
|
|
|
|
v2 "github.com/hiddify/libcore/v2"
|
|
|
|
|
|
2023-10-27 14:36:00 +03:30
|
|
|
"github.com/sagernet/sing-box/log"
|
2023-08-16 15:16:02 +03:30
|
|
|
)
|
|
|
|
|
|
2023-08-28 13:08:43 +03:30
|
|
|
//export setupOnce
|
|
|
|
|
func setupOnce(api unsafe.Pointer) {
|
|
|
|
|
bridge.InitializeDartApi(api)
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-16 15:16:02 +03:30
|
|
|
//export setup
|
2023-10-27 16:39:48 +03:30
|
|
|
func setup(baseDir *C.char, workingDir *C.char, tempDir *C.char, statusPort C.longlong, debug bool) (CErr *C.char) {
|
2024-03-16 01:39:33 +01:00
|
|
|
err := v2.Setup(C.GoString(baseDir), C.GoString(workingDir), C.GoString(tempDir), int64(statusPort), debug)
|
2023-10-27 16:39:48 +03:30
|
|
|
|
2024-03-16 01:39:33 +01:00
|
|
|
return emptyOrErrorC(err)
|
2023-08-16 15:16:02 +03:30
|
|
|
}
|
|
|
|
|
|
2023-08-19 14:09:49 +03:30
|
|
|
//export parse
|
2023-10-14 17:22:26 +03:30
|
|
|
func parse(path *C.char, tempPath *C.char, debug bool) (CErr *C.char) {
|
2024-03-16 01:39:33 +01:00
|
|
|
res, err := v2.Parse(&pb.ParseRequest{
|
|
|
|
|
ConfigPath: C.GoString(path),
|
|
|
|
|
TempPath: C.GoString(tempPath),
|
2023-10-14 17:22:26 +03:30
|
|
|
})
|
2023-08-16 15:16:02 +03:30
|
|
|
if err != nil {
|
2024-03-16 01:39:33 +01:00
|
|
|
log.Error(err.Error())
|
2023-08-16 15:16:02 +03:30
|
|
|
return C.CString(err.Error())
|
|
|
|
|
}
|
2024-03-16 01:39:33 +01:00
|
|
|
|
|
|
|
|
err = os.WriteFile(C.GoString(path), []byte(res.Content), 0644)
|
|
|
|
|
return emptyOrErrorC(err)
|
2023-08-16 15:16:02 +03:30
|
|
|
}
|
|
|
|
|
|
2023-09-01 14:52:30 +03:30
|
|
|
//export changeConfigOptions
|
2023-10-14 17:22:26 +03:30
|
|
|
func changeConfigOptions(configOptionsJson *C.char) (CErr *C.char) {
|
|
|
|
|
|
2024-03-16 01:39:33 +01:00
|
|
|
_, err := v2.ChangeConfigOptions(&pb.ChangeConfigOptionsRequest{
|
|
|
|
|
ConfigOptionsJson: C.GoString(configOptionsJson),
|
|
|
|
|
})
|
|
|
|
|
return emptyOrErrorC(err)
|
2023-09-01 14:52:30 +03:30
|
|
|
}
|
|
|
|
|
|
2023-11-12 12:50:14 +03:30
|
|
|
//export generateConfig
|
|
|
|
|
func generateConfig(path *C.char) (res *C.char) {
|
2024-03-16 01:39:33 +01:00
|
|
|
_, err := v2.GenerateConfig(&pb.GenerateConfigRequest{
|
|
|
|
|
Path: C.GoString(path),
|
2023-11-12 12:50:14 +03:30
|
|
|
})
|
2024-03-16 01:39:33 +01:00
|
|
|
return emptyOrErrorC(err)
|
2023-11-12 12:50:14 +03:30
|
|
|
}
|
|
|
|
|
|
2023-09-10 20:18:33 +03:30
|
|
|
//export start
|
2023-10-26 15:12:56 +03:30
|
|
|
func start(configPath *C.char, disableMemoryLimit bool) (CErr *C.char) {
|
2023-10-27 14:36:00 +03:30
|
|
|
|
2024-03-16 01:39:33 +01:00
|
|
|
_, err := v2.Start(&pb.StartRequest{
|
|
|
|
|
ConfigPath: C.GoString(configPath),
|
|
|
|
|
EnableOldCommandServer: true,
|
|
|
|
|
DisableMemoryLimit: disableMemoryLimit,
|
|
|
|
|
})
|
|
|
|
|
return emptyOrErrorC(err)
|
2023-08-16 15:16:02 +03:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//export stop
|
2023-10-14 17:22:26 +03:30
|
|
|
func stop() (CErr *C.char) {
|
2024-03-09 21:07:15 +01:00
|
|
|
|
2024-03-16 01:39:33 +01:00
|
|
|
_, err := v2.Stop()
|
|
|
|
|
return emptyOrErrorC(err)
|
2023-09-10 20:18:33 +03:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//export restart
|
2023-10-26 15:12:56 +03:30
|
|
|
func restart(configPath *C.char, disableMemoryLimit bool) (CErr *C.char) {
|
2023-10-27 14:36:00 +03:30
|
|
|
|
2024-03-16 01:39:33 +01:00
|
|
|
_, err := v2.Restart(&pb.StartRequest{
|
|
|
|
|
ConfigPath: C.GoString(configPath),
|
|
|
|
|
EnableOldCommandServer: true,
|
|
|
|
|
DisableMemoryLimit: disableMemoryLimit,
|
|
|
|
|
})
|
|
|
|
|
return emptyOrErrorC(err)
|
2023-08-28 13:08:43 +03:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//export startCommandClient
|
|
|
|
|
func startCommandClient(command C.int, port C.longlong) *C.char {
|
2024-03-16 01:39:33 +01:00
|
|
|
err := v2.StartCommand(int32(command), int64(port))
|
|
|
|
|
return emptyOrErrorC(err)
|
2023-08-28 13:08:43 +03:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//export stopCommandClient
|
|
|
|
|
func stopCommandClient(command C.int) *C.char {
|
2024-03-16 01:39:33 +01:00
|
|
|
err := v2.StopCommand(int32(command))
|
|
|
|
|
return emptyOrErrorC(err)
|
2023-08-16 15:16:02 +03:30
|
|
|
}
|
|
|
|
|
|
2023-08-29 19:10:14 +03:30
|
|
|
//export selectOutbound
|
2023-10-14 17:22:26 +03:30
|
|
|
func selectOutbound(groupTag *C.char, outboundTag *C.char) (CErr *C.char) {
|
2024-03-16 01:39:33 +01:00
|
|
|
|
|
|
|
|
_, err := v2.SelectOutbound(&pb.SelectOutboundRequest{
|
|
|
|
|
GroupTag: C.GoString(groupTag),
|
|
|
|
|
OutboundTag: C.GoString(outboundTag),
|
2023-10-14 17:22:26 +03:30
|
|
|
})
|
|
|
|
|
|
2024-03-16 01:39:33 +01:00
|
|
|
return emptyOrErrorC(err)
|
2023-08-29 19:10:14 +03:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//export urlTest
|
2023-10-14 17:22:26 +03:30
|
|
|
func urlTest(groupTag *C.char) (CErr *C.char) {
|
2024-03-16 01:39:33 +01:00
|
|
|
_, err := v2.UrlTest(&pb.UrlTestRequest{
|
|
|
|
|
GroupTag: C.GoString(groupTag),
|
2023-10-14 17:22:26 +03:30
|
|
|
})
|
|
|
|
|
|
2024-03-16 01:39:33 +01:00
|
|
|
return emptyOrErrorC(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func emptyOrErrorC(err error) *C.char {
|
|
|
|
|
if err == nil {
|
|
|
|
|
return C.CString("")
|
2023-08-29 19:10:14 +03:30
|
|
|
}
|
2024-03-16 01:39:33 +01:00
|
|
|
log.Error(err.Error())
|
|
|
|
|
return C.CString(err.Error())
|
2023-08-29 19:10:14 +03:30
|
|
|
}
|
|
|
|
|
|
2024-02-18 12:31:17 +03:30
|
|
|
//export generateWarpConfig
|
|
|
|
|
func generateWarpConfig(licenseKey *C.char, accountId *C.char, accessToken *C.char) (CResp *C.char) {
|
2024-03-16 01:39:33 +01:00
|
|
|
res, err := v2.GenerateWarpConfig(&pb.GenerateWarpConfigRequest{
|
|
|
|
|
LicenseKey: C.GoString(licenseKey),
|
|
|
|
|
AccountId: C.GoString(accountId),
|
|
|
|
|
AccessToken: C.GoString(accessToken),
|
2024-02-18 12:31:17 +03:30
|
|
|
})
|
2024-03-16 01:39:33 +01:00
|
|
|
|
2024-02-18 12:31:17 +03:30
|
|
|
if err != nil {
|
|
|
|
|
return C.CString(fmt.Sprint("error: ", err.Error()))
|
|
|
|
|
}
|
2024-03-16 01:39:33 +01:00
|
|
|
warpAccount := config.WarpAccount{
|
|
|
|
|
AccountID: res.Account.AccountId,
|
|
|
|
|
AccessToken: res.Account.AccessToken,
|
|
|
|
|
}
|
|
|
|
|
warpConfig := config.WarpWireguardConfig{
|
|
|
|
|
PrivateKey: res.Config.PrivateKey,
|
|
|
|
|
LocalAddressIPv4: res.Config.LocalAddressIpv4,
|
|
|
|
|
LocalAddressIPv6: res.Config.LocalAddressIpv6,
|
|
|
|
|
PeerPublicKey: res.Config.PeerPublicKey,
|
|
|
|
|
}
|
|
|
|
|
log := res.Log
|
|
|
|
|
response := &config.WarpGenerationResponse{
|
|
|
|
|
WarpAccount: warpAccount,
|
|
|
|
|
Log: log,
|
|
|
|
|
Config: warpConfig,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
responseJson, err := json.Marshal(response)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return C.CString("")
|
|
|
|
|
}
|
|
|
|
|
return C.CString(string(responseJson))
|
|
|
|
|
|
2024-02-18 12:31:17 +03:30
|
|
|
}
|
|
|
|
|
|
2023-08-16 15:16:02 +03:30
|
|
|
func main() {}
|