github.com/coreos/docker@v1.13.1/daemon/debugtrap.go (about)

     1  package daemon
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  	"time"
     9  
    10  	"github.com/davecgh/go-spew/spew"
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  const dataStructuresLogNameTemplate = "daemon-data-%s.log"
    15  
    16  // dumpDaemon appends the daemon datastructures into file in dir and returns full path
    17  // to that file.
    18  func (d *Daemon) dumpDaemon(dir string) (string, error) {
    19  	// Ensure we recover from a panic as we are doing this without any locking
    20  	defer func() {
    21  		recover()
    22  	}()
    23  
    24  	path := filepath.Join(dir, fmt.Sprintf(dataStructuresLogNameTemplate, strings.Replace(time.Now().Format(time.RFC3339), ":", "", -1)))
    25  	f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0666)
    26  	if err != nil {
    27  		return "", errors.Wrap(err, "failed to open file to write the daemon datastructure dump")
    28  	}
    29  	defer f.Close()
    30  
    31  	dump := struct {
    32  		containers      interface{}
    33  		names           interface{}
    34  		links           interface{}
    35  		execs           interface{}
    36  		volumes         interface{}
    37  		images          interface{}
    38  		layers          interface{}
    39  		imageReferences interface{}
    40  		downloads       interface{}
    41  		uploads         interface{}
    42  		registry        interface{}
    43  		plugins         interface{}
    44  	}{
    45  		containers:      d.containers,
    46  		execs:           d.execCommands,
    47  		volumes:         d.volumes,
    48  		images:          d.imageStore,
    49  		layers:          d.layerStore,
    50  		imageReferences: d.referenceStore,
    51  		downloads:       d.downloadManager,
    52  		uploads:         d.uploadManager,
    53  		registry:        d.RegistryService,
    54  		plugins:         d.PluginStore,
    55  		names:           d.nameIndex,
    56  		links:           d.linkIndex,
    57  	}
    58  
    59  	spew.Fdump(f, dump) // Does not return an error
    60  	f.Sync()
    61  	return path, nil
    62  }