github.com/devops-filetransfer/sshego@v7.0.4+incompatible/pergob.go (about) 1 package sshego 2 3 import ( 4 "bytes" 5 "encoding/gob" 6 "fmt" 7 "log" 8 "net" 9 "os/exec" 10 "time" 11 12 "github.com/glycerine/go-unsnap-stream" 13 "github.com/glycerine/sshego/xendor/github.com/glycerine/xcryptossh" 14 ) 15 16 func (s *KnownHosts) saveGobSnappy(fn string) error { 17 mkpath(fn) 18 19 t0 := time.Now() 20 21 gob.Register(s) 22 gob.Register(net.TCPAddr{}) 23 gob.Register(new(ssh.PublicKey)) 24 25 var buf bytes.Buffer 26 enc := gob.NewEncoder(&buf) // Will write to buf 27 28 // Encode (send) some values. 29 err := enc.Encode(s) 30 if err != nil { 31 panic(fmt.Sprintf("encode error: %v", err)) 32 } 33 34 // don't blow away the last good (fn) until the new version is completely written. 35 fnNew := fn + ".new" 36 37 //exec.Command("mv", fn+".prev", fn+".prev.prev").Run() 38 exec.Command("cp", "-p", fn, fn+".prev").Run() 39 40 var file *unsnap.SnappyFile 41 file, err = unsnap.Create(fnNew) 42 if err != nil { 43 panic(fmt.Sprintf("problem creating s outfile '%s': %s", fn, err)) 44 } 45 defer file.Close() 46 47 drainable := buf 48 _, err = drainable.WriteTo(file) 49 50 file.Sync() 51 file.Close() 52 exec.Command("mv", fnNew, fn).Run() 53 54 log.Printf("saveGobSnappy() took %v", time.Since(t0)) 55 56 return err 57 } 58 59 func (s *KnownHosts) readGobSnappy(fn string) error { 60 61 f, err := unsnap.Open(fn) 62 if err != nil { 63 return err 64 } 65 defer f.Close() 66 67 log.Printf("readgob() is restoring ceptor server state from file '%s'.", fn) 68 69 // Decode (receive) and print the values. 70 dec := gob.NewDecoder(f) 71 72 err = dec.Decode(&s) 73 if err != nil { 74 panic(fmt.Sprintf("decode error 1: %v", err)) 75 } 76 77 return err 78 }