From 0a5078a848612441bc3dc96671e7dc985147e528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Mon, 17 Aug 2026 13:11:34 +0800 Subject: [PATCH] Package usbip drivers with the daemon --- cmd/internal/build_boxdd/main.go | 65 +++++++++++++++++++++++++++++++- go.mod | 2 +- go.sum | 4 +- 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/cmd/internal/build_boxdd/main.go b/cmd/internal/build_boxdd/main.go index ed978649..76ac780d 100644 --- a/cmd/internal/build_boxdd/main.go +++ b/cmd/internal/build_boxdd/main.go @@ -9,11 +9,13 @@ import ( "os/exec" "path/filepath" "runtime" + "slices" "strings" "github.com/sagernet/sing-box/cmd/internal/build_shared" "github.com/sagernet/sing-box/common/windivert" "github.com/sagernet/sing-box/log" + "github.com/sagernet/sing-usbip/driverassets" E "github.com/sagernet/sing/common/exceptions" ) @@ -102,6 +104,67 @@ func build() error { if err != nil { return err } + err = stageUSBIPDrivers(architecture, filepath.Dir(absoluteOutputPath)) + if err != nil { + return err + } + } + return nil +} + +func stageUSBIPDrivers(architecture string, outputDirectory string) error { + driverPackages := []struct { + assets map[string]driverassets.Package + assetDir string + }{ + {driverassets.VBoxUSB, filepath.Join("internal", "vboxusb", "assets")}, + {driverassets.VHCI, filepath.Join("internal", "usbipvhci", "assets")}, + } + var moduleDirectory string + for _, driverPackage := range driverPackages { + staged := driverPackage.assets[architecture] + for _, architecturePackage := range driverPackage.assets { + for _, file := range architecturePackage.Files { + if slices.ContainsFunc(staged.Files, func(stagedFile driverassets.File) bool { + return stagedFile.Name == file.Name + }) { + continue + } + err := os.Remove(filepath.Join(outputDirectory, file.Name)) + if err != nil && !os.IsNotExist(err) { + return E.Cause(err, "remove stale ", file.Name) + } + } + } + if len(staged.Files) == 0 { + continue + } + if moduleDirectory == "" { + listOutput, err := exec.Command("go", "list", "-m", "-f", "{{.Dir}}", "github.com/sagernet/sing-usbip").Output() + if err != nil { + return E.Cause(err, "locate sing-usbip module directory") + } + moduleDirectory = strings.TrimSpace(string(listOutput)) + } + for _, file := range staged.Files { + content, err := os.ReadFile(filepath.Join(moduleDirectory, driverPackage.assetDir, architecture, file.Name)) + if err != nil { + return E.Cause(err, "read ", file.Name) + } + checksum := sha256.Sum256(content) + if hex.EncodeToString(checksum[:]) != file.SHA256 { + return E.New(file.Name, " does not match the digest declared in sing-usbip/driverassets") + } + targetPath := filepath.Join(outputDirectory, file.Name) + stagedContent, err := os.ReadFile(targetPath) + if err == nil && bytes.Equal(stagedContent, content) { + continue + } + err = os.WriteFile(targetPath, content, 0o644) + if err != nil { + return E.Cause(err, "write ", file.Name) + } + } } return nil } @@ -164,7 +227,7 @@ func buildTags(operatingSystem string, architecture string, cgoEnabled bool) ([] } tags := strings.Split(strings.TrimSpace(string(content)), ",") if operatingSystem == "windows" { - tags = append(tags, "with_external_windivert") + tags = append(tags, "with_external_windivert", "with_external_usbip_drivers") } if debugEnabled { tags = append(tags, "debug") diff --git a/go.mod b/go.mod index 53c64618..9818b460 100644 --- a/go.mod +++ b/go.mod @@ -56,7 +56,7 @@ require ( github.com/sagernet/sing-shadowtls v0.2.1 github.com/sagernet/sing-snell v0.0.0-20260727093646-7cb813e07b73 github.com/sagernet/sing-tun v0.9.0-beta.4 - github.com/sagernet/sing-usbip v0.0.0-20260813125128-908a3a2fa917 + github.com/sagernet/sing-usbip v0.0.0-20260817040617-28bd42667eca github.com/sagernet/sing-vmess v0.2.8-0.20250909125414-3aed155119a1 github.com/sagernet/smux v1.5.50-sing-box-mod.1 github.com/sagernet/tailscale v1.102.1-sing-box-1.14-mod.3 diff --git a/go.sum b/go.sum index 53326a4c..551d710b 100644 --- a/go.sum +++ b/go.sum @@ -342,8 +342,8 @@ github.com/sagernet/sing-snell v0.0.0-20260727093646-7cb813e07b73 h1:Iyhoka9XutV github.com/sagernet/sing-snell v0.0.0-20260727093646-7cb813e07b73/go.mod h1:et8Lws4f5QbOrY65DmjevHGup3mijJkhswkto6cwciM= github.com/sagernet/sing-tun v0.9.0-beta.4 h1:gIIZU4HevhtTQubZiOdMD0/RnECD6csl2kG6666KYmQ= github.com/sagernet/sing-tun v0.9.0-beta.4/go.mod h1:3EgPst7agntRO7D6GOsiZ1l9FoqdLeuWmKT5TnWkmf0= -github.com/sagernet/sing-usbip v0.0.0-20260813125128-908a3a2fa917 h1:aTUWExMVkwFCQFTo+uFD7JCO5m7J0xGqymr94/t3eJs= -github.com/sagernet/sing-usbip v0.0.0-20260813125128-908a3a2fa917/go.mod h1:D4CnJX3MNAAANhbQUxfIRgBdnvlTEaV7h6ojedcs+pw= +github.com/sagernet/sing-usbip v0.0.0-20260817040617-28bd42667eca h1:5wA+IE0Fq1CGVLOgSpm0gKKZ03HzugcJ2JyhmDqeX6A= +github.com/sagernet/sing-usbip v0.0.0-20260817040617-28bd42667eca/go.mod h1:ADAZZU85MnM91XNhd2TdZRTaIbA7RjTZuQ1KCHcUbNg= github.com/sagernet/sing-vmess v0.2.8-0.20250909125414-3aed155119a1 h1:aSwUNYUkVyVvdmBSufR8/nRFonwJeKSIROxHcm5br9o= github.com/sagernet/sing-vmess v0.2.8-0.20250909125414-3aed155119a1/go.mod h1:P11scgTxMxVVQ8dlM27yNm3Cro40mD0+gHbnqrNGDuY= github.com/sagernet/smux v1.5.50-sing-box-mod.1 h1:XkJcivBC9V4wBjiGXIXZ229aZCU1hzcbp6kSkkyQ478=