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  }