From 8db9d2ed4670a06973326ca6548e0d37c8d6867c Mon Sep 17 00:00:00 2001 From: timoxa0 Date: Mon, 17 Jun 2024 23:53:17 +0500 Subject: [PATCH] Make image local package --- cmd/deploy.go | 2 +- cmd/image.go | 2 +- go.mod | 2 - image/Image.go | 166 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 4 deletions(-) create mode 100644 image/Image.go diff --git a/cmd/deploy.go b/cmd/deploy.go index 93f14cf..ecfbd35 100644 --- a/cmd/deploy.go +++ b/cmd/deploy.go @@ -4,6 +4,7 @@ import ( "io" "io/fs" "lon-tool/utils" + "lon-tool/image" "net" "os" "regexp" @@ -15,7 +16,6 @@ import ( "github.com/spf13/cobra" "github.com/timoxa0/goadb/adb" "github.com/timoxa0/gofastboot/fastboot" - "github.com/timoxa0/lon_image/image" ) var username string diff --git a/cmd/image.go b/cmd/image.go index b8a2ea5..8ba263b 100644 --- a/cmd/image.go +++ b/cmd/image.go @@ -3,11 +3,11 @@ package cmd import ( "io" "os" + "lon-tool/image" "github.com/codingsince1985/checksum" "github.com/pterm/pterm" "github.com/spf13/cobra" - "github.com/timoxa0/lon_image/image" ) var imageCmd = &cobra.Command{ diff --git a/go.mod b/go.mod index 800df98..4ae2d87 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,6 @@ require ( github.com/spf13/cobra v1.8.0 github.com/timoxa0/goadb v0.0.0-20240617073314-c303241c8c53 github.com/timoxa0/gofastboot v0.0.0-20240614162313-e0508069b252 - github.com/timoxa0/lon_image v0.0.0-00010101000000-000000000000 ) require ( @@ -33,5 +32,4 @@ require ( replace ( github.com/timoxa0/goadb => /Users/timoxa0/.mounty/DATA/Data/ANDROID/NABU/LINUX/deployer-go/goadb github.com/timoxa0/gofastboot => /Users/timoxa0/.mounty/DATA/Data/ANDROID/NABU/LINUX/deployer-go/gofastboot - github.com/timoxa0/lon_image => /Users/timoxa0/.mounty/DATA/Data/ANDROID/NABU/LINUX/deployer-go/lon-image ) diff --git a/image/Image.go b/image/Image.go new file mode 100644 index 0000000..0f46c67 --- /dev/null +++ b/image/Image.go @@ -0,0 +1,166 @@ +package image + +import ( + "bufio" + "compress/gzip" + "encoding/binary" + "encoding/hex" + "errors" + "fmt" + "io" + "io/fs" + "os" + "path/filepath" + "strings" + + "github.com/codingsince1985/checksum" +) + +type ImageReader struct { + Path string + Stat fs.FileInfo + Name string + Version string + CheckSum string + ImgSize uint64 + Reader *gzip.Reader + HeaderLen uint16 +} + +type ImageWriter struct { + Path string + RawImagePath string + Name string + Version string + CheckSum string + ImgSize uint64 + Writer *gzip.Writer + HeaderLen uint16 + file *os.File +} + +func CreateImage(path string, rawImgPath string, name string, version string) (ImageWriter, func() error, error) { + var image ImageWriter + stat, err := os.Stat(rawImgPath) + if err != nil { + return image, func() error { return nil }, err + } + rawImgPath, _ = filepath.Abs(rawImgPath) + file, err := os.Create(path) + if err != nil { + return image, func() error { return nil }, err + } + path, _ = filepath.Abs(path) + + checkSum, err := checksum.MD5sum(rawImgPath) + if err != nil { + return image, func() error { return nil }, err + } + headerLen := uint16(len(name)+len(version)) + 36 + gzWriter := gzip.NewWriter(file) + + return ImageWriter{ + Path: path, + RawImagePath: rawImgPath, + Name: strings.TrimSuffix(name, "\n"), + Version: strings.TrimSuffix(version, "\n"), + CheckSum: strings.TrimSuffix(checkSum, "\n"), + ImgSize: uint64(stat.Size()), + Writer: gzWriter, + HeaderLen: headerLen, + file: file, + }, file.Close, nil +} + +func (i *ImageWriter) WriteMetadata() { + i.file.Seek(0, io.SeekEnd) + writer := bufio.NewWriter(i.file) + + writer.WriteString(fmt.Sprintf("%s\n", strings.ReplaceAll(i.Name, "\n", ""))) + + writer.WriteString(fmt.Sprintf("%s\n", strings.ReplaceAll(i.Version, "\n", ""))) + + checkSumBytes, _ := hex.DecodeString(i.CheckSum) + writer.Write(checkSumBytes) + + imgSizeBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(imgSizeBytes, uint64(i.ImgSize)) + writer.Write(imgSizeBytes) + + headerLenBytes := make([]byte, 2) + binary.LittleEndian.PutUint16(headerLenBytes, i.HeaderLen) + writer.Write(headerLenBytes) + + writer.Write([]byte{0x4C, 0x4F, 0x4E, 0x49, 0x4D, 0x41, 0x47, 0x45}) + writer.Flush() +} + +func ReadImage(path string) (ImageReader, func() error, error) { + var image ImageReader + stat, err := os.Stat(path) + if errors.Is(err, os.ErrNotExist) { + return image, func() error { return nil }, err + } + path, _ = filepath.Abs(path) + file, err := os.Open(path) + if err != nil { + return image, func() error { return nil }, err + } + + file.Seek(-8, io.SeekEnd) + + signatureBytes := make([]byte, 8) + file.Read(signatureBytes) + if string(signatureBytes) != "LONIMAGE" { + return image, func() error { return nil }, errors.New("not a LoN Image") + } + + file.Seek(-10, io.SeekEnd) + offsetBytes := make([]byte, 2) + file.Read(offsetBytes) + headerLen := binary.LittleEndian.Uint16(offsetBytes) + file.Seek(-int64(headerLen), io.SeekEnd) + + reader := bufio.NewReader(file) + + name, err := reader.ReadString('\n') + if err != nil { + return image, func() error { return nil }, err + } + + version, err := reader.ReadString('\n') + if err != nil { + return image, func() error { return nil }, err + } + + checkSumBytes := make([]byte, 16) + _, err = reader.Read(checkSumBytes) + checkSum := hex.EncodeToString(checkSumBytes) + if err != nil { + return image, func() error { return nil }, err + } + + imgSizeBytes := make([]byte, 8) + _, err = reader.Read(imgSizeBytes) + if err != nil { + return image, func() error { return nil }, err + } + imgSize := binary.LittleEndian.Uint64(imgSizeBytes) + + file.Seek(0, io.SeekStart) + gzReader, err := gzip.NewReader(file) + if err != nil { + return image, func() error { return nil }, err + } + + return ImageReader{ + Path: path, + Stat: stat, + Name: strings.TrimSuffix(name, "\n"), + Version: strings.TrimSuffix(version, "\n"), + CheckSum: strings.TrimSuffix(checkSum, "\n"), + ImgSize: imgSize, + Reader: gzReader, + HeaderLen: headerLen, + }, file.Close, nil +}