github.com/flanksource/konfigadm@v0.12.0/pkg/phases/yum.go (about)

     1  package phases
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/flanksource/konfigadm/pkg/types"
     8  	"github.com/flanksource/konfigadm/pkg/utils"
     9  	log "github.com/sirupsen/logrus"
    10  )
    11  
    12  type YumPackageManager struct{}
    13  
    14  func (p YumPackageManager) Install(pkg ...string) types.Commands {
    15  	arg := strings.Join(pkg, " ")
    16  	// Yum versions are specified using a -, not a =
    17  	arg = strings.Replace(arg, "=", "-", -1)
    18  	return types.NewCommand(fmt.Sprintf("yum install -y %s", arg))
    19  }
    20  
    21  func (p YumPackageManager) Update() types.Commands {
    22  	return types.NewCommand("yum makecache")
    23  }
    24  
    25  func (p YumPackageManager) Uninstall(pkg ...string) types.Commands {
    26  	return types.NewCommand(fmt.Sprintf("yum remove -y %s", strings.Join(pkg, " ")))
    27  }
    28  
    29  func (p YumPackageManager) Mark(pkg ...string) types.Commands {
    30  	return types.Commands{}
    31  }
    32  
    33  func (p YumPackageManager) CleanupCaches() types.Commands {
    34  	return types.Commands{}
    35  }
    36  
    37  func (p YumPackageManager) GetInstalledVersion(pkg string) string {
    38  	pkg = strings.Split(pkg, "=")[0]
    39  	var version, release, arch string
    40  	stdout, ok := utils.SafeExec("yum info " + pkg)
    41  	if !ok {
    42  		log.Debugf("Failed installation check for %s -> %s", pkg, stdout)
    43  		return ""
    44  	}
    45  
    46  	if !strings.Contains(stdout, "Installed Packages") {
    47  		log.Debugf("%s is in db, but is not installed", pkg)
    48  		return ""
    49  	}
    50  
    51  	for _, line := range strings.Split(stdout, "\n") {
    52  		if strings.HasPrefix(line, "Version") {
    53  			version = strings.Split(line, ": ")[1]
    54  		}
    55  		if strings.HasPrefix(line, "Release") {
    56  			release = fmt.Sprintf("-%s", strings.Split(line, ": ")[1])
    57  		}
    58  		if strings.HasPrefix(line, "Arch") {
    59  			arch = fmt.Sprintf(".%s", strings.Split(line, ": ")[1])
    60  		}
    61  		if strings.HasPrefix(line, "Available") {
    62  			break
    63  		}
    64  	}
    65  	retval := fmt.Sprintf("%s%s%s", version, release, arch)
    66  	if retval == "" {
    67  		log.Debugf("Unable to find version info in " + stdout)
    68  	}
    69  	return retval
    70  }
    71  
    72  func (p YumPackageManager) GetKernelPackageNames(version string) (string, string) {
    73  	read, ok := utils.SafeExec("rpm --eval %%{dist}")
    74  	if !ok {
    75  		return "", ""
    76  	}
    77  	dist := strings.TrimSuffix(read, "\n")
    78  	read, ok = utils.SafeExec("uname -p")
    79  	if !ok {
    80  		return "", ""
    81  	}
    82  	arch := strings.TrimSuffix(read, "\n")
    83  	kernelname := fmt.Sprintf("kernel-%s%s.%s", version, dist, arch)
    84  	headername := fmt.Sprintf("kernel-devel-%s%s.%s", version, dist, arch)
    85  	return kernelname, headername
    86  }
    87  
    88  func (p YumPackageManager) AddRepo(url string, channel string, versionCodeName string, name string, gpgKey string, extraArgs map[string]string) types.Commands {
    89  	repo := fmt.Sprintf(
    90  		`[%s]
    91  name=%s
    92  enabled=1
    93  `, name, name)
    94  
    95  	if url != "" {
    96  		repo += fmt.Sprintf("baseurl = %s\n", url)
    97  	}
    98  
    99  	if gpgKey != "" {
   100  		repo += fmt.Sprintf(`gpgcheck=1
   101  gpgkey=%s
   102  `, gpgKey)
   103  	}
   104  
   105  	for k, v := range extraArgs {
   106  		repo += fmt.Sprintf("%s = %s\n", k, v)
   107  	}
   108  	return types.NewCommand(fmt.Sprintf(`cat <<EOF >/etc/yum.repos.d/%s.repo
   109  %s
   110  EOF`, name, repo))
   111  }