125 lines
2.9 KiB
Go
125 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"path"
|
|
"strings"
|
|
|
|
"dev.justinjudd.org/justin/bmap"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func main() {
|
|
|
|
var rootCmd = &cobra.Command{
|
|
Use: "bmap",
|
|
Short: "Create block map (bmap) files and copy files.",
|
|
Long: "Create block map (bmap) files and copy files.",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
cmd.Help()
|
|
},
|
|
}
|
|
|
|
var output string
|
|
var noChecksum bool
|
|
|
|
var createCmd = &cobra.Command{
|
|
Use: "create image",
|
|
Short: "Create block map (bmap) file.",
|
|
Long: "Create block map (bmap) file.",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
if len(args) != 1 {
|
|
fmt.Println("Must supply image file")
|
|
return
|
|
}
|
|
create(args[0], output, !noChecksum)
|
|
},
|
|
}
|
|
|
|
createCmd.Flags().StringVarP(&output, "output", "o", "", "output file name")
|
|
createCmd.Flags().BoolVar(&noChecksum, "no-checksum", false, "don't generate block sum for block ranges")
|
|
|
|
var bmapFile string
|
|
var nobmap bool
|
|
var noVerify bool
|
|
|
|
var copyCmd = &cobra.Command{
|
|
Use: "copy image dest",
|
|
Short: "Write an image using bmap .",
|
|
Long: "Write an image using bmap.",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
if len(args) != 2 {
|
|
fmt.Println("Must supply image file and destination file")
|
|
return
|
|
}
|
|
copy(args[0], args[1], bmapFile, nobmap, !noVerify)
|
|
},
|
|
}
|
|
|
|
copyCmd.Flags().StringVar(&bmapFile, "bmap", "", "block map file for the image")
|
|
copyCmd.Flags().BoolVar(&nobmap, "nobmap", false, "allow copying withut a bmap")
|
|
copyCmd.Flags().BoolVar(&noVerify, "no-verify", false, "do not verify the checksum of data before writing.")
|
|
|
|
rootCmd.AddCommand(createCmd, copyCmd)
|
|
|
|
var cleanCmd = &cobra.Command{
|
|
Use: "clean input",
|
|
Short: "clean a bmap file.",
|
|
Long: "clean a bmap file.",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
if len(args) != 1 {
|
|
fmt.Println("Must supply bmap file")
|
|
return
|
|
}
|
|
clean(args[0])
|
|
},
|
|
}
|
|
rootCmd.AddCommand(cleanCmd)
|
|
|
|
rootCmd.Execute()
|
|
|
|
}
|
|
|
|
func create(image string, output string, noChecksum bool) {
|
|
b, err := bmap.NewBMap(image, noChecksum)
|
|
if err != nil {
|
|
println("Error reading image file:", err.Error())
|
|
}
|
|
err = b.Write(output)
|
|
if err != nil {
|
|
println("Error writing bmap file", err.Error())
|
|
}
|
|
}
|
|
|
|
func copy(image string, dest string, bmapFile string, nobmap bool, noVerify bool) {
|
|
if !nobmap {
|
|
if len(bmapFile) == 0 {
|
|
bmapFile = strings.TrimSuffix(image, path.Ext(image)) + ".bmap"
|
|
}
|
|
b, err := bmap.LoadFromFile(bmapFile, !noVerify)
|
|
if err != nil {
|
|
fmt.Println("Unable to read bmap file: ", bmapFile)
|
|
return
|
|
}
|
|
err = b.Copy(image, dest, noVerify)
|
|
if err != nil {
|
|
fmt.Println("Error copying image: ", err.Error())
|
|
return
|
|
}
|
|
} else {
|
|
err := bmap.Copy(image, dest)
|
|
if err != nil {
|
|
fmt.Println("Error copying image: ", err.Error())
|
|
return
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
func clean(input string) {
|
|
err := bmap.CleanBMap(input)
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
}
|
|
}
|