mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-31 21:17:43 +09:00 
			
		
		
		
	handle route updates correctly
Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
This commit is contained in:
		
				
					committed by
					
						 Kristoffer Dalby
						Kristoffer Dalby
					
				
			
			
				
	
			
			
			
						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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user