networks.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package views
  2. import (
  3. "fmt"
  4. "time"
  5. "fyne.io/fyne/v2"
  6. "fyne.io/fyne/v2/container"
  7. "fyne.io/fyne/v2/layout"
  8. "fyne.io/fyne/v2/theme"
  9. "fyne.io/fyne/v2/widget"
  10. "github.com/gravitl/netmaker/netclient/config"
  11. "github.com/gravitl/netmaker/netclient/functions"
  12. "github.com/gravitl/netmaker/netclient/gui/components"
  13. "github.com/gravitl/netmaker/netclient/ncutils"
  14. )
  15. var currentNetwork *string
  16. // GetNetworksView - displays the view of all networks
  17. func GetNetworksView(networks []string) fyne.CanvasObject {
  18. // renders := []fyne.CanvasObject{}
  19. if networks == nil || len(networks) == 0 {
  20. return container.NewCenter(widget.NewLabel("No networks present"))
  21. }
  22. grid := container.New(layout.NewGridLayout(4),
  23. container.NewCenter(widget.NewLabel("Network Name")),
  24. container.NewCenter(widget.NewLabel("Node Info")),
  25. container.NewCenter(widget.NewLabel("Pull Latest")),
  26. container.NewCenter(widget.NewLabel("Leave network")),
  27. )
  28. for i := range networks {
  29. network := &networks[i]
  30. grid.AddObject(
  31. container.NewCenter(widget.NewLabel(*network)),
  32. )
  33. grid.AddObject(
  34. components.ColoredIconButton("info", theme.InfoIcon(), func() {
  35. RefreshComponent(NetDetails, GetSingleNetworkView(*network))
  36. ShowView(NetDetails)
  37. }, components.Gold_color),
  38. )
  39. grid.AddObject(
  40. components.ColoredIconButton("pull", theme.DownloadIcon(), func() {
  41. // TODO call pull with network name
  42. pull(*network)
  43. }, components.Blue_color),
  44. )
  45. grid.AddObject(
  46. components.ColoredIconButton("leave", theme.DeleteIcon(), func() {
  47. leave(*network)
  48. }, components.Danger_color),
  49. )
  50. // renders = append(renders, container.NewCenter(netToolbar))
  51. }
  52. return container.NewCenter(grid)
  53. }
  54. // GetSingleNetworkView - returns details and option to pull a network
  55. func GetSingleNetworkView(network string) fyne.CanvasObject {
  56. if network == "" || len(network) == 0 {
  57. return container.NewCenter(widget.NewLabel("No valid network selected"))
  58. }
  59. // == read node values ==
  60. LoadingNotify()
  61. nets, err := functions.List(network)
  62. if err != nil || len(nets) < 1 {
  63. ClearNotification()
  64. return container.NewCenter(widget.NewLabel("No data retrieved."))
  65. }
  66. var nodecfg config.ClientConfig
  67. nodecfg.Network = network
  68. nodecfg.ReadConfig()
  69. nodeID := nodecfg.Node.ID
  70. lastCheckInTime := time.Unix(nodecfg.Node.LastCheckIn, 0)
  71. lastCheckIn := lastCheckInTime.Format("2006-01-02 15:04:05")
  72. privateAddr := nodecfg.Node.Address
  73. privateAddr6 := nodecfg.Node.Address6
  74. endpoint := nodecfg.Node.Endpoint
  75. health := " (HEALTHY)"
  76. if time.Now().After(lastCheckInTime.Add(time.Minute * 30)) {
  77. health = " (ERROR)"
  78. } else if time.Now().After(lastCheckInTime.Add(time.Minute * 5)) {
  79. health = " (WARNING)"
  80. }
  81. lastCheckIn += health
  82. version := nodecfg.Node.Version
  83. pullBtn := components.ColoredButton("pull "+network, func() { pull(network) }, components.Blue_color)
  84. pullBtn.Resize(fyne.NewSize(pullBtn.Size().Width, 50))
  85. view := container.NewGridWithColumns(1, widget.NewRichTextFromMarkdown(fmt.Sprintf(`### %s
  86. - ID: %s
  87. - Last Check In: %s
  88. - Endpoint: %s
  89. - Address (IPv4): %s
  90. - Address6 (IPv6): %s
  91. - Version: %s
  92. ### Peers
  93. `, network, nodeID, lastCheckIn, endpoint, privateAddr, privateAddr6, version)),
  94. )
  95. netDetailsView := container.NewCenter(
  96. view,
  97. )
  98. peerView := container.NewVBox()
  99. for _, p := range nets[0].Peers {
  100. peerString := ""
  101. endpointEntry := widget.NewEntry()
  102. endpointEntry.Text = fmt.Sprintf("Endpoint: %s", p.PublicEndpoint)
  103. endpointEntry.Disable()
  104. newEntry := widget.NewEntry()
  105. for i, addr := range p.Addresses {
  106. if i > 0 && i < len(p.Addresses) {
  107. peerString += ", "
  108. }
  109. peerString += fmt.Sprintf("%s", addr.IP)
  110. }
  111. newEntry.Text = peerString
  112. newEntry.Disable()
  113. peerView.AddObject(widget.NewLabel(fmt.Sprintf("Peer: %s", p.PublicKey)))
  114. peerView.AddObject(container.NewVBox(container.NewVBox(endpointEntry), container.NewVBox(newEntry)))
  115. }
  116. peerScroller := container.NewVScroll(peerView)
  117. view.AddObject(peerScroller)
  118. view.AddObject(container.NewVBox(pullBtn))
  119. netDetailsView.Refresh()
  120. ClearNotification()
  121. return netDetailsView
  122. }
  123. // == private ==
  124. func pull(network string) {
  125. LoadingNotify()
  126. _, err := functions.Pull(network, true)
  127. if err != nil {
  128. ErrorNotify("Failed to pull " + network + " : " + err.Error())
  129. } else {
  130. SuccessNotify("Pulled " + network + "!")
  131. }
  132. }
  133. func leave(network string) {
  134. confirmView := GetConfirmation("Confirm leaving "+network+"?", func() {
  135. ShowView(Networks)
  136. }, func() {
  137. LoadingNotify()
  138. err := functions.LeaveNetwork(network, true)
  139. if err != nil {
  140. ErrorNotify("Failed to leave " + network + " : " + err.Error())
  141. } else {
  142. SuccessNotify("Left " + network)
  143. }
  144. networks, err := ncutils.GetSystemNetworks()
  145. if err != nil {
  146. networks = []string{}
  147. ErrorNotify("Failed to read local networks!")
  148. }
  149. RefreshComponent(Networks, GetNetworksView(networks))
  150. ShowView(Networks)
  151. })
  152. RefreshComponent(Confirm, confirmView)
  153. ShowView(Confirm)
  154. }