Staging commit
This commit is contained in:
Felix Niederwanger 2024-02-24 10:44:28 +01:00
parent d5f79eae01
commit 2e55b23f7f
Signed by: phoenix
GPG key ID: 6E77A590E3F6D71C
3 changed files with 36 additions and 11 deletions

View file

@ -2,7 +2,7 @@ package main
import (
"fmt"
"io/ioutil"
"os"
"gopkg.in/yaml.v2"
)
@ -54,7 +54,7 @@ func (cf *Config) Check() error {
}
func (cf *Config) LoadYAML(filename string) error {
content, err := ioutil.ReadFile(filename)
content, err := os.ReadFile(filename)
if err != nil {
return err
}

View file

@ -12,6 +12,7 @@ import (
type Hook struct {
Name string `yaml:"name"` // name of the hook
Route string `yaml:"route"` // http route
Methods []string `yaml:"methods"` // acceptable http methods
Command string `yaml:"command"` // Actual command to execute
Background bool `yaml:"background"` // Run in background
Concurrency int `yaml:"concurrency"` // Number of allowed concurrent runs
@ -180,3 +181,16 @@ func (hook *Hook) IsAddressAllowed(addr string) (bool, error) {
return true, nil
}
// mapHooks creates a map[string][]Hook instance based on the hooks route.
func mapHooks(hooks []Hook) map[string][]Hook {
ret := make(map[string][]Hook, 0)
for _, hook := range hooks {
route := hook.Route
if _, ok := ret[route]; !ok {
ret[route] = make([]Hook, 0)
}
ret[route] = append(ret[route], hook)
}
return ret
}

View file

@ -9,6 +9,7 @@ import (
"net/http"
"os"
"os/signal"
"strings"
"syscall"
"time"
)
@ -52,6 +53,12 @@ func sanityCheckHooks(hooks []Hook) error {
if hook.GID != 0 && uid != 0 {
fmt.Fprintf(os.Stderr, "Warning: Hook '%s' sets 'gid = %d' but we're not running as root\n", hook.Name, hook.GID)
}
if hook.Concurrency < 1 {
return fmt.Errorf("'%s' has concurrency < 1\n", hook.Name)
}
if hook.Route == "" {
return fmt.Errorf("'%s' defines no route\n", hook.Name)
}
}
return nil
}
@ -107,15 +114,18 @@ func main() {
http.HandleFunc("/robots.txt", createRobotsHandler())
// Register hooks
for i, hook := range cf.Hooks {
if hook.Route == "" {
fmt.Fprintf(os.Stderr, "Invalid hook %s: No route defined\n", hook.Name)
hooks := mapHooks(cf.Hooks)
for route, hooks := range hooks {
if route == "" {
panic("invalid route: <empty>")
}
if hook.Concurrency < 1 {
hook.Concurrency = 1
if len(hooks) == 1 {
log.Printf("Webhook for %s - '%s'\n", route, hooks[0].Name)
} else {
log.Printf("Webhooks for %s: %d\n", route, len(hooks))
}
log.Printf("Webhook %d: '%s' [%s] \"%s\"\n", i, hook.Name, hook.Route, hook.Command)
http.HandleFunc(hook.Route, createHandler(hook))
http.HandleFunc(route, createHandler(hooks))
}
awaitTerminationSignal()
@ -133,9 +143,10 @@ func main() {
}
// create a http handler function from the given hook
func createHandler(hook Hook) Handler {
func createHandler(hooks []Hook) Handler {
return func(w http.ResponseWriter, r *http.Request) {
log.Printf("GET %s %s", r.RemoteAddr, hook.Name)
method := strings.ToUpper(r.Method)
log.Printf("%s %s %s", method, r.RemoteAddr, hook.Name)
// Check if adresses are allowed or blocked
allowed, err := hook.IsAddressAllowed(r.RemoteAddr)