mirror of
https://github.com/tailscale/tailscale.git
synced 2026-09-22 03:25:16 -04:00
This is the output of the new misc/bumpdeps tool (#21325) run with --exclude-newer-than-days=7, which asks proxy.golang.org for the newest version of every direct dependency, ignoring releases younger than a week in favor of the newest older one, and runs a single go get. gvisor tracks its "go" branch, wireguard-go its "tailscale" branch, and golang-x-crypto its "main" branch (the proxy's @latest for it is a stray v0.91.0 tag from 2024 that predates our acme fork changes). Indirect deps only moved as far as MVS pulled them. The week-long cooldown held back gvisor, the gokrazy modules, chromedp/cdproto, and hashicorp/raft-boltdb/v2, whose only newer versions are days old; they'll come along next time. Several upstream changes needed small fixes: nfpm's PrepareForPackager takes a modification time now (a zero time keeps the old behavior of using the source file's mtime), esbuild's ServeOptions.Port became an int while ServeResult.Host became a Hosts slice, client-go's EventRecorder.Eventf is now recognized by vet as a printf wrapper (so the k8s-operator calls that passed a preformatted message switch to Event), google/nftables v0.3.0 reads back the kernel's NF_NAT_RANGE_PROTO_SPECIFIED flag into a new expr.NAT.Specified field (so the port map DNAT rule now sets it too or findRule never matches the rule it just added), and staticcheck v0.8.1 knows encoding/json/v2's embed tag option, so the two SA5008 suppressions for it are gone. Two tests assumed old library behavior. client-go's fake clientset now replays existing objects when a watch starts, as a real apiserver does, so the k8s-proxy config test must tolerate the loader ignoring that no-op event before the real reload arrives. fyne.io/systray moved its dbusmenu object path and answers the first GetLayout with depth 1, so the systray test now finds the menu via the item's Menu property and polls until the submenu entries appear. Then make tidy, make updatedeps, and make kube-generate-all (the controller-gen bump to v0.22.0 changes doc strings, stops listing top-level metadata as required, and crd-ref-docs now marks optional fields). Updates #8043 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com> Change-Id: I3f9a2c6e8b1d4705a9e2c7b8d1f4e6a0c2b5d8e3
136 lines
4.3 KiB
Go
136 lines
4.3 KiB
Go
// Copyright (c) Tailscale Inc & contributors
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
// mkpkg builds the Tailscale rpm and deb packages.
|
|
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/goreleaser/nfpm/v2"
|
|
_ "github.com/goreleaser/nfpm/v2/deb"
|
|
"github.com/goreleaser/nfpm/v2/files"
|
|
_ "github.com/goreleaser/nfpm/v2/rpm"
|
|
)
|
|
|
|
// parseFiles parses a comma-separated list of colon-separated pairs
|
|
// into files.Contents format.
|
|
func parseFiles(s string, typ string) (files.Contents, error) {
|
|
if len(s) == 0 {
|
|
return nil, nil
|
|
}
|
|
var contents files.Contents
|
|
for f := range strings.SplitSeq(s, ",") {
|
|
fs := strings.Split(f, ":")
|
|
if len(fs) != 2 {
|
|
return nil, fmt.Errorf("unparseable file field %q", f)
|
|
}
|
|
contents = append(contents, &files.Content{Type: files.TypeFile, Source: fs[0], Destination: fs[1]})
|
|
}
|
|
return contents, nil
|
|
}
|
|
|
|
func parseEmptyDirs(s string) files.Contents {
|
|
// strings.Split("", ",") would return []string{""}, which is not suitable:
|
|
// this would create an empty dir record with path "", breaking the package
|
|
if s == "" {
|
|
return nil
|
|
}
|
|
var contents files.Contents
|
|
for d := range strings.SplitSeq(s, ",") {
|
|
contents = append(contents, &files.Content{Type: files.TypeDir, Destination: d})
|
|
}
|
|
return contents
|
|
}
|
|
|
|
func main() {
|
|
out := flag.String("out", "", "output file to write")
|
|
name := flag.String("name", "tailscale", "package name")
|
|
description := flag.String("description", "The easiest, most secure, cross platform way to use WireGuard + oauth2 + 2FA/SSO", "package description")
|
|
goarch := flag.String("arch", "amd64", "GOARCH this package is for")
|
|
pkgType := flag.String("type", "deb", "type of package to build (deb or rpm)")
|
|
regularFiles := flag.String("files", "", "comma-separated list of files in src:dst form")
|
|
configFiles := flag.String("configs", "", "like --files, but for files marked as user-editable config files")
|
|
emptyDirs := flag.String("emptydirs", "", "comma-separated list of empty directories")
|
|
version := flag.String("version", "0.0.0", "version of the package")
|
|
postinst := flag.String("postinst", "", "debian postinst script path")
|
|
prerm := flag.String("prerm", "", "debian prerm script path")
|
|
postrm := flag.String("postrm", "", "debian postrm script path")
|
|
replaces := flag.String("replaces", "", "package which this package replaces, if any")
|
|
depends := flag.String("depends", "", "comma-separated list of packages this package depends on")
|
|
recommends := flag.String("recommends", "", "comma-separated list of packages this package recommends")
|
|
flag.Parse()
|
|
|
|
filesList, err := parseFiles(*regularFiles, files.TypeFile)
|
|
if err != nil {
|
|
log.Fatalf("Parsing --files: %v", err)
|
|
}
|
|
configsList, err := parseFiles(*configFiles, files.TypeConfig)
|
|
if err != nil {
|
|
log.Fatalf("Parsing --configs: %v", err)
|
|
}
|
|
emptyDirList := parseEmptyDirs(*emptyDirs)
|
|
contents := append(filesList, append(configsList, emptyDirList...)...)
|
|
contents, err = files.PrepareForPackager(contents, 0, *pkgType, false, time.Time{})
|
|
if err != nil {
|
|
log.Fatalf("Building package contents: %v", err)
|
|
}
|
|
info := nfpm.WithDefaults(&nfpm.Info{
|
|
Name: *name,
|
|
Arch: *goarch,
|
|
Platform: "linux",
|
|
Version: *version,
|
|
Maintainer: "Tailscale Inc <info@tailscale.com>",
|
|
Description: *description,
|
|
Homepage: "https://www.tailscale.com",
|
|
License: "MIT",
|
|
Overridables: nfpm.Overridables{
|
|
Contents: contents,
|
|
Scripts: nfpm.Scripts{
|
|
PostInstall: *postinst,
|
|
PreRemove: *prerm,
|
|
PostRemove: *postrm,
|
|
},
|
|
},
|
|
})
|
|
|
|
if len(*depends) != 0 {
|
|
info.Overridables.Depends = strings.Split(*depends, ",")
|
|
}
|
|
if len(*recommends) != 0 {
|
|
info.Overridables.Recommends = strings.Split(*recommends, ",")
|
|
}
|
|
if *replaces != "" {
|
|
info.Overridables.Replaces = []string{*replaces}
|
|
info.Overridables.Conflicts = []string{*replaces}
|
|
}
|
|
|
|
switch *pkgType {
|
|
case "deb":
|
|
info.Section = "net"
|
|
info.Priority = "extra"
|
|
case "rpm":
|
|
info.Overridables.RPM.Group = "Network"
|
|
}
|
|
|
|
pkg, err := nfpm.Get(*pkgType)
|
|
if err != nil {
|
|
log.Fatalf("Getting packager for %q: %v", *pkgType, err)
|
|
}
|
|
|
|
f, err := os.Create(*out)
|
|
if err != nil {
|
|
log.Fatalf("Creating output file %q: %v", *out, err)
|
|
}
|
|
defer f.Close()
|
|
|
|
if err := pkg.Package(info, f); err != nil {
|
|
log.Fatalf("Creating package %q: %v", *out, err)
|
|
}
|
|
}
|