github.com/vmware/govmomi@v0.51.0/cli/logs/download.go (about) 1 // © Broadcom. All Rights Reserved. 2 // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 3 // SPDX-License-Identifier: Apache-2.0 4 5 package logs 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 "path" 12 13 "github.com/vmware/govmomi/cli" 14 "github.com/vmware/govmomi/cli/flags" 15 "github.com/vmware/govmomi/object" 16 "github.com/vmware/govmomi/vim25" 17 "github.com/vmware/govmomi/vim25/soap" 18 "github.com/vmware/govmomi/vim25/types" 19 ) 20 21 type download struct { 22 *flags.DatacenterFlag 23 24 IncludeDefault bool 25 } 26 27 func init() { 28 cli.Register("logs.download", &download{}) 29 } 30 31 func (cmd *download) Register(ctx context.Context, f *flag.FlagSet) { 32 cmd.DatacenterFlag, ctx = flags.NewDatacenterFlag(ctx) 33 cmd.DatacenterFlag.Register(ctx, f) 34 35 f.BoolVar(&cmd.IncludeDefault, "default", false, "Specifies if the bundle should include the default server") 36 } 37 38 func (cmd *download) Process(ctx context.Context) error { 39 if err := cmd.DatacenterFlag.Process(ctx); err != nil { 40 return err 41 } 42 return nil 43 } 44 45 func (cmd *download) Usage() string { 46 return "[PATH]..." 47 } 48 49 func (cmd *download) Description() string { 50 return `Generate diagnostic bundles. 51 52 A diagnostic bundle includes log files and other configuration information. 53 54 Use PATH to include a specific set of hosts to include. 55 56 Examples: 57 govc logs.download 58 govc logs.download host-a host-b` 59 } 60 61 func (cmd *download) DownloadFile(c *vim25.Client, b string) error { 62 u, err := c.Client.ParseURL(b) 63 if err != nil { 64 return err 65 } 66 67 dst := path.Base(u.Path) 68 p := soap.DefaultDownload 69 if cmd.OutputFlag.TTY { 70 logger := cmd.ProgressLogger(fmt.Sprintf("Downloading %s... ", dst)) 71 defer logger.Wait() 72 p.Progress = logger 73 } 74 75 return c.Client.DownloadFile(context.Background(), dst, u, &p) 76 } 77 78 func (cmd *download) GenerateLogBundles(m *object.DiagnosticManager, host []*object.HostSystem) ([]types.DiagnosticManagerBundleInfo, error) { 79 ctx := context.TODO() 80 logger := cmd.ProgressLogger("Generating log bundles... ") 81 defer logger.Wait() 82 83 task, err := m.GenerateLogBundles(ctx, cmd.IncludeDefault, host) 84 if err != nil { 85 return nil, err 86 } 87 88 r, err := task.WaitForResult(ctx, logger) 89 if err != nil { 90 return nil, err 91 } 92 93 return r.Result.(types.ArrayOfDiagnosticManagerBundleInfo).DiagnosticManagerBundleInfo, nil 94 } 95 96 func (cmd *download) Run(ctx context.Context, f *flag.FlagSet) error { 97 finder, err := cmd.Finder() 98 if err != nil { 99 return err 100 } 101 102 var host []*object.HostSystem 103 104 for _, arg := range f.Args() { 105 hs, err := finder.HostSystemList(ctx, arg) 106 if err != nil { 107 return err 108 } 109 110 host = append(host, hs...) 111 } 112 113 c, err := cmd.Client() 114 if err != nil { 115 return err 116 } 117 118 m := object.NewDiagnosticManager(c) 119 120 bundles, err := cmd.GenerateLogBundles(m, host) 121 if err != nil { 122 return err 123 } 124 125 for _, bundle := range bundles { 126 err := cmd.DownloadFile(c, bundle.Url) 127 if err != nil { 128 return err 129 } 130 } 131 132 return nil 133 }