virtigo/doAdminGui.go

155 lines
3.2 KiB
Go
Raw Normal View History

2025-03-10 04:36:35 -05:00
// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
// Use of this source code is governed by the GPL 3.0
package main
// An app to submit patches for the 30 GO GUI repos
import (
2025-03-10 07:53:11 -05:00
"bytes"
"fmt"
"io/ioutil"
"net/http"
2025-03-10 04:36:35 -05:00
"os"
2025-03-10 07:53:11 -05:00
"os/user"
2025-03-10 04:36:35 -05:00
"time"
"go.wit.com/gui"
"go.wit.com/lib/gadgets"
2025-03-10 07:53:11 -05:00
"go.wit.com/lib/protobuf/virtpb"
2025-03-10 04:36:35 -05:00
"go.wit.com/log"
)
// refresh the windows & tables the user has open
func refresh() {
time.Sleep(90 * time.Second)
if argv.Verbose {
log.Info("virtigo scan here")
}
}
2025-03-10 07:53:11 -05:00
var client *http.Client
2025-03-10 04:36:35 -05:00
func doAdminGui() {
me.myGui = gui.New()
me.myGui.InitEmbed(resources)
me.myGui.Default()
2025-03-10 07:53:11 -05:00
// Initialize a persistent client with a custom Transport
client = &http.Client{
Transport: &http.Transport{
DisableKeepAlives: false, // Ensure Keep-Alive is enabled
},
Timeout: 10 * time.Second, // Set a reasonable timeout
}
2025-03-10 04:36:35 -05:00
win := gadgets.NewGenericWindow("Virtigo: (run your cluster)", "virtigo stuff")
win.Custom = func() {
log.Warn("Main window close")
os.Exit(0)
}
grid := win.Group.RawGrid()
2025-03-10 07:53:11 -05:00
// url := "http://example.com/endpoint"
url := argv.Server
data := []byte(`{"message": "Hello"}`)
grid.NewButton("show hypervisors", func() {
response, err := postData(url, data)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Response:", string(response))
}
2025-03-10 04:36:35 -05:00
})
grid.NewButton("show droplets", func() {
2025-03-10 07:53:11 -05:00
durl := url + "/dumpdroplets"
response, err := postData(durl, data)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Response:", string(response))
}
})
grid.NewButton("uptime", func() {
durl := url + "/uptime"
response, err := postData(durl, data)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Response:", string(response))
}
})
grid.NewButton("get DropletsPB", func() {
durl := url + "/DropletsPB"
data, err := postData(durl, data)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Response len:", len(data))
me.droplets = new(virtpb.Droplets)
if err := me.droplets.Unmarshal(data); err != nil {
fmt.Println("marshal failed", err)
return
}
fmt.Println("Droplet len=", me.droplets.Len())
2025-03-10 04:36:35 -05:00
})
grid.NewButton("clean exit", func() {
okExit("admin close")
})
// sit here forever refreshing the GUI
for {
refresh()
}
}
2025-03-10 07:53:11 -05:00
func postData(url string, data []byte) ([]byte, error) {
req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(data))
if err != nil {
return nil, fmt.Errorf("failed to create request: %w", err)
}
usr, _ := user.Current()
req.Header.Set("author", usr.Username)
req.Header.Set("Connection", "keep-alive") // Ensure keep-alive is used
resp, err := client.Do(req)
if err != nil {
return nil, fmt.Errorf("request failed: %w", err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("failed to read response: %w", err)
}
return body, nil
}
/*
func main() {
url := "http://example.com/endpoint"
data := []byte(`{"message": "Hello"}`)
ticker := time.NewTicker(1 * time.Minute)
defer ticker.Stop()
for range ticker.C {
response, err := postData(url, data)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Response:", string(response))
}
}
}
*/