github.com/flanksource/konfigadm@v0.12.0/pkg/phases/tdnf.go (about) 1 package phases 2 3 import ( 4 "fmt" 5 "github.com/flanksource/konfigadm/pkg/types" 6 "github.com/flanksource/konfigadm/pkg/utils" 7 log "github.com/sirupsen/logrus" 8 "strings" 9 ) 10 11 type TdnfPackageManager struct{} 12 13 func (p TdnfPackageManager) Install(pkg ...string) types.Commands { 14 return types.NewCommand(fmt.Sprintf("tdnf install -y %s", strings.Join(pkg, " "))) 15 } 16 17 func (p TdnfPackageManager) Update() types.Commands { 18 return types.NewCommand("tdnf makecache") 19 } 20 21 func (p TdnfPackageManager) Uninstall(pkg ...string) types.Commands { 22 return types.NewCommand(fmt.Sprintf("tdnf remove -y %s", strings.Join(pkg, " "))) 23 } 24 25 func (p TdnfPackageManager) Mark(pkg ...string) types.Commands { 26 return types.Commands{} 27 } 28 29 func (p TdnfPackageManager) CleanupCaches() types.Commands { 30 return types.Commands{} 31 } 32 33 func (p TdnfPackageManager) GetInstalledVersion(pkg string) string { 34 pkg = strings.Split(pkg, "=")[0] 35 var version, release, arch string 36 _, ok := utils.SafeExec("tdnf info " + pkg) 37 if !ok { 38 log.Debugf("No matching package available in db for: %s", pkg) 39 return "" 40 } 41 42 stdout, ok := utils.SafeExec("tdnf info installed " + pkg) 43 if !ok { 44 log.Debugf("%s package available in db but not installed", pkg) 45 return "" 46 } 47 48 for _, line := range strings.Split(stdout, "\n") { 49 if strings.HasPrefix(line, "Version") { 50 version = strings.Split(line, ": ")[1] 51 } 52 if strings.HasPrefix(line, "Release") { 53 release = fmt.Sprintf("-%s", strings.Split(line, ": ")[1]) 54 } 55 if strings.HasPrefix(line, "Arch") { 56 arch = fmt.Sprintf(".%s", strings.Split(line, ": ")[1]) 57 } 58 } 59 retval := fmt.Sprintf("%s%s%s", version, release, arch) 60 if retval == "" { 61 log.Debugf("Unable to find version info in " + stdout) 62 } 63 return retval 64 } 65 66 func (p TdnfPackageManager) GetKernelPackageNames(version string) (string, string) { 67 // currently tdnf is only in photon, which does not ship rpm by default 68 // Manually mapping %{dist} to os info for now 69 var dist, arch string 70 read, ok := utils.SafeExec("cat /etc/os-release") 71 if !ok { 72 return "", "" 73 } 74 distinfo := make(map[string]string) 75 for _, line := range strings.Split(read, "\n") { 76 linearr := strings.Split(line, "=") 77 if len(linearr) != 2 { 78 continue 79 } 80 distinfo[linearr[0]] = linearr[1] 81 } 82 if distinfo["ID"] != "photon" { 83 return "", "" 84 } 85 if strings.HasPrefix(distinfo["VERSION_ID"], "3.") { 86 dist = ".ph3" 87 } else if strings.HasPrefix(distinfo["VERSION_ID"], "2.") { 88 dist = ".ph2" 89 } else { 90 return "", "" 91 } 92 read, ok = utils.SafeExec("uname -p") 93 if !ok { 94 arch = "x86_64" 95 } else { 96 arch = strings.TrimSuffix(read, "\n") 97 } 98 kernelname := fmt.Sprintf("linux-%s%s.%s", version, dist, arch) 99 headername := fmt.Sprintf("linux-devel-%s%s.%s", version, dist, arch) 100 return kernelname, headername 101 } 102 103 func (p TdnfPackageManager) AddRepo(url string, channel string, versionCodeName string, name string, gpgKey string, extraArgs map[string]string) types.Commands { 104 repo := fmt.Sprintf( 105 `[%s] 106 name=%s 107 baseurl=%s 108 enabled=1 109 `, name, name, url) 110 111 if gpgKey != "" { 112 repo += fmt.Sprintf(`gpgcheck=1 113 repo_gpgcheck=1 114 gpgkey=%s 115 `, gpgKey) 116 } else { 117 repo += ` 118 gpgcheck=0 119 ` 120 } 121 122 for k, v := range extraArgs { 123 repo += fmt.Sprintf("%s = %s\n", k, v) 124 } 125 126 return types.NewCommand(fmt.Sprintf(`cat <<EOF >/etc/yum.repos.d/%s.repo 127 %s 128 EOF`, name, repo)) 129 }