158 lines
3.0 KiB
Go
158 lines
3.0 KiB
Go
|
package nebula_entrypoint
|
||
|
|
||
|
import (
|
||
|
"cryptic-net/yamlutil"
|
||
|
"fmt"
|
||
|
"io/fs"
|
||
|
"log"
|
||
|
"net"
|
||
|
"path/filepath"
|
||
|
"strconv"
|
||
|
|
||
|
crypticnet "cryptic-net"
|
||
|
|
||
|
"github.com/cryptic-io/pmux/pmuxlib"
|
||
|
)
|
||
|
|
||
|
func Main() {
|
||
|
|
||
|
env, err := crypticnet.ReadEnv()
|
||
|
|
||
|
if err != nil {
|
||
|
log.Fatalf("reading envvars: %v", err)
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
lighthouseHostIPs []string
|
||
|
staticHostMap = map[string][]string{}
|
||
|
)
|
||
|
|
||
|
for _, host := range env.Hosts {
|
||
|
|
||
|
if host.Nebula.PublicAddr == "" {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
lighthouseHostIPs = append(lighthouseHostIPs, host.Nebula.IP)
|
||
|
staticHostMap[host.Nebula.IP] = []string{host.Nebula.PublicAddr}
|
||
|
}
|
||
|
|
||
|
readCertFile := func(name string) string {
|
||
|
if err != nil {
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
path := filepath.Join("nebula", "certs", name)
|
||
|
|
||
|
var b []byte
|
||
|
if b, err = fs.ReadFile(env.BootstrapFS, path); err != nil {
|
||
|
err = fmt.Errorf("reading %q from bootstrap fs: %w", path, err)
|
||
|
}
|
||
|
|
||
|
return string(b)
|
||
|
}
|
||
|
|
||
|
config := map[string]interface{}{
|
||
|
"pki": map[string]string{
|
||
|
"ca": readCertFile("ca.crt"),
|
||
|
"cert": readCertFile("host.crt"),
|
||
|
"key": readCertFile("host.key"),
|
||
|
},
|
||
|
"static_host_map": staticHostMap,
|
||
|
"punchy": map[string]bool{
|
||
|
"punch": true,
|
||
|
"respond": true,
|
||
|
},
|
||
|
"tun": map[string]interface{}{
|
||
|
"dev": "cryptic-nebula1",
|
||
|
},
|
||
|
}
|
||
|
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
if publicAddr := env.ThisDaemon().VPN.PublicAddr; publicAddr == "" {
|
||
|
|
||
|
config["listen"] = map[string]string{
|
||
|
"host": "0.0.0.0",
|
||
|
"port": "0",
|
||
|
}
|
||
|
|
||
|
config["lighthouse"] = map[string]interface{}{
|
||
|
"hosts": lighthouseHostIPs,
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
|
||
|
_, port, err := net.SplitHostPort(publicAddr)
|
||
|
|
||
|
if err != nil {
|
||
|
log.Fatalf("parsing public address %q: %v", publicAddr, err)
|
||
|
}
|
||
|
|
||
|
config["listen"] = map[string]string{
|
||
|
"host": "0.0.0.0",
|
||
|
"port": port,
|
||
|
}
|
||
|
|
||
|
config["lighthouse"] = map[string]interface{}{
|
||
|
"hosts": []string{},
|
||
|
"am_lighthouse": true,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
thisDaemon := env.ThisDaemon()
|
||
|
|
||
|
var firewallInbound []crypticnet.ConfigFirewallRule
|
||
|
|
||
|
for _, alloc := range thisDaemon.Storage.Allocations {
|
||
|
firewallInbound = append(
|
||
|
firewallInbound,
|
||
|
crypticnet.ConfigFirewallRule{
|
||
|
Port: strconv.Itoa(alloc.APIPort),
|
||
|
Proto: "tcp",
|
||
|
Host: "any",
|
||
|
},
|
||
|
crypticnet.ConfigFirewallRule{
|
||
|
Port: strconv.Itoa(alloc.RPCPort),
|
||
|
Proto: "tcp",
|
||
|
Host: "any",
|
||
|
},
|
||
|
crypticnet.ConfigFirewallRule{
|
||
|
Port: strconv.Itoa(alloc.WebPort),
|
||
|
Proto: "tcp",
|
||
|
Host: "any",
|
||
|
},
|
||
|
)
|
||
|
}
|
||
|
|
||
|
firewall := thisDaemon.VPN.Firewall
|
||
|
|
||
|
firewall.Inbound = append(firewallInbound, firewall.Inbound...)
|
||
|
|
||
|
config["firewall"] = firewall
|
||
|
|
||
|
nebulaYmlPath := filepath.Join(env.RuntimeDirPath, "nebula.yml")
|
||
|
|
||
|
if err := yamlutil.WriteYamlFile(config, nebulaYmlPath); err != nil {
|
||
|
log.Fatalf("writing nebula.yml to %q: %v", nebulaYmlPath, err)
|
||
|
}
|
||
|
|
||
|
pmuxlib.Run(env.Context, pmuxlib.Config{Processes: []pmuxlib.ProcessConfig{
|
||
|
{
|
||
|
Name: "nebula-update-global-bucket",
|
||
|
Cmd: "cryptic-net-main",
|
||
|
Args: []string{
|
||
|
"nebula-update-global-bucket",
|
||
|
},
|
||
|
NoRestartOn: []int{0},
|
||
|
},
|
||
|
{
|
||
|
Name: "nebula",
|
||
|
Cmd: "nebula",
|
||
|
Args: []string{"-config", nebulaYmlPath},
|
||
|
},
|
||
|
}})
|
||
|
}
|