39 lines
917 B
Go
39 lines
917 B
Go
package filesystems
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
var (
|
|
ext2fsSuccessRegexp = regexp.MustCompile(`The filesystem on [/a-z0-9]+ is now \d+ \(\d+\w+\) blocks long.`)
|
|
)
|
|
|
|
const (
|
|
EXT2 = "ext2"
|
|
EXT3 = "ext3"
|
|
EXT4 = "ext4"
|
|
resize2fs = "resize2fs"
|
|
)
|
|
|
|
type Ext234Resize struct {
|
|
}
|
|
|
|
func (c *Ext234Resize) CanResizeFilesystem(fstype string) bool {
|
|
return fstype == EXT2 || fstype == EXT3 || fstype == EXT4
|
|
}
|
|
|
|
func (c *Ext234Resize) ResizeFilesystem(deviceName string, commandExecutor func(cmd string) (out string, err error)) error {
|
|
command := fmt.Sprintf("%s %s 2>&1", resize2fs, deviceName)
|
|
out, err := commandExecutor(command)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if strings.Contains(out, "Nothing to do") ||
|
|
(strings.Contains(out, "on-line resizing required") && ext2fsSuccessRegexp.MatchString(out)) {
|
|
return nil
|
|
}
|
|
return fmt.Errorf("unrecognized output: %s, assuming error", out)
|
|
}
|