reload config on new webhook request

This commit is contained in:
Akbar Rahman 2022-02-12 14:07:11 +00:00
parent cdd19d95e9
commit 8f0cf776b1
Signed by: alvierahman90
GPG Key ID: 20609519444A1269
3 changed files with 49 additions and 14 deletions

View File

@ -3,15 +3,17 @@ all: install
clean: clean:
rm -rf gohookr rm -rf gohookr
install: install: build
go mod tidy
go build -o gohookr
cp gohookr /usr/local/bin/ cp gohookr /usr/local/bin/
cp gohookr.service /usr/lib/systemd/system/ cp gohookr.service /usr/lib/systemd/system/
cp -n config.json /etc/gohookr.json cp -n config.json /etc/gohookr.json
systemctl daemon-reload systemctl daemon-reload
systemctl enable --now gohookr systemctl enable --now gohookr
build:
go mod tidy
go build -o gohookr
uninstall: uninstall:
systemctl disable --now gohookr systemctl disable --now gohookr
rm -rf /usr/local/bin/gohookr /usr/lib/systemd/system/gohookr.service rm -rf /usr/local/bin/gohookr /usr/lib/systemd/system/gohookr.service

39
main.go
View File

@ -18,9 +18,10 @@ import (
var config_filename = "/etc/gohookr.json" var config_filename = "/etc/gohookr.json"
var checkSignature = true var checkSignature = true
var c config.Config
func main() { func main() {
var c config.Config
r := mux.NewRouter() r := mux.NewRouter()
r.HandleFunc("/webhooks/{service}", webhookHandler) r.HandleFunc("/webhooks/{service}", webhookHandler)
@ -32,23 +33,47 @@ func main() {
checkSignature = p != "true" checkSignature = p != "true"
} }
raw_config, err := ioutil.ReadFile(config_filename) c, err := loadConfig(config_filename)
if err != nil { if err != nil {
panic(err.Error()) panic(err.Error())
} }
fmt.Printf("CONFIG OK: %s\n", config_filename)
fmt.Printf("LISTENING AT: %s\n", c.ListenAddress)
if err := json.Unmarshal(raw_config, &c); err != nil { for _, v := range os.Args {
panic(err.Error()) if v == "checkConfig" {
return
} }
if err := c.Validate(); err != nil {
panic(err.Error())
} }
log.Fatal(http.ListenAndServe(c.ListenAddress, r)) log.Fatal(http.ListenAndServe(c.ListenAddress, r))
} }
func loadConfig(config_filename string) (config.Config, error) {
var c config.Config
raw_config, err := ioutil.ReadFile(config_filename)
if err != nil {
return config.Config{}, err
}
if err := json.Unmarshal(raw_config, &c); err != nil {
return config.Config{}, err
}
if err := c.Validate(); err != nil {
return config.Config{}, err
}
return c, nil
}
func webhookHandler(w http.ResponseWriter, r *http.Request) { func webhookHandler(w http.ResponseWriter, r *http.Request) {
c, err := loadConfig(config_filename)
if err != nil {
writeResponse(w, 500, "Unable to read config file")
}
// Check what service is specified in URL (/webhooks/{service}) and if it exists // Check what service is specified in URL (/webhooks/{service}) and if it exists
serviceName := string(mux.Vars(r)["service"]) serviceName := string(mux.Vars(r)["service"])
service, ok := c.Services[serviceName] service, ok := c.Services[serviceName]

View File

@ -15,10 +15,17 @@ make
Default config path is `/etc/gohookr.json`. Default config path is `/etc/gohookr.json`.
It can be overriden by setting environment variable `CONFIG`. It can be overriden by setting environment variable `CONFIG`.
The config file will be re-read every request so service configs can be changed without restarting
the service (unless you want to change the listening port).
Check below for an example configuration, which should tell you most of the things you need to know Check below for an example configuration, which should tell you most of the things you need to know
to configure gohookr. to configure gohookr.
Currently gohookr must be restarted after config changes. You can test your config file by running
```
gohookr checkConfig
```
### Signature Verification ### Signature Verification
@ -32,7 +39,8 @@ For GitHub it would be `sha256=`.
#### Disable Signature Verification #### Disable Signature Verification
You can disable signature verification by setting `DisableSignatureVerification` for a service to `true`. You can disable signature verification by setting `DisableSignatureVerification` for a service to
`true`.
You can disable signature verification for all services by setting environment variable You can disable signature verification for all services by setting environment variable
`NO_SIGNATURE_VERIFICATION` to `true`. `NO_SIGNATURE_VERIFICATION` to `true`.