2021-09-17 13:00:28 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2022-04-06 23:26:58 +02:00
|
|
|
"encoding/json"
|
2021-09-17 13:00:28 +02:00
|
|
|
"fmt"
|
2022-04-06 23:26:58 +02:00
|
|
|
"os"
|
|
|
|
"strconv"
|
|
|
|
"sync"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"code.gitea.io/sdk/gitea"
|
2021-09-17 13:00:28 +02:00
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
"github.com/gofiber/fiber/v2/middleware/recover"
|
|
|
|
"github.com/kpango/glg"
|
2022-04-06 23:26:58 +02:00
|
|
|
"github.com/rs/zerolog"
|
|
|
|
"github.com/rs/zerolog/log"
|
|
|
|
"github.com/rs/zerolog/pkgerrors"
|
2021-09-17 13:00:28 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
type Channel int
|
|
|
|
|
|
|
|
const (
|
|
|
|
Stable Channel = iota
|
|
|
|
Prerelease
|
|
|
|
)
|
|
|
|
|
|
|
|
type Attachement struct {
|
|
|
|
User string
|
|
|
|
Repo string
|
|
|
|
Tag string
|
|
|
|
Filename string
|
|
|
|
Channel Channel
|
|
|
|
}
|
|
|
|
|
2022-03-28 17:35:36 +02:00
|
|
|
type RegionCounter struct {
|
|
|
|
RegionCount map[string]int
|
|
|
|
sync.RWMutex
|
|
|
|
}
|
|
|
|
|
2022-04-06 23:26:58 +02:00
|
|
|
var giteaURL string
|
2021-09-17 13:00:28 +02:00
|
|
|
|
|
|
|
func getAttachementURL(attachement Attachement) (string, error) {
|
|
|
|
client, err := gitea.NewClient(giteaURL)
|
|
|
|
if err != nil {
|
|
|
|
return "", fmt.Errorf("Failed to create gitea client: %v")
|
|
|
|
}
|
|
|
|
var release *gitea.Release
|
|
|
|
if attachement.Tag != "" {
|
|
|
|
release, _, err = client.GetReleaseByTag(attachement.User, attachement.Repo, attachement.Tag)
|
|
|
|
if err != nil {
|
|
|
|
return "", fmt.Errorf("Failed to get release by tag: %v")
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
isPrerelease := false
|
|
|
|
if attachement.Channel == Prerelease {
|
|
|
|
isPrerelease = true
|
|
|
|
}
|
|
|
|
releases, _, err := client.ListReleases(attachement.User, attachement.Repo, gitea.ListReleasesOptions{IsPreRelease: &isPrerelease})
|
|
|
|
if err != nil {
|
|
|
|
return "", fmt.Errorf("Failed to get releases: %v")
|
|
|
|
}
|
|
|
|
if len(releases) == 0 {
|
|
|
|
return "", fmt.Errorf("no release found")
|
|
|
|
}
|
|
|
|
release = releases[0]
|
|
|
|
}
|
|
|
|
for _, a := range release.Attachments {
|
|
|
|
if a.Name == attachement.Filename {
|
|
|
|
return a.DownloadURL, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return "", fmt.Errorf("no matching attachement found")
|
|
|
|
}
|
|
|
|
|
2022-03-28 17:35:36 +02:00
|
|
|
func (r *RegionCounter) countRegion(region string) {
|
2022-04-06 23:26:58 +02:00
|
|
|
log.Debug().Msgf("Region %s", region)
|
2022-04-01 19:43:29 +02:00
|
|
|
r.Lock()
|
|
|
|
defer r.Unlock()
|
2022-03-28 17:35:36 +02:00
|
|
|
if region == "" {
|
|
|
|
return
|
|
|
|
}
|
2022-04-06 23:26:58 +02:00
|
|
|
r.RegionCount[region]++
|
2022-04-01 19:43:29 +02:00
|
|
|
}
|
|
|
|
|
2021-09-17 13:00:28 +02:00
|
|
|
func main() {
|
2022-04-06 23:26:58 +02:00
|
|
|
zerolog.TimeFieldFormat = time.RFC1123Z
|
|
|
|
consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.RFC1123Z}
|
|
|
|
log.Logger = log.Output(consoleWriter).With().Timestamp().Logger()
|
|
|
|
|
|
|
|
giteaURL = os.Getenv("GITEA_URL")
|
|
|
|
logLevel, err := strconv.Atoi(os.Getenv("LOG_LEVEL"))
|
|
|
|
if err != nil {
|
|
|
|
logLevel = 1
|
|
|
|
}
|
|
|
|
log.Logger.Level(zerolog.Level(logLevel))
|
|
|
|
|
|
|
|
if log.Logger.GetLevel() == zerolog.DebugLevel {
|
|
|
|
log.Logger = log.Output(consoleWriter).With().Timestamp().Caller().Logger()
|
|
|
|
zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack
|
|
|
|
}
|
|
|
|
|
2022-03-28 17:35:36 +02:00
|
|
|
regionCounter := &RegionCounter{
|
|
|
|
RegionCount: make(map[string]int),
|
|
|
|
}
|
2021-09-17 13:00:28 +02:00
|
|
|
|
|
|
|
app := fiber.New(fiber.Config{
|
|
|
|
GETOnly: true,
|
|
|
|
ServerHeader: "Fiber",
|
2022-03-28 17:35:36 +02:00
|
|
|
AppName: "Gitea Attachement Proxy",
|
2021-09-17 13:00:28 +02:00
|
|
|
})
|
|
|
|
app.Use(recover.New())
|
|
|
|
|
|
|
|
app.Get("/:user/:repo/releases/download/latest/:name", func(c *fiber.Ctx) error {
|
2022-04-06 23:26:58 +02:00
|
|
|
log.Debug().Msgf("%+v", map[string]string{"user": c.Params("user"), "repo": c.Params("repo"), "name": c.Params("name")})
|
2021-09-17 13:00:28 +02:00
|
|
|
attachement := Attachement{
|
|
|
|
User: c.Params("user"),
|
|
|
|
Repo: c.Params("repo"),
|
|
|
|
Filename: c.Params("name"),
|
|
|
|
Channel: Stable,
|
|
|
|
}
|
|
|
|
url, err := getAttachementURL(attachement)
|
|
|
|
if err != nil {
|
|
|
|
glg.Debug(err)
|
|
|
|
c.SendString(err.Error())
|
|
|
|
c.SendStatus(404)
|
|
|
|
return nil
|
|
|
|
}
|
2022-03-28 17:35:36 +02:00
|
|
|
go regionCounter.countRegion(c.GetReqHeaders()["Fly-Region"])
|
2021-09-17 13:00:28 +02:00
|
|
|
c.Redirect(url, 307)
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
|
|
|
|
app.Get("/:user/:repo/releases/download/latest\\::channel/:name", func(c *fiber.Ctx) error {
|
2022-04-06 23:26:58 +02:00
|
|
|
log.Debug().Msgf("%+v", map[string]string{"user": c.Params("user"), "repo": c.Params("repo"), "name": c.Params("name"), "channel": c.Params("channel")})
|
2021-09-17 13:00:28 +02:00
|
|
|
channel := Stable
|
|
|
|
if c.Params("channel") == "prerelease" {
|
|
|
|
channel = Prerelease
|
|
|
|
}
|
|
|
|
attachement := Attachement{
|
|
|
|
User: c.Params("user"),
|
|
|
|
Repo: c.Params("repo"),
|
|
|
|
Filename: c.Params("name"),
|
|
|
|
Channel: channel,
|
|
|
|
}
|
|
|
|
url, err := getAttachementURL(attachement)
|
|
|
|
if err != nil {
|
|
|
|
glg.Debug(err)
|
|
|
|
c.SendString(err.Error())
|
|
|
|
c.SendStatus(404)
|
|
|
|
return nil
|
|
|
|
}
|
2022-03-28 17:35:36 +02:00
|
|
|
go regionCounter.countRegion(c.GetReqHeaders()["Fly-Region"])
|
2021-09-17 13:00:28 +02:00
|
|
|
c.Redirect(url, 307)
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
|
|
|
|
app.Get("/:user/:repo/releases/download/tag\\::tag/:name", func(c *fiber.Ctx) error {
|
2022-04-06 23:26:58 +02:00
|
|
|
log.Debug().Msgf("%+v", map[string]string{"user": c.Params("user"), "repo": c.Params("repo"), "name": c.Params("name"), "tag": c.Params("tag")})
|
2021-09-17 13:00:28 +02:00
|
|
|
attachement := Attachement{
|
|
|
|
User: c.Params("user"),
|
|
|
|
Repo: c.Params("repo"),
|
|
|
|
Filename: c.Params("name"),
|
|
|
|
Tag: c.Params("tag"),
|
|
|
|
}
|
|
|
|
url, err := getAttachementURL(attachement)
|
|
|
|
if err != nil {
|
|
|
|
glg.Debug(err)
|
|
|
|
c.SendString(err.Error())
|
|
|
|
c.SendStatus(404)
|
|
|
|
return nil
|
|
|
|
}
|
2022-03-28 17:35:36 +02:00
|
|
|
go regionCounter.countRegion(c.GetReqHeaders()["Fly-Region"])
|
2021-09-17 13:00:28 +02:00
|
|
|
c.Redirect(url, 307)
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
|
2022-03-28 17:35:36 +02:00
|
|
|
app.Get("/regions", func(c *fiber.Ctx) error {
|
2022-04-02 02:11:32 +02:00
|
|
|
regionCounter.RLock()
|
|
|
|
defer regionCounter.RUnlock()
|
2022-04-06 23:26:58 +02:00
|
|
|
s, e := json.Marshal(regionCounter.RegionCount)
|
|
|
|
//fmt.Sprintf("%+v", regionCounter.RegionCount)
|
|
|
|
if e != nil {
|
|
|
|
log.Error().Err(e)
|
|
|
|
}
|
|
|
|
log.Debug().Msg(string(s))
|
2022-04-02 02:11:32 +02:00
|
|
|
return c.JSON(regionCounter.RegionCount)
|
2022-03-28 17:35:36 +02:00
|
|
|
})
|
|
|
|
|
2022-04-06 23:26:58 +02:00
|
|
|
log.Error().Err(app.Listen(":8080"))
|
2021-09-17 13:00:28 +02:00
|
|
|
}
|