From 1ea34eb02a382b4f05cc223a7023103d78920b12 Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Wed, 15 Dec 2021 01:18:12 +0100 Subject: [PATCH] refactor: Decompose all redudant parameters into `Operations` struct --- cmd/stbak/cmd/archive.go | 9 +++--- cmd/stbak/cmd/delete.go | 5 ++-- cmd/stbak/cmd/move.go | 6 ++-- cmd/stbak/cmd/restore.go | 9 +++--- cmd/stbak/cmd/update.go | 11 +++---- pkg/operations/archive.go | 47 +++++++++++++---------------- pkg/operations/delete.go | 30 +++++++------------ pkg/operations/move.go | 31 +++++++------------- pkg/operations/operations.go | 22 ++++++++++++++ pkg/operations/restore.go | 23 ++++----------- pkg/operations/update.go | 57 ++++++++++++++++-------------------- 11 files changed, 115 insertions(+), 135 deletions(-) diff --git a/cmd/stbak/cmd/archive.go b/cmd/stbak/cmd/archive.go index f3d6bf3..80480b2 100644 --- a/cmd/stbak/cmd/archive.go +++ b/cmd/stbak/cmd/archive.go @@ -86,9 +86,7 @@ var archiveCmd = &cobra.Command{ tm.Close, metadataPersister, - ) - if _, err := ops.Archive( config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), @@ -101,11 +99,14 @@ var archiveCmd = &cobra.Command{ }, viper.GetInt(recordSizeFlag), + + logging.NewLogger().PrintHeader, + ) + + if _, err := ops.Archive( viper.GetString(fromFlag), viper.GetString(compressionLevelFlag), viper.GetBool(overwriteFlag), - - logging.NewLogger().PrintHeader, ); err != nil { return err } diff --git a/cmd/stbak/cmd/delete.go b/cmd/stbak/cmd/delete.go index 3f614a9..25764f4 100644 --- a/cmd/stbak/cmd/delete.go +++ b/cmd/stbak/cmd/delete.go @@ -73,9 +73,7 @@ var deleteCmd = &cobra.Command{ tm.Close, metadataPersister, - ) - return ops.Delete( config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), @@ -88,10 +86,11 @@ var deleteCmd = &cobra.Command{ }, viper.GetInt(recordSizeFlag), - viper.GetString(nameFlag), logging.NewLogger().PrintHeader, ) + + return ops.Delete(viper.GetString(nameFlag)) }, } diff --git a/cmd/stbak/cmd/move.go b/cmd/stbak/cmd/move.go index 0062df6..fa270b2 100644 --- a/cmd/stbak/cmd/move.go +++ b/cmd/stbak/cmd/move.go @@ -69,9 +69,7 @@ var moveCmd = &cobra.Command{ tm.Close, metadataPersister, - ) - return ops.Move( config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), @@ -84,11 +82,11 @@ var moveCmd = &cobra.Command{ }, viper.GetInt(recordSizeFlag), - viper.GetString(fromFlag), - viper.GetString(toFlag), logging.NewLogger().PrintHeader, ) + + return ops.Move(viper.GetString(fromFlag), viper.GetString(toFlag)) }, } diff --git a/cmd/stbak/cmd/restore.go b/cmd/stbak/cmd/restore.go index 37ed5a7..df45818 100644 --- a/cmd/stbak/cmd/restore.go +++ b/cmd/stbak/cmd/restore.go @@ -73,9 +73,7 @@ var restoreCmd = &cobra.Command{ tm.Close, metadataPersister, - ) - return ops.Restore( config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), @@ -88,11 +86,14 @@ var restoreCmd = &cobra.Command{ }, viper.GetInt(recordSizeFlag), + + logging.NewLogger().PrintHeader, + ) + + return ops.Restore( viper.GetString(fromFlag), viper.GetString(toFlag), viper.GetBool(flattenFlag), - - logging.NewLogger().PrintHeader, ) }, } diff --git a/cmd/stbak/cmd/update.go b/cmd/stbak/cmd/update.go index 795e998..c3e3484 100644 --- a/cmd/stbak/cmd/update.go +++ b/cmd/stbak/cmd/update.go @@ -76,9 +76,7 @@ var updateCmd = &cobra.Command{ tm.Close, metadataPersister, - ) - if _, err := ops.Update( config.PipeConfig{ Compression: viper.GetString(compressionFlag), Encryption: viper.GetString(encryptionFlag), @@ -91,11 +89,14 @@ var updateCmd = &cobra.Command{ }, viper.GetInt(recordSizeFlag), - viper.GetString(fromFlag), - viper.GetBool(overwriteFlag), - viper.GetString(compressionLevelFlag), logging.NewLogger().PrintHeader, + ) + + if _, err := ops.Update( + viper.GetString(fromFlag), + viper.GetString(compressionLevelFlag), + viper.GetBool(overwriteFlag), ); err != nil { return err } diff --git a/pkg/operations/archive.go b/pkg/operations/archive.go index 3e5f9a4..b824944 100644 --- a/pkg/operations/archive.go +++ b/pkg/operations/archive.go @@ -13,7 +13,6 @@ 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" @@ -31,15 +30,9 @@ var ( ) func (o *Operations) Archive( - pipes config.PipeConfig, - crypto config.CryptoConfig, - - recordSize int, from string, compressionLevel string, overwrite bool, - - onHeader func(hdr *models.Header), ) ([]*tar.Header, error) { o.diskOperationLock.Lock() defer o.diskOperationLock.Unlock() @@ -50,7 +43,7 @@ func (o *Operations) Archive( } dirty := false - tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, recordSize) + tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, o.recordSize) if err != nil { return []*tar.Header{}, err } @@ -58,7 +51,7 @@ func (o *Operations) Archive( lastIndexedRecord := int64(0) lastIndexedBlock := int64(0) if !overwrite { - lastIndexedRecord, lastIndexedBlock, err = o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), recordSize) + lastIndexedRecord, lastIndexedBlock, err = o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), o.recordSize) if err != nil { return []*tar.Header{}, err } @@ -100,17 +93,17 @@ func (o *Operations) Archive( Writer: io.Discard, } - encryptor, err := encryption.Encrypt(fileSizeCounter, pipes.Encryption, crypto.Recipient) + encryptor, err := encryption.Encrypt(fileSizeCounter, o.pipes.Encryption, o.crypto.Recipient) if err != nil { return err } compressor, err := compression.Compress( encryptor, - pipes.Compression, + o.pipes.Compression, compressionLevel, writer.DriveIsRegular, - recordSize, + o.recordSize, ) if err != nil { return err @@ -121,7 +114,7 @@ func (o *Operations) Archive( return err } - signer, sign, err := signature.Sign(file, writer.DriveIsRegular, pipes.Signature, crypto.Identity) + signer, sign, err := signature.Sign(file, writer.DriveIsRegular, o.pipes.Signature, o.crypto.Identity) if err != nil { return err } @@ -131,7 +124,7 @@ func (o *Operations) Archive( return err } } else { - buf := make([]byte, mtio.BlockSize*recordSize) + buf := make([]byte, mtio.BlockSize*o.recordSize) if _, err := io.CopyBuffer(compressor, signer, buf); err != nil { return err } @@ -167,29 +160,29 @@ func (o *Operations) Archive( } hdr.Size = int64(fileSizeCounter.BytesRead) - hdr.Name, err = suffix.AddSuffix(hdr.Name, pipes.Compression, pipes.Encryption) + hdr.Name, err = suffix.AddSuffix(hdr.Name, o.pipes.Compression, o.pipes.Encryption) if err != nil { return err } } - if onHeader != nil { + if o.onHeader != nil { dbhdr, err := converters.TarHeaderToDBHeader(-1, -1, -1, -1, hdr) if err != nil { return err } - onHeader(dbhdr) + o.onHeader(dbhdr) } hdrToAppend := *hdr hdrs = append(hdrs, &hdrToAppend) - if err := signature.SignHeader(hdr, writer.DriveIsRegular, pipes.Signature, crypto.Identity); err != nil { + if err := signature.SignHeader(hdr, writer.DriveIsRegular, o.pipes.Signature, o.crypto.Identity); err != nil { return err } - if err := encryption.EncryptHeader(hdr, pipes.Encryption, crypto.Recipient); err != nil { + if err := encryption.EncryptHeader(hdr, o.pipes.Encryption, o.crypto.Recipient); err != nil { return err } @@ -204,17 +197,17 @@ func (o *Operations) Archive( } // Compress and write the file - encryptor, err := encryption.Encrypt(tw, pipes.Encryption, crypto.Recipient) + encryptor, err := encryption.Encrypt(tw, o.pipes.Encryption, o.crypto.Recipient) if err != nil { return err } compressor, err := compression.Compress( encryptor, - pipes.Compression, + o.pipes.Compression, compressionLevel, writer.DriveIsRegular, - recordSize, + o.recordSize, ) if err != nil { return err @@ -230,7 +223,7 @@ func (o *Operations) Archive( return err } } else { - buf := make([]byte, mtio.BlockSize*recordSize) + buf := make([]byte, mtio.BlockSize*o.recordSize) if _, err := io.CopyBuffer(compressor, file, buf); err != nil { return err } @@ -288,10 +281,10 @@ func (o *Operations) Archive( config.MetadataConfig{ Metadata: o.metadataPersister, }, - pipes, - crypto, + o.pipes, + o.crypto, - recordSize, + o.recordSize, int(lastIndexedRecord), int(lastIndexedBlock), overwrite, @@ -310,6 +303,6 @@ func (o *Operations) Archive( return nil // We sign above, no need to verify }, - onHeader, + o.onHeader, ) } diff --git a/pkg/operations/delete.go b/pkg/operations/delete.go index b489b1c..8055544 100644 --- a/pkg/operations/delete.go +++ b/pkg/operations/delete.go @@ -14,15 +14,7 @@ import ( "github.com/pojntfx/stfs/pkg/recovery" ) -func (o *Operations) Delete( - pipes config.PipeConfig, - crypto config.CryptoConfig, - - recordSize int, - name string, - - onHeader func(hdr *models.Header), -) error { +func (o *Operations) Delete(name string) error { o.diskOperationLock.Lock() defer o.diskOperationLock.Unlock() @@ -32,12 +24,12 @@ func (o *Operations) Delete( } dirty := false - tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, recordSize) + tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, o.recordSize) if err != nil { return err } - lastIndexedRecord, lastIndexedBlock, err := o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), recordSize) + lastIndexedRecord, lastIndexedBlock, err := o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), o.recordSize) if err != nil { return err } @@ -73,20 +65,20 @@ func (o *Operations) Delete( hdrs = append(hdrs, *hdr) - if onHeader != nil { + if o.onHeader != nil { dbhdr, err := converters.TarHeaderToDBHeader(-1, -1, -1, -1, hdr) if err != nil { return err } - onHeader(dbhdr) + o.onHeader(dbhdr) } - if err := signature.SignHeader(hdr, writer.DriveIsRegular, pipes.Signature, crypto.Identity); err != nil { + if err := signature.SignHeader(hdr, writer.DriveIsRegular, o.pipes.Signature, o.crypto.Identity); err != nil { return err } - if err := encryption.EncryptHeader(hdr, pipes.Encryption, crypto.Recipient); err != nil { + if err := encryption.EncryptHeader(hdr, o.pipes.Encryption, o.crypto.Recipient); err != nil { return err } @@ -123,10 +115,10 @@ func (o *Operations) Delete( config.MetadataConfig{ Metadata: o.metadataPersister, }, - pipes, - crypto, + o.pipes, + o.crypto, - recordSize, + o.recordSize, int(lastIndexedRecord), int(lastIndexedBlock), false, @@ -145,6 +137,6 @@ func (o *Operations) Delete( return nil // We sign above, no need to verify }, - onHeader, + o.onHeader, ) } diff --git a/pkg/operations/move.go b/pkg/operations/move.go index ca86300..fc22620 100644 --- a/pkg/operations/move.go +++ b/pkg/operations/move.go @@ -15,16 +15,7 @@ import ( "github.com/pojntfx/stfs/pkg/recovery" ) -func (o *Operations) Move( - pipes config.PipeConfig, - crypto config.CryptoConfig, - - recordSize int, - from string, - to string, - - onHeader func(hdr *models.Header), -) error { +func (o *Operations) Move(from string, to string) error { o.diskOperationLock.Lock() defer o.diskOperationLock.Unlock() @@ -34,12 +25,12 @@ func (o *Operations) Move( } dirty := false - tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, recordSize) + tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, o.recordSize) if err != nil { return err } - lastIndexedRecord, lastIndexedBlock, err := o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), recordSize) + lastIndexedRecord, lastIndexedBlock, err := o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), o.recordSize) if err != nil { return err } @@ -77,20 +68,20 @@ func (o *Operations) Move( hdrs = append(hdrs, *hdr) - if onHeader != nil { + if o.onHeader != nil { dbhdr, err := converters.TarHeaderToDBHeader(-1, -1, -1, -1, hdr) if err != nil { return err } - onHeader(dbhdr) + o.onHeader(dbhdr) } - if err := signature.SignHeader(hdr, writer.DriveIsRegular, pipes.Signature, crypto.Identity); err != nil { + if err := signature.SignHeader(hdr, writer.DriveIsRegular, o.pipes.Signature, o.crypto.Identity); err != nil { return err } - if err := encryption.EncryptHeader(hdr, pipes.Encryption, crypto.Recipient); err != nil { + if err := encryption.EncryptHeader(hdr, o.pipes.Encryption, o.crypto.Recipient); err != nil { return err } @@ -127,10 +118,10 @@ func (o *Operations) Move( config.MetadataConfig{ Metadata: o.metadataPersister, }, - pipes, - crypto, + o.pipes, + o.crypto, - recordSize, + o.recordSize, int(lastIndexedRecord), int(lastIndexedBlock), false, @@ -149,6 +140,6 @@ func (o *Operations) Move( return nil // We sign above, no need to verify }, - onHeader, + o.onHeader, ) } diff --git a/pkg/operations/operations.go b/pkg/operations/operations.go index 39769f6..e8b165b 100644 --- a/pkg/operations/operations.go +++ b/pkg/operations/operations.go @@ -3,6 +3,7 @@ package operations import ( "sync" + models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" "github.com/pojntfx/stfs/internal/persisters" "github.com/pojntfx/stfs/pkg/config" ) @@ -19,6 +20,13 @@ type Operations struct { metadataPersister *persisters.MetadataPersister + pipes config.PipeConfig + crypto config.CryptoConfig + + recordSize int + + onHeader func(hdr *models.Header) + diskOperationLock sync.Mutex } @@ -33,6 +41,13 @@ func NewOperations( closeDrive func() error, metadataPersister *persisters.MetadataPersister, + + pipes config.PipeConfig, + crypto config.CryptoConfig, + + recordSize int, + + onHeader func(hdr *models.Header), ) *Operations { return &Operations{ getWriter: getWriter, @@ -45,5 +60,12 @@ func NewOperations( closeDrive: closeDrive, metadataPersister: metadataPersister, + + pipes: pipes, + crypto: crypto, + + recordSize: recordSize, + + onHeader: onHeader, } } diff --git a/pkg/operations/restore.go b/pkg/operations/restore.go index 6113e4f..ddbd4ea 100644 --- a/pkg/operations/restore.go +++ b/pkg/operations/restore.go @@ -9,21 +9,10 @@ import ( "strings" models "github.com/pojntfx/stfs/internal/db/sqlite/models/metadata" - "github.com/pojntfx/stfs/pkg/config" "github.com/pojntfx/stfs/pkg/recovery" ) -func (o *Operations) Restore( - pipes config.PipeConfig, - crypto config.CryptoConfig, - - recordSize int, - from string, - to string, - flatten bool, - - onHeader func(hdr *models.Header), -) error { +func (o *Operations) Restore(from string, to string, flatten bool) error { o.diskOperationLock.Lock() defer o.diskOperationLock.Unlock() @@ -67,8 +56,8 @@ func (o *Operations) Restore( defer o.closeDrive() for _, dbhdr := range headersToRestore { - if onHeader != nil { - onHeader(dbhdr) + if o.onHeader != nil { + o.onHeader(dbhdr) } dst := dbhdr.Name @@ -87,10 +76,10 @@ func (o *Operations) Restore( if err := recovery.Fetch( reader, drive, - pipes, - crypto, + o.pipes, + o.crypto, - recordSize, + o.recordSize, int(dbhdr.Record), int(dbhdr.Block), dst, diff --git a/pkg/operations/update.go b/pkg/operations/update.go index e0a8d73..b580d0f 100644 --- a/pkg/operations/update.go +++ b/pkg/operations/update.go @@ -11,7 +11,6 @@ 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" @@ -25,15 +24,9 @@ import ( ) func (o *Operations) Update( - pipes config.PipeConfig, - crypto config.CryptoConfig, - - recordSize int, from string, - overwrite bool, compressionLevel string, - - onHeader func(hdr *models.Header), + overwrite bool, ) ([]*tar.Header, error) { o.diskOperationLock.Lock() defer o.diskOperationLock.Unlock() @@ -44,12 +37,12 @@ func (o *Operations) Update( } dirty := false - tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, recordSize) + tw, cleanup, err := tarext.NewTapeWriter(writer.Drive, writer.DriveIsRegular, o.recordSize) if err != nil { return []*tar.Header{}, err } - lastIndexedRecord, lastIndexedBlock, err := o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), recordSize) + lastIndexedRecord, lastIndexedBlock, err := o.metadataPersister.GetLastIndexedRecordAndBlock(context.Background(), o.recordSize) if err != nil { return []*tar.Header{}, err } @@ -90,17 +83,17 @@ func (o *Operations) Update( Writer: io.Discard, } - encryptor, err := encryption.Encrypt(fileSizeCounter, pipes.Encryption, crypto.Recipient) + encryptor, err := encryption.Encrypt(fileSizeCounter, o.pipes.Encryption, o.crypto.Recipient) if err != nil { return err } compressor, err := compression.Compress( encryptor, - pipes.Compression, + o.pipes.Compression, compressionLevel, writer.DriveIsRegular, - recordSize, + o.recordSize, ) if err != nil { return err @@ -111,7 +104,7 @@ func (o *Operations) Update( return err } - signer, sign, err := signature.Sign(file, writer.DriveIsRegular, pipes.Signature, crypto.Identity) + signer, sign, err := signature.Sign(file, writer.DriveIsRegular, o.pipes.Signature, o.crypto.Identity) if err != nil { return err } @@ -121,7 +114,7 @@ func (o *Operations) Update( return err } } else { - buf := make([]byte, mtio.BlockSize*recordSize) + buf := make([]byte, mtio.BlockSize*o.recordSize) if _, err := io.CopyBuffer(compressor, signer, buf); err != nil { return err } @@ -157,7 +150,7 @@ func (o *Operations) Update( } hdr.Size = int64(fileSizeCounter.BytesRead) - hdr.Name, err = suffix.AddSuffix(hdr.Name, pipes.Compression, pipes.Encryption) + hdr.Name, err = suffix.AddSuffix(hdr.Name, o.pipes.Compression, o.pipes.Encryption) if err != nil { return err } @@ -166,23 +159,23 @@ func (o *Operations) Update( if overwrite { hdr.PAXRecords[records.STFSRecordReplacesContent] = records.STFSRecordReplacesContentTrue - if onHeader != nil { + if o.onHeader != nil { dbhdr, err := converters.TarHeaderToDBHeader(-1, -1, -1, -1, hdr) if err != nil { return err } - onHeader(dbhdr) + o.onHeader(dbhdr) } hdrToAppend := *hdr hdrs = append(hdrs, &hdrToAppend) - if err := signature.SignHeader(hdr, writer.DriveIsRegular, pipes.Signature, crypto.Identity); err != nil { + if err := signature.SignHeader(hdr, writer.DriveIsRegular, o.pipes.Signature, o.crypto.Identity); err != nil { return err } - if err := encryption.EncryptHeader(hdr, pipes.Encryption, crypto.Recipient); err != nil { + if err := encryption.EncryptHeader(hdr, o.pipes.Encryption, o.crypto.Recipient); err != nil { return err } @@ -195,17 +188,17 @@ func (o *Operations) Update( } // Compress and write the file - encryptor, err := encryption.Encrypt(tw, pipes.Encryption, crypto.Recipient) + encryptor, err := encryption.Encrypt(tw, o.pipes.Encryption, o.crypto.Recipient) if err != nil { return err } compressor, err := compression.Compress( encryptor, - pipes.Compression, + o.pipes.Compression, compressionLevel, writer.DriveIsRegular, - recordSize, + o.recordSize, ) if err != nil { return err @@ -221,7 +214,7 @@ func (o *Operations) Update( return err } } else { - buf := make([]byte, mtio.BlockSize*recordSize) + buf := make([]byte, mtio.BlockSize*o.recordSize) if _, err := io.CopyBuffer(compressor, file, buf); err != nil { return err } @@ -245,23 +238,23 @@ func (o *Operations) Update( } else { hdr.Size = 0 // Don't try to seek after the record - if onHeader != nil { + if o.onHeader != nil { dbhdr, err := converters.TarHeaderToDBHeader(-1, -1, -1, -1, hdr) if err != nil { return err } - onHeader(dbhdr) + o.onHeader(dbhdr) } hdrToAppend := *hdr hdrs = append(hdrs, &hdrToAppend) - if err := signature.SignHeader(hdr, writer.DriveIsRegular, pipes.Signature, crypto.Identity); err != nil { + if err := signature.SignHeader(hdr, writer.DriveIsRegular, o.pipes.Signature, o.crypto.Identity); err != nil { return err } - if err := encryption.EncryptHeader(hdr, pipes.Encryption, crypto.Recipient); err != nil { + if err := encryption.EncryptHeader(hdr, o.pipes.Encryption, o.crypto.Recipient); err != nil { return err } @@ -303,10 +296,10 @@ func (o *Operations) Update( config.MetadataConfig{ Metadata: o.metadataPersister, }, - pipes, - crypto, + o.pipes, + o.crypto, - recordSize, + o.recordSize, int(lastIndexedRecord), int(lastIndexedBlock), false, @@ -325,6 +318,6 @@ func (o *Operations) Update( return nil // We sign above, no need to verify }, - onHeader, + o.onHeader, ) }