add basic client; enable node level routing
Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
This commit is contained in:
parent
c0515d4802
commit
ed73f97bd3
16 changed files with 1292 additions and 143 deletions
|
@ -35,7 +35,7 @@ import (
|
|||
|
||||
func main() {
|
||||
app := cli.NewApp()
|
||||
app.Name = "actl"
|
||||
app.Name = "hctl"
|
||||
app.Version = version.BuildVersion()
|
||||
app.Author = "@stellarproject"
|
||||
app.Email = ""
|
||||
|
@ -49,7 +49,7 @@ func main() {
|
|||
Name: "addr, a",
|
||||
Usage: "heimdall grpc address",
|
||||
Value: "tcp://127.0.0.1:9000",
|
||||
EnvVar: "ATLAS_ADDR",
|
||||
EnvVar: "HEIMDALL_ADDR",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "cert, c",
|
||||
|
@ -72,7 +72,11 @@ func main() {
|
|||
}
|
||||
return nil
|
||||
}
|
||||
app.Commands = []cli.Command{}
|
||||
app.Commands = []cli.Command{
|
||||
nodesCommand,
|
||||
peersCommand,
|
||||
routesCommand,
|
||||
}
|
||||
|
||||
if err := app.Run(os.Args); err != nil {
|
||||
logrus.Fatal(err)
|
||||
|
|
65
cmd/hctl/nodes.go
Normal file
65
cmd/hctl/nodes.go
Normal file
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
Copyright 2019 Stellar Project
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in the
|
||||
Software without restriction, including without limitation the rights to use, copy,
|
||||
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies
|
||||
or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"text/tabwriter"
|
||||
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
var nodesCommand = cli.Command{
|
||||
Name: "nodes",
|
||||
Usage: "node management",
|
||||
Subcommands: []cli.Command{
|
||||
listNodesCommand,
|
||||
},
|
||||
}
|
||||
|
||||
var listNodesCommand = cli.Command{
|
||||
Name: "list",
|
||||
Usage: "list nodes",
|
||||
Action: func(cx *cli.Context) error {
|
||||
c, err := getClient(cx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
nodes, err := c.Nodes()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
w := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0)
|
||||
fmt.Fprintf(w, "ID\tADDR\tGATEWAY\tPUBLIC KEY\n")
|
||||
for _, n := range nodes {
|
||||
gw := fmt.Sprintf("%s:%d", n.GatewayIP, n.GatewayPort)
|
||||
fmt.Fprintf(w, "%s\t%s\t%s\t%s\n", n.ID, n.Addr, gw, n.KeyPair.PublicKey)
|
||||
}
|
||||
w.Flush()
|
||||
|
||||
return nil
|
||||
},
|
||||
}
|
63
cmd/hctl/peers.go
Normal file
63
cmd/hctl/peers.go
Normal file
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
Copyright 2019 Stellar Project
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in the
|
||||
Software without restriction, including without limitation the rights to use, copy,
|
||||
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies
|
||||
or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"text/tabwriter"
|
||||
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
var peersCommand = cli.Command{
|
||||
Name: "peers",
|
||||
Usage: "peer management",
|
||||
Subcommands: []cli.Command{
|
||||
listPeersCommand,
|
||||
},
|
||||
}
|
||||
var listPeersCommand = cli.Command{
|
||||
Name: "list",
|
||||
Usage: "list peers",
|
||||
Action: func(cx *cli.Context) error {
|
||||
c, err := getClient(cx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
peers, err := c.Peers()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
w := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0)
|
||||
fmt.Fprintf(w, "ID\tPUBLIC KEY\tENDPOINT\tALLOWED\n")
|
||||
for _, p := range peers {
|
||||
fmt.Fprintf(w, "%s\t%s\t%s\t%s\n", p.ID, p.KeyPair.PublicKey, p.Endpoint, p.AllowedIPs)
|
||||
}
|
||||
w.Flush()
|
||||
|
||||
return nil
|
||||
},
|
||||
}
|
111
cmd/hctl/routes.go
Normal file
111
cmd/hctl/routes.go
Normal file
|
@ -0,0 +1,111 @@
|
|||
/*
|
||||
Copyright 2019 Stellar Project
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in the
|
||||
Software without restriction, including without limitation the rights to use, copy,
|
||||
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies
|
||||
or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"text/tabwriter"
|
||||
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
|
||||
var routesCommand = cli.Command{
|
||||
Name: "routes",
|
||||
Usage: "route management",
|
||||
Subcommands: []cli.Command{
|
||||
listRoutesCommand,
|
||||
createRouteCommand,
|
||||
deleteRouteCommand,
|
||||
},
|
||||
}
|
||||
|
||||
var listRoutesCommand = cli.Command{
|
||||
Name: "list",
|
||||
Usage: "list routes",
|
||||
Action: func(cx *cli.Context) error {
|
||||
c, err := getClient(cx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
routes, err := c.Routes()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
w := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0)
|
||||
fmt.Fprintf(w, "NODE\tNETWORK\n")
|
||||
for _, r := range routes {
|
||||
fmt.Fprintf(w, "%s\t%s\n", r.NodeID, r.Network)
|
||||
}
|
||||
w.Flush()
|
||||
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
var createRouteCommand = cli.Command{
|
||||
Name: "create",
|
||||
Usage: "create a new route",
|
||||
Flags: []cli.Flag{
|
||||
cli.StringFlag{
|
||||
Name: "node-id",
|
||||
Usage: "node id for route",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "network",
|
||||
Usage: "network for route (i.e. 10.100.0.0/24)",
|
||||
},
|
||||
},
|
||||
Action: func(cx *cli.Context) error {
|
||||
c, err := getClient(cx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
if err := c.CreateRoute(cx.String("node-id"), cx.String("network")); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
var deleteRouteCommand = cli.Command{
|
||||
Name: "delete",
|
||||
Usage: "delete a route",
|
||||
Action: func(cx *cli.Context) error {
|
||||
c, err := getClient(cx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer c.Close()
|
||||
|
||||
network := cx.Args().First()
|
||||
if err := c.DeleteRoute(network); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
},
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue