From 479def3d80db0e6074ccdd910f5bbd1637fac6da Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Wed, 15 Dec 2021 01:33:01 +0100 Subject: [PATCH] refactor: Introduce config struct for operations --- cmd/stbak/cmd/archive.go | 22 +++++++++--------- cmd/stbak/cmd/delete.go | 22 +++++++++--------- cmd/stbak/cmd/move.go | 22 +++++++++--------- cmd/stbak/cmd/restore.go | 22 +++++++++--------- cmd/stbak/cmd/update.go | 22 +++++++++--------- pkg/config/config.go | 12 ++++++++++ pkg/operations/archive.go | 30 ++++++++++++------------- pkg/operations/delete.go | 26 ++++++++++------------ pkg/operations/move.go | 26 ++++++++++------------ pkg/operations/operations.go | 43 +++++------------------------------- pkg/operations/restore.go | 16 +++++++------- pkg/operations/update.go | 30 ++++++++++++------------- 12 files changed, 138 insertions(+), 155 deletions(-) diff --git a/cmd/stbak/cmd/archive.go b/cmd/stbak/cmd/archive.go index 80480b2..24c59d5 100644 --- a/cmd/stbak/cmd/archive.go +++ b/cmd/stbak/cmd/archive.go @@ -76,21 +76,25 @@ var archiveCmd = &cobra.Command{ } ops := operations.NewOperations( - tm.GetWriter, - tm.Close, + config.BackendConfig{ + GetWriter: tm.GetWriter, + CloseWriter: tm.Close, - tm.GetReader, - tm.Close, + GetReader: tm.GetReader, + CloseReader: tm.Close, - tm.GetDrive, - tm.Close, - - metadataPersister, + GetDrive: tm.GetDrive, + CloseDrive: tm.Close, + }, + config.MetadataConfig{ + Metadata: metadataPersister, + }, config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), Signature: viper.GetString(signatureFlag), + RecordSize: viper.GetInt(recordSizeFlag), }, config.CryptoConfig{ Recipient: recipient, @@ -98,8 +102,6 @@ var archiveCmd = &cobra.Command{ Password: viper.GetString(passwordFlag), }, - viper.GetInt(recordSizeFlag), - logging.NewLogger().PrintHeader, ) diff --git a/cmd/stbak/cmd/delete.go b/cmd/stbak/cmd/delete.go index 25764f4..ed2df90 100644 --- a/cmd/stbak/cmd/delete.go +++ b/cmd/stbak/cmd/delete.go @@ -63,21 +63,25 @@ var deleteCmd = &cobra.Command{ } ops := operations.NewOperations( - tm.GetWriter, - tm.Close, + config.BackendConfig{ + GetWriter: tm.GetWriter, + CloseWriter: tm.Close, - tm.GetReader, - tm.Close, + GetReader: tm.GetReader, + CloseReader: tm.Close, - tm.GetDrive, - tm.Close, - - metadataPersister, + GetDrive: tm.GetDrive, + CloseDrive: tm.Close, + }, + config.MetadataConfig{ + Metadata: metadataPersister, + }, config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), Signature: viper.GetString(signatureFlag), + RecordSize: viper.GetInt(recordSizeFlag), }, config.CryptoConfig{ Recipient: recipient, @@ -85,8 +89,6 @@ var deleteCmd = &cobra.Command{ Password: viper.GetString(passwordFlag), }, - viper.GetInt(recordSizeFlag), - logging.NewLogger().PrintHeader, ) diff --git a/cmd/stbak/cmd/move.go b/cmd/stbak/cmd/move.go index fa270b2..4265a7a 100644 --- a/cmd/stbak/cmd/move.go +++ b/cmd/stbak/cmd/move.go @@ -59,21 +59,25 @@ var moveCmd = &cobra.Command{ } ops := operations.NewOperations( - tm.GetWriter, - tm.Close, + config.BackendConfig{ + GetWriter: tm.GetWriter, + CloseWriter: tm.Close, - tm.GetReader, - tm.Close, + GetReader: tm.GetReader, + CloseReader: tm.Close, - tm.GetDrive, - tm.Close, - - metadataPersister, + GetDrive: tm.GetDrive, + CloseDrive: tm.Close, + }, + config.MetadataConfig{ + Metadata: metadataPersister, + }, config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), Signature: viper.GetString(signatureFlag), + RecordSize: viper.GetInt(recordSizeFlag), }, config.CryptoConfig{ Recipient: recipient, @@ -81,8 +85,6 @@ var moveCmd = &cobra.Command{ Password: viper.GetString(passwordFlag), }, - viper.GetInt(recordSizeFlag), - logging.NewLogger().PrintHeader, ) diff --git a/cmd/stbak/cmd/restore.go b/cmd/stbak/cmd/restore.go index df45818..6aa4a33 100644 --- a/cmd/stbak/cmd/restore.go +++ b/cmd/stbak/cmd/restore.go @@ -63,21 +63,25 @@ var restoreCmd = &cobra.Command{ } ops := operations.NewOperations( - tm.GetWriter, - tm.Close, + config.BackendConfig{ + GetWriter: tm.GetWriter, + CloseWriter: tm.Close, - tm.GetReader, - tm.Close, + GetReader: tm.GetReader, + CloseReader: tm.Close, - tm.GetDrive, - tm.Close, - - metadataPersister, + GetDrive: tm.GetDrive, + CloseDrive: tm.Close, + }, + config.MetadataConfig{ + Metadata: metadataPersister, + }, config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), Signature: viper.GetString(signatureFlag), + RecordSize: viper.GetInt(recordSizeFlag), }, config.CryptoConfig{ Recipient: recipient, @@ -85,8 +89,6 @@ var restoreCmd = &cobra.Command{ Password: viper.GetString(passwordFlag), }, - viper.GetInt(recordSizeFlag), - logging.NewLogger().PrintHeader, ) diff --git a/cmd/stbak/cmd/update.go b/cmd/stbak/cmd/update.go index c3e3484..56d522b 100644 --- a/cmd/stbak/cmd/update.go +++ b/cmd/stbak/cmd/update.go @@ -66,21 +66,25 @@ var updateCmd = &cobra.Command{ } ops := operations.NewOperations( - tm.GetWriter, - tm.Close, + config.BackendConfig{ + GetWriter: tm.GetWriter, + CloseWriter: tm.Close, - tm.GetReader, - tm.Close, + GetReader: tm.GetReader, + CloseReader: tm.Close, - tm.GetDrive, - tm.Close, - - metadataPersister, + GetDrive: tm.GetDrive, + CloseDrive: tm.Close, + }, + config.MetadataConfig{ + Metadata: metadataPersister, + }, config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), Signature: viper.GetString(signatureFlag), + RecordSize: viper.GetInt(recordSizeFlag), }, config.CryptoConfig{ Recipient: recipient, @@ -88,8 +92,6 @@ var updateCmd = &cobra.Command{ Password: viper.GetString(passwordFlag), }, - viper.GetInt(recordSizeFlag), - logging.NewLogger().PrintHeader, ) diff --git a/pkg/config/config.go b/pkg/config/config.go index 53762a6..2a89763 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -22,6 +22,17 @@ type DriveConfig struct { DriveIsRegular bool } +type BackendConfig struct { + GetWriter func() (DriveWriterConfig, error) + CloseWriter func() error + + GetReader func() (DriveReaderConfig, error) + CloseReader func() error + + GetDrive func() (DriveConfig, error) + CloseDrive func() error +} + type MetadataConfig struct { Metadata *persisters.MetadataPersister } @@ -30,6 +41,7 @@ type PipeConfig struct { Compression string Encryption string Signature string + RecordSize int } type CryptoConfig struct { diff --git a/pkg/operations/archive.go b/pkg/operations/archive.go index b824944..3ff646c 100644 --- a/pkg/operations/archive.go +++ b/pkg/operations/archive.go @@ -37,13 +37,13 @@ func (o *Operations) Archive( o.diskOperationLock.Lock() defer o.diskOperationLock.Unlock() - writer, err := o.getWriter() + writer, err := o.backend.GetWriter() if err != nil { return []*tar.Header{}, err } dirty := false - tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, o.recordSize) + tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, o.pipes.RecordSize) if err != nil { return []*tar.Header{}, err } @@ -51,7 +51,7 @@ func (o *Operations) Archive( lastIndexedRecord := int64(0) lastIndexedBlock := int64(0) if !overwrite { - lastIndexedRecord, lastIndexedBlock, err = o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), o.recordSize) + lastIndexedRecord, lastIndexedBlock, err = o.metadata.Metadata.GetLastIndexedRecordAndBlock(context.Background(), o.pipes.RecordSize) if err != nil { return []*tar.Header{}, err } @@ -103,7 +103,7 @@ func (o *Operations) Archive( o.pipes.Compression, compressionLevel, writer.DriveIsRegular, - o.recordSize, + o.pipes.RecordSize, ) if err != nil { return err @@ -124,7 +124,7 @@ func (o *Operations) Archive( return err } } else { - buf := make([]byte, mtio.BlockSize*o.recordSize) + buf := make([]byte, mtio.BlockSize*o.pipes.RecordSize) if _, err := io.CopyBuffer(compressor, signer, buf); err != nil { return err } @@ -207,7 +207,7 @@ func (o *Operations) Archive( o.pipes.Compression, compressionLevel, writer.DriveIsRegular, - o.recordSize, + o.pipes.RecordSize, ) if err != nil { return err @@ -223,7 +223,7 @@ func (o *Operations) Archive( return err } } else { - buf := make([]byte, mtio.BlockSize*o.recordSize) + buf := make([]byte, mtio.BlockSize*o.pipes.RecordSize) if _, err := io.CopyBuffer(compressor, file, buf); err != nil { return err } @@ -259,32 +259,30 @@ func (o *Operations) Archive( index = 0 // If we are starting fresh, index from start } - if err := o.closeWriter(); err != nil { + if err := o.backend.CloseWriter(); err != nil { return []*tar.Header{}, err } - reader, err := o.getReader() + reader, err := o.backend.GetReader() if err != nil { return []*tar.Header{}, err } - defer o.closeReader() + defer o.backend.CloseReader() - drive, err := o.getDrive() + drive, err := o.backend.GetDrive() if err != nil { return []*tar.Header{}, err } - defer o.closeDrive() + defer o.backend.CloseDrive() return hdrs, recovery.Index( reader, drive, - config.MetadataConfig{ - Metadata: o.metadataPersister, - }, + o.metadata, o.pipes, o.crypto, - o.recordSize, + o.pipes.RecordSize, int(lastIndexedRecord), int(lastIndexedBlock), overwrite, diff --git a/pkg/operations/delete.go b/pkg/operations/delete.go index 8055544..f2b382d 100644 --- a/pkg/operations/delete.go +++ b/pkg/operations/delete.go @@ -18,24 +18,24 @@ func (o *Operations) Delete(name string) error { o.diskOperationLock.Lock() defer o.diskOperationLock.Unlock() - writer, err := o.getWriter() + writer, err := o.backend.GetWriter() if err != nil { return err } dirty := false - tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, o.recordSize) + tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, o.pipes.RecordSize) if err != nil { return err } - lastIndexedRecord, lastIndexedBlock, err := o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), o.recordSize) + lastIndexedRecord, lastIndexedBlock, err := o.metadata.Metadata.GetLastIndexedRecordAndBlock(context.Background(), o.pipes.RecordSize) if err != nil { return err } headersToDelete := []*models.Header{} - dbhdr, err := o.metadataPersister.GetHeader(context.Background(), name) + dbhdr, err := o.metadata.Metadata.GetHeader(context.Background(), name) if err != nil { return err } @@ -43,7 +43,7 @@ func (o *Operations) Delete(name string) error { // If the header refers to a directory, get it's children if dbhdr.Typeflag == tar.TypeDir { - dbhdrs, err := o.metadataPersister.GetHeaderChildren(context.Background(), name) + dbhdrs, err := o.metadata.Metadata.GetHeaderChildren(context.Background(), name) if err != nil { return err } @@ -93,32 +93,30 @@ func (o *Operations) Delete(name string) error { return err } - if err := o.closeWriter(); err != nil { + if err := o.backend.CloseWriter(); err != nil { return err } - reader, err := o.getReader() + reader, err := o.backend.GetReader() if err != nil { return err } - defer o.closeReader() + defer o.backend.CloseReader() - drive, err := o.getDrive() + drive, err := o.backend.GetDrive() if err != nil { return err } - defer o.closeDrive() + defer o.backend.CloseDrive() return recovery.Index( reader, drive, - config.MetadataConfig{ - Metadata: o.metadataPersister, - }, + o.metadata, o.pipes, o.crypto, - o.recordSize, + o.pipes.RecordSize, int(lastIndexedRecord), int(lastIndexedBlock), false, diff --git a/pkg/operations/move.go b/pkg/operations/move.go index fc22620..e3f29f9 100644 --- a/pkg/operations/move.go +++ b/pkg/operations/move.go @@ -19,24 +19,24 @@ func (o *Operations) Move(from string, to string) error { o.diskOperationLock.Lock() defer o.diskOperationLock.Unlock() - writer, err := o.getWriter() + writer, err := o.backend.GetWriter() if err != nil { return err } dirty := false - tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, o.recordSize) + tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, o.pipes.RecordSize) if err != nil { return err } - lastIndexedRecord, lastIndexedBlock, err := o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), o.recordSize) + lastIndexedRecord, lastIndexedBlock, err := o.metadata.Metadata.GetLastIndexedRecordAndBlock(context.Background(), o.pipes.RecordSize) if err != nil { return err } headersToMove := []*models.Header{} - dbhdr, err := o.metadataPersister.GetHeader(context.Background(), from) + dbhdr, err := o.metadata.Metadata.GetHeader(context.Background(), from) if err != nil { return err } @@ -44,7 +44,7 @@ func (o *Operations) Move(from string, to string) error { // If the header refers to a directory, get it's children if dbhdr.Typeflag == tar.TypeDir { - dbhdrs, err := o.metadataPersister.GetHeaderChildren(context.Background(), from) + dbhdrs, err := o.metadata.Metadata.GetHeaderChildren(context.Background(), from) if err != nil { return err } @@ -96,32 +96,30 @@ func (o *Operations) Move(from string, to string) error { return err } - if err := o.closeWriter(); err != nil { + if err := o.backend.CloseWriter(); err != nil { return err } - reader, err := o.getReader() + reader, err := o.backend.GetReader() if err != nil { return err } - defer o.closeReader() + defer o.backend.CloseReader() - drive, err := o.getDrive() + drive, err := o.backend.GetDrive() if err != nil { return err } - defer o.closeDrive() + defer o.backend.CloseDrive() return recovery.Index( reader, drive, - config.MetadataConfig{ - Metadata: o.metadataPersister, - }, + o.metadata, o.pipes, o.crypto, - o.recordSize, + o.pipes.RecordSize, int(lastIndexedRecord), int(lastIndexedBlock), false, diff --git a/pkg/operations/operations.go b/pkg/operations/operations.go index e8b165b..d609388 100644 --- a/pkg/operations/operations.go +++ b/pkg/operations/operations.go @@ -4,68 +4,37 @@ import ( "sync" models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" - "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/pkg/config" ) type Operations struct { - getWriter func() (config.DriveWriterConfig, error) - closeWriter func() error - - getReader func() (config.DriveReaderConfig, error) - closeReader func() error - - getDrive func() (config.DriveConfig, error) - closeDrive func() error - - metadataPersister *persisters.MetadataPersister + backend config.BackendConfig + metadata config.MetadataConfig pipes config.PipeConfig crypto config.CryptoConfig - recordSize int - onHeader func(hdr *models.Header) diskOperationLock sync.Mutex } func NewOperations( - getWriter func() (config.DriveWriterConfig, error), - closeWriter func() error, - - getReader func() (config.DriveReaderConfig, error), - closeReader func() error, - - getDrive func() (config.DriveConfig, error), - closeDrive func() error, - - metadataPersister *persisters.MetadataPersister, + backend config.BackendConfig, + metadata config.MetadataConfig, pipes config.PipeConfig, crypto config.CryptoConfig, - recordSize int, - onHeader func(hdr *models.Header), ) *Operations { return &Operations{ - getWriter: getWriter, - closeWriter: closeWriter, - - getReader: getReader, - closeReader: closeReader, - - getDrive: getDrive, - closeDrive: closeDrive, - - metadataPersister: metadataPersister, + backend: backend, + metadata: metadata, pipes: pipes, crypto: crypto, - recordSize: recordSize, - onHeader: onHeader, } } diff --git a/pkg/operations/restore.go b/pkg/operations/restore.go index ddbd4ea..5b469c8 100644 --- a/pkg/operations/restore.go +++ b/pkg/operations/restore.go @@ -18,12 +18,12 @@ func (o *Operations) Restore(from string, to string, flatten bool) error { headersToRestore := []*models.Header{} src := strings.TrimSuffix(from, "/") - dbhdr, err := o.metadataPersister.GetHeader(context.Background(), src) + dbhdr, err := o.metadata.Metadata.GetHeader(context.Background(), src) if err != nil { if err == sql.ErrNoRows { src = src + "/" - dbhdr, err = o.metadataPersister.GetHeader(context.Background(), src) + dbhdr, err = o.metadata.Metadata.GetHeader(context.Background(), src) if err != nil { return err } @@ -35,7 +35,7 @@ func (o *Operations) Restore(from string, to string, flatten bool) error { // If the header refers to a directory, get it's children if dbhdr.Typeflag == tar.TypeDir { - dbhdrs, err := o.metadataPersister.GetHeaderChildren(context.Background(), src) + dbhdrs, err := o.metadata.Metadata.GetHeaderChildren(context.Background(), src) if err != nil { return err } @@ -43,17 +43,17 @@ func (o *Operations) Restore(from string, to string, flatten bool) error { headersToRestore = append(headersToRestore, dbhdrs...) } - reader, err := o.getReader() + reader, err := o.backend.GetReader() if err != nil { return err } - defer o.closeReader() + defer o.backend.CloseReader() - drive, err := o.getDrive() + drive, err := o.backend.GetDrive() if err != nil { return err } - defer o.closeDrive() + defer o.backend.CloseDrive() for _, dbhdr := range headersToRestore { if o.onHeader != nil { @@ -79,7 +79,7 @@ func (o *Operations) Restore(from string, to string, flatten bool) error { o.pipes, o.crypto, - o.recordSize, + o.pipes.RecordSize, int(dbhdr.Record), int(dbhdr.Block), dst, diff --git a/pkg/operations/update.go b/pkg/operations/update.go index b580d0f..9d02931 100644 --- a/pkg/operations/update.go +++ b/pkg/operations/update.go @@ -31,18 +31,18 @@ func (o *Operations) Update( o.diskOperationLock.Lock() defer o.diskOperationLock.Unlock() - writer, err := o.getWriter() + writer, err := o.backend.GetWriter() if err != nil { return []*tar.Header{}, err } dirty := false - tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, o.recordSize) + tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, o.pipes.RecordSize) if err != nil { return []*tar.Header{}, err } - lastIndexedRecord, lastIndexedBlock, err := o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), o.recordSize) + lastIndexedRecord, lastIndexedBlock, err := o.metadata.Metadata.GetLastIndexedRecordAndBlock(context.Background(), o.pipes.RecordSize) if err != nil { return []*tar.Header{}, err } @@ -93,7 +93,7 @@ func (o *Operations) Update( o.pipes.Compression, compressionLevel, writer.DriveIsRegular, - o.recordSize, + o.pipes.RecordSize, ) if err != nil { return err @@ -114,7 +114,7 @@ func (o *Operations) Update( return err } } else { - buf := make([]byte, mtio.BlockSize*o.recordSize) + buf := make([]byte, mtio.BlockSize*o.pipes.RecordSize) if _, err := io.CopyBuffer(compressor, signer, buf); err != nil { return err } @@ -198,7 +198,7 @@ func (o *Operations) Update( o.pipes.Compression, compressionLevel, writer.DriveIsRegular, - o.recordSize, + o.pipes.RecordSize, ) if err != nil { return err @@ -214,7 +214,7 @@ func (o *Operations) Update( return err } } else { - buf := make([]byte, mtio.BlockSize*o.recordSize) + buf := make([]byte, mtio.BlockSize*o.pipes.RecordSize) if _, err := io.CopyBuffer(compressor, file, buf); err != nil { return err } @@ -274,32 +274,30 @@ func (o *Operations) Update( return []*tar.Header{}, err } - if err := o.closeWriter(); err != nil { + if err := o.backend.CloseWriter(); err != nil { return []*tar.Header{}, err } - reader, err := o.getReader() + reader, err := o.backend.GetReader() if err != nil { return []*tar.Header{}, err } - defer o.closeReader() + defer o.backend.CloseReader() - drive, err := o.getDrive() + drive, err := o.backend.GetDrive() if err != nil { return []*tar.Header{}, err } - defer o.closeDrive() + defer o.backend.CloseDrive() return hdrs, recovery.Index( reader, drive, - config.MetadataConfig{ - Metadata: o.metadataPersister, - }, + o.metadata, o.pipes, o.crypto, - o.recordSize, + o.pipes.RecordSize, int(lastIndexedRecord), int(lastIndexedBlock), false,