Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add checkup for Intune #1501

Draft
wants to merge 8 commits into
base: main
Choose a base branch
from
1 change: 1 addition & 0 deletions ee/debug/checkups/checkups.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ func checkupsFor(k types.Knapsack, target targetBits) []checkupInt {
{&osqConfigConflictCheckup{}, doctorSupported | flareSupported},
{&serverDataCheckup{k: k}, doctorSupported | flareSupported | logSupported},
{&osqDataCollector{k: k}, doctorSupported | flareSupported},
{&intuneCheckup{}, flareSupported},
}

checkupsToRun := make([]checkupInt, 0)
Expand Down
35 changes: 35 additions & 0 deletions ee/debug/checkups/intune_other.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
//go:build !windows
// +build !windows

package checkups

import (
"context"
"io"
)

type intuneCheckup struct{}

func (i *intuneCheckup) Name() string {
return ""
}

func (i *intuneCheckup) Run(_ context.Context, _ io.Writer) error {
return nil
}

func (i *intuneCheckup) ExtraFileName() string {
return ""
}

func (i *intuneCheckup) Status() Status {
return Informational
}

func (i *intuneCheckup) Summary() string {
return ""
}

func (i *intuneCheckup) Data() any {
return nil
}
95 changes: 95 additions & 0 deletions ee/debug/checkups/intune_windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
//go:build windows
// +build windows

package checkups

import (
"archive/zip"
"context"
"fmt"
"io"
"os"
"path/filepath"
"strings"
)

type intuneCheckup struct {
summary string
}

func (i *intuneCheckup) Name() string {
return "Intune"
}

func (i *intuneCheckup) Run(ctx context.Context, extraWriter io.Writer) error {
// Other areas of interest: https://learn.microsoft.com/en-us/mem/intune/remote-actions/collect-diagnostics

zipWriter := zip.NewWriter(extraWriter)
defer zipWriter.Close()

if err := agentLogs(zipWriter); err != nil {
i.summary += fmt.Sprintf("Failed to collect Intune agent logs: %v. ", err)
}

if err := installLogs(zipWriter); err != nil {
i.summary += fmt.Sprintf("Failed to collect Intune install logs: %v. ", err)
}

i.summary = strings.TrimSpace(i.summary)

return nil
}

func agentLogs(zipWriter *zip.Writer) error {
agentLogsPathPattern := filepath.Join(os.Getenv("SYSTEMROOT"), "ProgramData", "Microsoft", "IntuneManagementExtension", "Logs", "*")
directionless marked this conversation as resolved.
Show resolved Hide resolved
matches, err := filepath.Glob(agentLogsPathPattern)
if err != nil {
return fmt.Errorf("globbing for agent logs at %s: %w", agentLogsPathPattern, err)
}
if len(matches) == 0 {
return fmt.Errorf("no intune agent logs found at %s", agentLogsPathPattern)
}
Comment on lines +49 to +51
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this an error? (It will run on non-intune machines)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I just added this to make it more obvious what was going on when testing -- I'll update to remove here + below

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I was mostly quibbling over Errorf vs some debug/info log line, I don't really want to see the error on every flare...


for _, match := range matches {
if err := addFileToZip(zipWriter, match); err != nil {
return fmt.Errorf("adding %s to zip: %w", match, err)
}
}

return nil
}

func installLogs(zipWriter *zip.Writer) error {
installLogsPathPattern := filepath.Join(os.Getenv("WINDIR"), "System32", "config", "systemprofile", "AppData", "Local", "mdm", "*.log")
matches, err := filepath.Glob(installLogsPathPattern)
if err != nil {
return fmt.Errorf("globbing for install logs at %s: %w", installLogsPathPattern, err)
}
if len(matches) == 0 {
return fmt.Errorf("no intune install logs found at %s", installLogsPathPattern)
}

for _, match := range matches {
if err := addFileToZip(zipWriter, match); err != nil {
return fmt.Errorf("adding %s to zip: %w", match, err)
}
}

return nil
}

func (i *intuneCheckup) ExtraFileName() string {
return "intune.zip"
}

func (i *intuneCheckup) Status() Status {
return Informational
}

func (i *intuneCheckup) Summary() string {
return i.summary
}

func (i *intuneCheckup) Data() any {
return nil
}