1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
// Copyright 2023 The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//go:build linux && !noselinux
// +build linux,!noselinux
package selinuxfs
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// SELinux access vector cache statistics.
type AVCStat struct {
// Number of total lookups
Lookups uint64
// Number of total hits
Hits uint64
// Number of total misses
Misses uint64
// Number of total allocations
Allocations uint64
// Number of total reclaims
Reclaims uint64
// Number of total frees
Frees uint64
}
// ParseAVCStats returns the total SELinux access vector cache statistics,
// or error on failure.
func (fs FS) ParseAVCStats() (AVCStat, error) {
avcStat := AVCStat{}
file, err := os.Open(fs.selinux.Path("avc/cache_stats"))
if err != nil {
return avcStat, err
}
defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Scan() // Skip header
for scanner.Scan() {
avcValues := strings.Fields(scanner.Text())
if len(avcValues) != 6 {
return avcStat, fmt.Errorf("invalid AVC stat line: %s",
scanner.Text())
}
lookups, err := strconv.ParseUint(avcValues[0], 0, 64)
if err != nil {
return avcStat, fmt.Errorf("could not parse expected integer value for lookups")
}
hits, err := strconv.ParseUint(avcValues[1], 0, 64)
if err != nil {
return avcStat, fmt.Errorf("could not parse expected integer value for hits")
}
misses, err := strconv.ParseUint(avcValues[2], 0, 64)
if err != nil {
return avcStat, fmt.Errorf("could not parse expected integer value for misses")
}
allocations, err := strconv.ParseUint(avcValues[3], 0, 64)
if err != nil {
return avcStat, fmt.Errorf("could not parse expected integer value for allocations")
}
reclaims, err := strconv.ParseUint(avcValues[4], 0, 64)
if err != nil {
return avcStat, fmt.Errorf("could not parse expected integer value for reclaims")
}
frees, err := strconv.ParseUint(avcValues[5], 0, 64)
if err != nil {
return avcStat, fmt.Errorf("could not parse expected integer value for frees")
}
avcStat.Lookups += lookups
avcStat.Hits += hits
avcStat.Misses += misses
avcStat.Allocations += allocations
avcStat.Reclaims += reclaims
avcStat.Frees += frees
}
return avcStat, scanner.Err()
}
|