diff --git a/release/dist/synology/pkgs.go b/release/dist/synology/pkgs.go index a079b980e..d6df06d96 100644 --- a/release/dist/synology/pkgs.go +++ b/release/dist/synology/pkgs.go @@ -9,6 +9,7 @@ import ( "bytes" "compress/gzip" "embed" + "errors" "fmt" "io" "io/fs" @@ -42,7 +43,8 @@ func (t *target) Build(b *dist.Build) ([]string, error) { } func (t *target) buildSPK(b *dist.Build, inner *innerPkg) ([]string, error) { - filename := fmt.Sprintf("tailscale-%s-%s-%d-dsm%d.spk", t.filenameArch, b.Version.Short, b.Version.Synology[t.dsmMajorVersion], t.dsmMajorVersion) + synoVersion := b.Version.Synology[t.dsmMajorVersion] + filename := fmt.Sprintf("tailscale-%s-%s-%d-dsm%d.spk", t.filenameArch, b.Version.Short, synoVersion, t.dsmMajorVersion) out := filepath.Join(b.Out, filename) if t.packageCenter { log.Printf("Building %s (for package center)", filename) @@ -50,6 +52,14 @@ func (t *target) buildSPK(b *dist.Build, inner *innerPkg) ([]string, error) { log.Printf("Building %s (for sideloading)", filename) } + if synoVersion > 2147483647 { + // Synology requires that version number is within int32 range. + // Erroring here if we create a build with a higher version. + // In this case, we'll want to adjust the VersionInfo.Synology logic in + // the mkversion package. + return nil, errors.New("syno version exceeds int32 range") + } + privFile := fmt.Sprintf("privilege-dsm%d", t.dsmMajorVersion) if t.packageCenter && t.dsmMajorVersion == 7 { privFile += ".for-package-center" diff --git a/version/mkversion/mkversion.go b/version/mkversion/mkversion.go index c09473256..49f97be53 100644 --- a/version/mkversion/mkversion.go +++ b/version/mkversion/mkversion.go @@ -251,8 +251,13 @@ func mkOutput(v verInfo) (VersionInfo, error) { GitDate: fmt.Sprintf("%s", v.date), Track: track, Synology: map[int]int64{ - 6: 6*1_000_000_000 + int64(v.major-1)*1_000_000 + int64(v.minor)*1_000 + int64(v.patch), - 7: 7*1_000_000_000 + int64(v.major-1)*1_000_000 + int64(v.minor)*1_000 + int64(v.patch), + // Synology requires that version numbers be in a specific format. + // Builds with version numbers that don't start with "60" or "70" will fail, + // and the full version number must be within int32 range. + // So, we do the following mapping from our Tailscale version to Synology version, + // giving major version three decimal places, minor version three, and patch two. + 6: 6*100_000_000 + int64(v.major-1)*1_000_000 + int64(v.minor)*1_000 + int64(v.patch), + 7: 7*100_000_000 + int64(v.major-1)*1_000_000 + int64(v.minor)*1_000 + int64(v.patch), }, }