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  }