Fixes #15, started seperating Settings into their own package
This commit is contained in:
247
settings/settings.go
Normal file
247
settings/settings.go
Normal file
@@ -0,0 +1,247 @@
|
||||
package settings
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"golang.org/x/time/rate"
|
||||
|
||||
"github.com/anacrolix/dht"
|
||||
"github.com/anacrolix/torrent"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
//Logger is the injected variable for global logger
|
||||
var Logger *logrus.Logger
|
||||
|
||||
//FullClientSettings contains all of the settings for our entire application
|
||||
type FullClientSettings struct {
|
||||
LoggingLevel logrus.Level
|
||||
LoggingOutput string
|
||||
HTTPAddr string
|
||||
HTTPAddrIP string
|
||||
UseProxy bool
|
||||
WebsocketClientPort string
|
||||
BaseURL string
|
||||
ClientUsername string
|
||||
ClientPassword string
|
||||
Version int
|
||||
TorrentConfig torrent.Config
|
||||
TFileUploadFolder string
|
||||
SeedRatioStop float64
|
||||
PushBulletToken string
|
||||
DefaultMoveFolder string
|
||||
TorrentWatchFolder string
|
||||
}
|
||||
|
||||
//default is called if there is a parsing error
|
||||
func defaultConfig() FullClientSettings {
|
||||
var Config FullClientSettings
|
||||
Config.Version = 1.0
|
||||
Config.LoggingLevel = 3 //Warn level
|
||||
Config.TorrentConfig.DataDir = "downloads" //the absolute or relative path of the default download directory for torrents
|
||||
Config.TFileUploadFolder = "uploadedTorrents"
|
||||
Config.TorrentConfig.Seed = true
|
||||
Config.HTTPAddr = ":8000"
|
||||
Config.SeedRatioStop = 1.50
|
||||
|
||||
Config.TorrentConfig.DHTConfig = dht.ServerConfig{
|
||||
StartingNodes: dht.GlobalBootstrapAddrs,
|
||||
}
|
||||
|
||||
return Config
|
||||
}
|
||||
|
||||
func dhtServerSettings(dhtConfig dht.ServerConfig) dht.ServerConfig {
|
||||
viper.UnmarshalKey("DHTConfig", &dhtConfig)
|
||||
Logger.WithFields(logrus.Fields{"dhtConfig": dhtConfig}).Info("Displaying DHT Config")
|
||||
return dhtConfig
|
||||
}
|
||||
|
||||
func calculateRateLimiters(uploadRate, downloadRate string) (*rate.Limiter, *rate.Limiter) { //TODO reorg
|
||||
var uploadRateLimiterSize int
|
||||
var downloadRateLimiterSize int
|
||||
|
||||
switch uploadRate {
|
||||
case "Low":
|
||||
uploadRateLimiterSize = 50000
|
||||
case "Medium":
|
||||
uploadRateLimiterSize = 500000
|
||||
case "High":
|
||||
uploadRateLimiterSize = 1500000
|
||||
default:
|
||||
downloadRateLimiter := rate.NewLimiter(rate.Inf, 0)
|
||||
uploadRateLimiter := rate.NewLimiter(rate.Inf, 0)
|
||||
return downloadRateLimiter, uploadRateLimiter
|
||||
}
|
||||
|
||||
switch downloadRate {
|
||||
case "Low":
|
||||
downloadRateLimiterSize = 50000
|
||||
case "Medium":
|
||||
downloadRateLimiterSize = 500000
|
||||
case "High":
|
||||
downloadRateLimiterSize = 1500000
|
||||
default:
|
||||
downloadRateLimiter := rate.NewLimiter(rate.Inf, 0)
|
||||
uploadRateLimiter := rate.NewLimiter(rate.Inf, 0)
|
||||
return downloadRateLimiter, uploadRateLimiter
|
||||
}
|
||||
var limitPerSecondUl = rate.Limit(uploadRateLimiterSize)
|
||||
uploadRateLimiter := rate.NewLimiter(limitPerSecondUl, uploadRateLimiterSize)
|
||||
var limitPerSecondDl = rate.Limit(uploadRateLimiterSize)
|
||||
downloadRateLimiter := rate.NewLimiter(limitPerSecondDl, downloadRateLimiterSize)
|
||||
return downloadRateLimiter, uploadRateLimiter
|
||||
}
|
||||
|
||||
//FullClientSettingsNew creates a new set of setting from config.toml
|
||||
func FullClientSettingsNew() FullClientSettings {
|
||||
viper.SetConfigName("config")
|
||||
viper.AddConfigPath("./")
|
||||
err := viper.ReadInConfig()
|
||||
if err != nil {
|
||||
fmt.Println("Error reading in config, using defaults", err)
|
||||
FullClientSettings := defaultConfig()
|
||||
return FullClientSettings
|
||||
}
|
||||
|
||||
var httpAddr string
|
||||
var baseURL string
|
||||
var websocketClientPort string
|
||||
var logLevel logrus.Level
|
||||
//logging
|
||||
logLevelString := viper.GetString("serverConfig.LogLevel")
|
||||
logOutput := viper.GetString("serverConfig.LogOutput")
|
||||
switch logLevelString { //Options = Debug 5, Info 4, Warn 3, Error 2, Fatal 1, Panic 0
|
||||
case "Panic":
|
||||
logLevel = 0
|
||||
case "Fatal":
|
||||
logLevel = 1
|
||||
case "Error":
|
||||
logLevel = 2
|
||||
case "Warn":
|
||||
logLevel = 3
|
||||
case "Info":
|
||||
logLevel = 4
|
||||
case "Debug":
|
||||
logLevel = 5
|
||||
default:
|
||||
logLevel = 3
|
||||
|
||||
}
|
||||
//HTTP, proxy
|
||||
httpAddrIP := viper.GetString("serverConfig.ServerAddr")
|
||||
httpAddrPort := viper.GetString("serverConfig.ServerPort")
|
||||
httpAddr = httpAddrIP + httpAddrPort
|
||||
proxySet := viper.GetBool("reverseProxy.ProxyEnabled")
|
||||
websocketClientPort = strings.TrimLeft(viper.GetString("serverConfig.ServerPort"), ":") //Trimming off the colon in front of the port
|
||||
if proxySet {
|
||||
baseURL = viper.GetString("reverseProxy.BaseURL")
|
||||
fmt.Println("WebsocketClientPort", viper.GetString("serverConfig.ServerPort"))
|
||||
}
|
||||
//Client Authentication
|
||||
clientAuthEnabled := viper.GetBool("goTorrentWebUI.WebUIAuth")
|
||||
var webUIUser string
|
||||
var webUIPasswordHash string
|
||||
if clientAuthEnabled {
|
||||
webUIUser = viper.GetString("goTorrentWebUI.WebUIUser")
|
||||
webUIPassword := viper.GetString("goTorrentWebUI.WebUIPassword")
|
||||
hash256 := sha256.New()
|
||||
hash256.Write([]byte(webUIPassword)) //Hashing the password
|
||||
webUIPasswordHash = fmt.Sprintf("%x", hash256.Sum(nil)) //Printing the password out as a string
|
||||
}
|
||||
//General Settings
|
||||
seedRatioStop := viper.GetFloat64("serverConfig.SeedRatioStop")
|
||||
defaultMoveFolder := filepath.ToSlash(viper.GetString("serverConfig.DefaultMoveFolder")) //Converting the string literal into a filepath
|
||||
defaultMoveFolderAbs, err := filepath.Abs(defaultMoveFolder)
|
||||
if err != nil {
|
||||
fmt.Println("Failed creating absolute path for defaultMoveFolder", err)
|
||||
}
|
||||
torrentWatchFolder := filepath.ToSlash(viper.GetString("serverConfig.TorrentWatchFolder"))
|
||||
torrentWatchFolderAbs, err := filepath.Abs(torrentWatchFolder)
|
||||
if err != nil {
|
||||
fmt.Println("Failed creating absolute path for torrentWatchFolderAbs", err)
|
||||
}
|
||||
//Notifications
|
||||
pushBulletToken := viper.GetString("notifications.PushBulletToken")
|
||||
|
||||
//Rate Limiters
|
||||
var uploadRateLimiter *rate.Limiter
|
||||
var downloadRateLimiter *rate.Limiter
|
||||
uploadRate := viper.GetString("serverConfig.UploadRateLimit")
|
||||
downloadRate := viper.GetString("serverConfig.DownloadRateLimit")
|
||||
downloadRateLimiter, uploadRateLimiter = calculateRateLimiters(uploadRate, downloadRate)
|
||||
//Internals
|
||||
dataDir := filepath.ToSlash(viper.GetString("torrentClientConfig.DownloadDir")) //Converting the string literal into a filepath
|
||||
dataDirAbs, err := filepath.Abs(dataDir) //Converting to an absolute file path
|
||||
if err != nil {
|
||||
fmt.Println("Failed creating absolute path for dataDir", err)
|
||||
}
|
||||
listenAddr := viper.GetString("torrentClientConfig.ListenAddr")
|
||||
disablePex := viper.GetBool("torrentClientConfig.DisablePEX")
|
||||
noDHT := viper.GetBool("torrentClientConfig.NoDHT")
|
||||
noUpload := viper.GetBool("torrentClientConfig.NoUpload")
|
||||
seed := viper.GetBool("torrentClientConfig.Seed")
|
||||
|
||||
peerID := viper.GetString("torrentClientConfig.PeerID")
|
||||
disableUTP := viper.GetBool("torrentClientConfig.DisableUTP")
|
||||
disableTCP := viper.GetBool("torrentClientConfig.DisableTCP")
|
||||
disableIPv6 := viper.GetBool("torrentClientConfig.DisableIPv6")
|
||||
debug := viper.GetBool("torrentClientConfig.Debug")
|
||||
|
||||
dhtServerConfig := dht.ServerConfig{
|
||||
StartingNodes: dht.GlobalBootstrapAddrs,
|
||||
}
|
||||
if viper.IsSet("DHTConfig") {
|
||||
fmt.Println("Reading in custom DHT config")
|
||||
dhtServerConfig = dhtServerSettings(dhtServerConfig)
|
||||
}
|
||||
|
||||
encryptionPolicy := torrent.EncryptionPolicy{
|
||||
DisableEncryption: viper.GetBool("EncryptionPolicy.DisableEncryption"),
|
||||
ForceEncryption: viper.GetBool("EncryptionPolicy.ForceEncryption"),
|
||||
PreferNoEncryption: viper.GetBool("EncryptionPolicy.PreferNoEncryption"),
|
||||
}
|
||||
|
||||
tConfig := torrent.Config{
|
||||
DataDir: dataDirAbs,
|
||||
ListenAddr: listenAddr,
|
||||
DisablePEX: disablePex,
|
||||
NoDHT: noDHT,
|
||||
DHTConfig: dhtServerConfig,
|
||||
NoUpload: noUpload,
|
||||
Seed: seed,
|
||||
UploadRateLimiter: uploadRateLimiter,
|
||||
DownloadRateLimiter: downloadRateLimiter,
|
||||
PeerID: peerID,
|
||||
DisableUTP: disableUTP,
|
||||
DisableTCP: disableTCP,
|
||||
DisableIPv6: disableIPv6,
|
||||
Debug: debug,
|
||||
EncryptionPolicy: encryptionPolicy,
|
||||
}
|
||||
|
||||
Config := FullClientSettings{
|
||||
LoggingLevel: logLevel,
|
||||
LoggingOutput: logOutput,
|
||||
SeedRatioStop: seedRatioStop,
|
||||
HTTPAddr: httpAddr,
|
||||
HTTPAddrIP: httpAddrIP,
|
||||
UseProxy: proxySet,
|
||||
WebsocketClientPort: websocketClientPort,
|
||||
ClientUsername: webUIUser,
|
||||
ClientPassword: webUIPasswordHash,
|
||||
TorrentConfig: tConfig,
|
||||
BaseURL: baseURL,
|
||||
TFileUploadFolder: "uploadedTorrents",
|
||||
PushBulletToken: pushBulletToken,
|
||||
DefaultMoveFolder: defaultMoveFolderAbs,
|
||||
TorrentWatchFolder: torrentWatchFolderAbs,
|
||||
}
|
||||
|
||||
return Config
|
||||
|
||||
}
|
Reference in New Issue
Block a user