1
0
mirror of https://github.com/shirou/gopsutil.git synced 2025-04-24 13:48:56 +08:00
shirou_gopsutil/cpu/cpu_aix_nocgo.go

158 lines
3.6 KiB
Go
Raw Permalink Normal View History

// SPDX-License-Identifier: BSD-3-Clause
//go:build aix && !cgo
package cpu
import (
"context"
"strconv"
2023-02-12 09:24:52 +00:00
"strings"
2022-06-03 17:43:52 +02:00
"github.com/shirou/gopsutil/v4/internal/common"
)
func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) {
2024-05-15 09:49:08 -04:00
var ret []TimesStat
2022-06-17 14:53:16 +02:00
if percpu {
2024-05-15 12:55:11 -04:00
per_out, err := invoke.CommandWithContext(ctx, "sar", "-u", "-P", "ALL", "10", "1")
2024-05-15 09:49:08 -04:00
if err != nil {
return nil, err
}
lines := strings.Split(string(per_out), "\n")
2024-05-15 13:55:37 -04:00
if len(lines) < 6 {
2024-05-15 09:49:08 -04:00
return []TimesStat{}, common.ErrNotImplementedError
}
hp := strings.Fields(lines[5]) // headers
for l := 6; l < len(lines)-1; l++ {
ct := &TimesStat{}
2024-05-15 09:49:08 -04:00
v := strings.Fields(lines[l]) // values
for i, header := range hp {
// We're done in any of these use cases
if i >= len(v) || v[0] == "-" {
break
}
// Position variable for v
pos := i
// There is a missing field at the beginning of all but the first line
// so adjust the position
if l > 6 {
pos = i - 1
}
// We don't want invalid positions
if pos < 0 {
continue
}
if t, err := strconv.ParseFloat(v[pos], 64); err == nil {
2024-05-15 09:49:08 -04:00
switch header {
case `cpu`:
ct.CPU = strconv.FormatFloat(t, 'f', -1, 64)
2024-05-15 09:49:08 -04:00
case `%usr`:
ct.User = t
case `%sys`:
ct.System = t
case `%wio`:
ct.Iowait = t
case `%idle`:
ct.Idle = t
}
}
}
// Valid CPU data, so append it
ret = append(ret, *ct)
2024-05-15 09:49:08 -04:00
}
2022-06-17 14:53:16 +02:00
} else {
out, err := invoke.CommandWithContext(ctx, "sar", "-u", "10", "1")
if err != nil {
return nil, err
}
lines := strings.Split(string(out), "\n")
if len(lines) < 5 {
return []TimesStat{}, common.ErrNotImplementedError
}
2024-05-15 09:49:08 -04:00
ct := &TimesStat{CPU: "cpu-total"}
2023-12-21 09:59:41 +02:00
h := strings.Fields(lines[len(lines)-3]) // headers
v := strings.Fields(lines[len(lines)-2]) // values
2022-06-17 14:53:16 +02:00
for i, header := range h {
2022-06-17 15:10:37 +02:00
if t, err := strconv.ParseFloat(v[i], 64); err == nil {
2022-06-17 14:53:16 +02:00
switch header {
2023-02-12 09:24:52 +00:00
case `%usr`:
2024-05-15 09:49:08 -04:00
ct.User = t
2023-02-12 09:24:52 +00:00
case `%sys`:
2024-05-15 09:49:08 -04:00
ct.System = t
2023-02-12 09:24:52 +00:00
case `%wio`:
2024-05-15 09:49:08 -04:00
ct.Iowait = t
2023-02-12 09:24:52 +00:00
case `%idle`:
2024-05-15 09:49:08 -04:00
ct.Idle = t
2022-06-17 14:53:16 +02:00
}
}
}
2024-05-15 09:49:08 -04:00
ret = append(ret, *ct)
2022-06-17 14:53:16 +02:00
}
2024-05-15 09:49:08 -04:00
return ret, nil
}
2022-06-17 14:53:16 +02:00
func InfoWithContext(ctx context.Context) ([]InfoStat, error) {
out, err := invoke.CommandWithContext(ctx, "prtconf")
if err != nil {
2022-06-17 14:53:16 +02:00
return nil, err
}
2022-06-17 14:53:16 +02:00
ret := InfoStat{}
for _, line := range strings.Split(string(out), "\n") {
if strings.HasPrefix(line, "Number Of Processors:") {
2023-12-21 09:59:41 +02:00
p := strings.Fields(line)
2022-06-17 14:53:16 +02:00
if len(p) > 3 {
if t, err := strconv.ParseUint(p[3], 10, 64); err == nil {
ret.Cores = int32(t)
}
}
} else if strings.HasPrefix(line, "Processor Clock Speed:") {
2023-12-21 09:59:41 +02:00
p := strings.Fields(line)
2022-06-17 14:53:16 +02:00
if len(p) > 4 {
2022-06-17 15:10:37 +02:00
if t, err := strconv.ParseFloat(p[3], 64); err == nil {
2022-06-17 14:53:16 +02:00
switch strings.ToUpper(p[4]) {
case "MHZ":
2022-06-17 15:10:37 +02:00
ret.Mhz = t
2022-06-17 14:53:16 +02:00
case "GHZ":
2022-06-17 15:10:37 +02:00
ret.Mhz = t * 1000.0
2022-06-17 14:53:16 +02:00
case "KHZ":
2022-06-17 15:10:37 +02:00
ret.Mhz = t / 1000.0
2022-06-17 14:53:16 +02:00
default:
2022-06-17 15:10:37 +02:00
ret.Mhz = t
2022-06-17 14:53:16 +02:00
}
}
}
2022-06-17 14:53:16 +02:00
break
} else if strings.HasPrefix(line, "System Model:") {
p := strings.Split(string(line), ":")
if p != nil {
ret.VendorID = strings.TrimSpace(p[1])
}
} else if strings.HasPrefix(line, "Processor Type:") {
p := strings.Split(string(line), ":")
if p != nil {
c := strings.Split(string(p[1]), "_")
if c != nil {
ret.Family = strings.TrimSpace(c[0])
ret.Model = strings.TrimSpace(c[1])
}
}
}
}
2022-06-17 14:53:16 +02:00
return []InfoStat{ret}, nil
}
func CountsWithContext(ctx context.Context, logical bool) (int, error) {
info, err := InfoWithContext(ctx)
if err == nil {
return int(info[0].Cores), nil
}
return 0, err
}