github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmg/SubCommand/InstallCmd/install.go (about) 1 package InstallCmd 2 3 import ( 4 "github.com/bronze1man/kmg/kmgConsole" 5 6 "github.com/bronze1man/kmg/kmgCmd" 7 "github.com/bronze1man/kmg/kmgSys" 8 //"strings" 9 "fmt" 10 11 "github.com/bronze1man/kmg/kmgCompress" 12 "github.com/bronze1man/kmg/kmgFile" 13 "github.com/bronze1man/kmg/kmgNet/kmgHttp" 14 "github.com/bronze1man/kmg/kmgPlatform" 15 "github.com/bronze1man/kmg/kmgTime" 16 "path" 17 "time" 18 ) 19 20 func AddCommandList() { 21 22 kmgConsole.AddAction(kmgConsole.Command{ 23 Name: "install", 24 Desc: "install tool", 25 Runner: installCmd, 26 }) 27 } 28 29 func installCmd() { 30 cg := kmgConsole.NewCommandGroup() 31 cg.AddCommandWithName("golang", installGolang) 32 cg.AddCommandWithName("golang1.5", installGolang15) 33 cg.AddCommandWithName("mysql", installMysql) 34 cg.Main() 35 } 36 37 /* 38 本次实现遇到下列问题: 39 * 不同操作系统判断 40 * root权限判断 41 * 如果同名 wget会修改下载组件的名称,使用临时文件夹处理 42 * 如果已经安装 cp -rf go /usr/local/go 会再创建一个/usr/local/go/go 目录,而不是更新它 43 * 如果已经在/usr/local/bin/go处放了一个执行,又在/bin/go处放了一个执行文件, /bin/go的版本不会被使用,使用函数专门判断这种情况,并且把多余的去除掉 44 * 如果上一种情况发生,当前bash不能执行go version,因为当前bash有路径查询缓存(暂时无解了..) 45 * TODO 国外服务器因为网络太卡而不能安装 46 */ 47 func installGolang() { 48 installGolangWithUrlMap(map[string]string{ 49 "windows_amd64": "http://kmgtools.qiniudn.com/v1/go1.4.2.windows-amd64.zip", 50 "linux_amd64": "http://kmgtools.qiniudn.com/v1/go1.4.2.linux-amd64.tar.gz", 51 "darwin_amd64": "http://kmgtools.qiniudn.com/v1/go1.4.2.darwin-amd64-osx10.8.tar.gz", 52 }) 53 } 54 55 func installGolang15() { 56 installGolangWithUrlMap(map[string]string{ 57 "windows_amd64": "http://kmgtools.qiniudn.com/go1.5.windows-amd64.zip", 58 "linux_amd64": "http://kmgtools.qiniudn.com/go1.5.linux-amd64.tar.gz", 59 "darwin_amd64": "http://kmgtools.qiniudn.com/go1.5.darwin-amd64.tar.gz", 60 }) 61 } 62 63 func installGolangWithUrlMap(urlMap map[string]string) { 64 p := kmgPlatform.GetCompiledPlatform() 65 if p.Compatible(kmgPlatform.WindowsAmd64) { 66 contentB, err := kmgHttp.UrlGetContent(urlMap["windows_amd64"]) 67 kmgConsole.ExitOnErr(err) 68 kmgFile.MustDelete(`c:\go`) 69 err = kmgCompress.ZipUncompressFromBytesToDir(contentB, `c:\go`, "go") 70 kmgConsole.ExitOnErr(err) 71 err = kmgFile.CopyFile(`c:\go\bin\go.exe`, `c:\windows\system32\go.exe`) 72 kmgConsole.ExitOnErr(err) 73 err = kmgFile.CopyFile(`c:\go\bin\godoc.exe`, `c:\windows\system32\godoc.exe`) 74 kmgConsole.ExitOnErr(err) 75 err = kmgFile.CopyFile(`c:\go\bin\gofmt.exe`, `c:\windows\system32\gofmt.exe`) 76 kmgConsole.ExitOnErr(err) 77 return 78 } 79 tmpPath := kmgFile.MustChangeToTmpPath() 80 defer kmgFile.MustDelete(tmpPath) 81 if !kmgSys.MustIsRoot() { 82 fmt.Println("you need to be root to install golang") 83 return 84 } 85 86 url, ok := urlMap[p.String()] 87 if !ok { 88 kmgConsole.ExitOnErr(fmt.Errorf("not support platform [%s]", p)) 89 } 90 packageName := path.Base(url) 91 contentB := kmgHttp.MustUrlGetContentProcess(url) 92 93 kmgFile.MustWriteFile(packageName, contentB) 94 kmgCmd.ProxyRun("tar -xf " + packageName) 95 if kmgFile.MustFileExist("/usr/local/go") { 96 kmgCmd.ProxyRun("mv /usr/local/go /usr/local/go.bak." + time.Now().Format(kmgTime.FormatFileNameV2)) 97 } 98 kmgCmd.ProxyRun("cp -rf go /usr/local") 99 kmgFile.MustDeleteFile("/bin/go") 100 kmgCmd.ProxyRun("ln -s /usr/local/go/bin/go /bin/go") 101 kmgFile.MustDeleteFile("/bin/godoc") 102 kmgCmd.ProxyRun("ln -s /usr/local/go/bin/godoc /bin/godoc") 103 kmgFile.MustDeleteFile("/bin/gofmt") 104 kmgCmd.ProxyRun("ln -s /usr/local/go/bin/gofmt /bin/gofmt") 105 kmgFile.MustEnsureBinPath("/bin/go") 106 kmgFile.MustEnsureBinPath("/bin/godoc") 107 kmgFile.MustEnsureBinPath("/bin/gofmt") 108 } 109 110 func installMysql() { 111 kmgCmd.ProxyRun("apt-get update") 112 kmgCmd.CmdString("apt-get -y install mysql-server").MustSetEnv("DEBIAN_FRONTEND", "noninteractive").ProxyRun() 113 }