Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ func main() {
partitions string
outputDirectory string
concurrency int
quiet bool
)

flag.IntVar(&concurrency, "c", 4, "Number of multiple workers to extract (shorthand)")
Expand All @@ -63,6 +64,8 @@ func main() {
flag.StringVar(&outputDirectory, "output", "", "Set output directory")
flag.StringVar(&partitions, "p", "", "Dump only selected partitions (comma-separated) (shorthand)")
flag.StringVar(&partitions, "partitions", "", "Dump only selected partitions (comma-separated)")
flag.BoolVar(&quiet, "q", false, "Quiet mode (shorthand)")
flag.BoolVar(&quiet, "quiet", false, "Quiet mode")
flag.Parse()

if flag.NArg() == 0 {
Expand Down Expand Up @@ -112,11 +115,11 @@ func main() {
fmt.Printf("Number of workers: %d\n", payload.GetConcurrency())

if partitions != "" {
if err := payload.ExtractSelected(targetDirectory, strings.Split(partitions, ",")); err != nil {
if err := payload.ExtractSelected(targetDirectory, strings.Split(partitions, ","), quiet); err != nil {
log.Fatal(err)
}
} else {
if err := payload.ExtractAll(targetDirectory); err != nil {
if err := payload.ExtractAll(targetDirectory, quiet); err != nil {
log.Fatal(err)
}
}
Expand Down
45 changes: 28 additions & 17 deletions payload.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
type request struct {
partition *chromeos_update_engine.PartitionUpdate
targetDirectory string
quiet bool
}

// Payload is a new format for the Android OTA/Firmware update files since Android Oreo
Expand Down Expand Up @@ -217,27 +218,36 @@ func (p *Payload) readDataBlob(offset int64, length int64) ([]byte, error) {
return buf, nil
}

func (p *Payload) Extract(partition *chromeos_update_engine.PartitionUpdate, out *os.File) error {
func (p *Payload) Extract(partition *chromeos_update_engine.PartitionUpdate, out *os.File, quiet bool) error {
name := partition.GetPartitionName()
info := partition.GetNewPartitionInfo()
totalOperations := len(partition.Operations)
barName := fmt.Sprintf("%s (%s)", name, humanize.Bytes(info.GetSize()))
bar := p.progress.AddBar(
int64(totalOperations),
mpb.PrependDecorators(
decor.Name(barName, decor.WCSyncSpaceR),
),
mpb.AppendDecorators(
decor.Percentage(),
),
)
defer bar.SetTotal(0, true)
var bar *mpb.Bar
if !quiet {
barName := fmt.Sprintf("%s (%s)", name, humanize.Bytes(info.GetSize()))
bar = p.progress.AddBar(
int64(totalOperations),
mpb.PrependDecorators(
decor.Name(barName, decor.WCSyncSpaceR),
),
mpb.AppendDecorators(
decor.Percentage(),
),
)
}
defer func() {
if bar != nil {
bar.SetTotal(0, true)
}
}()

for _, operation := range partition.Operations {
if len(operation.DstExtents) == 0 {
return fmt.Errorf("Invalid operation.DstExtents for the partition %s", name)
}
bar.Increment()
if bar != nil {
bar.Increment()
}

e := operation.DstExtents[0]
dataOffset := p.dataOffset + int64(operation.GetDataOffset())
Expand Down Expand Up @@ -324,7 +334,7 @@ func (p *Payload) worker() {
file, err := os.OpenFile(filepath, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0755)
if err != nil {
}
if err := p.Extract(partition, file); err != nil {
if err := p.Extract(partition, file, req.quiet); err != nil {
fmt.Println(err.Error())
}

Expand All @@ -338,7 +348,7 @@ func (p *Payload) spawnExtractWorkers(n int) {
}
}

func (p *Payload) ExtractSelected(targetDirectory string, partitions []string) error {
func (p *Payload) ExtractSelected(targetDirectory string, partitions []string, quiet bool) error {
if !p.initialized {
return errors.New("Payload has not been initialized")
}
Expand All @@ -361,6 +371,7 @@ func (p *Payload) ExtractSelected(targetDirectory string, partitions []string) e
p.requests <- &request{
partition: partition,
targetDirectory: targetDirectory,
quiet: quiet,
}
}

Expand All @@ -370,6 +381,6 @@ func (p *Payload) ExtractSelected(targetDirectory string, partitions []string) e
return nil
}

func (p *Payload) ExtractAll(targetDirectory string) error {
return p.ExtractSelected(targetDirectory, nil)
func (p *Payload) ExtractAll(targetDirectory string, quiet bool) error {
return p.ExtractSelected(targetDirectory, nil, quiet)
}