master
go 141 lines 2.71 KB
Raw
1 package commands
2
3 import (
4 "os"
5 "runtime"
6
7 "github.com/ipfs/go-ipfs-cmds"
8 version "github.com/ipfs/kubo"
9 "github.com/ipfs/kubo/config"
10 "github.com/ipfs/kubo/core"
11 cmdenv "github.com/ipfs/kubo/core/commands/cmdenv"
12 manet "github.com/multiformats/go-multiaddr/net"
13 sysi "github.com/whyrusleeping/go-sysinfo"
14 )
15
16 var sysDiagCmd = &cmds.Command{
17 Helptext: cmds.HelpText{
18 Tagline: "Print system diagnostic information.",
19 ShortDescription: `
20 Prints out information about your computer to aid in easier debugging.
21 `,
22 },
23 Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
24 nd, err := cmdenv.GetNode(env)
25 if err != nil {
26 return err
27 }
28
29 info, err := getInfo(nd)
30 if err != nil {
31 return err
32 }
33 return cmds.EmitOnce(res, info)
34 },
35 }
36
37 func getInfo(nd *core.IpfsNode) (map[string]any, error) {
38 info := make(map[string]any)
39 err := runtimeInfo(info)
40 if err != nil {
41 return nil, err
42 }
43
44 err = envVarInfo(info)
45 if err != nil {
46 return nil, err
47 }
48
49 err = diskSpaceInfo(info)
50 if err != nil {
51 return nil, err
52 }
53
54 err = memInfo(info)
55 if err != nil {
56 return nil, err
57 }
58
59 err = netInfo(nd.IsOnline, info)
60 if err != nil {
61 return nil, err
62 }
63
64 info["ipfs_version"] = version.CurrentVersionNumber
65 info["ipfs_commit"] = version.CurrentCommit
66 return info, nil
67 }
68
69 func runtimeInfo(out map[string]any) error {
70 rt := make(map[string]any)
71 rt["os"] = runtime.GOOS
72 rt["arch"] = runtime.GOARCH
73 rt["compiler"] = runtime.Compiler
74 rt["version"] = runtime.Version()
75 rt["numcpu"] = runtime.NumCPU()
76 rt["gomaxprocs"] = runtime.GOMAXPROCS(0)
77 rt["numgoroutines"] = runtime.NumGoroutine()
78
79 out["runtime"] = rt
80 return nil
81 }
82
83 func envVarInfo(out map[string]any) error {
84 ev := make(map[string]any)
85 ev["GOPATH"] = os.Getenv("GOPATH")
86 ev[config.EnvDir] = os.Getenv(config.EnvDir)
87
88 out["environment"] = ev
89 return nil
90 }
91
92 func diskSpaceInfo(out map[string]any) error {
93 pathRoot, err := config.PathRoot()
94 if err != nil {
95 return err
96 }
97 dinfo, err := sysi.DiskUsage(pathRoot)
98 if err != nil {
99 return err
100 }
101
102 out["diskinfo"] = map[string]any{
103 "fstype": dinfo.FsType,
104 "total_space": dinfo.Total,
105 "free_space": dinfo.Free,
106 }
107
108 return nil
109 }
110
111 func memInfo(out map[string]any) error {
112 m := make(map[string]any)
113
114 meminf, err := sysi.MemoryInfo()
115 if err != nil {
116 return err
117 }
118
119 m["swap"] = meminf.Swap
120 m["virt"] = meminf.Used
121 out["memory"] = m
122 return nil
123 }
124
125 func netInfo(online bool, out map[string]any) error {
126 n := make(map[string]any)
127 addrs, err := manet.InterfaceMultiaddrs()
128 if err != nil {
129 return err
130 }
131
132 straddrs := make([]string, len(addrs))
133 for i, a := range addrs {
134 straddrs[i] = a.String()
135 }
136
137 n["interface_addresses"] = straddrs
138 n["online"] = online
139 out["net"] = n
140 return nil
141 }