elastop

- Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.acid.vegas/-c.git
Log | Files | Refs | Archive | README | LICENSE

commit 55db2a7a136a8331dacccac79a44e57f1586af53
parent 1caff777348ff296bcc800e8c2424b14deb23c9e
Author: acidvegas <acid.vegas@acid.vegas>
Date: Mon, 2 Dec 2024 21:29:34 -0500

Added API authentication support

Diffstat:
Melastop | 0
Melastop.go | 33+++++++++++++++++++++++++++++++--

2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/elastop b/elastop
Binary files differ.
diff --git a/elastop.go b/elastop.go
@@ -233,6 +233,10 @@ type DataStream struct {
 	Template  string `json:"template"`
 }
 
+var (
+	apiKey string
+)
+
 func bytesToHuman(bytes int64) string {
 	const unit = 1024
 	if bytes < unit {
@@ -539,8 +543,9 @@ func updateGridLayout(grid *tview.Grid, showRoles, showIndices, showMetrics bool
 func main() {
 	host := flag.String("host", "http://localhost", "Elasticsearch host URL (e.g., http://localhost or https://example.com)")
 	port := flag.Int("port", 9200, "Elasticsearch port")
-	user := flag.String("user", "elastic", "Elasticsearch username")
+	user := flag.String("user", os.Getenv("ES_USER"), "Elasticsearch username")
 	password := flag.String("password", os.Getenv("ES_PASSWORD"), "Elasticsearch password")
+	flag.StringVar(&apiKey, "apikey", os.Getenv("ES_API_KEY"), "Elasticsearch API key")
 	flag.Parse()
 
 	// Validate and process the host URL
@@ -549,6 +554,17 @@ func main() {
 		os.Exit(1)
 	}
 
+	// Validate authentication
+	if apiKey != "" && (*user != "" || *password != "") {
+		fmt.Fprintf(os.Stderr, "Error: Cannot use both API key and username/password authentication\n")
+		os.Exit(1)
+	}
+
+	if apiKey == "" && (*user == "" || *password == "") {
+		fmt.Fprintf(os.Stderr, "Error: Must provide either API key or both username and password\n")
+		os.Exit(1)
+	}
+
 	// Strip any trailing slash from the host
 	*host = strings.TrimRight(*host, "/")
 
@@ -608,12 +624,25 @@ func main() {
 			if err != nil {
 				return err
 			}
-			req.SetBasicAuth(*user, *password)
+
+			// Set authentication
+			if apiKey != "" {
+				req.Header.Set("Authorization", fmt.Sprintf("ApiKey %s", apiKey))
+			} else {
+				req.SetBasicAuth(*user, *password)
+			}
+
 			resp, err := client.Do(req)
 			if err != nil {
 				return err
 			}
 			defer resp.Body.Close()
+
+			if resp.StatusCode != http.StatusOK {
+				body, _ := io.ReadAll(resp.Body)
+				return fmt.Errorf("API request failed with status %d: %s", resp.StatusCode, string(body))
+			}
+
 			body, err := io.ReadAll(resp.Body)
 			if err != nil {
 				return err