helpers.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867
  1. //TODO: Consider restructuring this file/folder "github.com/gorilla/handlers"
  2. //It may make more sense to split into different files and not call it "helpers"
  3. package functions
  4. import (
  5. "encoding/base64"
  6. "encoding/json"
  7. "errors"
  8. "fmt"
  9. "log"
  10. "math/rand"
  11. "net"
  12. "strings"
  13. "time"
  14. "github.com/gravitl/netmaker/database"
  15. "github.com/gravitl/netmaker/models"
  16. "github.com/gravitl/netmaker/servercfg"
  17. )
  18. // PrintUserLog - prints a log with a given username
  19. func PrintUserLog(username string, message string, loglevel int) {
  20. log.SetFlags(log.Flags() &^ (log.Llongfile | log.Lshortfile))
  21. if int32(loglevel) <= servercfg.GetVerbose() && servercfg.GetVerbose() != 0 {
  22. log.Println("[netmaker]", username, message)
  23. }
  24. }
  25. // ParseNetwork - parses a network into a model
  26. func ParseNetwork(value string) (models.Network, error) {
  27. var network models.Network
  28. err := json.Unmarshal([]byte(value), &network)
  29. return network, err
  30. }
  31. // ParseNode - parses a node into a model
  32. func ParseNode(value string) (models.Node, error) {
  33. var node models.Node
  34. err := json.Unmarshal([]byte(value), &node)
  35. return node, err
  36. }
  37. // ParseExtClient - parses an extclient into a model
  38. func ParseExtClient(value string) (models.ExtClient, error) {
  39. var extClient models.ExtClient
  40. err := json.Unmarshal([]byte(value), &extClient)
  41. return extClient, err
  42. }
  43. // ParseIntClient - parses int client
  44. func ParseIntClient(value string) (models.IntClient, error) {
  45. var intClient models.IntClient
  46. err := json.Unmarshal([]byte(value), &intClient)
  47. return intClient, err
  48. }
  49. //Takes in an arbitrary field and value for field and checks to see if any other
  50. //node has that value for the same field within the network
  51. // GetUser - gets a user
  52. func GetUser(username string) (models.User, error) {
  53. var user models.User
  54. record, err := database.FetchRecord(database.USERS_TABLE_NAME, username)
  55. if err != nil {
  56. return user, err
  57. }
  58. if err = json.Unmarshal([]byte(record), &user); err != nil {
  59. return models.User{}, err
  60. }
  61. return user, err
  62. }
  63. // SliceContains - sees if a slice contains something
  64. func SliceContains(slice []string, item string) bool {
  65. set := make(map[string]struct{}, len(slice))
  66. for _, s := range slice {
  67. set[s] = struct{}{}
  68. }
  69. _, ok := set[item]
  70. return ok
  71. }
  72. // CreateServerToken - creates a server token
  73. func CreateServerToken(netID string) (string, error) {
  74. var network models.Network
  75. var accesskey models.AccessKey
  76. network, err := GetParentNetwork(netID)
  77. if err != nil {
  78. return "", err
  79. }
  80. var accessToken models.AccessToken
  81. servervals := models.ServerConfig{}
  82. if servercfg.GetPlatform() == "Kubernetes" {
  83. log.Println("server on kubernetes")
  84. servervals = models.ServerConfig{
  85. APIConnString: servercfg.GetPodIP() + ":" + servercfg.GetAPIPort(),
  86. GRPCConnString: servercfg.GetPodIP() + ":" + servercfg.GetGRPCPort(),
  87. GRPCSSL: "off",
  88. }
  89. } else {
  90. log.Println("server on linux")
  91. servervals = models.ServerConfig{
  92. APIConnString: "127.0.0.1:" + servercfg.GetAPIPort(),
  93. GRPCConnString: "127.0.0.1:" + servercfg.GetGRPCPort(),
  94. GRPCSSL: "off",
  95. CheckinInterval: servercfg.GetCheckinInterval(),
  96. }
  97. }
  98. log.Println("APIConnString:", servervals.APIConnString)
  99. log.Println("GRPCConnString:", servervals.GRPCConnString)
  100. log.Println("GRPCSSL:", servervals.GRPCSSL)
  101. accessToken.ServerConfig = servervals
  102. accessToken.ClientConfig.Network = netID
  103. accessToken.ClientConfig.Key = GenKey()
  104. accesskey.Name = GenKeyName()
  105. accesskey.Value = accessToken.ClientConfig.Key
  106. accesskey.Uses = 1
  107. tokenjson, err := json.Marshal(accessToken)
  108. if err != nil {
  109. return accesskey.AccessString, err
  110. }
  111. accesskey.AccessString = base64.StdEncoding.EncodeToString([]byte(tokenjson))
  112. log.Println("accessstring:", accesskey.AccessString)
  113. network.AccessKeys = append(network.AccessKeys, accesskey)
  114. if data, err := json.Marshal(network); err != nil {
  115. return "", err
  116. } else {
  117. database.Insert(netID, string(data), database.NETWORKS_TABLE_NAME)
  118. }
  119. return accesskey.AccessString, nil
  120. }
  121. // GetPeersList - gets peers for given network
  122. func GetPeersList(networkName string) ([]models.PeersResponse, error) {
  123. var peers []models.PeersResponse
  124. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  125. if err != nil {
  126. return peers, err
  127. }
  128. for _, value := range collection {
  129. var peer models.PeersResponse
  130. err := json.Unmarshal([]byte(value), &peer)
  131. if err != nil {
  132. continue // try the rest
  133. }
  134. peers = append(peers, peer)
  135. }
  136. return peers, err
  137. }
  138. // GetIntPeersList - get int peers list
  139. func GetIntPeersList() ([]models.PeersResponse, error) {
  140. var peers []models.PeersResponse
  141. records, err := database.FetchRecords(database.INT_CLIENTS_TABLE_NAME)
  142. if err != nil {
  143. return peers, err
  144. }
  145. // parse the peers
  146. for _, value := range records {
  147. var peer models.PeersResponse
  148. err := json.Unmarshal([]byte(value), &peer)
  149. if err != nil {
  150. log.Fatal(err)
  151. }
  152. // add the node to our node array
  153. //maybe better to just return this? But then that's just GetNodes...
  154. peers = append(peers, peer)
  155. }
  156. return peers, err
  157. }
  158. // GetServerIntClient - get server int client
  159. func GetServerIntClient() (*models.IntClient, error) {
  160. intClients, err := database.FetchRecords(database.INT_CLIENTS_TABLE_NAME)
  161. for _, value := range intClients {
  162. var intClient models.IntClient
  163. err = json.Unmarshal([]byte(value), &intClient)
  164. if err != nil {
  165. return nil, err
  166. }
  167. if intClient.IsServer == "yes" && intClient.Network == "comms" {
  168. return &intClient, nil
  169. }
  170. }
  171. return nil, err
  172. }
  173. // NetworkExists - check if network exists
  174. func NetworkExists(name string) (bool, error) {
  175. var network string
  176. var err error
  177. if network, err = database.FetchRecord(database.NETWORKS_TABLE_NAME, name); err != nil {
  178. return false, err
  179. }
  180. return len(network) > 0, nil
  181. }
  182. // GetRecordKey - get record key
  183. func GetRecordKey(id string, network string) (string, error) {
  184. if id == "" || network == "" {
  185. return "", errors.New("unable to get record key")
  186. }
  187. return id + "###" + network, nil
  188. }
  189. // UpdateNetworkNodeAddresses - updates network node addresses
  190. func UpdateNetworkNodeAddresses(networkName string) error {
  191. collections, err := database.FetchRecords(database.NODES_TABLE_NAME)
  192. if err != nil {
  193. return err
  194. }
  195. for _, value := range collections {
  196. var node models.Node
  197. err := json.Unmarshal([]byte(value), &node)
  198. if err != nil {
  199. fmt.Println("error in node address assignment!")
  200. return err
  201. }
  202. if node.Network == networkName {
  203. ipaddr, iperr := UniqueAddress(networkName)
  204. if iperr != nil {
  205. fmt.Println("error in node address assignment!")
  206. return iperr
  207. }
  208. node.Address = ipaddr
  209. node.PullChanges = "yes"
  210. data, err := json.Marshal(&node)
  211. if err != nil {
  212. return err
  213. }
  214. node.SetID()
  215. database.Insert(node.ID, string(data), database.NODES_TABLE_NAME)
  216. }
  217. }
  218. return nil
  219. }
  220. // NetworkNodesUpdateAction - updates action of network nodes
  221. func NetworkNodesUpdateAction(networkName string, action string) error {
  222. collections, err := database.FetchRecords(database.NODES_TABLE_NAME)
  223. if err != nil {
  224. if database.IsEmptyRecord(err) {
  225. return nil
  226. }
  227. return err
  228. }
  229. for _, value := range collections {
  230. var node models.Node
  231. err := json.Unmarshal([]byte(value), &node)
  232. if err != nil {
  233. fmt.Println("error in node address assignment!")
  234. return err
  235. }
  236. if action == models.NODE_UPDATE_KEY && node.IsStatic == "yes" {
  237. continue
  238. }
  239. if node.Network == networkName {
  240. node.Action = action
  241. data, err := json.Marshal(&node)
  242. if err != nil {
  243. return err
  244. }
  245. node.SetID()
  246. database.Insert(node.ID, string(data), database.NODES_TABLE_NAME)
  247. }
  248. }
  249. return nil
  250. }
  251. // NetworkNodesUpdatePullChanges - tells nodes on network to pull
  252. func NetworkNodesUpdatePullChanges(networkName string) error {
  253. collections, err := database.FetchRecords(database.NODES_TABLE_NAME)
  254. if err != nil {
  255. if database.IsEmptyRecord(err) {
  256. return nil
  257. }
  258. return err
  259. }
  260. for _, value := range collections {
  261. var node models.Node
  262. err := json.Unmarshal([]byte(value), &node)
  263. if err != nil {
  264. fmt.Println("error in node address assignment!")
  265. return err
  266. }
  267. if node.Network == networkName {
  268. node.PullChanges = "yes"
  269. data, err := json.Marshal(&node)
  270. if err != nil {
  271. return err
  272. }
  273. node.SetID()
  274. database.Insert(node.ID, string(data), database.NODES_TABLE_NAME)
  275. }
  276. }
  277. return nil
  278. }
  279. // UpdateNetworkLocalAddresses - updates network localaddresses
  280. func UpdateNetworkLocalAddresses(networkName string) error {
  281. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  282. if err != nil {
  283. return err
  284. }
  285. for _, value := range collection {
  286. var node models.Node
  287. err := json.Unmarshal([]byte(value), &node)
  288. if err != nil {
  289. fmt.Println("error in node address assignment!")
  290. return err
  291. }
  292. if node.Network == networkName {
  293. ipaddr, iperr := UniqueAddress(networkName)
  294. if iperr != nil {
  295. fmt.Println("error in node address assignment!")
  296. return iperr
  297. }
  298. node.Address = ipaddr
  299. newNodeData, err := json.Marshal(&node)
  300. if err != nil {
  301. fmt.Println("error in node address assignment!")
  302. return err
  303. }
  304. node.SetID()
  305. database.Insert(node.ID, string(newNodeData), database.NODES_TABLE_NAME)
  306. }
  307. }
  308. return nil
  309. }
  310. // IsNetworkDisplayNameUnique - checks if network display name unique
  311. func IsNetworkDisplayNameUnique(name string) (bool, error) {
  312. isunique := true
  313. dbs, err := models.GetNetworks()
  314. if err != nil {
  315. return database.IsEmptyRecord(err), err
  316. }
  317. for i := 0; i < len(dbs); i++ {
  318. if name == dbs[i].DisplayName {
  319. isunique = false
  320. }
  321. }
  322. return isunique, nil
  323. }
  324. // IsMacAddressUnique - checks if mac is unique
  325. func IsMacAddressUnique(macaddress string, networkName string) (bool, error) {
  326. _, err := database.FetchRecord(database.NODES_TABLE_NAME, macaddress+"###"+networkName)
  327. if err != nil {
  328. return database.IsEmptyRecord(err), err
  329. }
  330. return true, nil
  331. }
  332. // GetNetworkNonServerNodeCount - get number of network non server nodes
  333. func GetNetworkNonServerNodeCount(networkName string) (int, error) {
  334. collection, err := database.FetchRecords(database.NODES_TABLE_NAME)
  335. count := 0
  336. if err != nil && !database.IsEmptyRecord(err) {
  337. return count, err
  338. }
  339. for _, value := range collection {
  340. var node models.Node
  341. if err = json.Unmarshal([]byte(value), &node); err != nil {
  342. return count, err
  343. } else {
  344. if node.Network == networkName && node.IsServer != "yes" {
  345. count++
  346. }
  347. }
  348. }
  349. return count, nil
  350. }
  351. //Checks to see if access key is valid
  352. //Does so by checking against all keys and seeing if any have the same value
  353. //may want to hash values before comparing...consider this
  354. //TODO: No error handling!!!!
  355. // IsKeyValid - check if key is valid
  356. func IsKeyValid(networkname string, keyvalue string) bool {
  357. network, _ := GetParentNetwork(networkname)
  358. var key models.AccessKey
  359. foundkey := false
  360. isvalid := false
  361. for i := len(network.AccessKeys) - 1; i >= 0; i-- {
  362. currentkey := network.AccessKeys[i]
  363. if currentkey.Value == keyvalue {
  364. key = currentkey
  365. foundkey = true
  366. }
  367. }
  368. if foundkey {
  369. if key.Uses > 0 {
  370. isvalid = true
  371. }
  372. }
  373. return isvalid
  374. }
  375. // IsKeyValidGlobal - checks if a key is valid globally
  376. func IsKeyValidGlobal(keyvalue string) bool {
  377. networks, _ := models.GetNetworks()
  378. var key models.AccessKey
  379. foundkey := false
  380. isvalid := false
  381. for _, network := range networks {
  382. for i := len(network.AccessKeys) - 1; i >= 0; i-- {
  383. currentkey := network.AccessKeys[i]
  384. if currentkey.Value == keyvalue {
  385. key = currentkey
  386. foundkey = true
  387. break
  388. }
  389. }
  390. if foundkey {
  391. break
  392. }
  393. }
  394. if foundkey {
  395. if key.Uses > 0 {
  396. isvalid = true
  397. }
  398. }
  399. return isvalid
  400. }
  401. //TODO: Contains a fatal error return. Need to change
  402. //This just gets a network object from a network name
  403. //Should probably just be GetNetwork. kind of a dumb name.
  404. //Used in contexts where it's not the Parent network.
  405. // GetParentNetwork - get parent network
  406. func GetParentNetwork(networkname string) (models.Network, error) {
  407. var network models.Network
  408. networkData, err := database.FetchRecord(database.NETWORKS_TABLE_NAME, networkname)
  409. if err != nil {
  410. return network, err
  411. }
  412. if err = json.Unmarshal([]byte(networkData), &network); err != nil {
  413. return models.Network{}, err
  414. }
  415. return network, nil
  416. }
  417. // IsIpNet - checks if valid ip
  418. func IsIpNet(host string) bool {
  419. return net.ParseIP(host) != nil
  420. }
  421. //Similar to above but checks if Cidr range is valid
  422. //At least this guy's got some print statements
  423. //still not good error handling
  424. // IsIpCIDR - IsIpCIDR
  425. func IsIpCIDR(host string) bool {
  426. ip, ipnet, err := net.ParseCIDR(host)
  427. if err != nil {
  428. fmt.Println(err)
  429. fmt.Println("Address Range is not valid!")
  430. return false
  431. }
  432. return ip != nil && ipnet != nil
  433. }
  434. //This checks to make sure a network name is valid.
  435. //Switch to REGEX?
  436. // NameInNetworkCharSet - see if name is in charset for networks
  437. func NameInNetworkCharSet(name string) bool {
  438. charset := "abcdefghijklmnopqrstuvwxyz1234567890-_."
  439. for _, char := range name {
  440. if !strings.Contains(charset, strings.ToLower(string(char))) {
  441. return false
  442. }
  443. }
  444. return true
  445. }
  446. // NameInDNSCharSet - name in dns char set
  447. func NameInDNSCharSet(name string) bool {
  448. charset := "abcdefghijklmnopqrstuvwxyz1234567890-."
  449. for _, char := range name {
  450. if !strings.Contains(charset, strings.ToLower(string(char))) {
  451. return false
  452. }
  453. }
  454. return true
  455. }
  456. // NameInNodeCharSet - name in node char set
  457. func NameInNodeCharSet(name string) bool {
  458. charset := "abcdefghijklmnopqrstuvwxyz1234567890-"
  459. for _, char := range name {
  460. if !strings.Contains(charset, strings.ToLower(string(char))) {
  461. return false
  462. }
  463. }
  464. return true
  465. }
  466. //This returns a node based on its mac address.
  467. //The mac address acts as the Unique ID for nodes.
  468. //Is this a dumb thing to do? I thought it was cool but maybe it's dumb.
  469. //It doesn't really provide a tangible benefit over a random ID
  470. // GetNodeByMacAddress - gets a node by mac address
  471. func GetNodeByMacAddress(network string, macaddress string) (models.Node, error) {
  472. var node models.Node
  473. key, err := GetRecordKey(macaddress, network)
  474. if err != nil {
  475. return node, err
  476. }
  477. record, err := database.FetchRecord(database.NODES_TABLE_NAME, key)
  478. if err != nil {
  479. return models.Node{}, err
  480. }
  481. if err = json.Unmarshal([]byte(record), &node); err != nil {
  482. return models.Node{}, err
  483. }
  484. node.SetDefaults()
  485. return node, nil
  486. }
  487. // GetDeletedNodeByMacAddress - get a deleted node
  488. func GetDeletedNodeByMacAddress(network string, macaddress string) (models.Node, error) {
  489. var node models.Node
  490. key, err := GetRecordKey(macaddress, network)
  491. if err != nil {
  492. return node, err
  493. }
  494. record, err := database.FetchRecord(database.DELETED_NODES_TABLE_NAME, key)
  495. if err != nil {
  496. return models.Node{}, err
  497. }
  498. if err = json.Unmarshal([]byte(record), &node); err != nil {
  499. return models.Node{}, err
  500. }
  501. node.SetDefaults()
  502. return node, nil
  503. }
  504. // RemoveDeletedNode - remove deleted node
  505. func RemoveDeletedNode(nodeid string) bool {
  506. return database.DeleteRecord(database.DELETED_NODES_TABLE_NAME, nodeid) == nil
  507. }
  508. // DeleteAllIntClients - delete all int clients
  509. func DeleteAllIntClients() error {
  510. err := database.DeleteAllRecords(database.INT_CLIENTS_TABLE_NAME)
  511. if err != nil {
  512. return err
  513. }
  514. return nil
  515. }
  516. // GetAllIntClients - get all int clients
  517. func GetAllIntClients() ([]models.IntClient, error) {
  518. var clients []models.IntClient
  519. collection, err := database.FetchRecords(database.INT_CLIENTS_TABLE_NAME)
  520. if err != nil {
  521. return clients, err
  522. }
  523. for _, value := range collection {
  524. var client models.IntClient
  525. err := json.Unmarshal([]byte(value), &client)
  526. if err != nil {
  527. return []models.IntClient{}, err
  528. }
  529. // add node to our array
  530. clients = append(clients, client)
  531. }
  532. return clients, nil
  533. }
  534. // GetAllExtClients - get all ext clients
  535. func GetAllExtClients() ([]models.ExtClient, error) {
  536. var extclients []models.ExtClient
  537. collection, err := database.FetchRecords(database.EXT_CLIENT_TABLE_NAME)
  538. if err != nil {
  539. return extclients, err
  540. }
  541. for _, value := range collection {
  542. var extclient models.ExtClient
  543. err := json.Unmarshal([]byte(value), &extclient)
  544. if err != nil {
  545. return []models.ExtClient{}, err
  546. }
  547. // add node to our array
  548. extclients = append(extclients, extclient)
  549. }
  550. return extclients, nil
  551. }
  552. //This returns a unique address for a node to use
  553. //it iterates through the list of IP's in the subnet
  554. //and checks against all nodes to see if it's taken, until it finds one.
  555. //TODO: We do not handle a case where we run out of addresses.
  556. //We will need to handle that eventually
  557. // UniqueAddress - see if address is unique
  558. func UniqueAddress(networkName string) (string, error) {
  559. var network models.Network
  560. network, err := GetParentNetwork(networkName)
  561. if err != nil {
  562. fmt.Println("UniqueAddress encountered an error")
  563. return "666", err
  564. }
  565. offset := true
  566. ip, ipnet, err := net.ParseCIDR(network.AddressRange)
  567. if err != nil {
  568. fmt.Println("UniqueAddress encountered an error")
  569. return "666", err
  570. }
  571. for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); Inc(ip) {
  572. if offset {
  573. offset = false
  574. continue
  575. }
  576. if networkName == "comms" {
  577. if IsIPUnique(networkName, ip.String(), database.INT_CLIENTS_TABLE_NAME, false) {
  578. return ip.String(), err
  579. }
  580. } else {
  581. if IsIPUnique(networkName, ip.String(), database.NODES_TABLE_NAME, false) && IsIPUnique(networkName, ip.String(), database.EXT_CLIENT_TABLE_NAME, false) {
  582. return ip.String(), err
  583. }
  584. }
  585. }
  586. //TODO
  587. err1 := errors.New("ERROR: No unique addresses available. Check network subnet.")
  588. return "W1R3: NO UNIQUE ADDRESSES AVAILABLE", err1
  589. }
  590. // UniqueAddress6 - see if ipv6 address is unique
  591. func UniqueAddress6(networkName string) (string, error) {
  592. var network models.Network
  593. network, err := GetParentNetwork(networkName)
  594. if err != nil {
  595. fmt.Println("Network Not Found")
  596. return "", err
  597. }
  598. if network.IsDualStack == "no" {
  599. return "", nil
  600. }
  601. offset := true
  602. ip, ipnet, err := net.ParseCIDR(network.AddressRange6)
  603. if err != nil {
  604. fmt.Println("UniqueAddress6 encountered an error")
  605. return "666", err
  606. }
  607. for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); Inc(ip) {
  608. if offset {
  609. offset = false
  610. continue
  611. }
  612. if IsIPUnique(networkName, ip.String(), database.NODES_TABLE_NAME, true) {
  613. return ip.String(), err
  614. }
  615. }
  616. //TODO
  617. err1 := errors.New("ERROR: No unique addresses available. Check network subnet.")
  618. return "W1R3: NO UNIQUE ADDRESSES AVAILABLE", err1
  619. }
  620. // GenKey - generates access key
  621. func GenKey() string {
  622. var seededRand *rand.Rand = rand.New(
  623. rand.NewSource(time.Now().UnixNano()))
  624. length := 16
  625. charset := "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  626. b := make([]byte, length)
  627. for i := range b {
  628. b[i] = charset[seededRand.Intn(len(charset))]
  629. }
  630. return string(b)
  631. }
  632. //generate a key value
  633. //we should probably just have 1 random string generator
  634. //that can be used across all functions
  635. //have a "base string" a "length" and a "charset"
  636. // GenKeyName - generates a key name
  637. func GenKeyName() string {
  638. var seededRand *rand.Rand = rand.New(
  639. rand.NewSource(time.Now().UnixNano()))
  640. length := 5
  641. charset := "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  642. b := make([]byte, length)
  643. for i := range b {
  644. b[i] = charset[seededRand.Intn(len(charset))]
  645. }
  646. return "key" + string(b)
  647. }
  648. // IsIPUnique - checks if an IP is unique
  649. func IsIPUnique(network string, ip string, tableName string, isIpv6 bool) bool {
  650. isunique := true
  651. collection, err := database.FetchRecords(tableName)
  652. if err != nil {
  653. return isunique
  654. }
  655. for _, value := range collection { // filter
  656. var node models.Node
  657. if err = json.Unmarshal([]byte(value), &node); err != nil {
  658. continue
  659. }
  660. if isIpv6 {
  661. if node.Address6 == ip && node.Network == network {
  662. return false
  663. }
  664. } else {
  665. if node.Address == ip && node.Network == network {
  666. return false
  667. }
  668. }
  669. }
  670. return isunique
  671. }
  672. //called once key has been used by createNode
  673. //reduces value by one and deletes if necessary
  674. // DecrimentKey - decriments key uses
  675. func DecrimentKey(networkName string, keyvalue string) {
  676. var network models.Network
  677. network, err := GetParentNetwork(networkName)
  678. if err != nil {
  679. return
  680. }
  681. for i := len(network.AccessKeys) - 1; i >= 0; i-- {
  682. currentkey := network.AccessKeys[i]
  683. if currentkey.Value == keyvalue {
  684. network.AccessKeys[i].Uses--
  685. if network.AccessKeys[i].Uses < 1 {
  686. network.AccessKeys = append(network.AccessKeys[:i],
  687. network.AccessKeys[i+1:]...)
  688. break
  689. }
  690. }
  691. }
  692. if newNetworkData, err := json.Marshal(&network); err != nil {
  693. PrintUserLog(models.NODE_SERVER_NAME, "failed to decrement key", 2)
  694. return
  695. } else {
  696. database.Insert(network.NetID, string(newNetworkData), database.NETWORKS_TABLE_NAME)
  697. }
  698. }
  699. // DeleteKey - deletes a key
  700. func DeleteKey(network models.Network, i int) {
  701. network.AccessKeys = append(network.AccessKeys[:i],
  702. network.AccessKeys[i+1:]...)
  703. if networkData, err := json.Marshal(&network); err != nil {
  704. return
  705. } else {
  706. database.Insert(network.NetID, string(networkData), database.NETWORKS_TABLE_NAME)
  707. }
  708. }
  709. // Inc - increments an IP
  710. func Inc(ip net.IP) {
  711. for j := len(ip) - 1; j >= 0; j-- {
  712. ip[j]++
  713. if ip[j] > 0 {
  714. break
  715. }
  716. }
  717. }