From c7cd0a1f604f0d210d4e92364f575bc8432f5587 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Else Date: Sun, 17 May 2020 11:52:42 +0200 Subject: [PATCH] Initial commit --- .drone.yml | 20 ++++++++++++++++ .gitignore | 2 ++ Dockerfile | 10 ++++++++ feed.go | 35 +++++++++++++++++++++++++++ go.mod | 3 +++ main.go | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 139 insertions(+) create mode 100644 .drone.yml create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 feed.go create mode 100644 go.mod create mode 100644 main.go diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..ec9e734 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,20 @@ +kind: pipeline +name: default + +steps: + - name: publish + image: plugins/docker + settings: + username: + from_secret: docker_username + password: + from_secret: docker_password + repo: quay.io/jlelse/bunnypurge + registry: quay.io + tags: latest + when: + branch: + - master + event: + exclude: + - pull_request \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5fc1c6b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.idea +/BunnyPurge \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..5e87ff0 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM golang:1.14-alpine as build +ADD . /app +WORKDIR /app +RUN go build + +FROM alpine:3.11 +RUN apk add --no-cache ca-certificates +COPY --from=build /app/BunnyPurge /bin/ +EXPOSE 8080 +CMD ["BunnyPurge"] \ No newline at end of file diff --git a/feed.go b/feed.go new file mode 100644 index 0000000..ddc0618 --- /dev/null +++ b/feed.go @@ -0,0 +1,35 @@ +package main + +import ( + "encoding/json" + "errors" + "net/http" +) + +type Article struct { + Url string `json:"url"` +} + +func LatestArticle(url string) (*Article, error) { + jsonFeed := &struct { + Items []Article `json:"items"` + }{} + req, err := http.NewRequest(http.MethodGet, url, nil) + if err != nil { + return nil, errors.New("failed to create req to get json feed") + } + req.Header.Add("User-Agent", "BunnyPurge") + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, errors.New("failed to get json feed") + } + err = json.NewDecoder(resp.Body).Decode(&jsonFeed) + _ = resp.Body.Close() + if err != nil { + return nil, errors.New("failed to parse json feed") + } + if len(jsonFeed.Items) < 1 { + return nil, errors.New("no articles in feed") + } + return &jsonFeed.Items[0], nil +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..db9a8fd --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.jlel.se/jlelse/BunnyPurge + +go 1.14 diff --git a/main.go b/main.go new file mode 100644 index 0000000..10e6cd3 --- /dev/null +++ b/main.go @@ -0,0 +1,69 @@ +package main + +import ( + "fmt" + "log" + "net/http" +) + +func main() { + http.HandleFunc("/hook", func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "Wrong HTTP method", http.StatusMethodNotAllowed) + return + } + + bunnyCdnKey, keyPresent := r.URL.Query()["key"] + if !keyPresent || len(bunnyCdnKey[0]) < 1 { + http.Error(w, "Wrong HTTP method", http.StatusBadRequest) + return + } + + feeds, feedsPresent := r.URL.Query()["feed"] + urls, urlsPresent := r.URL.Query()["url"] + + go func() { + var allUrls []string + + if feedsPresent { + for _, feed := range feeds { + article, err := LatestArticle(feed) + if err != nil { + fmt.Println(err.Error()) + continue + } + + if article.Url != "" { + allUrls = append(allUrls, article.Url) + } + } + } + + if urlsPresent { + for _, url := range urls { + allUrls = append(allUrls, url) + } + } + + purge(allUrls, bunnyCdnKey[0]) + }() + + }) + log.Fatal(http.ListenAndServe(":8080", nil)) +} + +func purge(urls []string, bunnyCdnKey string) { + for _, url := range urls { + fmt.Println("Purge:", url) + client := http.DefaultClient + req, _ := http.NewRequest("POST", "https://bunnycdn.com/api/purge?url="+url, nil) + req.Header.Add("User-Agent", "BunnyPurge") + req.Header.Add("Content-Type", "application/json") + req.Header.Add("Accept", "application/json") + req.Header.Add("AccessKey", bunnyCdnKey) + resp, err := client.Do(req) + if err != nil || resp.StatusCode != 200 { + fmt.Println("Failed to purge", url) + } + } +}