@@ -3,7 +3,6 @@ package configurer
33import (
44 "errors"
55 "fmt"
6- "io/fs"
76 "path"
87 "path/filepath"
98 "regexp"
@@ -14,6 +13,7 @@ import (
1413 "github.com/Mirantis/launchpad/pkg/constant"
1514 commonconfig "github.com/Mirantis/launchpad/pkg/product/common/config"
1615 "github.com/Mirantis/launchpad/pkg/util/iputil"
16+ "github.com/k0sproject/rig"
1717 "github.com/k0sproject/rig/exec"
1818 "github.com/k0sproject/rig/os"
1919 log "github.com/sirupsen/logrus"
@@ -26,6 +26,10 @@ const (
2626 SbinPath = `PATH=/usr/local/sbin:/usr/sbin:/sbin:$PATH`
2727)
2828
29+ var (
30+ LinuxMCRInstallError = errors .New ("failed to install MCR on linux" )
31+ )
32+
2933// LinuxConfigurer is a generic linux host configurer.
3034type LinuxConfigurer struct {
3135 riglinux os.Linux
@@ -54,60 +58,6 @@ func (c LinuxConfigurer) InstallMCRLicense(h os.Host, lic string) error {
5458 return nil
5559}
5660
57- // InstallMCR install MCR on Linux.
58- func (c LinuxConfigurer ) InstallMCR (h os.Host , scriptPath string , engineConfig commonconfig.MCRConfig ) error {
59- base := path .Base (scriptPath )
60-
61- installScriptDir := engineConfig .InstallScriptRemoteDirLinux
62- if installScriptDir == "" {
63- installScriptDir = c .riglinux .Pwd (h )
64- }
65-
66- _ , err := h .ExecOutput (fmt .Sprintf ("mkdir -p %s" , installScriptDir ))
67- if err != nil {
68- return fmt .Errorf ("failed to create directory %s: %w" , installScriptDir , err )
69- }
70-
71- installer := path .Join (installScriptDir , base )
72-
73- err = h .Upload (scriptPath , installer , fs .FileMode (0o640 ))
74- if err != nil {
75- log .Errorf ("failed: %s" , err .Error ())
76- return fmt .Errorf ("upload %s to %s: %w" , scriptPath , installer , err )
77- }
78- defer func () {
79- if err := c .riglinux .DeleteFile (h , installer ); err != nil {
80- log .Warnf ("failed to delete installer script: %s" , err .Error ())
81- }
82- }()
83-
84- envs := fmt .Sprintf ("DOCKER_URL=%s CHANNEL=%s VERSION=%s " , engineConfig .RepoURL , engineConfig .Channel , engineConfig .Version )
85- if engineConfig .AdditionalRuntimes != "" {
86- envs += fmt .Sprintf ("ADDITIONAL_RUNTIMES=%s " , engineConfig .AdditionalRuntimes )
87- }
88- if engineConfig .DefaultRuntime != "" {
89- envs += fmt .Sprintf ("DEFAULT_RUNTIME=%s " , engineConfig .DefaultRuntime )
90- }
91- cmd := envs + fmt .Sprintf ("bash %s" , escape .Quote (installer ))
92-
93- log .Infof ("%s: running installer" , h )
94- log .Debugf ("%s: installer command: %s" , h , cmd )
95-
96- if err := h .Exec (cmd ); err != nil {
97- return fmt .Errorf ("run MCR installer: %w" , err )
98- }
99-
100- if err := c .riglinux .EnableService (h , "docker" ); err != nil {
101- return fmt .Errorf ("enable docker service: %w" , err )
102- }
103-
104- if err := c .riglinux .StartService (h , "docker" ); err != nil {
105- return fmt .Errorf ("start docker service: %w" , err )
106- }
107-
108- return nil
109- }
110-
11161// RestartMCR restarts Docker EE engine.
11262func (c LinuxConfigurer ) RestartMCR (h os.Host ) error {
11363 if err := c .riglinux .RestartService (h , "docker" ); err != nil {
@@ -406,3 +356,28 @@ func (c LinuxConfigurer) attemptPathSudoDelete(h os.Host, path string) {
406356 }
407357 log .Infof ("%s: removed %s successfully" , h , path )
408358}
359+
360+ var (
361+ errAbort = errors .New ("base os detected but version resolving failed" )
362+ )
363+
364+ // ResolveLinux stolen from k0sproject/rig.
365+ //
366+ // We need os-release info in various scenarios, but rig doesn't really expose it.
367+ func ResolveLinux (h os.Host ) (rig.OSVersion , error ) {
368+ if err := h .Exec ("uname | grep -q Linux" ); err != nil {
369+ return rig.OSVersion {}, fmt .Errorf ("not a linux host (%w)" , err )
370+ }
371+
372+ output , err := h .ExecOutput ("cat /etc/os-release || cat /usr/lib/os-release" )
373+ if err != nil {
374+ // at this point it is known that this is a linux host, so any error from here on should signal the resolver to not try the next
375+ return rig.OSVersion {}, fmt .Errorf ("%w: unable to read os-release file: %w" , errAbort , err )
376+ }
377+
378+ var version rig.OSVersion
379+ if err := rig .ParseOSReleaseFile (output , & version ); err != nil {
380+ return rig.OSVersion {}, errors .Join (errAbort , err )
381+ }
382+ return version , nil
383+ }
0 commit comments