package entrypoint import ( "bytes" "context" crypticnet "cryptic-net" "cryptic-net/bootstrap" "fmt" "io" "os" "path/filepath" "code.betamike.com/cryptic-io/pmux/pmuxlib" ) func copyBootstrapToDataDirAndReload(env crypticnet.Env, r io.Reader) (crypticnet.Env, error) { path := env.DataDirBootstrapPath() dirPath := filepath.Dir(path) if err := os.MkdirAll(dirPath, 0700); err != nil { return crypticnet.Env{}, fmt.Errorf("creating directory %q: %w", dirPath, err) } f, err := os.Create(path) if err != nil { return crypticnet.Env{}, fmt.Errorf("creating file %q: %w", path, err) } _, err = io.Copy(f, r) f.Close() if err != nil { return crypticnet.Env{}, fmt.Errorf("copying bootstrap file to %q: %w", path, err) } return env.LoadBootstrap(path) } func mergeDaemonIntoBootstrap(env crypticnet.Env) (crypticnet.Env, error) { daemon := env.ThisDaemon() host := env.Bootstrap.ThisHost() host.Nebula.PublicAddr = daemon.VPN.PublicAddr host.Garage = nil if allocs := daemon.Storage.Allocations; len(allocs) > 0 { host.Garage = new(bootstrap.GarageHost) for _, alloc := range allocs { host.Garage.Instances = append(host.Garage.Instances, bootstrap.GarageHostInstance{ RPCPort: alloc.RPCPort, S3APIPort: alloc.S3APIPort, }) } } env.Bootstrap.Hosts[host.Name] = host buf := new(bytes.Buffer) if err := env.Bootstrap.WithHosts(env.Bootstrap.Hosts).WriteTo(buf); err != nil { return crypticnet.Env{}, fmt.Errorf("writing new bootstrap file to buffer: %w", err) } return copyBootstrapToDataDirAndReload(env, buf) } func doOnce(ctx context.Context, fn func(context.Context) error) error { for { if err := fn(ctx); err == nil { return nil } else if ctxErr := ctx.Err(); ctxErr != nil { return ctxErr } } } func waitForNebulaArgs(env crypticnet.Env, args ...string) []string { thisHost := env.Bootstrap.ThisHost() return append([]string{"wait-for-ip", thisHost.Nebula.IP}, args...) } func nebulaEntrypointPmuxProcConfig() pmuxlib.ProcessConfig { return pmuxlib.ProcessConfig{ Name: "nebula", Cmd: "cryptic-net-main", Args: []string{ "nebula-entrypoint", }, } }