mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	handle route updates correctly
Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
This commit is contained in:
		
							parent
							
								
									c957f893bd
								
							
						
					
					
						commit
						096ac31bb3
					
				@ -278,6 +278,12 @@ func (hsdb *HSDatabase) saveMachineRoutes(machine *types.Machine) error {
 | 
			
		||||
		advertisedRoutes[prefix] = false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Trace().
 | 
			
		||||
		Str("machine", machine.Hostname).
 | 
			
		||||
		Interface("advertisedRoutes", advertisedRoutes).
 | 
			
		||||
		Interface("currentRoutes", currentRoutes).
 | 
			
		||||
		Msg("updating routes")
 | 
			
		||||
 | 
			
		||||
	for pos, route := range currentRoutes {
 | 
			
		||||
		if _, ok := advertisedRoutes[netip.Prefix(route.Prefix)]; ok {
 | 
			
		||||
			if !route.Advertised {
 | 
			
		||||
 | 
			
		||||
@ -66,6 +66,9 @@ func (h *Headscale) handlePoll(
 | 
			
		||||
) {
 | 
			
		||||
	logInfo, logErr := logPollFunc(mapRequest, machine, isNoise)
 | 
			
		||||
 | 
			
		||||
	// This is the mechanism where the node gives us inforamtion about its
 | 
			
		||||
	// current configuration.
 | 
			
		||||
	//
 | 
			
		||||
	// If OmitPeers is true, Stream is false, and ReadOnly is false,
 | 
			
		||||
	// then te server will let clients update their endpoints without
 | 
			
		||||
	// breaking existing long-polling (Stream == true) connections.
 | 
			
		||||
@ -84,8 +87,11 @@ func (h *Headscale) handlePoll(
 | 
			
		||||
			Msg("Received endpoint update")
 | 
			
		||||
 | 
			
		||||
		now := time.Now().UTC()
 | 
			
		||||
		machine.Endpoints = mapRequest.Endpoints
 | 
			
		||||
		machine.LastSeen = &now
 | 
			
		||||
		machine.Hostname = mapRequest.Hostinfo.Hostname
 | 
			
		||||
		machine.HostInfo = types.HostInfo(*mapRequest.Hostinfo)
 | 
			
		||||
		machine.DiscoKey = util.DiscoPublicKeyStripPrefix(mapRequest.DiscoKey)
 | 
			
		||||
		machine.Endpoints = mapRequest.Endpoints
 | 
			
		||||
 | 
			
		||||
		if err := h.db.MachineSave(machine); err != nil {
 | 
			
		||||
			logErr(err, "Failed to persist/update machine in the database")
 | 
			
		||||
@ -94,6 +100,14 @@ func (h *Headscale) handlePoll(
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		err := h.db.SaveMachineRoutes(machine)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logErr(err, "Error processing machine routes")
 | 
			
		||||
			http.Error(writer, "", http.StatusInternalServerError)
 | 
			
		||||
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		h.nodeNotifier.NotifyWithIgnore(
 | 
			
		||||
			types.StateUpdate{
 | 
			
		||||
				Type:    types.StatePeerChanged,
 | 
			
		||||
@ -134,6 +148,8 @@ func (h *Headscale) handlePoll(
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	now := time.Now().UTC()
 | 
			
		||||
	machine.LastSeen = &now
 | 
			
		||||
	machine.Hostname = mapRequest.Hostinfo.Hostname
 | 
			
		||||
	machine.HostInfo = types.HostInfo(*mapRequest.Hostinfo)
 | 
			
		||||
	machine.DiscoKey = util.DiscoPublicKeyStripPrefix(mapRequest.DiscoKey)
 | 
			
		||||
 | 
			
		||||
@ -413,14 +413,12 @@ func TestEnablingRoutes(t *testing.T) {
 | 
			
		||||
	// advertise routes using the up command
 | 
			
		||||
	for i, client := range allClients {
 | 
			
		||||
		routeStr := fmt.Sprintf("10.0.%d.0/24", i)
 | 
			
		||||
		hostname, _ := client.FQDN()
 | 
			
		||||
		_, _, err = client.Execute([]string{
 | 
			
		||||
		command := []string{
 | 
			
		||||
			"tailscale",
 | 
			
		||||
			"up",
 | 
			
		||||
			fmt.Sprintf("--advertise-routes=%s", routeStr),
 | 
			
		||||
			"-login-server", headscale.GetEndpoint(),
 | 
			
		||||
			"--hostname", hostname,
 | 
			
		||||
		})
 | 
			
		||||
			"set",
 | 
			
		||||
			"--advertise-routes=" + routeStr,
 | 
			
		||||
		}
 | 
			
		||||
		_, _, err := client.Execute(command)
 | 
			
		||||
		assertNoErrf(t, "failed to advertise route: %s", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -474,6 +472,7 @@ func TestEnablingRoutes(t *testing.T) {
 | 
			
		||||
		&enablingRoutes,
 | 
			
		||||
	)
 | 
			
		||||
	assertNoErr(t, err)
 | 
			
		||||
	assert.Len(t, enablingRoutes, 3)
 | 
			
		||||
 | 
			
		||||
	for _, route := range enablingRoutes {
 | 
			
		||||
		assert.Equal(t, route.Advertised, true)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user