From e13b8356243a51b5dc9c5a0764fbc908aa4ec5c8 Mon Sep 17 00:00:00 2001 From: Felix Pojtinger Date: Wed, 15 Dec 2021 02:06:18 +0100 Subject: [PATCH] feat: Add event type and pre/post-index logging --- cmd/stbak/cmd/archive.go | 2 +- cmd/stbak/cmd/delete.go | 2 +- cmd/stbak/cmd/move.go | 2 +- cmd/stbak/cmd/restore.go | 2 +- cmd/stbak/cmd/update.go | 2 +- internal/logging/csv.go | 34 ++++++++++++++++++++++++++++++++++ pkg/config/constants.go | 6 ++++++ pkg/config/events.go | 9 +++++++++ pkg/operations/archive.go | 15 +++++++++++++-- pkg/operations/delete.go | 14 ++++++++++++-- pkg/operations/move.go | 14 ++++++++++++-- pkg/operations/operations.go | 5 ++--- pkg/operations/restore.go | 7 ++++++- pkg/operations/update.go | 21 ++++++++++++++++++--- 14 files changed, 117 insertions(+), 18 deletions(-) create mode 100644 pkg/config/events.go diff --git a/cmd/stbak/cmd/archive.go b/cmd/stbak/cmd/archive.go index 24c59d5..603b42b 100644 --- a/cmd/stbak/cmd/archive.go +++ b/cmd/stbak/cmd/archive.go @@ -102,7 +102,7 @@ var archiveCmd = &cobra.Command{ Password: viper.GetString(passwordFlag), }, - logging.NewLogger().PrintHeader, + logging.NewLogger().PrintHeaderEvent, ) if _, err := ops.Archive( diff --git a/cmd/stbak/cmd/delete.go b/cmd/stbak/cmd/delete.go index ed2df90..8f91434 100644 --- a/cmd/stbak/cmd/delete.go +++ b/cmd/stbak/cmd/delete.go @@ -89,7 +89,7 @@ var deleteCmd = &cobra.Command{ Password: viper.GetString(passwordFlag), }, - logging.NewLogger().PrintHeader, + logging.NewLogger().PrintHeaderEvent, ) return ops.Delete(viper.GetString(nameFlag)) diff --git a/cmd/stbak/cmd/move.go b/cmd/stbak/cmd/move.go index 4265a7a..1b7fcd3 100644 --- a/cmd/stbak/cmd/move.go +++ b/cmd/stbak/cmd/move.go @@ -85,7 +85,7 @@ var moveCmd = &cobra.Command{ Password: viper.GetString(passwordFlag), }, - logging.NewLogger().PrintHeader, + logging.NewLogger().PrintHeaderEvent, ) return ops.Move(viper.GetString(fromFlag), viper.GetString(toFlag)) diff --git a/cmd/stbak/cmd/restore.go b/cmd/stbak/cmd/restore.go index 6aa4a33..cc808bb 100644 --- a/cmd/stbak/cmd/restore.go +++ b/cmd/stbak/cmd/restore.go @@ -89,7 +89,7 @@ var restoreCmd = &cobra.Command{ Password: viper.GetString(passwordFlag), }, - logging.NewLogger().PrintHeader, + logging.NewLogger().PrintHeaderEvent, ) return ops.Restore( diff --git a/cmd/stbak/cmd/update.go b/cmd/stbak/cmd/update.go index 56d522b..97e7b5f 100644 --- a/cmd/stbak/cmd/update.go +++ b/cmd/stbak/cmd/update.go @@ -92,7 +92,7 @@ var updateCmd = &cobra.Command{ Password: viper.GetString(passwordFlag), }, - logging.NewLogger().PrintHeader, + logging.NewLogger().PrintHeaderEvent, ) if _, err := ops.Update( diff --git a/internal/logging/csv.go b/internal/logging/csv.go index 6cd3b63..463be57 100644 --- a/internal/logging/csv.go +++ b/internal/logging/csv.go @@ -7,12 +7,14 @@ import ( "time" models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" + "github.com/pojntfx/stfs/pkg/config" ) var ( tarHeaderCSV = []string{ "record", "lastknownrecord", "block", "lastknownblock", "typeflag", "name", "linkname", "size", "mode", "uid", "gid", "uname", "gname", "modtime", "accesstime", "changetime", "devmajor", "devminor", "paxrecords", "format", } + tarHeaderEventCSV = append([]string{"type", "indexed"}, tarHeaderCSV...) ) func headerToCSV(hdr *models.Header) []string { @@ -21,6 +23,24 @@ func headerToCSV(hdr *models.Header) []string { } } +func headerEventToCSV(event *config.HeaderEvent) []string { + headerType := "unknown" + switch event.Type { + case config.HeaderEventTypeArchive: + headerType = "archive" + case config.HeaderEventTypeDelete: + headerType = "delete" + case config.HeaderEventTypeMove: + headerType = "move" + case config.HeaderEventTypeRestore: + headerType = "restore" + case config.HeaderEventTypeUpdate: + headerType = "update" + } + + return append([]string{headerType, fmt.Sprintf("%v", event.Indexed)}, headerToCSV(event.Header)...) +} + type Logger struct { n int } @@ -42,3 +62,17 @@ func (l *Logger) PrintHeader(hdr *models.Header) { l.n++ } + +func (l *Logger) PrintHeaderEvent(event *config.HeaderEvent) { + w := csv.NewWriter(os.Stdout) + + if l.n <= 0 { + _ = w.Write(tarHeaderEventCSV) // Errors are ignored for compatibility with traditional logging APIs + } + + _ = w.Write(headerEventToCSV(event)) // Errors are ignored for compatibility with traditional logging APIs + + w.Flush() + + l.n++ +} diff --git a/pkg/config/constants.go b/pkg/config/constants.go index 5ac73ee..9cade01 100644 --- a/pkg/config/constants.go +++ b/pkg/config/constants.go @@ -20,6 +20,12 @@ const ( CompressionLevelFastest = "fastest" CompressionLevelBalanced = "balanced" CompressionLevelSmallest = "smallest" + + HeaderEventTypeArchive = 0 + HeaderEventTypeDelete = 1 + HeaderEventTypeMove = 2 + HeaderEventTypeRestore = 3 + HeaderEventTypeUpdate = 4 ) var ( diff --git a/pkg/config/events.go b/pkg/config/events.go new file mode 100644 index 0000000..de7a2af --- /dev/null +++ b/pkg/config/events.go @@ -0,0 +1,9 @@ +package config + +import models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" + +type HeaderEvent struct { + Type int + Indexed bool + Header *models.Header +} diff --git a/pkg/operations/archive.go b/pkg/operations/archive.go index 3ff646c..f9a4f2e 100644 --- a/pkg/operations/archive.go +++ b/pkg/operations/archive.go @@ -13,6 +13,7 @@ import ( "github.com/pojntfx/stfs/internal/compression" "github.com/pojntfx/stfs/internal/converters" + models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/internal/encryption" "github.com/pojntfx/stfs/internal/ioext" "github.com/pojntfx/stfs/internal/mtio" @@ -172,7 +173,11 @@ func (o *Operations) Archive( return err } - o.onHeader(dbhdr) + o.onHeader(&config.HeaderEvent{ + Type: config.HeaderEventTypeArchive, + Indexed: false, + Header: dbhdr, + }) } hdrToAppend := *hdr @@ -301,6 +306,12 @@ func (o *Operations) Archive( return nil // We sign above, no need to verify }, - o.onHeader, + func(hdr *models.Header) { + o.onHeader(&config.HeaderEvent{ + Type: config.HeaderEventTypeArchive, + Indexed: true, + Header: hdr, + }) + }, ) } diff --git a/pkg/operations/delete.go b/pkg/operations/delete.go index f2b382d..7e12c0b 100644 --- a/pkg/operations/delete.go +++ b/pkg/operations/delete.go @@ -71,7 +71,11 @@ func (o *Operations) Delete(name string) error { return err } - o.onHeader(dbhdr) + o.onHeader(&config.HeaderEvent{ + Type: config.HeaderEventTypeDelete, + Indexed: false, + Header: dbhdr, + }) } if err := signature.SignHeader(hdr, writer.DriveIsRegular, o.pipes.Signature, o.crypto.Identity); err != nil { @@ -135,6 +139,12 @@ func (o *Operations) Delete(name string) error { return nil // We sign above, no need to verify }, - o.onHeader, + func(hdr *models.Header) { + o.onHeader(&config.HeaderEvent{ + Type: config.HeaderEventTypeDelete, + Indexed: true, + Header: hdr, + }) + }, ) } diff --git a/pkg/operations/move.go b/pkg/operations/move.go index e3f29f9..4c361cf 100644 --- a/pkg/operations/move.go +++ b/pkg/operations/move.go @@ -74,7 +74,11 @@ func (o *Operations) Move(from string, to string) error { return err } - o.onHeader(dbhdr) + o.onHeader(&config.HeaderEvent{ + Type: config.HeaderEventTypeMove, + Indexed: false, + Header: dbhdr, + }) } if err := signature.SignHeader(hdr, writer.DriveIsRegular, o.pipes.Signature, o.crypto.Identity); err != nil { @@ -138,6 +142,12 @@ func (o *Operations) Move(from string, to string) error { return nil // We sign above, no need to verify }, - o.onHeader, + func(hdr *models.Header) { + o.onHeader(&config.HeaderEvent{ + Type: config.HeaderEventTypeMove, + Indexed: true, + Header: hdr, + }) + }, ) } diff --git a/pkg/operations/operations.go b/pkg/operations/operations.go index d609388..0ad8194 100644 --- a/pkg/operations/operations.go +++ b/pkg/operations/operations.go @@ -3,7 +3,6 @@ package operations import ( "sync" - models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/pkg/config" ) @@ -14,7 +13,7 @@ type Operations struct { pipes config.PipeConfig crypto config.CryptoConfig - onHeader func(hdr *models.Header) + onHeader func(event *config.HeaderEvent) diskOperationLock sync.Mutex } @@ -26,7 +25,7 @@ func NewOperations( pipes config.PipeConfig, crypto config.CryptoConfig, - onHeader func(hdr *models.Header), + onHeader func(event *config.HeaderEvent), ) *Operations { return &Operations{ backend: backend, diff --git a/pkg/operations/restore.go b/pkg/operations/restore.go index 5b469c8..1e4736b 100644 --- a/pkg/operations/restore.go +++ b/pkg/operations/restore.go @@ -9,6 +9,7 @@ import ( "strings" models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" + "github.com/pojntfx/stfs/pkg/config" "github.com/pojntfx/stfs/pkg/recovery" ) @@ -57,7 +58,11 @@ func (o *Operations) Restore(from string, to string, flatten bool) error { for _, dbhdr := range headersToRestore { if o.onHeader != nil { - o.onHeader(dbhdr) + o.onHeader(&config.HeaderEvent{ + Type: config.HeaderEventTypeRestore, + Indexed: true, + Header: dbhdr, + }) } dst := dbhdr.Name diff --git a/pkg/operations/update.go b/pkg/operations/update.go index 9d02931..ea4e926 100644 --- a/pkg/operations/update.go +++ b/pkg/operations/update.go @@ -11,6 +11,7 @@ import ( "github.com/pojntfx/stfs/internal/compression" "github.com/pojntfx/stfs/internal/converters" + models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/internal/encryption" "github.com/pojntfx/stfs/internal/ioext" "github.com/pojntfx/stfs/internal/mtio" @@ -165,7 +166,11 @@ func (o *Operations) Update( return err } - o.onHeader(dbhdr) + o.onHeader(&config.HeaderEvent{ + Type: config.HeaderEventTypeUpdate, + Indexed: false, + Header: dbhdr, + }) } hdrToAppend := *hdr @@ -244,7 +249,11 @@ func (o *Operations) Update( return err } - o.onHeader(dbhdr) + o.onHeader(&config.HeaderEvent{ + Type: config.HeaderEventTypeUpdate, + Indexed: false, + Header: dbhdr, + }) } hdrToAppend := *hdr @@ -316,6 +325,12 @@ func (o *Operations) Update( return nil // We sign above, no need to verify }, - o.onHeader, + func(hdr *models.Header) { + o.onHeader(&config.HeaderEvent{ + Type: config.HeaderEventTypeUpdate, + Indexed: true, + Header: hdr, + }) + }, ) }