Merge branch 'shirou:master' into patch-1

pull/1655/head
Niv Govrin 9 months ago committed by GitHub
commit b6c524eda4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -14,6 +14,8 @@ package:net:
- net/*
package:process:
- process/*
package:sensors:
- sensors/*
package:winservices:
- winservices/*
os:linux:

@ -13,7 +13,7 @@ jobs:
run: |
versions=$(curl -s 'https://go.dev/dl/?mode=json' | jq -c 'map(.version[2:])')
echo "::set-output name=value::${versions}"
build_test_v3:
build_test:
needs: go-versions
strategy:
fail-fast: false

@ -13,7 +13,7 @@ jobs:
run: |
versions=$(curl -s 'https://go.dev/dl/?mode=json' | jq -c 'map(.version[2:])')
echo "::set-output name=value::${versions}"
test_v3_module:
test:
needs: go-versions
strategy:
fail-fast: false

@ -84,7 +84,7 @@ macos_test:
init_tools:
go get github.com/golang/dep/cmd/dep
TAG=$(shell date +'v3.%y.%-m' --date='last Month')
TAG=$(shell date +'v4.%y.%-m' --date='last Month')
release:
git tag $(TAG)

@ -5,20 +5,21 @@
This is a port of psutil (https://github.com/giampaolo/psutil). The
challenge is porting all psutil functions on some architectures.
## v3 migration
## migration
From v3.20.10, gopsutil becomes v3 which breaks backwards compatibility.
See [v3Changes.md](_tools/v3migration/v3Changes.md) for more detailed changes.
### v4 migration
There are some breaking changes. Please see [v4 release note](https://github.com/shirou/gopsutil/releases/tag/v4.24.5).
## Tag semantics
gopsutil tag policy is almost same as Semantic Versioning, but
automatically increases like [Ubuntu versioning](https://calver.org/).
For example, v2.17.04 means
For example, v4.24.04 means
- v2: major version
- 17: release year, 2017
- v4: major version
- 24: release year, 2024
- 04: release month
gopsutil aims to keep backwards compatibility until major version change.
@ -33,16 +34,14 @@ can be skipped.
- Windows i386/amd64/arm/arm64
- Darwin amd64/arm64
- OpenBSD i386/amd64/armv7/arm64/riscv64 (Thank you @mpfz0r!)
- Solaris amd64 (developed and tested on SmartOS/Illumos, Thank you
@jen20!)
- Solaris amd64 (developed and tested on SmartOS/Illumos, Thank you @jen20!)
These have partial support:
- CPU on DragonFly BSD (#893, Thank you @gballet!)
- host on Linux RISC-V (#896, Thank you @tklauser!)
All works are implemented without cgo by porting C structs to golang
structs.
All works are implemented without cgo by porting C structs to golang structs.
## Usage
@ -52,8 +51,7 @@ package main
import (
"fmt"
"github.com/shirou/gopsutil/v3/mem"
// "github.com/shirou/gopsutil/mem" // to use v2
"github.com/shirou/gopsutil/v4/mem"
)
func main() {
@ -120,13 +118,38 @@ Be very careful that enabling the cache may cause inconsistencies. For example,
- `process`
- EnableBootTimeCache
### `Ex` struct (from v4.24.5)
gopsutil is designed to work across multiple platforms. However, there are differences in the information available on different platforms, such as memory information that exists on Linux but not on Windows.
As of v4.24.5, to access this platform-specific information, gopsutil provides functions named `Ex` within the package. Currently, these functions are available in the mem and sensor packages.
The Ex structs are specific to each platform. For example, on Linux, there is an `ExLinux` struct, which can be obtained using the `mem.NewExLinux()` function. On Windows, it's `mem.ExWindows()`. These Ex structs provide platform-specific information.
```
ex := NewExWindows()
v, err := ex.VirtualMemory()
if err != nil {
panic(err)
}
fmt.Println(v.VirtualAvail)
fmt.Println(v.VirtualTotal)
// Output:
// 140731958648832
// 140737488224256
```
gopsutil aims to minimize platform differences by offering common functions. However, there are many requests to obtain unique information for each platform. The Ex structs are designed to meet those requests. Additional functionalities might be added in the future. The use of these structures makes it clear that the information they provide is specific to each platform, which is why they have been designed in this way.
## Documentation
See https://pkg.go.dev/github.com/shirou/gopsutil/v3 or https://godocs.io/github.com/shirou/gopsutil/v3
See https://pkg.go.dev/github.com/shirou/gopsutil/v4 or https://godocs.io/github.com/shirou/gopsutil/v4
## Requirements
- go1.16 or above is required.
- go1.18 or above is required.
## More Info
@ -184,28 +207,29 @@ Some code is ported from Ohai. Many thanks.
- x: works
- b: almost works, but something is broken
|name |Linux |FreeBSD |OpenBSD |macOS |Windows |Solaris |Plan 9 |
|----------------------|-------|---------|---------|--------|---------|---------|---------|
|cpu\_times |x |x |x |x |x | |b |
|cpu\_count |x |x |x |x |x | |x |
|cpu\_percent |x |x |x |x |x | | |
|cpu\_times\_percent |x |x |x |x |x | | |
|virtual\_memory |x |x |x |x |x | b |x |
|swap\_memory |x |x |x |x | | |x |
|disk\_partitions |x |x |x |x |x | | |
|disk\_io\_counters |x |x |x | | | | |
|disk\_usage |x |x |x |x |x | | |
|net\_io\_counters |x |x |x |b |x | | |
|boot\_time |x |x |x |x |x | | |
|users |x |x |x |x |x | | |
|pids |x |x |x |x |x | | |
|pid\_exists |x |x |x |x |x | | |
|net\_connections |x |x |x |x | | | |
|net\_protocols |x | | | | | | |
|net\_if\_addrs | | | | | | | |
|net\_if\_stats | | | | | | | |
|netfilter\_conntrack |x | | | | | | |
- c: works in CGO only
|name |Linux |FreeBSD |OpenBSD |macOS |Windows |Solaris |Plan 9 |AIX |
|----------------------|-------|---------|---------|--------|---------|---------|---------|---------|
|cpu\_times |x |x |x |x |x | |b |x |
|cpu\_count |x |x |x |x |x | |x |x |
|cpu\_percent |x |x |x |x |x | | |x |
|cpu\_times\_percent |x |x |x |x |x | | |x |
|virtual\_memory |x |x |x |x |x | b |x |x |
|swap\_memory |x |x |x |x | | |x |X |
|disk\_partitions |x |x |x |x |x | | |x |
|disk\_io\_counters |x |x |x | | | | | |
|disk\_usage |x |x |x |x |x | | |x |
|net\_io\_counters |x |x |x |b |x | | | |
|boot\_time |x |x |x |x |x | | |X |
|users |x |x |x |x |x | | |x |
|pids |x |x |x |x |x | | | |
|pid\_exists |x |x |x |x |x | | | |
|net\_connections |x |x |x |x | | | |x |
|net\_protocols |x | | | | | | |x |
|net\_if\_addrs | | | | | | | |x |
|net\_if\_stats | | | | | | | |x |
|netfilter\_conntrack |x | | | | | | | |
### Process class
@ -254,37 +278,37 @@ Some code is ported from Ohai. Many thanks.
### Original Metrics
|item |Linux |FreeBSD |OpenBSD |macOS |Windows |Solaris |
|-----------------|-------|---------|---------|--------|--------|---------|
|**HostInfo** | | | | | | |
|hostname |x |x |x |x |x |x |
|uptime |x |x |x |x | |x |
|process |x |x |x | | |x |
|os |x |x |x |x |x |x |
|platform |x |x |x |x | |x |
|platformfamily |x |x |x |x | |x |
|virtualization |x | | | | | |
|**CPU** | | | | | | |
|VendorID |x |x |x |x |x |x |
|Family |x |x |x |x |x |x |
|Model |x |x |x |x |x |x |
|Stepping |x |x |x |x |x |x |
|PhysicalID |x | | | | |x |
|CoreID |x | | | | |x |
|Cores |x | | | |x |x |
|ModelName |x |x |x |x |x |x |
|Microcode |x | | | | |x |
|**LoadAvg** | | | | | | |
|Load1 |x |x |x |x | | |
|Load5 |x |x |x |x | | |
|Load15 |x |x |x |x | | |
|**GetDockerID** | | | | | | |
|container id |x |no |no |no |no | |
|**CgroupsCPU** | | | | | | |
|user |x |no |no |no |no | |
|system |x |no |no |no |no | |
|**CgroupsMem** | | | | | | |
|various |x |no |no |no |no | |
|item |Linux |FreeBSD |OpenBSD |macOS |Windows |Solaris |AIX |
|-----------------|-------|---------|---------|--------|--------|---------|---------|
|**HostInfo** | | | | | | | |
|hostname |x |x |x |x |x |x |X |
|uptime |x |x |x |x | |x |x |
|process |x |x |x | | |x | |
|os |x |x |x |x |x |x |x |
|platform |x |x |x |x | |x |x |
|platformfamily |x |x |x |x | |x |x |
|virtualization |x | | | | | | |
|**CPU** | | | | | | | |
|VendorID |x |x |x |x |x |x |x |
|Family |x |x |x |x |x |x |x |
|Model |x |x |x |x |x |x |x |
|Stepping |x |x |x |x |x |x | |
|PhysicalID |x | | | | |x | |
|CoreID |x | | | | |x | |
|Cores |x | | | |x |x |x |
|ModelName |x |x |x |x |x |x |x |
|Microcode |x | | | | |x | |
|**LoadAvg** | | | | | | | |
|Load1 |x |x |x |x | | |x |
|Load5 |x |x |x |x | | |x |
|Load15 |x |x |x |x | | |x |
|**GetDockerID** | | | | | | | |
|container id |x |no |no |no |no | | |
|**CgroupsCPU** | | | | | | | |
|user |x |no |no |no |no | | |
|system |x |no |no |no |no | | |
|**CgroupsMem** | | | | | | | |
|various |x |no |no |no |no | | |
- future work
- process_iter
@ -292,6 +316,7 @@ Some code is ported from Ohai. Many thanks.
- Process class
- as_dict
- wait
- AIX processes
## License
@ -320,5 +345,4 @@ I have been influenced by the following great works:
4. Push to the branch (git push origin my-new-feature)
5. Create new Pull Request
English is not my native language, so PRs correcting grammar or spelling
are welcome and appreciated.
English is not my native language, so PRs correcting grammar or spelling are welcome and appreciated.

@ -1,18 +0,0 @@
# v2 to v3 changes
- v3 is in the `v3` directory
- [process] RLimit is now uint64 ([#364](https://github.com/shirou/gopsutil/issues/364))
- [process] Remove process.NetIOCounters ([#429](https://github.com/shirou/gopsutil/issues/429))
- [docker] fix typo of memoryLimitInBbytes ([#464](https://github.com/shirou/gopsutil/issues/464))
- [mem] VirtualMemoryStat JSON fields capitalization ([#545](https://github.com/shirou/gopsutil/issues/545))
- various JSON field name and some of Variable name have been changed. see v3migration.sh
- [all] various kind of platform dependent values/constants such as process.GetWin32Proc is now private. see v3migration.sh
- [process] process.Status() now returns []string. and status string is "Running", not just "R". defined in process.go. ([#596](https://github.com/shirou/gopsutil/issues/596))
- [docker] `CgroupCPU()` now returns `*CgroupCPUStat` with Usage ([#590](https://github.com/shirou/gopsutil/issues/590) and [#581](https://github.com/shirou/gopsutil/issues/581))
- [disk] `disk.Opts` is now string[], not string. (related to [#955](https://github.com/shirou/gopsutil/issues/955))
- [host] Fixed temperature sensors detection in Linux ([#905](https://github.com/shirou/gopsutil/issues/905))
- [disk] `GetDiskSerialNumber()` is now `SerialNumber()` and spread to all platforms
- [disk] `GetLabel ()` is now `Label()` and spread to all platform
- [net] Change net.InterfaceStat.Addrs to InterfaceAddrList ([#226](https://github.com/shirou/gopsutil/issues/226))
- [cpu] Removed windows-specific `ProcInfo()`

@ -1,106 +0,0 @@
package main
import (
"flag"
"fmt"
"go/ast"
"go/format"
"go/parser"
"go/token"
"log"
"os"
"golang.org/x/tools/go/ast/astutil"
)
// https://github.com/shirou/gopsutil/issues/429
func issue429() error {
f := func(filename string) error {
fset := token.NewFileSet()
expr, err := parser.ParseFile(fset, filename, nil, parser.ParseComments)
if err != nil {
return err
}
n := astutil.Apply(expr, func(cr *astutil.Cursor) bool {
if cr.Name() == "Decls" {
switch n := cr.Node().(type) {
case *ast.FuncDecl:
if n.Name.Name == "NetIOCounters" || n.Name.Name == ("NetIOCountersWithContext") {
cr.Delete()
}
}
}
return true
}, nil)
return replace(filename, fset, n)
}
root := "process/"
fnames := []string{"process.go", "process_darwin.go", "process_fallback.go", "process_freebsd.go", "process_linux.go", "process_openbsd.go", "process_bsd.go", "process_posix.go", "process_windows.go", "process_test.go"}
for _, fname := range fnames {
if err := f(root + fname); err != nil {
log.Fatalln("run 429:", err)
}
}
return nil
}
func issueRemoveUnusedValue() error {
f := func(filename string) error {
fset := token.NewFileSet()
expr, err := parser.ParseFile(fset, filename, nil, parser.ParseComments)
if err != nil {
return err
}
n := astutil.Apply(expr, func(cr *astutil.Cursor) bool {
if cr.Name() == "Decls" {
switch n := cr.Node().(type) {
case *ast.GenDecl:
if n.Tok != token.TYPE {
break
}
ts := n.Specs[0].(*ast.TypeSpec)
if ts.Name.Name == "SystemProcessInformation" {
cr.Delete()
}
}
}
return true
}, nil)
return replace(filename, fset, n)
}
if err := f("process/process_windows.go"); err != nil {
log.Fatalln("run 429:", err)
}
return nil
}
func replace(filename string, fset *token.FileSet, n ast.Node) error {
if err := os.Remove(filename); err != nil {
return err
}
fp, err := os.Create(filename)
if err != nil {
return err
}
defer fp.Close()
if err := format.Node(fp, fset, n); err != nil {
return err
}
fp.WriteString("\n")
return nil
}
func main() {
flag.Parse()
for _, n := range flag.Args() {
fmt.Println("issue:" + n)
switch n {
case "429":
issue429()
case "issueRemoveUnusedValue":
issueRemoveUnusedValue()
}
}
}

@ -1,171 +0,0 @@
#!/usr/bin/env bash
set -eu
# this scripts is used when migrating v2 to v3.
# usage: cd ${GOPATH}/src/github.com/shirou/gopsutil && bash tools/v3migration/v3migration.sh
DIR="$(cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)"
ROOT=$(cd "${DIR}"/../.. && pwd)
## 1. refresh
cd "${ROOT}"
/bin/rm -rf v3
## 2. copy directories
# docker is removed, #464 will be fixed
mkdir -p v3
cp -rp cpu disk docker host internal load mem net process winservices v3
cp Makefile v3
# build migartion tool
go build -o v3/v3migration "${DIR}"/v3migration.go
V3DIR=$(cd "${ROOT}"/v3 && pwd)
cd "${V3DIR}"
## 3. mod
go mod init
### change import path
find . -name "*.go" -print0 | xargs -0 -I@ sed -i 's|"github.com/shirou/gopsutil/|"github.com/shirou/gopsutil/v3/|g' @
############ Issues
# #429 process.NetIOCounters is pointless on Linux
./v3migration "$(pwd)" 429
sed -i '/NetIOCounters/d' process/process.go
sed -i "/github.com\/shirou\/gopsutil\/v3\/net/d" process/process_bsd.go
# #464 CgroupMem : fix typo and wrong file names
sed -i 's|memoryLimitInBbytes|memoryLimitInBytes|g' docker/docker.go
sed -i 's|memoryLimitInBbytes|memory.limit_in_bytes|g' docker/docker_linux.go
sed -i 's|memoryFailcnt|memory.failcnt|g' docker/docker_linux.go
# fix #346
sed -i 's/Soft int32/Soft uint64/' process/process.go
sed -i 's/Hard int32/Hard uint64/' process/process.go
sed -i 's| //TODO too small. needs to be uint64||' process/process.go
sed -i 's|limitToInt(val string) (int32, error)|limitToUint(val string) (uint64, error)|' process/process_*.go
sed -i 's|limitToInt|limitToUint|' process/process_*.go
sed -i 's|return int32(res), nil|return uint64(res), nil|' process/process_*.go
sed -i 's|math.MaxInt32|math.MaxUint64|' process/process_*.go
# fix #545
# variable names
sed -i 's|WritebackTmp|WriteBackTmp|g' mem/*.go
sed -i 's|Writeback|WriteBack|g' mem/*.go
sed -i 's|SReclaimable|Sreclaimable|g' mem/*.go
sed -i 's|SUnreclaim|Sunreclaim|g' mem/*.go
sed -i 's|VMallocTotal|VmallocTotal|g' mem/*.go
sed -i 's|VMallocUsed|VmallocUsed|g' mem/*.go
sed -i 's|VMallocChunk|VmallocChunk|g' mem/*.go
# json field name
sed -i 's|hostid|hostId|g' host/host.go
sed -i 's|hostid|hostId|g' host/host_test.go
sed -i 's|sensorTemperature|temperature|g' host/host.go
sed -i 's|sensorTemperature|temperature|g' host/host_test.go
sed -i 's|writeback|writeBack|g' mem/*.go
sed -i 's|writeBacktmp|writeBackTmp|g' mem/*.go
sed -i 's|pagetables|pageTables|g' mem/*.go
sed -i 's|swapcached|swapCached|g' mem/*.go
sed -i 's|commitlimit|commitLimit|g' mem/*.go
sed -i 's|committedas|committedAS|g' mem/*.go
sed -i 's|hightotal|highTotal|g' mem/*.go
sed -i 's|highfree|highFree|g' mem/*.go
sed -i 's|lowtotal|lowTotal|g' mem/*.go
sed -i 's|lowfree|lowFree|g' mem/*.go
sed -i 's|swaptotal|swapTotal|g' mem/*.go
sed -i 's|swapfree|swapFree|g' mem/*.go
sed -i 's|vmalloctotal|vmallocTotal|g' mem/*.go
sed -i 's|vmallocused|vmallocUsed|g' mem/*.go
sed -i 's|vmallocchunk|vmallocChunk|g' mem/*.go
sed -i 's|hugepagestotal|hugePagesTotal|g' mem/*.go
sed -i 's|hugepagesfree|hugePagesFree|g' mem/*.go
sed -i 's|hugepagesize|hugePageSize|g' mem/*.go
sed -i 's|pgin|pgIn|g' mem/*.go
sed -i 's|pgout|pgOut|g' mem/*.go
sed -i 's|pgfault|pgFault|g' mem/*.go
sed -i 's|pgmajfault|pgMajFault|g' mem/*.go
sed -i 's|hardwareaddr|hardwareAddr|g' net/*.go
sed -i 's|conntrackCount|connTrackCount|g' net/*.go
sed -i 's|conntrackMax|connTrackMax|g' net/*.go
sed -i 's|delete_list|deleteList|g' net/*.go
sed -i 's|insert_failed|insertFailed|g' net/*.go
sed -i 's|early_drop|earlyDrop|g' net/*.go
sed -i 's|expect_create|expectCreate|g' net/*.go
sed -i 's|expect_delete|expectDelete|g' net/*.go
sed -i 's|search_restart|searchRestart|g' net/*.go
sed -i 's|icmp_error|icmpError|g' net/*.go
sed -i 's|expect_new|expectNew|g' net/*.go
# fix no more public API/types/constants defined only for some platforms
sed -i 's|CTLKern|ctlKern|g' cpu/*.go
sed -i 's|CPNice|cpNice|g' cpu/*.go
sed -i 's|CPSys|cpSys|g' cpu/*.go
sed -i 's|CPIntr|cpIntr|g' cpu/*.go
sed -i 's|CPIdle|cpIdle|g' cpu/*.go
sed -i 's|CPUStates|cpUStates|g' cpu/*.go
sed -i 's|CTLKern|ctlKern|g' cpu/cpu_openbsd.go
sed -i 's|CTLHw|ctlHw|g' cpu/cpu_openbsd.go
sed -i 's|SMT|sMT|g' cpu/cpu_openbsd.go
sed -i 's|KernCptime|kernCptime|g' cpu/cpu_openbsd.go
sed -i 's|KernCptime2|kernCptime2|g' cpu/cpu_openbsd.go
sed -i 's|Win32_Processor|win32Processor|g' cpu/cpu_windows.go
sed -i 's|DEVSTAT_NO_DATA|devstat_NO_DATA|g' disk/*.go
sed -i 's|DEVSTAT_READ|devstat_READ|g' disk/*.go
sed -i 's|DEVSTAT_WRITE|devstat_WRITE|g' disk/*.go
sed -i 's|DEVSTAT_FREE|devstat_FREE|g' disk/*.go
sed -i 's|Devstat|devstat|g' disk/*.go
sed -i 's|Bintime|bintime|g' disk/*.go
sed -i 's|SectorSize|sectorSize|g' disk/disk_linux.go
sed -i 's|FileFileCompression|fileFileCompression|g' disk/disk_windows.go
sed -i 's|FileReadOnlyVolume|fileReadOnlyVolume|g' disk/disk_windows.go
sed -i 's|USER_PROCESS|user_PROCESS|g' host/host_*.go
sed -i 's|LSB|lsbStruct|g' host/host_linux*
sed -i 's| BcacheStats | bcacheStats |g' mem/*.go
sed -i 's|TCPStatuses|tcpStatuses|g' net/*.go
sed -i 's|CT_ENTRIES|ctENTRIES|g' net/net_linux.go
sed -i 's|CT_SEARCHED|ctSEARCHED|g' net/net_linux.go
sed -i 's|CT_FOUND|ctFOUND|g' net/net_linux.go
sed -i 's|CT_NEW|ctNEW|g' net/net_linux.go
sed -i 's|CT_INVALID|ctINVALID|g' net/net_linux.go
sed -i 's|CT_IGNORE|ctIGNORE|g' net/net_linux.go
sed -i 's|CT_DELETE|ctDELETE|g' net/net_linux.go
sed -i 's|CT_DELETE_LIST|ctDELETE_LIST|g' net/net_linux.go
sed -i 's|CT_INSERT|ctINSERT|g' net/net_linux.go
sed -i 's|CT_INSERT_FAILED|ctINSERT_FAILED|g' net/net_linux.go
sed -i 's|CT_DROP|ctDROP|g' net/net_linux.go
sed -i 's|CT_EARLY_DROP|ctEARLY_DROP|g' net/net_linux.go
sed -i 's|CT_ICMP_ERROR|ctICMP_ERROR|g' net/net_linux.go
sed -i 's|CT_EXPECT_NEW|ctEXPECT_NEW|g' net/net_linux.go
sed -i 's|CT_EXPECT_CREATE|ctEXPECT_CREATE|g' net/net_linux.go
sed -i 's|CT_EXPECT_DELETE|ctEXPECT_DELETE|g' net/net_linux.go
sed -i 's|CT_SEARCH_RESTART|ctSEARCH_RESTART|g' net/net_linux.go
sed -i 's|PageSize|pageSize|g' process/process_*.go
sed -i 's|PrioProcess|prioProcess|g' process/process_*.go
sed -i 's|ClockTicks|clockTicks|g' process/process_*.go
./v3migration "$(pwd)" issueRemoveUnusedValue
############ SHOULD BE FIXED BY HAND

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package common
type EnvKeyType string

@ -1,26 +0,0 @@
#!/bin/sh
# see http://www.songmu.jp/riji/entry/2015-01-15-goveralls-multi-package.html
set -e
# cleanup
cleanup() {
if [ "$tmpprof" != "" ] && [ -f "$tmpprof" ]; then
rm -f "$tmpprof"
fi
exit
}
trap cleanup INT QUIT TERM EXIT
# メインの処理
prof=${1:-".profile.cov"}
echo "mode: count" > "$prof"
gopath1=$(echo "$GOPATH" | cut -d: -f1)
for pkg in $(go list ./...); do
tmpprof="$gopath1/src/$pkg/profile.tmp"
go test -covermode=count -coverprofile="$tmpprof" "$pkg"
if [ -f "$tmpprof" ]; then
tail -n +2 "$tmpprof" >> "$prof"
rm "$tmpprof"
fi
done

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
import (
@ -11,7 +12,7 @@ import (
"sync"
"time"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
// TimesStat contains the amounts of time the CPU has spent performing different

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build aix
// +build aix
package cpu

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build aix && cgo
// +build aix,cgo
package cpu

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build aix && !cgo
// +build aix,!cgo
package cpu
@ -8,12 +8,61 @@ import (
"strconv"
"strings"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) {
var ret []TimesStat
if percpu {
return []TimesStat{}, common.ErrNotImplementedError
per_out, err := invoke.CommandWithContext(ctx, "sar", "-u", "-P", "ALL", "10", "1")
if err != nil {
return nil, err
}
lines := strings.Split(string(per_out), "\n")
if len(lines) < 6 {
return []TimesStat{}, common.ErrNotImplementedError
}
hp := strings.Fields(lines[5]) // headers
for l := 6; l < len(lines)-1; l++ {
ct := &TimesStat{}
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 {
switch header {
case `cpu`:
ct.CPU = strconv.FormatFloat(t, 'f', -1, 64)
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)
}
} else {
out, err := invoke.CommandWithContext(ctx, "sar", "-u", "10", "1")
if err != nil {
@ -24,26 +73,28 @@ func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) {
return []TimesStat{}, common.ErrNotImplementedError
}
ret := TimesStat{CPU: "cpu-total"}
ct := &TimesStat{CPU: "cpu-total"}
h := strings.Fields(lines[len(lines)-3]) // headers
v := strings.Fields(lines[len(lines)-2]) // values
for i, header := range h {
if t, err := strconv.ParseFloat(v[i], 64); err == nil {
switch header {
case `%usr`:
ret.User = t
ct.User = t
case `%sys`:
ret.System = t
ct.System = t
case `%wio`:
ret.Iowait = t
ct.Iowait = t
case `%idle`:
ret.Idle = t
ct.Idle = t
}
}
}
return []TimesStat{ret}, nil
ret = append(ret, *ct)
}
return ret, nil
}
func InfoWithContext(ctx context.Context) ([]InfoStat, error) {
@ -78,6 +129,20 @@ func InfoWithContext(ctx context.Context) ([]InfoStat, error) {
}
}
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])
}
}
}
}
return []InfoStat{ret}, nil

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build darwin
// +build darwin
package cpu

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build darwin && cgo
// +build darwin,cgo
package cpu

@ -1,9 +1,9 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build darwin && !cgo
// +build darwin,!cgo
package cpu
import "github.com/shirou/gopsutil/v3/internal/common"
import "github.com/shirou/gopsutil/v4/internal/common"
func perCPUTimes() ([]TimesStat, error) {
return []TimesStat{}, common.ErrNotImplementedError

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build darwin
// +build darwin
package cpu
@ -10,7 +10,7 @@ import (
"github.com/shoenig/go-m1cpu"
)
func Test_CpuInfo_AppleSilicon(t *testing.T) {
func TestInfo_AppleSilicon(t *testing.T) {
if !m1cpu.IsAppleSilicon() {
t.Skip("wrong cpu type")
}

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
import (
@ -10,7 +11,7 @@ import (
"strings"
"unsafe"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
"github.com/tklauser/go-sysconf"
"golang.org/x/sys/unix"
)

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
type cpuTimes struct {

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build !darwin && !linux && !freebsd && !openbsd && !netbsd && !solaris && !windows && !dragonfly && !plan9 && !aix
// +build !darwin,!linux,!freebsd,!openbsd,!netbsd,!solaris,!windows,!dragonfly,!plan9,!aix
package cpu
@ -7,7 +7,7 @@ import (
"context"
"runtime"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
func Times(percpu bool) ([]TimesStat, error) {

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
import (
@ -10,7 +11,7 @@ import (
"strings"
"unsafe"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
"github.com/tklauser/go-sysconf"
"golang.org/x/sys/unix"
)

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
type cpuTimes struct {

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
type cpuTimes struct {

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
type cpuTimes struct {

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
type cpuTimes struct {

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
import (
@ -5,7 +6,7 @@ import (
"runtime"
"testing"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
func TestParseDmesgBoot(t *testing.T) {

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build linux
// +build linux
package cpu
@ -13,7 +13,7 @@ import (
"github.com/tklauser/go-sysconf"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
var ClocksPerSec = float64(100)

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
import (
@ -20,7 +21,7 @@ func TestTimesEmpty(t *testing.T) {
}
}
func TestCPUparseStatLine_424(t *testing.T) {
func TestParseStatLine_424(t *testing.T) {
t.Setenv("HOST_PROC", "testdata/linux/424/proc")
{
l, err := Times(true)
@ -38,7 +39,7 @@ func TestCPUparseStatLine_424(t *testing.T) {
}
}
func TestCPUCountsAgainstLscpu(t *testing.T) {
func TestCountsAgainstLscpu(t *testing.T) {
cmd := exec.Command("lscpu")
cmd.Env = []string{"LC_ALL=C"}
out, err := cmd.Output()
@ -93,7 +94,7 @@ func TestCPUCountsAgainstLscpu(t *testing.T) {
}
}
func TestCPUCountsLogicalAndroid_1037(t *testing.T) { // https://github.com/shirou/gopsutil/issues/1037
func TestCountsLogicalAndroid_1037(t *testing.T) { // https://github.com/shirou/gopsutil/issues/1037
t.Setenv("HOST_PROC", "testdata/linux/1037/proc")
count, err := Counts(true)

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build netbsd
// +build netbsd
package cpu
@ -9,7 +9,7 @@ import (
"runtime"
"unsafe"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
"github.com/tklauser/go-sysconf"
"golang.org/x/sys/unix"
)

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
type cpuTimes struct {

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
type cpuTimes struct {

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build openbsd
// +build openbsd
package cpu
@ -9,7 +9,7 @@ import (
"runtime"
"unsafe"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
"github.com/tklauser/go-sysconf"
"golang.org/x/sys/unix"
)

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
type cpuTimes struct {

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
type cpuTimes struct {

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
type cpuTimes struct {

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
type cpuTimes struct {

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
type cpuTimes struct {

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build plan9
// +build plan9
package cpu
@ -9,7 +9,7 @@ import (
"runtime"
stats "github.com/lufia/plan9stats"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
func Times(percpu bool) ([]TimesStat, error) {

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build plan9
// +build plan9
package cpu

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
import (

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
import (

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package cpu
import (
@ -10,7 +11,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
func skipIfNotImplementedErr(t *testing.T, err error) {
@ -19,7 +20,7 @@ func skipIfNotImplementedErr(t *testing.T, err error) {
}
}
func TestCpu_times(t *testing.T) {
func TestTimes(t *testing.T) {
v, err := Times(false)
skipIfNotImplementedErr(t, err)
if err != nil {
@ -77,7 +78,7 @@ func TestCpu_times(t *testing.T) {
}
}
func TestCpu_counts(t *testing.T) {
func TestCounts(t *testing.T) {
v, err := Counts(true)
skipIfNotImplementedErr(t, err)
if err != nil {
@ -98,7 +99,7 @@ func TestCpu_counts(t *testing.T) {
t.Logf("physical cores: %d", v)
}
func TestCPUTimeStat_String(t *testing.T) {
func TestTimeStat_String(t *testing.T) {
v := TimesStat{
CPU: "cpu0",
User: 100.1,
@ -111,7 +112,7 @@ func TestCPUTimeStat_String(t *testing.T) {
}
}
func TestCpuInfo(t *testing.T) {
func TestInfo(t *testing.T) {
v, err := Info()
skipIfNotImplementedErr(t, err)
if err != nil {
@ -127,7 +128,7 @@ func TestCpuInfo(t *testing.T) {
}
}
func testCPUPercent(t *testing.T, percpu bool) {
func testPercent(t *testing.T, percpu bool) {
numcpu := runtime.NumCPU()
testCount := 3
@ -161,7 +162,7 @@ func testCPUPercent(t *testing.T, percpu bool) {
}
}
func testCPUPercentLastUsed(t *testing.T, percpu bool) {
func testPercentLastUsed(t *testing.T, percpu bool) {
numcpu := runtime.NumCPU()
testCount := 10
@ -195,18 +196,18 @@ func testCPUPercentLastUsed(t *testing.T, percpu bool) {
}
}
func TestCPUPercent(t *testing.T) {
testCPUPercent(t, false)
func TestPercent(t *testing.T) {
testPercent(t, false)
}
func TestCPUPercentPerCpu(t *testing.T) {
testCPUPercent(t, true)
func TestPercentPerCpu(t *testing.T) {
testPercent(t, true)
}
func TestCPUPercentIntervalZero(t *testing.T) {
testCPUPercentLastUsed(t, false)
func TestPercentIntervalZero(t *testing.T) {
testPercentLastUsed(t, false)
}
func TestCPUPercentIntervalZeroPerCPU(t *testing.T) {
testCPUPercentLastUsed(t, true)
func TestPercentIntervalZeroPerCPU(t *testing.T) {
testPercentLastUsed(t, true)
}

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build windows
// +build windows
package cpu
@ -8,14 +8,12 @@ import (
"fmt"
"unsafe"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
"github.com/yusufpapurcu/wmi"
"golang.org/x/sys/windows"
)
var (
procGetNativeSystemInfo = common.Modkernel32.NewProc("GetNativeSystemInfo")
)
var procGetNativeSystemInfo = common.Modkernel32.NewProc("GetNativeSystemInfo")
type win32_Processor struct {
Family uint16

@ -0,0 +1,68 @@
System Model: IBM pSeries (emulated by qemu)
Machine Serial Number: Not Available
Processor Type: PowerPC_POWER8
Processor Implementation Mode: POWER 8
Processor Version: PV_8_Compat
Number Of Processors: 4
Processor Clock Speed: 1000 MHz
CPU Type: 64-bit
Kernel Type: 64-bit
LPAR Info: 0 aix_7200-04-02-2027
Memory Size: 4096 MB
Good Memory Size: 4096 MB
Platform Firmware level: Not Available
Firmware Version: SLOF,HEAD
Console Login: enable
Auto Restart: true
Full Core: false
NX Crypto Acceleration: Not Capable
In-Core Crypto Acceleration: Capable, but not Enabled
en0
Network Information
Host Name: aix72-dylan
IP Address: 192.168.124.53
Sub Netmask:
Gateway: 192.168.124.1
Name Server:
Domain Name:
Paging Space Information
Total Paging Space: 512MB
Percent Used: 1%
Volume Groups Information
==============================================================================
Active VGs
==============================================================================
rootvg:
PV_NAME PV STATE TOTAL PPs FREE PPs FREE DISTRIBUTION
hdisk0 active 999 809 199..193..17..200..200
==============================================================================
INSTALLED RESOURCE LIST
The following resources are installed on the machine.
+/- = Added or deleted from Resource List.
* = Diagnostic support not available.
Model Architecture: chrp
Model Implementation: Uni-Processor, PCI bus
+ sys0 System Object
+ sysplanar0 System Planar
* vio0 Virtual I/O Bus
* ent0 Virtual I/O Ethernet Adapter (l-lan)
* vscsi0 Virtual SCSI Client Adapter
* cd0 Virtual SCSI Optical Served by VIO Server
* vsa0 LPAR Virtual Serial Adapter
* vty0 Asynchronous Terminal
* pci0 PCI Bus
* scsi0 qemu_virtio-scsi-pci:0000:00:02.0 Virtio SCSI Client Adapter (f41a0800)
* hdisk0 qemu_virtio-scsi-pci:0000:00:02.0-LW_0 MPIO Other Virtio SCSI Disk Drive
+ L2cache0 L2 Cache
+ mem0 Memory
+ proc0 Processor
+ proc1 Processor
+ proc2 Processor
+ proc3 Processor

@ -0,0 +1,11 @@
AIX aix72-dylan 2 7 000000000000 05/15/24
System configuration: lcpu=4 ent=4.00 mode=Capped
11:19:03 cpu %usr %sys %wio %idle physc %entc
11:19:13 0 1 11 0 88 1.00 25.0
1 0 0 0 100 1.00 25.0
2 0 0 0 100 1.00 25.0
3 0 0 0 100 1.00 25.0
- 0 3 0 97 4.00 100.0

@ -0,0 +1,7 @@
AIX aix72-dylan 2 7 000000000000 05/15/24
System configuration: lcpu=4 ent=4.00 mode=Capped
11:19:44 %usr %sys %wio %idle physc %entc
11:19:54 0 3 0 96 4.00 100.0

@ -1,10 +1,11 @@
// SPDX-License-Identifier: BSD-3-Clause
package disk
import (
"context"
"encoding/json"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
var invoke common.Invoker = common.Invoke{}

@ -1,22 +1,50 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build aix
// +build aix
package disk
import (
"context"
"errors"
"strings"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
func IOCountersWithContext(ctx context.Context, names ...string) (map[string]IOCountersStat, error) {
return nil, common.ErrNotImplementedError
}
func SerialNumberWithContext(ctx context.Context, name string) (string, error) {
func LabelWithContext(ctx context.Context, name string) (string, error) {
return "", common.ErrNotImplementedError
}
func LabelWithContext(ctx context.Context, name string) (string, error) {
return "", common.ErrNotImplementedError
// Using lscfg and a device name, we can get the device information
// This is a pure go implementation, and should be moved to disk_aix_nocgo.go
// if a more efficient CGO method is introduced in disk_aix_cgo.go
func SerialNumberWithContext(ctx context.Context, name string) (string, error) {
// This isn't linux, these aren't actual disk devices
if strings.HasPrefix(name, "/dev/") {
return "", errors.New("devices on /dev are not physical disks on aix")
}
out, err := invoke.CommandWithContext(ctx, "lscfg", "-vl", name)
if err != nil {
return "", err
}
ret := ""
// Kind of inefficient, but it works
lines := strings.Split(string(out[:]), "\n")
for line := 1; line < len(lines); line++ {
v := strings.TrimSpace(lines[line])
if strings.HasPrefix(v, "Serial Number...............") {
ret = strings.TrimPrefix(v, "Serial Number...............")
if ret == "" {
return "", errors.New("empty serial for disk")
}
return ret, nil
}
}
return ret, errors.New("serial entry not found for disk")
}

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build aix && cgo
// +build aix,cgo
package disk

@ -1,26 +1,29 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build aix && !cgo
// +build aix,!cgo
package disk
import (
"context"
"regexp"
"strconv"
"strings"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
"golang.org/x/sys/unix"
)
var startBlank = regexp.MustCompile(`^\s+`)
var ignoreFSType = map[string]bool{"procfs": true}
var FSType = map[int]string{
0: "jfs2", 1: "namefs", 2: "nfs", 3: "jfs", 5: "cdrom", 6: "proc",
16: "special-fs", 17: "cache-fs", 18: "nfs3", 19: "automount-fs", 20: "pool-fs", 32: "vxfs",
33: "veritas-fs", 34: "udfs", 35: "nfs4", 36: "nfs4-pseudo", 37: "smbfs", 38: "mcr-pseudofs",
39: "ahafs", 40: "sterm-nfs", 41: "asmfs",
}
var (
ignoreFSType = map[string]bool{"procfs": true}
FSType = map[int]string{
0: "jfs2", 1: "namefs", 2: "nfs", 3: "jfs", 5: "cdrom", 6: "proc",
16: "special-fs", 17: "cache-fs", 18: "nfs3", 19: "automount-fs", 20: "pool-fs", 32: "vxfs",
33: "veritas-fs", 34: "udfs", 35: "nfs4", 36: "nfs4-pseudo", 37: "smbfs", 38: "mcr-pseudofs",
39: "ahafs", 40: "sterm-nfs", 41: "asmfs",
}
)
func PartitionsWithContext(ctx context.Context, all bool) ([]PartitionStat, error) {
var ret []PartitionStat
@ -79,3 +82,108 @@ func PartitionsWithContext(ctx context.Context, all bool) ([]PartitionStat, erro
func getFsType(stat unix.Statfs_t) string {
return FSType[int(stat.Vfstype)]
}
func UsageWithContext(ctx context.Context, path string) (*UsageStat, error) {
out, err := invoke.CommandWithContext(ctx, "df", "-v")
if err != nil {
return nil, err
}
ret := &UsageStat{}
blocksize := uint64(512)
lines := strings.Split(string(out), "\n")
if len(lines) < 2 {
return &UsageStat{}, common.ErrNotImplementedError
}
hf := strings.Fields(strings.Replace(lines[0], "Mounted on", "Path", -1)) // headers
for line := 1; line < len(lines); line++ {
fs := strings.Fields(lines[line]) // values
for i, header := range hf {
// We're done in any of these use cases
if i >= len(fs) {
break
}
switch header {
case `Filesystem`:
// This is not a valid fs for us to parse
if fs[i] == "/proc" || fs[i] == "/ahafs" || fs[i] != path {
break
}
ret.Fstype, err = GetMountFSTypeWithContext(ctx, fs[i])
if err != nil {
return nil, err
}
case `Path`:
ret.Path = fs[i]
case `512-blocks`:
total, err := strconv.ParseUint(fs[i], 10, 64)
ret.Total = total * blocksize
if err != nil {
return nil, err
}
case `Used`:
ret.Used, err = strconv.ParseUint(fs[i], 10, 64)
if err != nil {
return nil, err
}
case `Free`:
ret.Free, err = strconv.ParseUint(fs[i], 10, 64)
if err != nil {
return nil, err
}
case `%Used`:
val, err := strconv.Atoi(strings.Replace(fs[i], "%", "", -1))
if err != nil {
return nil, err
}
ret.UsedPercent = float64(val) / float64(100)
case `Ifree`:
ret.InodesFree, err = strconv.ParseUint(fs[i], 10, 64)
if err != nil {
return nil, err
}
case `Iused`:
ret.InodesUsed, err = strconv.ParseUint(fs[i], 10, 64)
if err != nil {
return nil, err
}
case `%Iused`:
val, err := strconv.Atoi(strings.Replace(fs[i], "%", "", -1))
if err != nil {
return nil, err
}
ret.InodesUsedPercent = float64(val) / float64(100)
}
}
// Calculated value, since it isn't returned by the command
ret.InodesTotal = ret.InodesUsed + ret.InodesFree
// Valid Usage data, so append it
return ret, nil
}
return ret, nil
}
func GetMountFSTypeWithContext(ctx context.Context, mp string) (string, error) {
out, err := invoke.CommandWithContext(ctx, "mount")
if err != nil {
return "", err
}
// Kind of inefficient, but it works
lines := strings.Split(string(out[:]), "\n")
for line := 1; line < len(lines); line++ {
fields := strings.Fields(lines[line])
if strings.TrimSpace(fields[0]) == mp {
return fields[2], nil
}
}
return "", nil
}

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build darwin
// +build darwin
package disk
@ -8,7 +8,7 @@ import (
"golang.org/x/sys/unix"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
// PartitionsWithContext returns disk partition.

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build darwin && cgo && !ios
// +build darwin,cgo,!ios
package disk
@ -14,12 +14,12 @@ import "C"
import (
"context"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
func IOCountersWithContext(ctx context.Context, names ...string) (map[string]IOCountersStat, error) {
var buf [C.NDRIVE]C.DriveStats
n, err := C.gopsutil_v3_readdrivestat(&buf[0], C.int(len(buf)))
n, err := C.gopsutil_v4_readdrivestat(&buf[0], C.int(len(buf)))
if err != nil {
return nil, err
}

@ -1,12 +1,12 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build (darwin && !cgo) || ios
// +build darwin,!cgo ios
package disk
import (
"context"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
func IOCountersWithContext(ctx context.Context, names ...string) (map[string]IOCountersStat, error) {

@ -1,12 +1,12 @@
//go:build !darwin && !linux && !freebsd && !openbsd && !netbsd && !windows && !solaris && !aix
// +build !darwin,!linux,!freebsd,!openbsd,!netbsd,!windows,!solaris,!aix
// SPDX-License-Identifier: BSD-3-Clause
//go:build !darwin && !linux && !freebsd && !openbsd && !netbsd && !windows && !solaris && !aix
package disk
import (
"context"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
func IOCountersWithContext(ctx context.Context, names ...string) (map[string]IOCountersStat, error) {

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build freebsd
// +build freebsd
package disk
@ -12,7 +12,7 @@ import (
"strconv"
"strings"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
"golang.org/x/sys/unix"
)

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
// Created by cgo -godefs - DO NOT EDIT
// cgo -godefs types_freebsd.go

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
// Created by cgo -godefs - DO NOT EDIT
// cgo -godefs types_freebsd.go

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
// Created by cgo -godefs - DO NOT EDIT
// cgo -godefs types_freebsd.go

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build freebsd && arm64
// +build freebsd,arm64
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs disk/types_freebsd.go

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build linux
// +build linux
package disk
@ -16,7 +16,7 @@ import (
"golang.org/x/sys/unix"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
const (

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build netbsd
// +build netbsd
package disk
@ -7,7 +7,7 @@ import (
"context"
"unsafe"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
"golang.org/x/sys/unix"
)

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build netbsd && amd64
// +build netbsd,amd64
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs types_netbsd.go

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build netbsd && arm64
// +build netbsd,arm64
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs types_netbsd.go

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build openbsd
// +build openbsd
package disk
@ -8,7 +8,7 @@ import (
"context"
"encoding/binary"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
"golang.org/x/sys/unix"
)

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build openbsd && 386
// +build openbsd,386
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs disk/types_openbsd.go
@ -34,5 +34,7 @@ type Timeval struct {
Usec int32
}
type Diskstat struct{}
type bintime struct{}
type (
Diskstat struct{}
bintime struct{}
)

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs types_openbsd.go
@ -32,5 +33,7 @@ type Timeval struct {
Usec int64
}
type Diskstat struct{}
type bintime struct{}
type (
Diskstat struct{}
bintime struct{}
)

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build openbsd && arm
// +build openbsd,arm
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs disk/types_openbsd.go
@ -34,5 +34,7 @@ type Timeval struct {
Usec int32
}
type Diskstat struct{}
type bintime struct{}
type (
Diskstat struct{}
bintime struct{}
)

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build openbsd && arm64
// +build openbsd,arm64
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs disk/types_openbsd.go
@ -34,5 +34,7 @@ type Timeval struct {
Usec int64
}
type Diskstat struct{}
type bintime struct{}
type (
Diskstat struct{}
bintime struct{}
)

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build openbsd && riscv64
// +build openbsd,riscv64
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs disk/types_openbsd.go
@ -36,5 +36,7 @@ type (
}
)
type Diskstat struct{}
type bintime struct{}
type (
Diskstat struct{}
bintime struct{}
)

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build solaris
// +build solaris
package disk
@ -16,7 +16,7 @@ import (
"strconv"
"strings"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
"golang.org/x/sys/unix"
)

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package disk
import (
@ -7,7 +8,7 @@ import (
"sync"
"testing"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
func skipIfNotImplementedErr(t *testing.T, err error) {
@ -16,7 +17,7 @@ func skipIfNotImplementedErr(t *testing.T, err error) {
}
}
func TestDisk_usage(t *testing.T) {
func TestUsage(t *testing.T) {
path := "/"
if runtime.GOOS == "windows" {
path = "C:"
@ -31,7 +32,7 @@ func TestDisk_usage(t *testing.T) {
}
}
func TestDisk_partitions(t *testing.T) {
func TestPartitions(t *testing.T) {
ret, err := Partitions(false)
skipIfNotImplementedErr(t, err)
if err != nil || len(ret) == 0 {
@ -49,7 +50,7 @@ func TestDisk_partitions(t *testing.T) {
}
}
func TestDisk_io_counters(t *testing.T) {
func TestIOCounters(t *testing.T) {
ret, err := IOCounters()
skipIfNotImplementedErr(t, err)
if err != nil {
@ -68,7 +69,7 @@ func TestDisk_io_counters(t *testing.T) {
}
// https://github.com/shirou/gopsutil/issues/560 regression test
func TestDisk_io_counters_concurrency_on_darwin_cgo(t *testing.T) {
func TestIOCounters_concurrency_on_darwin_cgo(t *testing.T) {
if runtime.GOOS != "darwin" {
t.Skip("darwin only")
}
@ -84,7 +85,7 @@ func TestDisk_io_counters_concurrency_on_darwin_cgo(t *testing.T) {
wg.Wait()
}
func TestDiskUsageStat_String(t *testing.T) {
func TestUsageStat_String(t *testing.T) {
v := UsageStat{
Path: "/",
Total: 1000,
@ -103,7 +104,7 @@ func TestDiskUsageStat_String(t *testing.T) {
}
}
func TestDiskPartitionStat_String(t *testing.T) {
func TestPartitionStat_String(t *testing.T) {
v := PartitionStat{
Device: "sd01",
Mountpoint: "/",
@ -116,7 +117,7 @@ func TestDiskPartitionStat_String(t *testing.T) {
}
}
func TestDiskIOCountersStat_String(t *testing.T) {
func TestIOCountersStat_String(t *testing.T) {
v := IOCountersStat{
Name: "sd01",
ReadCount: 100,

@ -1,5 +1,5 @@
//go:build freebsd || linux || darwin || (aix && !cgo)
// +build freebsd linux darwin aix,!cgo
// SPDX-License-Identifier: BSD-3-Clause
//go:build freebsd || linux || darwin
package disk

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build windows
// +build windows
package disk
@ -10,7 +10,7 @@ import (
"syscall"
"unsafe"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
"golang.org/x/sys/windows"
"golang.org/x/sys/windows/registry"
)

@ -1,3 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
// SPDX-FileCopyrightText: Copyright (c) 2017, kadota kyohei
// https://github.com/lufia/iostat/blob/9f7362b77ad333b26c01c99de52a11bdb650ded2/iostat_darwin.c
#include <stdint.h>
#include <CoreFoundation/CoreFoundation.h>
@ -16,7 +18,7 @@ static int getdrivestat(io_registry_entry_t d, DriveStats *stat);
static int fillstat(io_registry_entry_t d, DriveStats *stat);
int
gopsutil_v3_readdrivestat(DriveStats a[], int n)
gopsutil_v4_readdrivestat(DriveStats a[], int n)
{
CFMutableDictionaryRef match;
io_iterator_t drives;

@ -1,3 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
// SPDX-FileCopyrightText: Copyright (c) 2017, kadota kyohei
// https://github.com/lufia/iostat/blob/9f7362b77ad333b26c01c99de52a11bdb650ded2/iostat_darwin.h
typedef struct DriveStats DriveStats;
typedef struct CPUStats CPUStats;
@ -29,4 +31,4 @@ struct CPUStats {
natural_t idle;
};
extern int gopsutil_v3_readdrivestat(DriveStats a[], int n);
extern int gopsutil_v4_readdrivestat(DriveStats a[], int n);

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build ignore
// +build ignore
// Hand writing: _Ctype_struct___0

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build ignore
// +build ignore
// Hand writing: _Ctype_struct___0

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build ignore
// +build ignore
// Hand writing: _Ctype_struct___0

@ -1 +1,2 @@
// SPDX-License-Identifier: BSD-3-Clause
package gopsutil

@ -1,11 +1,12 @@
// SPDX-License-Identifier: BSD-3-Clause
package docker
import (
"encoding/json"
"errors"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/cpu"
"github.com/shirou/gopsutil/v4/internal/common"
)
var (

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build linux
// +build linux
package docker
@ -13,8 +13,8 @@ import (
"strconv"
"strings"
cpu "github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/internal/common"
cpu "github.com/shirou/gopsutil/v4/cpu"
"github.com/shirou/gopsutil/v4/internal/common"
)
// GetDockerStat returns a list of Docker basic stats.

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build linux
// +build linux
package docker

@ -1,12 +1,12 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build !linux
// +build !linux
package docker
import (
"context"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
// GetDockerStat returns a list of Docker basic stats.

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package docker
import (

@ -1,6 +1,6 @@
module github.com/shirou/gopsutil/v3
module github.com/shirou/gopsutil/v4
go 1.15
go 1.18
require (
github.com/google/go-cmp v0.6.0
@ -13,4 +13,18 @@ require (
golang.org/x/sys v0.20.0
)
retract v3.22.11
require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

@ -1,10 +1,8 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
@ -16,14 +14,6 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:Om
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
@ -41,6 +31,5 @@ golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
package host
import (
@ -8,7 +9,7 @@ import (
"runtime"
"time"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
type Warnings = common.Warnings
@ -40,13 +41,6 @@ type UserStat struct {
Started int `json:"started"`
}
type TemperatureStat struct {
SensorKey string `json:"sensorKey"`
Temperature float64 `json:"temperature"`
High float64 `json:"sensorHigh"`
Critical float64 `json:"sensorCritical"`
}
func (h InfoStat) String() string {
s, _ := json.Marshal(h)
return string(s)
@ -57,11 +51,6 @@ func (u UserStat) String() string {
return string(s)
}
func (t TemperatureStat) String() string {
s, _ := json.Marshal(t)
return string(s)
}
var enableBootTimeCache bool
// EnableBootTimeCache change cache behavior of BootTime. If true, cache BootTime value. Default is false.
@ -157,10 +146,6 @@ func KernelVersion() (string, error) {
return KernelVersionWithContext(context.Background())
}
func SensorsTemperatures() ([]TemperatureStat, error) {
return SensorsTemperaturesWithContext(context.Background())
}
func timeSince(ts uint64) uint64 {
return uint64(time.Now().Unix()) - ts
}

@ -0,0 +1,196 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build aix
package host
import (
"context"
"errors"
"strconv"
"strings"
"github.com/shirou/gopsutil/v4/internal/common"
)
// from https://www.ibm.com/docs/en/aix/7.2?topic=files-utmph-file
const (
user_PROCESS = 7
)
func HostIDWithContext(ctx context.Context) (string, error) {
out, err := invoke.CommandWithContext(ctx, "uname", "-u")
if err != nil {
return "", err
}
// The command always returns an extra newline, so we make use of Split() to get only the first line
return strings.Split(string(out[:]), "\n")[0], nil
}
func numProcs(ctx context.Context) (uint64, error) {
return 0, common.ErrNotImplementedError
}
func BootTimeWithContext(ctx context.Context) (btime uint64, err error) {
ut, err := UptimeWithContext(ctx)
if err != nil {
return 0, err
}
if ut <= 0 {
return 0, errors.New("Uptime was not set, so cannot calculate boot time from it.")
}
ut = ut * 60
return timeSince(ut), nil
}
// This function takes multiple formats of output frmo the uptime
// command and converts the data into minutes.
// Some examples of uptime output that this command handles:
// 11:54AM up 13 mins, 1 user, load average: 2.78, 2.62, 1.79
// 12:41PM up 1 hr, 1 user, load average: 2.47, 2.85, 2.83
// 07:43PM up 5 hrs, 1 user, load average: 3.27, 2.91, 2.72
// 11:18:23 up 83 days, 18:29, 4 users, load average: 0.16, 0.03, 0.01
func UptimeWithContext(ctx context.Context) (uint64, error) {
out, err := invoke.CommandWithContext(ctx, "uptime")
if err != nil {
return 0, err
}
// Convert our uptime to a series of fields we can extract
ut := strings.Fields(string(out[:]))
// Convert the second field value to integer
var days uint64 = 0
var hours uint64 = 0
var minutes uint64 = 0
if ut[3] == "day," || ut[3] == "days," {
days, err = strconv.ParseUint(ut[2], 10, 64)
if err != nil {
return 0, err
}
// Split field 4 into hours and minutes
hm := strings.Split(ut[4], ":")
hours, err = strconv.ParseUint(hm[0], 10, 64)
if err != nil {
return 0, err
}
minutes, err = strconv.ParseUint(strings.Replace(hm[1], ",", "", -1), 10, 64)
if err != nil {
return 0, err
}
} else if ut[3] == "hr," || ut[3] == "hrs," {
hours, err = strconv.ParseUint(ut[2], 10, 64)
if err != nil {
return 0, err
}
} else if ut[3] == "mins," {
minutes, err = strconv.ParseUint(ut[2], 10, 64)
if err != nil {
return 0, err
}
} else if _, err := strconv.ParseInt(ut[3], 10, 64); err == nil && strings.Contains(ut[2], ":") {
// Split field 2 into hours and minutes
hm := strings.Split(ut[2], ":")
hours, err = strconv.ParseUint(hm[0], 10, 64)
if err != nil {
return 0, err
}
minutes, err = strconv.ParseUint(strings.Replace(hm[1], ",", "", -1), 10, 64)
if err != nil {
return 0, err
}
}
// Stack them all together as minutes
total_time := (days * 24 * 60) + (hours * 60) + minutes
return total_time, nil
}
// This is a weak implementation due to the limitations on retrieving this data in AIX
func UsersWithContext(ctx context.Context) ([]UserStat, error) {
var ret []UserStat
out, err := invoke.CommandWithContext(ctx, "w")
if err != nil {
return nil, err
}
lines := strings.Split(string(out), "\n")
if len(lines) < 3 {
return []UserStat{}, common.ErrNotImplementedError
}
hf := strings.Fields(lines[1]) // headers
for l := 2; l < len(lines); l++ {
v := strings.Fields(lines[l]) // values
us := &UserStat{}
for i, header := range hf {
// We're done in any of these use cases
if i >= len(v) || v[0] == "-" {
break
}
if t, err := strconv.ParseFloat(v[i], 64); err == nil {
switch header {
case `User`:
us.User = strconv.FormatFloat(t, 'f', 1, 64)
case `tty`:
us.Terminal = strconv.FormatFloat(t, 'f', 1, 64)
}
}
}
// Valid User data, so append it
ret = append(ret, *us)
}
return ret, nil
}
// Much of this function could be static. However, to be future proofed, I've made it call the OS for the information in all instances.
func PlatformInformationWithContext(ctx context.Context) (platform string, family string, version string, err error) {
// Set the platform (which should always, and only be, "AIX") from `uname -s`
out, err := invoke.CommandWithContext(ctx, "uname", "-s")
if err != nil {
return "", "", "", err
}
platform = strings.TrimRight(string(out[:]), "\n")
// Set the family
family = strings.TrimRight(string(out[:]), "\n")
// Set the version
out, err = invoke.CommandWithContext(ctx, "oslevel")
if err != nil {
return "", "", "", err
}
version = strings.TrimRight(string(out[:]), "\n")
return platform, family, version, nil
}
func KernelVersionWithContext(ctx context.Context) (version string, err error) {
out, err := invoke.CommandWithContext(ctx, "oslevel", "-s")
if err != nil {
return "", err
}
version = strings.TrimRight(string(out[:]), "\n")
return version, nil
}
func KernelArch() (arch string, err error) {
out, err := invoke.Command("bootinfo", "-y")
if err != nil {
return "", err
}
arch = strings.TrimRight(string(out[:]), "\n")
return arch, nil
}
func VirtualizationWithContext(ctx context.Context) (string, string, error) {
return "", "", common.ErrNotImplementedError
}

@ -0,0 +1,48 @@
//go:build aix && ppc64 && cgo
// +build aix,ppc64,cgo
// Guessed at from the following document:
// https://www.ibm.com/docs/sl/ibm-mq/9.2?topic=platforms-standard-data-types-aix-linux-windows
package host
const (
sizeofPtr = 0x8
sizeofShort = 0x2
sizeofInt = 0x4
sizeofLong = 0x8
sizeofLongLong = 0x8
sizeOfUtmp = 0x180
)
type (
_C_short int16
_C_int int32
_C_long int64
_C_long_long int64
)
type utmp struct {
Type int16
Pad_cgo_0 [2]byte
Pid int32
Line [32]int8
Id [4]int8
User [32]int8
Host [256]int8
Exit exit_status
Session int32
Tv timeval
Addr_v6 [4]int32
X__glibc_reserved [20]int8
}
type exit_status struct {
Termination int16
Exit int16
}
type timeval struct {
Sec int64
Usec int64
}

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build darwin || freebsd || openbsd || netbsd
// +build darwin freebsd openbsd netbsd
package host

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build darwin
// +build darwin
package host
@ -15,8 +15,8 @@ import (
"golang.org/x/sys/unix"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v3/process"
"github.com/shirou/gopsutil/v4/internal/common"
"github.com/shirou/gopsutil/v4/process"
)
// from utmpx.h

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
// Created by cgo -godefs - DO NOT EDIT
// cgo -godefs types_darwin.go

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build darwin && arm64
// +build darwin,arm64
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs host/types_darwin.go

@ -1,14 +0,0 @@
//go:build darwin && !cgo
// +build darwin,!cgo
package host
import (
"context"
"github.com/shirou/gopsutil/v3/internal/common"
)
func SensorsTemperaturesWithContext(ctx context.Context) ([]TemperatureStat, error) {
return []TemperatureStat{}, common.ErrNotImplementedError
}

@ -1,12 +1,12 @@
//go:build !darwin && !linux && !freebsd && !openbsd && !netbsd && !solaris && !windows
// +build !darwin,!linux,!freebsd,!openbsd,!netbsd,!solaris,!windows
// SPDX-License-Identifier: BSD-3-Clause
//go:build !darwin && !linux && !freebsd && !openbsd && !netbsd && !solaris && !windows && !aix
package host
import (
"context"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v4/internal/common"
)
func HostIDWithContext(ctx context.Context) (string, error) {
@ -41,10 +41,6 @@ func PlatformInformationWithContext(ctx context.Context) (string, string, string
return "", "", "", common.ErrNotImplementedError
}
func SensorsTemperaturesWithContext(ctx context.Context) ([]TemperatureStat, error) {
return []TemperatureStat{}, common.ErrNotImplementedError
}
func KernelArch() (string, error) {
return "", common.ErrNotImplementedError
}

@ -1,5 +1,5 @@
// SPDX-License-Identifier: BSD-3-Clause
//go:build freebsd
// +build freebsd
package host
@ -13,8 +13,8 @@ import (
"strings"
"unsafe"
"github.com/shirou/gopsutil/v3/internal/common"
"github.com/shirou/gopsutil/v3/process"
"github.com/shirou/gopsutil/v4/internal/common"
"github.com/shirou/gopsutil/v4/process"
"golang.org/x/sys/unix"
)
@ -141,10 +141,6 @@ func getUsersFromUtmp(utmpfile string) ([]UserStat, error) {
return ret, nil
}
func SensorsTemperaturesWithContext(ctx context.Context) ([]TemperatureStat, error) {
return []TemperatureStat{}, common.ErrNotImplementedError
}
func KernelVersionWithContext(ctx context.Context) (string, error) {
_, _, version, err := PlatformInformationWithContext(ctx)
return version, err

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs types_freebsd.go

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs types_freebsd.go

@ -1,3 +1,4 @@
// SPDX-License-Identifier: BSD-3-Clause
// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs types_freebsd.go

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save