-
Notifications
You must be signed in to change notification settings - Fork 0
/
pmdetect.go
71 lines (62 loc) · 1.87 KB
/
pmdetect.go
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
package pmdetect
import "fmt"
import "io/fs"
// This file is incomplete
// PackageManager represents a list of common package managers
type PackageManager int; const (
// OS native
PmAPT PackageManager = iota
PmAPK
PmDNF
PmPacman
PmXBPS
// Sandboxed, distro agnostic
PmFlatpak
PmSnap
pmCap // Must always be at the end of the list!
)
// ExistsOn returns whether or not the given package manager exists on the
// system. Root is the root filesystem of the system being analyzed.
func (pm PackageManager) ExistsOn (root fs.FS) bool {
switch pm {
case PmAPT: return fileExists(root, "etc/apt/sources.list") ||
fileExists(root, "etc/apt/sources.list.d")
case PmAPK: return fileExists(root, "etc/apk/repositories")
case PmDNF: return fileExists(root, "etc/yum.repos.d")
case PmPacman: return fileExists(root, "etc/pacman.conf") ||
fileExists(root, "etc/pacman.d")
case PmXBPS: return fileExists(root, "usr/share/xbps.d")
case PmFlatpak: return fileExists(root, "var/lib/flatpak")
case PmSnap: return fileExists(root, "etc/snap")
default: return false
}
}
func (pm PackageManager) String () string {
switch pm {
case PmAPT: return "APT"
case PmAPK: return "APK"
case PmDNF: return "DNF"
case PmPacman: return "Pacman"
case PmXBPS: return "XBPS"
case PmFlatpak: return "Flatpak"
case PmSnap: return "Snap"
default: return fmt.Sprintf("pmdetect.PackageManager(%d)", pm)
}
}
// Detect returns a list of package managers being used on the system. Root is
// the root filesystem of the system being analyzed.
func Detect (root fs.FS) []PackageManager {
var pms []PackageManager
for pm := PmAPT; pm < pmCap; pm ++ {
if pm.ExistsOn(root) {
pms = append(pms, pm)
}
}
return pms
}
func fileExists (filesystem fs.FS, name string) bool {
file, err := filesystem.Open(name)
if err != nil { return false}
file.Close()
return true
}