Support YAML for the configuration and rearrange the config struct

This commit is contained in:
Tony Blyler 2016-05-14 10:22:10 -04:00
parent fb15dcf3d5
commit 95ce7fccee
No known key found for this signature in database
GPG key ID: 25C9D3A655D1A65C
3 changed files with 69 additions and 66 deletions

View file

@ -10,61 +10,58 @@ Uploads .torrent files from a local "blackhole" to a remote (SSH) rtorrent watch
# Configuration
## Example
Ignore the keys that start with an underscore, they are comments.
```json
{
"_rtorrent_addr": "The address to the rtorrent XMLRPC endpoint",
"rtorrent_addr": "mycoolrtorrentserver.com/XMLRPC",
```yaml
# The file mode to use for downloaded files and directories
file_download_filemode: 0777
"_rtorrent_insecure_cert": "true to ignore the certificate authenticity; false to honor it",
"rtorrent_insecure_cert": false,
# The correlation of .torrent file paths and where their contents should be downloaded to"
watch_to_download_paths:
/home/tblyler/torrent_files/tv: /home/tblyler/Downloads/tv
/home/tblyler/torrent_files/movies: /home/tblyler/Downloads/movies
/home/tblyler/torrent_files: /home/tblyler/Downloads
"_torrent_username": "The HTTP Basic auth username to use for rtorrent's XMLRPC",
"rtorrent_username": "JohnDoe",
# The root path to temporarily download to and then move to the folder in the setting above. The destination path is created underneath the temp_download_path
temp_download_path: /home/tblyler/tempDownloads
"_rtorrent_password": "The HTTP Basic auth password to use for rtorrent's XMLRPC",
"rtorrent_password": "correct horse battery staple",
# If defined, the finished .torrent files finished are moved to their respected path here. Otherwise, they are deleted.
watch_to_finish_path:
/home/tblyler/torrent_files/tv: /home/tblyler/completed_torrent_files/tv
/home/tblyler/torrent_files: /home/tblyler/completed_torrent_files
"_ssh_username": "The ssh username to use for getting finished torrents from the remote host",
"ssh_username": "JohnDoe",
# The time in nano seconds to update the list of torrents and their statuses in rTorrent
rtorrent_update_interval: 60000000000
"_SSH_AUTH_COMMENT": "You may choose to use an ssh key or ssh password. If both are supplied, the password will not be used.",
# The number of concurrent completed torrent downloads to have at one time
download_jobs: 2
"_ssh_password": "The SSH password to use for SSH authentication",
"ssh_password": "correct horse battery staple SSH",
rtorrent:
# The address to the rtorrent XMLRPC endpoint
addr: mycoolrtorrentserver.com/XMLRPC
"_ssh_privkey_path": "The path to the private SSH key for SSH authentication",
"ssh_privkey_path": "/home/tblyler/.ssh/id_rsa",
# true to ignore the certificate authenticity; false to honor it
insecure_cert: false
"_ssh_addr": "The SSH address to connect to",
"ssh_addr": "mysshserver.com:22",
# The HTTP Basic auth username to use for rtorrent's XMLRPC
username: JohnDoe
"_ssh_connect_timeout": "The time in nano seconds to wait for an SSH connection attempt",
"ssh_connect_timeout": 30000000000,
# The HTTP Basic auth password to use for rtorrent's XMLRPC
password: "correct horse battery staple"
"_file_download_filemode": "The base 10 file mode to use for downloaded files",
"file_download_filemode": 511,
ssh:
# The ssh username to use for getting finished torrents from the remote host
username: JohnDoe
"_watch_to_download_paths": "The correlation of .torrent file paths and where their contents should be downloaded to",
"watch_to_download_paths": {
"/home/tblyler/torrent_files/tv": "/home/tblyler/Downloads/tv",
"/home/tblyler/torrent_files/movies": "/home/tblyler/Downloads/movies",
"/home/tblyler/torrent_files": "/home/tblyler/Downloads"
},
# You may choose to use an ssh key or ssh password. If both are supplied, the password will not be used.
"_temp_download_path": "The root path to temporarily download to and then move to the folder in the setting above. The destination path is created underneath the temp_download_path",
"temp_download_path": "/home/tblyler/tempDownloads",
# The SSH password to use for SSH authentication
password: "correct horse battery staple SSH"
"_watch_to_finish_path": "If defined, the finished .torrent files finished are moved to their respected path here. Otherwise, they are deleted.",
"watch_to_finish_path": {
"/home/tblyler/torrent_files/tv": "/home/tblyler/completed_torrent_files/tv",
"/home/tblyler/torrent_files": "/home/tblyler/completed_torrent_files"
},
# The path to the private SSH key for SSH authentication
privkey_path: /home/tblyler/.ssh/id_rsa
"_rtorrent_update_interval": "The time in nano seconds to update the list of torrents and their statuses in rTorrent",
"rtorrent_update_interval": 300000000000,
# The SSH address to connect to
addr: "mysshserver.com:22"
"_download_jobs": "The number of concurrent download streams to have at one time",
"download_jobs": 2
}
# The time in nano seconds to wait for an SSH connection attempt
connect_timeout: 30000000000
```

View file

@ -1,9 +1,9 @@
package main
import (
"encoding/json"
"flag"
"github.com/tblyler/hoarder/queue"
"gopkg.in/yaml.v2"
"io/ioutil"
"log"
"os"
@ -28,7 +28,7 @@ func main() {
}
config := &queue.Config{}
err = json.Unmarshal(configRaw, config)
err = yaml.Unmarshal(configRaw, config)
if err != nil {
logger.Printf("Unable to decode config json at '%s': '%s'", *configPath, err)
os.Exit(1)

View file

@ -19,21 +19,27 @@ import (
// Config defines the settings for watching, uploading, and downloading
type Config struct {
RtorrentAddr string `json:"rtorrent_addr"`
RtorrentInsecureCert bool `json:"rtorrent_insecure_cert"`
RtorrentUsername string `json:"rtorrent_username"`
RtorrentPassword string `json:"rtorrent_password"`
SSHUsername string `json:"ssh_username"`
SSHPassword string `json:"ssh_password"`
SSHKeyPath string `json:"ssh_privkey_path"`
SSHAddr string `json:"ssh_addr"`
SSHTimeout time.Duration `json:"ssh_connect_timeout"`
DownloadFileMode os.FileMode `json:"file_download_filemode"`
WatchDownloadPaths map[string]string `json:"watch_to_download_paths"`
TempDownloadPath string `json:"temp_download_path"`
FinishedTorrentFilePath map[string]string `json:"watch_to_finish_path"`
TorrentListUpdateInterval time.Duration `json:"rtorrent_update_interval"`
ConcurrentDownloads uint `json:"download_jobs"`
Rtorrent struct {
Addr string `json:"addr" yaml:"addr"`
InsecureCert bool `json:"insecure_cert" yaml:"insecure_cert"`
Username string `json:"username" yaml:"username"`
Password string `json:"password" yaml:"password"`
} `json:"rtorrent" yaml:"rtorrent,flow"`
SSH struct {
Username string `json:"username" yaml:"username"`
Password string `json:"password" yaml:"password"`
KeyPath string `json:"privkey_path" yaml:"privkey_path"`
Addr string `json:"addr" yaml:"addr"`
Timeout time.Duration `json:"connect_timeout" yaml:"connect_timeout"`
} `json:"ssh" yaml:"ssh,flow"`
DownloadFileMode os.FileMode `json:"file_download_filemode" yaml:"file_download_filemode"`
WatchDownloadPaths map[string]string `json:"watch_to_download_paths" yaml:"watch_to_download_paths,flow"`
TempDownloadPath string `json:"temp_download_path" yaml:"temp_download_path"`
FinishedTorrentFilePath map[string]string `json:"watch_to_finish_path" yaml:"watch_to_finish_path,flow"`
TorrentListUpdateInterval time.Duration `json:"rtorrent_update_interval" yaml:"rtorrent_update_interval"`
ConcurrentDownloads uint `json:"download_jobs" yaml:"download_jobs"`
}
// Queue watches the given folders for new .torrent files,
@ -116,15 +122,15 @@ func NewQueue(config *Config, logger *log.Logger) (*Queue, error) {
}
}
rtClient := rtorrent.New(config.RtorrentAddr, config.RtorrentInsecureCert)
rtClient.SetAuth(config.RtorrentUsername, config.RtorrentPassword)
rtClient := rtorrent.New(config.Rtorrent.Addr, config.Rtorrent.InsecureCert)
rtClient.SetAuth(config.Rtorrent.Username, config.Rtorrent.Password)
sftpClient, err := easysftp.Connect(&easysftp.ClientConfig{
Username: config.SSHUsername,
Password: config.SSHPassword,
KeyPath: config.SSHKeyPath,
Host: config.SSHAddr,
Timeout: config.SSHTimeout,
Username: config.SSH.Username,
Password: config.SSH.Password,
KeyPath: config.SSH.KeyPath,
Host: config.SSH.Addr,
Timeout: config.SSH.Timeout,
FileMode: config.DownloadFileMode,
})
if err != nil {