github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/lib/mbr/impl.go (about)

     1  package mbr
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"os/exec"
     7  )
     8  
     9  func decode(file *os.File) (*Mbr, error) {
    10  	var mbr Mbr
    11  	if _, err := file.ReadAt(mbr.raw[:], 0); err != nil {
    12  		return nil, err
    13  	}
    14  	if mbr.raw[0x1FE] == 0x55 && mbr.raw[0x1FF] == 0xAA {
    15  		return &mbr, nil
    16  	}
    17  	return nil, nil
    18  }
    19  
    20  func (mbr *Mbr) getPartitionOffset(index uint) uint64 {
    21  	partitionOffset := 0x1BE + 0x10*index
    22  	return 512 * (uint64(mbr.raw[partitionOffset+8]) +
    23  		uint64(mbr.raw[partitionOffset+9])<<8 +
    24  		uint64(mbr.raw[partitionOffset+10])<<16 +
    25  		uint64(mbr.raw[partitionOffset+11])<<24)
    26  }
    27  
    28  func (mbr *Mbr) getPartitionSize(index uint) uint64 {
    29  	partitionOffset := 0x1BE + 0x10*index
    30  	return 512 * (uint64(mbr.raw[partitionOffset+12]) +
    31  		uint64(mbr.raw[partitionOffset+13])<<8 +
    32  		uint64(mbr.raw[partitionOffset+14])<<16 +
    33  		uint64(mbr.raw[partitionOffset+15])<<24)
    34  }
    35  
    36  func writeDefault(filename string, tableType TableType) error {
    37  	label, err := tableType.lookupString()
    38  	if err != nil {
    39  		return err
    40  	}
    41  	fmt.Printf("making table type: %d (%s)\n", tableType, label)
    42  	cmd := exec.Command("parted", "-s", "-a", "optimal", filename,
    43  		"mklabel", label,
    44  		"mkpart", "primary", "ext2", "1", "100%",
    45  		"set", "1", "boot", "on",
    46  	)
    47  	output, err := cmd.CombinedOutput()
    48  	if err != nil {
    49  		return fmt.Errorf("error partitioning: %s: %s: %s",
    50  			filename, err, output)
    51  	}
    52  	return nil
    53  }