chore(controller): change firmware update filename
This commit is contained in:
parent
c4efccaa0a
commit
23b629599d
|
|
@ -1,137 +0,0 @@
|
||||||
package api
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/leandrofars/oktopus/internal/bridge"
|
|
||||||
local "github.com/leandrofars/oktopus/internal/nats"
|
|
||||||
"github.com/leandrofars/oktopus/internal/usp/usp_msg"
|
|
||||||
"github.com/leandrofars/oktopus/internal/usp/usp_record"
|
|
||||||
"github.com/leandrofars/oktopus/internal/usp/usp_utils"
|
|
||||||
"github.com/leandrofars/oktopus/internal/utils"
|
|
||||||
"google.golang.org/protobuf/proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
type fwUpdate struct {
|
|
||||||
Url string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *Api) deviceFwUpdate(w http.ResponseWriter, r *http.Request) {
|
|
||||||
sn := getSerialNumberFromRequest(r)
|
|
||||||
mtp, err := getMtpFromRequest(r, w)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if mtp == "" {
|
|
||||||
var ok bool
|
|
||||||
mtp, ok = deviceStateOK(w, a.nc, sn)
|
|
||||||
if !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var payload fwUpdate
|
|
||||||
|
|
||||||
utils.MarshallDecoder(&payload, r.Body)
|
|
||||||
|
|
||||||
msg := usp_utils.NewGetMsg(usp_msg.Get{
|
|
||||||
ParamPaths: []string{"Device.DeviceInfo.FirmwareImage.*.Status"},
|
|
||||||
MaxDepth: 1,
|
|
||||||
})
|
|
||||||
|
|
||||||
protoMsg, err := proto.Marshal(&msg)
|
|
||||||
if err != nil {
|
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
|
||||||
w.Write(utils.Marshall(err.Error()))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
record := usp_utils.NewUspRecord(protoMsg, sn)
|
|
||||||
protoRecord, err := proto.Marshal(&record)
|
|
||||||
if err != nil {
|
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
|
||||||
w.Write(utils.Marshall(err.Error()))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
data, err := bridge.NatsUspInteraction(
|
|
||||||
local.DEVICE_SUBJECT_PREFIX+sn+".api",
|
|
||||||
mtp+"-adapter.usp.v1."+sn+".api",
|
|
||||||
protoRecord,
|
|
||||||
w,
|
|
||||||
a.nc,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var receivedRecord usp_record.Record
|
|
||||||
err = proto.Unmarshal(data, &receivedRecord)
|
|
||||||
if err != nil {
|
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
|
||||||
w.Write(utils.Marshall(err.Error()))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var receivedMsg usp_msg.Msg
|
|
||||||
err = proto.Unmarshal(receivedRecord.GetNoSessionContext().Payload, &receivedMsg)
|
|
||||||
if err != nil {
|
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
|
||||||
w.Write(utils.Marshall(err.Error()))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
getMsgAnswer := receivedMsg.Body.GetResponse().GetGetResp()
|
|
||||||
|
|
||||||
partition := checkAvaiableFwPartition(getMsgAnswer.ReqPathResults)
|
|
||||||
if partition == "" {
|
|
||||||
log.Println("Error to get device available firmware partition, probably it has only one partition")
|
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
|
||||||
json.NewEncoder(w).Encode("Server don't have the hability to update device with only one partition")
|
|
||||||
return
|
|
||||||
//TODO: update device with only one partition
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Println("URL to download firmware:", payload.Url)
|
|
||||||
|
|
||||||
receiver := usp_msg.Operate{
|
|
||||||
Command: "Device.DeviceInfo.FirmwareImage." + partition + "Download()",
|
|
||||||
CommandKey: "Download()",
|
|
||||||
SendResp: true,
|
|
||||||
InputArgs: map[string]string{
|
|
||||||
"URL": payload.Url,
|
|
||||||
"AutoActivate": "true",
|
|
||||||
//"Username": "",
|
|
||||||
//"Password": "",
|
|
||||||
"FileSize": "0", //TODO: send firmware length
|
|
||||||
//"CheckSumAlgorithm": "",
|
|
||||||
//"CheckSum": "", //TODO: send firmware with checksum
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
msg = usp_utils.NewOperateMsg(receiver)
|
|
||||||
err = sendUspMsg(msg, sn, w, a.nc, mtp)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check which fw image is activated
|
|
||||||
func checkAvaiableFwPartition(reqPathResult []*usp_msg.GetResp_RequestedPathResult) string {
|
|
||||||
for _, x := range reqPathResult {
|
|
||||||
partitionsNumber := len(x.ResolvedPathResults)
|
|
||||||
if partitionsNumber > 1 {
|
|
||||||
log.Printf("Device has %d firmware partitions", partitionsNumber)
|
|
||||||
for _, y := range x.ResolvedPathResults {
|
|
||||||
//TODO: verify if validation failed is trustable
|
|
||||||
if y.ResultParams["Status"] == "Available" || y.ResultParams["Status"] == "ValidationFailed" {
|
|
||||||
partition := y.ResolvedPath[len(y.ResolvedPath)-2:]
|
|
||||||
log.Printf("Partition %s is avaiable", partition)
|
|
||||||
return partition
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user