Parcourir la source

begin pier broadcast status construction

reid il y a 2 ans
Parent
commit
5eba1d2459
3 fichiers modifiés avec 59 ajouts et 2 suppressions
  1. 22 0
      broadcast/broadcast.go
  2. 30 0
      docker/docker.go
  3. 7 2
      structs/structs.go

+ 22 - 0
broadcast/broadcast.go

@@ -125,6 +125,13 @@ func constructPierInfo(piers []string) (map[string]structs.Urbit, error) {
 	for pier, status := range pierStatus {
 		// pull docker info from json
 		var dockerConfig structs.UrbitDocker
+		var dockerStats structs.ContainerStats
+		dockerStats, err := docker.GetContainerStats(pier)
+		if err != null {
+			errmsg := fmt.Sprintf("Unable to load %s stats: %v", pier, err)
+			logger.Error(errmsg)
+			continue
+		}
 		confPath := filepath.Join(config.BasePath, "settings", "pier", pier+".json")
 		file, err := ioutil.ReadFile(confPath)
 		if err != nil {
@@ -143,10 +150,25 @@ func constructPierInfo(piers []string) (map[string]structs.Urbit, error) {
 			urbit = existingUrbit
 		}
 		isRunning := (status == "Up" || strings.HasPrefix(status, "Up "))
+		bootStatus := true
+		if dockerConfig.BootStatus == "ignore" {
+			bootStatus = false
+		}
+		setRemote := false
+		if dockerConfig.Network == "wireguard" {
+			setRemote = true
+		}
 		urbit.Info.Running = isRunning
 		urbit.Info.Network = shipNetworks[pier]
 		urbit.Info.URL = "http://" + hostName + ":" + string(dockerConfig.HTTPPort)
 		urbit.Info.LoomSize = int(math.Pow(2, float64(dockerConfig.LoomSize)) / math.Pow(1024, 2))
+		urbit.Info.DiskUsage = dockerStats.DiskUsage
+		urbit.Info.MemUsage = dockerStats.MemoryUsage
+		urbit.Info.DevMode = dockerConfig.DevMode
+		urbit.Info.Vere = dockerConfig.UrbitVersion
+		urbit.Info.DetectBootStatus = bootStatus
+		urbit.Info.Remote = setRemote
+		urbit.Info.Vere = dockerconfig.UrbitVersion
 		updates[pier] = urbit
 	}
 	return updates, nil

+ 30 - 0
docker/docker.go

@@ -67,3 +67,33 @@ func GetContainerNetwork(name string) (string, error) {
 	}
 	return "", fmt.Errorf("container is not attached to any network")
 }
+
+func GetContainerStats(containerName string) (*ContainerStats, error) {
+	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
+	if err != nil {
+		return nil, err
+	}
+	defer cli.Close()
+	stats, err := cli.ContainerStats(context.Background(), containerName, false)
+	if err != nil {
+		return nil, err
+	}
+	defer stats.Body.Close()
+
+	var stat types.StatsJSON
+	if err := stats.Decode(&stat); err != nil {
+		return nil, err
+	}
+	memUsage := stat.MemoryStats.Usage
+	var diskUsage uint64
+	for _, mount := range stat.Mounts {
+		if mount.Name == "container_root" {
+			diskUsage = mount.SizeRw
+			break
+		}
+	}
+	return &ContainerStats{
+		MemoryUsage: memUsage,
+		DiskUsage:   diskUsage,
+	}, nil
+}

+ 7 - 2
structs/structs.go

@@ -155,8 +155,8 @@ type Urbit struct {
 		Running          bool   `json:"running"`
 		URL              string `json:"url"`
 		UrbAlias         bool   `json:"urbAlias"`
-		MemUsage         int    `json:"memUsage"`
-		DiskUsage        int    `json:"diskUsage"`
+		MemUsage         uint64    `json:"memUsage"`
+		DiskUsage        uint64    `json:"diskUsage"`
 		LoomSize         int    `json:"loomSize"`
 		DevMode          bool   `json:"devMode"`
 		DetectBootStatus bool   `json:"detectBootStatus"`
@@ -252,4 +252,9 @@ type UrbitDocker struct {
 	ShowUrbitWeb     string `json:"show_urbit_web"`
 	DevMode          bool   `json:"dev_mode"`
 	Click            bool   `json:"click"`
+}
+
+type ContainerStats struct {
+	MemoryUsage uint64
+	DiskUsage   uint64
 }