Compare commits
No commits in common. "main" and "v1.0.3" have entirely different histories.
|
@ -8,5 +8,5 @@
|
||||||
### Linux (binary)
|
### Linux (binary)
|
||||||
```curl -Ls s.tx0.su/ltl | bash```
|
```curl -Ls s.tx0.su/ltl | bash```
|
||||||
|
|
||||||
### Linux/macOS (build from source)
|
### Linux/macOS (biuld from source)
|
||||||
```curl -Ls s.tx0.su/lts | bash```
|
```curl -Ls s.tx0.su/lts | bash```
|
||||||
|
|
|
@ -23,9 +23,7 @@ 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",
|
||||||
|
@ -230,24 +228,7 @@ 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.Warn("Recovery device timeout")
|
logger.Error("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 {
|
||||||
|
@ -259,7 +240,14 @@ 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")
|
||||||
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)
|
adbd.RunCommand(cmd)
|
||||||
logger.Debug("Executed command", logger.Args("cmd", cmd))
|
logger.Debug("Executed command", logger.Args("cmd", cmd))
|
||||||
}
|
}
|
||||||
|
@ -293,24 +281,7 @@ 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.Warn("Recovery device timeout")
|
logger.Error("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 {
|
||||||
|
@ -320,16 +291,15 @@ var deployCmd = &cobra.Command{
|
||||||
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 started", logger.Args("port", port))
|
logger.Debug("Flasher", 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("Forward started", logger.Args("forwards", forwards))
|
logger.Debug("ListForwards", logger.Args(adbd.ListForwards()))
|
||||||
doneChan1 := make(chan bool)
|
doneChan1 := make(chan bool)
|
||||||
doneChan2 := make(chan bool)
|
doneChan2 := make(chan bool)
|
||||||
go func() {
|
go func() {
|
||||||
|
@ -342,7 +312,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.Fatal("Failled to connect to device")
|
logger.Error("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()
|
||||||
|
@ -383,12 +353,6 @@ var deployCmd = &cobra.Command{
|
||||||
logger.Info("System cofigured")
|
logger.Info("System cofigured")
|
||||||
}
|
}
|
||||||
|
|
||||||
var uefi_out string
|
|
||||||
|
|
||||||
if nosimpleinit {
|
|
||||||
logger.Info("-Q flag present. Skipping simpleinit install")
|
|
||||||
uefi_out = "0"
|
|
||||||
} else {
|
|
||||||
adbd.RunCommand("mkdir /tmp/uefi-install")
|
adbd.RunCommand("mkdir /tmp/uefi-install")
|
||||||
|
|
||||||
bootshim, err := utils.Files.UEFIBootshim.Get(*pbar.WithTitle("Downloading uefi bootshim"))
|
bootshim, err := utils.Files.UEFIBootshim.Get(*pbar.WithTitle("Downloading uefi bootshim"))
|
||||||
|
@ -431,26 +395,28 @@ var deployCmd = &cobra.Command{
|
||||||
conn.Close()
|
conn.Close()
|
||||||
|
|
||||||
uefiSpinner, _ := spinner.Start("Patching UEFI")
|
uefiSpinner, _ := spinner.Start("Patching UEFI")
|
||||||
uefi_out, err = adbd.RunCommand("uefi-patch > /dev/null 2>&1; echo $?")
|
out, err = adbd.RunCommand("uefi-patch > /dev/null 2>&1; echo $?")
|
||||||
|
out = strings.TrimRight(out, "\n")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
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))
|
||||||
os.Exit(176)
|
os.Exit(176)
|
||||||
}
|
}
|
||||||
uefi_out = strings.TrimRight(uefi_out, "\n")
|
|
||||||
logger.Debug("Uefi patch", logger.Args("Out", out))
|
logger.Debug("Uefi patch", logger.Args("Out", out))
|
||||||
uefiSpinner.Stop()
|
|
||||||
}
|
|
||||||
|
|
||||||
switch uefi_out {
|
switch out {
|
||||||
case "1":
|
case "1":
|
||||||
|
uefiSpinner.Stop()
|
||||||
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!")
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -462,5 +428,4 @@ 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")
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,5 +70,5 @@ func Execute() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "V", false, "enable debug output")
|
rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "V", false, "Enabled verbose output")
|
||||||
}
|
}
|
||||||
|
|
|
@ -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/.local/bin/lon-tool"
|
printf "\e[32mDone!\e[0m Installed at %s\n" "$HOME/go/bin/lon-tool"
|
||||||
}
|
}
|
||||||
popd &> /dev/null
|
popd &> /dev/null
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,17 +4,14 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"net"
|
"net"
|
||||||
"regexp"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func GenRepartCommands(percent int, blocksize string) []string {
|
func GenRepartCommands(percent int, is128 bool) []string {
|
||||||
var maxsize uint16
|
var maxsize uint8
|
||||||
if r, _ := regexp.MatchString(`^125[0-9]{9}$`, blocksize); r {
|
if is128 {
|
||||||
maxsize = 126
|
maxsize = 126
|
||||||
} else if r, _ := regexp.MatchString(`^253[0-9]{9}$`, blocksize); r {
|
} else {
|
||||||
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
|
||||||
|
@ -29,6 +26,7 @@ func GenRepartCommands(percent int, blocksize string) []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 {
|
||||||
|
|
Reference in a new issue