select snapshots to send
This commit is contained in:
parent
d30cb6f304
commit
c5b75c245c
134
backup.go
134
backup.go
@ -35,6 +35,7 @@ type AppConfig struct {
|
|||||||
Before map[string]Location `json:"before"`
|
Before map[string]Location `json:"before"`
|
||||||
After map[string]Location `json:"after"`
|
After map[string]Location `json:"after"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SSHConfig struct {
|
type SSHConfig struct {
|
||||||
signer ssh.Signer
|
signer ssh.Signer
|
||||||
config *ssh.ClientConfig
|
config *ssh.ClientConfig
|
||||||
@ -74,6 +75,16 @@ func (l Location) Valid() bool {
|
|||||||
return len(s) == 2
|
return len(s) == 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s Snapshot) Path() string {
|
||||||
|
s2 := strings.Split(string(s), `@`)
|
||||||
|
return s2[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s Snapshot) Name() string {
|
||||||
|
s2 := strings.Split(string(s), `@`)
|
||||||
|
return s2[1]
|
||||||
|
}
|
||||||
|
|
||||||
//Load config from file
|
//Load config from file
|
||||||
func (c *Config) Load() error {
|
func (c *Config) Load() error {
|
||||||
b, err := ioutil.ReadFile(*cfgFile)
|
b, err := ioutil.ReadFile(*cfgFile)
|
||||||
@ -221,6 +232,62 @@ func (c *Config) Close() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SSHConfig) getLastSnapshot(path string) (Snapshot, error) {
|
||||||
|
var last Snapshot
|
||||||
|
for _, v := range s.snapshot {
|
||||||
|
if v.Path() == path {
|
||||||
|
last = v
|
||||||
|
} else {
|
||||||
|
if len(string(last)) > 0 {
|
||||||
|
return last, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(string(last)) > 0 {
|
||||||
|
return last, nil
|
||||||
|
}
|
||||||
|
return last, fmt.Errorf("no snapshot")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SSHConfig) isLastSnapshot(snapshot Snapshot) bool {
|
||||||
|
_, err := s.getNextSnapshot(snapshot)
|
||||||
|
if err != nil {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SSHConfig) getFirstSnapshot(path string) (Snapshot, error) {
|
||||||
|
var first Snapshot
|
||||||
|
for _, v := range s.snapshot {
|
||||||
|
if v.Path() == path {
|
||||||
|
first = v
|
||||||
|
return first, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return first, fmt.Errorf("no snapshot")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SSHConfig) getNextSnapshot(snapshot Snapshot) (Snapshot, error) {
|
||||||
|
var next Snapshot
|
||||||
|
for id, v := range s.snapshot {
|
||||||
|
if v == snapshot {
|
||||||
|
if len(s.snapshot) > id+1 {
|
||||||
|
next = s.snapshot[id+1]
|
||||||
|
if next.Path() == snapshot.Path() {
|
||||||
|
return next, nil
|
||||||
|
} else {
|
||||||
|
return next, fmt.Errorf("no snapshot")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return next, fmt.Errorf("no snapshot")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return next, fmt.Errorf("no snapshot")
|
||||||
|
}
|
||||||
|
|
||||||
func (s *SSHConfig) getSnapshotList() error {
|
func (s *SSHConfig) getSnapshotList() error {
|
||||||
if *debugFlag {
|
if *debugFlag {
|
||||||
log.Printf("SSHConfig.getSnapshotList : Start %s", s.name)
|
log.Printf("SSHConfig.getSnapshotList : Start %s", s.name)
|
||||||
@ -480,7 +547,72 @@ func (a AppConfig) RunAppSchedule(schedule string) error {
|
|||||||
for _, dest := range a.Destinations {
|
for _, dest := range a.Destinations {
|
||||||
if *debugFlag {
|
if *debugFlag {
|
||||||
log.Printf("RunAppSchedule : Sending snapshots from %s to %s", string(src), string(dest))
|
log.Printf("RunAppSchedule : Sending snapshots from %s to %s", string(src), string(dest))
|
||||||
|
}
|
||||||
|
dLastSnapshot, err := cfg.ssh[dest.Box()].getLastSnapshot(dest.Path() + "/" + src.Path())
|
||||||
|
if err != nil {
|
||||||
|
if *debugFlag {
|
||||||
|
log.Printf("RunAppSchedule : No snapshot for %s on %s", string(src), dest.Box())
|
||||||
|
}
|
||||||
|
sFirstSnapshot, err := cfg.ssh[src.Box()].getFirstSnapshot(src.Path())
|
||||||
|
if err != nil {
|
||||||
|
if *debugFlag {
|
||||||
|
log.Printf("RunAppSchedule : No snapshot for %s", string(src))
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
if *debugFlag {
|
||||||
|
log.Printf("RunAppSchedule : Initializing snapshot on %s from %s", dest.Box(), string(sFirstSnapshot))
|
||||||
|
}
|
||||||
|
sNextSnapshot, err := cfg.ssh[src.Box()].getNextSnapshot(sFirstSnapshot)
|
||||||
|
if err != nil {
|
||||||
|
if *debugFlag {
|
||||||
|
log.Printf("RunAppSchedule : All snapshots sent for %s", string(src))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if *debugFlag {
|
||||||
|
log.Printf("RunAppSchedule : Sending %s to %s", string(sNextSnapshot), dest.Box())
|
||||||
|
}
|
||||||
|
for !cfg.ssh[src.Box()].isLastSnapshot(sNextSnapshot) {
|
||||||
|
sNextSnapshot, err = cfg.ssh[src.Box()].getNextSnapshot(sNextSnapshot)
|
||||||
|
if *debugFlag {
|
||||||
|
log.Printf("RunAppSchedule : Sending %s to %s", string(sNextSnapshot), dest.Box())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if *debugFlag {
|
||||||
|
log.Printf("RunAppSchedule : All snapshots sent for %s", string(src))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if *debugFlag {
|
||||||
|
log.Printf("RunAppSchedule : Last snapshot on %s is %s", dest.Box(), string(dLastSnapshot))
|
||||||
|
}
|
||||||
|
if !cfg.ssh[src.Box()].isLastSnapshot(dLastSnapshot) {
|
||||||
|
sNextSnapshot, err := cfg.ssh[src.Box()].getNextSnapshot(dLastSnapshot)
|
||||||
|
if err != nil {
|
||||||
|
if *debugFlag {
|
||||||
|
log.Printf("RunAppSchedule : No snapshot for %s", string(src))
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
if *debugFlag {
|
||||||
|
log.Printf("RunAppSchedule : Sending %s to %s", string(sNextSnapshot), dest.Box())
|
||||||
|
}
|
||||||
|
for !cfg.ssh[src.Box()].isLastSnapshot(sNextSnapshot) {
|
||||||
|
sNextSnapshot, err = cfg.ssh[src.Box()].getNextSnapshot(sNextSnapshot)
|
||||||
|
if *debugFlag {
|
||||||
|
log.Printf("RunAppSchedule : Sending %s to %s", string(sNextSnapshot), dest.Box())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if *debugFlag {
|
||||||
|
log.Printf("RunAppSchedule : All snapshots sent for", string(src))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if *debugFlag {
|
||||||
|
log.Printf("RunAppSchedule : Last snapshot sent for", string(src))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user