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