// 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 ( "bytes" "fmt" "io/ioutil" "net/http" "os" "os/user" "time" "go.wit.com/gui" "go.wit.com/lib/gadgets" "go.wit.com/lib/protobuf/virtpb" "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") } } var client *http.Client func doAdminGui() { me.myGui = gui.New() me.myGui.InitEmbed(resources) me.myGui.Default() // 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 } win := gadgets.NewGenericWindow("Virtigo: (run your cluster)", "virtigo stuff") win.Custom = func() { log.Warn("Main window close") os.Exit(0) } grid := win.Group.RawGrid() // 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)) } }) grid.NewButton("show droplets", func() { 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()) }) grid.NewButton("clean exit", func() { okExit("admin close") }) // sit here forever refreshing the GUI for { refresh() } } 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)) } } } */