Skip to content

Commit 8e25f7f

Browse files
authored
bunch of qol (#2748)
1 parent 1a7a2f4 commit 8e25f7f

File tree

11 files changed

+307
-95
lines changed

11 files changed

+307
-95
lines changed

Dockerfile.tailscale-HEAD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# This Dockerfile is more or less lifted from tailscale/tailscale
55
# to ensure a similar build process when testing the HEAD of tailscale.
66

7-
FROM golang:1.24-alpine AS build-env
7+
FROM golang:1.25-alpine AS build-env
88

99
WORKDIR /go/src
1010

cmd/hi/tar_utils.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func extractDirectoryFromTar(tarReader io.Reader, targetDir string) error {
6868
continue // Skip potentially dangerous paths
6969
}
7070

71-
targetPath := filepath.Join(targetDir, filepath.Base(cleanName))
71+
targetPath := filepath.Join(targetDir, cleanName)
7272

7373
switch header.Typeflag {
7474
case tar.TypeDir:
@@ -77,6 +77,11 @@ func extractDirectoryFromTar(tarReader io.Reader, targetDir string) error {
7777
return fmt.Errorf("failed to create directory %s: %w", targetPath, err)
7878
}
7979
case tar.TypeReg:
80+
// Ensure parent directories exist
81+
if err := os.MkdirAll(filepath.Dir(targetPath), 0o755); err != nil {
82+
return fmt.Errorf("failed to create parent directories for %s: %w", targetPath, err)
83+
}
84+
8085
// Create file
8186
outFile, err := os.Create(targetPath)
8287
if err != nil {

hscontrol/debug.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,29 @@ func (h *Headscale) debugHTTPServer() *http.Server {
121121
w.Write([]byte(h.state.PolicyDebugString()))
122122
}))
123123

124+
debug.Handle("mapresponses", "Map responses for all nodes", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
125+
res, err := h.mapBatcher.DebugMapResponses()
126+
if err != nil {
127+
httpError(w, err)
128+
return
129+
}
130+
131+
if res == nil {
132+
w.WriteHeader(http.StatusOK)
133+
w.Write([]byte("HEADSCALE_DEBUG_DUMP_MAPRESPONSE_PATH not set"))
134+
return
135+
}
136+
137+
resJSON, err := json.MarshalIndent(res, "", " ")
138+
if err != nil {
139+
httpError(w, err)
140+
return
141+
}
142+
w.Header().Set("Content-Type", "application/json")
143+
w.WriteHeader(http.StatusOK)
144+
w.Write(resJSON)
145+
}))
146+
124147
err := statsviz.Register(debugMux)
125148
if err == nil {
126149
debug.URL("/debug/statsviz", "Statsviz (visualise go metrics)")

hscontrol/mapper/batcher.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ type Batcher interface {
2424
ConnectedMap() *xsync.Map[types.NodeID, bool]
2525
AddWork(c change.ChangeSet)
2626
MapResponseFromChange(id types.NodeID, c change.ChangeSet) (*tailcfg.MapResponse, error)
27+
DebugMapResponses() (map[types.NodeID][]tailcfg.MapResponse, error)
2728
}
2829

2930
func NewBatcher(batchTime time.Duration, workers int, mapper *mapper) *LockFreeBatcher {

hscontrol/mapper/batcher_lockfree.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,3 +489,7 @@ func (nc *nodeConn) send(data *tailcfg.MapResponse) error {
489489
nc.updateCount.Add(1)
490490
return nil
491491
}
492+
493+
func (b *LockFreeBatcher) DebugMapResponses() (map[types.NodeID][]tailcfg.MapResponse, error) {
494+
return b.mapper.debugMapResponses()
495+
}

hscontrol/mapper/builder.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,6 @@ func (b *MapResponseBuilder) WithPeerChangedPatch(changes []*tailcfg.PeerChange)
237237

238238
// WithPeersRemoved adds removed peer IDs
239239
func (b *MapResponseBuilder) WithPeersRemoved(removedIDs ...types.NodeID) *MapResponseBuilder {
240-
241240
var tailscaleIDs []tailcfg.NodeID
242241
for _, id := range removedIDs {
243242
tailscaleIDs = append(tailscaleIDs, id.NodeID())
@@ -247,12 +246,16 @@ func (b *MapResponseBuilder) WithPeersRemoved(removedIDs ...types.NodeID) *MapRe
247246
}
248247

249248
// Build finalizes the response and returns marshaled bytes
250-
func (b *MapResponseBuilder) Build(messages ...string) (*tailcfg.MapResponse, error) {
249+
func (b *MapResponseBuilder) Build() (*tailcfg.MapResponse, error) {
251250
if len(b.errs) > 0 {
252251
return nil, multierr.New(b.errs...)
253252
}
254253
if debugDumpMapResponsePath != "" {
255-
writeDebugMapResponse(b.resp, b.nodeID)
254+
node, err := b.mapper.state.GetNodeByID(b.nodeID)
255+
if err != nil {
256+
return nil, err
257+
}
258+
writeDebugMapResponse(b.resp, node)
256259
}
257260

258261
return b.resp, nil

0 commit comments

Comments
 (0)