36b3af2e3d
PR Check / Code Quality: Format (push) Failing after 1s
PR Check / Code Quality: Lint (darwin) (push) Failing after 0s
PR Check / Code Quality: Lint (freebsd) (push) Failing after 1s
PR Check / Code Quality: Lint (windows) (push) Failing after 1s
PR Check / Code Quality: Lint (linux) (push) Failing after 1s
PR Check / Security: Vulnerability Scan (push) Failing after 0s
Update Documentation / update-docs (push) Failing after 2s
PR Check / Code Quality: Vendor (push) Failing after 1s
PR Check / Code Quality: Coverage (push) Failing after 0s
PR Check / Tests: Unit (macos-latest) (push) Has been cancelled
PR Check / Tests: Unit (ubuntu-24.04) (push) Has been cancelled
PR Check / Tests: Unit (ubuntu-24.04-arm) (push) Has been cancelled
PR Check / Tests: Unit (windows-latest) (push) Has been cancelled
92 lines
1.9 KiB
Go
92 lines
1.9 KiB
Go
package source
|
|
|
|
import (
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/pranshuparmar/witr/pkg/model"
|
|
)
|
|
|
|
func detectContainer(ancestry []model.Process) *model.Source {
|
|
for _, p := range ancestry {
|
|
data, err := os.ReadFile("/proc/" + itoa(p.PID) + "/cgroup")
|
|
if err != nil {
|
|
continue
|
|
}
|
|
content := string(data)
|
|
|
|
switch {
|
|
case strings.Contains(content, "docker"):
|
|
return &model.Source{
|
|
Type: model.SourceContainer,
|
|
Name: "docker",
|
|
}
|
|
case strings.Contains(content, "podman"), strings.Contains(content, "libpod"):
|
|
return &model.Source{
|
|
Type: model.SourceContainer,
|
|
Name: "podman",
|
|
}
|
|
case strings.Contains(content, "kubepods"):
|
|
return &model.Source{
|
|
Type: model.SourceContainer,
|
|
Name: "kubernetes",
|
|
}
|
|
case strings.Contains(content, "colima"):
|
|
return &model.Source{
|
|
Type: model.SourceContainer,
|
|
Name: "colima",
|
|
}
|
|
case strings.Contains(content, "containerd"):
|
|
return &model.Source{
|
|
Type: model.SourceContainer,
|
|
Name: "containerd",
|
|
}
|
|
case strings.Contains(content, "lxc.payload"):
|
|
return &model.Source{
|
|
Type: model.SourceContainer,
|
|
Name: detectLXCRuntime(ancestry),
|
|
}
|
|
}
|
|
}
|
|
|
|
// Snap/Flatpak sandbox detection via environment variables
|
|
if len(ancestry) > 0 {
|
|
target := ancestry[len(ancestry)-1]
|
|
for _, e := range target.Env {
|
|
if strings.HasPrefix(e, "SNAP_NAME=") {
|
|
return &model.Source{
|
|
Type: model.SourceContainer,
|
|
Name: "snap",
|
|
}
|
|
}
|
|
if strings.HasPrefix(e, "FLATPAK_ID=") {
|
|
return &model.Source{
|
|
Type: model.SourceContainer,
|
|
Name: "flatpak",
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func itoa(n int) string {
|
|
return strconv.Itoa(n)
|
|
}
|
|
|
|
func detectLXCRuntime(ancestry []model.Process) string {
|
|
for _, a := range ancestry {
|
|
switch a.Command {
|
|
case "incusd":
|
|
return "incus"
|
|
case "lxd":
|
|
return "lxd"
|
|
case "lxc-start":
|
|
return "lxc"
|
|
}
|
|
}
|
|
return "lxc" // fallback
|
|
}
|