123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- package views
- import (
- "fmt"
- "time"
- "fyne.io/fyne/v2"
- "fyne.io/fyne/v2/container"
- "fyne.io/fyne/v2/layout"
- "fyne.io/fyne/v2/theme"
- "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/ncutils"
- )
- // GetNetworksView - displays the view of all networks
- func GetNetworksView(networks []string) fyne.CanvasObject {
- // renders := []fyne.CanvasObject{}
- if len(networks) == 0 {
- return container.NewCenter(widget.NewLabel("No networks present"))
- }
- grid := container.New(layout.NewGridLayout(4),
- container.NewCenter(widget.NewLabel("Network Name")),
- container.NewCenter(widget.NewLabel("Node Info")),
- container.NewCenter(widget.NewLabel("Pull Latest")),
- container.NewCenter(widget.NewLabel("Leave network")),
- )
- for i := range networks {
- network := &networks[i]
- grid.Add(
- container.NewCenter(widget.NewLabel(*network)),
- )
- grid.Add(
- components.ColoredIconButton("info", theme.InfoIcon(), func() {
- RefreshComponent(NetDetails, GetSingleNetworkView(*network))
- ShowView(NetDetails)
- }, components.Gold_color),
- )
- grid.Add(
- components.ColoredIconButton("pull", theme.DownloadIcon(), func() {
- // TODO call pull with network name
- pull(*network)
- }, components.Blue_color),
- )
- grid.Add(
- components.ColoredIconButton("leave", theme.DeleteIcon(), func() {
- leave(*network)
- }, components.Danger_color),
- )
- // renders = append(renders, container.NewCenter(netToolbar))
- }
- return container.NewCenter(grid)
- }
- // GetSingleNetworkView - returns details and option to pull a network
- func GetSingleNetworkView(network string) fyne.CanvasObject {
- if len(network) == 0 {
- return container.NewCenter(widget.NewLabel("No valid network selected"))
- }
- // == read node values ==
- LoadingNotify()
- nets, err := functions.List(network)
- if err != nil || len(nets) < 1 {
- ClearNotification()
- return container.NewCenter(widget.NewLabel("No data retrieved."))
- }
- var nodecfg config.ClientConfig
- nodecfg.Network = network
- 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 * 30)) {
- health = " (ERROR)"
- } else if time.Now().After(lastCheckInTime.Add(time.Minute * 5)) {
- health = " (WARNING)"
- }
- lastCheckIn += health
- version := nodecfg.Node.Version
- pullBtn := components.ColoredButton("pull "+network, func() { pull(network) }, components.Blue_color)
- pullBtn.Resize(fyne.NewSize(pullBtn.Size().Width, 50))
- view := container.NewGridWithColumns(1, widget.NewRichTextFromMarkdown(fmt.Sprintf(`### %s
- - ID: %s
- - Last Check In: %s
- - Endpoint: %s
- - Address (IPv4): %s
- - Address6 (IPv6): %s
- - Version: %s
- ### Peers
- `, network, nodeID, lastCheckIn, endpoint, privateAddr, privateAddr6, version)),
- )
- netDetailsView := container.NewCenter(
- view,
- )
- peerView := container.NewVBox()
- for _, p := range nets[0].Peers {
- peerString := ""
- endpointEntry := widget.NewEntry()
- endpointEntry.Text = fmt.Sprintf("Endpoint: %s", p.PublicEndpoint)
- endpointEntry.Disable()
- newEntry := widget.NewEntry()
- for i, addr := range p.Addresses {
- if i > 0 && i < len(p.Addresses) {
- peerString += ", "
- }
- peerString += addr.IP
- }
- newEntry.Text = peerString
- newEntry.Disable()
- peerView.Add(widget.NewLabel(fmt.Sprintf("Peer: %s", p.PublicKey)))
- peerView.Add(container.NewVBox(container.NewVBox(endpointEntry), container.NewVBox(newEntry)))
- }
- peerScroller := container.NewVScroll(peerView)
- view.Add(peerScroller)
- view.Add(container.NewVBox(pullBtn))
- netDetailsView.Refresh()
- ClearNotification()
- return netDetailsView
- }
- // == private ==
- func pull(network string) {
- LoadingNotify()
- _, err := functions.Pull(network, true)
- if err != nil {
- ErrorNotify("Failed to pull " + network + " : " + err.Error())
- } else {
- SuccessNotify("Pulled " + network + "!")
- }
- }
- func leave(network string) {
- confirmView := GetConfirmation("Confirm leaving "+network+"?", func() {
- ShowView(Networks)
- }, func() {
- LoadingNotify()
- err := functions.LeaveNetwork(network)
- if err != nil {
- ErrorNotify("Failed to leave " + network + " : " + err.Error())
- } else {
- SuccessNotify("Left " + network)
- }
- networks, err := ncutils.GetSystemNetworks()
- if err != nil {
- networks = []string{}
- ErrorNotify("Failed to read local networks!")
- }
- RefreshComponent(Networks, GetNetworksView(networks))
- ShowView(Networks)
- })
- RefreshComponent(Confirm, confirmView)
- ShowView(Confirm)
- }
|