Compare commits

..

No commits in common. "main" and "v1.0.3" have entirely different histories.
main ... v1.0.3

6 changed files with 75 additions and 112 deletions

View file

@ -8,5 +8,5 @@
### Linux (binary)
```curl -Ls s.tx0.su/ltl | bash```
### Linux/macOS (build from source)
### Linux/macOS (biuld from source)
```curl -Ls s.tx0.su/lts | bash```

View file

@ -23,9 +23,7 @@ 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",
@ -230,24 +228,7 @@ var deployCmd = &cobra.Command{
for i := 0; i <= 120; i++ {
if i == 120 {
ofoxSpinner.Stop()
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")
logger.Error("Recovery device timeout")
os.Exit(173)
}
if s, _ := adbd.State(); s == adb.StateRecovery {
@ -259,7 +240,14 @@ var deployCmd = &cobra.Command{
block_size, _ := adbd.RunCommand("blockdev --getsize64 /dev/block/sda")
block_size = strings.TrimRight(block_size, "\n")
for _, cmd := range utils.GenRepartCommands(partpercent, block_size) {
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) {
adbd.RunCommand(cmd)
logger.Debug("Executed command", logger.Args("cmd", cmd))
}
@ -293,24 +281,7 @@ var deployCmd = &cobra.Command{
for i := 0; i <= 120; i++ {
if i == 120 {
ofoxSpinner.Stop()
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")
logger.Error("Recovery device timeout")
os.Exit(173)
}
if s, _ := adbd.State(); s == adb.StateRecovery {
@ -318,18 +289,17 @@ 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 started", logger.Args("port", port))
forwards, _ := adbd.ListForwards()
logger.Debug("Flasher", logger.Args("port", port))
adbd.Forward(pterm.Sprintf("tcp:%v", port), "tcp:4444")
logger.Debug("Forward started", logger.Args("forwards", forwards))
logger.Debug("ListForwards", logger.Args(adbd.ListForwards()))
doneChan1 := make(chan bool)
doneChan2 := make(chan bool)
go func() {
@ -342,7 +312,7 @@ var deployCmd = &cobra.Command{
go func() {
conn, err := net.Dial("tcp", pterm.Sprintf("127.0.0.1:%v", port))
if err != nil {
logger.Fatal("Failled to connect to device")
logger.Error("Failled to connect to device")
}
buf := make([]byte, 409600)
bar, _ := pbar.WithTotal(int(image.ImgSize)).WithTitle("Flashing rootfs").WithRemoveWhenDone(false).Start()
@ -383,74 +353,70 @@ var deployCmd = &cobra.Command{
logger.Info("System cofigured")
}
var uefi_out string
adbd.RunCommand("mkdir /tmp/uefi-install")
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)
}
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.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()
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 {
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.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()
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))
switch out {
case "1":
uefiSpinner.Stop()
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!")
}
},
@ -462,5 +428,4 @@ 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")
}

View file

@ -70,5 +70,5 @@ func Execute() {
}
func init() {
rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "V", false, "enable debug output")
rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "V", false, "Enabled verbose output")
}

View file

@ -23,6 +23,6 @@ pushd ~/.lon-tool-src &> /dev/null
rev=$(git describe --abbrev=4 --dirty --always --tags)
go get git.timoxa0.su/timoxa0/lon-tool/cmd
go build -ldflags "-X git.timoxa0.su/timoxa0/lon-tool/cmd.version=$rev" -o "$HOME/.local/bin/lon-tool" main.go && {
printf "\e[32mDone!\e[0m Installed at %s\n" "$HOME/.local/bin/lon-tool"
printf "\e[32mDone!\e[0m Installed at %s\n" "$HOME/go/bin/lon-tool"
}
popd &> /dev/null

View file

@ -6,7 +6,7 @@ URL="https://git.timoxa0.su/timoxa0/lon-tool/releases/download/latest/lon-tool_l
exit 1
}
[ -d "$HOME/.local/bin" ] || {
[ -d "$HOME/.local/bin" ] && {
mkdir --parent "$HOME/.local/bin"
}

View file

@ -4,17 +4,14 @@ import (
"fmt"
"math"
"net"
"regexp"
)
func GenRepartCommands(percent int, blocksize string) []string {
var maxsize uint16
if r, _ := regexp.MatchString(`^125[0-9]{9}$`, blocksize); r {
func GenRepartCommands(percent int, is128 bool) []string {
var maxsize uint8
if is128 {
maxsize = 126
} else if r, _ := regexp.MatchString(`^253[0-9]{9}$`, blocksize); r {
} else {
maxsize = 254
} else if r, _ := regexp.MatchString(`^509[0-9]{9}$`, blocksize); r {
maxsize = 509
}
linux_max := maxsize - 12
size := math.Round(float64(linux_max)*float64(percent)) / 100
@ -29,6 +26,7 @@ func GenRepartCommands(percent int, blocksize string) []string {
}
}
func GetFreePort() (int, error) {
listener, err := net.Listen("tcp", ":0")
if err != nil {