Skip to content

Commit 6a8c70c

Browse files
committed
add api for running adb command
1 parent 5271704 commit 6a8c70c

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

packages/cli/internal/device/manager.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package device
22

33
import (
4+
"bytes"
45
"fmt"
56
"log"
67
"os/exec"
@@ -170,6 +171,37 @@ func (m *Manager) getDeviceSerialnoAndAndroidId(deviceID string) (serialno strin
170171
return
171172
}
172173

174+
type AdbCommandResult struct {
175+
Stdout string `json:"stdout"`
176+
Stderr string `json:"stderr"`
177+
ExitCode int `json:"exitCode"`
178+
}
179+
180+
func (m *Manager) ExecAdbCommand(deviceID, command string) (*AdbCommandResult, error) {
181+
cmd := exec.Command("sh", "-c", strings.Join([]string{m.adbPath, "-s", deviceID, command}, " "))
182+
183+
var stdoutBuf, stderrBuf bytes.Buffer
184+
cmd.Stdout = &stdoutBuf
185+
cmd.Stderr = &stderrBuf
186+
187+
if err := cmd.Run(); err != nil {
188+
if exitError, ok := err.(*exec.ExitError); ok {
189+
return &AdbCommandResult{
190+
Stdout: stdoutBuf.String(),
191+
Stderr: stderrBuf.String(),
192+
ExitCode: exitError.ExitCode(),
193+
}, nil
194+
}
195+
return nil, errors.Wrapf(err, "failed to exec adb command on device %s", deviceID)
196+
}
197+
198+
return &AdbCommandResult{
199+
Stdout: stdoutBuf.String(),
200+
Stderr: stderrBuf.String(),
201+
ExitCode: 0,
202+
}, nil
203+
}
204+
173205
// GetDeviceSerialnoAndAndroidId is a standalone function for backward compatibility
174206
func GetDeviceSerialnoAndAndroidId(deviceID string) (serialno string, androidID string, err error) {
175207
manager := NewManager()

packages/cli/internal/server/handlers/devices.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,49 @@ func (h *DeviceHandlers) HandleWebSocket(w http.ResponseWriter, r *http.Request)
603603
}
604604
}
605605

606+
func (h *DeviceHandlers) HandleDeviceAdb(w http.ResponseWriter, req *http.Request) {
607+
path := strings.TrimPrefix(req.URL.Path, "/api/devices/")
608+
parts := strings.Split(path, "/")
609+
deviceSerial := parts[0]
610+
611+
if strings.Contains(req.Header.Get("via"), "gbox-device-ap") {
612+
deviceSerial = h.serverService.GetAdbSerialByGboxDeviceId(deviceSerial)
613+
}
614+
615+
if deviceSerial == "" {
616+
http.Error(w, "Device serial required", http.StatusBadRequest)
617+
return
618+
}
619+
620+
if !isValidDeviceSerial(deviceSerial) {
621+
http.Error(w, "Invalid device serial", http.StatusBadRequest)
622+
return
623+
}
624+
625+
log.Printf("[HandleDeviceAdb] Processing adb request for device: %s", deviceSerial)
626+
627+
decoder := json.NewDecoder(req.Body)
628+
var reqBody struct {
629+
Command string `json:"command"`
630+
}
631+
if err := decoder.Decode(&reqBody); err != nil {
632+
http.Error(w, errors.Wrap(err, "failed to parse request body").Error(), http.StatusBadRequest)
633+
return
634+
}
635+
636+
manager := device.NewManager()
637+
result, err := manager.ExecAdbCommand(deviceSerial, reqBody.Command)
638+
if err != nil {
639+
http.Error(w, err.Error(), http.StatusInternalServerError)
640+
return
641+
}
642+
643+
RespondJSON(w, http.StatusOK, map[string]interface{}{
644+
"success": true,
645+
"data": result,
646+
})
647+
}
648+
606649
// Private helper methods
607650

608651
func (h *DeviceHandlers) handleDeviceConnect(w http.ResponseWriter, r *http.Request, deviceID string) {

packages/cli/internal/server/router/api.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ func (r *APIRouter) RegisterRoutes(mux *http.ServeMux, server interface{}) {
4343
mux.HandleFunc("/api/devices/{serial}/audio", deviceHandlers.HandleDeviceAudio)
4444
mux.HandleFunc("/api/devices/{serial}/stream", deviceHandlers.HandleDeviceStream)
4545
mux.HandleFunc("/api/devices/{serial}/control", deviceHandlers.HandleDeviceControl)
46+
mux.HandleFunc("/api/devices/{serial}/adb", deviceHandlers.HandleDeviceAdb)
4647

4748
// Box management endpoints (proxy to remote GBOX API)
4849
mux.HandleFunc("/api/boxes", boxHandlers.HandleBoxList)

0 commit comments

Comments
 (0)