teafolio/main.go

73 lines
1.5 KiB
Go
Raw Normal View History

2020-05-02 02:16:49 +00:00
package main
import (
"context"
2020-05-02 02:16:49 +00:00
"flag"
"log"
"net/http"
"regexp"
"strings"
"sync"
2020-05-02 02:16:49 +00:00
"github.com/BurntSushi/toml"
"golang.org/x/sync/semaphore"
2020-05-02 02:16:49 +00:00
)
type Config struct {
BindTo string
Gitea struct {
URL, Org string
MaxConnections int64
2020-05-02 02:16:49 +00:00
}
Redirect map[string]string
2020-05-02 02:16:49 +00:00
Template struct {
AppName string
HomepageHeaderHTML string
CustomLogoPngBase64 string
}
}
type Application struct {
cfg Config
rxRepoPage, rxRepoImage *regexp.Regexp
apiSem *semaphore.Weighted
reposMut sync.RWMutex
reposCache []Repo // Sorted by recently-created-first
reposAlphabeticalOrder map[string]int
2020-05-02 02:16:49 +00:00
}
func main() {
app := Application{
rxRepoPage: regexp.MustCompile(`^/([^/]+)/?$`),
rxRepoImage: regexp.MustCompile(`^/:banner/([^/]+)/?$`),
}
configFile := flag.String(`ConfigFile`, `config.toml`, `Configuration file in TOML format`)
flag.Parse()
_, err := toml.DecodeFile(*configFile, &app.cfg)
if err != nil {
2020-11-18 21:16:33 +00:00
log.Fatalf("toml.DecodeFile: %s", err.Error())
2020-05-02 02:16:49 +00:00
}
// Assert Gitea URL always has trailing slash
if !strings.HasSuffix(app.cfg.Gitea.URL, `/`) {
app.cfg.Gitea.URL += `/`
}
// Create semaphore
if app.cfg.Gitea.MaxConnections == 0 { // unlimited
app.apiSem = semaphore.NewWeighted(99999)
} else {
app.apiSem = semaphore.NewWeighted(app.cfg.Gitea.MaxConnections)
}
// Sync worker
go app.syncWorker(context.Background())
log.Printf("Starting web server on [%s]...", app.cfg.BindTo)
2020-05-02 02:16:49 +00:00
log.Fatal(http.ListenAndServe(app.cfg.BindTo, &app))
}