From 6cecc735dfce73aefbc3a227dee959d96c6069e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Otto=20Kr=C3=B6pke?= Date: Wed, 31 Jul 2024 15:02:29 +0200 Subject: [PATCH] logical_disk: Fix failed to get disk ID for dynamic volumes (#1544) --- .github/workflows/pr-check.yaml | 17 ++++++++++++++- pkg/collector/logical_disk/logical_disk.go | 25 ++++++++++++++++------ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/.github/workflows/pr-check.yaml b/.github/workflows/pr-check.yaml index 01a3fcad..b978464e 100644 --- a/.github/workflows/pr-check.yaml +++ b/.github/workflows/pr-check.yaml @@ -28,4 +28,19 @@ jobs: bug docs chore - && exit 1 \ No newline at end of file + && exit 1 + title: + name: check title prefix + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: check + run: | + PR_TITLE_PREFIX=$(echo "$PR_TITLE" | cut -d':' -f1) + if [[ ! -d "pkg/collector/$PR_TITLE_PREFIX" ]] || [[ "$PR_TITLE_PREFIX" == "chore" ]] || [[ "$PR_TITLE_PREFIX" == "*" ]]; then + echo "PR title must start with an name of an collector package" + echo "Example: 'logical_disk: description'" + exit 1 + fi + env: + PR_TITLE: ${{ github.event.pull_request.title }} \ No newline at end of file diff --git a/pkg/collector/logical_disk/logical_disk.go b/pkg/collector/logical_disk/logical_disk.go index 66816e95..ecd9a65e 100644 --- a/pkg/collector/logical_disk/logical_disk.go +++ b/pkg/collector/logical_disk/logical_disk.go @@ -5,11 +5,13 @@ package logical_disk import ( "encoding/binary" "fmt" - "golang.org/x/sys/windows" "regexp" + "slices" "strconv" "strings" + "golang.org/x/sys/windows" + "github.com/alecthomas/kingpin/v2" "github.com/go-kit/log" "github.com/go-kit/log/level" @@ -463,6 +465,9 @@ func getDriveType(driveType uint32) string { } } +// diskExtentSize Size of the DiskExtent structure in bytes. +const diskExtentSize = 24 + // getDiskIDByVolume returns the disk ID for a given volume. func getDiskIDByVolume(rootDrive string) (string, error) { // Open a volume handle to the Disk Root. @@ -488,16 +493,24 @@ func getDiskIDByVolume(rootDrive string) (string, error) { var bytesReturned uint32 err = windows.DeviceIoControl(f, controlCode, nil, 0, &volumeDiskExtents[0], uint32(len(volumeDiskExtents)), &bytesReturned, nil) if err != nil { - return "", err + return "", fmt.Errorf("could not identify physical drive for %s: %w", rootDrive, err) } - if uint(binary.LittleEndian.Uint32(volumeDiskExtents)) != 1 { - return "", fmt.Errorf("could not identify physical drive for %s", rootDrive) + numDiskIDs := uint(binary.LittleEndian.Uint32(volumeDiskExtents)) + if numDiskIDs < 1 { + return "", fmt.Errorf("could not identify physical drive for %s: no disk IDs returned", rootDrive) } - diskId := strconv.FormatUint(uint64(binary.LittleEndian.Uint32(volumeDiskExtents[8:])), 10) + diskIDs := make([]string, numDiskIDs) - return diskId, nil + for i := range numDiskIDs { + diskIDs[i] = strconv.FormatUint(uint64(binary.LittleEndian.Uint32(volumeDiskExtents[8+i*diskExtentSize:])), 10) + } + + slices.Sort(diskIDs) + diskIDs = slices.Compact(diskIDs) + + return strings.Join(diskIDs, ";"), nil } func getVolumeInfo(rootDrive string) (volumeInfo, error) {