Files
cloudpods/pkg/util/fstabutils/fstabutils.go
2019-08-06 15:35:55 +08:00

120 lines
2.6 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 fstabutils
import (
"fmt"
"regexp"
"strings"
"yunion.io/x/log"
)
type SFSRecord struct {
Dev string
Mount string
Fs string
Opt string
Dump string
Pas string
}
func FSRecord(line string) *SFSRecord {
data := regexp.MustCompile(`\s+`).Split(line, -1)
if len(data) > 5 {
return &SFSRecord{data[0], data[1], data[2], data[3], data[4], data[5]}
}
log.Errorf("Invalid fstab record %s", line)
return nil
}
func (fsr *SFSRecord) String() string {
return fmt.Sprintf("%s\t%s\t%s\t%s\t%s\t%s",
fsr.Dev, fsr.Mount, fsr.Fs, fsr.Opt, fsr.Dump, fsr.Pas)
}
var VDISK_PREFIX = "/dev/vd"
type FsTab []*SFSRecord
func FSTabFile(content string) *FsTab {
if len(content) > 0 {
var res = make(FsTab, 0)
lines := strings.Split(content, "\n")
for _, line := range lines {
line = strings.TrimSpace(line)
if len(line) > 0 && line[0] != '#' {
if fsr := FSRecord(line); fsr != nil {
res = append(res, fsr)
}
}
}
return &res
}
return nil
}
func (ft *FsTab) IsExists(dev string) bool {
for _, f := range *ft {
if f.Dev == dev {
return true
}
}
return false
}
func (ft *FsTab) AddFsrec(line string) {
rec := FSRecord(line)
if rec != nil {
*ft = append(*ft, rec)
}
}
func (ft *FsTab) RemoveDevices(devCnt int) *FsTab {
var newList = make(FsTab, 0)
for _, f := range *ft {
if strings.HasPrefix(f.Dev, VDISK_PREFIX) {
devChar := f.Dev[len(VDISK_PREFIX)]
devIdx := devChar - 'a'
if devIdx >= 0 && int(devIdx) < devCnt {
newList = append(newList, f)
}
} else {
newList = append(newList, f)
}
}
return &newList
}
func (ft *FsTab) ToConf() string {
var res string
for _, f := range *ft {
res += fmt.Sprintf("%s\n", f)
}
return res
}
/* TODO: test
if __name__ == '__main__':
with open('/etc/fstab') as f:
cont = f.read(4096)
print cont
fstab = FSTabFile(cont)
print fstab.is_exists('/dev/sdc2')
fstab.add_fsrec('/dev/sdd1 /data ext4 defaults 0 0')
fstab.add_fsrec('/dev/sdd2')
print fstab.to_conf()
*/