Skip to content

Commit 8e18250

Browse files
committed
add: install, check golang
1 parent 335f9a4 commit 8e18250

File tree

1 file changed

+154
-0
lines changed

1 file changed

+154
-0
lines changed

internal/utils.go

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
package internal
2+
3+
import (
4+
"archive/tar"
5+
"compress/gzip"
6+
"github.com/GoFarsi/gvm/errors"
7+
"io"
8+
"log"
9+
"os"
10+
"os/exec"
11+
"path/filepath"
12+
"regexp"
13+
"strings"
14+
)
15+
16+
func checkGoInstalled() (string, bool) {
17+
goFile, err := findGoVersion()
18+
if err != nil {
19+
return "", false
20+
}
21+
22+
resp, err := exec.Command(goFile, "version").Output()
23+
if err != nil {
24+
return "", false
25+
}
26+
27+
re := regexp.MustCompile("(\\d+\\.\\d+(?:\\.\\d+)?)")
28+
match := re.FindStringSubmatch(string(resp))
29+
30+
if len(match) != 0 {
31+
return match[0], true
32+
}
33+
34+
return "", false
35+
}
36+
37+
func installGo(filePath string) error {
38+
if !hasSudoAccess() {
39+
return errors.ERR_SUDO_ACCESS
40+
}
41+
42+
if !removedOldGo() {
43+
return errors.ERR_CANT_REMOVE_OLD_VERSION
44+
}
45+
46+
f, err := os.Open(filePath)
47+
if err != nil {
48+
return err
49+
}
50+
defer f.Close()
51+
52+
gzf, err := gzip.NewReader(f)
53+
if err != nil {
54+
return err
55+
}
56+
57+
tarReader := tar.NewReader(gzf)
58+
59+
count := 0
60+
for {
61+
header, err := tarReader.Next()
62+
if err == io.EOF {
63+
break
64+
}
65+
66+
target := filepath.Join("/usr/local", header.Name)
67+
68+
switch header.Typeflag {
69+
case tar.TypeDir:
70+
if _, err := os.Stat(target); err != nil {
71+
if err := os.MkdirAll(target, 0755); err != nil {
72+
log.Println(err)
73+
os.Exit(1)
74+
}
75+
}
76+
case tar.TypeReg:
77+
log.Println("(", count, ")", "Name: ", target)
78+
79+
f, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode))
80+
if err != nil {
81+
return err
82+
}
83+
84+
// copy over contents
85+
if _, err := io.Copy(f, tarReader); err != nil {
86+
return err
87+
}
88+
89+
f.Close()
90+
91+
default:
92+
log.Printf("unable to untar file %s with type %c", target, header.Typeflag)
93+
}
94+
count++
95+
}
96+
97+
if err := setGoEnvPath(); err != nil {
98+
return errors.ERR_CANT_SET_ENV
99+
}
100+
101+
log.Printf("\ngo installed in %s path, please run 'source ~/.profile' for commit env.", goInstallPath)
102+
103+
return nil
104+
}
105+
106+
func findGoVersion() (string, error) {
107+
path, err := exec.LookPath("go")
108+
if err != nil {
109+
return "", err
110+
}
111+
112+
return path, nil
113+
}
114+
115+
func hasSudoAccess() bool {
116+
resp, err := exec.Command("groups").Output()
117+
if err != nil {
118+
return false
119+
}
120+
121+
if strings.Contains(string(resp), "root") || strings.Contains(string(resp), "sudo") {
122+
return true
123+
}
124+
125+
return false
126+
}
127+
128+
func removedOldGo() bool {
129+
if _, err := os.Stat(goInstallPath + "/bin/go"); err != nil {
130+
return true
131+
}
132+
133+
if err := os.RemoveAll(goInstallPath); err != nil {
134+
return false
135+
}
136+
137+
return true
138+
}
139+
140+
func setGoEnvPath() error {
141+
home, err := os.UserHomeDir()
142+
if err != nil {
143+
return err
144+
}
145+
file, err := os.OpenFile(home+"/.profile", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
146+
if err != nil {
147+
return err
148+
}
149+
150+
if _, err := file.WriteString(env); err != nil {
151+
return err
152+
}
153+
return nil
154+
}

0 commit comments

Comments
 (0)