Skip to content

Commit fa56f19

Browse files
committed
chore: add .deb and .rpk packaging
1 parent 8977cc6 commit fa56f19

File tree

4 files changed

+81
-23
lines changed

4 files changed

+81
-23
lines changed

.goreleaser.yaml

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,30 @@ builds:
1717
- "386"
1818
- arm
1919
- arm64
20+
goarm:
21+
- "7"
2022
ignore:
2123
- goos: darwin
2224
goarch: "386"
2325
- goos: windows
2426
goarch: "arm"
2527
binary: "{{ .ProjectName }}_v{{ .Version }}"
28+
nfpms:
29+
- vendor: Coder Technologies Inc.
30+
homepage: https://coder.com/
31+
maintainer: Colin Adler <[email protected]>
32+
description: |-
33+
Wush installer package.
34+
Wush creates secure Wireguard tunnels between two devices.
35+
license: CC0
36+
formats:
37+
- apk
38+
- deb
2639
archives:
2740
- id: "zip"
2841
format: zip
29-
name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
3042
- id: "tarball"
3143
format: tar.gz
32-
name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
3344
checksum:
3445
name_template: "{{ .ProjectName }}_{{ .Version }}_SHA256SUMS"
3546
algorithm: sha256
@@ -40,7 +51,7 @@ signs:
4051
# need to pass the batch flag to indicate its not interactive.
4152
- "--batch"
4253
- "--local-user"
43-
- "{{ .Env.GPG_FINGERPRINT }}" # set this environment variable for your signing key
54+
- "{{ .Env.GPG_FINGERPRINT }}"
4455
- "--output"
4556
- "${signature}"
4657
- "--detach-sign"

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
# wush
1+
# wush - secure shells and file transfers behind nat

cmd/wush/send.go

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,29 +29,42 @@ import (
2929

3030
func sendCmd() *serpent.Command {
3131
var (
32-
waitP2P bool
33-
overlayType string
32+
authID string
33+
waitP2P bool
34+
overlayTransport string
35+
stunAddrOverride string
36+
stunAddrOverrideIP netip.Addr
3437
)
3538
return &serpent.Command{
3639
Use: "send",
3740
Handler: func(inv *serpent.Invocation) error {
3841
ctx := inv.Context()
3942
logger := slog.New(slog.NewTextHandler(io.Discard, nil))
40-
var authID string
41-
err := huh.NewInput().
42-
Title("Enter your Auth ID:").
43-
Value(&authID).
44-
Run()
45-
if err != nil {
46-
return fmt.Errorf("get auth id: %w", err)
43+
44+
if authID == "" {
45+
err := huh.NewInput().
46+
Title("Enter your Auth ID:").
47+
Value(&authID).
48+
Run()
49+
if err != nil {
50+
return fmt.Errorf("get auth id: %w", err)
51+
}
4752
}
4853

4954
dm, err := tsserver.DERPMapTailscale(ctx)
5055
if err != nil {
5156
return err
5257
}
5358

59+
if stunAddrOverride != "" {
60+
stunAddrOverrideIP, err = netip.ParseAddr(stunAddrOverride)
61+
if err != nil {
62+
return fmt.Errorf("parse stun addr override: %w", err)
63+
}
64+
}
65+
5466
send := overlay.NewSendOverlay(logger, dm)
67+
send.STUNIPOverride = stunAddrOverrideIP
5568

5669
err = send.Auth.Parse(authID)
5770
if err != nil {
@@ -77,7 +90,7 @@ func sendCmd() *serpent.Command {
7790
return err
7891
}
7992

80-
switch overlayType {
93+
switch overlayTransport {
8194
case "derp":
8295
if send.Auth.ReceiverDERPRegionID == 0 {
8396
return errors.New("overlay type is \"derp\", but receiver is of type \"stun\"")
@@ -199,9 +212,21 @@ func sendCmd() *serpent.Command {
199212
},
200213
Options: []serpent.Option{
201214
{
202-
Flag: "overlay-type",
203-
Default: "derp",
204-
Value: serpent.EnumOf(&overlayType, "derp", "stun"),
215+
Flag: "auth-id",
216+
Description: "The auth id returned by `wush receive`. If not provided, it will be asked for on startup.",
217+
Default: "",
218+
Value: serpent.StringOf(&authID),
219+
},
220+
{
221+
Flag: "overlay-transport",
222+
Description: "The transport to use on the overlay. The overlay is used to exchange Wireguard nodes between peers. In DERP mode, nodes are exchanged over public Tailscale DERPs, while STUN mode sends nodes directly over UDP.",
223+
Default: "derp",
224+
Value: serpent.EnumOf(&overlayTransport, "derp", "stun"),
225+
},
226+
{
227+
Flag: "stun-ip-override",
228+
Default: "",
229+
Value: serpent.StringOf(&stunAddrOverride),
205230
},
206231
},
207232
}

overlay/send.go

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,9 @@ func NewSendOverlay(logger *slog.Logger, dm *tailcfg.DERPMap) *Send {
2929
}
3030

3131
type Send struct {
32-
Logger *slog.Logger
33-
derpMap *tailcfg.DERPMap
32+
Logger *slog.Logger
33+
STUNIPOverride netip.Addr
34+
derpMap *tailcfg.DERPMap
3435

3536
// _ip is the ip we get from the receiver, which is our ip on the tailnet.
3637
_ip netip.Addr
@@ -74,14 +75,19 @@ func (s *Send) ListenOverlaySTUN(ctx context.Context) error {
7475
panic("marshal node: " + err.Error())
7576
}
7677

77-
addrOverride := netip.AddrPortFrom(netip.AddrFrom4([4]byte{127, 0, 0, 1}), s.Auth.ReceiverStunAddr.Port())
78+
receiverAddr := s.Auth.ReceiverStunAddr
79+
if s.STUNIPOverride.IsValid() {
80+
receiverAddr = netip.AddrPortFrom(s.STUNIPOverride, s.Auth.ReceiverStunAddr.Port())
81+
}
82+
7883
sealed := s.Auth.OverlayPrivateKey.SealTo(s.Auth.ReceiverPublicKey, raw)
79-
// _, err = conn.WriteToUDPAddrPort(sealed, s.Auth.ReceiverStunAddr)
80-
_, err = conn.WriteToUDPAddrPort(sealed, addrOverride)
84+
_, err = conn.WriteToUDPAddrPort(sealed, receiverAddr)
8185
if err != nil {
8286
return fmt.Errorf("send overlay hello over STUN: %w", err)
8387
}
8488

89+
keepAlive := time.NewTicker(30 * time.Second)
90+
8591
go func() {
8692
for {
8793
select {
@@ -98,11 +104,27 @@ func (s *Send) ListenOverlaySTUN(ctx context.Context) error {
98104
}
99105

100106
sealed := s.Auth.OverlayPrivateKey.SealTo(s.Auth.ReceiverPublicKey, raw)
101-
_, err = conn.WriteToUDPAddrPort(sealed, addrOverride)
107+
_, err = conn.WriteToUDPAddrPort(sealed, receiverAddr)
102108
if err != nil {
103109
fmt.Printf("send response over STUN: %s\n", err)
104110
return
105111
}
112+
113+
case <-keepAlive.C:
114+
msg := overlayMessage{
115+
Typ: messageTypePing,
116+
}
117+
raw, err := json.Marshal(msg)
118+
if err != nil {
119+
panic("marshal node: " + err.Error())
120+
}
121+
122+
sealed := s.Auth.OverlayPrivateKey.SealTo(s.Auth.ReceiverPublicKey, raw)
123+
_, err = conn.WriteToUDPAddrPort(sealed, receiverAddr)
124+
if err != nil {
125+
fmt.Printf("send ping message over STUN: %s\n", err)
126+
return
127+
}
106128
}
107129
}
108130
}()

0 commit comments

Comments
 (0)