networks.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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(5),
  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. container.NewCenter(widget.NewLabel("Connection status")),
  27. )
  28. for i := range networks {
  29. network := &networks[i]
  30. grid.Add(
  31. container.NewCenter(widget.NewLabel(*network)),
  32. )
  33. grid.Add(
  34. components.ColoredIconButton("info", theme.InfoIcon(), func() {
  35. RefreshComponent(NetDetails, GetSingleNetworkView(*network))
  36. ShowView(NetDetails)
  37. }, components.Gold_color),
  38. )
  39. grid.Add(
  40. components.ColoredIconButton("pull", theme.DownloadIcon(), func() {
  41. // TODO call pull with network name
  42. pull(*network)
  43. }, components.Blue_color),
  44. )
  45. grid.Add(
  46. components.ColoredIconButton("leave", theme.DeleteIcon(), func() {
  47. leave(*network)
  48. }, components.Danger_color),
  49. )
  50. cfg, err := config.ReadConfig(*network)
  51. if err != nil {
  52. fmt.Println(err)
  53. }
  54. if cfg.Node.Connected == "yes" {
  55. grid.Add(
  56. components.ColoredIconButton("disconnect", theme.CheckButtonCheckedIcon(), func() {
  57. disconnect(*network)
  58. }, components.Gravitl_color),
  59. )
  60. } else {
  61. grid.Add(
  62. components.ColoredIconButton("connect", theme.CheckButtonIcon(), func() {
  63. connect(*network)
  64. }, components.Danger_color),
  65. )
  66. }
  67. // renders = append(renders, container.NewCenter(netToolbar))
  68. }
  69. return container.NewCenter(grid)
  70. }
  71. // GetSingleNetworkView - returns details and option to pull a network
  72. func GetSingleNetworkView(network string) fyne.CanvasObject {
  73. if len(network) == 0 {
  74. return container.NewCenter(widget.NewLabel("No valid network selected"))
  75. }
  76. // == read node values ==
  77. LoadingNotify()
  78. nets, err := functions.List(network)
  79. if err != nil || len(nets) < 1 {
  80. ClearNotification()
  81. return container.NewCenter(widget.NewLabel("No data retrieved."))
  82. }
  83. var nodecfg config.ClientConfig
  84. nodecfg.Network = network
  85. nodecfg.ReadConfig()
  86. nodeID := nodecfg.Node.ID
  87. lastCheckInTime := time.Unix(nodecfg.Node.LastCheckIn, 0)
  88. lastCheckIn := lastCheckInTime.Format("2006-01-02 15:04:05")
  89. privateAddr := nodecfg.Node.Address
  90. privateAddr6 := nodecfg.Node.Address6
  91. endpoint := nodecfg.Node.Endpoint
  92. health := " (HEALTHY)"
  93. if time.Now().After(lastCheckInTime.Add(time.Minute * 30)) {
  94. health = " (ERROR)"
  95. } else if time.Now().After(lastCheckInTime.Add(time.Minute * 5)) {
  96. health = " (WARNING)"
  97. }
  98. lastCheckIn += health
  99. version := nodecfg.Node.Version
  100. pullBtn := components.ColoredButton("pull "+network, func() { pull(network) }, components.Blue_color)
  101. pullBtn.Resize(fyne.NewSize(pullBtn.Size().Width, 50))
  102. view := container.NewGridWithColumns(1, widget.NewRichTextFromMarkdown(fmt.Sprintf(`### %s
  103. - ID: %s
  104. - Last Check In: %s
  105. - Endpoint: %s
  106. - Address (IPv4): %s
  107. - Address6 (IPv6): %s
  108. - Version: %s
  109. ### Peers
  110. `, network, nodeID, lastCheckIn, endpoint, privateAddr, privateAddr6, version)),
  111. )
  112. netDetailsView := container.NewCenter(
  113. view,
  114. )
  115. peerView := container.NewVBox()
  116. for _, p := range nets[0].Peers {
  117. peerString := ""
  118. endpointEntry := widget.NewEntry()
  119. endpointEntry.Text = fmt.Sprintf("Endpoint: %s", p.PublicEndpoint)
  120. endpointEntry.Disable()
  121. newEntry := widget.NewEntry()
  122. for i, addr := range p.Addresses {
  123. if i > 0 && i < len(p.Addresses) {
  124. peerString += ", "
  125. }
  126. peerString += addr.IP
  127. }
  128. newEntry.Text = peerString
  129. newEntry.Disable()
  130. peerView.Add(widget.NewLabel(fmt.Sprintf("Peer: %s", p.PublicKey)))
  131. peerView.Add(container.NewVBox(container.NewVBox(endpointEntry), container.NewVBox(newEntry)))
  132. }
  133. peerScroller := container.NewVScroll(peerView)
  134. view.Add(peerScroller)
  135. view.Add(container.NewVBox(pullBtn))
  136. netDetailsView.Refresh()
  137. ClearNotification()
  138. return netDetailsView
  139. }
  140. // == private ==
  141. func pull(network string) {
  142. LoadingNotify()
  143. _, err := functions.Pull(network, true)
  144. if err != nil {
  145. ErrorNotify("Failed to pull " + network + " : " + err.Error())
  146. } else {
  147. SuccessNotify("Pulled " + network + "!")
  148. }
  149. }
  150. func leave(network string) {
  151. confirmView := GetConfirmation("Confirm leaving "+network+"?", func() {
  152. ShowView(Networks)
  153. }, func() {
  154. LoadingNotify()
  155. err := functions.LeaveNetwork(network)
  156. if err != nil {
  157. ErrorNotify("Failed to leave " + network + " : " + err.Error())
  158. } else {
  159. SuccessNotify("Left " + network)
  160. }
  161. networks, err := ncutils.GetSystemNetworks()
  162. if err != nil {
  163. networks = []string{}
  164. ErrorNotify("Failed to read local networks!")
  165. }
  166. RefreshComponent(Networks, GetNetworksView(networks))
  167. ShowView(Networks)
  168. })
  169. RefreshComponent(Confirm, confirmView)
  170. ShowView(Confirm)
  171. }
  172. func connect(network string) {
  173. confirmView := GetConfirmation("Confirm connecting "+network+"?", func() {
  174. ShowView(Networks)
  175. }, func() {
  176. LoadingNotify()
  177. err := functions.Connect(network)
  178. if err != nil {
  179. ErrorNotify("Failed to connect " + network + " : " + err.Error())
  180. } else {
  181. SuccessNotify("connected to " + network)
  182. }
  183. networks, err := ncutils.GetSystemNetworks()
  184. if err != nil {
  185. networks = []string{}
  186. ErrorNotify("Failed to read local networks!")
  187. }
  188. RefreshComponent(Networks, GetNetworksView(networks))
  189. ShowView(Networks)
  190. })
  191. RefreshComponent(Confirm, confirmView)
  192. ShowView(Confirm)
  193. }
  194. func disconnect(network string) {
  195. confirmView := GetConfirmation("Confirm disconnecting "+network+"?", func() {
  196. ShowView(Networks)
  197. }, func() {
  198. LoadingNotify()
  199. fmt.Println(network)
  200. err := functions.Disconnect(network)
  201. if err != nil {
  202. ErrorNotify("Failed to disconnect " + network + " : " + err.Error())
  203. } else {
  204. SuccessNotify("disconnected from " + network)
  205. }
  206. networks, err := ncutils.GetSystemNetworks()
  207. if err != nil {
  208. networks = []string{}
  209. ErrorNotify("Failed to read local networks!")
  210. }
  211. RefreshComponent(Networks, GetNetworksView(networks))
  212. ShowView(Networks)
  213. })
  214. RefreshComponent(Confirm, confirmView)
  215. ShowView(Confirm)
  216. }