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  }