package main import ( "errors" "fmt" "isle/daemon" "isle/jsonutil" ) var subCmdNetworkCreate = subCmd{ name: "create", descr: "Create's a new network, with this host being the first host in that network.", do: func(subCmdCtx subCmdCtx) error { var ( flags = subCmdCtx.flagSet(false) ipNet ipNetFlag hostName hostNameFlag ) name := flags.StringP( "name", "N", "", "Human-readable name to identify the network as.", ) domain := flags.StringP( "domain", "d", "", "Domain name that should be used as the root domain in the network.", ) ipNetF := flags.VarPF( &ipNet, "ip-net", "i", `An IP subnet, in CIDR form, which will be the overall range of`+ ` possible IPs in the network. The first IP in this network`+ ` range will become this first host's IP.`, ) hostNameF := flags.VarPF( &hostName, "hostname", "n", "Name of this host, which will be the first host in the network", ) if err := flags.Parse(subCmdCtx.args); err != nil { return fmt.Errorf("parsing flags: %w", err) } if *name == "" || *domain == "" || !ipNetF.Changed || !hostNameF.Changed { return errors.New("--name, --domain, --ip-net, and --hostname are required") } _, err := subCmdCtx.daemonRPC.CreateNetwork( subCmdCtx.ctx, daemon.CreateNetworkRequest{ Name: *name, Domain: *domain, IPNet: ipNet.V, HostName: hostName.V, }, ) if err != nil { return fmt.Errorf("creating network: %w", err) } return nil }, } var subCmdNetworkJoin = subCmd{ name: "join", descr: "Joins this host to an existing network", do: func(subCmdCtx subCmdCtx) error { var ( flags = subCmdCtx.flagSet(false) bootstrapPath = flags.StringP( "bootstrap-path", "b", "", "Path to a bootstrap.json file.", ) ) if err := flags.Parse(subCmdCtx.args); err != nil { return fmt.Errorf("parsing flags: %w", err) } if *bootstrapPath == "" { return errors.New("--bootstrap-path is required") } var newBootstrap daemon.JoiningBootstrap if err := jsonutil.LoadFile(&newBootstrap, *bootstrapPath); err != nil { return fmt.Errorf( "loading bootstrap from %q: %w", *bootstrapPath, err, ) } _, err := subCmdCtx.daemonRPC.JoinNetwork( subCmdCtx.ctx, newBootstrap, ) return err }, } var subCmdNetwork = subCmd{ name: "network", descr: "Sub-commands related to network membership", do: func(subCmdCtx subCmdCtx) error { return subCmdCtx.doSubCmd( subCmdNetworkCreate, subCmdNetworkJoin, ) }, }