change zfs list handling
This commit is contained in:
112
box.go
112
box.go
@@ -1,8 +1,11 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/csv"
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Box struct {
|
||||
@@ -11,6 +14,7 @@ type Box struct {
|
||||
Key string `json:"key"`
|
||||
Name string `json:"-"`
|
||||
ssh *SSHConfig
|
||||
zfs *ZFSConfig
|
||||
}
|
||||
|
||||
func (b *Box) ZFSGetLastSnapshot(path string) (s Snapshot, err error) {
|
||||
@@ -38,19 +42,114 @@ func (b *Box) ZFSGetSnapshotList() []Snapshot {
|
||||
}
|
||||
|
||||
func (b *Box) ZFSUpdateList() (err error) {
|
||||
return b.ssh.getZFSList()
|
||||
b.zfs.M.Lock()
|
||||
if b.zfs.ZFSDeleted || b.zfs.ZFSAdded {
|
||||
b.zfs.ZFSInitialized = false
|
||||
}
|
||||
b.zfs.M.Unlock()
|
||||
|
||||
err = b.ZFSInitialize()
|
||||
return
|
||||
}
|
||||
|
||||
func (b *Box) ZFSIsZFS(path string) bool {
|
||||
return b.ssh.isZFS(path)
|
||||
err := b.ZFSInitialize()
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
b.zfs.M.Lock()
|
||||
defer b.zfs.M.Unlock()
|
||||
|
||||
if _, ok := b.zfs.ZFSMap[path]; ok {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
|
||||
}
|
||||
|
||||
func (b *Box) ZFSCreateZFS(path string) (err error) {
|
||||
return b.ssh.createZFS(path)
|
||||
err = b.ZFSInitialize()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
b.zfs.M.Lock()
|
||||
defer b.zfs.M.Unlock()
|
||||
|
||||
p := strings.Split(path, `/`)
|
||||
var base string
|
||||
for _, d := range p {
|
||||
if base == "" {
|
||||
base = d
|
||||
} else {
|
||||
base = base + `/` + d
|
||||
}
|
||||
if _, ok := b.zfs.ZFSMap[base]; !ok {
|
||||
|
||||
if *debugFlag {
|
||||
log.Printf("Box.ZFSCreateZFS : Creating %s:%s", b.Name, base)
|
||||
}
|
||||
|
||||
_, err = b.SSHExec("zfs create -o mountpoint=none " + base)
|
||||
if err != nil {
|
||||
if *debugFlag {
|
||||
log.Printf("Box.ZFSCreateZFS : %s : SSHExec : %s", b.Name, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
b.zfs.ZFSMap[base] = "none"
|
||||
b.zfs.ZFSAdded = true
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (b *Box) SSHExec(cmd string) (err error) {
|
||||
return b.ssh.exec(cmd)
|
||||
func (b *Box) ZFSInitialize() (err error) {
|
||||
b.zfs.M.Lock()
|
||||
defer b.zfs.M.Unlock()
|
||||
|
||||
if b.zfs.ZFSInitialized {
|
||||
return nil
|
||||
}
|
||||
|
||||
if *debugFlag {
|
||||
log.Printf("Box.ZFSInitialize : %s : Start", b.Name)
|
||||
}
|
||||
|
||||
b.zfs.ZFSMap = make(map[string]string)
|
||||
|
||||
var buf *bytes.Buffer
|
||||
buf, err = b.SSHExec("zfs list -H -o name,mountpoint")
|
||||
|
||||
csvReader := csv.NewReader(buf)
|
||||
csvReader.Comma = '\t'
|
||||
csvReader.FieldsPerRecord = 2
|
||||
|
||||
csvData, err := csvReader.ReadAll()
|
||||
if err != nil {
|
||||
if *debugFlag {
|
||||
log.Printf("Box.ZFSInitialize : %s : csvReader.ReadAll() : %s", b.Name, err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
for _, rec := range csvData {
|
||||
b.zfs.ZFSMap[rec[0]] = rec[1]
|
||||
}
|
||||
|
||||
b.zfs.ZFSInitialized = true
|
||||
b.zfs.ZFSAdded = false
|
||||
b.zfs.ZFSDeleted = false
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Box) SSHExec(cmd string) (buf *bytes.Buffer, err error) {
|
||||
buf, err = b.ssh.exec(cmd)
|
||||
return
|
||||
}
|
||||
|
||||
func (b *Box) ZFSTakeSnapshot(schedule, path string) (err error) {
|
||||
@@ -59,5 +158,6 @@ func (b *Box) ZFSTakeSnapshot(schedule, path string) (err error) {
|
||||
}
|
||||
timestamp := cfg.Now.Format("2006-01-02_15.04.05")
|
||||
name := fmt.Sprintf("%s-%s--%s", schedule, timestamp, cfg.Zfsnap[schedule])
|
||||
return b.ssh.exec("zfs snapshot " + path + "@" + name)
|
||||
_, err = b.ssh.exec("zfs snapshot " + path + "@" + name)
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user