From aed889eed691fd0288dbc8da0de9ae7dfbb303b8 Mon Sep 17 00:00:00 2001 From: Vignesh Raman Date: Tue, 27 Jul 2021 10:31:08 +0530 Subject: [PATCH] actions/image-partition: truncate filesystem label to maximum supported length Added optional fslabel property to partition to allow truncation of filesystem label and allow user to modify filesystem label without modifying the name. Filesystem label defaults to the name property of the partition. The filesystem label can be up to 11 characters long for vfat, 16 characters long for ext2/3/4, 255 characters long for btrfs, 512 characters long for hfs/hfsplus and 12 characters long for xfs. Any longer labels will be automatically truncated. Fixes: #251 Suggested-by: Christopher Obbard Signed-off-by: Vignesh Raman --- actions/image_partition_action.go | 50 ++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/actions/image_partition_action.go b/actions/image_partition_action.go index 442168bd..40f2a069 100644 --- a/actions/image_partition_action.go +++ b/actions/image_partition_action.go @@ -43,6 +43,7 @@ Yaml syntax for partitions: - name: partition name partlabel: partition label fs: filesystem + fslabel: filesystem label start: offset end: offset features: list of filesystem features @@ -72,6 +73,12 @@ Optional properties: - partlabel -- label for the partition in the GPT partition table. Defaults to the `name` property of the partition. May only be used for GPT partitions. +- fslabel -- (optional) Sets the volume name (label) of the filesystem. Defaults +to the `name` property of the partition. The filesystem label can be up to 11 +characters long for vfat, 16 characters long for ext2/3/4, 255 characters long +for btrfs, 512 characters long for hfs/hfsplus and 12 characters long for xfs. +Any longer labels will be automatically truncated. + - parttype -- set the partition type in the partition table. The string should be in a hexadecimal format (2-characters) for msdos partition tables and GUID format (36-characters) for GPT partition tables. For instance, "82" for msdos sets the @@ -168,6 +175,7 @@ type Partition struct { number int Name string PartLabel string + FSLabel string PartType string Start string End string @@ -305,10 +313,10 @@ func (i ImagePartitionAction) formatPartition(p *Partition, context debos.DebosC cmdline := []string{} switch p.FS { case "vfat": - cmdline = append(cmdline, "mkfs.vfat", "-F32", "-n", p.Name) + cmdline = append(cmdline, "mkfs.vfat", "-F32", "-n", p.FSLabel) case "btrfs": // Force formatting to prevent failure in case if partition was formatted already - cmdline = append(cmdline, "mkfs.btrfs", "-L", p.Name, "-f") + cmdline = append(cmdline, "mkfs.btrfs", "-L", p.FSLabel, "-f") if len(p.Features) > 0 { cmdline = append(cmdline, "-O", strings.Join(p.Features, ",")) } @@ -316,26 +324,26 @@ func (i ImagePartitionAction) formatPartition(p *Partition, context debos.DebosC cmdline = append(cmdline, "-U", p.FSUUID) } case "f2fs": - cmdline = append(cmdline, "mkfs.f2fs", "-l", p.Name) + cmdline = append(cmdline, "mkfs.f2fs", "-l", p.FSLabel) if len(p.Features) > 0 { cmdline = append(cmdline, "-O", strings.Join(p.Features, ",")) } case "hfs": - cmdline = append(cmdline, "mkfs.hfs", "-h", "-v", p.Name) + cmdline = append(cmdline, "mkfs.hfs", "-h", "-v", p.FSLabel) case "hfsplus": - cmdline = append(cmdline, "mkfs.hfsplus", "-v", p.Name) + cmdline = append(cmdline, "mkfs.hfsplus", "-v", p.FSLabel) case "hfsx": - cmdline = append(cmdline, "mkfs.hfsplus", "-s", "-v", p.Name) + cmdline = append(cmdline, "mkfs.hfsplus", "-s", "-v", p.FSLabel) // hfsx is case-insensitive hfs+, should be treated as "normal" hfs+ from now on p.FS = "hfsplus" case "xfs": - cmdline = append(cmdline, "mkfs.xfs", "-L", p.Name) + cmdline = append(cmdline, "mkfs.xfs", "-L", p.FSLabel) if len(p.FSUUID) > 0 { cmdline = append(cmdline, "-m", "uuid="+p.FSUUID) } case "none": default: - cmdline = append(cmdline, fmt.Sprintf("mkfs.%s", p.FS), "-L", p.Name) + cmdline = append(cmdline, fmt.Sprintf("mkfs.%s", p.FS), "-L", p.FSLabel) if len(p.Features) > 0 { cmdline = append(cmdline, "-O", strings.Join(p.Features, ",")) } @@ -599,6 +607,7 @@ func (i *ImagePartitionAction) Verify(context *debos.DebosContext) error { num := 1 for idx, _ := range i.Partitions { + var maxLength int = 0 p := &i.Partitions[idx] p.number = num num++ @@ -654,6 +663,31 @@ func (i *ImagePartitionAction) Verify(context *debos.DebosContext) error { case "": return fmt.Errorf("Partition %s missing fs type", p.Name) } + + if p.FSLabel == "" { + p.FSLabel = p.Name + } + + switch p.FS { + case "vfat": + maxLength = 11 + case "ext2", "ext3", "ext4": + maxLength = 16 + case "btrfs": + maxLength = 255 + case "f2fs": + maxLength = 512 + case "hfs", "hfsplus": + maxLength = 255 + case "xfs": + maxLength = 12 + } + + if maxLength > 0 && len(p.FSLabel) > maxLength { + truncated := p.FSLabel[0:maxLength] + log.Printf("Warning: fs label for %s '%s' is too long; truncated to '%s'", p.Name, p.FSLabel, truncated) + p.FSLabel = truncated + } } for idx, _ := range i.Mountpoints {