Skip to content

Commit 9c9bd87

Browse files
committed
rework programmer command
1 parent 906b112 commit 9c9bd87

File tree

5 files changed

+63
-76
lines changed

5 files changed

+63
-76
lines changed

conn.go

+17-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/gin-gonic/gin"
88
"github.com/googollee/go-socket.io"
99
"net/http"
10+
"strconv"
1011
)
1112

1213
type connection struct {
@@ -46,9 +47,24 @@ func uploadHandler(c *gin.Context) {
4647
board := c.PostForm("board")
4748
if board == "" {
4849
c.String(http.StatusBadRequest, "board is required")
50+
log.Error("board is required")
4951
return
5052
}
5153
board_rewrite := c.PostForm("board_rewrite")
54+
55+
var authdata basicAuthData
56+
57+
authdata.UserName = c.PostForm("auth_user")
58+
authdata.Password = c.PostForm("auth_pass")
59+
commandline := c.PostForm("commandline")
60+
networkPort, _ := strconv.ParseBool(c.PostForm("network"))
61+
62+
if networkPort == false && commandline == "" {
63+
c.String(http.StatusBadRequest, "commandline is required for local board")
64+
log.Error("commandline is required for local board")
65+
return
66+
}
67+
5268
sketch, header, err := c.Request.FormFile("sketch_hex")
5369
if err != nil {
5470
c.String(http.StatusBadRequest, err.Error())
@@ -60,7 +76,7 @@ func uploadHandler(c *gin.Context) {
6076
c.String(http.StatusBadRequest, err.Error())
6177
}
6278

63-
go spProgramRW(port, board, board_rewrite, path)
79+
go spProgramRW(port, board, board_rewrite, path, commandline, networkPort, authdata)
6480
}
6581
}
6682

download.go

+15
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"net/http"
1010
"os"
1111
"path/filepath"
12+
"runtime"
1213
"strings"
1314
)
1415

@@ -83,3 +84,17 @@ func downloadFromUrl(url string) (filename string, err error) {
8384

8485
return fileName, nil
8586
}
87+
88+
func spDownloadTool(name string, url string) {
89+
fileName, err := downloadFromUrl(url)
90+
if err != nil {
91+
log.Error("Could not download flashing tools!")
92+
return
93+
}
94+
Unzip(fileName, tempToolsPath)
95+
extension := ""
96+
if runtime.GOOS == "windows" {
97+
extension = ".exe"
98+
}
99+
globalToolsMap[name] = tempToolsPath + "/bin/" + name + extension
100+
}

hub.go

+5-19
Original file line numberDiff line numberDiff line change
@@ -166,25 +166,6 @@ func checkCmd(m []byte) {
166166
go spErr("You did not specify a port to close")
167167
}
168168

169-
} else if strings.HasPrefix(sl, "programfromurl") {
170-
171-
args := strings.Split(s, " ")
172-
if len(args) == 4 {
173-
go spProgramFromUrl(args[1], args[2], args[3])
174-
} else {
175-
go spErr("You did not specify a port, a board to program and/or a URL")
176-
}
177-
178-
} else if strings.HasPrefix(sl, "program") {
179-
180-
args := strings.Split(s, " ")
181-
if len(args) > 3 {
182-
var slice []string = args[3:len(args)]
183-
go spProgram(args[1], args[2], strings.Join(slice, " "))
184-
} else {
185-
go spErr("You did not specify a port, a board to program and/or a filename")
186-
}
187-
188169
} else if strings.HasPrefix(sl, "sendjson") {
189170
// will catch sendjson
190171

@@ -199,6 +180,11 @@ func checkCmd(m []byte) {
199180
} else if strings.HasPrefix(sl, "list") {
200181
go spList(false)
201182
go spList(true)
183+
} else if strings.HasPrefix(sl, "downloadtool") {
184+
args := strings.Split(s, " ")
185+
if len(args) > 2 {
186+
go spDownloadTool(args[1], args[2])
187+
}
202188
} else if strings.HasPrefix(sl, "bufferalgorithm") {
203189
go spBufferAlgorithms()
204190
} else if strings.HasPrefix(sl, "log") {

main.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/kardianos/osext"
1212
"github.com/vharitonsky/iniflags"
1313
"go/build"
14+
"io/ioutil"
1415
"os"
1516
"path/filepath"
1617
"runtime/debug"
@@ -54,8 +55,10 @@ var (
5455
// hostname. allow user to override, otherwise we look it up
5556
hostname = flag.String("hostname", "unknown-hostname", "Override the hostname we get from the OS")
5657

57-
updateUrl = flag.String("updateUrl", "", "")
58-
appName = flag.String("appName", "", "")
58+
updateUrl = flag.String("updateUrl", "", "")
59+
appName = flag.String("appName", "", "")
60+
globalToolsMap = make(map[string]string)
61+
tempToolsPath, _ = ioutil.TempDir("", "arduino-create-agent-tools")
5962
)
6063

6164
type NullWriter int

programmer.go

+21-54
Original file line numberDiff line numberDiff line change
@@ -8,44 +8,30 @@ import (
88
log "github.com/Sirupsen/logrus"
99
"github.com/facchinm/go-serial"
1010
"github.com/kardianos/osext"
11+
"github.com/mattn/go-shellwords"
1112
"io"
1213
"mime/multipart"
1314
"net/http"
1415
"os"
1516
"os/exec"
1617
"path/filepath"
17-
"strconv"
1818
"strings"
1919
"time"
2020
)
2121

2222
var compiling = false
2323

24-
// Download the file from URL first, store in tmp folder, then pass to spProgram
25-
func spProgramFromUrl(portname string, boardname string, url string) {
26-
mapB, _ := json.Marshal(map[string]string{"ProgrammerStatus": "DownloadStart", "Url": url})
27-
h.broadcastSys <- mapB
28-
filename, err := downloadFromUrl(url)
29-
mapB, _ = json.Marshal(map[string]string{"ProgrammerStatus": "DownloadDone", "Filename": filename, "Url": url})
30-
h.broadcastSys <- mapB
31-
32-
if err != nil {
33-
spErr(err.Error())
34-
return
35-
} else {
36-
spProgram(portname, boardname, filename)
37-
}
38-
39-
// delete file
40-
41-
}
42-
4324
func colonToUnderscore(input string) string {
4425
output := strings.Replace(input, ":", "_", -1)
4526
return output
4627
}
4728

48-
func spProgramNetwork(portname string, boardname string, filePath string) error {
29+
type basicAuthData struct {
30+
UserName string
31+
Password string
32+
}
33+
34+
func spProgramNetwork(portname string, boardname string, filePath string, authdata basicAuthData) error {
4935

5036
log.Println("Starting network upload")
5137
log.Println("Board Name: " + boardname)
@@ -91,7 +77,9 @@ func spProgramNetwork(portname string, boardname string, filePath string) error
9177
}
9278
// Don't forget to set the content type, this will contain the boundary.
9379
req.Header.Set("Content-Type", w.FormDataContentType())
94-
req.SetBasicAuth("root", "arduino")
80+
if authdata.UserName != "" {
81+
req.SetBasicAuth(authdata.UserName, authdata.Password)
82+
}
9583

9684
//h.broadcastSys <- []byte("Start flashing with command " + cmdString)
9785
log.Printf("Network flashing on " + portname)
@@ -128,61 +116,40 @@ func spProgramNetwork(portname string, boardname string, filePath string) error
128116
return err
129117
}
130118

131-
func spProgramLocal(portname string, boardname string, filePath string) {
132-
isFound, flasher, mycmd := assembleCompilerCommand(boardname, portname, filePath)
133-
mapD := map[string]string{"ProgrammerStatus": "CommandReady", "IsFound": strconv.FormatBool(isFound), "Flasher": flasher, "Cmd": strings.Join(mycmd, " ")}
134-
mapB, _ := json.Marshal(mapD)
135-
h.broadcastSys <- mapB
119+
func spProgramLocal(portname string, boardname string, filePath string, commandline string) {
136120

137-
if isFound {
138-
spHandlerProgram(flasher, mycmd)
139-
} else {
140-
spErr("Could not find the board " + boardname + " that you were trying to program.")
141-
mapD := map[string]string{"ProgrammerStatus": "Failed", "IsFound": strconv.FormatBool(isFound), "Flasher": flasher, "Cmd": strings.Join(mycmd, " "), "Err": "Could not find the board " + boardname + " that you were trying to program."}
142-
mapB, _ := json.Marshal(mapD)
143-
h.broadcastSys <- mapB
144-
return
145-
}
121+
z, _ := shellwords.Parse(commandline)
122+
spHandlerProgram(z[0], z[1:])
146123
}
147124

148-
func spProgram(portname string, boardname string, filePath string) {
125+
func spProgram(portname string, boardname string, filePath string, commandline string, networkPort bool, authdata basicAuthData) {
149126

150-
spProgramRW(portname, boardname, "", filePath)
127+
spProgramRW(portname, boardname, "", filePath, commandline, networkPort, authdata)
151128
}
152129

153-
func spProgramRW(portname string, boardname string, boardname_rewrite string, filePath string) {
130+
func spProgramRW(portname string, boardname string, boardname_rewrite string, filePath string, commandline string, networkPort bool, authdata basicAuthData) {
154131
compiling = true
155132

156133
defer func() {
157134
time.Sleep(1500 * time.Millisecond)
158135
compiling = false
159136
}()
160137

161-
// check if the port is physical or network
162-
var networkPort bool
163-
myport, exist := findPortByNameRerun(portname, false)
164-
if !exist {
165-
// it could be a network port that has not been found at the second lap
166-
networkPort = true
167-
} else {
168-
networkPort = myport.NetworkPort
169-
}
170-
171138
var err error
172139

173140
if networkPort {
174141
if boardname_rewrite == "" {
175-
err = spProgramNetwork(portname, boardname_rewrite, filePath)
142+
err = spProgramNetwork(portname, boardname_rewrite, filePath, authdata)
176143
} else {
177-
err = spProgramNetwork(portname, boardname, filePath)
144+
err = spProgramNetwork(portname, boardname, filePath, authdata)
178145
}
179146
if err != nil {
180147
mapD := map[string]string{"ProgrammerStatus": "Error " + err.Error(), "Msg": "Could not program the board", "Output": "", "Err": err.Error()}
181148
mapB, _ := json.Marshal(mapD)
182149
h.broadcastSys <- mapB
183150
}
184151
} else {
185-
spProgramLocal(portname, boardname, filePath)
152+
spProgramLocal(portname, boardname, filePath, commandline)
186153
}
187154
}
188155

@@ -195,8 +162,8 @@ func spHandlerProgram(flasher string, cmdString []string) {
195162
// cmdString = append([]string{flasher}, cmdString...)
196163
// oscmd = exec.Command(sh, cmdString...)
197164
// } else {
198-
oscmd = exec.Command(flasher, cmdString...)
199-
// }
165+
166+
oscmd = exec.Command(globalToolsMap[flasher], cmdString...)
200167

201168
// Stdout buffer
202169
//var cmdOutput []byte

0 commit comments

Comments
 (0)