2019-02-08 12:57:35 +00:00
|
|
|
// Copyright (C) 2019 Storj Labs, Inc.
|
|
|
|
// See LICENSE for copying information.
|
|
|
|
|
|
|
|
package uplink
|
|
|
|
|
|
|
|
import (
|
2019-04-25 09:17:26 +01:00
|
|
|
"time"
|
2019-02-08 12:57:35 +00:00
|
|
|
|
|
|
|
"storj.io/storj/internal/memory"
|
2019-02-11 11:17:32 +00:00
|
|
|
"storj.io/storj/pkg/peertls/tlsopts"
|
2019-02-08 12:57:35 +00:00
|
|
|
"storj.io/storj/pkg/storj"
|
|
|
|
)
|
|
|
|
|
|
|
|
// RSConfig is a configuration struct that keeps details about default
|
|
|
|
// redundancy strategy information
|
|
|
|
type RSConfig struct {
|
2019-06-19 15:27:44 +01:00
|
|
|
MaxBufferMem memory.Size `help:"maximum buffer memory (in bytes) to be allocated for read buffers" default:"4MiB" hidden:"true"`
|
|
|
|
ErasureShareSize memory.Size `help:"the size of each new erasure share in bytes" default:"256B" hidden:"true"`
|
|
|
|
MinThreshold int `help:"the minimum pieces required to recover a segment. k." releaseDefault:"29" devDefault:"4" hidden:"true"`
|
|
|
|
RepairThreshold int `help:"the minimum safe pieces before a repair is triggered. m." releaseDefault:"35" devDefault:"6" hidden:"true"`
|
|
|
|
SuccessThreshold int `help:"the desired total pieces for a segment. o." releaseDefault:"80" devDefault:"8" hidden:"true"`
|
|
|
|
MaxThreshold int `help:"the largest amount of pieces to encode to. n." releaseDefault:"130" devDefault:"10" hidden:"true"`
|
2019-02-08 12:57:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// EncryptionConfig is a configuration struct that keeps details about
|
|
|
|
// encrypting segments
|
|
|
|
type EncryptionConfig struct {
|
2019-06-28 06:18:24 +01:00
|
|
|
EncryptionKey string `help:"the root key for encrypting the data which will be stored in KeyFilePath" setup:"true"`
|
|
|
|
KeyFilepath string `help:"the path to the file which contains the root key for encrypting the data"`
|
|
|
|
EncAccessFilepath string `help:"the path to a file containing a serialized encryption access"`
|
|
|
|
DataType int `help:"Type of encryption to use for content and metadata (1=AES-GCM, 2=SecretBox)" default:"1"`
|
|
|
|
PathType int `help:"Type of encryption to use for paths (0=Unencrypted, 1=AES-GCM, 2=SecretBox)" default:"1"`
|
2019-02-08 12:57:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ClientConfig is a configuration struct for the uplink that controls how
|
|
|
|
// to talk to the rest of the network.
|
|
|
|
type ClientConfig struct {
|
2019-05-10 12:26:25 +01:00
|
|
|
APIKey string `default:"" help:"the api key to use for the satellite" noprefix:"true"`
|
|
|
|
SatelliteAddr string `releaseDefault:"127.0.0.1:7777" devDefault:"127.0.0.1:10000" help:"the address to use for the satellite" noprefix:"true"`
|
|
|
|
MaxInlineSize memory.Size `help:"max inline segment size in bytes" default:"4KiB"`
|
|
|
|
SegmentSize memory.Size `help:"the size of a segment in bytes" default:"64MiB"`
|
|
|
|
RequestTimeout time.Duration `help:"timeout for request" default:"0h0m20s"`
|
|
|
|
DialTimeout time.Duration `help:"timeout for dials" default:"0h0m20s"`
|
2019-02-08 12:57:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Config uplink configuration
|
|
|
|
type Config struct {
|
|
|
|
Client ClientConfig
|
|
|
|
RS RSConfig
|
|
|
|
Enc EncryptionConfig
|
2019-02-11 11:17:32 +00:00
|
|
|
TLS tlsopts.Config
|
2019-02-08 12:57:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// GetRedundancyScheme returns the configured redundancy scheme for new uploads
|
|
|
|
func (c Config) GetRedundancyScheme() storj.RedundancyScheme {
|
|
|
|
return storj.RedundancyScheme{
|
|
|
|
Algorithm: storj.ReedSolomon,
|
2019-06-06 19:55:10 +01:00
|
|
|
ShareSize: c.RS.ErasureShareSize.Int32(),
|
2019-02-08 12:57:35 +00:00
|
|
|
RequiredShares: int16(c.RS.MinThreshold),
|
|
|
|
RepairShares: int16(c.RS.RepairThreshold),
|
|
|
|
OptimalShares: int16(c.RS.SuccessThreshold),
|
|
|
|
TotalShares: int16(c.RS.MaxThreshold),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-06 19:55:10 +01:00
|
|
|
// GetPathCipherSuite returns the cipher suite used for path encryption for bucket objects
|
|
|
|
func (c Config) GetPathCipherSuite() storj.CipherSuite {
|
|
|
|
return storj.Cipher(c.Enc.PathType).ToCipherSuite()
|
|
|
|
}
|
|
|
|
|
2019-02-08 12:57:35 +00:00
|
|
|
// GetEncryptionScheme returns the configured encryption scheme for new uploads
|
2019-06-11 18:14:05 +01:00
|
|
|
// Blocksize should align with the stripe size therefore multiples of stripes
|
|
|
|
// should fit in every encryption block. Instead of lettings users configure this
|
|
|
|
// multiple value, we hardcode stripesPerBlock as 2 for simplicity.
|
2019-02-08 12:57:35 +00:00
|
|
|
func (c Config) GetEncryptionScheme() storj.EncryptionScheme {
|
2019-06-11 18:14:05 +01:00
|
|
|
const stripesPerBlock = 2
|
2019-02-08 12:57:35 +00:00
|
|
|
return storj.EncryptionScheme{
|
|
|
|
Cipher: storj.Cipher(c.Enc.DataType),
|
2019-06-11 18:14:05 +01:00
|
|
|
BlockSize: c.GetRedundancyScheme().StripeSize() * stripesPerBlock,
|
2019-02-08 12:57:35 +00:00
|
|
|
}
|
|
|
|
}
|
2019-05-22 14:57:12 +01:00
|
|
|
|
2019-06-06 19:55:10 +01:00
|
|
|
// GetSegmentSize returns the segment size set in uplink config
|
|
|
|
func (c Config) GetSegmentSize() memory.Size {
|
|
|
|
return c.Client.SegmentSize
|
|
|
|
}
|