Update: Disco ICT Online Services - Plugin Library
Migrate plugin library to https://services.discoict.com.au
This commit is contained in:
@@ -248,6 +248,8 @@
|
||||
<Compile Include="Interop\ActiveDirectory\IADObject.cs" />
|
||||
<Compile Include="Interop\DiscoServices\DiscoServiceHelpers.cs" />
|
||||
<Compile Include="Interop\DiscoServices\Jobs.cs" />
|
||||
<Compile Include="Interop\DiscoServices\PluginLibrary.cs" />
|
||||
<Compile Include="Interop\DiscoServices\PluginLibraryUpdateTask.cs" />
|
||||
<Compile Include="Interop\VicEduDept\VicSmart.cs" />
|
||||
<Compile Include="Interop\DiscoServices\UpdateQuery.cs" />
|
||||
<Compile Include="Interop\DiscoServices\UpdateQueryTask.cs" />
|
||||
@@ -275,7 +277,6 @@
|
||||
<Compile Include="Logging\Persistance\LogPersistContext.cs" />
|
||||
<Compile Include="Logging\Persistance\LogPersistContextInitializer.cs" />
|
||||
<Compile Include="Logging\Utilities.cs" />
|
||||
<Compile Include="Plugins\CommunityInterop\PluginLibraryUpdateTask.cs" />
|
||||
<Compile Include="Plugins\Features\RepairProvider\RepairProviderFeature.cs" />
|
||||
<Compile Include="Plugins\Features\RepairProvider\RepairProviderSubmitJobException.cs" />
|
||||
<Compile Include="Plugins\Features\UIExtension\Results\LiteralResult.cs" />
|
||||
@@ -379,7 +380,7 @@
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<ProjectExtensions>
|
||||
<VisualStudio>
|
||||
<UserProperties BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.DeltaBaseYear.MonthAndDayStamp.TimeStamp" BuildVersion_StartDate="2014/6/1" BuildVersion_BuildAction="Both" BuildVersion_DetectChanges="False" BuildVersion_UseGlobalSettings="False" />
|
||||
<UserProperties BuildVersion_UseGlobalSettings="False" BuildVersion_DetectChanges="False" BuildVersion_BuildAction="Both" BuildVersion_StartDate="2014/6/1" BuildVersion_BuildVersioningStyle="None.DeltaBaseYear.MonthAndDayStamp.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UpdateFileVersion="True" />
|
||||
</VisualStudio>
|
||||
</ProjectExtensions>
|
||||
<PropertyGroup>
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
using Disco.Data.Repository;
|
||||
using Disco.Models.Services.Interop.DiscoServices;
|
||||
using Disco.Services.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Web;
|
||||
|
||||
namespace Disco.Services.Interop.DiscoServices
|
||||
{
|
||||
public static class PluginLibrary
|
||||
{
|
||||
private static string UpdateUrl()
|
||||
{
|
||||
return string.Concat(DiscoServiceHelpers.ServicesUrl, "API/Plugins/Library/V2");
|
||||
}
|
||||
|
||||
public static string InitialManifestFilename()
|
||||
{
|
||||
return HttpContext.Current.Server.MapPath("~/ClientBin/DiscoServices.InitialPluginLibraryManifest.json");
|
||||
}
|
||||
|
||||
public static string ManifestFilename(DiscoDataContext Database)
|
||||
{
|
||||
return Path.Combine(Database.DiscoConfiguration.PluginPackagesLocation, "LibraryManifest.json");
|
||||
}
|
||||
|
||||
public static PluginLibraryManifestV2 LoadManifest(DiscoDataContext Database)
|
||||
{
|
||||
var manifestFile = ManifestFilename(Database);
|
||||
|
||||
if (File.Exists(manifestFile))
|
||||
{
|
||||
return JsonConvert.DeserializeObject<PluginLibraryManifestV2>(File.ReadAllText(manifestFile));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Use Initial Plugin Library Manifest
|
||||
manifestFile = InitialManifestFilename();
|
||||
|
||||
if (File.Exists(manifestFile))
|
||||
return JsonConvert.DeserializeObject<PluginLibraryManifestV2>(File.ReadAllText(manifestFile));
|
||||
|
||||
throw new FileNotFoundException("No plugin library manifest file was found", manifestFile);
|
||||
}
|
||||
}
|
||||
|
||||
public static PluginLibraryIncompatibility LoadIncompatibilityData(this PluginLibraryManifestV2 LibraryManifest)
|
||||
{
|
||||
var pluginAssembly = typeof(PluginLibrary).Assembly;
|
||||
Version hostVersion = pluginAssembly.GetName().Version;
|
||||
|
||||
return new PluginLibraryIncompatibility()
|
||||
{
|
||||
IncompatiblePlugins = LibraryManifest.Plugins.SelectMany(p => p.Releases, (p, r) =>
|
||||
{
|
||||
var rVersion = Version.Parse(r.Version);
|
||||
|
||||
if (r.Blocked)
|
||||
return new PluginIncompatibility() { PluginId = r.PluginId, Version = rVersion, Reason = "This plugin release is blocked by Disco ICT Online Services" };
|
||||
|
||||
if (r.HostMinVersion != null && hostVersion < Version.Parse(r.HostMinVersion))
|
||||
return new PluginIncompatibility() { PluginId = r.PluginId, Version = rVersion, Reason = string.Format("This plugin requires v{0} or newer", r.HostMinVersion) };
|
||||
|
||||
if (r.HostMaxVersion != null && hostVersion > Version.Parse(r.HostMaxVersion))
|
||||
return new PluginIncompatibility() { PluginId = r.PluginId, Version = rVersion, Reason = string.Format("This plugin requires v{0} or older", r.HostMaxVersion) };
|
||||
|
||||
return null;
|
||||
}).Where(i => i != null).ToList()
|
||||
};
|
||||
}
|
||||
|
||||
public static PluginLibraryManifestV2 UpdateManifest(DiscoDataContext Database, IScheduledTaskStatus Status)
|
||||
{
|
||||
Status.UpdateStatus(10, "Sending Request");
|
||||
|
||||
PluginLibraryManifestV2 result;
|
||||
|
||||
var discoVersion = UpdateQuery.CurrentDiscoVersionFormatted();
|
||||
var url = UpdateUrl();
|
||||
|
||||
using (var httpClient = new HttpClient())
|
||||
{
|
||||
using (var formData = new FormUrlEncodedContent(new KeyValuePair<string, string>[] {
|
||||
new KeyValuePair<string, string>("DeploymentId", Database.DiscoConfiguration.DeploymentId),
|
||||
new KeyValuePair<string, string>("DiscoVersion", discoVersion)
|
||||
}))
|
||||
{
|
||||
var response = httpClient.PostAsync(url, formData).Result;
|
||||
|
||||
response.EnsureSuccessStatusCode();
|
||||
|
||||
Status.UpdateStatus(50, "Waiting for Response");
|
||||
|
||||
var resultJson = response.Content.ReadAsStringAsync().Result;
|
||||
|
||||
Status.UpdateStatus(90, "Processing Response");
|
||||
|
||||
result = JsonConvert.DeserializeObject<PluginLibraryManifestV2>(resultJson);
|
||||
}
|
||||
}
|
||||
|
||||
var manifestJson = JsonConvert.SerializeObject(result);
|
||||
|
||||
var manifestFile = PluginLibrary.ManifestFilename(Database);
|
||||
|
||||
if (!Directory.Exists(Path.GetDirectoryName(manifestFile)))
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(manifestFile));
|
||||
|
||||
File.WriteAllText(manifestFile, manifestJson);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static PluginLibraryItemReleaseV2 LatestCompatibleRelease(this PluginLibraryItemV2 LibraryItem, PluginLibraryIncompatibility Incompatibility)
|
||||
{
|
||||
return LibraryItem.Releases.OrderByDescending(r => Version.Parse(r.Version)).FirstOrDefault(r => Incompatibility.IsCompatible(r));
|
||||
}
|
||||
|
||||
public static bool IsCompatible(this PluginLibraryIncompatibility IncompatibilityLibrary, PluginLibraryItemReleaseV2 Release)
|
||||
{
|
||||
PluginIncompatibility incompatibility;
|
||||
|
||||
return IsCompatible(IncompatibilityLibrary, Release, out incompatibility);
|
||||
}
|
||||
|
||||
public static bool IsCompatible(this PluginLibraryIncompatibility IncompatibilityLibrary, PluginLibraryItemReleaseV2 Release, out PluginIncompatibility Incompatibility)
|
||||
{
|
||||
return IsCompatible(IncompatibilityLibrary, Release.PluginId, Version.Parse(Release.Version), out Incompatibility);
|
||||
}
|
||||
|
||||
public static bool IsCompatible(this PluginLibraryIncompatibility IncompatibilityLibrary, string PluginId, Version Version)
|
||||
{
|
||||
PluginIncompatibility incompatibility;
|
||||
|
||||
return IsCompatible(IncompatibilityLibrary, PluginId, Version, out incompatibility);
|
||||
}
|
||||
|
||||
public static bool IsCompatible(this PluginLibraryIncompatibility IncompatibilityLibrary, string PluginId, Version Version, out PluginIncompatibility Incompatibility)
|
||||
{
|
||||
Incompatibility = IncompatibilityLibrary.IncompatiblePlugins.FirstOrDefault(i => i.PluginId.Equals(PluginId, StringComparison.OrdinalIgnoreCase) && i.Version == Version);
|
||||
|
||||
return Incompatibility == null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
using Disco.Data.Repository;
|
||||
using Disco.Services.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
using Quartz;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
|
||||
namespace Disco.Services.Interop.DiscoServices
|
||||
{
|
||||
public class PluginLibraryUpdateTask : ScheduledTask
|
||||
{
|
||||
public override string TaskName { get { return "Disco ICT - Update Plugin Library"; } }
|
||||
public override bool SingleInstanceTask { get { return true; } }
|
||||
public override bool CancelInitiallySupported { get { return false; } }
|
||||
|
||||
public override void InitalizeScheduledTask(DiscoDataContext Database)
|
||||
{
|
||||
// Random time between midday and midnight.
|
||||
var rnd = new Random();
|
||||
|
||||
var rndHour = rnd.Next(12, 23);
|
||||
var rndMinute = rnd.Next(0, 59);
|
||||
|
||||
TriggerBuilder triggerBuilder = TriggerBuilder.Create().
|
||||
WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(rndHour, rndMinute));
|
||||
|
||||
this.ScheduleTask(triggerBuilder);
|
||||
}
|
||||
|
||||
protected override void ExecuteTask()
|
||||
{
|
||||
using (DiscoDataContext database = new DiscoDataContext())
|
||||
{
|
||||
Status.UpdateStatus(1, "Updating Plugin Library Manifest", "Initializing");
|
||||
|
||||
var manifest = PluginLibrary.UpdateManifest(database, this.Status);
|
||||
|
||||
Status.SetFinishedMessage("The Plugin Library Manifest was updated successfully");
|
||||
}
|
||||
}
|
||||
|
||||
public static ScheduledTaskStatus ScheduleNow()
|
||||
{
|
||||
var taskStatus = RunningStatus;
|
||||
if (taskStatus != null)
|
||||
return taskStatus;
|
||||
else
|
||||
{
|
||||
var task = new PluginLibraryUpdateTask();
|
||||
return task.ScheduleTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static ScheduledTaskStatus RunningStatus
|
||||
{
|
||||
get
|
||||
{
|
||||
return ScheduledTasks.GetTaskStatuses(typeof(PluginLibraryUpdateTask)).Where(ts => ts.IsRunning).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,218 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Disco.Data.Repository;
|
||||
using Disco.Services.Plugins;
|
||||
using Disco.Services.Tasks;
|
||||
using Disco.Models.BI.Interop.Community;
|
||||
using System.Net;
|
||||
using System.Xml.Serialization;
|
||||
using System.IO;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Converters;
|
||||
using Quartz;
|
||||
using Disco.Services.Interop.DiscoServices;
|
||||
|
||||
namespace Disco.Services.Plugins.CommunityInterop
|
||||
{
|
||||
public class PluginLibraryUpdateTask : ScheduledTask
|
||||
{
|
||||
public override string TaskName { get { return "Disco Community - Update Plugin Library"; } }
|
||||
|
||||
public static string CurrentDiscoVersion()
|
||||
{
|
||||
var AssemblyVersion = typeof(PluginLibraryUpdateTask).Assembly.GetName().Version;
|
||||
return string.Format("{0}.{1}.{2:0000}.{3:0000}", AssemblyVersion.Major, AssemblyVersion.Minor, AssemblyVersion.Build, AssemblyVersion.Revision);
|
||||
}
|
||||
|
||||
protected override void ExecuteTask()
|
||||
{
|
||||
ExecuteTaskInternal(this.Status);
|
||||
Status.SetFinishedMessage("The Plugin Library Catalogue was updated.");
|
||||
}
|
||||
|
||||
internal static void ExecuteTaskInternal(ScheduledTaskStatus Status)
|
||||
{
|
||||
PluginLibraryUpdateRequest updateRequestBody;
|
||||
PluginLibraryUpdateResponse updateResult;
|
||||
string catalogueFile;
|
||||
PluginLibraryCompatibilityRequest compatRequestBody;
|
||||
PluginLibraryCompatibilityResponse compatResult;
|
||||
string compatibilityFile;
|
||||
|
||||
var DiscoBIVersion = CurrentDiscoVersion();
|
||||
HttpWebRequest webRequest;
|
||||
|
||||
#region Update
|
||||
|
||||
Status.UpdateStatus(1, "Updating Plugin Library Catalogue", "Building Request");
|
||||
|
||||
using (DiscoDataContext database = new DiscoDataContext())
|
||||
{
|
||||
catalogueFile = Plugins.CatalogueFile(database);
|
||||
|
||||
updateRequestBody = new PluginLibraryUpdateRequest()
|
||||
{
|
||||
DeploymentId = database.DiscoConfiguration.DeploymentId,
|
||||
HostVersion = typeof(Plugins).Assembly.GetName().Version.ToString(4)
|
||||
};
|
||||
}
|
||||
|
||||
Status.UpdateStatus(10, "Sending Request");
|
||||
|
||||
webRequest = (HttpWebRequest)HttpWebRequest.Create(PluginLibraryUpdateUrl());
|
||||
webRequest.KeepAlive = false;
|
||||
|
||||
webRequest.ContentType = "application/xml";
|
||||
webRequest.Method = WebRequestMethods.Http.Post;
|
||||
webRequest.UserAgent = string.Format("Disco/{0} (PluginLibrary)", DiscoBIVersion);
|
||||
|
||||
using (var wrStream = webRequest.GetRequestStream())
|
||||
{
|
||||
XmlSerializer xml = new XmlSerializer(typeof(PluginLibraryUpdateRequest));
|
||||
xml.Serialize(wrStream, updateRequestBody);
|
||||
}
|
||||
|
||||
Status.UpdateStatus(20, "Waiting for Response");
|
||||
|
||||
using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
|
||||
{
|
||||
if (webResponse.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
Status.UpdateStatus(45, "Reading Response");
|
||||
using (var wResStream = webResponse.GetResponseStream())
|
||||
{
|
||||
XmlSerializer xml = new XmlSerializer(typeof(PluginLibraryUpdateResponse));
|
||||
updateResult = (PluginLibraryUpdateResponse)xml.Deserialize(wResStream);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Status.SetTaskException(new WebException(string.Format("Server responded with: [{0}] {1}", webResponse.StatusCode, webResponse.StatusDescription)));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Directory.Exists(Path.GetDirectoryName(catalogueFile)))
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(catalogueFile));
|
||||
|
||||
using (FileStream fs = new FileStream(catalogueFile, FileMode.Create, FileAccess.Write, FileShare.None))
|
||||
{
|
||||
using (StreamWriter fsWriter = new StreamWriter(fs))
|
||||
{
|
||||
fsWriter.Write(JsonConvert.SerializeObject(updateResult));
|
||||
fsWriter.Flush();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Compatibility
|
||||
|
||||
Status.UpdateStatus(50, "Updating Plugin Library Compatibility", "Building Request");
|
||||
|
||||
using (DiscoDataContext database = new DiscoDataContext())
|
||||
{
|
||||
compatibilityFile = Plugins.CompatibilityFile(database);
|
||||
|
||||
compatRequestBody = new PluginLibraryCompatibilityRequest()
|
||||
{
|
||||
DeploymentId = database.DiscoConfiguration.DeploymentId,
|
||||
HostVersion = typeof(Plugins).Assembly.GetName().Version.ToString(4)
|
||||
};
|
||||
}
|
||||
|
||||
Status.UpdateStatus(60, "Sending Request");
|
||||
|
||||
webRequest = (HttpWebRequest)HttpWebRequest.Create(PluginLibraryCompatibilityUrl());
|
||||
webRequest.KeepAlive = false;
|
||||
|
||||
webRequest.ContentType = "application/json";
|
||||
webRequest.Method = WebRequestMethods.Http.Post;
|
||||
webRequest.UserAgent = string.Format("Disco/{0} (PluginLibrary)", DiscoBIVersion);
|
||||
|
||||
using (var wrStream = webRequest.GetRequestStream())
|
||||
{
|
||||
XmlSerializer xml = new XmlSerializer(typeof(PluginLibraryCompatibilityRequest));
|
||||
xml.Serialize(wrStream, compatRequestBody);
|
||||
}
|
||||
|
||||
Status.UpdateStatus(70, "Waiting for Response");
|
||||
|
||||
using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
|
||||
{
|
||||
if (webResponse.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
Status.UpdateStatus(95, "Reading Response");
|
||||
using (var wResStream = webResponse.GetResponseStream())
|
||||
{
|
||||
XmlSerializer xml = new XmlSerializer(typeof(PluginLibraryCompatibilityResponse));
|
||||
compatResult = (PluginLibraryCompatibilityResponse)xml.Deserialize(wResStream);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Status.SetTaskException(new WebException(string.Format("Server responded with: [{0}] {1}", webResponse.StatusCode, webResponse.StatusDescription)));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Directory.Exists(Path.GetDirectoryName(compatibilityFile)))
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(compatibilityFile));
|
||||
|
||||
using (FileStream fs = new FileStream(compatibilityFile, FileMode.Create, FileAccess.Write, FileShare.None))
|
||||
{
|
||||
using (StreamWriter fsWriter = new StreamWriter(fs))
|
||||
{
|
||||
fsWriter.Write(JsonConvert.SerializeObject(compatResult));
|
||||
fsWriter.Flush();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
private static string PluginLibraryUpdateUrl()
|
||||
{
|
||||
return string.Concat(DiscoServiceHelpers.CommunityUrl(), "DiscoPluginLibrary/V1");
|
||||
}
|
||||
private static string PluginLibraryCompatibilityUrl()
|
||||
{
|
||||
return string.Concat(DiscoServiceHelpers.CommunityUrl(), "DiscoPluginLibrary/CompatibilityV1");
|
||||
}
|
||||
|
||||
public static ScheduledTaskStatus ScheduleNow()
|
||||
{
|
||||
|
||||
var taskStatus = ScheduledTasks.GetTaskStatuses(typeof(PluginLibraryUpdateTask)).Where(ts => ts.IsRunning).FirstOrDefault();
|
||||
if (taskStatus != null)
|
||||
return taskStatus;
|
||||
else
|
||||
{
|
||||
var t = new PluginLibraryUpdateTask();
|
||||
return t.ScheduleTask();
|
||||
}
|
||||
}
|
||||
public static ScheduledTaskStatus RunningStatus
|
||||
{
|
||||
get
|
||||
{
|
||||
return ScheduledTasks.GetTaskStatuses(typeof(PluginLibraryUpdateTask)).Where(ts => ts.IsRunning).FirstOrDefault();
|
||||
}
|
||||
}
|
||||
|
||||
public override void InitalizeScheduledTask(DiscoDataContext Database)
|
||||
{
|
||||
// Random time between midday and midnight.
|
||||
var rnd = new Random();
|
||||
|
||||
var rndHour = rnd.Next(12, 23);
|
||||
var rndMinute = rnd.Next(0, 59);
|
||||
|
||||
TriggerBuilder triggerBuilder = TriggerBuilder.Create().
|
||||
WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(rndHour, rndMinute));
|
||||
|
||||
this.ScheduleTask(triggerBuilder);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,13 @@
|
||||
using Disco.Data.Repository;
|
||||
using Disco.Models.Services.Interop.DiscoServices;
|
||||
using Disco.Services.Interop.DiscoServices;
|
||||
using Disco.Services.Tasks;
|
||||
using Quartz;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
|
||||
namespace Disco.Services.Plugins
|
||||
{
|
||||
@@ -33,31 +35,17 @@ namespace Disco.Services.Plugins
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(packageFilePath));
|
||||
|
||||
// Need to Download the Package
|
||||
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(packageUrlPath);
|
||||
webRequest.KeepAlive = false;
|
||||
|
||||
webRequest.ContentType = "application/xml";
|
||||
webRequest.Method = WebRequestMethods.Http.Get;
|
||||
webRequest.UserAgent = string.Format("Disco/{0} (PluginLibrary)", Disco.Services.Plugins.CommunityInterop.PluginLibraryUpdateTask.CurrentDiscoVersion());
|
||||
|
||||
using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
|
||||
using (HttpClient httpClient = new HttpClient())
|
||||
{
|
||||
if (webResponse.StatusCode == HttpStatusCode.OK)
|
||||
using (var httpResponse = httpClient.GetAsync(packageUrlPath).Result)
|
||||
{
|
||||
Status.UpdateStatus(0, "Downloading...");
|
||||
using (var wResStream = webResponse.GetResponseStream())
|
||||
httpResponse.EnsureSuccessStatusCode();
|
||||
|
||||
using (FileStream fsOut = new FileStream(packageFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
|
||||
{
|
||||
using (FileStream fsOut = new FileStream(packageFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
|
||||
{
|
||||
wResStream.CopyTo(fsOut);
|
||||
}
|
||||
httpResponse.Content.ReadAsStreamAsync().Result.CopyTo(fsOut);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Status.SetTaskException(new WebException(string.Format("Server responded with: [{0}] {1}", webResponse.StatusCode, webResponse.StatusDescription)));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,10 +85,10 @@ namespace Disco.Services.Plugins
|
||||
string packagePath = Path.Combine(database.DiscoConfiguration.PluginsLocation, packageManifest.Id);
|
||||
|
||||
// Check for Compatibility
|
||||
var compatibilityData = Plugins.LoadCompatibilityData(database);
|
||||
var pluginCompatibility = compatibilityData.Plugins.FirstOrDefault(i => i.Id.Equals(packageManifest.Id, StringComparison.OrdinalIgnoreCase) && packageManifest.Version == Version.Parse(i.Version));
|
||||
if (pluginCompatibility != null && !pluginCompatibility.Compatible)
|
||||
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] is not compatible: {2}", packageManifest.Id, packageManifest.VersionFormatted, pluginCompatibility.Reason));
|
||||
var libraryIncompatibility = PluginLibrary.LoadManifest(database).LoadIncompatibilityData();
|
||||
PluginIncompatibility incompatibility;
|
||||
if (!libraryIncompatibility.IsCompatible(packageManifest.Id, packageManifest.Version, out incompatibility))
|
||||
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] is not compatible: {2}", packageManifest.Id, packageManifest.VersionFormatted, incompatibility.Reason));
|
||||
|
||||
// Force Delete of Existing Folder
|
||||
if (Directory.Exists(packagePath))
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Disco.Data.Repository;
|
||||
using Disco.Models.BI.Interop.Community;
|
||||
using Disco.Models.Services.Interop.DiscoServices;
|
||||
using Disco.Services.Interop.DiscoServices;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -248,81 +249,6 @@ namespace Disco.Services.Plugins
|
||||
throw new InvalidOperationException(string.Format("Unknown Plugin Feature Category Type: [{0}]", FeatureCategoryType.Name));
|
||||
}
|
||||
|
||||
public static string CatalogueFile(DiscoDataContext Database)
|
||||
{
|
||||
return Path.Combine(Database.DiscoConfiguration.PluginPackagesLocation, "Catalogue.json");
|
||||
}
|
||||
public static string CompatibilityFile(DiscoDataContext Database)
|
||||
{
|
||||
return Path.Combine(Database.DiscoConfiguration.PluginPackagesLocation, "Compatibility.json");
|
||||
}
|
||||
|
||||
public static PluginLibraryUpdateResponse LoadCatalogue(DiscoDataContext Database)
|
||||
{
|
||||
var catalogueFile = CatalogueFile(Database);
|
||||
|
||||
if (!File.Exists(catalogueFile))
|
||||
return null;
|
||||
|
||||
return JsonConvert.DeserializeObject<PluginLibraryUpdateResponse>(File.ReadAllText(catalogueFile));
|
||||
}
|
||||
|
||||
public static PluginLibraryCompatibilityResponse LoadCompatibilityData(DiscoDataContext Database)
|
||||
{
|
||||
var pluginAssembly = typeof(Plugins).Assembly;
|
||||
Version hostVersion = pluginAssembly.GetName().Version;
|
||||
PluginLibraryCompatibilityResponse Data = null;
|
||||
var localCompatFile = Path.Combine(Path.GetDirectoryName(pluginAssembly.Location), "ReleasePluginCompatibility.json");
|
||||
var serverCompatFile = CompatibilityFile(Database);
|
||||
|
||||
if (File.Exists(localCompatFile))
|
||||
{
|
||||
Data = JsonConvert.DeserializeObject<PluginLibraryCompatibilityResponse>(File.ReadAllText(localCompatFile));
|
||||
Data.HostVersion = hostVersion.ToString(4);
|
||||
}
|
||||
if (File.Exists(serverCompatFile))
|
||||
{
|
||||
var serverData = JsonConvert.DeserializeObject<PluginLibraryCompatibilityResponse>(File.ReadAllText(serverCompatFile));
|
||||
if (Version.Parse(serverData.HostVersion) == hostVersion)
|
||||
{
|
||||
if (Data == null)
|
||||
{
|
||||
// No Local Compatibility File
|
||||
Data = serverData;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Join Compatibility Files
|
||||
var localItems = Data.Plugins;
|
||||
var localItemVersions = localItems.ToDictionary(i => i, i => Version.Parse(i.Version));
|
||||
var joinedItems = localItems.ToList();
|
||||
Data.ResponseTimestamp = serverData.ResponseTimestamp;
|
||||
foreach (var serverItem in serverData.Plugins)
|
||||
{
|
||||
var serverItemVersion = Version.Parse(serverItem.Version);
|
||||
var localItem = localItems.FirstOrDefault(i => i.Id.Equals(serverItem.Id, StringComparison.OrdinalIgnoreCase) && serverItemVersion == localItemVersions[i]);
|
||||
if (localItem != null)
|
||||
joinedItems.Remove(localItem);
|
||||
|
||||
joinedItems.Add(serverItem);
|
||||
}
|
||||
Data.Plugins = joinedItems;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Data == null)
|
||||
{
|
||||
Data = new PluginLibraryCompatibilityResponse()
|
||||
{
|
||||
HostVersion = hostVersion.ToString(4),
|
||||
Plugins = new List<PluginLibraryCompatibilityItem>(),
|
||||
ResponseTimestamp = new DateTime(2011, 7, 1)
|
||||
};
|
||||
}
|
||||
|
||||
return Data;
|
||||
}
|
||||
|
||||
public static void InitalizePlugins(DiscoDataContext Database)
|
||||
{
|
||||
if (_PluginManifests == null)
|
||||
@@ -332,7 +258,7 @@ namespace Disco.Services.Plugins
|
||||
if (_PluginManifests == null)
|
||||
{
|
||||
Version hostVersion = typeof(Plugins).Assembly.GetName().Version;
|
||||
var compatibilityData = new Lazy<PluginLibraryCompatibilityResponse>(() => LoadCompatibilityData(Database));
|
||||
var compatibilityData = new Lazy<PluginLibraryIncompatibility>(() => PluginLibrary.LoadManifest(Database).LoadIncompatibilityData());
|
||||
Dictionary<string, PluginManifest> loadedPlugins = new Dictionary<string, PluginManifest>();
|
||||
|
||||
PluginPath = Database.DiscoConfiguration.PluginsLocation;
|
||||
@@ -371,9 +297,9 @@ namespace Disco.Services.Plugins
|
||||
if (pluginManifest != null)
|
||||
{
|
||||
// Check Version Compatibility
|
||||
var pluginCompatibility = compatibilityData.Value.Plugins.FirstOrDefault(i => i.Id.Equals(pluginManifest.Id, StringComparison.OrdinalIgnoreCase) && pluginManifest.Version == Version.Parse(i.Version));
|
||||
if (pluginCompatibility != null && !pluginCompatibility.Compatible)
|
||||
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] is not compatible: {2}", pluginManifest.Id, pluginManifest.VersionFormatted, pluginCompatibility.Reason));
|
||||
var pluginIncompatible = compatibilityData.Value.IncompatiblePlugins.FirstOrDefault(i => i.PluginId.Equals(pluginManifest.Id, StringComparison.OrdinalIgnoreCase) && pluginManifest.Version == i.Version);
|
||||
if (pluginIncompatible != null)
|
||||
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] is not compatible: {2}", pluginManifest.Id, pluginManifest.VersionFormatted, pluginIncompatible.Reason));
|
||||
|
||||
if (pluginManifest.HostVersionMin != null && pluginManifest.HostVersionMin > hostVersion)
|
||||
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] does not support this version of Disco (Requires v{2} or greater)", pluginManifest.Id, pluginManifest.VersionFormatted, pluginManifest.HostVersionMin.ToString()));
|
||||
@@ -441,13 +367,13 @@ namespace Disco.Services.Plugins
|
||||
_PluginAssemblyManifests = _PluginManifests.Values.ToDictionary(p => p.PluginAssembly, p => p);
|
||||
}
|
||||
|
||||
public static PluginManifest UpdatePlugin(DiscoDataContext Database, PluginManifest ExistingManifest, String UpdatePluginPackageFilePath, PluginLibraryCompatibilityResponse CompatibilityData = null)
|
||||
public static PluginManifest UpdatePlugin(DiscoDataContext Database, PluginManifest ExistingManifest, String UpdatePluginPackageFilePath, PluginLibraryIncompatibility PluginLibraryIncompatibility = null)
|
||||
{
|
||||
PluginManifest updatedManifest;
|
||||
|
||||
using (var packageStream = File.OpenRead(UpdatePluginPackageFilePath))
|
||||
{
|
||||
updatedManifest = UpdatePlugin(Database, ExistingManifest, packageStream, CompatibilityData);
|
||||
updatedManifest = UpdatePlugin(Database, ExistingManifest, packageStream, PluginLibraryIncompatibility);
|
||||
}
|
||||
|
||||
// Remove Update after processing
|
||||
@@ -456,7 +382,7 @@ namespace Disco.Services.Plugins
|
||||
return updatedManifest;
|
||||
}
|
||||
|
||||
public static PluginManifest UpdatePlugin(DiscoDataContext Database, PluginManifest ExistingManifest, Stream UpdatePluginPackage, PluginLibraryCompatibilityResponse CompatibilityData = null)
|
||||
public static PluginManifest UpdatePlugin(DiscoDataContext Database, PluginManifest ExistingManifest, Stream UpdatePluginPackage, PluginLibraryIncompatibility PluginLibraryIncompatibility = null)
|
||||
{
|
||||
using (MemoryStream packageStream = new MemoryStream())
|
||||
{
|
||||
@@ -486,11 +412,11 @@ namespace Disco.Services.Plugins
|
||||
}
|
||||
|
||||
// Check Compatibility
|
||||
if (CompatibilityData == null)
|
||||
CompatibilityData = LoadCompatibilityData(Database);
|
||||
var pluginCompatibility = CompatibilityData.Plugins.FirstOrDefault(i => i.Id.Equals(packageManifest.Id, StringComparison.OrdinalIgnoreCase) && packageManifest.Version == Version.Parse(i.Version));
|
||||
if (pluginCompatibility != null && !pluginCompatibility.Compatible)
|
||||
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] is not compatible: {2}", packageManifest.Id, packageManifest.VersionFormatted, pluginCompatibility.Reason));
|
||||
if (PluginLibraryIncompatibility == null)
|
||||
PluginLibraryIncompatibility = PluginLibrary.LoadManifest(Database).LoadIncompatibilityData();
|
||||
var pluginIncompatibility = PluginLibraryIncompatibility.IncompatiblePlugins.FirstOrDefault(i => i.PluginId.Equals(packageManifest.Id, StringComparison.OrdinalIgnoreCase) && packageManifest.Version == i.Version);
|
||||
if (pluginIncompatibility != null)
|
||||
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] is not compatible: {2}", packageManifest.Id, packageManifest.VersionFormatted, pluginIncompatibility.Reason));
|
||||
|
||||
string packagePath = Path.Combine(Database.DiscoConfiguration.PluginsLocation, packageManifest.Id);
|
||||
|
||||
|
||||
@@ -1,17 +1,14 @@
|
||||
using System;
|
||||
using Disco.Data.Repository;
|
||||
using Disco.Models.Services.Interop.DiscoServices;
|
||||
using Disco.Services.Interop.DiscoServices;
|
||||
using Disco.Services.Tasks;
|
||||
using Quartz;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
using Disco.Data.Repository;
|
||||
using Disco.Models.BI.Interop.Community;
|
||||
using Disco.Services.Tasks;
|
||||
using Quartz;
|
||||
using System.Net.Http;
|
||||
|
||||
namespace Disco.Services.Plugins
|
||||
{
|
||||
@@ -24,17 +21,19 @@ namespace Disco.Services.Plugins
|
||||
string pluginId = (string)this.ExecutionContext.JobDetail.JobDataMap["PluginId"];
|
||||
string packageFilePath = (string)this.ExecutionContext.JobDetail.JobDataMap["PackageFilePath"];
|
||||
|
||||
PluginLibraryUpdateResponse catalogue;
|
||||
PluginLibraryManifestV2 libraryManifest;
|
||||
PluginLibraryIncompatibility libraryIncompatibility;
|
||||
string pluginPackagesLocation;
|
||||
|
||||
if (!Plugins.PluginsLoaded)
|
||||
throw new InvalidOperationException("Plugins have not been initialized");
|
||||
|
||||
List<Tuple<PluginManifest, string, PluginLibraryItem>> updatePlugins;
|
||||
List<Tuple<PluginManifest, string, PluginLibraryItemV2, PluginLibraryItemReleaseV2>> updatePlugins;
|
||||
|
||||
using (DiscoDataContext database = new DiscoDataContext())
|
||||
{
|
||||
catalogue = Plugins.LoadCatalogue(database);
|
||||
libraryManifest = PluginLibrary.LoadManifest(database);
|
||||
libraryIncompatibility = libraryManifest.LoadIncompatibilityData();
|
||||
pluginPackagesLocation = database.DiscoConfiguration.PluginPackagesLocation;
|
||||
}
|
||||
|
||||
@@ -44,30 +43,41 @@ namespace Disco.Services.Plugins
|
||||
{
|
||||
// Update Single from Catalogue
|
||||
PluginManifest existingManifest = Plugins.GetPlugin(pluginId);
|
||||
var catalogueItem = catalogue.Plugins.FirstOrDefault(p => p.Id == existingManifest.Id);
|
||||
var libraryItem = libraryManifest.Plugins.FirstOrDefault(p => p.Id == existingManifest.Id);
|
||||
|
||||
if (catalogueItem == null)
|
||||
throw new InvalidOperationException("No updates are available for this Plugin");
|
||||
if (Version.Parse(catalogueItem.LatestVersion) <= existingManifest.Version)
|
||||
if (libraryItem == null)
|
||||
throw new InvalidOperationException("This item isn't in the plugin library manifest");
|
||||
|
||||
var libraryItemRelease = libraryItem.LatestCompatibleRelease(libraryIncompatibility);
|
||||
|
||||
if (Version.Parse(libraryItemRelease.Version) <= existingManifest.Version)
|
||||
throw new InvalidOperationException("Only newer versions can be used to update a plugin");
|
||||
|
||||
updatePlugins = new List<Tuple<PluginManifest, string, PluginLibraryItem>>() {
|
||||
new Tuple<PluginManifest,string,PluginLibraryItem>(existingManifest, null, catalogueItem)
|
||||
updatePlugins = new List<Tuple<PluginManifest, string, PluginLibraryItemV2, PluginLibraryItemReleaseV2>>() {
|
||||
Tuple.Create(existingManifest, (string)null, libraryItem, libraryItemRelease)
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
// Update Single from Local
|
||||
PluginManifest existingManifest = Plugins.GetPlugin(pluginId);
|
||||
updatePlugins = new List<Tuple<PluginManifest, string, PluginLibraryItem>>() {
|
||||
new Tuple<PluginManifest,string,PluginLibraryItem>(existingManifest, packageFilePath, null)
|
||||
updatePlugins = new List<Tuple<PluginManifest, string, PluginLibraryItemV2, PluginLibraryItemReleaseV2>>() {
|
||||
Tuple.Create(existingManifest, packageFilePath, (PluginLibraryItemV2)null, (PluginLibraryItemReleaseV2)null)
|
||||
};
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Update All
|
||||
updatePlugins = Plugins.GetPlugins().Join((IEnumerable<PluginLibraryItem>)catalogue.Plugins, manifest => manifest.Id, update => update.Id, (manifest, update) => new Tuple<PluginManifest, string, PluginLibraryItem>(manifest, null, update)).Where(i => Version.Parse(i.Item3.LatestVersion) > i.Item1.Version).ToList();
|
||||
updatePlugins = Plugins.GetPlugins()
|
||||
.Join(
|
||||
libraryManifest.Plugins,
|
||||
manifest => manifest.Id,
|
||||
libraryItem => libraryItem.Id,
|
||||
(manifest, libraryItem) => Tuple.Create(manifest, (string)null, libraryItem, libraryItem.LatestCompatibleRelease(libraryIncompatibility)),
|
||||
StringComparer.OrdinalIgnoreCase)
|
||||
.Where(i => Version.Parse(i.Item4.Version) > i.Item1.Version)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
if (updatePlugins == null || updatePlugins.Count == 0)
|
||||
@@ -115,31 +125,40 @@ namespace Disco.Services.Plugins
|
||||
|
||||
internal static void UpdateOffline(ScheduledTaskStatus Status)
|
||||
{
|
||||
PluginLibraryUpdateResponse pluginCatalogue = null;
|
||||
PluginLibraryManifestV2 libraryManifest = null;
|
||||
PluginLibraryIncompatibility libraryIncompatibility = null;
|
||||
List<PluginManifest> installedPluginManifests;
|
||||
string pluginPackagesLocation;
|
||||
List<Tuple<PluginManifest, string, PluginLibraryItem>> updatePlugins = new List<Tuple<PluginManifest, string, PluginLibraryItem>>();
|
||||
List<Tuple<PluginManifest, string, PluginLibraryItemV2, PluginLibraryItemReleaseV2>> updatePlugins =
|
||||
new List<Tuple<PluginManifest, string, PluginLibraryItemV2, PluginLibraryItemReleaseV2>>();
|
||||
|
||||
|
||||
|
||||
using (DiscoDataContext database = new DiscoDataContext())
|
||||
{
|
||||
pluginPackagesLocation = database.DiscoConfiguration.PluginPackagesLocation;
|
||||
installedPluginManifests = OfflineInstalledPlugins(database);
|
||||
|
||||
if (installedPluginManifests.Count > 0)
|
||||
pluginCatalogue = Plugins.LoadCatalogue(database);
|
||||
if (installedPluginManifests.Count > 0){
|
||||
libraryManifest = PluginLibrary.LoadManifest(database);
|
||||
libraryIncompatibility = libraryManifest.LoadIncompatibilityData();
|
||||
}
|
||||
}
|
||||
|
||||
if (pluginCatalogue != null && installedPluginManifests.Count > 0)
|
||||
if (libraryManifest != null && installedPluginManifests.Count > 0)
|
||||
{
|
||||
foreach (var pluginManifest in installedPluginManifests)
|
||||
{
|
||||
// Check for Update
|
||||
var catalogueItem = pluginCatalogue.Plugins.FirstOrDefault(i => i.Id == pluginManifest.Id && Version.Parse(i.LatestVersion) > pluginManifest.Version);
|
||||
var libraryItem = libraryManifest.Plugins.FirstOrDefault(i => i.Id == pluginManifest.Id);
|
||||
|
||||
if (catalogueItem != null)
|
||||
{ // Update Available
|
||||
updatePlugins.Add(new Tuple<PluginManifest, string, PluginLibraryItem>(pluginManifest, null, catalogueItem));
|
||||
if (libraryItem != null)
|
||||
{
|
||||
var libraryItemRelease = libraryItem.LatestCompatibleRelease(libraryIncompatibility);
|
||||
|
||||
if (libraryItemRelease != null && Version.Parse(libraryItemRelease.Version) > pluginManifest.Version)
|
||||
{ // Update Available
|
||||
updatePlugins.Add(Tuple.Create(pluginManifest, (string)null, libraryItem, libraryItemRelease));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -150,18 +169,19 @@ namespace Disco.Services.Plugins
|
||||
}
|
||||
}
|
||||
|
||||
internal static void ExecuteTaskInternal(ScheduledTaskStatus Status, string pluginPackagesLocation, List<Tuple<PluginManifest, string, PluginLibraryItem>> UpdatePlugins)
|
||||
internal static void ExecuteTaskInternal(ScheduledTaskStatus Status, string pluginPackagesLocation, List<Tuple<PluginManifest, string, PluginLibraryItemV2, PluginLibraryItemReleaseV2>> UpdatePlugins)
|
||||
{
|
||||
while (UpdatePlugins.Count > 0)
|
||||
{
|
||||
var updatePlugin = UpdatePlugins[0];
|
||||
var existingManifest = updatePlugin.Item1;
|
||||
var packageTempFilePath = updatePlugin.Item2;
|
||||
var catalogueItem = updatePlugin.Item3;
|
||||
var libraryItem = updatePlugin.Item3;
|
||||
var libraryItemRelease = updatePlugin.Item4;
|
||||
UpdatePlugins.Remove(updatePlugin);
|
||||
|
||||
var pluginId = existingManifest != null ? existingManifest.Id : catalogueItem.Id;
|
||||
var pluginName = existingManifest != null ? existingManifest.Name : catalogueItem.Name;
|
||||
var pluginId = existingManifest != null ? existingManifest.Id : libraryItemRelease.PluginId;
|
||||
var pluginName = existingManifest != null ? existingManifest.Name : libraryItem.Name;
|
||||
|
||||
if (string.IsNullOrEmpty(packageTempFilePath))
|
||||
{
|
||||
@@ -176,31 +196,19 @@ namespace Disco.Services.Plugins
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(packageTempFilePath));
|
||||
|
||||
// Need to Download the Package
|
||||
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(catalogueItem.LatestDownloadUrl);
|
||||
webRequest.KeepAlive = false;
|
||||
|
||||
webRequest.ContentType = "application/xml";
|
||||
webRequest.Method = WebRequestMethods.Http.Get;
|
||||
webRequest.UserAgent = string.Format("Disco/{0} (PluginLibrary)", Disco.Services.Plugins.CommunityInterop.PluginLibraryUpdateTask.CurrentDiscoVersion());
|
||||
|
||||
using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
|
||||
using (HttpClient httpClient = new HttpClient())
|
||||
{
|
||||
if (webResponse.StatusCode == HttpStatusCode.OK)
|
||||
Status.UpdateStatus(0, "Downloading...");
|
||||
|
||||
using (var httpResponse = httpClient.GetAsync(libraryItemRelease.DownloadUrl).Result)
|
||||
{
|
||||
Status.UpdateStatus(0, "Downloading...");
|
||||
using (var wResStream = webResponse.GetResponseStream())
|
||||
httpResponse.EnsureSuccessStatusCode();
|
||||
|
||||
using (FileStream fsOut = new FileStream(packageTempFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
|
||||
{
|
||||
using (FileStream fsOut = new FileStream(packageTempFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
|
||||
{
|
||||
wResStream.CopyTo(fsOut);
|
||||
}
|
||||
httpResponse.Content.ReadAsStreamAsync().Result.CopyTo(fsOut);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Status.SetTaskException(new WebException(string.Format("Server responded with: [{0}] {1}", webResponse.StatusCode, webResponse.StatusDescription)));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -234,10 +242,10 @@ namespace Disco.Services.Plugins
|
||||
using (DiscoDataContext database = new DiscoDataContext())
|
||||
{
|
||||
// Check for Compatibility
|
||||
var compatibilityData = Plugins.LoadCompatibilityData(database);
|
||||
var pluginCompatibility = compatibilityData.Plugins.FirstOrDefault(i => i.Id.Equals(updateManifest.Id, StringComparison.OrdinalIgnoreCase) && updateManifest.Version == Version.Parse(i.Version));
|
||||
if (pluginCompatibility != null && !pluginCompatibility.Compatible)
|
||||
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] is not compatible: {2}", updateManifest.Id, updateManifest.VersionFormatted, pluginCompatibility.Reason));
|
||||
var incompatibilityLibrary = PluginLibrary.LoadManifest(database).LoadIncompatibilityData();
|
||||
PluginIncompatibility incompatibility;
|
||||
if (!incompatibilityLibrary.IsCompatible(updateManifest.Id, updateManifest.Version, out incompatibility))
|
||||
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] is not compatible: {2}", updateManifest.Id, updateManifest.VersionFormatted, incompatibility.Reason));
|
||||
|
||||
var updatePluginPath = Path.Combine(database.DiscoConfiguration.PluginsLocation, string.Format("{0}.discoPlugin", updateManifest.Id));
|
||||
File.Move(packageTempFilePath, updatePluginPath);
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Disco.Data.Repository;
|
||||
using Disco.Services.Interop.DiscoServices;
|
||||
using Disco.Services.Tasks;
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace Disco.Services.Plugins
|
||||
{
|
||||
@@ -20,12 +19,15 @@ namespace Disco.Services.Plugins
|
||||
// Wait for App to Load (10 Seconds)
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
this.Status.UpdateStatus(10 * i);
|
||||
this.Status.UpdateStatus(10 * i);
|
||||
System.Threading.Thread.Sleep(1000);
|
||||
}
|
||||
|
||||
// Update Catalogue
|
||||
CommunityInterop.PluginLibraryUpdateTask.ExecuteTaskInternal(this.Status);
|
||||
using (DiscoDataContext database = new DiscoDataContext())
|
||||
{
|
||||
PluginLibrary.UpdateManifest(database, this.Status);
|
||||
}
|
||||
|
||||
// Update all Plugins
|
||||
UpdatePluginTask.UpdateOffline(this.Status);
|
||||
|
||||
Reference in New Issue
Block a user