func controlDevice(w rest.ResponseWriter, r *rest.Request) { type ControlParam struct { Token string `json:"token"` Service string `json:"service"` Cmd string `json:"cmd"` } devId := r.PathParam("devid") body := r.Env["body"] if body == nil { rest.Error(w, "Empty body", http.StatusBadRequest) return } b := body.([]byte) param := ControlParam{} if err := json.Unmarshal(b, ¶m); err != nil { log.Warnf("Error decode body: %s", err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } if !checkAuthz(param.Token, devId) { log.Warnf("Auth failed. token: %s, device_id: %s", param.Token, devId) rest.Error(w, "Authorization failed", http.StatusForbidden) return } stats.Cmd(param.Service) resp := cloud.ApiResponse{} result, err := rpcClient.Control(devId, param.Service, param.Cmd) if err != nil { if _, ok := err.(*mq.NoDeviceError); ok { stats.CmdOffline(param.Service) rest.NotFound(w, r) return } else if _, ok := err.(*mq.TimeoutError); ok { stats.CmdTimeout(param.Service) resp.ErrNo = cloud.ERR_CMD_TIMEOUT resp.ErrMsg = fmt.Sprintf("recv response timeout [%s]", devId) } else if _, ok := err.(*mq.InvalidServiceError); ok { stats.CmdInvalidService(param.Service) resp.ErrNo = cloud.ERR_CMD_INVALID_SERVICE resp.ErrMsg = fmt.Sprintf("Device [%s] has no service [%s]", devId, param.Service) } else if _, ok := err.(*mq.SdkError); ok { stats.CmdOtherError(param.Service) resp.ErrNo = cloud.ERR_CMD_SDK_ERROR resp.ErrMsg = fmt.Sprintf("Error when calling service [%s] on [%s]", param.Service, devId) } else { stats.CmdOtherError(param.Service) resp.ErrNo = cloud.ERR_CMD_OTHER resp.ErrMsg = err.Error() } } else { stats.CmdSuccess(param.Service) resp.ErrNo = cloud.ERR_NOERROR resp.Data = result } w.WriteJson(resp) }
func getDeviceList(w rest.ResponseWriter, r *rest.Request) { stats.QueryOnlineDevices() devInfoList := []devInfo{} r.ParseForm() dev_ids := r.FormValue("dev_ids") if dev_ids != "" { ids := strings.Split(dev_ids, ",") for _, id := range ids { if serverName, err := storage.Instance.CheckDevice(id); err == nil && serverName != "" { info := devInfo{ Id: id, } devInfoList = append(devInfoList, info) } } } else { rest.Error(w, "Missing \"dev_ids\"", http.StatusBadRequest) return } resp := cloud.ApiResponse{} resp.ErrNo = cloud.ERR_NOERROR resp.Data = devInfoList w.WriteJson(resp) }
func getDevice(w rest.ResponseWriter, r *rest.Request) { devId := r.PathParam("devid") r.ParseForm() token := r.FormValue("token") if token == "" { rest.Error(w, "Missing \"token\"", http.StatusBadRequest) return } if !checkAuthz(token, devId) { log.Warnf("Auth failed. token: %s, device_id: %s", token, devId) rest.Error(w, "Authorization failed", http.StatusForbidden) return } stats.QueryDeviceInfo() if serverName, err := storage.Instance.CheckDevice(devId); err == nil && serverName != "" { resp := cloud.ApiResponse{} resp.ErrNo = cloud.ERR_NOERROR resp.Data = devInfo{ Id: devId, } w.WriteJson(resp) } else { rest.NotFound(w, r) return } }
func deleteStats(w rest.ResponseWriter, r *rest.Request) { if err := stats.ClearStats(); err != nil { rest.Error(w, err.Error(), http.StatusInternalServerError) return } resp := cloud.ApiResponse{} resp.ErrNo = cloud.ERR_NOERROR w.WriteJson(resp) }