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
|
|
|
}
|