Compare commits

..

8 commits
v1.0.3 ... main

Author SHA1 Message Date
timoxa0 c7f825858c Update installers/linux.sh 2025-01-22 08:32:28 +00:00
timoxa0 01cab85f6b deploy: try to restart adb server on dev timeout 2024-10-22 15:59:24 +05:00
timoxa0 43ef704a32 Fix message 2024-08-13 08:44:22 +00:00
timoxa0 79a4768ae7 Fix typo 2024-08-08 07:26:30 +00:00
timoxa0 4c3fb48ac7 Make debug messages better 2024-08-08 11:37:48 +05:00
timoxa0 768af6db31 Add support for 512 gb mod 2024-08-08 11:14:54 +05:00
timoxa0 97a5127a59 Add no-simple-init flag 2024-08-08 11:08:26 +05:00
timoxa0 a119d6ac19 change -v flag description 2024-08-08 11:02:41 +05:00
6 changed files with 110 additions and 73 deletions

View file

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

View file

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

View file

@ -23,6 +23,6 @@ pushd ~/.lon-tool-src &> /dev/null
rev=$(git describe --abbrev=4 --dirty --always --tags) rev=$(git describe --abbrev=4 --dirty --always --tags)
go get git.timoxa0.su/timoxa0/lon-tool/cmd 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 && { 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/go/bin/lon-tool" printf "\e[32mDone!\e[0m Installed at %s\n" "$HOME/.local/bin/lon-tool"
} }
popd &> /dev/null 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 exit 1
} }
[ -d "$HOME/.local/bin" ] && { [ -d "$HOME/.local/bin" ] || {
mkdir --parent "$HOME/.local/bin" mkdir --parent "$HOME/.local/bin"
} }

View file

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