headscale/routes.go

66 lines
1.6 KiB
Go
Raw Normal View History

2021-04-28 22:55:29 +08:00
package headscale
import (
"encoding/json"
"errors"
2021-05-15 06:05:41 +08:00
"gorm.io/datatypes"
2021-04-28 22:55:29 +08:00
"inet.af/netaddr"
)
// GetNodeRoutes returns the subnet routes advertised by a node (identified by
// namespace and node name)
func (h *Headscale) GetNodeRoutes(namespace string, nodeName string) (*[]netaddr.IPPrefix, error) {
m, err := h.GetMachine(namespace, nodeName)
if err != nil {
return nil, err
}
hi, err := m.GetHostInfo()
if err != nil {
return nil, err
}
return &hi.RoutableIPs, nil
}
// EnableNodeRoute enables a subnet route advertised by a node (identified by
// namespace and node name)
func (h *Headscale) EnableNodeRoute(namespace string, nodeName string, routeStr string) (*netaddr.IPPrefix, error) {
2021-04-28 22:55:29 +08:00
m, err := h.GetMachine(namespace, nodeName)
if err != nil {
return nil, err
2021-04-28 22:55:29 +08:00
}
hi, err := m.GetHostInfo()
if err != nil {
return nil, err
2021-04-28 22:55:29 +08:00
}
route, err := netaddr.ParseIPPrefix(routeStr)
if err != nil {
return nil, err
2021-04-28 22:55:29 +08:00
}
for _, rIP := range hi.RoutableIPs {
if rIP == route {
routes, _ := json.Marshal([]string{routeStr}) // TODO: only one for the time being, so overwriting the rest
2021-05-15 06:05:41 +08:00
m.EnabledRoutes = datatypes.JSON(routes)
2021-07-05 03:40:46 +08:00
h.db.Save(&m)
2021-04-28 22:55:29 +08:00
// THIS IS COMPLETELY USELESS.
// The peers map is stored in memory in the server process.
// Definetely not accessible from the CLI tool.
// We need RPC to the server - or some kind of 'needsUpdate' field in the DB
2021-04-28 22:55:29 +08:00
peers, _ := h.getPeers(*m)
h.pollMu.Lock()
for _, p := range *peers {
if pUp, ok := h.clientsPolling[uint64(p.ID)]; ok {
pUp <- []byte{}
}
}
h.pollMu.Unlock()
return &rIP, nil
2021-04-28 22:55:29 +08:00
}
}
return nil, errors.New("could not find routable range")
2021-04-28 22:55:29 +08:00
}