tools/make_supabase_api_url.go

84 lines
1.7 KiB
Go

package main
import (
"bytes"
"fmt"
"net"
"os/exec"
"strings"
)
func getSupabaseURL() string {
// 获取默认网关 IP
gatewayIP, err := getDefaultGateway()
if err != nil {
fmt.Println("⚠️ 获取默认网关失败,使用 fallback:", err)
return "http://localhost:8000"
}
// 获取所有本地网卡 IP 和子网
ifaces, err := net.Interfaces()
if err != nil {
fmt.Println("⚠️ 获取本地接口失败:", err)
return "http://localhost:8000"
}
for _, iface := range ifaces {
if (iface.Flags&net.FlagUp == 0) || (iface.Flags&net.FlagLoopback != 0) {
continue // 跳过不活跃或loopback接口
}
addrs, err := iface.Addrs()
if err != nil {
continue
}
for _, addr := range addrs {
ipNet, ok := addr.(*net.IPNet)
if !ok || ipNet.IP.To4() == nil {
continue
}
// 检查网关是否在这个接口的子网中
if ipNet.Contains(gatewayIP) {
// 找到同网段的IP
return fmt.Sprintf("http://%s:8000", ipNet.IP.String())
}
}
}
// 如果没有匹配的网段,使用 fallback
return "http://localhost:8000"
}
func getDefaultGateway() (net.IP, error) {
// 调用 Linux 命令获取默认路由
cmd := exec.Command("ip", "route", "show", "default")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
return nil, err
}
lines := strings.Split(out.String(), "\n")
for _, line := range lines {
if strings.HasPrefix(line, "default") {
fields := strings.Fields(line)
for i, f := range fields {
if f == "via" && i+1 < len(fields) {
return net.ParseIP(fields[i+1]), nil
}
}
}
}
return nil, fmt.Errorf("default gateway not found")
}
func main() {
supabaseURL := getSupabaseURL()
fmt.Printf("\"SUPABASE_URL\": \"%s\"\n", supabaseURL)
}