Files
cloudpods/pkg/hostman/diskutils/fsutils/driver/driver.go
wanyaoqi 34b417c60b fix(host,host-deployer): support lvm disk resize (#23333)
- add resize lvm disk support
- support qga online resize disk partitions and filesystems
2025-09-19 23:45:47 +08:00

88 lines
2.2 KiB
Go

// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package driver
import (
"fmt"
"io"
"io/ioutil"
"yunion.io/x/onecloud/pkg/util/procutils"
)
type IFsutilExecDriver interface {
Run(name string, args ...string) error
Exec(name string, args ...string) ([]byte, error)
ExecInputWait(name string, args []string, input []string) (int, string, string, error)
}
type SProcDriver struct {
}
func NewProcDriver() IFsutilExecDriver {
return new(SProcDriver)
}
func (*SProcDriver) Exec(name string, args ...string) ([]byte, error) {
return procutils.NewCommand(name, args...).Output()
}
func (*SProcDriver) Run(name string, args ...string) error {
return procutils.NewCommand(name, args...).Run()
}
func (*SProcDriver) ExecInputWait(name string, args []string, input []string) (int, string, string, error) {
proc := procutils.NewCommand(name, args...)
stdin, err := proc.StdinPipe()
if err != nil {
return -1, "", "", err
}
defer stdin.Close()
outb, err := proc.StdoutPipe()
if err != nil {
return -1, "", "", err
}
defer outb.Close()
errb, err := proc.StderrPipe()
if err != nil {
return -1, "", "", err
}
defer errb.Close()
if err := proc.Start(); err != nil {
return -1, "", "", err
}
for _, s := range input {
io.WriteString(stdin, fmt.Sprintf("%s\n", s))
}
stdoutPut, err := ioutil.ReadAll(outb)
if err != nil {
return -1, "", "", err
}
stderrOutPut, err := ioutil.ReadAll(errb)
if err != nil {
return -1, "", "", err
}
if err = proc.Wait(); err != nil {
if status, succ := proc.GetExitStatus(err); succ {
return status, string(stdoutPut), string(stderrOutPut), err
} else {
return 0, string(stdoutPut), string(stderrOutPut), err
}
}
return 0, string(stdoutPut), string(stderrOutPut), nil
}