From e8b278a41222d455077b3c79c842bbcb83286ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Fita?= <4925040+michalfita@users.noreply.github.com> Date: Sat, 15 Jul 2023 12:38:26 +0100 Subject: [PATCH] [OPTDEV-2284] Fixes for `step_partition_image.go` (#286) The original code has bugs in MBR/DOS partitioniong, so narrow use cases fail miserably. Additionally output handling is improved. --- builder/step_partition_image.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/builder/step_partition_image.go b/builder/step_partition_image.go index af00a8b..1261bd5 100644 --- a/builder/step_partition_image.go +++ b/builder/step_partition_image.go @@ -54,7 +54,7 @@ func partitionDOS(ui packer.Ui, config *Config) multistep.StepAction { for i, partition := range config.ImageConfig.ImagePartitions { line := fmt.Sprintf( "%s%d: type=%s", - config.ImageConfig.ImagePath, + partition.Name, //config.ImageConfig.ImagePath, i+1, partition.Type, ) @@ -67,9 +67,15 @@ func partitionDOS(ui packer.Ui, config *Config) multistep.StepAction { line += fmt.Sprintf(", size=%s", partition.Size) } + if partition.Name != "" { + line += fmt.Sprintf(", name=%s", partition.Name) + } + lines = append(lines, line) } + ui.Error(fmt.Sprintf("** DEBUG: %s", strings.Join(lines, "\n"))) + cmd := exec.Command("sfdisk", config.ImageConfig.ImagePath) stdout, err := cmd.StdoutPipe() @@ -79,6 +85,13 @@ func partitionDOS(ui packer.Ui, config *Config) multistep.StepAction { } defer stdout.Close() + stderr, err := cmd.StderrPipe() + if err != nil { + ui.Error(fmt.Sprintf("error while getting stderr pipe %v", err)) + return multistep.ActionHalt + } + defer stderr.Close() + stdin, err := cmd.StdinPipe() if err != nil { ui.Error(fmt.Sprintf("error while getting stdin pipe %v", err)) @@ -100,11 +113,15 @@ func partitionDOS(ui packer.Ui, config *Config) multistep.StepAction { stdin.Close() if err := cmd.Wait(); err != nil { - out, _ := io.ReadAll(stdout) + joined := io.MultiReader(stderr, stdout) + out, _ := io.ReadAll(joined) ui.Error(fmt.Sprintf("error sfdisk %v: %s", err, string(out))) return multistep.ActionHalt } + out, _ := io.ReadAll(stdout) + ui.Message(string(out)) + return multistep.ActionContinue }