github.com/containers/podman/v4@v4.9.4/pkg/bindings/system/system.go (about) 1 package system 2 3 import ( 4 "context" 5 "encoding/json" 6 "errors" 7 "fmt" 8 "io" 9 "net/http" 10 "time" 11 12 "github.com/containers/podman/v4/libpod/define" 13 "github.com/containers/podman/v4/pkg/bindings" 14 "github.com/containers/podman/v4/pkg/domain/entities" 15 "github.com/sirupsen/logrus" 16 ) 17 18 // Events allows you to monitor libdpod related events like container creation and 19 // removal. The events are then passed to the eventChan provided. The optional cancelChan 20 // can be used to cancel the read of events and close down the HTTP connection. 21 func Events(ctx context.Context, eventChan chan entities.Event, cancelChan chan bool, options *EventsOptions) error { 22 conn, err := bindings.GetClient(ctx) 23 if err != nil { 24 return err 25 } 26 params, err := options.ToParams() 27 if err != nil { 28 return err 29 } 30 response, err := conn.DoRequest(ctx, nil, http.MethodGet, "/events", params, nil) 31 if err != nil { 32 return err 33 } 34 defer response.Body.Close() 35 36 if cancelChan != nil { 37 go func() { 38 <-cancelChan 39 if err := response.Body.Close(); err != nil { 40 logrus.Errorf("Unable to close event response body: %v", err) 41 } 42 }() 43 } 44 45 dec := json.NewDecoder(response.Body) 46 for err = (error)(nil); err == nil; { 47 var e = entities.Event{} 48 err = dec.Decode(&e) 49 if err == nil { 50 eventChan <- e 51 } 52 } 53 close(eventChan) 54 switch { 55 case err == nil: 56 return nil 57 case errors.Is(err, io.EOF): 58 return nil 59 default: 60 return fmt.Errorf("unable to decode event response: %w", err) 61 } 62 } 63 64 // Prune removes all unused system data. 65 func Prune(ctx context.Context, options *PruneOptions) (*entities.SystemPruneReport, error) { 66 var ( 67 report entities.SystemPruneReport 68 ) 69 conn, err := bindings.GetClient(ctx) 70 if err != nil { 71 return nil, err 72 } 73 params, err := options.ToParams() 74 if err != nil { 75 return nil, err 76 } 77 response, err := conn.DoRequest(ctx, nil, http.MethodPost, "/system/prune", params, nil) 78 if err != nil { 79 return nil, err 80 } 81 defer response.Body.Close() 82 83 return &report, response.Process(&report) 84 } 85 86 func Version(ctx context.Context, options *VersionOptions) (*entities.SystemVersionReport, error) { 87 var ( 88 component entities.ComponentVersion 89 report entities.SystemVersionReport 90 ) 91 if options == nil { 92 options = new(VersionOptions) 93 } 94 _ = options 95 version, err := define.GetVersion() 96 if err != nil { 97 return nil, err 98 } 99 report.Client = &version 100 101 conn, err := bindings.GetClient(ctx) 102 if err != nil { 103 return nil, err 104 } 105 response, err := conn.DoRequest(ctx, nil, http.MethodGet, "/version", nil, nil) 106 if err != nil { 107 return nil, err 108 } 109 defer response.Body.Close() 110 111 if err = response.Process(&component); err != nil { 112 return nil, err 113 } 114 115 b, _ := time.Parse(time.RFC3339, component.BuildTime) 116 report.Server = &define.Version{ 117 APIVersion: component.APIVersion, 118 Version: component.Version.Version, 119 GoVersion: component.GoVersion, 120 GitCommit: component.GitCommit, 121 BuiltTime: time.Unix(b.Unix(), 0).Format(time.ANSIC), 122 Built: b.Unix(), 123 OsArch: fmt.Sprintf("%s/%s", component.Os, component.Arch), 124 Os: component.Os, 125 } 126 127 for _, c := range component.Components { 128 if c.Name == "Podman Engine" { 129 report.Server.APIVersion = c.Details["APIVersion"] 130 } 131 } 132 return &report, err 133 } 134 135 // DiskUsage returns information about image, container, and volume disk 136 // consumption 137 func DiskUsage(ctx context.Context, options *DiskOptions) (*entities.SystemDfReport, error) { 138 var report entities.SystemDfReport 139 if options == nil { 140 options = new(DiskOptions) 141 } 142 _ = options 143 conn, err := bindings.GetClient(ctx) 144 if err != nil { 145 return nil, err 146 } 147 response, err := conn.DoRequest(ctx, nil, http.MethodGet, "/system/df", nil, nil) 148 if err != nil { 149 return nil, err 150 } 151 defer response.Body.Close() 152 153 return &report, response.Process(&report) 154 }