feat: Add event type and pre/post-index logging

This commit is contained in:
Felicitas Pojtinger
2021-12-15 02:06:18 +01:00
parent 479def3d80
commit ae7e418891
14 changed files with 117 additions and 18 deletions

View File

@@ -102,7 +102,7 @@ var archiveCmd = &cobra.Command{
Password: viper.GetString(passwordFlag),
},
logging.NewLogger().PrintHeader,
logging.NewLogger().PrintHeaderEvent,
)
if _, err := ops.Archive(

View File

@@ -89,7 +89,7 @@ var deleteCmd = &cobra.Command{
Password: viper.GetString(passwordFlag),
},
logging.NewLogger().PrintHeader,
logging.NewLogger().PrintHeaderEvent,
)
return ops.Delete(viper.GetString(nameFlag))

View File

@@ -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))

View File

@@ -89,7 +89,7 @@ var restoreCmd = &cobra.Command{
Password: viper.GetString(passwordFlag),
},
logging.NewLogger().PrintHeader,
logging.NewLogger().PrintHeaderEvent,
)
return ops.Restore(

View File

@@ -92,7 +92,7 @@ var updateCmd = &cobra.Command{
Password: viper.GetString(passwordFlag),
},
logging.NewLogger().PrintHeader,
logging.NewLogger().PrintHeaderEvent,
)
if _, err := ops.Update(

View File

@@ -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++
}

View File

@@ -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
View 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
}

View File

@@ -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,
})
},
)
}

View File

@@ -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,
})
},
)
}

View File

@@ -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,
})
},
)
}

View File

@@ -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,

View File

@@ -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

View File

@@ -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,
})
},
)
}