server.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package server
  2. import (
  3. "be-vpn/internal/dto"
  4. "be-vpn/internal/model"
  5. "github.com/gin-gonic/gin"
  6. "log"
  7. "net/http"
  8. "sync"
  9. "time"
  10. )
  11. var nodes = make([]*model.Node, 0)
  12. var locker = sync.RWMutex{}
  13. func Register(c *gin.Context) {
  14. locker.Lock()
  15. defer locker.Unlock()
  16. var request dto.RegisterRequest
  17. if err := c.ShouldBindJSON(&request); err != nil {
  18. dto.BadRequest(c, err)
  19. return
  20. }
  21. for _, node := range nodes {
  22. if node.Ip == request.Ip {
  23. node.Ip = request.Ip
  24. node.Secret = request.Secret
  25. node.CountryCode = request.CountryCode
  26. node.LastUpdateTime = time.Now()
  27. c.JSON(http.StatusOK, dto.RegisterResponse{
  28. Response: dto.NewOkResponse(),
  29. Data: dto.RegisterResult{
  30. Success: true,
  31. },
  32. })
  33. return
  34. }
  35. }
  36. node := &model.Node{
  37. Ip: request.Ip,
  38. Secret: request.Secret,
  39. LastUpdateTime: time.Now(),
  40. }
  41. nodes = append(nodes, node)
  42. log.Printf("update nodes: %+v", nodes)
  43. }
  44. func List(c *gin.Context) {
  45. locker.RLock()
  46. defer locker.RUnlock()
  47. dtoNodes := make(map[string][]dto.Node)
  48. for _, node := range nodes {
  49. if _, ok := dtoNodes[node.CountryCode]; !ok {
  50. dtoNodes[node.CountryCode] = make([]dto.Node, 0)
  51. }
  52. if node.LastUpdateTime.Add(10 * time.Second).After(time.Now()) {
  53. dtoNodes[node.CountryCode] = append(dtoNodes[node.CountryCode], dto.Node{
  54. Ip: node.Ip,
  55. })
  56. }
  57. }
  58. listResult := make([]dto.ListResult, len(dtoNodes))
  59. i := 0
  60. for countryCode, itemNodes := range dtoNodes {
  61. listResult[i] = dto.ListResult{
  62. CountryCode: countryCode,
  63. Nodes: itemNodes,
  64. }
  65. i++
  66. }
  67. c.JSON(http.StatusOK, dto.ListResponse{
  68. Response: dto.NewOkResponse(),
  69. Data: listResult,
  70. })
  71. }
  72. func Secret(c *gin.Context) {
  73. locker.RLock()
  74. defer locker.RUnlock()
  75. var request dto.DetailRequest
  76. if err := c.ShouldBindQuery(&request); err != nil {
  77. dto.BadRequest(c, err)
  78. return
  79. }
  80. for _, node := range nodes {
  81. if node.Ip == request.Ip {
  82. //secret, err := util.AesEncrypt([]byte(node.Secret))
  83. //if err != nil {
  84. // dto.Error(c, err)
  85. // return
  86. //}
  87. c.Header("Content-Disposition", "attachment; filename=client.ovpn")
  88. c.Data(http.StatusOK, "plain/text", []byte(node.Secret))
  89. return
  90. }
  91. }
  92. c.JSON(http.StatusNotFound, gin.H{
  93. "message": "not found ip",
  94. })
  95. }
  96. func Health(c *gin.Context) {
  97. c.JSON(http.StatusOK, gin.H{"status": "up"})
  98. }