mirror of
https://github.com/kopia/kopia.git
synced 2026-01-28 16:23:04 -05:00
This helps recycle buffers more efficiently during snapshots. Also, improved memory tracking, enabled profiling flags and added pprof by default.
84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
package cli
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/kopia/kopia/internal/gather"
|
|
"github.com/kopia/kopia/repo"
|
|
)
|
|
|
|
type commandLogsShow struct {
|
|
logSessionIDs []string
|
|
|
|
crit logSelectionCriteria
|
|
out textOutput
|
|
}
|
|
|
|
func (c *commandLogsShow) setup(svc appServices, parent commandParent) {
|
|
cmd := parent.Command("show", "Show contents of the log.").Alias("cat")
|
|
|
|
cmd.Arg("session-id", "Log Session ID to show").StringsVar(&c.logSessionIDs)
|
|
|
|
cmd.Action(svc.directRepositoryReadAction(c.run))
|
|
|
|
c.crit.setup(cmd)
|
|
c.out.setup(svc)
|
|
}
|
|
|
|
func (c *commandLogsShow) run(ctx context.Context, rep repo.DirectRepository) error {
|
|
sessions, err := getLogSessions(ctx, rep.BlobReader())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
sessions = c.crit.filterLogSessions(sessions)
|
|
|
|
if len(c.logSessionIDs) > 0 {
|
|
sessions = filterLogSessions(sessions, func(l *logSessionInfo) bool {
|
|
for _, sid := range c.logSessionIDs {
|
|
if l.id == sid {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
})
|
|
}
|
|
|
|
if len(sessions) == 0 {
|
|
return errors.Errorf("no logs found")
|
|
}
|
|
|
|
// by default show latest one
|
|
if !c.crit.any() {
|
|
sessions = sessions[len(sessions)-1:]
|
|
log(ctx).Infof("Showing latest log (%v)", formatTimestamp(sessions[0].startTime))
|
|
}
|
|
|
|
var data gather.WriteBuffer
|
|
defer data.Close()
|
|
|
|
var decrypted gather.WriteBuffer
|
|
defer decrypted.Close()
|
|
|
|
for _, s := range sessions {
|
|
for _, bm := range s.segments {
|
|
if err := rep.BlobReader().GetBlob(ctx, bm.BlobID, 0, -1, &data); err != nil {
|
|
return errors.Wrap(err, "error getting log")
|
|
}
|
|
|
|
if err := rep.Crypter().DecryptBLOB(data.Bytes(), bm.BlobID, &decrypted); err != nil {
|
|
return errors.Wrap(err, "error decrypting log")
|
|
}
|
|
|
|
if err := showContentWithFlags(c.out.stdout(), decrypted.Bytes().Reader(), true, false); err != nil {
|
|
log(ctx).Errorf("error showing log: %v", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|