@@ -25,7 +25,6 @@ func sshCmd() *serpent.Command {
25
25
var (
26
26
authID string
27
27
waitP2P bool
28
- overlayTransport string
29
28
stunAddrOverride string
30
29
stunAddrOverrideIP netip.Addr
31
30
sshStdio bool
@@ -37,6 +36,12 @@ func sshCmd() *serpent.Command {
37
36
Handler : func (inv * serpent.Invocation ) error {
38
37
ctx := inv .Context ()
39
38
logger := slog .New (slog .NewTextHandler (io .Discard , nil ))
39
+ logF := func (str string , args ... any ) {
40
+ if sshStdio {
41
+ return
42
+ }
43
+ fmt .Fprintf (inv .Stderr , str , args ... )
44
+ }
40
45
if authID == "" {
41
46
err := huh .NewInput ().
42
47
Title ("Enter the receiver's Auth ID:" ).
@@ -67,38 +72,31 @@ func sshCmd() *serpent.Command {
67
72
return fmt .Errorf ("parse auth key: %w" , err )
68
73
}
69
74
70
- if ! sshStdio {
71
- fmt .Println ("Auth information:" )
72
- stunStr := send .Auth .ReceiverStunAddr .String ()
73
- if ! send .Auth .ReceiverStunAddr .IsValid () {
74
- stunStr = "Disabled"
75
- }
76
- fmt .Println ("\t > Server overlay STUN address:" , cliui .Code (stunStr ))
77
- derpStr := "Disabled"
78
- if send .Auth .ReceiverDERPRegionID > 0 {
79
- derpStr = dm .Regions [int (send .Auth .ReceiverDERPRegionID )].RegionName
80
- }
81
- fmt .Println ("\t > Server overlay DERP home: " , cliui .Code (derpStr ))
82
- fmt .Println ("\t > Server overlay public key: " , cliui .Code (send .Auth .ReceiverPublicKey .ShortString ()))
83
- fmt .Println ("\t > Server overlay auth key: " , cliui .Code (send .Auth .OverlayPrivateKey .Public ().ShortString ()))
75
+ logF ("Auth information:" )
76
+ stunStr := send .Auth .ReceiverStunAddr .String ()
77
+ if ! send .Auth .ReceiverStunAddr .IsValid () {
78
+ stunStr = "Disabled"
84
79
}
80
+ logF ("\t > Server overlay STUN address: %s" , cliui .Code (stunStr ))
81
+ derpStr := "Disabled"
82
+ if send .Auth .ReceiverDERPRegionID > 0 {
83
+ derpStr = dm .Regions [int (send .Auth .ReceiverDERPRegionID )].RegionName
84
+ }
85
+ logF ("\t > Server overlay DERP home: %s" , cliui .Code (derpStr ))
86
+ logF ("\t > Server overlay public key: %s" , cliui .Code (send .Auth .ReceiverPublicKey .ShortString ()))
87
+ logF ("\t > Server overlay auth key: %s" , cliui .Code (send .Auth .OverlayPrivateKey .Public ().ShortString ()))
85
88
86
89
s , err := tsserver .NewServer (ctx , logger , send )
87
90
if err != nil {
88
91
return err
89
92
}
90
93
91
- switch overlayTransport {
92
- case "derp" :
93
- if send .Auth .ReceiverDERPRegionID == 0 {
94
- return errors .New ("overlay type is \" derp\" , but receiver is of type \" stun\" " )
95
- }
94
+ if send .Auth .ReceiverDERPRegionID != 0 {
96
95
go send .ListenOverlayDERP (ctx )
97
- case "stun" :
98
- if ! send .Auth .ReceiverStunAddr .IsValid () {
99
- return errors .New ("overlay type is \" stun\" , but receiver is of type \" derp\" " )
100
- }
96
+ } else if send .Auth .ReceiverStunAddr .IsValid () {
101
97
go send .ListenOverlaySTUN (ctx )
98
+ } else {
99
+ return errors .New ("auth key provided neither DERP nor STUN" )
102
100
}
103
101
104
102
go s .ListenAndServe (ctx )
@@ -110,22 +108,22 @@ func sshCmd() *serpent.Command {
110
108
ts .Logf = func (string , ... any ) {}
111
109
ts .UserLogf = func (string , ... any ) {}
112
110
113
- // fmt.Println ("Bringing Wireguard up..")
111
+ logF ("Bringing Wireguard up.." )
114
112
ts .Up (ctx )
115
- // fmt.Println ("Wireguard is ready!")
113
+ logF ("Wireguard is ready!" )
116
114
117
115
lc , err := ts .LocalClient ()
118
116
if err != nil {
119
117
return err
120
118
}
121
119
122
- ip , err := waitUntilHasPeerHasIP (ctx , lc )
120
+ ip , err := waitUntilHasPeerHasIP (ctx , logF , lc )
123
121
if err != nil {
124
122
return err
125
123
}
126
124
127
125
if waitP2P {
128
- err := waitUntilHasP2P (ctx , lc )
126
+ err := waitUntilHasP2P (ctx , logF , lc )
129
127
if err != nil {
130
128
return err
131
129
}
@@ -141,12 +139,6 @@ func sshCmd() *serpent.Command {
141
139
Default : "" ,
142
140
Value : serpent .StringOf (& authID ),
143
141
},
144
- {
145
- Flag : "overlay-transport" ,
146
- 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." ,
147
- Default : "derp" ,
148
- Value : serpent .EnumOf (& overlayTransport , "derp" , "stun" ),
149
- },
150
142
{
151
143
Flag : "stun-ip-override" ,
152
144
Default : "" ,
@@ -158,11 +150,17 @@ func sshCmd() *serpent.Command {
158
150
Default : "false" ,
159
151
Value : serpent .BoolOf (& sshStdio ),
160
152
},
153
+ {
154
+ Flag : "wait-p2p" ,
155
+ Description : "Waits for the connection to be p2p." ,
156
+ Default : "false" ,
157
+ Value : serpent .BoolOf (& sshStdio ),
158
+ },
161
159
},
162
160
}
163
161
}
164
162
165
- func waitUntilHasPeerHasIP (ctx context.Context , lc * tailscale.LocalClient ) (netip.Addr , error ) {
163
+ func waitUntilHasPeerHasIP (ctx context.Context , logF func ( str string , args ... any ), lc * tailscale.LocalClient ) (netip.Addr , error ) {
166
164
for {
167
165
select {
168
166
case <- ctx .Done ():
@@ -178,35 +176,35 @@ func waitUntilHasPeerHasIP(ctx context.Context, lc *tailscale.LocalClient) (neti
178
176
179
177
peers := stat .Peers ()
180
178
if len (peers ) == 0 {
181
- // fmt.Println ("No peer yet")
179
+ logF ("No peer yet" )
182
180
continue
183
181
}
184
182
185
- // fmt.Println ("Received peer")
183
+ logF ("Received peer" )
186
184
187
185
peer , ok := stat .Peer [peers [0 ]]
188
186
if ! ok {
189
- fmt . Println ("have peers but not found in map (developer error)" )
187
+ logF ("have peers but not found in map (developer error)" )
190
188
continue
191
189
}
192
190
193
191
if peer .Relay == "" {
194
- fmt . Println ("peer no relay" )
192
+ logF ("peer no relay" )
195
193
continue
196
194
}
197
195
198
- // fmt.Println ("Peer active with relay", cliui.Code(peer.Relay))
196
+ logF ("Peer active with relay %s " , cliui .Code (peer .Relay ))
199
197
200
198
if len (peer .TailscaleIPs ) == 0 {
201
- fmt . Println ("peer has no ips (developer error)" )
199
+ logF ("peer has no ips (developer error)" )
202
200
continue
203
201
}
204
202
205
203
return peer .TailscaleIPs [0 ], nil
206
204
}
207
205
}
208
206
209
- func waitUntilHasP2P (ctx context.Context , lc * tailscale.LocalClient ) error {
207
+ func waitUntilHasP2P (ctx context.Context , logF func ( str string , args ... any ), lc * tailscale.LocalClient ) error {
210
208
for {
211
209
select {
212
210
case <- ctx .Done ():
@@ -216,43 +214,41 @@ func waitUntilHasP2P(ctx context.Context, lc *tailscale.LocalClient) error {
216
214
217
215
stat , err := lc .Status (ctx )
218
216
if err != nil {
219
- fmt . Println ("error getting lc status:" , err )
217
+ logF ("error getting lc status: %s " , err )
220
218
continue
221
219
}
222
220
223
221
peers := stat .Peers ()
224
222
peer , ok := stat .Peer [peers [0 ]]
225
223
if ! ok {
226
- fmt . Println ("no peer found in map while waiting p2p (developer error)" )
224
+ logF ("no peer found in map while waiting p2p (developer error)" )
227
225
continue
228
226
}
229
227
230
228
if peer .Relay == "" {
231
- fmt . Println ("peer no relay" )
229
+ logF ("peer no relay" )
232
230
continue
233
231
}
234
232
235
- // fmt.Println("Peer active with relay", cliui.Code(peer.Relay))
236
-
237
233
if len (peer .TailscaleIPs ) == 0 {
238
- fmt . Println ("peer has no ips (developer error)" )
234
+ logF ("peer has no ips (developer error)" )
239
235
continue
240
236
}
241
237
242
238
pingCancel , cancel := context .WithTimeout (ctx , time .Second )
243
239
pong , err := lc .Ping (pingCancel , peer .TailscaleIPs [0 ], tailcfg .PingDisco )
244
240
cancel ()
245
241
if err != nil {
246
- fmt . Println ("ping failed:" , err )
242
+ logF ("ping failed: %s " , err )
247
243
continue
248
244
}
249
245
250
246
if pong .Endpoint == "" {
251
- fmt . Println ( "not p2p yet" )
247
+ logF ( "Not p2p yet" )
252
248
continue
253
249
}
254
250
255
- // fmt.Println ("Peer active over p2p", cliui.Code(pong.Endpoint))
251
+ logF ("Peer active over p2p %s " , cliui .Code (pong .Endpoint ))
256
252
return nil
257
253
}
258
254
}
0 commit comments