|
|
|
@ -23,7 +23,9 @@ var username string
|
|
|
|
|
var password string
|
|
|
|
|
var serail string
|
|
|
|
|
var partsize string
|
|
|
|
|
var nosimpleinit bool
|
|
|
|
|
var partpercent int
|
|
|
|
|
|
|
|
|
|
var deployCmd = &cobra.Command{
|
|
|
|
|
Use: "deploy <rootfs.lni>",
|
|
|
|
|
Short: "Deploy system to device",
|
|
|
|
@ -228,7 +230,24 @@ var deployCmd = &cobra.Command{
|
|
|
|
|
for i := 0; i <= 120; i++ {
|
|
|
|
|
if i == 120 {
|
|
|
|
|
ofoxSpinner.Stop()
|
|
|
|
|
logger.Error("Recovery device timeout")
|
|
|
|
|
logger.Warn("Recovery device timeout")
|
|
|
|
|
logger.Info("Trying to restart adb server")
|
|
|
|
|
err := adbc.KillServer();
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to kill server")
|
|
|
|
|
os.Exit(173);
|
|
|
|
|
}
|
|
|
|
|
err = adbc.StartServer();
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to start server")
|
|
|
|
|
os.Exit(173);
|
|
|
|
|
}
|
|
|
|
|
adbd = adbc.Device(adb.DeviceWithSerial(serail));
|
|
|
|
|
if s, _ := adbd.State(); s == adb.StateRecovery {
|
|
|
|
|
logger.Info("Device found")
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
logger.Error("Device not found")
|
|
|
|
|
os.Exit(173)
|
|
|
|
|
}
|
|
|
|
|
if s, _ := adbd.State(); s == adb.StateRecovery {
|
|
|
|
@ -240,14 +259,7 @@ var deployCmd = &cobra.Command{
|
|
|
|
|
|
|
|
|
|
block_size, _ := adbd.RunCommand("blockdev --getsize64 /dev/block/sda")
|
|
|
|
|
block_size = strings.TrimRight(block_size, "\n")
|
|
|
|
|
is128 := false
|
|
|
|
|
if r, _ := regexp.MatchString(`^125[0-9]{9}$`, block_size); r {
|
|
|
|
|
is128 = true
|
|
|
|
|
} else if r, _ := regexp.MatchString(`^253[0-9]{9}$`, block_size); r {
|
|
|
|
|
is128 = false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, cmd := range utils.GenRepartCommands(partpercent, is128) {
|
|
|
|
|
for _, cmd := range utils.GenRepartCommands(partpercent, block_size) {
|
|
|
|
|
adbd.RunCommand(cmd)
|
|
|
|
|
logger.Debug("Executed command", logger.Args("cmd", cmd))
|
|
|
|
|
}
|
|
|
|
@ -281,7 +293,24 @@ var deployCmd = &cobra.Command{
|
|
|
|
|
for i := 0; i <= 120; i++ {
|
|
|
|
|
if i == 120 {
|
|
|
|
|
ofoxSpinner.Stop()
|
|
|
|
|
logger.Error("Recovery device timeout")
|
|
|
|
|
logger.Warn("Recovery device timeout")
|
|
|
|
|
logger.Info("Trying to restart adb server")
|
|
|
|
|
err := adbc.KillServer();
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to kill server")
|
|
|
|
|
os.Exit(173);
|
|
|
|
|
}
|
|
|
|
|
err = adbc.StartServer();
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to start server")
|
|
|
|
|
os.Exit(173);
|
|
|
|
|
}
|
|
|
|
|
adbd = adbc.Device(adb.DeviceWithSerial(serail));
|
|
|
|
|
if s, _ := adbd.State(); s == adb.StateRecovery {
|
|
|
|
|
logger.Info("Device found")
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
logger.Error("Device not found")
|
|
|
|
|
os.Exit(173)
|
|
|
|
|
}
|
|
|
|
|
if s, _ := adbd.State(); s == adb.StateRecovery {
|
|
|
|
@ -289,17 +318,18 @@ var deployCmd = &cobra.Command{
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
port, err := utils.GetFreePort()
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failled to find free tcp port")
|
|
|
|
|
os.Exit(181)
|
|
|
|
|
}
|
|
|
|
|
logger.Debug("Flasher", logger.Args("port", port))
|
|
|
|
|
|
|
|
|
|
logger.Debug("Flasher started", logger.Args("port", port))
|
|
|
|
|
forwards, _ := adbd.ListForwards()
|
|
|
|
|
adbd.Forward(pterm.Sprintf("tcp:%v", port), "tcp:4444")
|
|
|
|
|
logger.Debug("ListForwards", logger.Args(adbd.ListForwards()))
|
|
|
|
|
logger.Debug("Forward started", logger.Args("forwards", forwards))
|
|
|
|
|
doneChan1 := make(chan bool)
|
|
|
|
|
doneChan2 := make(chan bool)
|
|
|
|
|
go func() {
|
|
|
|
@ -312,7 +342,7 @@ var deployCmd = &cobra.Command{
|
|
|
|
|
go func() {
|
|
|
|
|
conn, err := net.Dial("tcp", pterm.Sprintf("127.0.0.1:%v", port))
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failled to connect to device")
|
|
|
|
|
logger.Fatal("Failled to connect to device")
|
|
|
|
|
}
|
|
|
|
|
buf := make([]byte, 409600)
|
|
|
|
|
bar, _ := pbar.WithTotal(int(image.ImgSize)).WithTitle("Flashing rootfs").WithRemoveWhenDone(false).Start()
|
|
|
|
@ -353,70 +383,74 @@ var deployCmd = &cobra.Command{
|
|
|
|
|
logger.Info("System cofigured")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
adbd.RunCommand("mkdir /tmp/uefi-install")
|
|
|
|
|
var uefi_out string
|
|
|
|
|
|
|
|
|
|
bootshim, err := utils.Files.UEFIBootshim.Get(*pbar.WithTitle("Downloading uefi bootshim"))
|
|
|
|
|
if err != nil {
|
|
|
|
|
if bootshim != nil {
|
|
|
|
|
logger.Warn("Unable to verify uefi bootship image")
|
|
|
|
|
} else {
|
|
|
|
|
logger.Error("Unable to download uefi bootshim image")
|
|
|
|
|
os.Exit(179)
|
|
|
|
|
if nosimpleinit {
|
|
|
|
|
logger.Info("-Q flag present. Skipping simpleinit install")
|
|
|
|
|
uefi_out = "0"
|
|
|
|
|
} else {
|
|
|
|
|
adbd.RunCommand("mkdir /tmp/uefi-install")
|
|
|
|
|
|
|
|
|
|
bootshim, err := utils.Files.UEFIBootshim.Get(*pbar.WithTitle("Downloading uefi bootshim"))
|
|
|
|
|
if err != nil {
|
|
|
|
|
if bootshim != nil {
|
|
|
|
|
logger.Warn("Unable to verify uefi bootship image")
|
|
|
|
|
} else {
|
|
|
|
|
logger.Error("Unable to download uefi bootshim image")
|
|
|
|
|
os.Exit(179)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
conn, err := adbd.OpenWrite(pterm.Sprintf("/tmp/uefi-install/%s", utils.Files.UEFIBootshim.Name), fs.FileMode(0777), adb.MtimeOfClose)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to send uefi bootshim", logger.Args("Error", err))
|
|
|
|
|
}
|
|
|
|
|
_, err = conn.Write(bootshim)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to send uefi bootshim", logger.Args("Error", err))
|
|
|
|
|
}
|
|
|
|
|
conn.Close()
|
|
|
|
|
|
|
|
|
|
payload, err := utils.Files.UEFIPayload.Get(*pbar.WithTitle("Downloading uefi payload"))
|
|
|
|
|
if err != nil {
|
|
|
|
|
if payload != nil {
|
|
|
|
|
logger.Warn("Unable to verify uefi payload image")
|
|
|
|
|
} else {
|
|
|
|
|
logger.Error("Unable to download uefi payload image")
|
|
|
|
|
os.Exit(179)
|
|
|
|
|
conn, err := adbd.OpenWrite(pterm.Sprintf("/tmp/uefi-install/%s", utils.Files.UEFIBootshim.Name), fs.FileMode(0777), adb.MtimeOfClose)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to send uefi bootshim", logger.Args("Error", err))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
conn, err = adbd.OpenWrite(pterm.Sprintf("/tmp/uefi-install/%s", utils.Files.UEFIPayload.Name), fs.FileMode(0777), adb.MtimeOfClose)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to send uefi payload", logger.Args("Error", err))
|
|
|
|
|
}
|
|
|
|
|
_, err = conn.Write(payload)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to send uefi payload", logger.Args("Error", err))
|
|
|
|
|
}
|
|
|
|
|
conn.Close()
|
|
|
|
|
_, err = conn.Write(bootshim)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to send uefi bootshim", logger.Args("Error", err))
|
|
|
|
|
}
|
|
|
|
|
conn.Close()
|
|
|
|
|
|
|
|
|
|
uefiSpinner, _ := spinner.Start("Patching UEFI")
|
|
|
|
|
out, err = adbd.RunCommand("uefi-patch > /dev/null 2>&1; echo $?")
|
|
|
|
|
out = strings.TrimRight(out, "\n")
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to install uefi. Reflash stock rom and try again", logger.Args("Error", err))
|
|
|
|
|
os.Exit(176)
|
|
|
|
|
}
|
|
|
|
|
logger.Debug("Uefi patch", logger.Args("Out", out))
|
|
|
|
|
payload, err := utils.Files.UEFIPayload.Get(*pbar.WithTitle("Downloading uefi payload"))
|
|
|
|
|
if err != nil {
|
|
|
|
|
if payload != nil {
|
|
|
|
|
logger.Warn("Unable to verify uefi payload image")
|
|
|
|
|
} else {
|
|
|
|
|
logger.Error("Unable to download uefi payload image")
|
|
|
|
|
os.Exit(179)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
conn, err = adbd.OpenWrite(pterm.Sprintf("/tmp/uefi-install/%s", utils.Files.UEFIPayload.Name), fs.FileMode(0777), adb.MtimeOfClose)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to send uefi payload", logger.Args("Error", err))
|
|
|
|
|
}
|
|
|
|
|
_, err = conn.Write(payload)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to send uefi payload", logger.Args("Error", err))
|
|
|
|
|
}
|
|
|
|
|
conn.Close()
|
|
|
|
|
|
|
|
|
|
switch out {
|
|
|
|
|
case "1":
|
|
|
|
|
uefiSpinner, _ := spinner.Start("Patching UEFI")
|
|
|
|
|
uefi_out, err = adbd.RunCommand("uefi-patch > /dev/null 2>&1; echo $?")
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("Failed to install uefi. Reflash stock rom and try again", logger.Args("Error", err))
|
|
|
|
|
os.Exit(176)
|
|
|
|
|
}
|
|
|
|
|
uefi_out = strings.TrimRight(uefi_out, "\n")
|
|
|
|
|
logger.Debug("Uefi patch", logger.Args("Out", out))
|
|
|
|
|
uefiSpinner.Stop()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch uefi_out {
|
|
|
|
|
case "1":
|
|
|
|
|
logger.Error("Failed to install uefi. Reflash stock rom and try again", logger.Args("Error", err))
|
|
|
|
|
adbd.RunCommand("reboot bootloader")
|
|
|
|
|
os.Exit(176)
|
|
|
|
|
case "2":
|
|
|
|
|
|
|
|
|
|
adbd.RunCommand("reboot")
|
|
|
|
|
uefiSpinner.Stop()
|
|
|
|
|
logger.Info("Bootimage already patched")
|
|
|
|
|
case "0":
|
|
|
|
|
adbd.RunCommand("reboot")
|
|
|
|
|
uefiSpinner.Stop()
|
|
|
|
|
logger.Info("Installation done!")
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
@ -428,4 +462,5 @@ func init() {
|
|
|
|
|
deployCmd.Flags().StringVarP(&password, "password", "p", "", "User password")
|
|
|
|
|
deployCmd.Flags().StringVarP(&serail, "serial", "s", "autodetect", "Device serial")
|
|
|
|
|
deployCmd.Flags().StringVarP(&partsize, "part-size", "S", "", "Linux partition size in percents")
|
|
|
|
|
deployCmd.Flags().BoolVarP(&nosimpleinit, "no-simple-init", "Q", false, "Disable simple init install")
|
|
|
|
|
}
|
|
|
|
|