From 1fac8757d08b9d142c3348790353de9919295871 Mon Sep 17 00:00:00 2001 From: deranjer Date: Thu, 15 Nov 2018 17:19:15 -0500 Subject: [PATCH] Pulled in latest version of libraries, added Socks5 config --- config.toml | 7 +++++ engine/engine.go | 3 ++ engine/engineHelpers.go | 46 +++++++++++++++++++++++++++++++ main.go | 12 ++++---- settings/clientConnectGenerate.go | 2 +- settings/settings.go | 13 +++++++-- storage/storage.go | 3 +- 7 files changed, 76 insertions(+), 10 deletions(-) diff --git a/config.toml b/config.toml index 62d3c81e..a1e216b9 100644 --- a/config.toml +++ b/config.toml @@ -35,6 +35,13 @@ #URL is CASE SENSITIVE BaseURL = "domain.com/subroute/" # MUST be in the format (if you have a subdomain, and must have trailing slash) "yoursubdomain.domain.org/subroute/" +[socksProxy] + SocksProxyEnabled = false #bool, either false or true + # Sets usage of Socks5 Proxy. Authentication should be included in the url if needed. + # Examples: socks5://demo:demo@192.168.99.100:1080 + # http://proxy.domain.com:3128 + SocksProxyURL = "" + [EncryptionPolicy] DisableEncryption = false diff --git a/engine/engine.go b/engine/engine.go index d3a40a40..7ba9bd8a 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -221,6 +221,9 @@ func CreateInitialTorrentArray(tclient *torrent.Client, TorrentLocalArray []*Sto singleTorrent.SetMaxEstablishedConns(0) continue } + if singleTorrentFromStorage.TorrentStatus == "ForceStart" { + AddTorrentToForceStart(singleTorrentFromStorage, singleTorrent, db) + } if len(torrentQueues.ActiveTorrents) == 0 && len(torrentQueues.QueuedTorrents) == 0 { // If empty, run through all the torrents and assign them if len(torrentQueues.ActiveTorrents) < Config.MaxActiveTorrents { if singleTorrentFromStorage.TorrentStatus == "Completed" || singleTorrentFromStorage.TorrentStatus == "Seeding" { diff --git a/engine/engineHelpers.go b/engine/engineHelpers.go index 121fdd77..86c5c606 100644 --- a/engine/engineHelpers.go +++ b/engine/engineHelpers.go @@ -199,6 +199,45 @@ func StopTorrent(singleTorrent *torrent.Torrent, torrentLocalStorage *Storage.To Logger.WithFields(logrus.Fields{"Torrent Name": torrentLocalStorage.TorrentName}).Info("Torrent Stopped Success!") } +//AddTorrentToForceStart forces torrent to be high priority on start +func AddTorrentToForceStart(torrentLocalStorage *Storage.TorrentLocal, singleTorrent *torrent.Torrent, db *storm.DB) { + torrentQueues := Storage.FetchQueues(db) + for index, torrentHash := range torrentQueues.ActiveTorrents { + if torrentHash == singleTorrent.InfoHash().String() { //If torrent already in active remove from active + torrentQueues.ActiveTorrents = append(torrentQueues.ActiveTorrents[:index], torrentQueues.ActiveTorrents[index+1:]...) + } + } + for index, queuedTorrentHash := range torrentQueues.QueuedTorrents { //Removing from the queued torrents if in queued torrents + if queuedTorrentHash == singleTorrent.InfoHash().String() { + torrentQueues.QueuedTorrents = append(torrentQueues.QueuedTorrents[:index], torrentQueues.QueuedTorrents[index+1:]...) + } + } + singleTorrent.NewReader() + singleTorrent.SetMaxEstablishedConns(80) + torrentQueues.ActiveTorrents = append(torrentQueues.ActiveTorrents, singleTorrent.InfoHash().String()) + torrentLocalStorage.TorrentStatus = "ForceStart" + torrentLocalStorage.MaxConnections = 80 + for _, file := range singleTorrent.Files() { + for _, sentFile := range torrentLocalStorage.TorrentFilePriority { + if file.DisplayPath() == sentFile.TorrentFilePath { + switch sentFile.TorrentFilePriority { + case "High": + file.SetPriority(torrent.PiecePriorityHigh) + case "Normal": + file.SetPriority(torrent.PiecePriorityNormal) + case "Cancel": + file.SetPriority(torrent.PiecePriorityNone) + default: + file.SetPriority(torrent.PiecePriorityNormal) + } + } + } + } + Logger.WithFields(logrus.Fields{"Torrent Name": torrentLocalStorage.TorrentName}).Info("Adding Torrent to ForceStart Queue") + Storage.UpdateStorageTick(db, *torrentLocalStorage) + Storage.UpdateQueues(db, torrentQueues) +} + //AddTorrentToActive adds a torrent to the active slice func AddTorrentToActive(torrentLocalStorage *Storage.TorrentLocal, singleTorrent *torrent.Torrent, db *storm.DB) { torrentQueues := Storage.FetchQueues(db) @@ -238,6 +277,7 @@ func AddTorrentToActive(torrentLocalStorage *Storage.TorrentLocal, singleTorrent } } Logger.WithFields(logrus.Fields{"Torrent Name": torrentLocalStorage.TorrentName}).Info("Adding Torrent to Active Queue (Manual Call)") + Storage.UpdateStorageTick(db, *torrentLocalStorage) Storage.UpdateQueues(db, torrentQueues) } @@ -274,6 +314,12 @@ func DeleteTorrentFromQueues(torrentHash string, db *storm.DB) { Logger.Info("Removing Torrent from Queued", torrentHash) } } + for x, torrentHashActive := range torrentQueues.ForcedTorrents { //FOR EXTRA CAUTION deleting it from all queues in case a mistake occurred. + if torrentHash == torrentHashActive { + torrentQueues.ForcedTorrents = append(torrentQueues.ForcedTorrents[:x], torrentQueues.ForcedTorrents[x+1:]...) + Logger.Info("Removing Torrent from Forced: ", torrentHash) + } + } Storage.UpdateQueues(db, torrentQueues) Logger.WithFields(logrus.Fields{"Torrent Hash": torrentHash, "TorrentQueues": torrentQueues}).Info("Removing Torrent from all Queues") } diff --git a/main.go b/main.go index aa624634..dc56b070 100644 --- a/main.go +++ b/main.go @@ -550,18 +550,18 @@ func main() { Logger.WithFields(logrus.Fields{"infoHash": singleTorrent.InfoHash().String()}).Info("Found matching torrent to start") oldTorrentInfo := Storage.FetchTorrentFromStorage(db, singleTorrent.InfoHash().String()) Logger.WithFields(logrus.Fields{"Torrent": oldTorrentInfo.TorrentName}).Info("Changing database to torrent running with 80 max connections") - oldTorrentInfo.TorrentStatus = "Running" + oldTorrentInfo.TorrentStatus = "ForceStart" oldTorrentInfo.MaxConnections = 80 Storage.UpdateStorageTick(db, oldTorrentInfo) //Updating the torrent status - Engine.AddTorrentToActive(&oldTorrentInfo, singleTorrent, db) + Engine.AddTorrentToForceStart(&oldTorrentInfo, singleTorrent, db) } torrentQueues = Storage.FetchQueues(db) - if len(torrentQueues.ActiveTorrents) > Config.MaxActiveTorrents { //Since we are starting a new torrent stop the first torrent in the que if running is full + if len(torrentQueues.ActiveTorrents) > Config.MaxActiveTorrents { //Since we are starting a new torrent stop the last torrent in the que if running is full //removeTorrent := torrentQueues.ActiveTorrents[len(torrentQueues.ActiveTorrents)-1] - removeTorrent := torrentQueues.ActiveTorrents[:1] + removeTorrent := torrentQueues.ActiveTorrents[len(torrentQueues.ActiveTorrents)-1] for _, singleTorrent := range runningTorrents { - if singleTorrent.InfoHash().String() == removeTorrent[0] { + if singleTorrent.InfoHash().String() == removeTorrent { oldTorrentInfo := Storage.FetchTorrentFromStorage(db, singleTorrent.InfoHash().String()) Engine.RemoveTorrentFromActive(&oldTorrentInfo, singleTorrent, db) Storage.UpdateStorageTick(db, oldTorrentInfo) @@ -638,7 +638,7 @@ func main() { } }) - if Config.UseProxy { + if Config.UseReverseProxy { err := http.ListenAndServe(httpAddr, handlers.ProxyHeaders(router)) if err != nil { Logger.WithFields(logrus.Fields{"error": err}).Fatal("Unable to listen on the http Server!") diff --git a/settings/clientConnectGenerate.go b/settings/clientConnectGenerate.go index 312ca92a..0a3a31a5 100644 --- a/settings/clientConnectGenerate.go +++ b/settings/clientConnectGenerate.go @@ -42,7 +42,7 @@ func GenerateClientConfigFile(config FullClientSettings, authString string) { ` } - if config.UseProxy { + if config.UseReverseProxy { clientFile = ` ClientAuthString = "` + authString + `" ` + webUIAuth + ` diff --git a/settings/settings.go b/settings/settings.go index 4ab2f6ab..2eccc41e 100644 --- a/settings/settings.go +++ b/settings/settings.go @@ -21,9 +21,11 @@ var Logger *logrus.Logger type ClientConnectSettings struct { HTTPAddr string HTTPAddrIP string - UseProxy bool + UseReverseProxy bool + UseSocksProxy bool WebsocketClientPort string BaseURL string + SocksProxyURL string ClientUsername string ClientPassword string PushBulletToken string `json:"-"` @@ -119,6 +121,7 @@ func FullClientSettingsNew() FullClientSettings { var httpAddr string var baseURL string + var socksProxyURLBase string var websocketClientPort string var logLevel logrus.Level //logging @@ -151,6 +154,10 @@ func FullClientSettingsNew() FullClientSettings { baseURL = viper.GetString("reverseProxy.BaseURL") fmt.Println("WebsocketClientPort", viper.GetString("serverConfig.ServerPort")) } + socksProxySet := viper.GetBool("socksProxy.ProxyEnabled") + if socksProxySet { + socksProxyURLBase = viper.GetString("reverseProxy.BaseURL") + } //Client Authentication clientAuthEnabled := viper.GetBool("goTorrentWebUI.WebUIAuth") var webUIUser string @@ -247,11 +254,13 @@ func FullClientSettingsNew() FullClientSettings { ClientConnectSettings: ClientConnectSettings{ HTTPAddr: httpAddr, HTTPAddrIP: httpAddrIP, - UseProxy: proxySet, + UseReverseProxy: proxySet, + UseSocksProxy: socksProxySet, WebsocketClientPort: websocketClientPort, ClientUsername: webUIUser, ClientPassword: webUIPasswordHash, BaseURL: baseURL, + SocksProxyURL: socksProxyURLBase, PushBulletToken: pushBulletToken, }, TFileUploadFolder: "uploadedTorrents", diff --git a/storage/storage.go b/storage/storage.go index 1149b3c0..2becd381 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -22,6 +22,7 @@ type TorrentQueues struct { ID int `storm:"id,unique"` //storm requires unique ID (will be 5) ActiveTorrents []string QueuedTorrents []string + ForcedTorrents []string } //IssuedTokensList contains a slice of all the tokens issues to applications @@ -79,7 +80,7 @@ type TorrentLocal struct { TempStoragePath string //The absolute path of where the torrent is temporarily stored as it is downloaded TorrentMoved bool //If completed has the torrent been moved to the end location TorrentName string - TorrentStatus string //"Stopped", "Running" + TorrentStatus string //"Stopped", "Running", "ForceStart" TorrentUploadLimit bool //if true this torrent will bypass the upload storage limit (effectively unlimited) MaxConnections int //Max connections that the torrent can have to it at one time TorrentType string //magnet or .torrent file