init from gitlab

This commit is contained in:
texm
2023-04-25 14:33:14 +08:00
parent 6a85a41ff0
commit c8202a5c82
281 changed files with 19861 additions and 1 deletions

View File

@@ -0,0 +1,46 @@
package settings
import (
"fmt"
"github.com/labstack/echo/v4"
"gitlab.com/texm/shokku/internal/env"
"gitlab.com/texm/shokku/internal/server/dto"
"net/http"
)
func CreateNetwork(e *env.Env, c echo.Context) error {
var req dto.AlterNetworkRequest
if err := dto.BindRequest(c, &req); err != nil {
return err.ToHTTP()
}
if err := e.Dokku.CreateNetwork(req.Network); err != nil {
return fmt.Errorf("error creating network: %w", err)
}
return c.NoContent(http.StatusOK)
}
func DestroyNetwork(e *env.Env, c echo.Context) error {
var req dto.AlterNetworkRequest
if err := dto.BindRequest(c, &req); err != nil {
return err.ToHTTP()
}
if err := e.Dokku.DestroyNetwork(req.Network); err != nil {
return fmt.Errorf("error destroying network: %w", err)
}
return c.NoContent(http.StatusOK)
}
func ListNetworks(e *env.Env, c echo.Context) error {
networks, err := e.Dokku.ListNetworks()
if err != nil {
return fmt.Errorf("error listing networks: %w", err)
}
return c.JSON(http.StatusOK, dto.ListNetworksResponse{
Networks: networks,
})
}

View File

@@ -0,0 +1,75 @@
package settings
import (
"errors"
"fmt"
"github.com/labstack/echo/v4"
"github.com/texm/dokku-go"
"gitlab.com/texm/shokku/internal/env"
"gitlab.com/texm/shokku/internal/server/dto"
"net/http"
)
func SetDockerRegistry(e *env.Env, c echo.Context) error {
var req dto.SetDockerRegistryRequest
if err := dto.BindRequest(c, &req); err != nil {
return err.ToHTTP()
}
if err := e.Dokku.LoginDockerRegistry(req.Server, req.Username, req.Password); err != nil {
return echo.NewHTTPError(http.StatusForbidden, err.Error())
}
propErr := e.Dokku.SetAppDockerRegistryProperty("--global", dokku.DockerRegistryPropertyServer, req.Server)
if propErr != nil {
return echo.NewHTTPError(http.StatusInternalServerError, propErr.Error())
}
return c.NoContent(http.StatusOK)
}
func GetDockerRegistryReport(e *env.Env, c echo.Context) error {
report, err := e.Dokku.GetDockerRegistryReport()
if err != nil && !errors.Is(err, dokku.NoDeployedAppsError) {
return fmt.Errorf("failed to get registry report: %w", err)
}
var response dto.GetDockerRegistryReportResponse
for _, appReport := range report {
response.Server = appReport.GlobalServer
response.PushOnRelease = appReport.GlobalPushOnRelease
break
}
return c.JSON(http.StatusOK, response)
}
func AddGitAuth(e *env.Env, c echo.Context) error {
var req dto.AddGitAuthRequest
if err := dto.BindRequest(c, &req); err != nil {
return err.ToHTTP()
}
if err := e.Dokku.GitSetAuth(req.Host, req.Username, req.Password); err != nil {
return echo.NewHTTPError(http.StatusForbidden, err.Error())
}
if err := e.Dokku.GitAllowHost(req.Host); err != nil {
return echo.NewHTTPError(http.StatusForbidden, err.Error())
}
return c.NoContent(http.StatusOK)
}
func RemoveGitAuth(e *env.Env, c echo.Context) error {
var req dto.RemoveGitAuthRequest
if err := dto.BindRequest(c, &req); err != nil {
return err.ToHTTP()
}
if err := e.Dokku.GitRemoveAuth(req.Host); err != nil {
return echo.NewHTTPError(http.StatusForbidden, err.Error())
}
return c.NoContent(http.StatusOK)
}

View File

@@ -0,0 +1,33 @@
package settings
import (
"github.com/labstack/echo/v4"
"gitlab.com/texm/shokku/internal/env"
)
func RegisterRoutes(e *env.Env, g *echo.Group) {
g.GET("/versions", e.H(GetVersions))
g.GET("/events", e.H(GetEventLogs))
g.GET("/events/list", e.H(GetEventLogsList))
g.POST("/events", e.H(SetEventLoggingEnabled))
g.GET("/users", e.H(GetUsers))
g.GET("/ssh-keys", e.H(GetSSHKeys))
g.GET("/domains", e.H(GetGlobalDomains))
g.POST("/domains", e.H(AddGlobalDomain))
g.DELETE("/domains", e.H(RemoveGlobalDomain))
g.GET("/networks", e.H(ListNetworks))
g.POST("/networks", e.H(CreateNetwork))
g.DELETE("/networks", e.H(DestroyNetwork))
g.GET("/plugins", e.H(ListPlugins))
g.GET("/registry", e.H(GetDockerRegistryReport))
g.POST("/registry", e.H(SetDockerRegistry))
g.POST("/git-auth", e.H(AddGitAuth))
g.DELETE("/git-auth", e.H(RemoveGitAuth))
}

View File

@@ -0,0 +1,156 @@
package settings
import (
"fmt"
"gitlab.com/texm/shokku/internal/env"
"gitlab.com/texm/shokku/internal/models"
"gitlab.com/texm/shokku/internal/server/dto"
"net/http"
"github.com/labstack/echo/v4"
)
func GetVersions(e *env.Env, c echo.Context) error {
dokkuVersion, err := e.Dokku.GetDokkuVersion()
if err != nil {
return fmt.Errorf("getting dokku version: %w", err)
}
return c.JSON(http.StatusOK, &dto.GetVersionsResponse{
Dokku: dokkuVersion,
Shokku: e.Version,
})
}
func GetUsers(e *env.Env, c echo.Context) error {
var dbUsers []models.User
res := e.DB.Model(models.User{}).Preload("SSHKeys").Find(&dbUsers)
if res.Error != nil {
return fmt.Errorf("querying db users: %w", res.Error)
}
users := make([]dto.User, len(dbUsers))
for i, dbUser := range dbUsers {
keys := make([]string, len(dbUser.SSHKeys))
for j, key := range dbUser.SSHKeys {
keys[j] = key.Key
}
users[i] = dto.User{
Name: dbUser.Name,
Source: dbUser.Source,
SSHKeys: keys,
}
}
return c.JSON(http.StatusOK, dto.GetUsersResponse{
Users: users,
})
}
func GetSSHKeys(e *env.Env, c echo.Context) error {
keys, err := e.Dokku.ListSSHKeys()
if err != nil {
return fmt.Errorf("listing ssh keys: %w", err)
}
return c.JSON(http.StatusOK, &dto.GetSSHKeysResponse{
Keys: keys,
})
}
func GetGlobalDomains(e *env.Env, c echo.Context) error {
report, err := e.Dokku.GetGlobalDomainsReport()
if err != nil {
return fmt.Errorf("getting global domains report: %w", err)
}
if len(report.Domains) == 0 {
report.Domains = make([]string, 0)
}
return c.JSON(http.StatusOK, &dto.GetGlobalDomainsResponse{
Domains: report.Domains,
Enabled: report.Enabled,
})
}
func AddGlobalDomain(e *env.Env, c echo.Context) error {
var req dto.AlterGlobalDomainRequest
if err := dto.BindRequest(c, &req); err != nil {
return err.ToHTTP()
}
// TODO: domain verification etc
if err := e.Dokku.AddGlobalDomain(req.Domain); err != nil {
return fmt.Errorf("adding global domain: %w", err)
}
return c.NoContent(http.StatusOK)
}
func RemoveGlobalDomain(e *env.Env, c echo.Context) error {
var req dto.DeleteGlobalDomainRequest
if err := dto.BindRequest(c, &req); err != nil {
return err.ToHTTP()
}
// TODO: domain verification etc
if err := e.Dokku.RemoveGlobalDomain(req.Domain); err != nil {
return fmt.Errorf("removing global domain: %w", err)
}
return c.NoContent(http.StatusOK)
}
func SetEventLoggingEnabled(e *env.Env, c echo.Context) error {
var req dto.SetEventLoggingEnabledRequest
if err := dto.BindRequest(c, &req); err != nil {
return err.ToHTTP()
}
if err := e.Dokku.SetEventLoggingEnabled(req.Enabled); err != nil {
return fmt.Errorf("setting event logging: %w", err)
}
return c.NoContent(http.StatusOK)
}
func GetEventLogsList(e *env.Env, c echo.Context) error {
events, err := e.Dokku.ListLoggedEvents()
if err != nil {
return fmt.Errorf("removing global domain: %w", err)
}
return c.JSON(http.StatusOK, dto.GetEventLogsListResponse{
Events: events,
})
}
func GetEventLogs(e *env.Env, c echo.Context) error {
logs, err := e.Dokku.GetEventLogs()
if err != nil {
return fmt.Errorf("getting event logs: %w", err)
}
return c.JSON(http.StatusOK, dto.GetEventLogsResponse{
Logs: logs,
})
}
func ListPlugins(e *env.Env, c echo.Context) error {
plugins, err := e.Dokku.ListPlugins()
if err != nil {
return fmt.Errorf("listing plugins: %w", err)
}
info := make([]dto.PluginInfo, len(plugins))
for i := 0; i < len(plugins); i++ {
p := plugins[i]
info[i] = dto.PluginInfo{
Name: p.Name,
Version: p.Version,
Enabled: p.Enabled,
Description: p.Description,
}
}
return c.JSON(http.StatusOK, &dto.ListPluginsResponse{
Plugins: info,
})
}