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  }