Oculus/api.go

116 lines
2.6 KiB
Go

package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os/exec"
"strings"
)
type ContainerInfo struct {
ID string
Name string
CName string
Interval string
Ignores []string
}
func listContainersHandler(w http.ResponseWriter, r *http.Request) {
containers, err := listContainers()
if err != nil {
http.Error(w, fmt.Sprintf("Error listing containers: %v", err), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(containers); err != nil {
http.Error(w, fmt.Sprintf("Error encoding response: %v", err), http.StatusInternalServerError)
}
}
func getDiffHandler(w http.ResponseWriter, r *http.Request) {
containerID := r.URL.Query().Get("id")
if containerID == "" {
http.Error(w, "Missing container ID", http.StatusBadRequest)
return
}
diffOutput, err := getDiffOutput(containerID)
if err != nil {
http.Error(w, fmt.Sprintf("Error getting diff for container %s: %v", containerID, err), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "text/plain")
w.Write([]byte(diffOutput))
}
func startServer() {
http.HandleFunc("/containers", listContainersHandler)
http.HandleFunc("/diff", getDiffHandler)
log.Println("Starting server on :8080")
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatalf("Error starting server: %v", err)
}
}
func listContainers() ([]ContainerInfo, error) {
output, err := exec.Command("docker", "ps", "--format", "{{.ID}} {{.Names}} {{.Label \"oculus.enable\"}} {{.Label \"oculus.interval\"}} {{.Label \"oculus.cname\"}} {{.Label \"oculus.ignores\"}}").Output()
if err != nil {
return nil, err
}
lines := strings.Split(string(output), "\n")
var containers []ContainerInfo
for _, line := range lines {
if line == "" {
continue
}
parts := strings.Fields(line)
if len(parts) < 3 || parts[2] == "" {
continue
}
id := parts[0]
name := parts[1]
interval := "300s"
if len(parts) > 3 && parts[3] != "" {
interval = parts[3]
}
cname := name
if len(parts) > 4 && parts[4] != "" {
cname = parts[4]
}
ignores := []string{}
if len(parts) > 5 && parts[5] != "" {
ignores = strings.Split(parts[5], ",")
}
containers = append(containers, ContainerInfo{
ID: id,
Name: name,
CName: cname,
Interval: interval,
Ignores: ignores,
})
}
return containers, nil
}
func getDiffOutput(containerID string) (string, error) {
cmd := exec.Command("docker", "diff", containerID)
output, err := cmd.Output()
if err != nil {
return "", fmt.Errorf("docker diff failed: %w", err)
}
return string(output), nil
}
func main() {
startServer()
}