2023-08-25 15:12:19 +01:00
|
|
|
package vm
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
2023-08-25 16:54:58 +01:00
|
|
|
"fmt"
|
|
|
|
|
"path/filepath"
|
2023-08-25 15:12:19 +01:00
|
|
|
|
2023-08-25 16:54:58 +01:00
|
|
|
"github.com/AlexSSD7/vldisk/utils"
|
|
|
|
|
"github.com/alessio/shellescape"
|
2023-08-25 15:12:19 +01:00
|
|
|
"github.com/pkg/errors"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type FileManager struct {
|
|
|
|
|
vi *Instance
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewFileManager(vi *Instance) *FileManager {
|
|
|
|
|
return &FileManager{
|
|
|
|
|
vi: vi,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (fm *FileManager) Init() error {
|
|
|
|
|
c, err := fm.vi.DialSSH()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return errors.Wrap(err, "dial vm ssh")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, err = runSSHCmd(c, "apk add util-linux lvm2")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return errors.Wrap(err, "install utilities")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, err = runSSHCmd(c, "vgchange -ay")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return errors.Wrap(err, "run vgchange cmd")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (fm *FileManager) Lsblk() ([]byte, error) {
|
2023-08-25 16:54:58 +01:00
|
|
|
sc, err := fm.vi.DialSSH()
|
2023-08-25 15:12:19 +01:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, errors.Wrap(err, "dial vm ssh")
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-25 16:54:58 +01:00
|
|
|
sess, err := sc.NewSession()
|
2023-08-25 15:12:19 +01:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, errors.Wrap(err, "create new vm ssh session")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret := new(bytes.Buffer)
|
|
|
|
|
|
|
|
|
|
sess.Stdout = ret
|
|
|
|
|
|
|
|
|
|
err = sess.Run("lsblk -o NAME,SIZE,FSTYPE,LABEL -e 7,11,2,253")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, errors.Wrap(err, "run lsblk")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret.Bytes(), nil
|
|
|
|
|
}
|
2023-08-25 16:54:58 +01:00
|
|
|
|
|
|
|
|
type MountOptions struct {
|
|
|
|
|
FSType string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (fm *FileManager) Mount(devName string, mo MountOptions) error {
|
|
|
|
|
if devName == "" {
|
|
|
|
|
return fmt.Errorf("device name is empty")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// It does allow mapper/ prefix for mapped devices.
|
|
|
|
|
// This is to enable the support for LVM and LUKS.
|
|
|
|
|
if !utils.ValidateDevName(devName) {
|
|
|
|
|
return fmt.Errorf("bad device name")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fullDevPath := filepath.Clean("/dev/" + devName)
|
|
|
|
|
|
|
|
|
|
if mo.FSType == "" {
|
|
|
|
|
return fmt.Errorf("fs type is empty")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sc, err := fm.vi.DialSSH()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return errors.Wrap(err, "dial vm ssh")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sess, err := sc.NewSession()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return errors.Wrap(err, "create new vm ssh session")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = sess.Run("mount -t " + shellescape.Quote(mo.FSType) + " " + shellescape.Quote(fullDevPath) + " /mnt")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return errors.Wrap(err, "run mount cmd")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|