AutoConfigure for SAB is setup, it works for systems with NzbDrone and SABnzbd on the same server only.

pull/4/head
Mark McDowall 14 years ago
parent 70bfc49b4e
commit 49a059bdea

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NzbDrone.Core.Model
{
public class ConnectionInfoModel
{
public string Address { get; set; }
public int Port { get; set; }
}
}

@ -7,9 +7,8 @@ namespace NzbDrone.Core.Model
{ {
public class SabnzbdInfoModel public class SabnzbdInfoModel
{ {
public string ApiKey { get; set; } public string Host { get; set; }
public int Port { get; set; } public int Port { get; set; }
public string Username { get; set; } public string ApiKey { get; set; }
public string Password { get; set; }
} }
} }

@ -166,6 +166,7 @@
<Compile Include="Instrumentation\SubsonicTarget.cs" /> <Compile Include="Instrumentation\SubsonicTarget.cs" />
<Compile Include="Instrumentation\ExceptioneerTarget.cs" /> <Compile Include="Instrumentation\ExceptioneerTarget.cs" />
<Compile Include="Instrumentation\NlogWriter.cs" /> <Compile Include="Instrumentation\NlogWriter.cs" />
<Compile Include="Model\ConnectionInfoModel.cs" />
<Compile Include="Model\ExternalNotificationType.cs" /> <Compile Include="Model\ExternalNotificationType.cs" />
<Compile Include="Model\IndexerType.cs" /> <Compile Include="Model\IndexerType.cs" />
<Compile Include="Model\LanguageType.cs" /> <Compile Include="Model\LanguageType.cs" />

@ -1,6 +1,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
@ -10,58 +13,91 @@ namespace NzbDrone.Core.Providers
{ {
public class AutoConfigureProvider public class AutoConfigureProvider
{ {
private HttpProvider _httpProvider; public AutoConfigureProvider()
private ConfigProvider _configProvider; {
}
public AutoConfigureProvider(HttpProvider httpProvider, ConfigProvider configProvider) public SabnzbdInfoModel AutoConfigureSab()
{ {
_httpProvider = httpProvider; var info = GetConnectionList();
_configProvider = configProvider; return FindApiKey(info);
} }
public SabnzbdInfoModel AutoConfigureSab(string username, string password) private List<ConnectionInfoModel> GetConnectionList()
{ {
//Get Output from Netstat IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();
var netStatOutput = String.Empty; var info =
//var port = GetSabnzbdPort(netStatOutput); ipProperties.GetActiveTcpListeners().Select(
var port = 2222; p =>
var apiKey = GetSabnzbdApiKey(port); new ConnectionInfoModel
{Address = p.Address.ToString().Replace("0.0.0.0", "127.0.0.1"), Port = p.Port}).Distinct().
ToList();
info.RemoveAll(i => i.Port == 135);
info.RemoveAll(i => i.Port == 139);
info.RemoveAll(i => i.Port == 445);
info.RemoveAll(i => i.Port == 3389);
info.RemoveAll(i => i.Port == 5900);
info.RemoveAll(i => i.Address.Contains("::"));
info.Reverse();
return info;
}
if (port > 0 && !String.IsNullOrEmpty(apiKey)) private SabnzbdInfoModel FindApiKey(List<ConnectionInfoModel> info)
{
foreach (var connection in info)
{ {
return new SabnzbdInfoModel var apiKey = GetApiKey(connection.Address, connection.Port);
{ if (!String.IsNullOrEmpty(apiKey))
ApiKey = apiKey, return new SabnzbdInfoModel {
Port = port, Host = connection.Address,
Username = username, Port = connection.Port,
Password = password ApiKey = apiKey
}; };
} }
return null; return null;
} }
private int GetSabnzbdPort(string netstatOutput) private string GetApiKey(string ipAddress, int port)
{ {
Regex regex = new Regex(@"^(?:TCP\W+127.0.0.1:(?<port>\d+\W+).+?\r\n\W+\[sabnzbd.exe\])", RegexOptions.IgnoreCase var request = String.Format("http://{0}:{1}/config/general/", ipAddress, port);
| RegexOptions.Compiled); var result = DownloadString(request);
var match = regex.Match(netstatOutput);
var port = 0; Regex regex =
Int32.TryParse(match.Groups["port"].Value, out port); new Regex("\\<input\\Wtype\\=\\\"text\\\"\\Wid\\=\\\"apikey\\\"\\Wvalue\\=\\\"(?<apikey>\\w+)\\W",
RegexOptions.IgnoreCase
| RegexOptions.Compiled);
var match = regex.Match(result);
return port; if (match.Success)
{
return match.Groups["apikey"].Value;
}
return String.Empty;
} }
private string GetSabnzbdApiKey(int port, string ipAddress = "127.0.0.1") private string DownloadString(string url)
{ {
var request = String.Format("http://{0}:{1}/config/general/", ipAddress, port); try
var result = _httpProvider.DownloadString(request); {
var request = WebRequest.Create(url);
request.Timeout = 2000;
Regex regex = new Regex("\\<input\\Wtype\\=\\\"text\\\"\\Wid\\=\\\"apikey\\\"\\Wvalue\\=\\\"(?<apikey>\\w+)\\W", RegexOptions.IgnoreCase var response = request.GetResponse();
| RegexOptions.Compiled);
var match = regex.Match(result); var reader = new StreamReader(response.GetResponseStream());
return reader.ReadToEnd();
}
catch (Exception ex)
{
Console.WriteLine("Failed to get response from: {0}", url);
Console.WriteLine(ex.Message, ex);
}
return match.Groups["apikey"].Value; return String.Empty;
} }
} }
} }

@ -296,26 +296,18 @@ namespace NzbDrone.Web.Controllers
return new JsonResult { Data = "ok" }; return new JsonResult { Data = "ok" };
} }
public JsonResult AutoConfigureSab(string username, string password) public JsonResult AutoConfigureSab()
{ {
SabnzbdInfoModel info;
try try
{ {
//info = _autoConfigureProvider.AutoConfigureSab(username, password); var info = _autoConfigureProvider.AutoConfigureSab();
info = new SabnzbdInfoModel return Json(info, JsonRequestBehavior.AllowGet);
{
ApiKey = "123456",
Port = 2222
};
} }
catch (Exception) catch (Exception)
{ {
return new JsonResult { Data = "failed" }; return new JsonResult { Data = "failed" };
} }
return Json(info);
} }
[HttpPost] [HttpPost]

@ -599,7 +599,6 @@
<Content Include="Content\jquery.jgrowl.css" /> <Content Include="Content\jquery.jgrowl.css" />
<Content Include="Content\notibar.css" /> <Content Include="Content\notibar.css" />
<Content Include="Content\style.css" /> <Content Include="Content\style.css" />
<Content Include="Content\thickbox.css" />
<Content Include="Content\XbmcNotification.png" /> <Content Include="Content\XbmcNotification.png" />
<Content Include="favicon.ico" /> <Content Include="favicon.ico" />
<Content Include="Global.asax" /> <Content Include="Global.asax" />
@ -643,7 +642,6 @@
<Content Include="Scripts\jquery-tgc-countdown-1.0.js" /> <Content Include="Scripts\jquery-tgc-countdown-1.0.js" />
<Content Include="Scripts\jquery.simpledropdown.js" /> <Content Include="Scripts\jquery.simpledropdown.js" />
<Content Include="Scripts\Notification.js" /> <Content Include="Scripts\Notification.js" />
<Content Include="Scripts\thickbox-compressed.js" />
<Content Include="Views\AddSeries\AddExisting.cshtml" /> <Content Include="Views\AddSeries\AddExisting.cshtml" />
<Content Include="Views\AddSeries\AddNew.cshtml" /> <Content Include="Views\AddSeries\AddNew.cshtml" />
<Content Include="Views\AddSeries\AddSeriesItem.cshtml" /> <Content Include="Views\AddSeries\AddSeriesItem.cshtml" />

@ -113,7 +113,7 @@
<fieldset class="sub-field"> <fieldset class="sub-field">
<legend>SABnzbd</legend> <legend>SABnzbd</legend>
@*<button type="button" onclick="autoConfigureSab()">Auto-Configure</button>*@ <button type="button" onclick="autoConfigureSab()">Auto-Configure</button>
<div class="config-section"> <div class="config-section">
<div class="config-group"> <div class="config-group">
@ -223,9 +223,9 @@
function autoConfigureSab() { function autoConfigureSab() {
$.ajax({ $.ajax({
type: "POST", type: "GET",
url: autoConfigureSabUrl, url: autoConfigureSabUrl,
data: jQuery.param({ username: $('#SabUsername').val(), password: $('#SabPassword').val() }), //data: jQuery.param({ username: $('#SabUsername').val(), password: $('#SabPassword').val() }),
error: function (req, status, error) { error: function (req, status, error) {
alert("Sorry! We could not autoconfigure SABnzbd for you"); alert("Sorry! We could not autoconfigure SABnzbd for you");
}, },
@ -233,10 +233,9 @@
}); });
function autoConfigureSuccess(data) { function autoConfigureSuccess(data) {
$('#SabApiKey').val(data.ApiKey); $('#SabHost').val(data.Host);
$('#SabPort').val(data.Port); $('#SabPort').val(data.Port);
$('#SabUsername').val(data.Username); $('#SabApiKey').val(data.ApiKey);
$('#SabPassword').val(data.Password);
} }
} }
</script> </script>
Loading…
Cancel
Save