...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package procfs
15
16 import (
17 "bufio"
18 "bytes"
19 "fmt"
20 "strconv"
21 "strings"
22
23 "github.com/prometheus/procfs/internal/util"
24 )
25
26
27 type Swap struct {
28 Filename string
29 Type string
30 Size int
31 Used int
32 Priority int
33 }
34
35
36 func (fs FS) Swaps() ([]*Swap, error) {
37 data, err := util.ReadFileNoStat(fs.proc.Path("swaps"))
38 if err != nil {
39 return nil, err
40 }
41 return parseSwaps(data)
42 }
43
44 func parseSwaps(info []byte) ([]*Swap, error) {
45 swaps := []*Swap{}
46 scanner := bufio.NewScanner(bytes.NewReader(info))
47 scanner.Scan()
48 for scanner.Scan() {
49 swapString := scanner.Text()
50 parsedSwap, err := parseSwapString(swapString)
51 if err != nil {
52 return nil, err
53 }
54 swaps = append(swaps, parsedSwap)
55 }
56
57 err := scanner.Err()
58 return swaps, err
59 }
60
61 func parseSwapString(swapString string) (*Swap, error) {
62 var err error
63
64 swapFields := strings.Fields(swapString)
65 swapLength := len(swapFields)
66 if swapLength < 5 {
67 return nil, fmt.Errorf("%w: too few fields in swap string: %s", ErrFileParse, swapString)
68 }
69
70 swap := &Swap{
71 Filename: swapFields[0],
72 Type: swapFields[1],
73 }
74
75 swap.Size, err = strconv.Atoi(swapFields[2])
76 if err != nil {
77 return nil, fmt.Errorf("%s: invalid swap size: %s: %w", ErrFileParse, swapFields[2], err)
78 }
79 swap.Used, err = strconv.Atoi(swapFields[3])
80 if err != nil {
81 return nil, fmt.Errorf("%s: invalid swap used: %s: %w", ErrFileParse, swapFields[3], err)
82 }
83 swap.Priority, err = strconv.Atoi(swapFields[4])
84 if err != nil {
85 return nil, fmt.Errorf("%s: invalid swap priority: %s: %w", ErrFileParse, swapFields[4], err)
86 }
87
88 return swap, nil
89 }
90
View as plain text