Browse Source

fallback to master for hub index download if it does not exist (#2210)

blotus 2 years ago
parent
commit
6e3ca35941
3 changed files with 19 additions and 3 deletions
  1. 10 1
      cmd/crowdsec-cli/hub.go
  2. 7 2
      pkg/cwhub/download.go
  3. 2 0
      pkg/cwhub/helpers.go

+ 10 - 1
cmd/crowdsec-cli/hub.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	"errors"
 	"fmt"
 
 	"github.com/fatih/color"
@@ -98,7 +99,15 @@ Fetches the [.index.json](https://github.com/crowdsecurity/hub/blob/master/.inde
 				log.Fatal(err)
 			}
 			if err := cwhub.UpdateHubIdx(csConfig.Hub); err != nil {
-				log.Fatalf("Failed to get Hub index : %v", err)
+				if errors.Is(err, cwhub.ErrIndexNotFound) {
+					log.Warnf("Could not find index file for branch '%s', using 'master'", cwhub.HubBranch)
+					cwhub.HubBranch = "master"
+					if err := cwhub.UpdateHubIdx(csConfig.Hub); err != nil {
+						log.Fatalf("Failed to get Hub index after retry : %v", err)
+					}
+				} else {
+					log.Fatalf("Failed to get Hub index : %v", err)
+				}
 			}
 			//use LocalSync to get warnings about tainted / outdated items
 			_, warn := cwhub.LocalSync(csConfig.Hub)

+ 7 - 2
pkg/cwhub/download.go

@@ -18,6 +18,8 @@ import (
 	"gopkg.in/yaml.v2"
 )
 
+var ErrIndexNotFound = fmt.Errorf("index not found")
+
 func UpdateHubIdx(hub *csconfig.Hub) error {
 
 	bidx, err := DownloadHubIdx(hub)
@@ -47,10 +49,13 @@ func DownloadHubIdx(hub *csconfig.Hub) ([]byte, error) {
 	if err != nil {
 		return nil, errors.Wrap(err, "failed http request for hub index")
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != http.StatusOK {
+		if resp.StatusCode == http.StatusNotFound {
+			return nil, ErrIndexNotFound
+		}
 		return nil, fmt.Errorf("bad http code %d while requesting %s", resp.StatusCode, req.URL.String())
 	}
-	defer resp.Body.Close()
 	body, err := io.ReadAll(resp.Body)
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to read request answer for hub index")
@@ -81,7 +86,7 @@ func DownloadHubIdx(hub *csconfig.Hub) ([]byte, error) {
 	return body, nil
 }
 
-//DownloadLatest will download the latest version of Item to the tdir directory
+// DownloadLatest will download the latest version of Item to the tdir directory
 func DownloadLatest(hub *csconfig.Hub, target Item, overwrite bool, updateOnly bool) (Item, error) {
 	var err error
 

+ 2 - 0
pkg/cwhub/helpers.go

@@ -16,12 +16,14 @@ import (
 func chooseHubBranch() (string, error) {
 	latest, err := cwversion.Latest()
 	if err != nil {
+		log.Warningf("Unable to retrieve latest crowdsec version: %s, defaulting to master", err)
 		//lint:ignore nilerr reason
 		return "master", nil // ignore
 	}
 
 	csVersion := cwversion.VersionStrip()
 	if csVersion == latest {
+		log.Debugf("current version is equal to latest (%s)", csVersion)
 		return "master", nil
 	}