first commit
This commit is contained in:
		
							
								
								
									
										245
									
								
								api/api.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										245
									
								
								api/api.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,245 @@
 | 
			
		||||
package api
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/gin-gonic/gin"
 | 
			
		||||
	log "github.com/sirupsen/logrus"
 | 
			
		||||
	"github.com/skip2/go-qrcode"
 | 
			
		||||
	"gitlab.127-0-0-1.fr/vx3r/wg-gen-web/core"
 | 
			
		||||
	"gitlab.127-0-0-1.fr/vx3r/wg-gen-web/model"
 | 
			
		||||
	"gitlab.127-0-0-1.fr/vx3r/wg-gen-web/template"
 | 
			
		||||
	"gitlab.127-0-0-1.fr/vx3r/wg-gen-web/util"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ApplyRoutes applies router to gin Router
 | 
			
		||||
func ApplyRoutes(r *gin.Engine) {
 | 
			
		||||
	client := r.Group("/api/v1.0/client")
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
		client.POST("", createClient)
 | 
			
		||||
		client.GET("/:id", readClient)
 | 
			
		||||
		client.PATCH("/:id", updateClient)
 | 
			
		||||
		client.DELETE("/:id", deleteClient)
 | 
			
		||||
		client.GET("", readClients)
 | 
			
		||||
		client.GET("/:id/config", configClient)
 | 
			
		||||
		client.GET("/:id/email", emailClient)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	server := r.Group("/api/v1.0/server")
 | 
			
		||||
	{
 | 
			
		||||
		server.GET("", readServer)
 | 
			
		||||
		server.PATCH("", updateServer)
 | 
			
		||||
		server.GET("/config", configServer)
 | 
			
		||||
		server.GET("/version", version)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createClient(c *gin.Context) {
 | 
			
		||||
	var data model.Client
 | 
			
		||||
 | 
			
		||||
	if err := c.ShouldBindJSON(&data); err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to bind")
 | 
			
		||||
		c.AbortWithStatus(http.StatusUnprocessableEntity)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	client, err := core.CreateClient(&data)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to create client")
 | 
			
		||||
		c.AbortWithStatus(http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, client)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func readClient(c *gin.Context) {
 | 
			
		||||
	id := c.Param("id")
 | 
			
		||||
 | 
			
		||||
	client, err := core.ReadClient(id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to read client")
 | 
			
		||||
		c.AbortWithStatus(http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, client)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func updateClient(c *gin.Context) {
 | 
			
		||||
	var data model.Client
 | 
			
		||||
	id := c.Param("id")
 | 
			
		||||
 | 
			
		||||
	if err := c.ShouldBindJSON(&data); err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to bind")
 | 
			
		||||
		c.AbortWithStatus(http.StatusUnprocessableEntity)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	client, err := core.UpdateClient(id, &data)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to update client")
 | 
			
		||||
		c.AbortWithStatus(http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, client)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func deleteClient(c *gin.Context) {
 | 
			
		||||
	id := c.Param("id")
 | 
			
		||||
 | 
			
		||||
	err := core.DeleteClient(id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to remove client")
 | 
			
		||||
		c.AbortWithStatus(http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func readClients(c *gin.Context) {
 | 
			
		||||
	clients, err := core.ReadClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to list clients")
 | 
			
		||||
		c.AbortWithStatus(http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, clients)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func configClient(c *gin.Context) {
 | 
			
		||||
	configData, err := core.ReadClientConfig(c.Param("id"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to read client config")
 | 
			
		||||
		c.AbortWithStatus(http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	formatQr := c.DefaultQuery("qrcode", "false")
 | 
			
		||||
	if formatQr == "false" {
 | 
			
		||||
		// return config as txt file
 | 
			
		||||
		c.Header("Content-Disposition", "attachment; filename=wg0.conf")
 | 
			
		||||
		c.Data(http.StatusOK, "application/config", configData)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	// return config as png qrcode
 | 
			
		||||
	png, err := qrcode.Encode(string(configData), qrcode.Medium, 250)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to create qrcode")
 | 
			
		||||
		c.AbortWithStatus(http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	c.Data(http.StatusOK, "image/png", png)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func emailClient(c *gin.Context) {
 | 
			
		||||
	id := c.Param("id")
 | 
			
		||||
 | 
			
		||||
	err := core.EmailClient(id)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to send email to client")
 | 
			
		||||
		c.AbortWithStatus(http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func readServer(c *gin.Context) {
 | 
			
		||||
	client, err := core.ReadServer()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to read client")
 | 
			
		||||
		c.AbortWithStatus(http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, client)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func updateServer(c *gin.Context) {
 | 
			
		||||
	var data model.Server
 | 
			
		||||
 | 
			
		||||
	if err := c.ShouldBindJSON(&data); err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to bind")
 | 
			
		||||
		c.AbortWithStatus(http.StatusUnprocessableEntity)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	client, err := core.UpdateServer(&data)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to update client")
 | 
			
		||||
		c.AbortWithStatus(http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.JSON(http.StatusOK, client)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func configServer(c *gin.Context) {
 | 
			
		||||
	clients, err := core.ReadClients()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to read clients")
 | 
			
		||||
		c.AbortWithStatus(http.StatusUnprocessableEntity)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	server, err := core.ReadServer()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to read server")
 | 
			
		||||
		c.AbortWithStatus(http.StatusUnprocessableEntity)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	configData, err := template.DumpServerWg(clients, server)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.WithFields(log.Fields{
 | 
			
		||||
			"err": err,
 | 
			
		||||
		}).Error("failed to dump wg config")
 | 
			
		||||
		c.AbortWithStatus(http.StatusUnprocessableEntity)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// return config as txt file
 | 
			
		||||
	c.Header("Content-Disposition", "attachment; filename=wg0.conf")
 | 
			
		||||
	c.Data(http.StatusOK, "application/config", configData)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func version(c *gin.Context) {
 | 
			
		||||
	c.JSON(http.StatusOK, gin.H{
 | 
			
		||||
		"version": util.Version,
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user