networks.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693
  1. package logic
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "net"
  7. "os/exec"
  8. "strings"
  9. "time"
  10. "github.com/go-playground/validator/v10"
  11. "github.com/gravitl/netmaker/database"
  12. "github.com/gravitl/netmaker/logger"
  13. "github.com/gravitl/netmaker/models"
  14. "github.com/gravitl/netmaker/netclient/ncutils"
  15. "github.com/gravitl/netmaker/validation"
  16. )
  17. // GetNetworks - returns all networks from database
  18. func GetNetworks() ([]models.Network, error) {
  19. var networks []models.Network
  20. collection, err := database.FetchRecords(database.NETWORKS_TABLE_NAME)
  21. if err != nil {
  22. return networks, err
  23. }
  24. for _, value := range collection {
  25. var network models.Network
  26. if err := json.Unmarshal([]byte(value), &network); err != nil {
  27. return networks, err
  28. }
  29. // add network our array
  30. networks = append(networks, network)
  31. }
  32. return networks, err
  33. }
  34. // DeleteNetwork - deletes a network
  35. func DeleteNetwork(network string) error {
  36. nodeCount, err := GetNetworkNonServerNodeCount(network)
  37. if nodeCount == 0 || database.IsEmptyRecord(err) {
  38. // delete server nodes first then db records
  39. servers, err := GetSortedNetworkServerNodes(network)
  40. if err == nil {
  41. for _, s := range servers {
  42. if err = DeleteNodeByID(&s, true); err != nil {
  43. logger.Log(2, "could not removed server", s.Name, "before deleting network", network)
  44. } else {
  45. logger.Log(2, "removed server", s.Name, "before deleting network", network)
  46. }
  47. }
  48. } else {
  49. logger.Log(1, "could not remove servers before deleting network", network)
  50. }
  51. return database.DeleteRecord(database.NETWORKS_TABLE_NAME, network)
  52. }
  53. return errors.New("node check failed. All nodes must be deleted before deleting network")
  54. }
  55. // CreateNetwork - creates a network in database
  56. func CreateNetwork(network models.Network) error {
  57. network.SetDefaults()
  58. network.SetNodesLastModified()
  59. network.SetNetworkLastModified()
  60. network.KeyUpdateTimeStamp = time.Now().Unix()
  61. err := ValidateNetwork(&network, false)
  62. if err != nil {
  63. //returnErrorResponse(w, r, formatError(err, "badrequest"))
  64. return err
  65. }
  66. data, err := json.Marshal(&network)
  67. if err != nil {
  68. return err
  69. }
  70. if err = database.Insert(network.NetID, string(data), database.NETWORKS_TABLE_NAME); err != nil {
  71. return err
  72. }
  73. return err
  74. }
  75. // NetworkNodesUpdatePullChanges - tells nodes on network to pull
  76. func NetworkNodesUpdatePullChanges(networkName string) error {
  77. collections, err := database.FetchRecords(database.NODES_TABLE_NAME)
  78. if err != nil {
  79. if database.IsEmptyRecord(err) {
  80. return nil
  81. }
  82. return err
  83. }
  84. for _, value := range collections {
  85. var node models.Node
  86. err := json.Unmarshal([]byte(value), &node)
  87. if err != nil {
  88. fmt.Println("error in node address assignment!")
  89. return err
  90. }
  91. if node.Network == networkName {
  92. node.PullChanges = "yes"
  93. data, err := json.Marshal(&node)
  94. if err != nil {
  95. return err
  96. }
  97. database.Insert(node.ID, string(data), database.NODES_TABLE_NAME)
  98. }
  99. }
  100. return nil
  101. }
  102. // GetNetworkNonServerNodeCount - get number of network non server nodes
  103. func GetNetworkNonServerNodeCount(networkName string) (int, error) {
  104. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  105. count := 0
  106. if err != nil && !database.IsEmptyRecord(err) {
  107. return count, err
  108. }
  109. for _, value := range collection {
  110. var node models.Node
  111. if err = json.Unmarshal([]byte(value), &node); err != nil {
  112. return count, err
  113. } else {
  114. if node.Network == networkName && node.IsServer != "yes" {
  115. count++
  116. }
  117. }
  118. }
  119. return count, nil
  120. }
  121. // GetParentNetwork - get parent network
  122. func GetParentNetwork(networkname string) (models.Network, error) {
  123. var network models.Network
  124. networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, networkname)
  125. if err != nil {
  126. return network, err
  127. }
  128. if err = json.Unmarshal([]byte(networkData), &network); err != nil {
  129. return models.Network{}, err
  130. }
  131. return network, nil
  132. }
  133. // GetParentNetwork - get parent network
  134. func GetNetworkSettings(networkname string) (models.Network, error) {
  135. var network models.Network
  136. networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, networkname)
  137. if err != nil {
  138. return network, err
  139. }
  140. if err = json.Unmarshal([]byte(networkData), &network); err != nil {
  141. return models.Network{}, err
  142. }
  143. network.AccessKeys = []models.AccessKey{}
  144. return network, nil
  145. }
  146. // UniqueAddress - see if address is unique
  147. func UniqueAddress(networkName string) (string, error) {
  148. var network models.Network
  149. network, err := GetParentNetwork(networkName)
  150. if err != nil {
  151. fmt.Println("UniqueAddress encountered an error")
  152. return "666", err
  153. }
  154. offset := true
  155. ip, ipnet, err := net.ParseCIDR(network.AddressRange)
  156. if err != nil {
  157. fmt.Println("UniqueAddress encountered an error")
  158. return "666", err
  159. }
  160. for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); Inc(ip) {
  161. if offset {
  162. offset = false
  163. continue
  164. }
  165. if networkName == "comms" {
  166. if IsIPUnique(networkName, ip.String(), database.INT_CLIENTS_TABLE_NAME, false) {
  167. return ip.String(), err
  168. }
  169. } else {
  170. if IsIPUnique(networkName, ip.String(), database.NODES_TABLE_NAME, false) && IsIPUnique(networkName, ip.String(), database.EXT_CLIENT_TABLE_NAME, false) {
  171. return ip.String(), err
  172. }
  173. }
  174. }
  175. //TODO
  176. err1 := errors.New("ERROR: No unique addresses available. Check network subnet.")
  177. return "W1R3: NO UNIQUE ADDRESSES AVAILABLE", err1
  178. }
  179. // IsIPUnique - checks if an IP is unique
  180. func IsIPUnique(network string, ip string, tableName string, isIpv6 bool) bool {
  181. isunique := true
  182. collection, err := database.FetchRecords(tableName)
  183. if err != nil {
  184. return isunique
  185. }
  186. for _, value := range collection { // filter
  187. var node models.Node
  188. if err = json.Unmarshal([]byte(value), &node); err != nil {
  189. continue
  190. }
  191. if isIpv6 {
  192. if node.Address6 == ip && node.Network == network {
  193. return false
  194. }
  195. } else {
  196. if node.Address == ip && node.Network == network {
  197. return false
  198. }
  199. }
  200. }
  201. return isunique
  202. }
  203. // UniqueAddress6 - see if ipv6 address is unique
  204. func UniqueAddress6(networkName string) (string, error) {
  205. var network models.Network
  206. network, err := GetParentNetwork(networkName)
  207. if err != nil {
  208. fmt.Println("Network Not Found")
  209. return "", err
  210. }
  211. if network.IsDualStack == "no" {
  212. return "", nil
  213. }
  214. offset := true
  215. ip, ipnet, err := net.ParseCIDR(network.AddressRange6)
  216. if err != nil {
  217. fmt.Println("UniqueAddress6 encountered an error")
  218. return "666", err
  219. }
  220. for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); Inc(ip) {
  221. if offset {
  222. offset = false
  223. continue
  224. }
  225. if IsIPUnique(networkName, ip.String(), database.NODES_TABLE_NAME, true) {
  226. return ip.String(), err
  227. }
  228. }
  229. //TODO
  230. err1 := errors.New("ERROR: No unique addresses available. Check network subnet.")
  231. return "W1R3: NO UNIQUE ADDRESSES AVAILABLE", err1
  232. }
  233. // GetLocalIP - gets the local ip
  234. func GetLocalIP(node models.Node) string {
  235. var local string
  236. ifaces, err := net.Interfaces()
  237. if err != nil {
  238. return local
  239. }
  240. _, localrange, err := net.ParseCIDR(node.LocalRange)
  241. if err != nil {
  242. return local
  243. }
  244. found := false
  245. for _, i := range ifaces {
  246. if i.Flags&net.FlagUp == 0 {
  247. continue // interface down
  248. }
  249. if i.Flags&net.FlagLoopback != 0 {
  250. continue // loopback interface
  251. }
  252. addrs, err := i.Addrs()
  253. if err != nil {
  254. return local
  255. }
  256. for _, addr := range addrs {
  257. var ip net.IP
  258. switch v := addr.(type) {
  259. case *net.IPNet:
  260. if !found {
  261. ip = v.IP
  262. local = ip.String()
  263. if node.IsLocal == "yes" {
  264. found = localrange.Contains(ip)
  265. } else {
  266. found = true
  267. }
  268. }
  269. case *net.IPAddr:
  270. if !found {
  271. ip = v.IP
  272. local = ip.String()
  273. if node.IsLocal == "yes" {
  274. found = localrange.Contains(ip)
  275. } else {
  276. found = true
  277. }
  278. }
  279. }
  280. }
  281. }
  282. return local
  283. }
  284. // UpdateNetworkLocalAddresses - updates network localaddresses
  285. func UpdateNetworkLocalAddresses(networkName string) error {
  286. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  287. if err != nil {
  288. return err
  289. }
  290. for _, value := range collection {
  291. var node models.Node
  292. err := json.Unmarshal([]byte(value), &node)
  293. if err != nil {
  294. fmt.Println("error in node address assignment!")
  295. return err
  296. }
  297. if node.Network == networkName {
  298. ipaddr, iperr := UniqueAddress(networkName)
  299. if iperr != nil {
  300. fmt.Println("error in node address assignment!")
  301. return iperr
  302. }
  303. node.Address = ipaddr
  304. newNodeData, err := json.Marshal(&node)
  305. if err != nil {
  306. fmt.Println("error in node address assignment!")
  307. return err
  308. }
  309. database.Insert(node.ID, string(newNodeData), database.NODES_TABLE_NAME)
  310. }
  311. }
  312. return nil
  313. }
  314. // RemoveNetworkNodeIPv6Addresses - removes network node IPv6 addresses
  315. func RemoveNetworkNodeIPv6Addresses(networkName string) error {
  316. collections, err := database.FetchRecords(database.NODES_TABLE_NAME)
  317. if err != nil {
  318. return err
  319. }
  320. for _, value := range collections {
  321. var node models.Node
  322. err := json.Unmarshal([]byte(value), &node)
  323. if err != nil {
  324. fmt.Println("error in node address assignment!")
  325. return err
  326. }
  327. if node.Network == networkName {
  328. node.IsDualStack = "no"
  329. node.Address6 = ""
  330. node.PullChanges = "yes"
  331. data, err := json.Marshal(&node)
  332. if err != nil {
  333. return err
  334. }
  335. database.Insert(node.ID, string(data), database.NODES_TABLE_NAME)
  336. }
  337. }
  338. return nil
  339. }
  340. // UpdateNetworkNodeAddresses - updates network node addresses
  341. func UpdateNetworkNodeAddresses(networkName string) error {
  342. collections, err := database.FetchRecords(database.NODES_TABLE_NAME)
  343. if err != nil {
  344. return err
  345. }
  346. for _, value := range collections {
  347. var node models.Node
  348. err := json.Unmarshal([]byte(value), &node)
  349. if err != nil {
  350. fmt.Println("error in node address assignment!")
  351. return err
  352. }
  353. if node.Network == networkName {
  354. ipaddr, iperr := UniqueAddress(networkName)
  355. if iperr != nil {
  356. fmt.Println("error in node address assignment!")
  357. return iperr
  358. }
  359. node.Address = ipaddr
  360. node.PullChanges = "yes"
  361. data, err := json.Marshal(&node)
  362. if err != nil {
  363. return err
  364. }
  365. database.Insert(node.ID, string(data), database.NODES_TABLE_NAME)
  366. }
  367. }
  368. return nil
  369. }
  370. // IsNetworkDisplayNameUnique - checks if displayname is unique from other networks
  371. func IsNetworkDisplayNameUnique(network *models.Network) (bool, error) {
  372. isunique := true
  373. records, err := GetNetworks()
  374. if err != nil && !database.IsEmptyRecord(err) {
  375. return false, err
  376. }
  377. for i := 0; i < len(records); i++ {
  378. if network.NetID == records[i].DisplayName {
  379. isunique = false
  380. }
  381. }
  382. return isunique, nil
  383. }
  384. // IsNetworkNameUnique - checks to see if any other networks have the same name (id)
  385. func IsNetworkNameUnique(network *models.Network) (bool, error) {
  386. isunique := true
  387. dbs, err := GetNetworks()
  388. if err != nil && !database.IsEmptyRecord(err) {
  389. return false, err
  390. }
  391. for i := 0; i < len(dbs); i++ {
  392. if network.NetID == dbs[i].NetID {
  393. isunique = false
  394. }
  395. }
  396. return isunique, nil
  397. }
  398. // UpdateNetwork - updates a network with another network's fields
  399. func UpdateNetwork(currentNetwork *models.Network, newNetwork *models.Network) (bool, bool, error) {
  400. if err := ValidateNetwork(newNetwork, true); err != nil {
  401. return false, false, err
  402. }
  403. if newNetwork.NetID == currentNetwork.NetID {
  404. hasrangeupdate := newNetwork.AddressRange != currentNetwork.AddressRange
  405. localrangeupdate := newNetwork.LocalRange != currentNetwork.LocalRange
  406. data, err := json.Marshal(newNetwork)
  407. if err != nil {
  408. return false, false, err
  409. }
  410. newNetwork.SetNetworkLastModified()
  411. err = database.Insert(newNetwork.NetID, string(data), database.NETWORKS_TABLE_NAME)
  412. return hasrangeupdate, localrangeupdate, err
  413. }
  414. // copy values
  415. return false, false, errors.New("failed to update network " + newNetwork.NetID + ", cannot change netid.")
  416. }
  417. // Inc - increments an IP
  418. func Inc(ip net.IP) {
  419. for j := len(ip) - 1; j >= 0; j-- {
  420. ip[j]++
  421. if ip[j] > 0 {
  422. break
  423. }
  424. }
  425. }
  426. // GetNetwork - gets a network from database
  427. func GetNetwork(networkname string) (models.Network, error) {
  428. var network models.Network
  429. networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, networkname)
  430. if err != nil {
  431. return network, err
  432. }
  433. if err = json.Unmarshal([]byte(networkData), &network); err != nil {
  434. return models.Network{}, err
  435. }
  436. return network, nil
  437. }
  438. // Network.NetIDInNetworkCharSet - checks if a netid of a network uses valid characters
  439. func NetIDInNetworkCharSet(network *models.Network) bool {
  440. charset := "abcdefghijklmnopqrstuvwxyz1234567890-_."
  441. for _, char := range network.NetID {
  442. if !strings.Contains(charset, strings.ToLower(string(char))) {
  443. return false
  444. }
  445. }
  446. return true
  447. }
  448. // Network.Validate - validates fields of an network struct
  449. func ValidateNetwork(network *models.Network, isUpdate bool) error {
  450. v := validator.New()
  451. _ = v.RegisterValidation("netid_valid", func(fl validator.FieldLevel) bool {
  452. inCharSet := NetIDInNetworkCharSet(network)
  453. if isUpdate {
  454. return inCharSet
  455. }
  456. isFieldUnique, _ := IsNetworkNameUnique(network)
  457. return isFieldUnique && inCharSet
  458. })
  459. //
  460. _ = v.RegisterValidation("displayname_valid", func(fl validator.FieldLevel) bool {
  461. isFieldUnique, _ := IsNetworkDisplayNameUnique(network)
  462. inCharSet := network.DisplayNameInNetworkCharSet()
  463. if isUpdate {
  464. return inCharSet
  465. }
  466. return isFieldUnique && inCharSet
  467. })
  468. _ = v.RegisterValidation("checkyesorno", func(fl validator.FieldLevel) bool {
  469. return validation.CheckYesOrNo(fl)
  470. })
  471. err := v.Struct(network)
  472. if err != nil {
  473. for _, e := range err.(validator.ValidationErrors) {
  474. fmt.Println(e)
  475. }
  476. }
  477. return err
  478. }
  479. // ParseNetwork - parses a network into a model
  480. func ParseNetwork(value string) (models.Network, error) {
  481. var network models.Network
  482. err := json.Unmarshal([]byte(value), &network)
  483. return network, err
  484. }
  485. // ValidateNetworkUpdate - checks if network is valid to update
  486. func ValidateNetworkUpdate(network models.Network) error {
  487. v := validator.New()
  488. _ = v.RegisterValidation("netid_valid", func(fl validator.FieldLevel) bool {
  489. if fl.Field().String() == "" {
  490. return true
  491. }
  492. inCharSet := nameInNetworkCharSet(fl.Field().String())
  493. return inCharSet
  494. })
  495. err := v.Struct(network)
  496. if err != nil {
  497. for _, e := range err.(validator.ValidationErrors) {
  498. logger.Log(1, "validator", e.Error())
  499. }
  500. }
  501. return err
  502. }
  503. // KeyUpdate - updates keys on network
  504. func KeyUpdate(netname string) (models.Network, error) {
  505. err := networkNodesUpdateAction(netname, models.NODE_UPDATE_KEY)
  506. if err != nil {
  507. return models.Network{}, err
  508. }
  509. return models.Network{}, nil
  510. }
  511. // == Private ==
  512. func networkNodesUpdateAction(networkName string, action string) error {
  513. collections, err := database.FetchRecords(database.NODES_TABLE_NAME)
  514. if err != nil {
  515. if database.IsEmptyRecord(err) {
  516. return nil
  517. }
  518. return err
  519. }
  520. for _, value := range collections {
  521. var node models.Node
  522. err := json.Unmarshal([]byte(value), &node)
  523. if err != nil {
  524. fmt.Println("error in node address assignment!")
  525. return err
  526. }
  527. if action == models.NODE_UPDATE_KEY && node.IsStatic == "yes" {
  528. continue
  529. }
  530. if node.Network == networkName {
  531. node.Action = action
  532. data, err := json.Marshal(&node)
  533. if err != nil {
  534. return err
  535. }
  536. database.Insert(node.ID, string(data), database.NODES_TABLE_NAME)
  537. }
  538. }
  539. return nil
  540. }
  541. func nameInNetworkCharSet(name string) bool {
  542. charset := "abcdefghijklmnopqrstuvwxyz1234567890-_."
  543. for _, char := range name {
  544. if !strings.Contains(charset, strings.ToLower(string(char))) {
  545. return false
  546. }
  547. }
  548. return true
  549. }
  550. func deleteInterface(ifacename string, postdown string) error {
  551. var err error
  552. if !ncutils.IsKernel() {
  553. err = RemoveConf(ifacename, true)
  554. } else {
  555. ipExec, errN := exec.LookPath("ip")
  556. err = errN
  557. if err != nil {
  558. logger.Log(1, err.Error())
  559. }
  560. _, err = ncutils.RunCmd(ipExec+" link del "+ifacename, false)
  561. if postdown != "" {
  562. runcmds := strings.Split(postdown, "; ")
  563. err = ncutils.RunCmds(runcmds, false)
  564. }
  565. }
  566. return err
  567. }
  568. func isInterfacePresent(iface string, address string) (string, bool) {
  569. var interfaces []net.Interface
  570. var err error
  571. interfaces, err = net.Interfaces()
  572. if err != nil {
  573. logger.Log(0, "ERROR: could not read interfaces")
  574. return "", true
  575. }
  576. for _, currIface := range interfaces {
  577. var currAddrs []net.Addr
  578. currAddrs, err = currIface.Addrs()
  579. if err != nil || len(currAddrs) == 0 {
  580. continue
  581. }
  582. for _, addr := range currAddrs {
  583. if strings.Contains(addr.String(), address) && currIface.Name != iface {
  584. logger.Log(2, "found iface", addr.String(), currIface.Name)
  585. interfaces = nil
  586. currAddrs = nil
  587. return currIface.Name, false
  588. }
  589. }
  590. currAddrs = nil
  591. }
  592. interfaces = nil
  593. logger.Log(2, "failed to find iface", iface)
  594. return "", true
  595. }