mirror of
https://github.com/juanfont/headscale.git
synced 2024-12-01 19:23:05 +00:00
Disable and Delete route must affect both exit routes (IPv4 and IPv6)
Fixed linting
This commit is contained in:
parent
7338775de7
commit
02ab0df2de
2 changed files with 81 additions and 4 deletions
46
routes.go
46
routes.go
|
@ -106,6 +106,10 @@ func (h *Headscale) DisableRoute(id uint64) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tailscale requires both IPv4 and IPv6 exit routes to
|
||||||
|
// be enabled at the same time, as per
|
||||||
|
// https://github.com/juanfont/headscale/issues/804#issuecomment-1399314002
|
||||||
|
if !route.isExitRoute() {
|
||||||
route.Enabled = false
|
route.Enabled = false
|
||||||
route.IsPrimary = false
|
route.IsPrimary = false
|
||||||
err = h.db.Save(route).Error
|
err = h.db.Save(route).Error
|
||||||
|
@ -113,6 +117,25 @@ func (h *Headscale) DisableRoute(id uint64) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return h.handlePrimarySubnetFailover()
|
||||||
|
}
|
||||||
|
|
||||||
|
routes, err := h.GetMachineRoutes(&route.Machine)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := range routes {
|
||||||
|
if routes[i].isExitRoute() {
|
||||||
|
routes[i].Enabled = false
|
||||||
|
routes[i].IsPrimary = false
|
||||||
|
err = h.db.Save(&routes[i]).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return h.handlePrimarySubnetFailover()
|
return h.handlePrimarySubnetFailover()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,10 +145,33 @@ func (h *Headscale) DeleteRoute(id uint64) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tailscale requires both IPv4 and IPv6 exit routes to
|
||||||
|
// be enabled at the same time, as per
|
||||||
|
// https://github.com/juanfont/headscale/issues/804#issuecomment-1399314002
|
||||||
|
if !route.isExitRoute() {
|
||||||
if err := h.db.Unscoped().Delete(&route).Error; err != nil {
|
if err := h.db.Unscoped().Delete(&route).Error; err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return h.handlePrimarySubnetFailover()
|
||||||
|
}
|
||||||
|
|
||||||
|
routes, err := h.GetMachineRoutes(&route.Machine)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
routesToDelete := []Route{}
|
||||||
|
for _, r := range routes {
|
||||||
|
if r.isExitRoute() {
|
||||||
|
routesToDelete = append(routesToDelete, r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := h.db.Unscoped().Delete(&routesToDelete).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return h.handlePrimarySubnetFailover()
|
return h.handlePrimarySubnetFailover()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -457,6 +457,37 @@ func (s *Suite) TestAllowedIPRoutes(c *check.C) {
|
||||||
|
|
||||||
c.Assert(foundExitNodeV4, check.Equals, true)
|
c.Assert(foundExitNodeV4, check.Equals, true)
|
||||||
c.Assert(foundExitNodeV6, check.Equals, true)
|
c.Assert(foundExitNodeV6, check.Equals, true)
|
||||||
|
|
||||||
|
// Now we disable only one of the exit routes
|
||||||
|
// and we see if both are disabled
|
||||||
|
var exitRouteV4 Route
|
||||||
|
for _, route := range routes {
|
||||||
|
if route.isExitRoute() && netip.Prefix(route.Prefix) == prefixExitNodeV4 {
|
||||||
|
exitRouteV4 = route
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = app.DisableRoute(uint64(exitRouteV4.ID))
|
||||||
|
c.Assert(err, check.IsNil)
|
||||||
|
|
||||||
|
enabledRoutes1, err = app.GetEnabledRoutes(&machine1)
|
||||||
|
c.Assert(err, check.IsNil)
|
||||||
|
c.Assert(len(enabledRoutes1), check.Equals, 1)
|
||||||
|
|
||||||
|
// and now we delete only one of the exit routes
|
||||||
|
// and we check if both are deleted
|
||||||
|
routes, err = app.GetMachineRoutes(&machine1)
|
||||||
|
c.Assert(err, check.IsNil)
|
||||||
|
c.Assert(len(routes), check.Equals, 4)
|
||||||
|
|
||||||
|
err = app.DeleteRoute(uint64(exitRouteV4.ID))
|
||||||
|
c.Assert(err, check.IsNil)
|
||||||
|
|
||||||
|
routes, err = app.GetMachineRoutes(&machine1)
|
||||||
|
c.Assert(err, check.IsNil)
|
||||||
|
c.Assert(len(routes), check.Equals, 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Suite) TestDeleteRoutes(c *check.C) {
|
func (s *Suite) TestDeleteRoutes(c *check.C) {
|
||||||
|
|
Loading…
Reference in a new issue