mirror of https://github.com/mvdan/fdroidcl.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
2.5 KiB
137 lines
2.5 KiB
/* Copyright (c) 2015, Daniel Martí <mvdan@mvdan.cc> */ |
|
/* See LICENSE for licensing information */ |
|
|
|
package adb |
|
|
|
import ( |
|
"bufio" |
|
"fmt" |
|
"net" |
|
"os/exec" |
|
"regexp" |
|
"strings" |
|
) |
|
|
|
const ( |
|
port = 5037 |
|
) |
|
|
|
func IsServerRunning() bool { |
|
conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", "127.0.0.1", port)) |
|
if err != nil { |
|
return false |
|
} |
|
conn.Close() |
|
return true |
|
} |
|
|
|
func StartServer() error { |
|
cmd := exec.Command("adb", "start-server") |
|
err := cmd.Run() |
|
if err != nil { |
|
return err |
|
} |
|
return nil |
|
} |
|
|
|
type Device struct { |
|
Id string |
|
Usb string |
|
Product string |
|
Model string |
|
Device string |
|
} |
|
|
|
var deviceRegex = regexp.MustCompile(`^([^\s]+)\s+device(.*)$`) |
|
|
|
func Devices() ([]Device, error) { |
|
cmd := exec.Command("adb", "devices", "-l") |
|
stdout, err := cmd.StdoutPipe() |
|
if err != nil { |
|
return nil, err |
|
} |
|
if err := cmd.Start(); err != nil { |
|
return nil, err |
|
} |
|
var devices []Device |
|
scanner := bufio.NewScanner(stdout) |
|
for scanner.Scan() { |
|
line := scanner.Text() |
|
m := deviceRegex.FindStringSubmatch(line) |
|
if m == nil { |
|
continue |
|
} |
|
device := Device{ |
|
Id: m[1], |
|
} |
|
extras := m[2] |
|
for _, extra := range strings.Split(extras, " ") { |
|
sp := strings.SplitN(extra, ":", 2) |
|
if len(sp) < 2 { |
|
continue |
|
} |
|
switch sp[0] { |
|
case "usb": |
|
device.Usb = sp[1] |
|
case "product": |
|
device.Product = sp[1] |
|
case "model": |
|
device.Model = sp[1] |
|
case "device": |
|
device.Device = sp[1] |
|
} |
|
} |
|
devices = append(devices, device) |
|
} |
|
return devices, nil |
|
} |
|
|
|
func (d Device) AdbCmd(args ...string) *exec.Cmd { |
|
cmdArgs := append([]string{"-s", d.Id}, args...) |
|
return exec.Command("adb", cmdArgs...) |
|
} |
|
|
|
func (d Device) AdbShell(args ...string) *exec.Cmd { |
|
shellArgs := append([]string{"shell"}, args...) |
|
return d.AdbCmd(shellArgs...) |
|
} |
|
|
|
func (d Device) Install(path string) error { |
|
cmd := d.AdbCmd("install", path) |
|
if err := cmd.Start(); err != nil { |
|
return err |
|
} |
|
return nil |
|
} |
|
|
|
func (d Device) Uninstall(pkg string) error { |
|
cmd := d.AdbCmd("uninstall", pkg) |
|
if err := cmd.Start(); err != nil { |
|
return err |
|
} |
|
return nil |
|
} |
|
|
|
var packageRegex = regexp.MustCompile(`^package:([^\s]+)`) |
|
|
|
func (d Device) Installed() ([]string, error) { |
|
cmd := d.AdbShell("pm", "list", "packages") |
|
stdout, err := cmd.StdoutPipe() |
|
if err != nil { |
|
return nil, err |
|
} |
|
if err := cmd.Start(); err != nil { |
|
return nil, err |
|
} |
|
var ids []string |
|
scanner := bufio.NewScanner(stdout) |
|
for scanner.Scan() { |
|
line := scanner.Text() |
|
m := packageRegex.FindStringSubmatch(line) |
|
if m == nil { |
|
continue |
|
} |
|
ids = append(ids, m[1]) |
|
} |
|
return ids, nil |
|
}
|
|
|