blob: 59c6a48af594c9a374131438de2432b7df544ab2 [file] [log] [blame]
package output
import (
"encoding/json"
"fmt"
"cos.googlesource.com/cos/tools/src/cmd/cos_image_analyzer/internal/binary"
"cos.googlesource.com/cos/tools/src/cmd/cos_image_analyzer/internal/input"
"cos.googlesource.com/cos/tools/src/cmd/cos_image_analyzer/internal/utilities"
)
// ImageDiff stores all of the differences between the two images
type ImageDiff struct {
BinaryDiff *binary.Differences
}
// Formater is a ImageDiff function that outputs the image differences based on the "-output" flag.
// Either to the terminal (default) or to a stored json object
// Input:
// (string) image1 - Temp directory name of image1
// (string) image2 - Temp directory name of image2
// (*FlagInfo) flagInfo - A struct that holds input preference from the user
// Output:
// ([]string) diffstrings/jsonObjectStr - Based on "-output" flag, either formated string
// for the terminal or a string json object
func (imageDiff *ImageDiff) Formater(image1, image2 string, flagInfo *input.FlagInfo) (string, error) {
if flagInfo.OutputSelected == "terminal" {
binaryStrings := ""
binaryFunctions := map[string]func() string{
"Version": imageDiff.BinaryDiff.FormatVersionDiff,
"BuildID": imageDiff.BinaryDiff.FormatBuildIDDiff,
"Rootfs": imageDiff.BinaryDiff.FormatRootfsDiff,
"Stateful-partition": imageDiff.BinaryDiff.FormatStatefulDiff,
"OS-config": imageDiff.BinaryDiff.FormatOSConfigDiff,
"Partition-structure": imageDiff.BinaryDiff.FormatPartitionStructureDiff,
"Kernel-configs": imageDiff.BinaryDiff.FormatKernelConfigsDiff,
"Kernel-command-line": imageDiff.BinaryDiff.FormatKernelCommandLineDiff,
"Sysctl-settings": imageDiff.BinaryDiff.FormatSysctlSettingsDiff,
}
for _, diff := range input.BinaryDiffTypes {
if utilities.InArray(diff, flagInfo.BinaryTypesSelected) {
binaryStrings += binaryFunctions[diff]()
}
}
if len(binaryStrings) > 0 {
if flagInfo.Image2 == "" {
binaryStrings = "================= Binary Info =================\nImage: " + image1 + "\n" + binaryStrings
} else {
binaryStrings = "================= Binary Differences =================\nImages: " + image1 + " and " + image2 + "\n" + binaryStrings
}
}
diffStrings := binaryStrings
return diffStrings, nil
}
jsonObjectBytes, err := json.Marshal(imageDiff)
if err != nil {
return "", fmt.Errorf("failed to json marshal the image difference struct: %v", err)
}
jsonObjectStr := string(jsonObjectBytes[:])
return jsonObjectStr, nil
}
// Print is a ImageDiff method that prints out all image differences
func (imageDiff *ImageDiff) Print(differences string) {
fmt.Print(differences)
}