github.com/devops-filetransfer/sshego@v7.0.4+incompatible/perjson.go (about) 1 package sshego 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io/ioutil" 7 "os/exec" 8 "time" 9 10 "github.com/glycerine/go-unsnap-stream" 11 "log" 12 ) 13 14 func (s *KnownHosts) saveJSONSnappy(fn string) error { 15 mkpath(fn) 16 17 t0 := time.Now() 18 19 by, err := json.Marshal(s) 20 if err != nil { 21 panic(err) 22 } 23 24 // don't blow away the last good (fn) until the new version is completely written. 25 fnNew := fn + ".new" 26 27 // for backups 28 //exec.Command("mv", fn+".prev", fn+".prev.prev").Run() 29 exec.Command("cp", "-p", fn, fn+".prev").Run() 30 31 j, err := unsnap.Create(fnNew) 32 defer j.Close() 33 if err != nil { 34 panic(err) 35 } 36 37 _, err = j.Write(by) 38 if err != nil { 39 panic(err) 40 } 41 fmt.Fprintf(j, "\n") 42 43 j.Close() 44 exec.Command("mv", fnNew, fn).Run() 45 46 log.Printf("saveJSONSnappy() took %v", time.Since(t0)) 47 return err 48 } 49 50 func (s *KnownHosts) readJSONSnappy(fn string) error { 51 52 if !fileExists(fn) { 53 return fmt.Errorf("could not open because no such file: '%s'", fn) 54 } 55 56 log.Printf("readJSONSnappy() is restoring state from file '%s'.", fn) 57 58 f, err := unsnap.Open(fn) 59 if err != nil { 60 panic(err) 61 } 62 defer f.Close() 63 64 dat, err := ioutil.ReadAll(f) 65 if err != nil { 66 panic(err) 67 } 68 69 err = json.Unmarshal(dat, s) 70 if err != nil { 71 panic(err) 72 } 73 74 return err 75 }