mirror of
				https://github.com/gravitl/netmaker.git
				synced 2025-10-31 16:43:07 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			168 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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"
 | |
| )
 | |
| 
 | |
| var currentNetwork *string
 | |
| 
 | |
| // GetNetworksView - displays the view of all networks
 | |
| func GetNetworksView(networks []string) fyne.CanvasObject {
 | |
| 	// renders := []fyne.CanvasObject{}
 | |
| 	if networks == nil || 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.AddObject(
 | |
| 			container.NewCenter(widget.NewLabel(*network)),
 | |
| 		)
 | |
| 		grid.AddObject(
 | |
| 			components.ColoredIconButton("info", theme.InfoIcon(), func() {
 | |
| 				RefreshComponent(NetDetails, GetSingleNetworkView(*network))
 | |
| 				ShowView(NetDetails)
 | |
| 			}, components.Gold_color),
 | |
| 		)
 | |
| 		grid.AddObject(
 | |
| 			components.ColoredIconButton("pull", theme.DownloadIcon(), func() {
 | |
| 				// TODO call pull with network name
 | |
| 				pull(*network)
 | |
| 			}, components.Blue_color),
 | |
| 		)
 | |
| 		grid.AddObject(
 | |
| 			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 network == "" || 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 += fmt.Sprintf("%s", addr.IP)
 | |
| 		}
 | |
| 		newEntry.Text = peerString
 | |
| 		newEntry.Disable()
 | |
| 		peerView.AddObject(widget.NewLabel(fmt.Sprintf("Peer: %s", p.PublicKey)))
 | |
| 		peerView.AddObject(container.NewVBox(container.NewVBox(endpointEntry), container.NewVBox(newEntry)))
 | |
| 	}
 | |
| 	peerScroller := container.NewVScroll(peerView)
 | |
| 	view.AddObject(peerScroller)
 | |
| 	view.AddObject(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, true)
 | |
| 		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)
 | |
| }
 |