nodes.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. package logic
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "net"
  7. "sort"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "github.com/go-playground/validator/v10"
  12. "github.com/gravitl/netmaker/database"
  13. "github.com/gravitl/netmaker/logger"
  14. "github.com/gravitl/netmaker/models"
  15. "github.com/gravitl/netmaker/servercfg"
  16. "github.com/gravitl/netmaker/validation"
  17. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  18. )
  19. // GetNetworkNodes - gets the nodes of a network
  20. func GetNetworkNodes(network string) ([]models.Node, error) {
  21. var nodes = []models.Node{}
  22. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  23. if err != nil {
  24. if database.IsEmptyRecord(err) {
  25. return []models.Node{}, nil
  26. }
  27. return nodes, err
  28. }
  29. for _, value := range collection {
  30. var node models.Node
  31. err := json.Unmarshal([]byte(value), &node)
  32. if err != nil {
  33. continue
  34. }
  35. if node.Network == network {
  36. nodes = append(nodes, node)
  37. }
  38. }
  39. return nodes, nil
  40. }
  41. // GetSortedNetworkServerNodes - gets nodes of a network, except sorted by update time
  42. func GetSortedNetworkServerNodes(network string) ([]models.Node, error) {
  43. var nodes []models.Node
  44. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  45. if err != nil {
  46. if database.IsEmptyRecord(err) {
  47. return []models.Node{}, nil
  48. }
  49. return nodes, err
  50. }
  51. for _, value := range collection {
  52. var node models.Node
  53. err := json.Unmarshal([]byte(value), &node)
  54. if err != nil {
  55. continue
  56. }
  57. if node.Network == network && node.IsServer == "yes" {
  58. nodes = append(nodes, node)
  59. }
  60. }
  61. sort.Sort(models.NodesArray(nodes))
  62. return nodes, nil
  63. }
  64. // UncordonNode - approves a node to join a network
  65. func UncordonNode(nodeid string) (models.Node, error) {
  66. node, err := GetNodeByID(nodeid)
  67. if err != nil {
  68. return models.Node{}, err
  69. }
  70. node.SetLastModified()
  71. node.IsPending = "no"
  72. node.PullChanges = "yes"
  73. data, err := json.Marshal(&node)
  74. if err != nil {
  75. return node, err
  76. }
  77. err = database.Insert(node.ID, string(data), database.NODES_TABLE_NAME)
  78. return node, err
  79. }
  80. // GetWGNodePeers - gets the wg peers of a given node
  81. func GetWGNodePeers(node *models.Node) ([]wgtypes.PeerConfig, error){
  82. var peers []wgtypes.PeerConfig
  83. var peerData wgtypes.PeerConfig
  84. nodes, err := GetPeers(node)
  85. if err != nil {
  86. return peers, err
  87. }
  88. logger.Log(0, "the peers of " + node.Name + " are:")
  89. for _, peer := range nodes {
  90. logger.Log(0, "peer: " + peer.Name)
  91. }
  92. for _, peer := range nodes {
  93. //this should not happen but it does
  94. if peer.Name == node.Name {
  95. logger.Log(0, "GetPeers returned me " + node.Name)
  96. continue
  97. }
  98. pubkey, err :=wgtypes.ParseKey(peer.PublicKey)
  99. if err != nil {
  100. logger.Log(0, "ParseKey failed " +err.Error())
  101. continue
  102. }
  103. endpoint := peer.Endpoint + ":" + strconv.Itoa(int(peer.ListenPort))
  104. address, err := net.ResolveUDPAddr("udp", endpoint)
  105. if err != nil {
  106. logger.Log(0, "could not resolve endpoint " + err.Error())
  107. continue
  108. }
  109. ///Persitent Keepalive
  110. //Allowed IPs
  111. peerData = wgtypes.PeerConfig{
  112. PublicKey: pubkey,
  113. Endpoint: address,
  114. }
  115. peers = append (peers, peerData)
  116. }
  117. return peers, nil
  118. }
  119. // GetPeers - gets a list of nodes that are peers of a given node
  120. func GetPeers(node *models.Node) ([]models.Node, error) {
  121. //if IsLeader(node) {
  122. // logger.Log(0, node.Name + " is a leader")
  123. // SetNetworkServerPeers(node)
  124. //}
  125. excludeIsRelayed := node.IsRelay != "yes"
  126. var relayedNode string
  127. if node.IsRelayed == "yes" {
  128. relayedNode = node.Address
  129. }
  130. peers, err := GetPeersList(node.Network, excludeIsRelayed, relayedNode)
  131. if err != nil {
  132. return nil, err
  133. }
  134. return peers, nil
  135. }
  136. // IsLeader - determines if a given server node is a leader
  137. func IsLeader(node *models.Node) bool {
  138. nodes, err := GetSortedNetworkServerNodes(node.Network)
  139. if err != nil {
  140. logger.Log(0, "ERROR: COULD NOT RETRIEVE SERVER NODES. THIS WILL BREAK HOLE PUNCHING.")
  141. return false
  142. }
  143. for _, n := range nodes {
  144. if n.LastModified > time.Now().Add(-1*time.Minute).Unix() {
  145. return n.Address == node.Address
  146. }
  147. }
  148. return len(nodes) <= 1 || nodes[1].Address == node.Address
  149. }
  150. // == DB related functions ==
  151. // UpdateNode - takes a node and updates another node with it's values
  152. func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
  153. newNode.Fill(currentNode)
  154. if err := ValidateNode(newNode, true); err != nil {
  155. return err
  156. }
  157. if newNode.ID == currentNode.ID {
  158. newNode.SetLastModified()
  159. if data, err := json.Marshal(newNode); err != nil {
  160. return err
  161. } else {
  162. return database.Insert(newNode.ID, string(data), database.NODES_TABLE_NAME)
  163. }
  164. }
  165. return fmt.Errorf("failed to update node " + newNode.MacAddress + ", cannot change macaddress.")
  166. }
  167. // IsNodeIDUnique - checks if node id is unique
  168. func IsNodeIDUnique(node *models.Node) (bool, error) {
  169. _, err := database.FetchRecord(database.NODES_TABLE_NAME, node.ID)
  170. return database.IsEmptyRecord(err), err
  171. }
  172. // ValidateNode - validates node values
  173. func ValidateNode(node *models.Node, isUpdate bool) error {
  174. v := validator.New()
  175. _ = v.RegisterValidation("macaddress_unique", func(fl validator.FieldLevel) bool {
  176. if isUpdate {
  177. return true
  178. }
  179. isFieldUnique, _ := IsNodeIDUnique(node)
  180. return isFieldUnique
  181. })
  182. _ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool {
  183. _, err := GetNetworkByNode(node)
  184. return err == nil
  185. })
  186. _ = v.RegisterValidation("in_charset", func(fl validator.FieldLevel) bool {
  187. isgood := node.NameInNodeCharSet()
  188. return isgood
  189. })
  190. _ = v.RegisterValidation("checkyesorno", func(fl validator.FieldLevel) bool {
  191. return validation.CheckYesOrNo(fl)
  192. })
  193. err := v.Struct(node)
  194. return err
  195. }
  196. // GetAllNodes - returns all nodes in the DB
  197. func GetAllNodes() ([]models.Node, error) {
  198. var nodes []models.Node
  199. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  200. if err != nil {
  201. if database.IsEmptyRecord(err) {
  202. return []models.Node{}, nil
  203. }
  204. return []models.Node{}, err
  205. }
  206. for _, value := range collection {
  207. var node models.Node
  208. if err := json.Unmarshal([]byte(value), &node); err != nil {
  209. return []models.Node{}, err
  210. }
  211. // add node to our array
  212. nodes = append(nodes, node)
  213. }
  214. return nodes, nil
  215. }
  216. // CheckIsServer - check if a node is the server node
  217. func CheckIsServer(node *models.Node) bool {
  218. nodeData, err := database.FetchRecords(database.NODES_TABLE_NAME)
  219. if err != nil && !database.IsEmptyRecord(err) {
  220. return false
  221. }
  222. for _, value := range nodeData {
  223. var tmpNode models.Node
  224. if err := json.Unmarshal([]byte(value), &tmpNode); err != nil {
  225. continue
  226. }
  227. if tmpNode.Network == node.Network && tmpNode.MacAddress != node.MacAddress {
  228. return false
  229. }
  230. }
  231. return true
  232. }
  233. // GetNetworkByNode - gets the network model from a node
  234. func GetNetworkByNode(node *models.Node) (models.Network, error) {
  235. var network = models.Network{}
  236. networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, node.Network)
  237. if err != nil {
  238. return network, err
  239. }
  240. if err = json.Unmarshal([]byte(networkData), &network); err != nil {
  241. return models.Network{}, err
  242. }
  243. return network, nil
  244. }
  245. // SetNodeDefaults - sets the defaults of a node to avoid empty fields
  246. func SetNodeDefaults(node *models.Node) {
  247. //TODO: Maybe I should make Network a part of the node struct. Then we can just query the Network object for stuff.
  248. parentNetwork, _ := GetNetworkByNode(node)
  249. node.ExpirationDateTime = time.Now().Unix() + models.TEN_YEARS_IN_SECONDS
  250. if node.ListenPort == 0 {
  251. node.ListenPort = parentNetwork.DefaultListenPort
  252. }
  253. if node.SaveConfig == "" {
  254. if parentNetwork.DefaultSaveConfig != "" {
  255. node.SaveConfig = parentNetwork.DefaultSaveConfig
  256. } else {
  257. node.SaveConfig = "yes"
  258. }
  259. }
  260. if node.Interface == "" {
  261. node.Interface = parentNetwork.DefaultInterface
  262. }
  263. if node.PersistentKeepalive == 0 {
  264. node.PersistentKeepalive = parentNetwork.DefaultKeepalive
  265. }
  266. if node.PostUp == "" {
  267. postup := parentNetwork.DefaultPostUp
  268. node.PostUp = postup
  269. }
  270. if node.PostDown == "" {
  271. postdown := parentNetwork.DefaultPostDown
  272. node.PostDown = postdown
  273. }
  274. if node.IsStatic == "" {
  275. node.IsStatic = "no"
  276. }
  277. if node.UDPHolePunch == "" {
  278. node.UDPHolePunch = parentNetwork.DefaultUDPHolePunch
  279. if node.UDPHolePunch == "" {
  280. node.UDPHolePunch = "yes"
  281. }
  282. }
  283. // == Parent Network settings ==
  284. if node.IsDualStack == "" {
  285. node.IsDualStack = parentNetwork.IsDualStack
  286. }
  287. if node.MTU == 0 {
  288. node.MTU = parentNetwork.DefaultMTU
  289. }
  290. // == node defaults if not set by parent ==
  291. node.SetIPForwardingDefault()
  292. node.SetDNSOnDefault()
  293. node.SetIsLocalDefault()
  294. node.SetIsDualStackDefault()
  295. node.SetLastModified()
  296. node.SetDefaultName()
  297. node.SetLastCheckIn()
  298. node.SetLastPeerUpdate()
  299. node.SetRoamingDefault()
  300. node.SetPullChangesDefault()
  301. node.SetDefaultAction()
  302. node.SetIsServerDefault()
  303. node.SetIsStaticDefault()
  304. node.SetDefaultEgressGateway()
  305. node.SetDefaultIngressGateway()
  306. node.SetDefaulIsPending()
  307. node.SetDefaultMTU()
  308. node.SetDefaultIsRelayed()
  309. node.SetDefaultIsRelay()
  310. node.KeyUpdateTimeStamp = time.Now().Unix()
  311. }
  312. // GetRecordKey - get record key
  313. // depricated
  314. func GetRecordKey(id string, network string) (string, error) {
  315. if id == "" || network == "" {
  316. return "", errors.New("unable to get record key")
  317. }
  318. return id + "###" + network, nil
  319. }
  320. // GetNodeByMacAddress - gets a node by mac address
  321. func GetNodeByMacAddress(network string, macaddress string) (models.Node, error) {
  322. var node models.Node
  323. key, err := GetRecordKey(macaddress, network)
  324. if err != nil {
  325. return node, err
  326. }
  327. record, err := database.FetchRecord(database.NODES_TABLE_NAME, key)
  328. if err != nil {
  329. return models.Node{}, err
  330. }
  331. if err = json.Unmarshal([]byte(record), &node); err != nil {
  332. return models.Node{}, err
  333. }
  334. SetNodeDefaults(&node)
  335. return node, nil
  336. }
  337. // GetDeletedNodeByMacAddress - get a deleted node
  338. func GetDeletedNodeByMacAddress(network string, macaddress string) (models.Node, error) {
  339. var node models.Node
  340. key, err := GetRecordKey(macaddress, network)
  341. if err != nil {
  342. return node, err
  343. }
  344. record, err := database.FetchRecord(database.DELETED_NODES_TABLE_NAME, key)
  345. if err != nil {
  346. return models.Node{}, err
  347. }
  348. if err = json.Unmarshal([]byte(record), &node); err != nil {
  349. return models.Node{}, err
  350. }
  351. SetNodeDefaults(&node)
  352. return node, nil
  353. }
  354. // GetNodeRelay - gets the relay node of a given network
  355. func GetNodeRelay(network string, relayedNodeAddr string) (models.Node, error) {
  356. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  357. var relay models.Node
  358. if err != nil {
  359. if database.IsEmptyRecord(err) {
  360. return relay, nil
  361. }
  362. logger.Log(2, err.Error())
  363. return relay, err
  364. }
  365. for _, value := range collection {
  366. err := json.Unmarshal([]byte(value), &relay)
  367. if err != nil {
  368. logger.Log(2, err.Error())
  369. continue
  370. }
  371. if relay.IsRelay == "yes" {
  372. for _, addr := range relay.RelayAddrs {
  373. if addr == relayedNodeAddr {
  374. return relay, nil
  375. }
  376. }
  377. }
  378. }
  379. return relay, errors.New("could not find relay for node " + relayedNodeAddr)
  380. }
  381. // GetNodeByIDorMacAddress - gets the node, if a mac address exists, but not id, then it should delete it and recreate in DB with new ID
  382. func GetNodeByIDorMacAddress(uuid string, macaddress string, network string) (models.Node, error) {
  383. var node models.Node
  384. var err error
  385. node, err = GetNodeByID(uuid)
  386. if err != nil && macaddress != "" && network != "" {
  387. node, err = GetNodeByMacAddress(network, macaddress)
  388. if err != nil {
  389. return models.Node{}, err
  390. }
  391. err = DeleteNodeByMacAddress(&node, true) // remove node
  392. if err != nil {
  393. return models.Node{}, err
  394. }
  395. err = CreateNode(&node)
  396. if err != nil {
  397. return models.Node{}, err
  398. }
  399. logger.Log(2, "rewriting legacy node data; node now has id,", node.ID)
  400. node.PullChanges = "yes"
  401. }
  402. return node, err
  403. }
  404. // GetNodeByID - get node by uuid, should have been set by create
  405. func GetNodeByID(uuid string) (models.Node, error) {
  406. var record, err = database.FetchRecord(database.NODES_TABLE_NAME, uuid)
  407. if err != nil {
  408. return models.Node{}, err
  409. }
  410. var node models.Node
  411. if err = json.Unmarshal([]byte(record), &node); err != nil {
  412. return models.Node{}, err
  413. }
  414. return node, nil
  415. }
  416. // GetDeletedNodeByID - get a deleted node
  417. func GetDeletedNodeByID(uuid string) (models.Node, error) {
  418. var node models.Node
  419. record, err := database.FetchRecord(database.DELETED_NODES_TABLE_NAME, uuid)
  420. if err != nil {
  421. return models.Node{}, err
  422. }
  423. if err = json.Unmarshal([]byte(record), &node); err != nil {
  424. return models.Node{}, err
  425. }
  426. SetNodeDefaults(&node)
  427. return node, nil
  428. }
  429. // GetNetworkServerNodeID - get network server node ID if exists
  430. func GetNetworkServerNodeID(network string) (string, error) {
  431. var nodes, err = GetNetworkNodes(network)
  432. if err != nil {
  433. return "", err
  434. }
  435. for _, node := range nodes {
  436. if node.IsServer == "yes" {
  437. if servercfg.GetNodeID() != "" {
  438. if servercfg.GetNodeID() == node.MacAddress {
  439. if strings.Contains(node.ID, "###") {
  440. DeleteNodeByMacAddress(&node, true)
  441. logger.Log(1, "deleted legacy server node on network "+node.Network)
  442. return "", errors.New("deleted legacy server node on network " + node.Network)
  443. }
  444. return node.ID, nil
  445. }
  446. continue
  447. }
  448. return node.ID, nil
  449. }
  450. }
  451. return "", errors.New("could not find server node")
  452. }