From 2eb57e6288afb9925e81bf29d0f4acf45968ef32 Mon Sep 17 00:00:00 2001 From: Kristoffer Dalby Date: Mon, 4 Oct 2021 17:39:01 +0000 Subject: [PATCH] Clean up pointer usage consistency. This tries to make the same functions emit and consume the same type of data all over the application. If a function transform data, it should emit new data, not a pointer. --- api.go | 9 +++++---- machine.go | 41 ++++++++++++++++++++++------------------- poll.go | 10 +++++----- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/api.go b/api.go index 9cdf7100..17306b32 100644 --- a/api.go +++ b/api.go @@ -220,7 +220,7 @@ func (h *Headscale) RegistrationHandler(c *gin.Context) { c.Data(200, "application/json; charset=utf-8", respBody) } -func (h *Headscale) getMapResponse(mKey wgkey.Key, req tailcfg.MapRequest, m *Machine) (*[]byte, error) { +func (h *Headscale) getMapResponse(mKey wgkey.Key, req tailcfg.MapRequest, m *Machine) ([]byte, error) { log.Trace(). Str("func", "getMapResponse"). Str("machine", req.Hostinfo.Hostname). @@ -277,6 +277,7 @@ func (h *Headscale) getMapResponse(mKey wgkey.Key, req tailcfg.MapRequest, m *Ma log.Trace(). Str("func", "getMapResponse"). Str("machine", req.Hostinfo.Hostname). + Interface("payload", resp). Msgf("Generated map response: %s", tailMapResponseToString(resp)) var respBody []byte @@ -299,10 +300,10 @@ func (h *Headscale) getMapResponse(mKey wgkey.Key, req tailcfg.MapRequest, m *Ma data := make([]byte, 4) binary.LittleEndian.PutUint32(data, uint32(len(respBody))) data = append(data, respBody...) - return &data, nil + return data, nil } -func (h *Headscale) getMapKeepAliveResponse(mKey wgkey.Key, req tailcfg.MapRequest, m *Machine) (*[]byte, error) { +func (h *Headscale) getMapKeepAliveResponse(mKey wgkey.Key, req tailcfg.MapRequest, m *Machine) ([]byte, error) { resp := tailcfg.MapResponse{ KeepAlive: true, } @@ -325,7 +326,7 @@ func (h *Headscale) getMapKeepAliveResponse(mKey wgkey.Key, req tailcfg.MapReque data := make([]byte, 4) binary.LittleEndian.PutUint32(data, uint32(len(respBody))) data = append(data, respBody...) - return &data, nil + return data, nil } func (h *Headscale) handleAuthKey(c *gin.Context, db *gorm.DB, idKey wgkey.Key, req tailcfg.RegisterRequest, m Machine) { diff --git a/machine.go b/machine.go index cd2d124a..7a9df2e8 100644 --- a/machine.go +++ b/machine.go @@ -56,34 +56,29 @@ func (m Machine) isAlreadyRegistered() bool { return m.Registered } -func (h *Headscale) getDirectPeers(m *Machine) (MachinesP, error) { +func (h *Headscale) getDirectPeers(m *Machine) (Machines, error) { log.Trace(). Str("func", "getDirectPeers"). Str("machine", m.Name). - Msg("Finding peers") + Msg("Finding direct peers") - machines := []Machine{} + machines := Machines{} if err := h.db.Where("namespace_id = ? AND machine_key <> ? AND registered", m.NamespaceID, m.MachineKey).Find(&machines).Error; err != nil { log.Error().Err(err).Msg("Error accessing db") return nil, err } - peers := make(MachinesP, 0) - for _, peer := range machines { - peers = append(peers, &peer) - } - - sort.Slice(peers, func(i, j int) bool { return peers[i].ID < peers[j].ID }) + sort.Slice(machines, func(i, j int) bool { return machines[i].ID < machines[j].ID }) log.Trace(). - Str("func", "getDirectPeers"). + Str("func", "getDirectmachines"). Str("machine", m.Name). - Msgf("Found peers: %s", peers.String()) - return peers, nil + Msgf("Found direct machines: %s", machines.String()) + return machines, nil } -func (h *Headscale) getShared(m *Machine) (MachinesP, error) { +func (h *Headscale) getShared(m *Machine) (Machines, error) { log.Trace(). Str("func", "getShared"). Str("machine", m.Name). @@ -96,9 +91,9 @@ func (h *Headscale) getShared(m *Machine) (MachinesP, error) { return nil, err } - peers := make(MachinesP, 0) + peers := make(Machines, 0) for _, sharedMachine := range sharedMachines { - peers = append(peers, &sharedMachine.Machine) + peers = append(peers, sharedMachine.Machine) } sort.Slice(peers, func(i, j int) bool { return peers[i].ID < peers[j].ID }) @@ -110,7 +105,7 @@ func (h *Headscale) getShared(m *Machine) (MachinesP, error) { return peers, nil } -func (h *Headscale) getPeers(m *Machine) (MachinesP, error) { +func (h *Headscale) getPeers(m *Machine) (Machines, error) { direct, err := h.getDirectPeers(m) if err != nil { log.Error(). @@ -129,7 +124,15 @@ func (h *Headscale) getPeers(m *Machine) (MachinesP, error) { return nil, err } - return append(direct, shared...), nil + peers := append(direct, shared...) + sort.Slice(peers, func(i, j int) bool { return peers[i].ID < peers[j].ID }) + + log.Trace(). + Str("func", "getShared"). + Str("machine", m.Name). + Msgf("Found total peers: %s", peers.String()) + + return peers, nil } // GetMachine finds a Machine by name and namespace and returns the Machine struct @@ -227,7 +230,7 @@ func (h *Headscale) notifyChangesToPeers(m *Machine) { Str("peer", peer.Name). Str("address", peer.IPAddress). Msgf("Notifying peer %s (%s)", peer.Name, peer.IPAddress) - err := h.sendRequestOnUpdateChannel(peer) + err := h.sendRequestOnUpdateChannel(&peer) if err != nil { log.Info(). Str("func", "notifyChangesToPeers"). @@ -357,7 +360,7 @@ func (ms MachinesP) String() string { return fmt.Sprintf("[ %s ](%d)", strings.Join(temp, ", "), len(temp)) } -func (ms MachinesP) toNodes(includeRoutes bool) ([]*tailcfg.Node, error) { +func (ms Machines) toNodes(includeRoutes bool) ([]*tailcfg.Node, error) { nodes := make([]*tailcfg.Node, len(ms)) for index, machine := range ms { diff --git a/poll.go b/poll.go index 46e6cf8f..a33d341b 100644 --- a/poll.go +++ b/poll.go @@ -123,7 +123,7 @@ func (h *Headscale) PollNetMapHandler(c *gin.Context) { Str("handler", "PollNetMap"). Str("machine", m.Name). Msg("Client is starting up. Probably interested in a DERP map") - c.Data(200, "application/json; charset=utf-8", *data) + c.Data(200, "application/json; charset=utf-8", data) return } @@ -155,7 +155,7 @@ func (h *Headscale) PollNetMapHandler(c *gin.Context) { Str("handler", "PollNetMap"). Str("machine", m.Name). Msg("Client sent endpoint update and is ok with a response without peer list") - c.Data(200, "application/json; charset=utf-8", *data) + c.Data(200, "application/json; charset=utf-8", data) // It sounds like we should update the nodes when we have received a endpoint update // even tho the comments in the tailscale code dont explicitly say so. @@ -179,7 +179,7 @@ func (h *Headscale) PollNetMapHandler(c *gin.Context) { Str("handler", "PollNetMap"). Str("machine", m.Name). Msg("Sending initial map") - go func() { pollDataChan <- *data }() + go func() { pollDataChan <- data }() log.Info(). Str("handler", "PollNetMap"). @@ -342,7 +342,7 @@ func (h *Headscale) PollNetMapStream( Err(err). Msg("Could not get the map update") } - _, err = w.Write(*data) + _, err = w.Write(data) if err != nil { log.Error(). Str("handler", "PollNetMapStream"). @@ -473,7 +473,7 @@ func (h *Headscale) scheduledPollWorker( Str("func", "keepAlive"). Str("machine", m.Name). Msg("Sending keepalive") - keepAliveChan <- *data + keepAliveChan <- data case <-updateCheckerTicker.C: // Send an update request regardless of outdated or not, if data is sent