mirror of
https://github.com/jsiebens/ionscale.git
synced 2026-03-31 15:07:49 +01:00
64 lines
1.2 KiB
Go
64 lines
1.2 KiB
Go
package derp
|
|
|
|
import (
|
|
"encoding/json"
|
|
"github.com/hashicorp/go-getter"
|
|
"github.com/hashicorp/go-multierror"
|
|
"github.com/jsiebens/ionscale/internal/config"
|
|
"os"
|
|
"tailscale.com/tailcfg"
|
|
)
|
|
|
|
func LoadDERPSources(c *config.Config) (*tailcfg.DERPMap, error) {
|
|
derpMap := &tailcfg.DERPMap{
|
|
Regions: map[int]*tailcfg.DERPRegion{},
|
|
}
|
|
|
|
var merr *multierror.Error
|
|
for _, src := range c.DERP.Sources {
|
|
dm, err := loadDERPSource(src)
|
|
if err != nil {
|
|
merr = multierror.Append(merr, err)
|
|
continue
|
|
}
|
|
|
|
for id, r := range dm.Regions {
|
|
derpMap.Regions[id] = r
|
|
}
|
|
}
|
|
|
|
if !c.DERP.Server.Disabled {
|
|
dm := c.DefaultDERPMap()
|
|
for id, r := range dm.Regions {
|
|
derpMap.Regions[id] = r
|
|
}
|
|
}
|
|
|
|
return derpMap, merr.ErrorOrNil()
|
|
}
|
|
|
|
func loadDERPSource(src string) (*tailcfg.DERPMap, error) {
|
|
temp, err := os.CreateTemp(os.TempDir(), "derp-*.json")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer os.Remove(temp.Name())
|
|
|
|
if err := getter.Get(temp.Name(), src, getter.WithMode(getter.ClientModeFile)); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
content, err := os.ReadFile(temp.Name())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var dm tailcfg.DERPMap
|
|
|
|
if err := json.Unmarshal(content, &dm); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &dm, nil
|
|
}
|