feat: Add event type and pre/post-index logging
This commit is contained in:
@@ -102,7 +102,7 @@ var archiveCmd = &cobra.Command{
|
||||
Password: viper.GetString(passwordFlag),
|
||||
},
|
||||
|
||||
logging.NewLogger().PrintHeader,
|
||||
logging.NewLogger().PrintHeaderEvent,
|
||||
)
|
||||
|
||||
if _, err := ops.Archive(
|
||||
|
||||
@@ -89,7 +89,7 @@ var deleteCmd = &cobra.Command{
|
||||
Password: viper.GetString(passwordFlag),
|
||||
},
|
||||
|
||||
logging.NewLogger().PrintHeader,
|
||||
logging.NewLogger().PrintHeaderEvent,
|
||||
)
|
||||
|
||||
return ops.Delete(viper.GetString(nameFlag))
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -89,7 +89,7 @@ var restoreCmd = &cobra.Command{
|
||||
Password: viper.GetString(passwordFlag),
|
||||
},
|
||||
|
||||
logging.NewLogger().PrintHeader,
|
||||
logging.NewLogger().PrintHeaderEvent,
|
||||
)
|
||||
|
||||
return ops.Restore(
|
||||
|
||||
@@ -92,7 +92,7 @@ var updateCmd = &cobra.Command{
|
||||
Password: viper.GetString(passwordFlag),
|
||||
},
|
||||
|
||||
logging.NewLogger().PrintHeader,
|
||||
logging.NewLogger().PrintHeaderEvent,
|
||||
)
|
||||
|
||||
if _, err := ops.Update(
|
||||
|
||||
@@ -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++
|
||||
}
|
||||
|
||||
@@ -20,6 +20,12 @@ const (
|
||||
CompressionLevelFastest = "fastest"
|
||||
CompressionLevelBalanced = "balanced"
|
||||
CompressionLevelSmallest = "smallest"
|
||||
|
||||
HeaderEventTypeArchive = 0
|
||||
HeaderEventTypeDelete = 1
|
||||
HeaderEventTypeMove = 2
|
||||
HeaderEventTypeRestore = 3
|
||||
HeaderEventTypeUpdate = 4
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
9
pkg/config/events.go
Normal file
9
pkg/config/events.go
Normal file
@@ -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
|
||||
}
|
||||
@@ -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,
|
||||
})
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user