agent/websocket/ResponseHandler.go (1 lines of code) (raw):

package websocket /* import ( "encoding/json" "errors" "fmt" "io/ioutil" "os" "path/filepath" "strings" "sync" "github.com/aliyun/aliyun_assist_client/agent/util" "github.com/aliyun/aliyun_assist_client/agent/util/httputil" "github.com/tidwall/gjson" ) var G_ResponseHandlerLock sync.Mutex func ResponseHandler(responseData string, fromHttp bool) error { G_ResponseHandlerLock.Lock() defer G_ResponseHandlerLock.Unlock() MyInfo.Println("response: ", responseData, "fromHttp :", fromHttp) if responseData == "ok" { return nil } if !gjson.Valid(responseData) { return errors.New("invalid json") } actionType := gjson.Get(responseData, "actionType") actionId := gjson.Get(responseData, "actionId") reply := &replyToServer{ ActionType: actionType.String(), ActionID: actionId.String(), } switch actionType.String() { case "getLog": reply.Result = getLogHandler(gjson.Get(responseData, "logPath").String()) case "installAssit": reply.Result = installAssist(gjson.Get(responseData, "InstallInfo.url").String(), gjson.Get(responseData, "InstallInfo.md5").String(), gjson.Get(responseData, "InstallInfo.version").String()) case "updateDeamon": reply.Result = updateAssistDeamon(gjson.Get(responseData, "updateInfo.url").String(), gjson.Get(responseData, "updateInfo.md5").String(), gjson.Get(responseData, "updateInfo.version").String()) default: return errors.New("invalid actionType") } jsonBytes, err := json.Marshal(*reply) if err != nil { return err } if fromHttp { _, err = httputil.HttpPost(util.GetDeamonUrl(), string(jsonBytes), "") } else { err = ReplyMsgToWebsocketServer(string(jsonBytes)) } if err != nil { MyError.Println("reply error:", err.Error()) } return err } type replyToServer struct { ActionType string `json:"actionType"` ActionID string `json:"actionId"` Result string `json:"Result"` } func getLogHandler(logPath string) string { if logPath == "" { return "error! logpath is null" } if !strings.HasPrefix(logPath, "C:\\ProgramData\\aliyun\\") && !strings.HasPrefix(logPath, "/usr/local/share/aliyun") { return "error! invalid logpath" } f, err := ioutil.ReadFile(logPath) if err != nil { return "error! " + err.Error() } return string(f) } func updateAssistDeamon(url string, md5 string, version string) string { if G_AssistVersion == version { return "ok" } DestExe := "/usr/local/share/AssistDeamon" if G_IsWindows { DestExe = "C:\\ProgramData\\aliyun\\AssistDeamon.exe" } destAssistDir := "/usr/local/share/assist-deamon" if G_IsWindows { destAssistDir = "C:\\ProgramData\\aliyun\\assist-deamon" } os.MkdirAll(destAssistDir, os.ModePerm) if err := os.MkdirAll(filepath.Dir(DestExe), os.ModePerm); err != nil { return err.Error() } err := util.HttpDownlod(url, DestExe) if err != nil { return err.Error() } tmpMd5, err := util.ComputeMd5(DestExe) if err != nil { return err.Error() } if tmpMd5 != md5 { return "error: file md5 is not valid" } if !G_IsWindows { err = ioutil.WriteFile("/usr/local/share/UpdateAssistDeamon.sh", []byte(updateDeamonLinux), 0644) } else { err = ioutil.WriteFile("C:\\ProgramData\\aliyun\\UpdateAssistDeamon.bat", []byte(updateDeamonWin), 0644) } if err != nil { return err.Error() } if !G_IsWindows { util.ExeCmd("chmod +x /usr/local/share/UpdateAssistDeamon.sh") } if G_IsWindows { err, _ = util.ExeCmdNoWait("C:\\ProgramData\\aliyun\\UpdateAssistDeamon.bat") } else { err, _ = util.ExeCmdNoWait("/usr/local/share/UpdateAssistDeamon.sh") } if err != nil { return err.Error() } return "ok" } func installAssist(url string, md5 string, version string) string { if G_AssistVersion == version { return "ok" } if G_IsWindows { return installAssistWin(url, md5, version) } else { return installAssistLinux(url, md5, version) } } func installAssistLinux(url string, md5 string, version string) string { bRpm := util.HasCmdInLinux("rpm") DestExe := "/root/tmp_assist" err := util.HttpDownlod(url, DestExe) if err != nil { return err.Error() } tmpMd5, err := util.ComputeMd5(DestExe) if err != nil { return err.Error() } if tmpMd5 != md5 { return "error: file md5 is not valid" } if bRpm { util.ExeCmd("rpm --force -ivh /root/tmp_assist") } else { util.ExeCmd("dpkg -i /root/tmp_assist") } if G_AssistVersion == version { return "ok" } return "Install assist failed" } func installAssistWin(url string, md5 string, version string) string { cpath, _ := os.Getwd() tmpZip := filepath.Join(cpath, "tmp_assist.zip") err := util.HttpDownlod(url, tmpZip) if err != nil { return err.Error() } defer os.Remove("tmp_assist.zip") tmpMd5, err := util.ComputeMd5(tmpZip) if err != nil { return err.Error() } if tmpMd5 != md5 { return "error: file md5 is not valid" } tmpZipDir := filepath.Join(cpath, "tmp_assist") tmpZipDir = filepath.Join(tmpZipDir, version) err = util.Unzip(tmpZip, tmpZipDir) if err != nil { return err.Error() } defer os.RemoveAll("tmp_assist") destAssistDir := "/usr/local/share/aliyun-assist/" + version if G_IsWindows { destAssistDir = "C:\\ProgramData\\aliyun\\assist\\" + version } os.MkdirAll(destAssistDir, os.ModePerm) copyScript := "mv " + tmpZipDir + " " + destAssistDir if G_IsWindows { copyScript = "echo d | xcopy /e /q /y " + tmpZipDir + " " + destAssistDir } err, out, stderr := util.ExeCmd(copyScript) if err != nil { MyInfo.Println(copyScript, "\n", out) fmt.Println(err.Error(), "\n", stderr) return err.Error() } installScript := filepath.Join(destAssistDir, "update_install") if G_IsWindows { installScript = filepath.Join(destAssistDir, "install.bat") } err, out, _ = util.ExeCmd(installScript) if err != nil { MyInfo.Println(installScript, "\n", out) return err.Error() } if G_AssistVersion == version { return "ok" } return "Install assist failed" } func getErrorString(err error, stderr string) string { errStr := "" if err != nil { errStr += err.Error() } errStr += stderr return "error:" + errStr } const updateDeamonWin = ` C:\ProgramData\aliyun\assist-deamon\AssistDeamon.exe stop C:\ProgramData\aliyun\assist-deamon\AssistDeamon.exe remove copy /y C:\ProgramData\aliyun\AssistDeamon.exe C:\ProgramData\aliyun\assist-deamon\AssistDeamon.exe del /q C:\ProgramData\aliyun\AssistDeamon.exe C:\ProgramData\aliyun\assist-deamon\AssistDeamon.exe install C:\ProgramData\aliyun\assist-deamon\AssistDeamon.exe start ` const updateDeamonLinux = ` /usr/local/share/assist-deamon/AssistDeamon stop /usr/local/share/assist-deamon/AssistDeamon remove cp -f /usr/local/share/AssistDeamon /usr/local/share/assist-deamon/AssistDeamon chmod +x /usr/local/share/assist-deamon/AssistDeamon /usr/local/share/assist-deamon/AssistDeamon install /usr/local/share/assist-deamon/AssistDeamon start rm -rf /usr/local/share/AssistDeamon ` */