r11_urpm-repo/main.go

84 lines
2.2 KiB
Go
Raw Permalink Normal View History

2025-01-13 19:23:44 +03:00
package main
import (
"net/http"
"os"
2025-01-31 22:36:50 +03:00
2025-01-13 19:23:44 +03:00
"github.com/go-chi/chi/v5"
2025-01-31 22:36:50 +03:00
"github.com/go-chi/chi/v5/middleware"
2025-01-13 19:23:44 +03:00
"github.com/spf13/viper"
"github.com/kardianos/service"
)
func main() {
viper.SetConfigName("config")
viper.AddConfigPath(".")
if err := viper.ReadInConfig(); err != nil {
2025-01-31 23:52:08 +03:00
logger.Fatalf("Error reading config file: %v", err)
2025-01-13 19:23:44 +03:00
}
initLogger()
repo := NewRepository()
router := chi.NewRouter()
2025-01-31 22:36:50 +03:00
router.Use(middleware.Logger)
router.Use(authMiddleware)
2025-01-13 19:23:44 +03:00
router.Post("/{arch}", repo.UploadHandler)
svcConfig := &service.Config{
Name: "urpm-repo",
DisplayName: "URPM Repository Service",
Description: "Service for managing URPM packages",
}
s, err := service.New(&serviceProgram{repo, router}, svcConfig)
if err != nil {
logger.Fatal(err)
}
if len(os.Args) > 1 {
2025-01-31 23:52:08 +03:00
switch os.Args[1] {
case "install":
2025-01-13 19:23:44 +03:00
if err := s.Install(); err != nil {
logger.Fatal(err)
}
return
2025-01-31 23:52:08 +03:00
case "uninstall":
2025-01-13 19:23:44 +03:00
if err := s.Uninstall(); err != nil {
logger.Fatal(err)
}
return
}
}
if err := s.Run(); err != nil {
logger.Fatal(err)
}
}
type serviceProgram struct {
2025-01-31 22:36:50 +03:00
repo *Repository
router *chi.Mux
2025-01-13 19:23:44 +03:00
}
func (p *serviceProgram) Start(s service.Service) error {
logger.Info("Starting URPM Repository Service...")
go func() {
if err := http.ListenAndServe(viper.GetString("server.address"), p.router); err != nil {
logger.Error(err)
}
}()
return nil
}
func (p *serviceProgram) Stop(s service.Service) error {
logger.Info("Stopping URPM Repository Service...")
return nil
2025-01-31 22:36:50 +03:00
}
func authMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
authToken := r.Header.Get("Authorization")
expectedToken := viper.GetString("auth.token")
2025-01-31 23:52:08 +03:00
if authToken != "Bearer "+expectedToken {
2025-01-31 22:36:50 +03:00
http.Error(w, "Unauthorized", http.StatusUnauthorized)
2025-01-31 23:52:08 +03:00
logger.Error("Unauthorized access attempt")
2025-01-31 22:36:50 +03:00
return
}
next.ServeHTTP(w, r)
})
2025-01-13 19:23:44 +03:00
}