initial gui testing passed

This commit is contained in:
0xdcarns 2022-05-05 09:48:02 -04:00
parent cd065e35f4
commit 7a1b719a91
7 changed files with 115 additions and 32 deletions

View file

@ -9,6 +9,7 @@ import (
"github.com/gravitl/netmaker/netclient/config" "github.com/gravitl/netmaker/netclient/config"
"github.com/gravitl/netmaker/netclient/daemon" "github.com/gravitl/netmaker/netclient/daemon"
"github.com/gravitl/netmaker/netclient/functions" "github.com/gravitl/netmaker/netclient/functions"
"github.com/gravitl/netmaker/netclient/gui"
"github.com/gravitl/netmaker/netclient/ncutils" "github.com/gravitl/netmaker/netclient/ncutils"
"github.com/gravitl/netmaker/tls" "github.com/gravitl/netmaker/tls"
) )
@ -142,3 +143,12 @@ func Daemon() error {
err := functions.Daemon() err := functions.Daemon()
return err return err
} }
// Gui - runs the netclient gui
func Gui() error {
currNets, err := ncutils.GetSystemNetworks()
if err != nil {
return err
}
return gui.Run(currNets)
}

View file

@ -6,8 +6,6 @@ import (
"crypto/ed25519" "crypto/ed25519"
"crypto/x509" "crypto/x509"
"crypto/x509/pkix" "crypto/x509/pkix"
"encoding/base64"
"encoding/json"
"errors" "errors"
"fmt" "fmt"
"log" "log"
@ -184,14 +182,8 @@ func ReplaceWithBackup(network string) error {
func GetCLIConfig(c *cli.Context) (ClientConfig, string, error) { func GetCLIConfig(c *cli.Context) (ClientConfig, string, error) {
var cfg ClientConfig var cfg ClientConfig
if c.String("token") != "" { if c.String("token") != "" {
tokenbytes, err := base64.StdEncoding.DecodeString(c.String("token")) accesstoken, err := ParseAccessToken(c.String("token"))
if err != nil { if err != nil {
log.Println("error decoding token")
return cfg, "", err
}
var accesstoken models.AccessToken
if err := json.Unmarshal(tokenbytes, &accesstoken); err != nil {
log.Println("error converting token json to object", tokenbytes)
return cfg, "", err return cfg, "", err
} }
cfg.Network = accesstoken.ClientConfig.Network cfg.Network = accesstoken.ClientConfig.Network
@ -216,7 +208,6 @@ func GetCLIConfig(c *cli.Context) (ClientConfig, string, error) {
if c.String("apiserver") != "" { if c.String("apiserver") != "" {
cfg.Server.API = c.String("apiserver") cfg.Server.API = c.String("apiserver")
} }
} else { } else {
cfg.Server.AccessKey = c.String("key") cfg.Server.AccessKey = c.String("key")
cfg.Network = c.String("network") cfg.Network = c.String("network")

24
netclient/config/util.go Normal file
View file

@ -0,0 +1,24 @@
package config
import (
"encoding/base64"
"encoding/json"
"github.com/gravitl/netmaker/logger"
"github.com/gravitl/netmaker/models"
)
// ParseAccessToken - used to parse the base64 encoded access token
func ParseAccessToken(token string) (*models.AccessToken, error) {
tokenbytes, err := base64.StdEncoding.DecodeString(token)
if err != nil {
logger.Log(0, "error decoding token", err.Error())
return nil, err
}
var accesstoken models.AccessToken
if err := json.Unmarshal(tokenbytes, &accesstoken); err != nil {
logger.Log(0, "error decoding token", err.Error())
return nil, err
}
return &accesstoken, nil
}

View file

@ -1,14 +1,14 @@
package views package views
import ( import (
"fmt"
"time"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"github.com/gravitl/netmaker/netclient/config"
"github.com/gravitl/netmaker/netclient/functions"
"github.com/gravitl/netmaker/netclient/gui/components" "github.com/gravitl/netmaker/netclient/gui/components"
"github.com/gravitl/netmaker/netclient/ncutils"
) )
// GetJoinView - get's the join screen where a user inputs an access token // GetJoinView - get's the join screen where a user inputs an access token
@ -18,11 +18,33 @@ func GetJoinView() fyne.CanvasObject {
input.SetPlaceHolder("access token here...") input.SetPlaceHolder("access token here...")
submitBtn := components.ColoredIconButton("Submit", theme.UploadIcon(), func() { submitBtn := components.ColoredIconButton("Submit", theme.UploadIcon(), func() {
fmt.Printf("got text %s \n", input.Text)
// ErrorNotify("Could not process token") // ErrorNotify("Could not process token")
LoadingNotify() LoadingNotify()
time.Sleep(time.Second) var cfg config.ClientConfig
SuccessNotify("Joined!") accesstoken, err := config.ParseAccessToken(input.Text)
if err != nil {
ErrorNotify("Failed to parse access token!")
return
}
cfg.Network = accesstoken.ClientConfig.Network
cfg.Node.Network = accesstoken.ClientConfig.Network
cfg.Server.AccessKey = accesstoken.ClientConfig.Key
cfg.Node.LocalRange = accesstoken.ClientConfig.LocalRange
cfg.Server.Server = accesstoken.ServerConfig.Server
cfg.Server.API = accesstoken.ServerConfig.APIConnString
err = functions.JoinNetwork(&cfg, "")
if err != nil {
ErrorNotify("Failed to join " + cfg.Network + "!")
return
}
networks, err := ncutils.GetSystemNetworks()
if err != nil {
ErrorNotify("Failed to read local networks!")
return
}
SuccessNotify("Joined " + cfg.Network + "!")
RefreshComponent(Networks, GetNetworksView(networks))
ShowView(Networks)
// TODO // TODO
// - call join // - call join
// - display loading // - display loading

View file

@ -9,8 +9,10 @@ import (
"fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"github.com/gravitl/netmaker/netclient/config"
"github.com/gravitl/netmaker/netclient/functions" "github.com/gravitl/netmaker/netclient/functions"
"github.com/gravitl/netmaker/netclient/gui/components" "github.com/gravitl/netmaker/netclient/gui/components"
"github.com/gravitl/netmaker/netclient/ncutils"
) )
var currentNetwork *string var currentNetwork *string
@ -62,25 +64,39 @@ func GetSingleNetworkView(network string) fyne.CanvasObject {
if network == "" || len(network) == 0 { if network == "" || len(network) == 0 {
return container.NewCenter(widget.NewLabel("No valid network selected")) return container.NewCenter(widget.NewLabel("No valid network selected"))
} }
nodeID := "somenodeid"
health := "healthy" // == read node values ==
privateAddr := "10.10.10.10" var nodecfg config.ClientConfig
privateAddr6 := "23:23:23:23" nodecfg.Network = network
endpoint := "182.3.4.4:55555" nodecfg.ReadConfig()
nodeID := nodecfg.Node.ID
lastCheckInTime := time.Unix(nodecfg.Node.LastCheckIn, 0)
lastCheckIn := lastCheckInTime.Format("2006-01-02 15:04:05")
privateAddr := nodecfg.Node.Address
privateAddr6 := nodecfg.Node.Address6
endpoint := nodecfg.Node.Endpoint
health := " (HEALTHY)"
if time.Now().After(lastCheckInTime.Add(time.Minute * 5)) {
health = " (WARNING)"
} else if time.Now().After(lastCheckInTime.Add(time.Minute * 30)) {
health = " (ERROR)"
}
lastCheckIn += health
version := nodecfg.Node.Version
pullBtn := components.ColoredButton("pull "+network, func() { pull(network) }, components.Blue_color) pullBtn := components.ColoredButton("pull "+network, func() { pull(network) }, components.Blue_color)
pullBtn.Resize(fyne.NewSize(pullBtn.Size().Width, 50)) pullBtn.Resize(fyne.NewSize(pullBtn.Size().Width, 50))
LoadingNotify() LoadingNotify()
time.Sleep(time.Second)
netDetailsView := container.NewCenter( netDetailsView := container.NewCenter(
// components.ColoredText("Selected "+network, components.Orange_color), // components.ColoredText("Selected "+network, components.Orange_color),
container.NewGridWithColumns(1, widget.NewRichTextFromMarkdown(fmt.Sprintf(`### %s container.NewGridWithColumns(1, widget.NewRichTextFromMarkdown(fmt.Sprintf(`### %s
- ID: %s - ID: %s
- Health: %s - Last Check In: %s
- Endpoint: %s - Endpoint: %s
- Address (IPv4): %s - Address (IPv4): %s
- Address6 (IPv6): %s - Address6 (IPv6): %s
`, network, nodeID, health, endpoint, privateAddr, privateAddr6)), - Version: %s
`, network, nodeID, lastCheckIn, endpoint, privateAddr, privateAddr6, version)),
container.NewCenter(pullBtn), container.NewCenter(pullBtn),
)) ))
ClearNotification() ClearNotification()
@ -110,6 +126,12 @@ func leave(network string) {
} else { } else {
SuccessNotify("Left " + network) SuccessNotify("Left " + network)
} }
networks, err := ncutils.GetSystemNetworks()
if err != nil {
networks = []string{}
ErrorNotify("Failed to read local networks!")
}
RefreshComponent(Networks, GetNetworksView(networks))
ShowView(Networks) ShowView(Networks)
}) })
RefreshComponent(Confirm, confirmView) RefreshComponent(Confirm, confirmView)

View file

@ -3,27 +3,29 @@ package gui
import ( import (
"embed" "embed"
"image/color" "image/color"
"time"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/app" "fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"github.com/gravitl/netmaker/logger"
"github.com/gravitl/netmaker/netclient/functions" "github.com/gravitl/netmaker/netclient/functions"
"github.com/gravitl/netmaker/netclient/gui/components" "github.com/gravitl/netmaker/netclient/gui/components"
"github.com/gravitl/netmaker/netclient/gui/components/views" "github.com/gravitl/netmaker/netclient/gui/components/views"
"github.com/gravitl/netmaker/netclient/ncutils"
) )
//go:embed nm-logo-sm.png //go:embed nm-logo-sm.png
var logoContent embed.FS var logoContent embed.FS
func run(networks []string) error { func Run(networks []string) error {
a := app.New() a := app.New()
window := a.NewWindow("Netclient") window := a.NewWindow("Netclient")
img, err := logoContent.ReadFile("nm-logo.png") img, err := logoContent.ReadFile("nm-logo-sm.png")
if err != nil { if err != nil {
logger.Log(0, "failed to read logo", err.Error())
return err return err
} }
@ -53,13 +55,16 @@ func run(networks []string) error {
}, func() { }, func() {
views.LoadingNotify() views.LoadingNotify()
err := functions.Uninstall() err := functions.Uninstall()
time.Sleep(time.Second >> 1)
if err != nil { if err != nil {
views.ErrorNotify("Failed to uninstall: \n" + err.Error()) views.ErrorNotify("Failed to uninstall: \n" + err.Error())
} else { } else {
views.SuccessNotify("Uninstalled Netclient!") views.SuccessNotify("Uninstalled Netclient!")
} }
time.Sleep(time.Second >> 1) networks, err := ncutils.GetSystemNetworks()
if err != nil {
networks = []string{}
}
views.RefreshComponent(views.Networks, views.GetNetworksView(networks))
views.ShowView(views.Networks) views.ShowView(views.Networks)
}) })
views.RefreshComponent(views.Confirm, confirmView) views.RefreshComponent(views.Confirm, confirmView)

View file

@ -8,6 +8,7 @@ import (
"runtime/debug" "runtime/debug"
"github.com/gravitl/netmaker/netclient/cli_options" "github.com/gravitl/netmaker/netclient/cli_options"
"github.com/gravitl/netmaker/netclient/gui"
"github.com/gravitl/netmaker/netclient/ncutils" "github.com/gravitl/netmaker/netclient/ncutils"
"github.com/gravitl/netmaker/netclient/ncwindows" "github.com/gravitl/netmaker/netclient/ncwindows"
"github.com/urfave/cli/v2" "github.com/urfave/cli/v2"
@ -35,9 +36,17 @@ func main() {
ncutils.CheckWG() ncutils.CheckWG()
} }
err := app.Run(os.Args) if len(os.Args) <= 1 {
if err != nil { networks, err := ncutils.GetSystemNetworks()
log.Fatal(err) if err != nil {
networks = []string{}
}
gui.Run(networks)
} else {
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
} }
} }