gitea-attachements-proxy/main.go

172 lines
4.2 KiB
Go
Raw Normal View History

2021-09-17 13:00:28 +02:00
package main
import (
"code.gitea.io/sdk/gitea"
"fmt"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
"github.com/kpango/glg"
"sync"
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
}
type RegionCounter struct {
RegionCount map[string]int
sync.RWMutex
}
2021-09-17 13:00:28 +02:00
const giteaURL = "https://git.entr0py.de"
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")
}
func (r *RegionCounter) countRegion(region string) {
glg.Infof("Region %s", region)
glg.Debugf("%+v", r.RegionCount)
if region == "" {
return
}
_, ok := r.RegionCount[region]
if !ok {
glg.Info("New region")
r.RegionCount[region] = 1
glg.Debugf("%+v", r.RegionCount)
return
}
r.Lock()
defer r.Unlock()
r.RegionCount[region]++
glg.Debugf("%+v", r.RegionCount)
}
2021-09-17 13:00:28 +02:00
func main() {
regionCounter := &RegionCounter{
RegionCount: make(map[string]int),
}
2021-09-17 13:00:28 +02:00
app := fiber.New(fiber.Config{
GETOnly: true,
ServerHeader: "Fiber",
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 {
glg.Debugf("%+v", map[string]string{"user": c.Params("user"), "repo": c.Params("repo"), "name": c.Params("name")})
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
}
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 {
glg.Debugf("%+v", map[string]string{"user": c.Params("user"), "repo": c.Params("repo"), "name": c.Params("name"), "channel": c.Params("channel")})
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
}
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 {
glg.Debugf("%+v", map[string]string{"user": c.Params("user"), "repo": c.Params("repo"), "name": c.Params("name"), "tag": c.Params("tag")})
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
}
go regionCounter.countRegion(c.GetReqHeaders()["Fly-Region"])
2021-09-17 13:00:28 +02:00
c.Redirect(url, 307)
return nil
})
app.Get("/regions", func(c *fiber.Ctx) error {
regionCounter.RLock()
defer regionCounter.RUnlock()
c.JSON(regionCounter.RegionCount)
glg.Debugf("%+v", regionCounter.RegionCount)
return nil
})
2021-09-17 13:00:28 +02:00
app.Listen(":8080")
}