remove external findmnt dep
Signed-off-by: Vasiliy Tolstov <v.tolstov@selfip.ru>
This commit is contained in:
parent
465cb76917
commit
bafcbde165
@ -22,25 +22,84 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"unicode"
|
||||||
|
|
||||||
"github.com/vtolstov/go-ioctl"
|
"github.com/vtolstov/go-ioctl"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func rootMount() (string, error) {
|
||||||
|
var err error
|
||||||
|
var device string
|
||||||
|
|
||||||
|
f, err := os.Open("/proc/self/mounts")
|
||||||
|
if err != nil {
|
||||||
|
return device, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
br := bufio.NewReader(f)
|
||||||
|
|
||||||
|
for {
|
||||||
|
line, err := br.ReadString('\n')
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
fields := strings.Fields(line)
|
||||||
|
if fields[1] != "/" || fields[0][0] != '/' {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fi, err := os.Stat(fields[0])
|
||||||
|
if err != nil {
|
||||||
|
return device, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if fi.Mode()&os.ModeSymlink == 0 {
|
||||||
|
device, err = filepath.EvalSymlinks(fields[0])
|
||||||
|
if err != nil {
|
||||||
|
return device, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
device = fields[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return device, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func rootDevice() (string, error) {
|
||||||
|
var device string
|
||||||
|
|
||||||
|
mountpoint, err := rootMount()
|
||||||
|
if err != nil {
|
||||||
|
return device, err
|
||||||
|
}
|
||||||
|
|
||||||
|
numstrip := func(r rune) rune {
|
||||||
|
if unicode.IsNumber(r) {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
return strings.Map(numstrip, mountpoint), nil
|
||||||
|
}
|
||||||
|
|
||||||
func ResizeRootFS() error {
|
func ResizeRootFS() error {
|
||||||
var err error
|
var err error
|
||||||
var stdout io.ReadCloser
|
var stdout io.ReadCloser
|
||||||
var stdin bytes.Buffer
|
var stdin bytes.Buffer
|
||||||
|
|
||||||
output, err := exec.Command("findmnt", "-n", "-o", "source", "/").CombinedOutput()
|
mountpoint, err := rootMount()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
mountpoint := strings.TrimSpace(string(output))
|
|
||||||
partstart := "2048"
|
partstart := "2048"
|
||||||
device := mountpoint[:len(mountpoint)-1]
|
device, err := rootDevice()
|
||||||
partition := mountpoint[len(mountpoint)-1:]
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
mbr := make([]byte, 446)
|
mbr := make([]byte, 446)
|
||||||
|
|
||||||
f, err := os.OpenFile(device, os.O_RDONLY, os.FileMode(0400))
|
f, err := os.OpenFile(device, os.O_RDONLY, os.FileMode(0400))
|
||||||
@ -72,7 +131,7 @@ func ResizeRootFS() error {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.HasPrefix(line, device+partition) {
|
if strings.HasPrefix(line, mountpoint) {
|
||||||
ps := strings.Fields(line) // /dev/sda1 * 4096 251658239 125827072 83 Linux
|
ps := strings.Fields(line) // /dev/sda1 * 4096 251658239 125827072 83 Linux
|
||||||
if ps[1] == "*" {
|
if ps[1] == "*" {
|
||||||
partstart = ps[2]
|
partstart = ps[2]
|
||||||
@ -120,8 +179,8 @@ func ResizeRootFS() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.Printf("resize filesystem via %s %s", "resize2fs", device+partition)
|
log.Printf("resize filesystem via %s %s", "resize2fs", mountpoint)
|
||||||
err = exec.Command("resize2fs", device+partition).Run()
|
err = exec.Command("resize2fs", mountpoint).Run()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user