Skip to content
This repository has been archived by the owner on Feb 24, 2024. It is now read-only.

Commit

Permalink
Merge pull request #11 from hyprspace/feature/experience-improvements
Browse files Browse the repository at this point in the history
Improve Error Handling & Allow Multiple Interfaces
  • Loading branch information
alecbcs authored Jun 17, 2021
2 parents 0c59a57 + 5376827 commit f4a7b5a
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 19 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
hyprspace
hyprspace
.DS_Store
1 change: 1 addition & 0 deletions cli/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ func InitRun(r *cmd.Root, c *cmd.Sub) {
new := config.Config{
Interface: config.Interface{
Name: args.InterfaceName,
ListenPort: 8001,
Address: "10.1.1.1/24",
ID: host.ID().Pretty(),
PrivateKey: string(keyBytes),
Expand Down
11 changes: 8 additions & 3 deletions cli/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import (
"github.com/DataDrake/cli-ng/v2/cmd"
)

var appVersion string = "develop"

//GlobalFlags contains the flags for commands.
type GlobalFlags struct {
Config string `short:"c" long:"config" desc:"Specify a custom config path."`
Expand All @@ -19,15 +21,18 @@ var Root *cmd.Root

func init() {
Root = &cmd.Root{
Name: "hyprspace",
Short: "Hyprspace Distributed Network",
Flags: &GlobalFlags{},
Name: "hyprspace",
Short: "Hyprspace Distributed Network",
Version: appVersion,
Flags: &GlobalFlags{},
}

cmd.Register(&cmd.Help)
cmd.Register(&Init)
cmd.Register(&Up)
cmd.Register(&Down)
cmd.Register(&Update)
cmd.Register(&cmd.Version)
}

func checkErr(err error) {
Expand Down
56 changes: 47 additions & 9 deletions cli/up.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@ package cli
import (
"bufio"
"context"
"errors"
"fmt"
"io"
"log"
"net"
"os"
"os/signal"
"strconv"
"strings"
"syscall"
"time"
Expand Down Expand Up @@ -75,15 +78,18 @@ func UpRun(r *cmd.Root, c *cmd.Sub) {

if !flags.Foreground {
// Make results chan
out := make(chan bool)
out := make(chan error)
go createDaemon(out)

select {
case <-out:
case err = <-out:
case <-time.After(30 * time.Second):
}
checkErr(err)
fmt.Println("[+] Successfully Created Hyprspace Daemon")
if err != nil {
fmt.Println("[+] Failed to Create Hyprspace Daemon")
} else {
fmt.Println("[+] Successfully Created Hyprspace Daemon")
}
return
}

Expand All @@ -96,7 +102,9 @@ func UpRun(r *cmd.Root, c *cmd.Sub) {
fmt.Println("[+] Creating TUN Device")
// Create new TUN device
iface, err = tun.New(Global.Interface.Name)
checkErr(err)
if err != nil {
checkErr(errors.New("interface already in use"))
}
// Set TUN MTU
tun.SetMTU(Global.Interface.Name, 1420)
// Add Address to Interface
Expand All @@ -106,8 +114,35 @@ func UpRun(r *cmd.Root, c *cmd.Sub) {
ctx := context.Background()

fmt.Println("[+] Creating LibP2P Node")

// Check that the listener port is available.
var ln net.Listener
port := Global.Interface.ListenPort
if port != 8001 {
ln, err = net.Listen("tcp", ":"+strconv.Itoa(port))
if err != nil {
checkErr(errors.New("could not create node, listen port already in use by something else"))
}
} else {
for {
ln, err = net.Listen("tcp", ":"+strconv.Itoa(port))
if err == nil {
break
}
if port >= 65535 {
checkErr(errors.New("failed to find open port"))
}
port++
}
}
if ln != nil {
ln.Close()
}
// Create P2P Node
host, dht, err := p2p.CreateNode(ctx, Global.Interface.PrivateKey, streamHandler)
host, dht, err := p2p.CreateNode(ctx,
Global.Interface.PrivateKey,
port,
streamHandler)
checkErr(err)

// Setup Peer Table for Quick Packet --> Dest ID lookup
Expand Down Expand Up @@ -162,7 +197,7 @@ func UpRun(r *cmd.Root, c *cmd.Sub) {
}
}

func createDaemon(out chan<- bool) {
func createDaemon(out chan<- error) {
path, err := os.Executable()
checkErr(err)
// Create Pipe to monitor for daemon output.
Expand All @@ -173,7 +208,7 @@ func createDaemon(out chan<- bool) {
path,
append(os.Args, "--foreground"),
&os.ProcAttr{
Files: []*os.File{nil, w, nil},
Files: []*os.File{nil, w, w},
},
)
checkErr(err)
Expand All @@ -186,7 +221,10 @@ func createDaemon(out chan<- bool) {
fmt.Println(scanner.Text())
err = process.Release()
checkErr(err)
out <- true
if count < 4 {
out <- errors.New("failed to create daemon")
}
out <- nil
}

func streamHandler(stream network.Stream) {
Expand Down
2 changes: 0 additions & 2 deletions cli/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ import (
"github.com/tcnksm/go-latest"
)

var appVersion string

// Update checks for a new version of the Hyprspace program and updates itself
// if a newer version is found and the user agrees to update.
var Update = cmd.Sub{
Expand Down
13 changes: 12 additions & 1 deletion config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ type Config struct {
// Interface defines all of the fields that a local node needs to know about itself!
type Interface struct {
Name string `yaml:"name"`
Address string `yaml:"address"`
ID string `yaml:"id"`
ListenPort int `yaml:"listen_port"`
Address string `yaml:"address"`
DiscoverKey string `yaml:"discover_key"`
PrivateKey string `yaml:"private_key"`
}
Expand All @@ -32,6 +33,16 @@ func Read(path string) (result Config, err error) {
if err != nil {
return
}
result = Config{
Interface: Interface{
Name: "hs0",
ListenPort: 8001,
Address: "10.1.1.1",
ID: "",
DiscoverKey: "",
PrivateKey: "",
},
}
err = yaml.Unmarshal(in, &result)
return
}
2 changes: 1 addition & 1 deletion p2p/discover.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func Discover(ctx context.Context, h host.Host, dht *dht.IpfsDHT, rendezvous str
var routingDiscovery = discovery.NewRoutingDiscovery(dht)
discovery.Advertise(ctx, routingDiscovery, rendezvous)

ticker := time.NewTicker(time.Second * 1)
ticker := time.NewTicker(time.Second * 5)
defer ticker.Stop()

for {
Expand Down
4 changes: 2 additions & 2 deletions p2p/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (
const Protocol = "/hyprspace/0.0.1"

// CreateNode creates an internal Libp2p nodes and returns it and it's DHT Discovery service.
func CreateNode(ctx context.Context, inputKey string, handler network.StreamHandler) (node host.Host, dhtOut *dht.IpfsDHT, err error) {
func CreateNode(ctx context.Context, inputKey string, port int, handler network.StreamHandler) (node host.Host, dhtOut *dht.IpfsDHT, err error) {
// Unmarshal Private Key
privateKey, err := crypto.UnmarshalPrivateKey([]byte(inputKey))
if err != nil {
Expand All @@ -27,7 +27,7 @@ func CreateNode(ctx context.Context, inputKey string, handler network.StreamHand

// Create libp2p node
node, err = libp2p.New(ctx,
libp2p.ListenAddrStrings(fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", 8001)),
libp2p.ListenAddrStrings(fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", port)),
libp2p.Identity(privateKey),
)
if err != nil {
Expand Down

0 comments on commit f4a7b5a

Please sign in to comment.