networks.go 4.7 KB

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