84 lines
1.7 KiB
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)
|
|
}
|
|
|