Update: Plugin Updating
Updating plugins from the plugin catalogue, and automatic updating of plugins after a newer version of Disco is installed.
This commit is contained in:
@@ -18,13 +18,17 @@ namespace Disco.BI.Interop.Community
|
|||||||
{
|
{
|
||||||
private static string UpdateUrl()
|
private static string UpdateUrl()
|
||||||
{
|
{
|
||||||
return string.Concat(CommunityHelpers.CommunityUrl(), "DiscoUpdate/V1");
|
return string.Concat(Disco.Data.Configuration.CommunityHelpers.CommunityUrl(), "DiscoUpdate/V1");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string CurrentDiscoVersion()
|
public static Version CurrentDiscoVersion()
|
||||||
{
|
{
|
||||||
var AssemblyVersion = typeof(UpdateCheck).Assembly.GetName().Version;
|
return typeof(UpdateCheck).Assembly.GetName().Version;
|
||||||
return string.Format("{0}.{1}.{2:0000}.{3:0000}", AssemblyVersion.Major, AssemblyVersion.Minor, AssemblyVersion.Build, AssemblyVersion.Revision);
|
}
|
||||||
|
public static string CurrentDiscoVersionFormatted()
|
||||||
|
{
|
||||||
|
var v = CurrentDiscoVersion();
|
||||||
|
return string.Format("{0}.{1}.{2:0000}.{3:0000}", v.Major, v.Minor, v.Build, v.Revision);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UpdateResponse Check(DiscoDataContext db, bool UseProxy, ScheduledTaskStatus status = null)
|
public static UpdateResponse Check(DiscoDataContext db, bool UseProxy, ScheduledTaskStatus status = null)
|
||||||
@@ -38,7 +42,7 @@ namespace Disco.BI.Interop.Community
|
|||||||
if (status != null)
|
if (status != null)
|
||||||
status.UpdateStatus(40, "Sending Request");
|
status.UpdateStatus(40, "Sending Request");
|
||||||
|
|
||||||
var DiscoBIVersion = CurrentDiscoVersion();
|
var DiscoBIVersion = CurrentDiscoVersionFormatted();
|
||||||
|
|
||||||
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(UpdateUrl());
|
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(UpdateUrl());
|
||||||
|
|
||||||
@@ -49,7 +53,7 @@ namespace Disco.BI.Interop.Community
|
|||||||
|
|
||||||
if (!UseProxy)
|
if (!UseProxy)
|
||||||
webRequest.Proxy = new WebProxy();
|
webRequest.Proxy = new WebProxy();
|
||||||
|
|
||||||
webRequest.ContentType = "application/json";
|
webRequest.ContentType = "application/json";
|
||||||
webRequest.Method = WebRequestMethods.Http.Post;
|
webRequest.Method = WebRequestMethods.Http.Post;
|
||||||
webRequest.UserAgent = string.Format("Disco/{0} (Update)", DiscoBIVersion);
|
webRequest.UserAgent = string.Format("Disco/{0} (Update)", DiscoBIVersion);
|
||||||
@@ -78,7 +82,7 @@ namespace Disco.BI.Interop.Community
|
|||||||
db.SaveChanges();
|
db.SaveChanges();
|
||||||
|
|
||||||
status.SetFinishedMessage(string.Format("The update server reported Version {0} is the latest.", result.Version));
|
status.SetFinishedMessage(string.Format("The update server reported Version {0} is the latest.", result.Version));
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -96,7 +100,7 @@ namespace Disco.BI.Interop.Community
|
|||||||
|
|
||||||
m.DeploymentId = db.DiscoConfiguration.DeploymentId;
|
m.DeploymentId = db.DiscoConfiguration.DeploymentId;
|
||||||
|
|
||||||
m.CurrentDiscoVersion = CurrentDiscoVersion();
|
m.CurrentDiscoVersion = CurrentDiscoVersionFormatted();
|
||||||
|
|
||||||
m.OrganisationName = db.DiscoConfiguration.OrganisationName;
|
m.OrganisationName = db.DiscoConfiguration.OrganisationName;
|
||||||
m.BroadbandDoeWanId = GetBroadbandDoeWanId();
|
m.BroadbandDoeWanId = GetBroadbandDoeWanId();
|
||||||
@@ -144,7 +148,7 @@ namespace Disco.BI.Interop.Community
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var DiscoBIVersion = CurrentDiscoVersion();
|
var DiscoBIVersion = CurrentDiscoVersionFormatted();
|
||||||
|
|
||||||
HttpWebRequest wReq = (HttpWebRequest)HttpWebRequest.Create("http://broadband.doe.wan/ipsearch/showresult.php");
|
HttpWebRequest wReq = (HttpWebRequest)HttpWebRequest.Create("http://broadband.doe.wan/ipsearch/showresult.php");
|
||||||
// Added: 2013-02-08 G#
|
// Added: 2013-02-08 G#
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ namespace Disco.BI.Interop.Community
|
|||||||
|
|
||||||
public override void InitalizeScheduledTask(Data.Repository.DiscoDataContext dbContext)
|
public override void InitalizeScheduledTask(Data.Repository.DiscoDataContext dbContext)
|
||||||
{
|
{
|
||||||
// ActiveDirectoryUpdateLastNetworkLogonDateJob @ 11:30pm
|
// Random time between midday and midnight.
|
||||||
var rnd = new Random();
|
var rnd = new Random();
|
||||||
|
|
||||||
var rndHour = rnd.Next(12, 23);
|
var rndHour = rnd.Next(12, 23);
|
||||||
|
|||||||
@@ -149,8 +149,6 @@
|
|||||||
<Compile Include="BI\Interop\ActiveDirectory\ActiveDirectoryUpdateLastNetworkLogonDateJob.cs" />
|
<Compile Include="BI\Interop\ActiveDirectory\ActiveDirectoryUpdateLastNetworkLogonDateJob.cs" />
|
||||||
<Compile Include="BI\Interop\ActiveDirectory\ActiveDirectoryUserAccountExtensions.cs" />
|
<Compile Include="BI\Interop\ActiveDirectory\ActiveDirectoryUserAccountExtensions.cs" />
|
||||||
<Compile Include="BI\Expressions\ExpressionCache.cs" />
|
<Compile Include="BI\Expressions\ExpressionCache.cs" />
|
||||||
<Compile Include="BI\Interop\Community\CommunityHelpers.cs" />
|
|
||||||
<Compile Include="BI\Interop\Community\PluginLibraryUpdateTask.cs" />
|
|
||||||
<Compile Include="BI\Interop\Community\UpdateCheck.cs" />
|
<Compile Include="BI\Interop\Community\UpdateCheck.cs" />
|
||||||
<Compile Include="BI\Interop\Community\UpdateCheckTask.cs" />
|
<Compile Include="BI\Interop\Community\UpdateCheckTask.cs" />
|
||||||
<Compile Include="BI\Interop\MimeTypes.cs" />
|
<Compile Include="BI\Interop\MimeTypes.cs" />
|
||||||
@@ -221,7 +219,7 @@
|
|||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<ProjectExtensions>
|
<ProjectExtensions>
|
||||||
<VisualStudio>
|
<VisualStudio>
|
||||||
<UserProperties BuildVersion_StartDate="2001/1/1" BuildVersion_BuildAction="ReBuild" BuildVersion_DetectChanges="False" BuildVersion_UseGlobalSettings="True" />
|
<UserProperties BuildVersion_UseGlobalSettings="True" BuildVersion_DetectChanges="False" BuildVersion_BuildAction="ReBuild" BuildVersion_StartDate="2001/1/1" />
|
||||||
</VisualStudio>
|
</VisualStudio>
|
||||||
</ProjectExtensions>
|
</ProjectExtensions>
|
||||||
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
|
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
|
||||||
|
|||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.2.0212.1702")]
|
[assembly: AssemblyVersion("1.2.0214.1848")]
|
||||||
[assembly: AssemblyFileVersion("1.2.0212.1702")]
|
[assembly: AssemblyFileVersion("1.2.0214.1848")]
|
||||||
|
|||||||
Binary file not shown.
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.2.0212.1702")]
|
[assembly: AssemblyVersion("1.2.0214.1848")]
|
||||||
[assembly: AssemblyFileVersion("1.2.0212.1702")]
|
[assembly: AssemblyFileVersion("1.2.0214.1848")]
|
||||||
|
|||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.2.0212.1702")]
|
[assembly: AssemblyVersion("1.2.0214.1848")]
|
||||||
[assembly: AssemblyFileVersion("1.2.0212.1702")]
|
[assembly: AssemblyFileVersion("1.2.0214.1848")]
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ using System.Net;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Disco.BI.Interop.Community
|
namespace Disco.Data.Configuration
|
||||||
{
|
{
|
||||||
public static class CommunityHelpers
|
public static class CommunityHelpers
|
||||||
{
|
{
|
||||||
@@ -460,15 +460,19 @@ namespace Disco.Data.Configuration
|
|||||||
return this.GetConfigurationValue<bool>(this.Scope, "UpdateBetaDeployment", false);
|
return this.GetConfigurationValue<bool>(this.Scope, "UpdateBetaDeployment", false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public string InstalledDatabaseVersion
|
public Version InstalledDatabaseVersion
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return this.GetConfigurationValue<string>(this.Scope, "InstalledDatabaseVersion", null);
|
var versionString = this.GetConfigurationValue<string>(this.Scope, "InstalledDatabaseVersion", null);
|
||||||
|
if (string.IsNullOrEmpty(versionString))
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return Version.Parse(versionString);
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
this.SetConfigurationValue<string>(this.Scope, "InstalledDatabaseVersion", value);
|
this.SetConfigurationValue<string>(this.Scope, "InstalledDatabaseVersion", value.ToString(4));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
+150
-149
@@ -1,150 +1,151 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
<ProductVersion>8.0.30703</ProductVersion>
|
<ProductVersion>8.0.30703</ProductVersion>
|
||||||
<SchemaVersion>2.0</SchemaVersion>
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
<ProjectGuid>{85A6BD19-2C64-4746-8F2C-A68A86E8C2D7}</ProjectGuid>
|
<ProjectGuid>{85A6BD19-2C64-4746-8F2C-A68A86E8C2D7}</ProjectGuid>
|
||||||
<OutputType>Library</OutputType>
|
<OutputType>Library</OutputType>
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>Disco.Data</RootNamespace>
|
<RootNamespace>Disco.Data</RootNamespace>
|
||||||
<AssemblyName>Disco.Data</AssemblyName>
|
<AssemblyName>Disco.Data</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<TargetFrameworkProfile />
|
<TargetFrameworkProfile />
|
||||||
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
|
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
|
||||||
<RestorePackages>true</RestorePackages>
|
<RestorePackages>true</RestorePackages>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<Optimize>false</Optimize>
|
<Optimize>false</Optimize>
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
<Reference Include="EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
<HintPath>..\packages\EntityFramework.5.0.0\lib\net45\EntityFramework.dll</HintPath>
|
<HintPath>..\packages\EntityFramework.5.0.0\lib\net45\EntityFramework.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
<Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
<HintPath>..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll</HintPath>
|
<HintPath>..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.ComponentModel.DataAnnotations" />
|
<Reference Include="System.ComponentModel.DataAnnotations" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Data.Entity" />
|
<Reference Include="System.Data.Entity" />
|
||||||
<Reference Include="System.Drawing" />
|
<Reference Include="System.Drawing" />
|
||||||
<Reference Include="System.Web" />
|
<Reference Include="System.Web" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Configuration\ConfigurationBase.cs" />
|
<Compile Include="Configuration\CommunityHelpers.cs" />
|
||||||
<Compile Include="Configuration\ConfigurationContext.cs" />
|
<Compile Include="Configuration\ConfigurationBase.cs" />
|
||||||
<Compile Include="Configuration\Modules\BootstrapperConfiguration.cs" />
|
<Compile Include="Configuration\ConfigurationContext.cs" />
|
||||||
<Compile Include="Configuration\Modules\DeviceProfileConfiguration.cs" />
|
<Compile Include="Configuration\Modules\BootstrapperConfiguration.cs" />
|
||||||
<Compile Include="Configuration\Modules\DeviceProfilesConfiguration.cs" />
|
<Compile Include="Configuration\Modules\DeviceProfileConfiguration.cs" />
|
||||||
<Compile Include="Configuration\Modules\OrganisationAddressesConfiguration.cs" />
|
<Compile Include="Configuration\Modules\DeviceProfilesConfiguration.cs" />
|
||||||
<Compile Include="Configuration\Modules\WirelessConfiguration.cs" />
|
<Compile Include="Configuration\Modules\OrganisationAddressesConfiguration.cs" />
|
||||||
<Compile Include="Migrations\201204250418485_DBv0.cs" />
|
<Compile Include="Configuration\Modules\WirelessConfiguration.cs" />
|
||||||
<Compile Include="Migrations\201204250418485_DBv0.Designer.cs">
|
<Compile Include="Migrations\201204250418485_DBv0.cs" />
|
||||||
<DependentUpon>201204250418485_DBv0.cs</DependentUpon>
|
<Compile Include="Migrations\201204250418485_DBv0.Designer.cs">
|
||||||
</Compile>
|
<DependentUpon>201204250418485_DBv0.cs</DependentUpon>
|
||||||
<Compile Include="Migrations\201205100307196_DBv1.cs" />
|
</Compile>
|
||||||
<Compile Include="Migrations\201205100307196_DBv1.Designer.cs">
|
<Compile Include="Migrations\201205100307196_DBv1.cs" />
|
||||||
<DependentUpon>201205100307196_DBv1.cs</DependentUpon>
|
<Compile Include="Migrations\201205100307196_DBv1.Designer.cs">
|
||||||
</Compile>
|
<DependentUpon>201205100307196_DBv1.cs</DependentUpon>
|
||||||
<Compile Include="Migrations\201205290205162_DBv2.cs" />
|
</Compile>
|
||||||
<Compile Include="Migrations\201205290205162_DBv2.Designer.cs">
|
<Compile Include="Migrations\201205290205162_DBv2.cs" />
|
||||||
<DependentUpon>201205290205162_DBv2.cs</DependentUpon>
|
<Compile Include="Migrations\201205290205162_DBv2.Designer.cs">
|
||||||
</Compile>
|
<DependentUpon>201205290205162_DBv2.cs</DependentUpon>
|
||||||
<Compile Include="Migrations\201206140712161_DBv3.cs" />
|
</Compile>
|
||||||
<Compile Include="Migrations\201206140712161_DBv3.Designer.cs">
|
<Compile Include="Migrations\201206140712161_DBv3.cs" />
|
||||||
<DependentUpon>201206140712161_DBv3.cs</DependentUpon>
|
<Compile Include="Migrations\201206140712161_DBv3.Designer.cs">
|
||||||
</Compile>
|
<DependentUpon>201206140712161_DBv3.cs</DependentUpon>
|
||||||
<Compile Include="Migrations\201206280337277_DBv4.cs" />
|
</Compile>
|
||||||
<Compile Include="Migrations\201206280337277_DBv4.Designer.cs">
|
<Compile Include="Migrations\201206280337277_DBv4.cs" />
|
||||||
<DependentUpon>201206280337277_DBv4.cs</DependentUpon>
|
<Compile Include="Migrations\201206280337277_DBv4.Designer.cs">
|
||||||
</Compile>
|
<DependentUpon>201206280337277_DBv4.cs</DependentUpon>
|
||||||
<Compile Include="Migrations\201211090325116_DBv5.cs" />
|
</Compile>
|
||||||
<Compile Include="Migrations\201211090325116_DBv5.Designer.cs">
|
<Compile Include="Migrations\201211090325116_DBv5.cs" />
|
||||||
<DependentUpon>201211090325116_DBv5.cs</DependentUpon>
|
<Compile Include="Migrations\201211090325116_DBv5.Designer.cs">
|
||||||
</Compile>
|
<DependentUpon>201211090325116_DBv5.cs</DependentUpon>
|
||||||
<Compile Include="Migrations\201301150107063_DBv6.cs" />
|
</Compile>
|
||||||
<Compile Include="Migrations\201301150107063_DBv6.Designer.cs">
|
<Compile Include="Migrations\201301150107063_DBv6.cs" />
|
||||||
<DependentUpon>201301150107063_DBv6.cs</DependentUpon>
|
<Compile Include="Migrations\201301150107063_DBv6.Designer.cs">
|
||||||
</Compile>
|
<DependentUpon>201301150107063_DBv6.cs</DependentUpon>
|
||||||
<Compile Include="Migrations\Configuration.cs" />
|
</Compile>
|
||||||
<Compile Include="Migrations\DiscoDataMigrator.cs" />
|
<Compile Include="Migrations\Configuration.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Migrations\DiscoDataMigrator.cs" />
|
||||||
<Compile Include="Properties\Resources.Designer.cs">
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<AutoGen>True</AutoGen>
|
<Compile Include="Properties\Resources.Designer.cs">
|
||||||
<DesignTime>True</DesignTime>
|
<AutoGen>True</AutoGen>
|
||||||
<DependentUpon>Resources.resx</DependentUpon>
|
<DesignTime>True</DesignTime>
|
||||||
</Compile>
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
<Compile Include="Repository\DiscoDatabaseConnectionFactory.cs" />
|
</Compile>
|
||||||
<Compile Include="Repository\DiscoDataContext.cs" />
|
<Compile Include="Repository\DiscoDatabaseConnectionFactory.cs" />
|
||||||
<Compile Include="Repository\DiscoDataContextInitializer.cs" />
|
<Compile Include="Repository\DiscoDataContext.cs" />
|
||||||
<Compile Include="Repository\DiscoDataSeeder.cs" />
|
<Compile Include="Repository\DiscoDataContextInitializer.cs" />
|
||||||
</ItemGroup>
|
<Compile Include="Repository\DiscoDataSeeder.cs" />
|
||||||
<ItemGroup>
|
</ItemGroup>
|
||||||
<None Include="App.config">
|
<ItemGroup>
|
||||||
<SubType>Designer</SubType>
|
<None Include="App.config">
|
||||||
</None>
|
<SubType>Designer</SubType>
|
||||||
</ItemGroup>
|
</None>
|
||||||
<ItemGroup>
|
</ItemGroup>
|
||||||
<ProjectReference Include="..\Disco.Models\Disco.Models.csproj">
|
<ItemGroup>
|
||||||
<Project>{FBC05512-FCCA-4B16-9E76-8C413C5DE6C9}</Project>
|
<ProjectReference Include="..\Disco.Models\Disco.Models.csproj">
|
||||||
<Name>Disco.Models</Name>
|
<Project>{FBC05512-FCCA-4B16-9E76-8C413C5DE6C9}</Project>
|
||||||
</ProjectReference>
|
<Name>Disco.Models</Name>
|
||||||
</ItemGroup>
|
</ProjectReference>
|
||||||
<ItemGroup>
|
</ItemGroup>
|
||||||
<EmbeddedResource Include="Migrations\201211090325116_DBv5.resx">
|
<ItemGroup>
|
||||||
<DependentUpon>201211090325116_DBv5.cs</DependentUpon>
|
<EmbeddedResource Include="Migrations\201211090325116_DBv5.resx">
|
||||||
</EmbeddedResource>
|
<DependentUpon>201211090325116_DBv5.cs</DependentUpon>
|
||||||
<EmbeddedResource Include="Migrations\201301150107063_DBv6.resx">
|
</EmbeddedResource>
|
||||||
<DependentUpon>201301150107063_DBv6.cs</DependentUpon>
|
<EmbeddedResource Include="Migrations\201301150107063_DBv6.resx">
|
||||||
</EmbeddedResource>
|
<DependentUpon>201301150107063_DBv6.cs</DependentUpon>
|
||||||
<EmbeddedResource Include="Properties\Resources.resx">
|
</EmbeddedResource>
|
||||||
<Generator>ResXFileCodeGenerator</Generator>
|
<EmbeddedResource Include="Properties\Resources.resx">
|
||||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
<Generator>ResXFileCodeGenerator</Generator>
|
||||||
<SubType>Designer</SubType>
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
</EmbeddedResource>
|
<SubType>Designer</SubType>
|
||||||
</ItemGroup>
|
</EmbeddedResource>
|
||||||
<ItemGroup>
|
</ItemGroup>
|
||||||
<None Include="packages.config" />
|
<ItemGroup>
|
||||||
<None Include="Resources\EmptyLogo.png" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
<None Include="Resources\EmptyLogo.png" />
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
</ItemGroup>
|
||||||
<ProjectExtensions>
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<VisualStudio>
|
<ProjectExtensions>
|
||||||
<UserProperties BuildVersion_BuildAction="ReBuild" BuildVersion_UseGlobalSettings="True" BuildVersion_DetectChanges="False" BuildVersion_StartDate="2001/1/1" />
|
<VisualStudio>
|
||||||
</VisualStudio>
|
<UserProperties BuildVersion_StartDate="2001/1/1" BuildVersion_DetectChanges="False" BuildVersion_UseGlobalSettings="True" BuildVersion_BuildAction="ReBuild" />
|
||||||
</ProjectExtensions>
|
</VisualStudio>
|
||||||
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
|
</ProjectExtensions>
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
<Target Name="BeforeBuild">
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
</Target>
|
<Target Name="BeforeBuild">
|
||||||
<Target Name="AfterBuild">
|
</Target>
|
||||||
</Target>
|
<Target Name="AfterBuild">
|
||||||
-->
|
</Target>
|
||||||
|
-->
|
||||||
</Project>
|
</Project>
|
||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.2.0212.1702")]
|
[assembly: AssemblyVersion("1.2.0214.1848")]
|
||||||
[assembly: AssemblyFileVersion("1.2.0212.1702")]
|
[assembly: AssemblyFileVersion("1.2.0214.1848")]
|
||||||
|
|||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.2.0212.1702")]
|
[assembly: AssemblyVersion("1.2.0214.1848")]
|
||||||
[assembly: AssemblyFileVersion("1.2.0212.1702")]
|
[assembly: AssemblyFileVersion("1.2.0214.1848")]
|
||||||
|
|||||||
@@ -101,6 +101,9 @@
|
|||||||
<Compile Include="Logging\Targets\LogLiveContext.cs" />
|
<Compile Include="Logging\Targets\LogLiveContext.cs" />
|
||||||
<Compile Include="Logging\Targets\LogPersistContext.cs" />
|
<Compile Include="Logging\Targets\LogPersistContext.cs" />
|
||||||
<Compile Include="Logging\Utilities.cs" />
|
<Compile Include="Logging\Utilities.cs" />
|
||||||
|
<Compile Include="Plugins\CommunityInterop\PluginLibraryUpdateTask.cs" />
|
||||||
|
<Compile Include="Plugins\UpdatePluginsAfterDiscoUpdateTask.cs" />
|
||||||
|
<Compile Include="Plugins\UpdatePluginTask.cs" />
|
||||||
<Compile Include="Plugins\InstallPluginTask.cs" />
|
<Compile Include="Plugins\InstallPluginTask.cs" />
|
||||||
<Compile Include="Plugins\PluginAttribute.cs" />
|
<Compile Include="Plugins\PluginAttribute.cs" />
|
||||||
<Compile Include="Plugins\PluginExtensions.cs" />
|
<Compile Include="Plugins\PluginExtensions.cs" />
|
||||||
@@ -126,7 +129,6 @@
|
|||||||
<Compile Include="Plugins\UnknownPluginException.cs" />
|
<Compile Include="Plugins\UnknownPluginException.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Tasks\ScheduledTask.cs" />
|
<Compile Include="Tasks\ScheduledTask.cs" />
|
||||||
<Compile Include="Tasks\ScheduledTaskCleanup.cs" />
|
|
||||||
<Compile Include="Tasks\ScheduledTasks.cs" />
|
<Compile Include="Tasks\ScheduledTasks.cs" />
|
||||||
<Compile Include="Tasks\ScheduledTasksLog.cs" />
|
<Compile Include="Tasks\ScheduledTasksLog.cs" />
|
||||||
<Compile Include="Tasks\ScheduledTaskStatus.cs" />
|
<Compile Include="Tasks\ScheduledTaskStatus.cs" />
|
||||||
|
|||||||
+33
-11
@@ -12,14 +12,27 @@ using System.Xml.Serialization;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Converters;
|
using Newtonsoft.Json.Converters;
|
||||||
|
using Quartz;
|
||||||
|
|
||||||
namespace Disco.BI.Interop.Community
|
namespace Disco.Services.Plugins.CommunityInterop
|
||||||
{
|
{
|
||||||
public class PluginLibraryUpdateTask : ScheduledTask
|
public class PluginLibraryUpdateTask : ScheduledTask
|
||||||
{
|
{
|
||||||
public override string TaskName { get { return "Disco Community - Update Plugin Library"; } }
|
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()
|
protected override void ExecuteTask()
|
||||||
|
{
|
||||||
|
ExecuteTaskInternal(this.Status);
|
||||||
|
Status.SetFinishedMessage("The Plugin Library Catalogue was updated.");
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void ExecuteTaskInternal(ScheduledTaskStatus Status)
|
||||||
{
|
{
|
||||||
PluginLibraryUpdateRequest updateRequestBody;
|
PluginLibraryUpdateRequest updateRequestBody;
|
||||||
PluginLibraryUpdateResponse updateResult;
|
PluginLibraryUpdateResponse updateResult;
|
||||||
@@ -28,13 +41,13 @@ namespace Disco.BI.Interop.Community
|
|||||||
PluginLibraryCompatibilityResponse compatResult;
|
PluginLibraryCompatibilityResponse compatResult;
|
||||||
string compatibilityFile;
|
string compatibilityFile;
|
||||||
|
|
||||||
var DiscoBIVersion = UpdateCheck.CurrentDiscoVersion();
|
var DiscoBIVersion = CurrentDiscoVersion();
|
||||||
HttpWebRequest webRequest;
|
HttpWebRequest webRequest;
|
||||||
|
|
||||||
#region Update
|
#region Update
|
||||||
|
|
||||||
Status.UpdateStatus(1, "Updating Plugin Library Catalogue", "Building Request");
|
Status.UpdateStatus(1, "Updating Plugin Library Catalogue", "Building Request");
|
||||||
|
|
||||||
using (DiscoDataContext dbContext = new DiscoDataContext())
|
using (DiscoDataContext dbContext = new DiscoDataContext())
|
||||||
{
|
{
|
||||||
catalogueFile = Plugins.CatalogueFile(dbContext);
|
catalogueFile = Plugins.CatalogueFile(dbContext);
|
||||||
@@ -156,20 +169,15 @@ namespace Disco.BI.Interop.Community
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Status.SetFinishedMessage("The Plugin Library Catalogue was updated.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string PluginLibraryUpdateUrl()
|
private static string PluginLibraryUpdateUrl()
|
||||||
{
|
{
|
||||||
return string.Concat(CommunityHelpers.CommunityUrl(), "DiscoPluginLibrary/V1");
|
return string.Concat(Disco.Data.Configuration.CommunityHelpers.CommunityUrl(), "DiscoPluginLibrary/V1");
|
||||||
}
|
}
|
||||||
private static string PluginLibraryCompatibilityUrl()
|
private static string PluginLibraryCompatibilityUrl()
|
||||||
{
|
{
|
||||||
return string.Concat(CommunityHelpers.CommunityUrl(), "DiscoPluginLibrary/CompatibilityV1");
|
return string.Concat(Disco.Data.Configuration.CommunityHelpers.CommunityUrl(), "DiscoPluginLibrary/CompatibilityV1");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ScheduledTaskStatus ScheduleNow()
|
public static ScheduledTaskStatus ScheduleNow()
|
||||||
@@ -191,5 +199,19 @@ namespace Disco.BI.Interop.Community
|
|||||||
return ScheduledTasks.GetTaskStatuses(typeof(PluginLibraryUpdateTask)).Where(ts => ts.IsRunning).FirstOrDefault();
|
return ScheduledTasks.GetTaskStatuses(typeof(PluginLibraryUpdateTask)).Where(ts => ts.IsRunning).FirstOrDefault();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void InitalizeScheduledTask(DiscoDataContext dbContext)
|
||||||
|
{
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -158,6 +158,10 @@ namespace Disco.Services.Plugins
|
|||||||
{
|
{
|
||||||
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
|
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
|
||||||
throw new InvalidOperationException("A plugin is already being Installed");
|
throw new InvalidOperationException("A plugin is already being Installed");
|
||||||
|
if (ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginTask)).Where(s => s.IsRunning).Count() > 0)
|
||||||
|
throw new InvalidOperationException("A plugin is being Updated");
|
||||||
|
if (ScheduledTasks.GetTaskStatuses(typeof(UninstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
|
||||||
|
throw new InvalidOperationException("A plugin is being Uninstalled");
|
||||||
|
|
||||||
JobDataMap taskData = new JobDataMap() { { "PackageUrl", PackageUrl }, { "PackageFilePath", PackageFilePath }, { "DeletePackageAfterInstall", DeletePackageAfterInstall } };
|
JobDataMap taskData = new JobDataMap() { { "PackageUrl", PackageUrl }, { "PackageFilePath", PackageFilePath }, { "DeletePackageAfterInstall", DeletePackageAfterInstall } };
|
||||||
|
|
||||||
|
|||||||
@@ -348,6 +348,14 @@ namespace Disco.Services.Plugins
|
|||||||
return handler;
|
return handler;
|
||||||
}
|
}
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
|
public string ConfigurationUrl
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return string.Format("/Config/Plugins/{0}", HttpUtility.UrlEncode(this.Id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[JsonIgnore]
|
||||||
public bool HasWebHandler
|
public bool HasWebHandler
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -371,6 +379,14 @@ namespace Disco.Services.Plugins
|
|||||||
|
|
||||||
return handler;
|
return handler;
|
||||||
}
|
}
|
||||||
|
[JsonIgnore]
|
||||||
|
public string WebHandlerUrl
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return string.Format("/Plugin/{0}", HttpUtility.UrlEncode(this.Id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Tuple<string, string> WebResourcePath(string Resource)
|
public Tuple<string, string> WebResourcePath(string Resource)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ using System.IO.Compression;
|
|||||||
using Disco.Models.BI.Interop.Community;
|
using Disco.Models.BI.Interop.Community;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace Disco.Services.Plugins
|
namespace Disco.Services.Plugins
|
||||||
{
|
{
|
||||||
@@ -477,6 +478,27 @@ namespace Disco.Services.Plugins
|
|||||||
return categoryDisplayNames;
|
return categoryDisplayNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region Restart App
|
||||||
|
private static object _restartTimerLock = new object();
|
||||||
|
private static Timer _restartTimer;
|
||||||
|
internal static void RestartApp(int DelayMilliseconds)
|
||||||
|
{
|
||||||
|
lock (_restartTimerLock)
|
||||||
|
{
|
||||||
|
if (_restartTimer != null)
|
||||||
|
{
|
||||||
|
_restartTimer.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
_restartTimer = new Timer((state) =>
|
||||||
|
{
|
||||||
|
HttpRuntime.UnloadAppDomain();
|
||||||
|
//AppDomain.Unload(AppDomain.CurrentDomain);
|
||||||
|
}, null, DelayMilliseconds, Timeout.Infinite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region Plugin Referenced Assemblies Resolving
|
#region Plugin Referenced Assemblies Resolving
|
||||||
|
|
||||||
public static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
|
public static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
|
||||||
|
|||||||
@@ -45,13 +45,17 @@ namespace Disco.Services.Plugins
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.Status.Finished("Restarting Disco, please wait...", "/Config/Plugins");
|
this.Status.Finished("Restarting Disco, please wait...", "/Config/Plugins");
|
||||||
RestartApp(1500);
|
Plugins.RestartApp(1500);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ScheduledTaskStatus UninstallPlugin(PluginManifest Manifest, bool UninstallData)
|
public static ScheduledTaskStatus UninstallPlugin(PluginManifest Manifest, bool UninstallData)
|
||||||
{
|
{
|
||||||
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
|
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
|
||||||
throw new InvalidOperationException("A plugin is already being Uninstalled");
|
throw new InvalidOperationException("A plugin is already being Uninstalled");
|
||||||
|
if (ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginTask)).Where(s => s.IsRunning).Count() > 0)
|
||||||
|
throw new InvalidOperationException("A plugin is being Updated");
|
||||||
|
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
|
||||||
|
throw new InvalidOperationException("A plugin is being Installed");
|
||||||
|
|
||||||
JobDataMap taskData = new JobDataMap() { { "PluginManifest", Manifest }, { "UninstallData", UninstallData } };
|
JobDataMap taskData = new JobDataMap() { { "PluginManifest", Manifest }, { "UninstallData", UninstallData } };
|
||||||
|
|
||||||
@@ -59,26 +63,5 @@ namespace Disco.Services.Plugins
|
|||||||
|
|
||||||
return instance.ScheduleTask(taskData);
|
return instance.ScheduleTask(taskData);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Restart App
|
|
||||||
private static object _restartTimerLock = new object();
|
|
||||||
private static Timer _restartTimer;
|
|
||||||
private void RestartApp(int DelayMilliseconds)
|
|
||||||
{
|
|
||||||
lock (_restartTimerLock)
|
|
||||||
{
|
|
||||||
if (_restartTimer != null)
|
|
||||||
{
|
|
||||||
_restartTimer.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
_restartTimer = new Timer((state) =>
|
|
||||||
{
|
|
||||||
HttpRuntime.UnloadAppDomain();
|
|
||||||
//AppDomain.Unload(AppDomain.CurrentDomain);
|
|
||||||
}, null, DelayMilliseconds, Timeout.Infinite);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,252 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
namespace Disco.Services.Plugins
|
||||||
|
{
|
||||||
|
public class UpdatePluginTask : ScheduledTask
|
||||||
|
{
|
||||||
|
public override string TaskName { get { return "Updating Plugin/s"; } }
|
||||||
|
|
||||||
|
protected override void ExecuteTask()
|
||||||
|
{
|
||||||
|
string pluginId = (string)this.ExecutionContext.JobDetail.JobDataMap["PluginId"];
|
||||||
|
string packageFilePath = (string)this.ExecutionContext.JobDetail.JobDataMap["PackageFilePath"];
|
||||||
|
|
||||||
|
PluginLibraryUpdateResponse catalogue;
|
||||||
|
string pluginPackagesLocation;
|
||||||
|
|
||||||
|
if (!Plugins.PluginsLoaded)
|
||||||
|
throw new InvalidOperationException("Plugins have not been initialized");
|
||||||
|
|
||||||
|
List<Tuple<PluginManifest, string, PluginLibraryItem>> updatePlugins;
|
||||||
|
|
||||||
|
using (DiscoDataContext dbContext = new DiscoDataContext())
|
||||||
|
{
|
||||||
|
catalogue = Plugins.LoadCatalogue(dbContext);
|
||||||
|
pluginPackagesLocation = dbContext.DiscoConfiguration.PluginPackagesLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(pluginId))
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(packageFilePath))
|
||||||
|
{
|
||||||
|
// Update Single from Catalogue
|
||||||
|
PluginManifest existingManifest = Plugins.GetPlugin(pluginId);
|
||||||
|
var catalogueItem = catalogue.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)
|
||||||
|
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)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (updatePlugins == null || updatePlugins.Count == 0)
|
||||||
|
{
|
||||||
|
this.Status.Finished("No plugins to update...", "/Config/Plugins");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ExecuteTaskInternal(this.Status, pluginPackagesLocation, updatePlugins);
|
||||||
|
|
||||||
|
this.Status.Finished("Restarting Disco, please wait...", "/Config/Plugins");
|
||||||
|
Plugins.RestartApp(1500);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void UpdateOffline(ScheduledTaskStatus Status)
|
||||||
|
{
|
||||||
|
string pluginsLocation;
|
||||||
|
string pluginPackagesLocation;
|
||||||
|
PluginLibraryUpdateResponse pluginCatalogue;
|
||||||
|
List<Tuple<PluginManifest, string, PluginLibraryItem>> UpdatePlugins = new List<Tuple<PluginManifest, string, PluginLibraryItem>>();
|
||||||
|
|
||||||
|
using (DiscoDataContext dbContext = new DiscoDataContext())
|
||||||
|
{
|
||||||
|
pluginCatalogue = Plugins.LoadCatalogue(dbContext);
|
||||||
|
pluginsLocation = dbContext.DiscoConfiguration.PluginsLocation;
|
||||||
|
pluginPackagesLocation = dbContext.DiscoConfiguration.PluginPackagesLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
DirectoryInfo pluginDirectoryRoot = new DirectoryInfo(pluginsLocation);
|
||||||
|
if (pluginDirectoryRoot.Exists)
|
||||||
|
{
|
||||||
|
foreach (DirectoryInfo pluginDirectory in pluginDirectoryRoot.EnumerateDirectories())
|
||||||
|
{
|
||||||
|
string pluginManifestFilename = Path.Combine(pluginDirectory.FullName, "manifest.json");
|
||||||
|
if (File.Exists(pluginManifestFilename))
|
||||||
|
{
|
||||||
|
PluginManifest pluginManifest = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
pluginManifest = PluginManifest.FromPluginManifestFile(pluginManifestFilename);
|
||||||
|
}
|
||||||
|
catch (Exception) { }
|
||||||
|
|
||||||
|
if (pluginManifest != null)
|
||||||
|
{
|
||||||
|
// Check for Update
|
||||||
|
var catalogueItem = pluginCatalogue.Plugins.FirstOrDefault(i => i.Id == pluginManifest.Id && Version.Parse(i.LatestVersion) > pluginManifest.Version);
|
||||||
|
|
||||||
|
if (catalogueItem != null)
|
||||||
|
{ // Update Available
|
||||||
|
UpdatePlugins.Add(new Tuple<PluginManifest, string, PluginLibraryItem>(pluginManifest, null, catalogueItem));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UpdatePlugins.Count > 0)
|
||||||
|
{
|
||||||
|
ExecuteTaskInternal(Status, pluginPackagesLocation, UpdatePlugins);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void ExecuteTaskInternal(ScheduledTaskStatus Status, string pluginPackagesLocation, List<Tuple<PluginManifest, string, PluginLibraryItem>> UpdatePlugins)
|
||||||
|
{
|
||||||
|
while (UpdatePlugins.Count > 0)
|
||||||
|
{
|
||||||
|
var updatePlugin = UpdatePlugins[0];
|
||||||
|
var existingManifest = updatePlugin.Item1;
|
||||||
|
var packageTempFilePath = updatePlugin.Item2;
|
||||||
|
var catalogueItem = updatePlugin.Item3;
|
||||||
|
UpdatePlugins.Remove(updatePlugin);
|
||||||
|
|
||||||
|
var pluginId = existingManifest != null ? existingManifest.Id : catalogueItem.Id;
|
||||||
|
var pluginName = existingManifest != null ? existingManifest.Name : catalogueItem.Name;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(packageTempFilePath))
|
||||||
|
{
|
||||||
|
// Download Update
|
||||||
|
|
||||||
|
Status.UpdateStatus(0, string.Format("Downloading Plugin Package: {0}", pluginName), "Connecting...");
|
||||||
|
packageTempFilePath = Path.Combine(pluginPackagesLocation, string.Format("{0}.discoPlugin", pluginId));
|
||||||
|
|
||||||
|
if (File.Exists(packageTempFilePath))
|
||||||
|
File.Delete(packageTempFilePath);
|
||||||
|
|
||||||
|
if (!Directory.Exists(Path.GetDirectoryName(packageTempFilePath)))
|
||||||
|
Directory.CreateDirectory(Path.GetDirectoryName(packageTempFilePath));
|
||||||
|
|
||||||
|
// Need to Download the Package
|
||||||
|
WebClient downloader = new WebClient();
|
||||||
|
DateTime progressExpires = DateTime.Now;
|
||||||
|
downloader.DownloadProgressChanged += (sender, e) =>
|
||||||
|
{
|
||||||
|
Console.WriteLine(e.ProgressPercentage);
|
||||||
|
if (progressExpires <= DateTime.Now)
|
||||||
|
{
|
||||||
|
Status.UpdateStatus(e.ProgressPercentage, string.Format("{0} of {1} KB downloaded", e.BytesReceived / 1024, e.TotalBytesToReceive / 1024));
|
||||||
|
// Throttle Updates for SignalR
|
||||||
|
progressExpires = DateTime.Now.AddMilliseconds(250);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
downloader.DownloadFileTaskAsync(new Uri(catalogueItem.LatestDownloadUrl), packageTempFilePath).Wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
Status.UpdateStatus(10, "Opening Plugin Package", Path.GetFileName(packageTempFilePath));
|
||||||
|
|
||||||
|
PluginManifest updateManifest;
|
||||||
|
|
||||||
|
using (var packageStream = File.OpenRead(packageTempFilePath))
|
||||||
|
{
|
||||||
|
using (ZipArchive packageArchive = new ZipArchive(packageStream, ZipArchiveMode.Read, false))
|
||||||
|
{
|
||||||
|
|
||||||
|
ZipArchiveEntry packageManifestEntry = packageArchive.GetEntry("manifest.json");
|
||||||
|
if (packageManifestEntry == null)
|
||||||
|
throw new InvalidDataException("The plugin package does not contain the 'manifest.json' entry");
|
||||||
|
|
||||||
|
using (Stream packageManifestStream = packageManifestEntry.Open())
|
||||||
|
{
|
||||||
|
updateManifest = PluginManifest.FromPluginManifestFile(packageManifestStream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure not already installed
|
||||||
|
if (existingManifest != null)
|
||||||
|
if (updateManifest.Version <= existingManifest.Version)
|
||||||
|
throw new InvalidOperationException("Only newer versions can be used to update a plugin");
|
||||||
|
|
||||||
|
Status.UpdateStatus(20, string.Format("{0} [{1} v{2}] by {3}", updateManifest.Name, updateManifest.Id, updateManifest.Version.ToString(4), updateManifest.Author), "Initializing Update Environment");
|
||||||
|
|
||||||
|
using (DiscoDataContext dbContext = new DiscoDataContext())
|
||||||
|
{
|
||||||
|
// Check for Compatibility
|
||||||
|
var compatibilityData = Plugins.LoadCompatibilityData(dbContext);
|
||||||
|
var pluginCompatibility = compatibilityData.Plugins.FirstOrDefault(i => i.Id.Equals(updateManifest.Id, StringComparison.InvariantCultureIgnoreCase) && 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 updatePluginPath = Path.Combine(dbContext.DiscoConfiguration.PluginsLocation, string.Format("{0}.discoPlugin", updateManifest.Id));
|
||||||
|
File.Move(packageTempFilePath, updatePluginPath);
|
||||||
|
|
||||||
|
if (existingManifest != null && Plugins.PluginsLoaded)
|
||||||
|
{
|
||||||
|
PluginsLog.LogBeforeUpdate(existingManifest, updateManifest);
|
||||||
|
existingManifest.BeforePluginUpdate(dbContext, updateManifest, Status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ScheduledTaskStatus UpdateHelper(string PluginId = null, string PackageFilePath = null)
|
||||||
|
{
|
||||||
|
if (ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginTask)).Where(s => s.IsRunning).Count() > 0)
|
||||||
|
throw new InvalidOperationException("A plugin is already being Updated");
|
||||||
|
if (ScheduledTasks.GetTaskStatuses(typeof(UninstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
|
||||||
|
throw new InvalidOperationException("A plugin is being Uninstalled");
|
||||||
|
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
|
||||||
|
throw new InvalidOperationException("A plugin is being Installed");
|
||||||
|
|
||||||
|
JobDataMap taskData = new JobDataMap() { { "PluginId", PluginId }, { "PackageFilePath", PackageFilePath } };
|
||||||
|
|
||||||
|
var instance = new UpdatePluginTask();
|
||||||
|
|
||||||
|
return instance.ScheduleTask(taskData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ScheduledTaskStatus UpdateLocalPlugin(string PluginId, string PackageFilePath)
|
||||||
|
{
|
||||||
|
return UpdateHelper(PluginId, PackageFilePath);
|
||||||
|
}
|
||||||
|
public static ScheduledTaskStatus UpdatePlugin(string PluginId)
|
||||||
|
{
|
||||||
|
return UpdateHelper(PluginId);
|
||||||
|
}
|
||||||
|
public static ScheduledTaskStatus UpdateAllPlugins()
|
||||||
|
{
|
||||||
|
return UpdateHelper();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Disco.Services.Tasks;
|
||||||
|
|
||||||
|
namespace Disco.Services.Plugins
|
||||||
|
{
|
||||||
|
public class UpdatePluginsAfterDiscoUpdateTask : ScheduledTask
|
||||||
|
{
|
||||||
|
private static object _startLock = new object();
|
||||||
|
|
||||||
|
public override string TaskName { get { return "Updating Disco Plugins"; } }
|
||||||
|
|
||||||
|
protected override void ExecuteTask()
|
||||||
|
{
|
||||||
|
this.Status.UpdateStatus(0, "Updating plugins after Disco update", "Starting, please wait...");
|
||||||
|
|
||||||
|
// Wait for App to Load (6 Seconds)
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
this.Status.UpdateStatus(10 * i);
|
||||||
|
System.Threading.Thread.Sleep(600);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update Catalogue
|
||||||
|
CommunityInterop.PluginLibraryUpdateTask.ExecuteTaskInternal(this.Status);
|
||||||
|
|
||||||
|
// Update all Plugins
|
||||||
|
UpdatePluginTask.UpdateOffline(this.Status);
|
||||||
|
|
||||||
|
// Restart
|
||||||
|
this.Status.Finished("Restarting Disco, please wait...", "/");
|
||||||
|
Plugins.RestartApp(1500);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ScheduledTaskStatus UpdateDiscoPlugins(bool ReturnExistingStatusIfRunning)
|
||||||
|
{
|
||||||
|
if (ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginTask)).Where(s => s.IsRunning).Count() > 0)
|
||||||
|
throw new InvalidOperationException("A plugin is already being Updated");
|
||||||
|
if (ScheduledTasks.GetTaskStatuses(typeof(UninstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
|
||||||
|
throw new InvalidOperationException("A plugin is being Uninstalled");
|
||||||
|
if (ScheduledTasks.GetTaskStatuses(typeof(InstallPluginTask)).Where(s => s.IsRunning).Count() > 0)
|
||||||
|
throw new InvalidOperationException("A plugin is being Installed");
|
||||||
|
|
||||||
|
var existingTask = ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginsAfterDiscoUpdateTask)).Where(s => s.IsRunning).FirstOrDefault();
|
||||||
|
if (existingTask != null)
|
||||||
|
{
|
||||||
|
if (ReturnExistingStatusIfRunning)
|
||||||
|
return existingTask;
|
||||||
|
else
|
||||||
|
throw new InvalidOperationException("Plugins are already being updated");
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (_startLock)
|
||||||
|
{
|
||||||
|
existingTask = ScheduledTasks.GetTaskStatuses(typeof(UpdatePluginsAfterDiscoUpdateTask)).Where(s => s.IsRunning).FirstOrDefault();
|
||||||
|
if (existingTask != null)
|
||||||
|
{
|
||||||
|
if (ReturnExistingStatusIfRunning)
|
||||||
|
return existingTask;
|
||||||
|
else
|
||||||
|
throw new InvalidOperationException("Plugins are already being updated");
|
||||||
|
}
|
||||||
|
|
||||||
|
var instance = new UpdatePluginsAfterDiscoUpdateTask();
|
||||||
|
var status = instance.ScheduleTask();
|
||||||
|
|
||||||
|
// Give the scheduler a chance to start the task
|
||||||
|
System.Threading.Thread.Sleep(150);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.2.0212.1702")]
|
[assembly: AssemblyVersion("1.2.0214.1848")]
|
||||||
[assembly: AssemblyFileVersion("1.2.0212.1702")]
|
[assembly: AssemblyFileVersion("1.2.0214.1848")]
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Quartz;
|
|
||||||
|
|
||||||
namespace Disco.Services.Tasks
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,190 +1,193 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Quartz;
|
using Quartz;
|
||||||
using Quartz.Impl;
|
using Quartz.Impl;
|
||||||
using Disco.Data.Repository;
|
using Disco.Data.Repository;
|
||||||
|
|
||||||
namespace Disco.Services.Tasks
|
namespace Disco.Services.Tasks
|
||||||
{
|
{
|
||||||
public static class ScheduledTasks
|
public static class ScheduledTasks
|
||||||
{
|
{
|
||||||
internal const string SchedulerGroupName = "DiscoScheduledTasks";
|
internal const string SchedulerGroupName = "DiscoScheduledTasks";
|
||||||
private static IScheduler _TaskScheduler;
|
private static IScheduler _TaskScheduler;
|
||||||
|
|
||||||
private static object _RunningTasksLock = new object();
|
private static object _RunningTasksLock = new object();
|
||||||
private static List<ScheduledTaskStatus> _RunningTasks = new List<ScheduledTaskStatus>();
|
private static List<ScheduledTaskStatus> _RunningTasks = new List<ScheduledTaskStatus>();
|
||||||
|
|
||||||
public static void InitalizeScheduledTasks(DiscoDataContext dbContext, ISchedulerFactory SchedulerFactory)
|
public static void InitalizeScheduledTasks(DiscoDataContext dbContext, ISchedulerFactory SchedulerFactory, bool InitiallySchedule)
|
||||||
{
|
{
|
||||||
ScheduledTasksLog.LogInitializingScheduledTasks();
|
ScheduledTasksLog.LogInitializingScheduledTasks();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_TaskScheduler = SchedulerFactory.GetScheduler();
|
_TaskScheduler = SchedulerFactory.GetScheduler();
|
||||||
_TaskScheduler.Start();
|
_TaskScheduler.Start();
|
||||||
|
|
||||||
// Scheduled Cleanup
|
// Scheduled Cleanup
|
||||||
ScheduledTaskCleanup.Schedule(_TaskScheduler);
|
ScheduledTaskCleanup.Schedule(_TaskScheduler);
|
||||||
|
|
||||||
// Discover DiscoScheduledTask
|
if (InitiallySchedule)
|
||||||
var appDomain = AppDomain.CurrentDomain;
|
{
|
||||||
|
// Discover DiscoScheduledTask
|
||||||
var scheduledTaskTypes = (from a in appDomain.GetAssemblies()
|
var appDomain = AppDomain.CurrentDomain;
|
||||||
where !a.GlobalAssemblyCache && !a.IsDynamic
|
|
||||||
from type in a.GetTypes()
|
var scheduledTaskTypes = (from a in appDomain.GetAssemblies()
|
||||||
where typeof(ScheduledTask).IsAssignableFrom(type) && !type.IsAbstract
|
where !a.GlobalAssemblyCache && !a.IsDynamic
|
||||||
select type);
|
from type in a.GetTypes()
|
||||||
foreach (Type scheduledTaskType in scheduledTaskTypes)
|
where typeof(ScheduledTask).IsAssignableFrom(type) && !type.IsAbstract
|
||||||
{
|
select type);
|
||||||
ScheduledTask instance = (ScheduledTask)Activator.CreateInstance(scheduledTaskType);
|
foreach (Type scheduledTaskType in scheduledTaskTypes)
|
||||||
try
|
{
|
||||||
{
|
ScheduledTask instance = (ScheduledTask)Activator.CreateInstance(scheduledTaskType);
|
||||||
instance.InitalizeScheduledTask(dbContext);
|
try
|
||||||
}
|
{
|
||||||
catch (Exception ex)
|
instance.InitalizeScheduledTask(dbContext);
|
||||||
{
|
}
|
||||||
ScheduledTasksLog.LogInitializeException(ex, scheduledTaskType);
|
catch (Exception ex)
|
||||||
}
|
{
|
||||||
}
|
ScheduledTasksLog.LogInitializeException(ex, scheduledTaskType);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
}
|
||||||
{
|
}
|
||||||
ScheduledTasksLog.LogInitializeException(ex);
|
}
|
||||||
}
|
catch (Exception ex)
|
||||||
|
{
|
||||||
}
|
ScheduledTasksLog.LogInitializeException(ex);
|
||||||
|
}
|
||||||
public static ScheduledTaskStatus GetTaskStatus(string TaskSessionId)
|
|
||||||
{
|
}
|
||||||
return _RunningTasks.Where(t => t.SessionId == TaskSessionId).FirstOrDefault();
|
|
||||||
}
|
public static ScheduledTaskStatus GetTaskStatus(string TaskSessionId)
|
||||||
public static List<ScheduledTaskStatus> GetTaskStatuses(Type TaskType)
|
{
|
||||||
{
|
return _RunningTasks.Where(t => t.SessionId == TaskSessionId).FirstOrDefault();
|
||||||
return _RunningTasks.Where(t => t.TaskType == TaskType).ToList();
|
}
|
||||||
}
|
public static List<ScheduledTaskStatus> GetTaskStatuses(Type TaskType)
|
||||||
public static List<ScheduledTaskStatus> GetTaskStatuses()
|
{
|
||||||
{
|
return _RunningTasks.Where(t => t.TaskType == TaskType).ToList();
|
||||||
return _RunningTasks.ToList();
|
}
|
||||||
}
|
public static List<ScheduledTaskStatus> GetTaskStatuses()
|
||||||
|
{
|
||||||
public static ScheduledTaskStatus RegisterTask(ScheduledTask Task)
|
return _RunningTasks.ToList();
|
||||||
{
|
}
|
||||||
return RegisterTask(Task, null);
|
|
||||||
}
|
public static ScheduledTaskStatus RegisterTask(ScheduledTask Task)
|
||||||
public static ScheduledTaskStatus RegisterTask(ScheduledTask Task, TriggerBuilder TaskBuilder)
|
{
|
||||||
{
|
return RegisterTask(Task, null);
|
||||||
var sessionId = Guid.NewGuid().ToString("D");
|
}
|
||||||
var triggerKey = GenerateTriggerKey();
|
public static ScheduledTaskStatus RegisterTask(ScheduledTask Task, TriggerBuilder TaskBuilder)
|
||||||
var taskType = Task.GetType();
|
{
|
||||||
|
var sessionId = Guid.NewGuid().ToString("D");
|
||||||
var taskStatus = new ScheduledTaskStatus(Task, sessionId, triggerKey.Name);
|
var triggerKey = GenerateTriggerKey();
|
||||||
|
var taskType = Task.GetType();
|
||||||
lock (_RunningTasksLock)
|
|
||||||
{
|
var taskStatus = new ScheduledTaskStatus(Task, sessionId, triggerKey.Name);
|
||||||
if (Task.SingleInstanceTask)
|
|
||||||
{
|
lock (_RunningTasksLock)
|
||||||
var existingGuid = _RunningTasks.Where(t => t.IsRunning && t.TaskType == taskType).Select(t => t.SessionId).FirstOrDefault();
|
{
|
||||||
if (existingGuid != null)
|
if (Task.SingleInstanceTask)
|
||||||
throw new InvalidOperationException(string.Format("This Single-Instance Task is already running, SessionId: {0}", existingGuid));
|
{
|
||||||
}
|
var existingGuid = _RunningTasks.Where(t => t.IsRunning && t.TaskType == taskType).Select(t => t.SessionId).FirstOrDefault();
|
||||||
_RunningTasks.Add(taskStatus);
|
if (existingGuid != null)
|
||||||
}
|
throw new InvalidOperationException(string.Format("This Single-Instance Task is already running, SessionId: {0}", existingGuid));
|
||||||
|
}
|
||||||
if (TaskBuilder != null)
|
_RunningTasks.Add(taskStatus);
|
||||||
{
|
}
|
||||||
ITrigger trigger = TaskBuilder.WithIdentity(triggerKey).Build();
|
|
||||||
IJobDetail jobDetails = new JobDetailImpl(sessionId, taskType)
|
if (TaskBuilder != null)
|
||||||
{
|
{
|
||||||
Description = Task.TaskName,
|
ITrigger trigger = TaskBuilder.WithIdentity(triggerKey).Build();
|
||||||
JobDataMap = trigger.JobDataMap
|
IJobDetail jobDetails = new JobDetailImpl(sessionId, taskType)
|
||||||
};
|
{
|
||||||
|
Description = Task.TaskName,
|
||||||
_TaskScheduler.ScheduleJob(jobDetails, trigger);
|
JobDataMap = trigger.JobDataMap
|
||||||
|
};
|
||||||
var nextTriggerTime = trigger.GetNextFireTimeUtc();
|
|
||||||
if (nextTriggerTime.HasValue)
|
_TaskScheduler.ScheduleJob(jobDetails, trigger);
|
||||||
taskStatus.SetNextScheduledTimestamp(nextTriggerTime.Value.LocalDateTime);
|
|
||||||
}
|
var nextTriggerTime = trigger.GetNextFireTimeUtc();
|
||||||
|
if (nextTriggerTime.HasValue)
|
||||||
return taskStatus;
|
taskStatus.SetNextScheduledTimestamp(nextTriggerTime.Value.LocalDateTime);
|
||||||
}
|
}
|
||||||
public static bool UnregisterTask(this ScheduledTask Task)
|
|
||||||
{
|
return taskStatus;
|
||||||
lock (_RunningTasksLock)
|
}
|
||||||
{
|
public static bool UnregisterTask(this ScheduledTask Task)
|
||||||
if (_RunningTasks.Contains(Task.Status))
|
{
|
||||||
{
|
lock (_RunningTasksLock)
|
||||||
//_RunningTasks.Remove(Task.Status);
|
{
|
||||||
_TaskScheduler.UnscheduleJob(Task.ExecutionContext.Trigger.Key);
|
if (_RunningTasks.Contains(Task.Status))
|
||||||
return true;
|
{
|
||||||
}
|
//_RunningTasks.Remove(Task.Status);
|
||||||
}
|
_TaskScheduler.UnscheduleJob(Task.ExecutionContext.Trigger.Key);
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
public static bool UnregisterTask(this ScheduledTaskStatus TaskStatus)
|
}
|
||||||
{
|
return false;
|
||||||
lock (_RunningTasksLock)
|
}
|
||||||
{
|
public static bool UnregisterTask(this ScheduledTaskStatus TaskStatus)
|
||||||
if (_RunningTasks.Contains(TaskStatus))
|
{
|
||||||
{
|
lock (_RunningTasksLock)
|
||||||
//_RunningTasks.Remove(Task.Status);
|
{
|
||||||
_TaskScheduler.UnscheduleJob(new TriggerKey(TaskStatus.TriggerKey, SchedulerGroupName));
|
if (_RunningTasks.Contains(TaskStatus))
|
||||||
return true;
|
{
|
||||||
}
|
//_RunningTasks.Remove(Task.Status);
|
||||||
}
|
_TaskScheduler.UnscheduleJob(new TriggerKey(TaskStatus.TriggerKey, SchedulerGroupName));
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
public static TriggerKey GenerateTriggerKey()
|
return false;
|
||||||
{
|
}
|
||||||
return new TriggerKey(Guid.NewGuid().ToString("D"), SchedulerGroupName);
|
|
||||||
}
|
public static TriggerKey GenerateTriggerKey()
|
||||||
|
{
|
||||||
public static ScheduledTaskStatus GetDiscoScheduledTaskStatus(this IJobExecutionContext context)
|
return new TriggerKey(Guid.NewGuid().ToString("D"), SchedulerGroupName);
|
||||||
{
|
}
|
||||||
return GetTaskStatus(context.JobDetail.Key.Name);
|
|
||||||
}
|
public static ScheduledTaskStatus GetDiscoScheduledTaskStatus(this IJobExecutionContext context)
|
||||||
|
{
|
||||||
private class ScheduledTaskCleanup : IJob
|
return GetTaskStatus(context.JobDetail.Key.Name);
|
||||||
{
|
}
|
||||||
public void Execute(IJobExecutionContext context)
|
|
||||||
{
|
private class ScheduledTaskCleanup : IJob
|
||||||
lock (ScheduledTasks._RunningTasksLock)
|
{
|
||||||
{
|
public void Execute(IJobExecutionContext context)
|
||||||
// Lifetime = 5mins
|
{
|
||||||
var expiredTime = DateTime.Now.AddMinutes(-1);
|
lock (ScheduledTasks._RunningTasksLock)
|
||||||
var expiredTasks = ScheduledTasks._RunningTasks.Where(
|
{
|
||||||
t => !t.IsRunning &&
|
// Lifetime = 5mins
|
||||||
!t.NextScheduledTimestamp.HasValue &&
|
var expiredTime = DateTime.Now.AddMinutes(-1);
|
||||||
t.FinishedTimestamp < expiredTime
|
var expiredTasks = ScheduledTasks._RunningTasks.Where(
|
||||||
).ToArray();
|
t => !t.IsRunning &&
|
||||||
|
!t.NextScheduledTimestamp.HasValue &&
|
||||||
foreach (var expiredTask in expiredTasks)
|
t.FinishedTimestamp < expiredTime
|
||||||
ScheduledTasks._RunningTasks.Remove(expiredTask);
|
).ToArray();
|
||||||
}
|
|
||||||
}
|
foreach (var expiredTask in expiredTasks)
|
||||||
public static void Schedule(IScheduler TaskScheduler)
|
ScheduledTasks._RunningTasks.Remove(expiredTask);
|
||||||
{
|
}
|
||||||
// Next 10min interval
|
}
|
||||||
DateTime now = DateTime.Now;
|
public static void Schedule(IScheduler TaskScheduler)
|
||||||
int mins = (10 - (now.Minute % 10));
|
{
|
||||||
if (mins < 2)
|
// Next 10min interval
|
||||||
mins += 10;
|
DateTime now = DateTime.Now;
|
||||||
DateTimeOffset startAt = new DateTimeOffset(now).AddMinutes(mins).AddSeconds(now.Second * -1).AddMilliseconds(now.Millisecond * -1);
|
int mins = (10 - (now.Minute % 10));
|
||||||
ITrigger trigger = TriggerBuilder.Create()
|
if (mins < 2)
|
||||||
.StartAt(startAt)
|
mins += 10;
|
||||||
.WithSchedule(SimpleScheduleBuilder.RepeatMinutelyForever(10))
|
DateTimeOffset startAt = new DateTimeOffset(now).AddMinutes(mins).AddSeconds(now.Second * -1).AddMilliseconds(now.Millisecond * -1);
|
||||||
.WithIdentity("ScheduledTaskCleanupTrigger", ScheduledTasks.SchedulerGroupName + "_System")
|
ITrigger trigger = TriggerBuilder.Create()
|
||||||
.Build();
|
.StartAt(startAt)
|
||||||
|
.WithSchedule(SimpleScheduleBuilder.RepeatMinutelyForever(10))
|
||||||
IJobDetail job = JobBuilder.Create<ScheduledTaskCleanup>()
|
.WithIdentity("ScheduledTaskCleanupTrigger", ScheduledTasks.SchedulerGroupName + "_System")
|
||||||
.WithIdentity("ScheduledTaskCleanupJob", ScheduledTasks.SchedulerGroupName + "_System")
|
.Build();
|
||||||
.Build();
|
|
||||||
|
IJobDetail job = JobBuilder.Create<ScheduledTaskCleanup>()
|
||||||
_TaskScheduler.ScheduleJob(job, trigger);
|
.WithIdentity("ScheduledTaskCleanupJob", ScheduledTasks.SchedulerGroupName + "_System")
|
||||||
}
|
.Build();
|
||||||
}
|
|
||||||
}
|
_TaskScheduler.ScheduleJob(job, trigger);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,134 +1,135 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
|
|
||||||
namespace Disco.Web.Extensions.MvcExtensions.Bundles
|
namespace Disco.Web.Extensions.MvcExtensions.Bundles
|
||||||
{
|
{
|
||||||
public class Bundle
|
public class Bundle
|
||||||
{
|
{
|
||||||
private DateTime? _FileLastModified { get; set; }
|
private DateTime? _FileLastModified { get; set; }
|
||||||
private string _FileHash { get; set; }
|
private string _FileHash { get; set; }
|
||||||
private string _VersionUrl { get; set; }
|
private string _VersionUrl { get; set; }
|
||||||
|
|
||||||
public string Url { get; private set; }
|
public string Url { get; private set; }
|
||||||
public string File { get; private set; }
|
public string File { get; private set; }
|
||||||
public string FileHash
|
public string FileHash
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
UpdateFileHash();
|
UpdateFileHash();
|
||||||
#endif
|
#endif
|
||||||
return _FileHash;
|
return _FileHash;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public string ContentType { get; private set; }
|
public string ContentType { get; private set; }
|
||||||
public string VersionUrl
|
public string VersionUrl
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
return string.Format("{0}?v={1}", this.Url, this.FileHash);
|
return string.Format("{0}?v={1}", this.Url, this.FileHash);
|
||||||
#else
|
#else
|
||||||
return _VersionUrl;
|
return _VersionUrl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bundle(string Url, string File)
|
public Bundle(string Url, string File)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(Url))
|
if (string.IsNullOrWhiteSpace(Url))
|
||||||
throw new ArgumentNullException("Url");
|
throw new ArgumentNullException("Url");
|
||||||
if (string.IsNullOrWhiteSpace(File))
|
if (string.IsNullOrWhiteSpace(File))
|
||||||
throw new ArgumentNullException("File");
|
throw new ArgumentNullException("File");
|
||||||
|
|
||||||
Uri fileUri;
|
Uri fileUri;
|
||||||
if (!Uri.TryCreate(File, UriKind.Absolute, out fileUri))
|
if (!Uri.TryCreate(File, UriKind.Absolute, out fileUri))
|
||||||
{
|
{
|
||||||
File = HttpContext.Current.Server.MapPath(File);
|
File = HttpContext.Current.Server.MapPath(File);
|
||||||
}
|
}
|
||||||
|
|
||||||
var fileInfo = new FileInfo(File);
|
var fileInfo = new FileInfo(File);
|
||||||
|
|
||||||
if (!fileInfo.Exists)
|
if (!fileInfo.Exists)
|
||||||
throw new FileNotFoundException(string.Format("Not Found: {0}", File), File);
|
throw new FileNotFoundException(string.Format("Not Found: {0}", File), File);
|
||||||
|
|
||||||
this.Url = Url;
|
this.Url = Url;
|
||||||
this.File = File;
|
this.File = File;
|
||||||
|
|
||||||
switch (fileInfo.Extension.ToLower())
|
switch (fileInfo.Extension.ToLower())
|
||||||
{
|
{
|
||||||
case ".css":
|
case ".css":
|
||||||
this.ContentType = "text/css";
|
this.ContentType = "text/css";
|
||||||
break;
|
break;
|
||||||
case ".js":
|
case ".js":
|
||||||
this.ContentType = "text/javascript";
|
this.ContentType = "text/javascript";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new ArgumentException("Unsupported Bundle File Extension");
|
throw new ArgumentException("Unsupported Bundle File Extension");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write File Hash
|
// Write File Hash
|
||||||
if (fileInfo.Length > 0)
|
if (fileInfo.Length > 0)
|
||||||
UpdateFileHash();
|
UpdateFileHash();
|
||||||
else
|
else
|
||||||
this._FileHash = string.Empty;
|
this._FileHash = string.Empty;
|
||||||
|
|
||||||
//this.Version = fileInfo.LastWriteTimeUtc.Ticks;
|
//this.Version = fileInfo.LastWriteTimeUtc.Ticks;
|
||||||
|
|
||||||
this._VersionUrl = string.Format("{0}?v={1}", this.Url, this.FileHash);
|
this._VersionUrl = string.Format("{0}?v={1}", this.Url, this.FileHash);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateFileHash()
|
private void UpdateFileHash()
|
||||||
{
|
{
|
||||||
if (System.IO.File.Exists(this.File))
|
if (System.IO.File.Exists(this.File))
|
||||||
{
|
{
|
||||||
var fileLastModified = System.IO.File.GetLastWriteTimeUtc(this.File);
|
var fileLastModified = System.IO.File.GetLastWriteTimeUtc(this.File);
|
||||||
if (!this._FileLastModified.HasValue || this._FileLastModified.Value != fileLastModified)
|
if (!this._FileLastModified.HasValue || this._FileLastModified.Value != fileLastModified)
|
||||||
{
|
{
|
||||||
this._FileLastModified = fileLastModified;
|
this._FileLastModified = fileLastModified;
|
||||||
var fileBytes = System.IO.File.ReadAllBytes(this.File);
|
var fileBytes = System.IO.File.ReadAllBytes(this.File);
|
||||||
if (fileBytes.Length > 0)
|
if (fileBytes.Length > 0)
|
||||||
{
|
{
|
||||||
using (SHA256 sha = SHA256.Create())
|
using (SHA256 sha = SHA256.Create())
|
||||||
{
|
{
|
||||||
byte[] hash = sha.ComputeHash(fileBytes);
|
byte[] hash = sha.ComputeHash(fileBytes);
|
||||||
this._FileHash = HttpServerUtility.UrlTokenEncode(hash);
|
this._FileHash = HttpServerUtility.UrlTokenEncode(hash);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Already Updated
|
// Already Updated
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this._FileHash = string.Empty;
|
this._FileHash = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void ProcessRequest(HttpContext context)
|
internal void ProcessRequest(HttpContext context)
|
||||||
{
|
{
|
||||||
// Write Content Type
|
// Write Content Type
|
||||||
context.Response.ContentType = this.ContentType;
|
context.Response.ContentType = this.ContentType;
|
||||||
|
|
||||||
// Write Headers
|
// Write Headers
|
||||||
var cache = context.Response.Cache;
|
var cache = context.Response.Cache;
|
||||||
cache.SetCacheability(HttpCacheability.Public);
|
cache.SetCacheability(HttpCacheability.Public);
|
||||||
cache.SetOmitVaryStar(true);
|
cache.SetOmitVaryStar(true);
|
||||||
cache.SetExpires(DateTime.Now.AddYears(1));
|
cache.SetExpires(DateTime.Now.AddYears(1));
|
||||||
cache.SetValidUntilExpires(true);
|
cache.SetValidUntilExpires(true);
|
||||||
cache.SetLastModified(DateTime.Now);
|
cache.SetMaxAge(TimeSpan.FromDays(365));
|
||||||
cache.VaryByHeaders["User-Agent"] = true;
|
cache.SetLastModified(DateTime.Now);
|
||||||
|
cache.VaryByHeaders["User-Agent"] = true;
|
||||||
// Write File
|
|
||||||
context.Response.WriteFile(this.File);
|
// Write File
|
||||||
}
|
context.Response.WriteFile(this.File);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,52 +1,52 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
|
|
||||||
namespace Disco.Web.Extensions.MvcExtensions.Bundles
|
namespace Disco.Web.Extensions.MvcExtensions.Bundles
|
||||||
{
|
{
|
||||||
internal sealed class BundleHandler : IHttpHandler
|
internal sealed class BundleHandler : IHttpHandler
|
||||||
{
|
{
|
||||||
public Bundle RequestBundle { get; private set; }
|
public Bundle RequestBundle { get; private set; }
|
||||||
public string BundleVirtualPath { get; private set; }
|
public string BundleVirtualPath { get; private set; }
|
||||||
|
|
||||||
public BundleHandler(Bundle requestBundle, string bundleVirtualPath)
|
public BundleHandler(Bundle requestBundle, string bundleVirtualPath)
|
||||||
{
|
{
|
||||||
this.RequestBundle = requestBundle;
|
this.RequestBundle = requestBundle;
|
||||||
this.BundleVirtualPath = bundleVirtualPath;
|
this.BundleVirtualPath = bundleVirtualPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsReusable
|
public bool IsReusable
|
||||||
{
|
{
|
||||||
get { return false; }
|
get { return false; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ProcessRequest(HttpContext context)
|
public void ProcessRequest(HttpContext context)
|
||||||
{
|
{
|
||||||
context.Response.Clear();
|
context.Response.Clear();
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(context.Request.Headers["If-Modified-Since"]))
|
if (!string.IsNullOrEmpty(context.Request.Headers["If-Modified-Since"]))
|
||||||
context.Response.StatusCode = 0x130;
|
context.Response.StatusCode = 304;
|
||||||
else
|
else
|
||||||
this.RequestBundle.ProcessRequest(context);
|
this.RequestBundle.ProcessRequest(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static bool RemapHandlerForBundleRequests(HttpApplication app)
|
internal static bool RemapHandlerForBundleRequests(HttpApplication app)
|
||||||
{
|
{
|
||||||
var context = app.Context;
|
var context = app.Context;
|
||||||
|
|
||||||
string bundleUrlFromContext = context.Request.AppRelativeCurrentExecutionFilePath + context.Request.PathInfo;
|
string bundleUrlFromContext = context.Request.AppRelativeCurrentExecutionFilePath + context.Request.PathInfo;
|
||||||
var bundle = BundleTable.GetBundleFor(bundleUrlFromContext);
|
var bundle = BundleTable.GetBundleFor(bundleUrlFromContext);
|
||||||
|
|
||||||
if (bundle != null)
|
if (bundle != null)
|
||||||
{
|
{
|
||||||
context.RemapHandler(new BundleHandler(bundle, bundleUrlFromContext));
|
context.RemapHandler(new BundleHandler(bundle, bundleUrlFromContext));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.2.0212.1702")]
|
[assembly: AssemblyVersion("1.2.0214.1848")]
|
||||||
[assembly: AssemblyFileVersion("1.2.0212.1702")]
|
[assembly: AssemblyFileVersion("1.2.0214.1848")]
|
||||||
|
|||||||
@@ -1,89 +1,106 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using Disco.Data.Repository;
|
using Disco.Data.Repository;
|
||||||
|
|
||||||
namespace Disco.Web
|
namespace Disco.Web
|
||||||
{
|
{
|
||||||
public static class AppConfig
|
public static class AppConfig
|
||||||
{
|
{
|
||||||
public static bool InitializeDatabase()
|
public static bool InitializeDatabase()
|
||||||
{
|
{
|
||||||
// Modified Connection Factory
|
// Modified Connection Factory
|
||||||
System.Data.Entity.Database.DefaultConnectionFactory = new DiscoDatabaseConnectionFactory(System.Data.Entity.Database.DefaultConnectionFactory);
|
System.Data.Entity.Database.DefaultConnectionFactory = new DiscoDatabaseConnectionFactory(System.Data.Entity.Database.DefaultConnectionFactory);
|
||||||
|
|
||||||
if (Disco.Data.Repository.DiscoDatabaseConnectionFactory.DiscoDataContextConnectionString == null)
|
if (Disco.Data.Repository.DiscoDatabaseConnectionFactory.DiscoDataContextConnectionString == null)
|
||||||
{
|
{
|
||||||
// Database Connection String not configured - Trigger 'Install'
|
// Database Connection String not configured - Trigger 'Install'
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Migrate Database
|
// Migrate Database
|
||||||
Disco.Data.Migrations.DiscoDataMigrator.MigrateLatest(true);
|
Disco.Data.Migrations.DiscoDataMigrator.MigrateLatest(true);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void InitalizeEnvironment()
|
public static void InitalizeEnvironment()
|
||||||
{
|
{
|
||||||
using (var dbContext = new DiscoDataContext())
|
using (var dbContext = new DiscoDataContext())
|
||||||
{
|
{
|
||||||
// Initialize Logging
|
// Initialize Logging
|
||||||
Disco.Services.Logging.LogContext.Initalize(dbContext, DiscoApplication.SchedulerFactory);
|
Disco.Services.Logging.LogContext.Initalize(dbContext, DiscoApplication.SchedulerFactory);
|
||||||
|
|
||||||
// Load Organisation Name
|
// Load Organisation Name
|
||||||
DiscoApplication.OrganisationName = dbContext.DiscoConfiguration.OrganisationName;
|
DiscoApplication.OrganisationName = dbContext.DiscoConfiguration.OrganisationName;
|
||||||
DiscoApplication.MultiSiteMode = dbContext.DiscoConfiguration.MultiSiteMode;
|
DiscoApplication.MultiSiteMode = dbContext.DiscoConfiguration.MultiSiteMode;
|
||||||
|
|
||||||
// Setup Global Proxy
|
// Setup Global Proxy
|
||||||
DiscoApplication.SetGlobalProxy(dbContext.DiscoConfiguration.ProxyAddress,
|
DiscoApplication.SetGlobalProxy(dbContext.DiscoConfiguration.ProxyAddress,
|
||||||
dbContext.DiscoConfiguration.ProxyPort,
|
dbContext.DiscoConfiguration.ProxyPort,
|
||||||
dbContext.DiscoConfiguration.ProxyUsername,
|
dbContext.DiscoConfiguration.ProxyUsername,
|
||||||
dbContext.DiscoConfiguration.ProxyPassword);
|
dbContext.DiscoConfiguration.ProxyPassword);
|
||||||
|
|
||||||
// Initialize Expressions
|
// Initialize Expressions
|
||||||
BI.Expressions.Expression.InitializeExpressions();
|
BI.Expressions.Expression.InitializeExpressions();
|
||||||
|
|
||||||
// Initialize Warranty Providers Plugins
|
// Initialize Warranty Providers Plugins
|
||||||
Disco.Services.Plugins.Plugins.InitalizePlugins(dbContext);
|
Disco.Services.Plugins.Plugins.InitalizePlugins(dbContext);
|
||||||
|
|
||||||
// Initialize Scheduled Tasks
|
// Initialize Scheduled Tasks
|
||||||
Disco.Services.Tasks.ScheduledTasks.InitalizeScheduledTasks(dbContext, DiscoApplication.SchedulerFactory);
|
Disco.Services.Tasks.ScheduledTasks.InitalizeScheduledTasks(dbContext, DiscoApplication.SchedulerFactory, true);
|
||||||
|
|
||||||
// Schedule Immediate Check for Update (if a new version was installed, never updated, last updated over 2 days ago)
|
// Schedule Immediate Check for Update (if never updated, or last updated over 2 days ago)
|
||||||
var currentVersion = Disco.BI.Interop.Community.UpdateCheck.CurrentDiscoVersion();
|
if (dbContext.DiscoConfiguration.UpdateLastCheck == null ||
|
||||||
if (dbContext.DiscoConfiguration.InstalledDatabaseVersion == null ||
|
dbContext.DiscoConfiguration.UpdateLastCheck.ResponseTimestamp < DateTime.Now.AddDays(-2))
|
||||||
dbContext.DiscoConfiguration.InstalledDatabaseVersion != currentVersion ||
|
{
|
||||||
dbContext.DiscoConfiguration.UpdateLastCheck == null ||
|
Disco.BI.Interop.Community.UpdateCheckTask.ScheduleNow();
|
||||||
dbContext.DiscoConfiguration.UpdateLastCheck.ResponseTimestamp < DateTime.Now.AddDays(-2))
|
}
|
||||||
{
|
|
||||||
Disco.BI.Interop.Community.UpdateCheckTask.ScheduleNow();
|
// Setup Attachment Monitor
|
||||||
dbContext.DiscoConfiguration.InstalledDatabaseVersion = currentVersion;
|
DiscoApplication.DocumentDropBoxMonitor = new BI.DocumentTemplateBI.Importer.DocumentDropBoxMonitor(dbContext, DiscoApplication.SchedulerFactory, HttpContext.Current.Cache);
|
||||||
dbContext.SaveChanges();
|
}
|
||||||
}
|
DiscoApplication.DocumentDropBoxMonitor.StartWatching();
|
||||||
|
DiscoApplication.DocumentDropBoxMonitor.ScheduleCurrentFiles(10);
|
||||||
// Setup Attachment Monitor
|
}
|
||||||
DiscoApplication.DocumentDropBoxMonitor = new BI.DocumentTemplateBI.Importer.DocumentDropBoxMonitor(dbContext, DiscoApplication.SchedulerFactory, HttpContext.Current.Cache);
|
|
||||||
}
|
public static void InitializeUpdateEnvironment()
|
||||||
DiscoApplication.DocumentDropBoxMonitor.StartWatching();
|
{
|
||||||
DiscoApplication.DocumentDropBoxMonitor.ScheduleCurrentFiles(10);
|
using (var dbContext = new DiscoDataContext())
|
||||||
}
|
{
|
||||||
|
// Initialize Logging
|
||||||
public static void DisposeEnvironment()
|
Disco.Services.Logging.LogContext.Initalize(dbContext, DiscoApplication.SchedulerFactory);
|
||||||
{
|
|
||||||
if (DiscoApplication.DocumentDropBoxMonitor != null)
|
// Load Organisation Name
|
||||||
DiscoApplication.DocumentDropBoxMonitor.Dispose();
|
DiscoApplication.OrganisationName = dbContext.DiscoConfiguration.OrganisationName;
|
||||||
|
DiscoApplication.MultiSiteMode = dbContext.DiscoConfiguration.MultiSiteMode;
|
||||||
if (DiscoApplication.SchedulerFactory != null)
|
|
||||||
{
|
// Setup Global Proxy
|
||||||
foreach (var item in DiscoApplication.SchedulerFactory.AllSchedulers.ToArray())
|
DiscoApplication.SetGlobalProxy(dbContext.DiscoConfiguration.ProxyAddress,
|
||||||
{
|
dbContext.DiscoConfiguration.ProxyPort,
|
||||||
item.Shutdown(false);
|
dbContext.DiscoConfiguration.ProxyUsername,
|
||||||
}
|
dbContext.DiscoConfiguration.ProxyPassword);
|
||||||
}
|
|
||||||
|
// Initialize Scheduled Tasks
|
||||||
Disco.Services.Logging.SystemLog.LogUninitialized();
|
Disco.Services.Tasks.ScheduledTasks.InitalizeScheduledTasks(dbContext, DiscoApplication.SchedulerFactory, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void DisposeEnvironment()
|
||||||
|
{
|
||||||
|
if (DiscoApplication.DocumentDropBoxMonitor != null)
|
||||||
|
DiscoApplication.DocumentDropBoxMonitor.Dispose();
|
||||||
|
|
||||||
|
if (DiscoApplication.SchedulerFactory != null)
|
||||||
|
{
|
||||||
|
foreach (var item in DiscoApplication.SchedulerFactory.AllSchedulers.ToArray())
|
||||||
|
{
|
||||||
|
item.Shutdown(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Disco.Services.Logging.SystemLog.LogUninitialized();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,72 +1,83 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using System.Web.Mvc;
|
using System.Web.Mvc;
|
||||||
using System.Web.Routing;
|
using System.Web.Routing;
|
||||||
|
|
||||||
namespace Disco.Web
|
namespace Disco.Web
|
||||||
{
|
{
|
||||||
public class RouteConfig
|
public class RouteConfig
|
||||||
{
|
{
|
||||||
public static void RegisterInstallRoutes(RouteCollection routes)
|
public static void RegisterInstallRoutes(RouteCollection routes)
|
||||||
{
|
{
|
||||||
// Install Route
|
// Install Route
|
||||||
routes.MapRoute(
|
routes.MapRoute(
|
||||||
name: "InitialConfig", // Route name
|
name: "InitialConfig", // Route name
|
||||||
url: "{controller}/{action}/{id}", // URL with parameters
|
url: "{controller}/{action}/{id}", // URL with parameters
|
||||||
defaults: new { controller = "InitialConfig", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
|
defaults: new { controller = "InitialConfig", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
|
||||||
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
|
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RegisterRoutes(RouteCollection routes)
|
public static void RegisterRoutes(RouteCollection routes)
|
||||||
{
|
{
|
||||||
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
|
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
|
||||||
|
|
||||||
// Device Route
|
// Device Route
|
||||||
routes.MapRoute(
|
routes.MapRoute(
|
||||||
name: "Device", // Route name
|
name: "Device", // Route name
|
||||||
url: "Device/{action}/{id}", // URL with parameters
|
url: "Device/{action}/{id}", // URL with parameters
|
||||||
defaults: new { controller = "Device", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
|
defaults: new { controller = "Device", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
|
||||||
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
|
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
|
||||||
);
|
);
|
||||||
// Search Route
|
// Search Route
|
||||||
routes.MapRoute(
|
routes.MapRoute(
|
||||||
name: "SearchQuery",
|
name: "SearchQuery",
|
||||||
url: "Search/Query/{SearchQuery}",
|
url: "Search/Query/{SearchQuery}",
|
||||||
defaults: new { controller = "Search", action = "Query", SearchQuery = UrlParameter.Optional }
|
defaults: new { controller = "Search", action = "Query", SearchQuery = UrlParameter.Optional }
|
||||||
);
|
);
|
||||||
// User Route
|
// User Route
|
||||||
routes.MapRoute(
|
routes.MapRoute(
|
||||||
name: "User", // Route name
|
name: "User", // Route name
|
||||||
url: "User/{action}/{id}", // URL with parameters
|
url: "User/{action}/{id}", // URL with parameters
|
||||||
defaults: new { controller = "User", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
|
defaults: new { controller = "User", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
|
||||||
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
|
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
|
||||||
);
|
);
|
||||||
|
|
||||||
// Plugin Resources Route
|
// Plugin Resources Route
|
||||||
routes.MapRoute(
|
routes.MapRoute(
|
||||||
name: "Plugin_Resources", // Route name
|
name: "Plugin_Resources", // Route name
|
||||||
url: "Plugin/{PluginId}/Resources/{*res}", // URL with parameters
|
url: "Plugin/{PluginId}/Resources/{*res}", // URL with parameters
|
||||||
defaults: new { controller = "PluginWebHandler", action = "Resource" }, // Parameter defaults
|
defaults: new { controller = "PluginWebHandler", action = "Resource" }, // Parameter defaults
|
||||||
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
|
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
|
||||||
);
|
);
|
||||||
// Plugin Route
|
// Plugin Route
|
||||||
routes.MapRoute(
|
routes.MapRoute(
|
||||||
name: "Plugin", // Route name
|
name: "Plugin", // Route name
|
||||||
url: "Plugin/{PluginId}/{PluginAction}", // URL with parameters
|
url: "Plugin/{PluginId}/{PluginAction}", // URL with parameters
|
||||||
defaults: new { controller = "PluginWebHandler", action = "Index" }, // Parameter defaults
|
defaults: new { controller = "PluginWebHandler", action = "Index" }, // Parameter defaults
|
||||||
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
|
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
|
||||||
);
|
);
|
||||||
|
|
||||||
// Job Route
|
// Job Route
|
||||||
routes.MapRoute(
|
routes.MapRoute(
|
||||||
name: "Job", // Route name
|
name: "Job", // Route name
|
||||||
url: "{controller}/{action}/{id}", // URL with parameters
|
url: "{controller}/{action}/{id}", // URL with parameters
|
||||||
defaults: new { controller = "Job", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
|
defaults: new { controller = "Job", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
|
||||||
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
|
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
public static void RegisterUpdateRoutes(RouteCollection routes)
|
||||||
|
{
|
||||||
|
// Update Route
|
||||||
|
routes.MapRoute(
|
||||||
|
name: "Update", // Route name
|
||||||
|
url: "{controller}/{action}/{id}", // URL with parameters
|
||||||
|
defaults: new { controller = "Update", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
|
||||||
|
namespaces: new string[] { "Disco.Web.Controllers" } // Controllers Namespace Only
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -4,8 +4,8 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using System.Web.Mvc;
|
using System.Web.Mvc;
|
||||||
using Disco.BI.Interop.Community;
|
|
||||||
using Disco.Services.Plugins;
|
using Disco.Services.Plugins;
|
||||||
|
using Disco.Services.Plugins.CommunityInterop;
|
||||||
|
|
||||||
namespace Disco.Web.Areas.API.Controllers
|
namespace Disco.Web.Areas.API.Controllers
|
||||||
{
|
{
|
||||||
@@ -20,6 +20,46 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
|
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual ActionResult UpdateAll()
|
||||||
|
{
|
||||||
|
var status = UpdatePluginTask.UpdateAllPlugins();
|
||||||
|
|
||||||
|
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual ActionResult Update(string PluginId)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(PluginId))
|
||||||
|
throw new ArgumentNullException("PluginId");
|
||||||
|
|
||||||
|
var status = UpdatePluginTask.UpdatePlugin(PluginId);
|
||||||
|
|
||||||
|
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual ActionResult UpdateLocal(string PluginId, HttpPostedFileBase Plugin)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(PluginId))
|
||||||
|
throw new ArgumentNullException("PluginId");
|
||||||
|
|
||||||
|
if (Plugin == null || Plugin.ContentLength <= 0 || string.IsNullOrWhiteSpace(Plugin.FileName))
|
||||||
|
throw new ArgumentException("A discoPlugin file must be uploaded", "Plugin");
|
||||||
|
|
||||||
|
var tempPluginLocation = Path.Combine(dbContext.DiscoConfiguration.PluginPackagesLocation, Path.GetFileName(Plugin.FileName));
|
||||||
|
|
||||||
|
if (!Directory.Exists(dbContext.DiscoConfiguration.PluginPackagesLocation))
|
||||||
|
Directory.CreateDirectory(dbContext.DiscoConfiguration.PluginPackagesLocation);
|
||||||
|
|
||||||
|
if (System.IO.File.Exists(tempPluginLocation))
|
||||||
|
System.IO.File.Delete(tempPluginLocation);
|
||||||
|
|
||||||
|
Plugin.SaveAs(tempPluginLocation);
|
||||||
|
|
||||||
|
var status = UpdatePluginTask.UpdateLocalPlugin(PluginId, tempPluginLocation);
|
||||||
|
|
||||||
|
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
|
||||||
|
}
|
||||||
|
|
||||||
public virtual ActionResult Uninstall(string id, bool UninstallData)
|
public virtual ActionResult Uninstall(string id, bool UninstallData)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(id))
|
if (string.IsNullOrEmpty(id))
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using System.Web.Mvc;
|
using System.Web.Mvc;
|
||||||
|
using Disco.Models.BI.Interop.Community;
|
||||||
using Disco.Services.Plugins;
|
using Disco.Services.Plugins;
|
||||||
using Disco.Services.Tasks;
|
using Disco.Services.Tasks;
|
||||||
using Disco.Web.Areas.Config.Models.Plugins;
|
using Disco.Web.Areas.Config.Models.Plugins;
|
||||||
@@ -16,7 +17,8 @@ namespace Disco.Web.Areas.Config.Controllers
|
|||||||
{
|
{
|
||||||
Models.Plugins.IndexViewModel vm = new Models.Plugins.IndexViewModel()
|
Models.Plugins.IndexViewModel vm = new Models.Plugins.IndexViewModel()
|
||||||
{
|
{
|
||||||
PluginManifests = Plugins.GetPlugins()
|
PluginManifests = Plugins.GetPlugins(),
|
||||||
|
Catalogue = Plugins.LoadCatalogue(dbContext)
|
||||||
};
|
};
|
||||||
return View(vm);
|
return View(vm);
|
||||||
}
|
}
|
||||||
@@ -72,9 +74,9 @@ namespace Disco.Web.Areas.Config.Controllers
|
|||||||
|
|
||||||
var catalogue = Plugins.LoadCatalogue(dbContext);
|
var catalogue = Plugins.LoadCatalogue(dbContext);
|
||||||
|
|
||||||
if (catalogue == null || catalogue.ResponseTimestamp < DateTime.Now.AddMinutes(-15))
|
if (catalogue == null || catalogue.ResponseTimestamp < DateTime.Now.AddHours(-1))
|
||||||
{
|
{
|
||||||
// Need to Update Catalogue
|
// Need to Update Catalogue (over 1 hour old)
|
||||||
return RedirectToAction(MVC.API.Plugin.UpdateLibraryCatalogue());
|
return RedirectToAction(MVC.API.Plugin.UpdateLibraryCatalogue());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1,52 +1,75 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using Disco.Services.Plugins;
|
using Disco.Models.BI.Interop.Community;
|
||||||
using Disco.Services.Plugins.Features.Other;
|
using Disco.Services.Plugins;
|
||||||
|
using Disco.Services.Plugins.Features.Other;
|
||||||
namespace Disco.Web.Areas.Config.Models.Plugins
|
|
||||||
{
|
namespace Disco.Web.Areas.Config.Models.Plugins
|
||||||
public class IndexViewModel
|
{
|
||||||
{
|
public class IndexViewModel
|
||||||
public List<PluginManifest> PluginManifests { get; set; }
|
{
|
||||||
|
public List<PluginManifest> PluginManifests { get; set; }
|
||||||
public List<Tuple<Type, List<PluginManifest>>> PluginManifestsByType
|
public PluginLibraryUpdateResponse Catalogue { get; set; }
|
||||||
{
|
|
||||||
get
|
private Dictionary<PluginManifest, PluginLibraryItem> _PluginUpdates;
|
||||||
{
|
public Dictionary<PluginManifest, PluginLibraryItem> PluginUpdates
|
||||||
if (PluginManifests.Count == 0)
|
{
|
||||||
return new List<Tuple<Type, List<PluginManifest>>>();
|
get
|
||||||
|
{
|
||||||
var categorisedManifests = PluginManifests.SelectMany(pm => pm.Features)
|
if (_PluginUpdates == null)
|
||||||
.GroupBy(fm => fm.CategoryType)
|
{
|
||||||
.Select(g => new Tuple<Type, List<PluginManifest>>(g.Key, g.Select(fm => fm.PluginManifest).Distinct().OrderBy(fm => fm.Name).ToList())).ToList();
|
if (Catalogue == null || Catalogue.Plugins == null || Catalogue.Plugins.Count == 0 ||
|
||||||
|
PluginManifests == null || PluginManifests.Count == 0)
|
||||||
// Ensure all plugins are represented
|
{
|
||||||
var allCategorisedManifests = categorisedManifests.SelectMany(g => g.Item2).ToList();
|
_PluginUpdates = new Dictionary<PluginManifest, PluginLibraryItem>(); // No Updates
|
||||||
|
}
|
||||||
var unrepresentedPlugins = PluginManifests.Where(m => !allCategorisedManifests.Contains(m)).ToList();
|
else
|
||||||
if (unrepresentedPlugins.Count > 0)
|
{
|
||||||
{
|
_PluginUpdates = PluginManifests.Join((IEnumerable<PluginLibraryItem>)Catalogue.Plugins, manifest => manifest.Id, update => update.Id, (manifest, update) => new Tuple<PluginManifest, PluginLibraryItem>(manifest, update)).Where(i => Version.Parse(i.Item2.LatestVersion) > i.Item1.Version).ToDictionary(i => i.Item1, i => i.Item2);
|
||||||
Tuple<Type, List<PluginManifest>> otherCategory = null;
|
}
|
||||||
foreach (var category in categorisedManifests)
|
}
|
||||||
{
|
return _PluginUpdates;
|
||||||
if (category.Item1 == typeof(OtherFeature))
|
}
|
||||||
{
|
}
|
||||||
otherCategory = category;
|
|
||||||
}
|
public List<Tuple<Type, List<PluginManifest>>> PluginManifestsByType
|
||||||
}
|
{
|
||||||
if (otherCategory == null)
|
get
|
||||||
{
|
{
|
||||||
otherCategory = new Tuple<Type, List<PluginManifest>>(typeof(OtherFeature), new List<PluginManifest>());
|
if (PluginManifests.Count == 0)
|
||||||
categorisedManifests.Add(otherCategory);
|
return new List<Tuple<Type, List<PluginManifest>>>();
|
||||||
}
|
|
||||||
foreach (var pluginManifest in unrepresentedPlugins)
|
var categorisedManifests = PluginManifests.SelectMany(pm => pm.Features)
|
||||||
otherCategory.Item2.Add(pluginManifest);
|
.GroupBy(fm => fm.CategoryType)
|
||||||
}
|
.Select(g => new Tuple<Type, List<PluginManifest>>(g.Key, g.Select(fm => fm.PluginManifest).Distinct().OrderBy(fm => fm.Name).ToList())).ToList();
|
||||||
|
|
||||||
return categorisedManifests;
|
// Ensure all plugins are represented
|
||||||
}
|
var allCategorisedManifests = categorisedManifests.SelectMany(g => g.Item2).ToList();
|
||||||
}
|
|
||||||
}
|
var unrepresentedPlugins = PluginManifests.Where(m => !allCategorisedManifests.Contains(m)).ToList();
|
||||||
|
if (unrepresentedPlugins.Count > 0)
|
||||||
|
{
|
||||||
|
Tuple<Type, List<PluginManifest>> otherCategory = null;
|
||||||
|
foreach (var category in categorisedManifests)
|
||||||
|
{
|
||||||
|
if (category.Item1 == typeof(OtherFeature))
|
||||||
|
{
|
||||||
|
otherCategory = category;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (otherCategory == null)
|
||||||
|
{
|
||||||
|
otherCategory = new Tuple<Type, List<PluginManifest>>(typeof(OtherFeature), new List<PluginManifest>());
|
||||||
|
categorisedManifests.Add(otherCategory);
|
||||||
|
}
|
||||||
|
foreach (var pluginManifest in unrepresentedPlugins)
|
||||||
|
otherCategory.Item2.Add(pluginManifest);
|
||||||
|
}
|
||||||
|
|
||||||
|
return categorisedManifests;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,260 +1,256 @@
|
|||||||
@model Disco.Web.Areas.Config.Models.Logging.TaskStatusModel
|
@model Disco.Web.Areas.Config.Models.Logging.TaskStatusModel
|
||||||
@{
|
@{
|
||||||
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Logging", MVC.Config.Logging.Index(), "Task Status");
|
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Logging", MVC.Config.Logging.Index(), "Task Status");
|
||||||
Html.BundleDeferred("~/ClientScripts/Modules/Knockout");
|
Html.BundleDeferred("~/ClientScripts/Modules/Knockout");
|
||||||
Html.BundleDeferred("~/ClientScripts/Modules/jQuery-SignalR");
|
Html.BundleDeferred("~/ClientScripts/Modules/jQuery-SignalR");
|
||||||
}
|
}
|
||||||
<div style="min-height: 300px;">
|
<div style="min-height: 300px;">
|
||||||
<div id="scheduledTaskStatus" class="form" style="width: 520px;" data-bind="visible: Initialized">
|
<div id="scheduledTaskStatus" class="form" style="width: 520px;" data-bind="visible: Initialized">
|
||||||
<h2 data-bind="text: TaskName">
|
<h2 data-bind="text: TaskName"> </h2>
|
||||||
</h2>
|
<table>
|
||||||
<table>
|
<tr data-bind="visible: IsRunning">
|
||||||
<tr data-bind="visible: IsRunning">
|
<th class="process" data-bind="text: CurrentProcess">
|
||||||
<th class="process" data-bind="text: CurrentProcess">
|
</th>
|
||||||
|
</tr>
|
||||||
</th>
|
<tr data-bind="visible: IsRunning">
|
||||||
</tr>
|
<td class="description" data-bind="text: CurrentDescription">
|
||||||
<tr data-bind="visible: IsRunning">
|
</td>
|
||||||
<td class="description" data-bind="text: CurrentDescription">
|
</tr>
|
||||||
|
<tr data-bind="visible: IsRunning">
|
||||||
</td>
|
<td class="progress">
|
||||||
</tr>
|
<div data-bind="progressValue: Progress">
|
||||||
<tr data-bind="visible: IsRunning">
|
</div>
|
||||||
<td class="progress">
|
</td>
|
||||||
<div data-bind="progressValue: Progress">
|
</tr>
|
||||||
</div>
|
<tr data-bind="visible: FinishedTimestamp">
|
||||||
</td>
|
<td class="finishedTimestamp">
|
||||||
</tr>
|
<h3>Finished: <span data-bind="text: FinishedTimestampFormatted"></span>
|
||||||
<tr data-bind="visible: FinishedTimestamp">
|
</h3>
|
||||||
<td class="finishedTimestamp">
|
</td>
|
||||||
<h3>
|
</tr>
|
||||||
Finished: <span data-bind="text: FinishedTimestampFormatted"></span>
|
<tr data-bind="visible: FinishedTimestamp() && !TaskExceptionMessage()">
|
||||||
</h3>
|
<td class="finishedMessage" data-bind="css: {finishedRedirect: FinishedUrl}">
|
||||||
</td>
|
<span data-bind="text: FinishedMessage"></span>
|
||||||
</tr>
|
</td>
|
||||||
<tr data-bind="visible: FinishedTimestamp() && !TaskExceptionMessage()">
|
</tr>
|
||||||
<td class="finishedMessage" data-bind="css: {finishedRedirect: FinishedUrl}">
|
<tr data-bind="visible: TaskExceptionMessage">
|
||||||
<span data-bind="text: FinishedMessage"></span>
|
<td class="exception">Last Error:
|
||||||
</td>
|
<div class="code" data-bind="text: TaskExceptionMessage">
|
||||||
</tr>
|
</div>
|
||||||
<tr data-bind="visible: TaskExceptionMessage">
|
</td>
|
||||||
<td class="exception">
|
</tr>
|
||||||
Last Error:
|
<tr data-bind="visible: NextScheduledTimestamp">
|
||||||
<div class="code" data-bind="text: TaskExceptionMessage">
|
<td class="nextScheduledTimestamp">Next Scheduled: <span data-bind="text: NextScheduledTimestampFormatted"></span>
|
||||||
</div>
|
</td>
|
||||||
</td>
|
</tr>
|
||||||
</tr>
|
</table>
|
||||||
<tr data-bind="visible: NextScheduledTimestamp">
|
</div>
|
||||||
<td class="nextScheduledTimestamp">
|
</div>
|
||||||
Next Scheduled: <span data-bind="text: NextScheduledTimestampFormatted"></span>
|
<script type="text/javascript">
|
||||||
</td>
|
ko.bindingHandlers.progressValue = {
|
||||||
</tr>
|
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
|
||||||
</table>
|
var $element = $(element);
|
||||||
</div>
|
if (!$element.is('.ui-progressbar'))
|
||||||
</div>
|
$element.progressbar();
|
||||||
<script type="text/javascript">
|
},
|
||||||
ko.bindingHandlers.progressValue = {
|
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
|
||||||
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
|
var v = ko.utils.unwrapObservable(valueAccessor());
|
||||||
var $element = $(element);
|
var vInt = parseInt(v);
|
||||||
if (!$element.is('.ui-progressbar'))
|
if (vInt >= 0) {
|
||||||
$element.progressbar();
|
$(element).progressbar('option', 'value', vInt);
|
||||||
},
|
}
|
||||||
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
|
}
|
||||||
var v = ko.utils.unwrapObservable(valueAccessor());
|
};
|
||||||
var vInt = parseInt(v);
|
//* http://webcloud.se/log/JavaScript-and-ISO-8601/
|
||||||
if (vInt >= 0) {
|
Date.prototype.setISO8601 = function (string) {
|
||||||
$(element).progressbar('option', 'value', vInt);
|
var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
|
||||||
}
|
"(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
|
||||||
}
|
"(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
|
||||||
};
|
var d = string.match(new RegExp(regexp));
|
||||||
//* http://webcloud.se/log/JavaScript-and-ISO-8601/
|
|
||||||
Date.prototype.setISO8601 = function (string) {
|
var offset = 0;
|
||||||
var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
|
var date = new Date(d[1], 0, 1);
|
||||||
"(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
|
|
||||||
"(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
|
if (d[3]) { date.setMonth(d[3] - 1); }
|
||||||
var d = string.match(new RegExp(regexp));
|
if (d[5]) { date.setDate(d[5]); }
|
||||||
|
if (d[7]) { date.setHours(d[7]); }
|
||||||
var offset = 0;
|
if (d[8]) { date.setMinutes(d[8]); }
|
||||||
var date = new Date(d[1], 0, 1);
|
if (d[10]) { date.setSeconds(d[10]); }
|
||||||
|
if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
|
||||||
if (d[3]) { date.setMonth(d[3] - 1); }
|
if (d[14]) {
|
||||||
if (d[5]) { date.setDate(d[5]); }
|
offset = (Number(d[16]) * 60) + Number(d[17]);
|
||||||
if (d[7]) { date.setHours(d[7]); }
|
offset *= ((d[15] == '-') ? 1 : -1);
|
||||||
if (d[8]) { date.setMinutes(d[8]); }
|
}
|
||||||
if (d[10]) { date.setSeconds(d[10]); }
|
|
||||||
if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
|
offset -= date.getTimezoneOffset();
|
||||||
if (d[14]) {
|
time = (Number(date) + (offset * 60 * 1000));
|
||||||
offset = (Number(d[16]) * 60) + Number(d[17]);
|
this.setTime(Number(time));
|
||||||
offset *= ((d[15] == '-') ? 1 : -1);
|
return this;
|
||||||
}
|
}
|
||||||
|
</script>
|
||||||
offset -= date.getTimezoneOffset();
|
<script type="text/javascript">
|
||||||
time = (Number(date) + (offset * 60 * 1000));
|
$(function () {
|
||||||
this.setTime(Number(time));
|
var sessionId = '@(Model.SessionId)';
|
||||||
return this;
|
var sessionStatusUrl = '@(Url.Action(MVC.API.Logging.ScheduledTaskStatus(Model.SessionId)))';
|
||||||
}
|
|
||||||
</script>
|
var view = $('#scheduledTaskStatus');
|
||||||
<script type="text/javascript">
|
var vm = null;
|
||||||
$(function () {
|
|
||||||
var sessionId = '@(Model.SessionId)';
|
var liveConnection = null;
|
||||||
var sessionStatusUrl = '@(Url.Action(MVC.API.Logging.ScheduledTaskStatus(Model.SessionId)))';
|
|
||||||
|
var statusViewModel = function (sessionId) {
|
||||||
var view = $('#scheduledTaskStatus');
|
var self = this;
|
||||||
var vm = null;
|
|
||||||
|
self.Initialized = ko.observable(false);
|
||||||
var liveConnection = null;
|
|
||||||
|
self.TimestampParse = function (timestamp) {
|
||||||
var statusViewModel = function (sessionId) {
|
if (timestamp) {
|
||||||
var self = this;
|
if (timestamp.indexOf("\/Date(") == 0)
|
||||||
|
return new Date(parseInt(timestamp.substr(6)));
|
||||||
self.Initialized = ko.observable(false);
|
else
|
||||||
|
return (new Date()).setISO8601(timestamp);
|
||||||
self.TimestampParse = function (timestamp) {
|
}
|
||||||
if (timestamp) {
|
return new Date();
|
||||||
if (timestamp.indexOf("\/Date(") == 0)
|
}
|
||||||
return new Date(parseInt(timestamp.substr(6)));
|
self.TimestampFormat = function (timestamp) {
|
||||||
else
|
var addZero = function (v) { v = v + ''; if (v.length == 1) v = '0' + v; return v; }
|
||||||
return (new Date()).setISO8601(timestamp);
|
return timestamp.getFullYear() + '/' + addZero((1 + timestamp.getMonth())) + '/' + addZero(timestamp.getDate()) + ' ' + addZero(timestamp.getHours()) + ':' + addZero(timestamp.getMinutes()) + ':' + addZero(timestamp.getSeconds());
|
||||||
}
|
}
|
||||||
return new Date();
|
|
||||||
}
|
self.SessionId = sessionId;
|
||||||
self.TimestampFormat = function (timestamp) {
|
self.TaskName = ko.observable(null);
|
||||||
var addZero = function (v) { v = v + ''; if (v.length == 1) v = '0' + v; return v; }
|
self.StatusVersion = -1;
|
||||||
return timestamp.getFullYear() + '/' + addZero((1 + timestamp.getMonth())) + '/' + addZero(timestamp.getDate()) + ' ' + addZero(timestamp.getHours()) + ':' + addZero(timestamp.getMinutes()) + ':' + addZero(timestamp.getSeconds());
|
|
||||||
}
|
self.Progress = ko.observable(0);
|
||||||
|
self.CurrentProcess = ko.observable(null);
|
||||||
self.SessionId = sessionId;
|
self.CurrentDescription = ko.observable(null);
|
||||||
self.TaskName = ko.observable(null);
|
|
||||||
self.StatusVersion = -1;
|
self.IsRunning = ko.observable(null);
|
||||||
|
|
||||||
self.Progress = ko.observable(0);
|
self.TaskExceptionMessage = ko.observable(null);
|
||||||
self.CurrentProcess = ko.observable(null);
|
|
||||||
self.CurrentDescription = ko.observable(null);
|
self.FinishedTimestamp = ko.observable(null);
|
||||||
|
self.NextScheduledTimestamp = ko.observable(null)
|
||||||
self.IsRunning = ko.observable(null);
|
|
||||||
|
self.NextScheduledTimestampFormatted = ko.computed(function () {
|
||||||
self.TaskExceptionMessage = ko.observable(null);
|
return self.TimestampFormat(self.TimestampParse(self.NextScheduledTimestamp()));
|
||||||
|
});
|
||||||
self.FinishedTimestamp = ko.observable(null);
|
self.FinishedTimestampFormatted = ko.computed(function () {
|
||||||
self.NextScheduledTimestamp = ko.observable(null)
|
return self.TimestampFormat(self.TimestampParse(self.FinishedTimestamp()));
|
||||||
|
});
|
||||||
self.NextScheduledTimestampFormatted = ko.computed(function () {
|
|
||||||
return self.TimestampFormat(self.TimestampParse(self.NextScheduledTimestamp()));
|
self.FinishedUrl = ko.observable(null);
|
||||||
});
|
self.FinishedMessage = ko.observable(null);
|
||||||
self.FinishedTimestampFormatted = ko.computed(function () {
|
|
||||||
return self.TimestampFormat(self.TimestampParse(self.FinishedTimestamp()));
|
self.Finished = function () {
|
||||||
});
|
if (self.FinishedTimestamp()) {
|
||||||
|
if (self.FinishedUrl() && !self.TaskExceptionMessage()) {
|
||||||
self.FinishedUrl = ko.observable(null);
|
if (self.FinishedMessage())
|
||||||
self.FinishedMessage = ko.observable(null);
|
window.setTimeout(function () { window.location.href = self.FinishedUrl(); }, 3000);
|
||||||
|
else
|
||||||
self.Finished = function () {
|
window.location.href = self.FinishedUrl();
|
||||||
if (self.FinishedTimestamp()) {
|
}
|
||||||
if (self.FinishedUrl() && !self.TaskExceptionMessage()) {
|
}
|
||||||
if (self.FinishedMessage())
|
}
|
||||||
window.setTimeout(function () { window.location.href = self.FinishedUrl(); }, 3000);
|
|
||||||
else
|
self.Initialize = function (taskStatus) {
|
||||||
window.location.href = self.FinishedUrl();
|
self.TaskName(taskStatus.TaskName);
|
||||||
}
|
self.FinishedUrl(taskStatus.FinishedUrl);
|
||||||
}
|
|
||||||
}
|
self.Progress(taskStatus.Progress);
|
||||||
|
self.CurrentProcess(taskStatus.CurrentProcess);
|
||||||
self.Initialize = function (taskStatus) {
|
self.CurrentDescription(taskStatus.CurrentDescription);
|
||||||
self.TaskName(taskStatus.TaskName);
|
|
||||||
self.FinishedUrl(taskStatus.FinishedUrl);
|
self.IsRunning(taskStatus.IsRunning);
|
||||||
|
|
||||||
self.Progress(taskStatus.Progress);
|
self.TaskExceptionMessage(taskStatus.TaskExceptionMessage);
|
||||||
self.CurrentProcess(taskStatus.CurrentProcess);
|
|
||||||
self.CurrentDescription(taskStatus.CurrentDescription);
|
self.FinishedTimestamp(taskStatus.FinishedTimestamp);
|
||||||
|
self.NextScheduledTimestamp(taskStatus.NextScheduledTimestamp);
|
||||||
self.IsRunning(taskStatus.IsRunning);
|
|
||||||
|
self.FinishedMessage(taskStatus.FinishedMessage);
|
||||||
self.TaskExceptionMessage(taskStatus.TaskExceptionMessage);
|
|
||||||
|
self.Initialized(true);
|
||||||
self.FinishedTimestamp(taskStatus.FinishedTimestamp);
|
|
||||||
self.NextScheduledTimestamp(taskStatus.NextScheduledTimestamp);
|
self.Finished();
|
||||||
|
}
|
||||||
self.FinishedMessage(taskStatus.FinishedMessage);
|
self.Update = function (taskStatus) {
|
||||||
|
if (!self.Initialized())
|
||||||
self.Initialized(true);
|
return self.Initialize(taskStatus);
|
||||||
|
|
||||||
self.Finished();
|
if (taskStatus.StatusVersion < self.StatusVersion)
|
||||||
}
|
return; // Have Newer Status Update
|
||||||
self.Update = function (taskStatus) {
|
self.StatusVersion = taskStatus.StatusVersion;
|
||||||
if (!self.Initialized())
|
|
||||||
return self.Initialize(taskStatus);
|
if (taskStatus.ChangedProperties) {
|
||||||
|
for (var changedPropertyIndex = 0; changedPropertyIndex < taskStatus.ChangedProperties.length; changedPropertyIndex++) {
|
||||||
if (taskStatus.StatusVersion < self.StatusVersion)
|
switch (taskStatus.ChangedProperties[changedPropertyIndex]) {
|
||||||
return; // Have Newer Status Update
|
case 'Progress':
|
||||||
self.StatusVersion = taskStatus.StatusVersion;
|
self.Progress(taskStatus.Progress);
|
||||||
|
break;
|
||||||
for (var changedPropertyIndex = 0; changedPropertyIndex < taskStatus.ChangedProperties.length; changedPropertyIndex++) {
|
case 'CurrentProcess':
|
||||||
switch (taskStatus.ChangedProperties[changedPropertyIndex]) {
|
self.CurrentProcess(taskStatus.CurrentProcess);
|
||||||
case 'Progress':
|
break;
|
||||||
self.Progress(taskStatus.Progress);
|
case 'CurrentDescription':
|
||||||
break;
|
self.CurrentDescription(taskStatus.CurrentDescription);
|
||||||
case 'CurrentProcess':
|
break;
|
||||||
self.CurrentProcess(taskStatus.CurrentProcess);
|
case 'IsRunning':
|
||||||
break;
|
self.IsRunning(taskStatus.IsRunning);
|
||||||
case 'CurrentDescription':
|
break;
|
||||||
self.CurrentDescription(taskStatus.CurrentDescription);
|
case 'TaskException':
|
||||||
break;
|
self.TaskExceptionMessage(taskStatus.TaskExceptionMessage);
|
||||||
case 'IsRunning':
|
break;
|
||||||
self.IsRunning(taskStatus.IsRunning);
|
case 'NextScheduledTimestamp':
|
||||||
break;
|
self.NextScheduledTimestamp(taskStatus.NextScheduledTimestamp);
|
||||||
case 'TaskException':
|
break;
|
||||||
self.TaskExceptionMessage(taskStatus.TaskExceptionMessage);
|
case 'FinishedUrl':
|
||||||
break;
|
self.FinishedUrl(taskStatus.FinishedUrl);
|
||||||
case 'NextScheduledTimestamp':
|
break;
|
||||||
self.NextScheduledTimestamp(taskStatus.NextScheduledTimestamp);
|
case 'FinishedMessage':
|
||||||
break;
|
self.FinishedMessage(taskStatus.FinishedMessage);
|
||||||
case 'FinishedUrl':
|
break;
|
||||||
self.FinishedUrl(taskStatus.FinishedUrl);
|
case 'FinishedTimestamp':
|
||||||
break;
|
self.FinishedTimestamp(taskStatus.FinishedTimestamp);
|
||||||
case 'FinishedMessage':
|
window.setTimeout(self.Finished, 1);
|
||||||
self.FinishedMessage(taskStatus.FinishedMessage);
|
break;
|
||||||
break;
|
default:
|
||||||
case 'FinishedTimestamp':
|
// Ignore
|
||||||
self.FinishedTimestamp(taskStatus.FinishedTimestamp);
|
}
|
||||||
window.setTimeout(self.Finished, 1);
|
}
|
||||||
break;
|
}
|
||||||
default:
|
}
|
||||||
// Ignore
|
}
|
||||||
}
|
|
||||||
}
|
vm = new statusViewModel(sessionId);
|
||||||
}
|
ko.applyBindings(vm, view[0]);
|
||||||
}
|
|
||||||
|
// Start Live Connection
|
||||||
vm = new statusViewModel(sessionId);
|
updateWithLive();
|
||||||
ko.applyBindings(vm, view[0]);
|
|
||||||
|
function updateWithAjax(onSuccess) {
|
||||||
// Start Live Connection
|
$.ajax({
|
||||||
updateWithLive();
|
url: sessionStatusUrl,
|
||||||
|
dataType: 'json',
|
||||||
function updateWithAjax(onSuccess) {
|
type: 'POST',
|
||||||
$.ajax({
|
traditional: true,
|
||||||
url: sessionStatusUrl,
|
success: update_Received,
|
||||||
dataType: 'json',
|
error: function (jqXHR, textStatus, errorThrown) {
|
||||||
type: 'POST',
|
alert('Unable to load Session: ' + errorThrown);
|
||||||
traditional: true,
|
}
|
||||||
success: update_Received,
|
});
|
||||||
error: function (jqXHR, textStatus, errorThrown) {
|
}
|
||||||
alert('Unable to load Session: ' + errorThrown);
|
function updateWithLive() {
|
||||||
}
|
liveConnection = $.connection('@(Url.Content("~/API/Logging/TaskStatusNotifications"))');
|
||||||
});
|
liveConnection.received(update_Received);
|
||||||
}
|
liveConnection.error(function (e) { alert('Live-Status Error: ' + e) });
|
||||||
function updateWithLive() {
|
liveConnection.start(function () {
|
||||||
liveConnection = $.connection('@(Url.Content("~/API/Logging/TaskStatusNotifications"))');
|
liveConnection.send('/addToGroups:' + sessionId);
|
||||||
liveConnection.received(update_Received);
|
updateWithAjax();
|
||||||
liveConnection.error(function (e) { alert('Live-Status Error: ' + e) });
|
});
|
||||||
liveConnection.start(function () {
|
}
|
||||||
liveConnection.send('/addToGroups:' + sessionId);
|
function update_Received(taskStatus) {
|
||||||
updateWithAjax();
|
vm.Update(taskStatus);
|
||||||
});
|
}
|
||||||
}
|
|
||||||
function update_Received(taskStatus) {
|
});
|
||||||
vm.Update(taskStatus);
|
</script>
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|||||||
@@ -1,314 +1,314 @@
|
|||||||
#pragma warning disable 1591
|
#pragma warning disable 1591
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// <auto-generated>
|
// <auto-generated>
|
||||||
// This code was generated by a tool.
|
// This code was generated by a tool.
|
||||||
// Runtime Version:4.0.30319.17929
|
// Runtime Version:4.0.30319.17929
|
||||||
//
|
//
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
// the code is regenerated.
|
// the code is regenerated.
|
||||||
// </auto-generated>
|
// </auto-generated>
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
namespace Disco.Web.Areas.Config.Views.Logging
|
namespace Disco.Web.Areas.Config.Views.Logging
|
||||||
{
|
{
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using System.Web.Helpers;
|
using System.Web.Helpers;
|
||||||
using System.Web.Mvc;
|
using System.Web.Mvc;
|
||||||
using System.Web.Mvc.Ajax;
|
using System.Web.Mvc.Ajax;
|
||||||
using System.Web.Mvc.Html;
|
using System.Web.Mvc.Html;
|
||||||
using System.Web.Routing;
|
using System.Web.Routing;
|
||||||
using System.Web.Security;
|
using System.Web.Security;
|
||||||
using System.Web.UI;
|
using System.Web.UI;
|
||||||
using System.Web.WebPages;
|
using System.Web.WebPages;
|
||||||
using Disco.BI.Extensions;
|
using Disco.BI.Extensions;
|
||||||
using Disco.Models.Repository;
|
using Disco.Models.Repository;
|
||||||
using Disco.Web;
|
using Disco.Web;
|
||||||
using Disco.Web.Extensions;
|
using Disco.Web.Extensions;
|
||||||
|
|
||||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "1.5.0.0")]
|
[System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "1.5.0.0")]
|
||||||
[System.Web.WebPages.PageVirtualPathAttribute("~/Areas/Config/Views/Logging/TaskStatus.cshtml")]
|
[System.Web.WebPages.PageVirtualPathAttribute("~/Areas/Config/Views/Logging/TaskStatus.cshtml")]
|
||||||
public class TaskStatus : System.Web.Mvc.WebViewPage<Disco.Web.Areas.Config.Models.Logging.TaskStatusModel>
|
public class TaskStatus : System.Web.Mvc.WebViewPage<Disco.Web.Areas.Config.Models.Logging.TaskStatusModel>
|
||||||
{
|
{
|
||||||
public TaskStatus()
|
public TaskStatus()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public override void Execute()
|
public override void Execute()
|
||||||
{
|
{
|
||||||
|
|
||||||
#line 2 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
|
#line 2 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
|
||||||
|
|
||||||
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Logging", MVC.Config.Logging.Index(), "Task Status");
|
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Logging", MVC.Config.Logging.Index(), "Task Status");
|
||||||
Html.BundleDeferred("~/ClientScripts/Modules/Knockout");
|
Html.BundleDeferred("~/ClientScripts/Modules/Knockout");
|
||||||
Html.BundleDeferred("~/ClientScripts/Modules/jQuery-SignalR");
|
Html.BundleDeferred("~/ClientScripts/Modules/jQuery-SignalR");
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
#line hidden
|
#line hidden
|
||||||
WriteLiteral("\r\n<div");
|
WriteLiteral("\r\n<div");
|
||||||
|
|
||||||
WriteLiteral(" style=\"min-height: 300px;\"");
|
WriteLiteral(" style=\"min-height: 300px;\"");
|
||||||
|
|
||||||
WriteLiteral(">\r\n <div");
|
WriteLiteral(">\r\n <div");
|
||||||
|
|
||||||
WriteLiteral(" id=\"scheduledTaskStatus\"");
|
WriteLiteral(" id=\"scheduledTaskStatus\"");
|
||||||
|
|
||||||
WriteLiteral(" class=\"form\"");
|
WriteLiteral(" class=\"form\"");
|
||||||
|
|
||||||
WriteLiteral(" style=\"width: 520px;\"");
|
WriteLiteral(" style=\"width: 520px;\"");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"visible: Initialized\"");
|
WriteLiteral(" data-bind=\"visible: Initialized\"");
|
||||||
|
|
||||||
WriteLiteral(">\r\n <h2");
|
WriteLiteral(">\r\n <h2");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"text: TaskName\"");
|
WriteLiteral(" data-bind=\"text: TaskName\"");
|
||||||
|
|
||||||
WriteLiteral(">\r\n </h2>\r\n <table>\r\n <tr");
|
WriteLiteral("> </h2>\r\n <table>\r\n <tr");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"visible: IsRunning\"");
|
WriteLiteral(" data-bind=\"visible: IsRunning\"");
|
||||||
|
|
||||||
WriteLiteral(">\r\n <th");
|
WriteLiteral(">\r\n <th");
|
||||||
|
|
||||||
WriteLiteral(" class=\"process\"");
|
WriteLiteral(" class=\"process\"");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"text: CurrentProcess\"");
|
WriteLiteral(" data-bind=\"text: CurrentProcess\"");
|
||||||
|
|
||||||
WriteLiteral(">\r\n \r\n </th>\r\n </tr>\r\n " +
|
WriteLiteral("> \r\n </th>\r\n </tr>\r\n <tr");
|
||||||
" <tr");
|
|
||||||
|
WriteLiteral(" data-bind=\"visible: IsRunning\"");
|
||||||
WriteLiteral(" data-bind=\"visible: IsRunning\"");
|
|
||||||
|
WriteLiteral(">\r\n <td");
|
||||||
WriteLiteral(">\r\n <td");
|
|
||||||
|
WriteLiteral(" class=\"description\"");
|
||||||
WriteLiteral(" class=\"description\"");
|
|
||||||
|
WriteLiteral(" data-bind=\"text: CurrentDescription\"");
|
||||||
WriteLiteral(" data-bind=\"text: CurrentDescription\"");
|
|
||||||
|
WriteLiteral("> \r\n </td>\r\n </tr>\r\n <tr");
|
||||||
WriteLiteral(">\r\n \r\n </td>\r\n </tr>\r\n " +
|
|
||||||
" <tr");
|
WriteLiteral(" data-bind=\"visible: IsRunning\"");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"visible: IsRunning\"");
|
WriteLiteral(">\r\n <td");
|
||||||
|
|
||||||
WriteLiteral(">\r\n <td");
|
WriteLiteral(" class=\"progress\"");
|
||||||
|
|
||||||
WriteLiteral(" class=\"progress\"");
|
WriteLiteral(">\r\n <div");
|
||||||
|
|
||||||
WriteLiteral(">\r\n <div");
|
WriteLiteral(" data-bind=\"progressValue: Progress\"");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"progressValue: Progress\"");
|
WriteLiteral(">\r\n </div>\r\n </td>\r\n </tr>\r\n " +
|
||||||
|
" <tr");
|
||||||
WriteLiteral(">\r\n </div>\r\n </td>\r\n </tr>\r\n " +
|
|
||||||
" <tr");
|
WriteLiteral(" data-bind=\"visible: FinishedTimestamp\"");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"visible: FinishedTimestamp\"");
|
WriteLiteral(">\r\n <td");
|
||||||
|
|
||||||
WriteLiteral(">\r\n <td");
|
WriteLiteral(" class=\"finishedTimestamp\"");
|
||||||
|
|
||||||
WriteLiteral(" class=\"finishedTimestamp\"");
|
WriteLiteral(">\r\n <h3>Finished: <span");
|
||||||
|
|
||||||
WriteLiteral(">\r\n <h3>\r\n Finished: <span");
|
WriteLiteral(" data-bind=\"text: FinishedTimestampFormatted\"");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"text: FinishedTimestampFormatted\"");
|
WriteLiteral("></span>\r\n </h3>\r\n </td>\r\n </tr>\r\n " +
|
||||||
|
" <tr");
|
||||||
WriteLiteral("></span>\r\n </h3>\r\n </td>\r\n </tr>\r\n " +
|
|
||||||
" <tr");
|
WriteLiteral(" data-bind=\"visible: FinishedTimestamp() && !TaskExceptionMessage()\"");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"visible: FinishedTimestamp() && !TaskExceptionMessage()\"");
|
WriteLiteral(">\r\n <td");
|
||||||
|
|
||||||
WriteLiteral(">\r\n <td");
|
WriteLiteral(" class=\"finishedMessage\"");
|
||||||
|
|
||||||
WriteLiteral(" class=\"finishedMessage\"");
|
WriteLiteral(" data-bind=\"css: {finishedRedirect: FinishedUrl}\"");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"css: {finishedRedirect: FinishedUrl}\"");
|
WriteLiteral(">\r\n <span");
|
||||||
|
|
||||||
WriteLiteral(">\r\n <span");
|
WriteLiteral(" data-bind=\"text: FinishedMessage\"");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"text: FinishedMessage\"");
|
WriteLiteral("></span>\r\n </td>\r\n </tr>\r\n <tr");
|
||||||
|
|
||||||
WriteLiteral("></span>\r\n </td>\r\n </tr>\r\n <tr");
|
WriteLiteral(" data-bind=\"visible: TaskExceptionMessage\"");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"visible: TaskExceptionMessage\"");
|
WriteLiteral(">\r\n <td");
|
||||||
|
|
||||||
WriteLiteral(">\r\n <td");
|
WriteLiteral(" class=\"exception\"");
|
||||||
|
|
||||||
WriteLiteral(" class=\"exception\"");
|
WriteLiteral(">Last Error:\r\n <div");
|
||||||
|
|
||||||
WriteLiteral(">\r\n Last Error:\r\n <div");
|
WriteLiteral(" class=\"code\"");
|
||||||
|
|
||||||
WriteLiteral(" class=\"code\"");
|
WriteLiteral(" data-bind=\"text: TaskExceptionMessage\"");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"text: TaskExceptionMessage\"");
|
WriteLiteral(">\r\n </div>\r\n </td>\r\n </tr>\r\n " +
|
||||||
|
" <tr");
|
||||||
WriteLiteral(">\r\n </div>\r\n </td>\r\n </tr>\r\n " +
|
|
||||||
" <tr");
|
WriteLiteral(" data-bind=\"visible: NextScheduledTimestamp\"");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"visible: NextScheduledTimestamp\"");
|
WriteLiteral(">\r\n <td");
|
||||||
|
|
||||||
WriteLiteral(">\r\n <td");
|
WriteLiteral(" class=\"nextScheduledTimestamp\"");
|
||||||
|
|
||||||
WriteLiteral(" class=\"nextScheduledTimestamp\"");
|
WriteLiteral(">Next Scheduled: <span");
|
||||||
|
|
||||||
WriteLiteral(">\r\n Next Scheduled: <span");
|
WriteLiteral(" data-bind=\"text: NextScheduledTimestampFormatted\"");
|
||||||
|
|
||||||
WriteLiteral(" data-bind=\"text: NextScheduledTimestampFormatted\"");
|
WriteLiteral("></span>\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r" +
|
||||||
|
"\n</div>\r\n<script");
|
||||||
WriteLiteral("></span>\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r" +
|
|
||||||
"\n</div>\r\n<script");
|
WriteLiteral(" type=\"text/javascript\"");
|
||||||
|
|
||||||
WriteLiteral(" type=\"text/javascript\"");
|
WriteLiteral(">\r\n ko.bindingHandlers.progressValue = {\r\n init: function (element, val" +
|
||||||
|
"ueAccessor, allBindingsAccessor, viewModel) {\r\n var $element = $(elem" +
|
||||||
WriteLiteral(">\r\n ko.bindingHandlers.progressValue = {\r\n init: function (element, val" +
|
"ent);\r\n if (!$element.is(\'.ui-progressbar\'))\r\n $elemen" +
|
||||||
"ueAccessor, allBindingsAccessor, viewModel) {\r\n var $element = $(elem" +
|
"t.progressbar();\r\n },\r\n update: function (element, valueAccessor, " +
|
||||||
"ent);\r\n if (!$element.is(\'.ui-progressbar\'))\r\n $elemen" +
|
"allBindingsAccessor, viewModel) {\r\n var v = ko.utils.unwrapObservable" +
|
||||||
"t.progressbar();\r\n },\r\n update: function (element, valueAccessor, " +
|
"(valueAccessor());\r\n var vInt = parseInt(v);\r\n if (vInt >=" +
|
||||||
"allBindingsAccessor, viewModel) {\r\n var v = ko.utils.unwrapObservable" +
|
" 0) {\r\n $(element).progressbar(\'option\', \'value\', vInt);\r\n " +
|
||||||
"(valueAccessor());\r\n var vInt = parseInt(v);\r\n if (vInt >=" +
|
" }\r\n }\r\n };\r\n //* http://webcloud.se/log/JavaScript-and-ISO-860" +
|
||||||
" 0) {\r\n $(element).progressbar(\'option\', \'value\', vInt);\r\n " +
|
"1/\r\n Date.prototype.setISO8601 = function (string) {\r\n var regexp = \"(" +
|
||||||
" }\r\n }\r\n };\r\n //* http://webcloud.se/log/JavaScript-and-ISO-860" +
|
"[0-9]{4})(-([0-9]{2})(-([0-9]{2})\" +\r\n \"(T([0-9]{2}):([0-9]{2})(:([0-9]{2" +
|
||||||
"1/\r\n Date.prototype.setISO8601 = function (string) {\r\n var regexp = \"(" +
|
"})(\\.([0-9]+))?)?\" +\r\n \"(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?\";\r\n " +
|
||||||
"[0-9]{4})(-([0-9]{2})(-([0-9]{2})\" +\r\n \"(T([0-9]{2}):([0-9]{2})(:([0-9]{2" +
|
" var d = string.match(new RegExp(regexp));\r\n\r\n var offset = 0;\r\n " +
|
||||||
"})(\\.([0-9]+))?)?\" +\r\n \"(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?\";\r\n " +
|
" var date = new Date(d[1], 0, 1);\r\n\r\n if (d[3]) { date.setMonth(d[3] - 1)" +
|
||||||
" var d = string.match(new RegExp(regexp));\r\n\r\n var offset = 0;\r\n " +
|
"; }\r\n if (d[5]) { date.setDate(d[5]); }\r\n if (d[7]) { date.setHour" +
|
||||||
" var date = new Date(d[1], 0, 1);\r\n\r\n if (d[3]) { date.setMonth(d[3] - 1)" +
|
"s(d[7]); }\r\n if (d[8]) { date.setMinutes(d[8]); }\r\n if (d[10]) { d" +
|
||||||
"; }\r\n if (d[5]) { date.setDate(d[5]); }\r\n if (d[7]) { date.setHour" +
|
"ate.setSeconds(d[10]); }\r\n if (d[12]) { date.setMilliseconds(Number(\"0.\" " +
|
||||||
"s(d[7]); }\r\n if (d[8]) { date.setMinutes(d[8]); }\r\n if (d[10]) { d" +
|
"+ d[12]) * 1000); }\r\n if (d[14]) {\r\n offset = (Number(d[16]) *" +
|
||||||
"ate.setSeconds(d[10]); }\r\n if (d[12]) { date.setMilliseconds(Number(\"0.\" " +
|
" 60) + Number(d[17]);\r\n offset *= ((d[15] == \'-\') ? 1 : -1);\r\n " +
|
||||||
"+ d[12]) * 1000); }\r\n if (d[14]) {\r\n offset = (Number(d[16]) *" +
|
" }\r\n\r\n offset -= date.getTimezoneOffset();\r\n time = (Number(date) " +
|
||||||
" 60) + Number(d[17]);\r\n offset *= ((d[15] == \'-\') ? 1 : -1);\r\n " +
|
"+ (offset * 60 * 1000));\r\n this.setTime(Number(time));\r\n return th" +
|
||||||
" }\r\n\r\n offset -= date.getTimezoneOffset();\r\n time = (Number(date) " +
|
"is;\r\n }\r\n</script>\r\n<script");
|
||||||
"+ (offset * 60 * 1000));\r\n this.setTime(Number(time));\r\n return th" +
|
|
||||||
"is;\r\n }\r\n</script>\r\n<script");
|
WriteLiteral(" type=\"text/javascript\"");
|
||||||
|
|
||||||
WriteLiteral(" type=\"text/javascript\"");
|
WriteLiteral(">\r\n $(function () {\r\n var sessionId = \'");
|
||||||
|
|
||||||
WriteLiteral(">\r\n $(function () {\r\n var sessionId = \'");
|
|
||||||
|
#line 93 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
|
||||||
|
Write(Model.SessionId);
|
||||||
#line 99 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
|
|
||||||
Write(Model.SessionId);
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
#line default
|
WriteLiteral("\';\r\n var sessionStatusUrl = \'");
|
||||||
#line hidden
|
|
||||||
WriteLiteral("\';\r\n var sessionStatusUrl = \'");
|
|
||||||
|
#line 94 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
|
||||||
|
Write(Url.Action(MVC.API.Logging.ScheduledTaskStatus(Model.SessionId)));
|
||||||
#line 100 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
|
|
||||||
Write(Url.Action(MVC.API.Logging.ScheduledTaskStatus(Model.SessionId)));
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
#line default
|
WriteLiteral("\';\r\n\r\n var view = $(\'#scheduledTaskStatus\');\r\n var vm = null;\r\n\r\n " +
|
||||||
#line hidden
|
" var liveConnection = null;\r\n\r\n var statusViewModel = function (sess" +
|
||||||
WriteLiteral("\';\r\n\r\n var view = $(\'#scheduledTaskStatus\');\r\n var vm = null;\r\n\r\n " +
|
"ionId) {\r\n var self = this;\r\n\r\n self.Initialized = ko.obse" +
|
||||||
" var liveConnection = null;\r\n\r\n var statusViewModel = function (sess" +
|
"rvable(false);\r\n\r\n self.TimestampParse = function (timestamp) {\r\n " +
|
||||||
"ionId) {\r\n var self = this;\r\n\r\n self.Initialized = ko.obse" +
|
" if (timestamp) {\r\n if (timestamp.indexOf(\"\\/Date(" +
|
||||||
"rvable(false);\r\n\r\n self.TimestampParse = function (timestamp) {\r\n " +
|
"\") == 0)\r\n return new Date(parseInt(timestamp.substr(6)))" +
|
||||||
" if (timestamp) {\r\n if (timestamp.indexOf(\"\\/Date(" +
|
";\r\n else\r\n return (new Date()).setISO8" +
|
||||||
"\") == 0)\r\n return new Date(parseInt(timestamp.substr(6)))" +
|
"601(timestamp);\r\n }\r\n return new Date();\r\n " +
|
||||||
";\r\n else\r\n return (new Date()).setISO8" +
|
" }\r\n self.TimestampFormat = function (timestamp) {\r\n " +
|
||||||
"601(timestamp);\r\n }\r\n return new Date();\r\n " +
|
" var addZero = function (v) { v = v + \'\'; if (v.length == 1) v = \'0\' + v; retur" +
|
||||||
" }\r\n self.TimestampFormat = function (timestamp) {\r\n " +
|
"n v; }\r\n return timestamp.getFullYear() + \'/\' + addZero((1 + time" +
|
||||||
" var addZero = function (v) { v = v + \'\'; if (v.length == 1) v = \'0\' + v; retur" +
|
"stamp.getMonth())) + \'/\' + addZero(timestamp.getDate()) + \' \' + addZero(timestam" +
|
||||||
"n v; }\r\n return timestamp.getFullYear() + \'/\' + addZero((1 + time" +
|
"p.getHours()) + \':\' + addZero(timestamp.getMinutes()) + \':\' + addZero(timestamp." +
|
||||||
"stamp.getMonth())) + \'/\' + addZero(timestamp.getDate()) + \' \' + addZero(timestam" +
|
"getSeconds());\r\n }\r\n\r\n self.SessionId = sessionId;\r\n " +
|
||||||
"p.getHours()) + \':\' + addZero(timestamp.getMinutes()) + \':\' + addZero(timestamp." +
|
" self.TaskName = ko.observable(null);\r\n self.StatusVersion = -1;" +
|
||||||
"getSeconds());\r\n }\r\n\r\n self.SessionId = sessionId;\r\n " +
|
"\r\n\r\n self.Progress = ko.observable(0);\r\n self.CurrentProce" +
|
||||||
" self.TaskName = ko.observable(null);\r\n self.StatusVersion = -1;" +
|
"ss = ko.observable(null);\r\n self.CurrentDescription = ko.observable(n" +
|
||||||
"\r\n\r\n self.Progress = ko.observable(0);\r\n self.CurrentProce" +
|
"ull);\r\n\r\n self.IsRunning = ko.observable(null);\r\n\r\n self.T" +
|
||||||
"ss = ko.observable(null);\r\n self.CurrentDescription = ko.observable(n" +
|
"askExceptionMessage = ko.observable(null);\r\n\r\n self.FinishedTimestamp" +
|
||||||
"ull);\r\n\r\n self.IsRunning = ko.observable(null);\r\n\r\n self.T" +
|
" = ko.observable(null);\r\n self.NextScheduledTimestamp = ko.observable" +
|
||||||
"askExceptionMessage = ko.observable(null);\r\n\r\n self.FinishedTimestamp" +
|
"(null)\r\n\r\n self.NextScheduledTimestampFormatted = ko.computed(functio" +
|
||||||
" = ko.observable(null);\r\n self.NextScheduledTimestamp = ko.observable" +
|
"n () {\r\n return self.TimestampFormat(self.TimestampParse(self.Nex" +
|
||||||
"(null)\r\n\r\n self.NextScheduledTimestampFormatted = ko.computed(functio" +
|
"tScheduledTimestamp()));\r\n });\r\n self.FinishedTimestampFor" +
|
||||||
"n () {\r\n return self.TimestampFormat(self.TimestampParse(self.Nex" +
|
"matted = ko.computed(function () {\r\n return self.TimestampFormat(" +
|
||||||
"tScheduledTimestamp()));\r\n });\r\n self.FinishedTimestampFor" +
|
"self.TimestampParse(self.FinishedTimestamp()));\r\n });\r\n\r\n " +
|
||||||
"matted = ko.computed(function () {\r\n return self.TimestampFormat(" +
|
"self.FinishedUrl = ko.observable(null);\r\n self.FinishedMessage = ko.o" +
|
||||||
"self.TimestampParse(self.FinishedTimestamp()));\r\n });\r\n\r\n " +
|
"bservable(null);\r\n\r\n self.Finished = function () {\r\n i" +
|
||||||
"self.FinishedUrl = ko.observable(null);\r\n self.FinishedMessage = ko.o" +
|
"f (self.FinishedTimestamp()) {\r\n if (self.FinishedUrl() && !s" +
|
||||||
"bservable(null);\r\n\r\n self.Finished = function () {\r\n i" +
|
"elf.TaskExceptionMessage()) {\r\n if (self.FinishedMessage(" +
|
||||||
"f (self.FinishedTimestamp()) {\r\n if (self.FinishedUrl() && !s" +
|
"))\r\n window.setTimeout(function () { window.location." +
|
||||||
"elf.TaskExceptionMessage()) {\r\n if (self.FinishedMessage(" +
|
"href = self.FinishedUrl(); }, 3000);\r\n else\r\n " +
|
||||||
"))\r\n window.setTimeout(function () { window.location." +
|
" window.location.href = self.FinishedUrl();\r\n " +
|
||||||
"href = self.FinishedUrl(); }, 3000);\r\n else\r\n " +
|
"}\r\n }\r\n }\r\n\r\n self.Initialize = function (t" +
|
||||||
" window.location.href = self.FinishedUrl();\r\n " +
|
"askStatus) {\r\n self.TaskName(taskStatus.TaskName);\r\n " +
|
||||||
"}\r\n }\r\n }\r\n\r\n self.Initialize = function (t" +
|
" self.FinishedUrl(taskStatus.FinishedUrl);\r\n\r\n self.Progress(ta" +
|
||||||
"askStatus) {\r\n self.TaskName(taskStatus.TaskName);\r\n " +
|
"skStatus.Progress);\r\n self.CurrentProcess(taskStatus.CurrentProce" +
|
||||||
" self.FinishedUrl(taskStatus.FinishedUrl);\r\n\r\n self.Progress(ta" +
|
"ss);\r\n self.CurrentDescription(taskStatus.CurrentDescription);\r\n\r" +
|
||||||
"skStatus.Progress);\r\n self.CurrentProcess(taskStatus.CurrentProce" +
|
"\n self.IsRunning(taskStatus.IsRunning);\r\n\r\n self.T" +
|
||||||
"ss);\r\n self.CurrentDescription(taskStatus.CurrentDescription);\r\n\r" +
|
"askExceptionMessage(taskStatus.TaskExceptionMessage);\r\n\r\n self.Fi" +
|
||||||
"\n self.IsRunning(taskStatus.IsRunning);\r\n\r\n self.T" +
|
"nishedTimestamp(taskStatus.FinishedTimestamp);\r\n self.NextSchedul" +
|
||||||
"askExceptionMessage(taskStatus.TaskExceptionMessage);\r\n\r\n self.Fi" +
|
"edTimestamp(taskStatus.NextScheduledTimestamp);\r\n\r\n self.Finished" +
|
||||||
"nishedTimestamp(taskStatus.FinishedTimestamp);\r\n self.NextSchedul" +
|
"Message(taskStatus.FinishedMessage);\r\n\r\n self.Initialized(true);\r" +
|
||||||
"edTimestamp(taskStatus.NextScheduledTimestamp);\r\n\r\n self.Finished" +
|
"\n\r\n self.Finished();\r\n }\r\n self.Update = fu" +
|
||||||
"Message(taskStatus.FinishedMessage);\r\n\r\n self.Initialized(true);\r" +
|
"nction (taskStatus) {\r\n if (!self.Initialized())\r\n " +
|
||||||
"\n\r\n self.Finished();\r\n }\r\n self.Update = fu" +
|
" return self.Initialize(taskStatus);\r\n\r\n if (taskStatus.Statu" +
|
||||||
"nction (taskStatus) {\r\n if (!self.Initialized())\r\n " +
|
"sVersion < self.StatusVersion)\r\n return; // Have Newer Status" +
|
||||||
" return self.Initialize(taskStatus);\r\n\r\n if (taskStatus.Statu" +
|
" Update\r\n self.StatusVersion = taskStatus.StatusVersion;\r\n\r\n " +
|
||||||
"sVersion < self.StatusVersion)\r\n return; // Have Newer Status" +
|
" if (taskStatus.ChangedProperties) {\r\n for (var cha" +
|
||||||
" Update\r\n self.StatusVersion = taskStatus.StatusVersion;\r\n\r\n " +
|
"ngedPropertyIndex = 0; changedPropertyIndex < taskStatus.ChangedProperties.lengt" +
|
||||||
" for (var changedPropertyIndex = 0; changedPropertyIndex < taskStatus." +
|
"h; changedPropertyIndex++) {\r\n switch (taskStatus.Changed" +
|
||||||
"ChangedProperties.length; changedPropertyIndex++) {\r\n switch " +
|
"Properties[changedPropertyIndex]) {\r\n case \'Progress\'" +
|
||||||
"(taskStatus.ChangedProperties[changedPropertyIndex]) {\r\n " +
|
":\r\n self.Progress(taskStatus.Progress);\r\n " +
|
||||||
"case \'Progress\':\r\n self.Progress(taskStatus.Progress)" +
|
" break;\r\n case \'CurrentProcess" +
|
||||||
";\r\n break;\r\n case \'CurrentProc" +
|
"\':\r\n self.CurrentProcess(taskStatus.CurrentProces" +
|
||||||
"ess\':\r\n self.CurrentProcess(taskStatus.CurrentProcess" +
|
"s);\r\n break;\r\n case \'C" +
|
||||||
");\r\n break;\r\n case \'CurrentDes" +
|
"urrentDescription\':\r\n self.CurrentDescription(tas" +
|
||||||
"cription\':\r\n self.CurrentDescription(taskStatus.Curre" +
|
"kStatus.CurrentDescription);\r\n break;\r\n " +
|
||||||
"ntDescription);\r\n break;\r\n cas" +
|
" case \'IsRunning\':\r\n self.IsRunn" +
|
||||||
"e \'IsRunning\':\r\n self.IsRunning(taskStatus.IsRunning)" +
|
"ing(taskStatus.IsRunning);\r\n break;\r\n " +
|
||||||
";\r\n break;\r\n case \'TaskExcepti" +
|
" case \'TaskException\':\r\n self.Task" +
|
||||||
"on\':\r\n self.TaskExceptionMessage(taskStatus.TaskExcep" +
|
"ExceptionMessage(taskStatus.TaskExceptionMessage);\r\n " +
|
||||||
"tionMessage);\r\n break;\r\n case " +
|
" break;\r\n case \'NextScheduledTimestamp\':\r\n " +
|
||||||
"\'NextScheduledTimestamp\':\r\n self.NextScheduledTimesta" +
|
" self.NextScheduledTimestamp(taskStatus.NextScheduledTime" +
|
||||||
"mp(taskStatus.NextScheduledTimestamp);\r\n break;\r\n " +
|
"stamp);\r\n break;\r\n cas" +
|
||||||
" case \'FinishedUrl\':\r\n self.Finish" +
|
"e \'FinishedUrl\':\r\n self.FinishedUrl(taskStatus.Fi" +
|
||||||
"edUrl(taskStatus.FinishedUrl);\r\n break;\r\n " +
|
"nishedUrl);\r\n break;\r\n " +
|
||||||
" case \'FinishedMessage\':\r\n self.FinishedMe" +
|
" case \'FinishedMessage\':\r\n self.FinishedMessage(t" +
|
||||||
"ssage(taskStatus.FinishedMessage);\r\n break;\r\n " +
|
"askStatus.FinishedMessage);\r\n break;\r\n " +
|
||||||
" case \'FinishedTimestamp\':\r\n self.Fini" +
|
" case \'FinishedTimestamp\':\r\n self" +
|
||||||
"shedTimestamp(taskStatus.FinishedTimestamp);\r\n window" +
|
".FinishedTimestamp(taskStatus.FinishedTimestamp);\r\n " +
|
||||||
".setTimeout(self.Finished, 1);\r\n break;\r\n " +
|
" window.setTimeout(self.Finished, 1);\r\n break;\r" +
|
||||||
" default:\r\n // Ignore\r\n " +
|
"\n default:\r\n // Ignore" +
|
||||||
" }\r\n }\r\n }\r\n }\r\n\r\n vm = new statusViewMo" +
|
"\r\n }\r\n }\r\n }\r\n " +
|
||||||
"del(sessionId);\r\n ko.applyBindings(vm, view[0]);\r\n\r\n // Start Live" +
|
" }\r\n }\r\n\r\n vm = new statusViewModel(sessionId);\r\n ko.appl" +
|
||||||
" Connection\r\n updateWithLive();\r\n\r\n function updateWithAjax(onSucc" +
|
"yBindings(vm, view[0]);\r\n\r\n // Start Live Connection\r\n updateWithL" +
|
||||||
"ess) {\r\n $.ajax({\r\n url: sessionStatusUrl,\r\n " +
|
"ive();\r\n\r\n function updateWithAjax(onSuccess) {\r\n $.ajax({\r\n " +
|
||||||
" dataType: \'json\',\r\n type: \'POST\',\r\n traditio" +
|
" url: sessionStatusUrl,\r\n dataType: \'json\',\r\n " +
|
||||||
"nal: true,\r\n success: update_Received,\r\n error: fu" +
|
" type: \'POST\',\r\n traditional: true,\r\n succ" +
|
||||||
"nction (jqXHR, textStatus, errorThrown) {\r\n alert(\'Unable to " +
|
"ess: update_Received,\r\n error: function (jqXHR, textStatus, error" +
|
||||||
"load Session: \' + errorThrown);\r\n }\r\n });\r\n }\r\n" +
|
"Thrown) {\r\n alert(\'Unable to load Session: \' + errorThrown);\r" +
|
||||||
" function updateWithLive() {\r\n liveConnection = $.connection(\'" +
|
"\n }\r\n });\r\n }\r\n function updateWithLive(" +
|
||||||
"");
|
") {\r\n liveConnection = $.connection(\'");
|
||||||
|
|
||||||
|
|
||||||
#line 247 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
|
#line 243 "..\..\Areas\Config\Views\Logging\TaskStatus.cshtml"
|
||||||
Write(Url.Content("~/API/Logging/TaskStatusNotifications"));
|
Write(Url.Content("~/API/Logging/TaskStatusNotifications"));
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
#line hidden
|
#line hidden
|
||||||
WriteLiteral(@"');
|
WriteLiteral(@"');
|
||||||
liveConnection.received(update_Received);
|
liveConnection.received(update_Received);
|
||||||
liveConnection.error(function (e) { alert('Live-Status Error: ' + e) });
|
liveConnection.error(function (e) { alert('Live-Status Error: ' + e) });
|
||||||
liveConnection.start(function () {
|
liveConnection.start(function () {
|
||||||
liveConnection.send('/addToGroups:' + sessionId);
|
liveConnection.send('/addToGroups:' + sessionId);
|
||||||
updateWithAjax();
|
updateWithAjax();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function update_Received(taskStatus) {
|
function update_Received(taskStatus) {
|
||||||
vm.Update(taskStatus);
|
vm.Update(taskStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
");
|
");
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#pragma warning restore 1591
|
#pragma warning restore 1591
|
||||||
|
|||||||
@@ -72,85 +72,102 @@
|
|||||||
$(function () {
|
$(function () {
|
||||||
// Uninstall
|
// Uninstall
|
||||||
var uninstallUrl = '@(Url.Action(MVC.API.Plugin.Uninstall()))/';
|
var uninstallUrl = '@(Url.Action(MVC.API.Plugin.Uninstall()))/';
|
||||||
var uninstallPlugin, uninstallPluginData, $dialogConfirm, uninstallPluginConfirm, uninstallPluginDataConfirm;
|
var uninstallPlugin, uninstallPluginData, $dialogConfirm, uninstallPluginConfirm, uninstallPluginDataConfirm;
|
||||||
|
|
||||||
var pluginId, pluginName, pluginUninstallData;
|
var pluginId, pluginName, pluginUninstallData;
|
||||||
|
|
||||||
var $dialog = $('#dialogUninstallPlugins').dialog({
|
var $dialog = $('#dialogUninstallPlugins').dialog({
|
||||||
resizable: false,
|
resizable: false,
|
||||||
modal: true,
|
modal: true,
|
||||||
width: 350,
|
width: 350,
|
||||||
autoOpen: false,
|
autoOpen: false,
|
||||||
buttons: {
|
buttons: {
|
||||||
"Uninstall": function () {
|
"Uninstall": function () {
|
||||||
pluginId = uninstallPlugin.val();
|
pluginId = uninstallPlugin.val();
|
||||||
pluginName = uninstallPlugin.find('option:selected').text();
|
pluginName = uninstallPlugin.find('option:selected').text();
|
||||||
pluginUninstallData = uninstallPluginData.is(':checked');
|
pluginUninstallData = uninstallPluginData.is(':checked');
|
||||||
|
|
||||||
if (!pluginId) {
|
if (!pluginId) {
|
||||||
alert('Select a plugin to uninstall');
|
alert('Select a plugin to uninstall');
|
||||||
} else {
|
} else {
|
||||||
uninstallPluginConfirm.text(pluginName + ' [' + pluginId + ']');
|
uninstallPluginConfirm.text(pluginName + ' [' + pluginId + ']');
|
||||||
if (pluginUninstallData)
|
if (pluginUninstallData)
|
||||||
uninstallPluginDataConfirm.show();
|
uninstallPluginDataConfirm.show();
|
||||||
else
|
else
|
||||||
uninstallPluginDataConfirm.hide();
|
uninstallPluginDataConfirm.hide();
|
||||||
|
|
||||||
$dialogConfirm.dialog('open');
|
$dialogConfirm.dialog('open');
|
||||||
|
$(this).dialog("close");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Cancel: function () {
|
||||||
|
uninstallPluginData.removeAttr('checked');
|
||||||
|
$('#uninstallPluginDataAlert').hide();
|
||||||
$(this).dialog("close");
|
$(this).dialog("close");
|
||||||
}
|
}
|
||||||
},
|
|
||||||
Cancel: function () {
|
|
||||||
uninstallPluginData.removeAttr('checked');
|
|
||||||
$('#uninstallPluginDataAlert').hide();
|
|
||||||
$(this).dialog("close");
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
});
|
|
||||||
|
|
||||||
$dialogConfirm = $('#dialogUninstallPluginConfirm').dialog({
|
$dialogConfirm = $('#dialogUninstallPluginConfirm').dialog({
|
||||||
resizable: false,
|
resizable: false,
|
||||||
modal: true,
|
modal: true,
|
||||||
width: 350,
|
width: 350,
|
||||||
autoOpen: false,
|
autoOpen: false,
|
||||||
buttons: {
|
buttons: {
|
||||||
"Confirm Uninstall": function () {
|
"Confirm Uninstall": function () {
|
||||||
var url = uninstallUrl + pluginId;
|
var url = uninstallUrl + pluginId;
|
||||||
if (pluginUninstallData)
|
if (pluginUninstallData)
|
||||||
url += '?UninstallData=true'
|
url += '?UninstallData=true'
|
||||||
else
|
else
|
||||||
url += '?UninstallData=false'
|
url += '?UninstallData=false'
|
||||||
|
|
||||||
window.location.href = url;
|
window.location.href = url;
|
||||||
$(this).dialog("disable");
|
$(this).dialog("disable");
|
||||||
},
|
},
|
||||||
Cancel: function () {
|
Cancel: function () {
|
||||||
uninstallPluginData.removeAttr('checked');
|
uninstallPluginData.removeAttr('checked');
|
||||||
$('#uninstallPluginDataAlert').hide();
|
$('#uninstallPluginDataAlert').hide();
|
||||||
$(this).dialog("close");
|
$(this).dialog("close");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
});
|
|
||||||
|
|
||||||
uninstallPlugin = $('#uninstallPlugin');
|
uninstallPlugin = $('#uninstallPlugin');
|
||||||
uninstallPluginData = $('#uninstallPluginData');
|
uninstallPluginData = $('#uninstallPluginData');
|
||||||
uninstallPluginConfirm = $('#uninstallPluginConfirm');
|
uninstallPluginConfirm = $('#uninstallPluginConfirm');
|
||||||
uninstallPluginDataConfirm = $('#uninstallPluginDataConfirm');
|
uninstallPluginDataConfirm = $('#uninstallPluginDataConfirm');
|
||||||
|
|
||||||
$('#buttonUninstall').click(function () {
|
$('#buttonUninstall').click(function () {
|
||||||
$dialog.dialog('open');
|
$dialog.dialog('open');
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#uninstallPluginData').change(function () {
|
$('#uninstallPluginData').change(function () {
|
||||||
if ($(this).is(':checked')) {
|
if ($(this).is(':checked')) {
|
||||||
$('#uninstallPluginDataAlert').slideDown();
|
$('#uninstallPluginDataAlert').slideDown();
|
||||||
} else {
|
} else {
|
||||||
$('#uninstallPluginDataAlert').slideUp();
|
$('#uninstallPluginDataAlert').slideUp();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
if (Model.PluginUpdates.Count > 0)
|
||||||
|
{
|
||||||
|
<div id="updateAvailableContainer">
|
||||||
|
<div>@(Model.PluginUpdates.Count) plugin update@(Model.PluginUpdates.Count == 1 ? " is" : "s are") available</div>
|
||||||
|
@Html.ActionLinkButton("Update Now", MVC.API.Plugin.UpdateAll())
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
(function () {
|
||||||
|
$(function () {
|
||||||
|
var layout_PageHeading = $('#layout_PageHeading').height(80);
|
||||||
|
var updateAvailableContainer = $('#updateAvailableContainer');
|
||||||
|
updateAvailableContainer.appendTo(layout_PageHeading);
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -365,51 +365,110 @@ WriteLiteral(" <script>\r\n $(function () {\r\n
|
|||||||
|
|
||||||
#line default
|
#line default
|
||||||
#line hidden
|
#line hidden
|
||||||
WriteLiteral("/\';\r\n var uninstallPlugin, uninstallPluginData, $dialogConfirm, uninst" +
|
WriteLiteral("/\';\r\n var uninstallPlugin, uninstallPluginData, $dialogConfirm, un" +
|
||||||
"allPluginConfirm, uninstallPluginDataConfirm;\r\n\r\n var pluginId, plugi" +
|
"installPluginConfirm, uninstallPluginDataConfirm;\r\n\r\n var pluginI" +
|
||||||
"nName, pluginUninstallData;\r\n\r\n var $dialog = $(\'#dialogUninstallPlug" +
|
"d, pluginName, pluginUninstallData;\r\n\r\n var $dialog = $(\'#dialogU" +
|
||||||
"ins\').dialog({\r\n resizable: false,\r\n modal: true,\r" +
|
"ninstallPlugins\').dialog({\r\n resizable: false,\r\n " +
|
||||||
"\n width: 350,\r\n autoOpen: false,\r\n " +
|
" modal: true,\r\n width: 350,\r\n autoOp" +
|
||||||
"buttons: {\r\n \"Uninstall\": function () {\r\n " +
|
"en: false,\r\n buttons: {\r\n \"Uninstall\":" +
|
||||||
" pluginId = uninstallPlugin.val();\r\n pluginName = unin" +
|
" function () {\r\n pluginId = uninstallPlugin.val();\r\n " +
|
||||||
"stallPlugin.find(\'option:selected\').text();\r\n pluginUnins" +
|
" pluginName = uninstallPlugin.find(\'option:selected\')." +
|
||||||
"tallData = uninstallPluginData.is(\':checked\');\r\n\r\n if (!p" +
|
"text();\r\n pluginUninstallData = uninstallPluginData.i" +
|
||||||
"luginId) {\r\n alert(\'Select a plugin to uninstall\');\r\n" +
|
"s(\':checked\');\r\n\r\n if (!pluginId) {\r\n " +
|
||||||
" } else {\r\n uninstallPluginCon" +
|
" alert(\'Select a plugin to uninstall\');\r\n " +
|
||||||
"firm.text(pluginName + \' [\' + pluginId + \']\');\r\n if (" +
|
" } else {\r\n uninstallPluginConfirm.text(plugin" +
|
||||||
"pluginUninstallData)\r\n uninstallPluginDataConfirm" +
|
"Name + \' [\' + pluginId + \']\');\r\n if (pluginUninst" +
|
||||||
".show();\r\n else\r\n unin" +
|
"allData)\r\n uninstallPluginDataConfirm.show();" +
|
||||||
"stallPluginDataConfirm.hide();\r\n\r\n $dialogConfirm.dia" +
|
"\r\n else\r\n unin" +
|
||||||
"log(\'open\');\r\n $(this).dialog(\"close\");\r\n " +
|
"stallPluginDataConfirm.hide();\r\n\r\n $dialogConfirm" +
|
||||||
" }\r\n },\r\n Cancel: function () {" +
|
".dialog(\'open\');\r\n $(this).dialog(\"close\");\r\n " +
|
||||||
"\r\n uninstallPluginData.removeAttr(\'checked\');\r\n " +
|
" }\r\n },\r\n C" +
|
||||||
" $(\'#uninstallPluginDataAlert\').hide();\r\n $(" +
|
"ancel: function () {\r\n uninstallPluginData.removeAttr" +
|
||||||
"this).dialog(\"close\");\r\n }\r\n }\r\n })" +
|
"(\'checked\');\r\n $(\'#uninstallPluginDataAlert\').hide();" +
|
||||||
";\r\n\r\n $dialogConfirm = $(\'#dialogUninstallPluginConfirm\').dialog({\r\n " +
|
"\r\n $(this).dialog(\"close\");\r\n " +
|
||||||
" resizable: false,\r\n modal: true,\r\n " +
|
"}\r\n }\r\n });\r\n\r\n $dialogConfirm " +
|
||||||
"width: 350,\r\n autoOpen: false,\r\n buttons: {\r\n " +
|
"= $(\'#dialogUninstallPluginConfirm\').dialog({\r\n resizable: fa" +
|
||||||
" \"Confirm Uninstall\": function () {\r\n var u" +
|
"lse,\r\n modal: true,\r\n width: 350,\r\n " +
|
||||||
"rl = uninstallUrl + pluginId;\r\n if (pluginUninstallData)\r" +
|
" autoOpen: false,\r\n buttons: {\r\n " +
|
||||||
"\n url += \'?UninstallData=true\'\r\n " +
|
" \"Confirm Uninstall\": function () {\r\n var url =" +
|
||||||
" else\r\n url += \'?UninstallData=false\'\r\n\r\n " +
|
" uninstallUrl + pluginId;\r\n if (pluginUninstallData)\r" +
|
||||||
" window.location.href = url;\r\n $(this).dialo" +
|
"\n url += \'?UninstallData=true\'\r\n " +
|
||||||
"g(\"disable\");\r\n },\r\n Cancel: function () {" +
|
" else\r\n url += \'?UninstallData=false\'\r\n" +
|
||||||
"\r\n uninstallPluginData.removeAttr(\'checked\');\r\n " +
|
"\r\n window.location.href = url;\r\n " +
|
||||||
" $(\'#uninstallPluginDataAlert\').hide();\r\n $(" +
|
" $(this).dialog(\"disable\");\r\n },\r\n " +
|
||||||
"this).dialog(\"close\");\r\n }\r\n }\r\n })" +
|
" Cancel: function () {\r\n uninstallPluginData.re" +
|
||||||
";\r\n\r\n uninstallPlugin = $(\'#uninstallPlugin\');\r\n uninstall" +
|
"moveAttr(\'checked\');\r\n $(\'#uninstallPluginDataAlert\')" +
|
||||||
"PluginData = $(\'#uninstallPluginData\');\r\n uninstallPluginConfirm = $(" +
|
".hide();\r\n $(this).dialog(\"close\");\r\n " +
|
||||||
"\'#uninstallPluginConfirm\');\r\n uninstallPluginDataConfirm = $(\'#uninst" +
|
" }\r\n }\r\n });\r\n\r\n uninsta" +
|
||||||
"allPluginDataConfirm\');\r\n\r\n $(\'#buttonUninstall\').click(function () {" +
|
"llPlugin = $(\'#uninstallPlugin\');\r\n uninstallPluginData = $(\'#uni" +
|
||||||
"\r\n $dialog.dialog(\'open\');\r\n return false;\r\n " +
|
"nstallPluginData\');\r\n uninstallPluginConfirm = $(\'#uninstallPlugi" +
|
||||||
" });\r\n\r\n $(\'#uninstallPluginData\').change(function () {\r\n " +
|
"nConfirm\');\r\n uninstallPluginDataConfirm = $(\'#uninstallPluginDat" +
|
||||||
" if ($(this).is(\':checked\')) {\r\n $(\'#uninstallPluginD" +
|
"aConfirm\');\r\n\r\n $(\'#buttonUninstall\').click(function () {\r\n " +
|
||||||
"ataAlert\').slideDown();\r\n } else {\r\n $(\'#unins" +
|
" $dialog.dialog(\'open\');\r\n return false;\r\n " +
|
||||||
"tallPluginDataAlert\').slideUp();\r\n }\r\n });\r\n })" +
|
" });\r\n\r\n $(\'#uninstallPluginData\').change(function () {\r" +
|
||||||
";\r\n </script>\r\n");
|
"\n if ($(this).is(\':checked\')) {\r\n $(\'#" +
|
||||||
|
"uninstallPluginDataAlert\').slideDown();\r\n } else {\r\n " +
|
||||||
|
" $(\'#uninstallPluginDataAlert\').slideUp();\r\n }\r" +
|
||||||
|
"\n });\r\n });\r\n </script>\r\n");
|
||||||
|
|
||||||
|
|
||||||
#line 154 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
#line 154 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
||||||
|
|
||||||
|
if (Model.PluginUpdates.Count > 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
WriteLiteral(" <div");
|
||||||
|
|
||||||
|
WriteLiteral(" id=\"updateAvailableContainer\"");
|
||||||
|
|
||||||
|
WriteLiteral(">\r\n <div>");
|
||||||
|
|
||||||
|
|
||||||
|
#line 158 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
||||||
|
Write(Model.PluginUpdates.Count);
|
||||||
|
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
WriteLiteral(" plugin update");
|
||||||
|
|
||||||
|
|
||||||
|
#line 158 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
||||||
|
Write(Model.PluginUpdates.Count == 1 ? " is" : "s are");
|
||||||
|
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
WriteLiteral(" available</div>\r\n");
|
||||||
|
|
||||||
|
WriteLiteral(" ");
|
||||||
|
|
||||||
|
|
||||||
|
#line 159 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
||||||
|
Write(Html.ActionLinkButton("Update Now", MVC.API.Plugin.UpdateAll()));
|
||||||
|
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
WriteLiteral("\r\n </div>\r\n");
|
||||||
|
|
||||||
|
WriteLiteral(@" <script>
|
||||||
|
(function () {
|
||||||
|
$(function () {
|
||||||
|
var layout_PageHeading = $('#layout_PageHeading').height(80);
|
||||||
|
var updateAvailableContainer = $('#updateAvailableContainer');
|
||||||
|
updateAvailableContainer.appendTo(layout_PageHeading);
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
");
|
||||||
|
|
||||||
|
|
||||||
|
#line 170 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -422,13 +481,13 @@ WriteLiteral(" class=\"actionBar\"");
|
|||||||
WriteLiteral(">\r\n");
|
WriteLiteral(">\r\n");
|
||||||
|
|
||||||
|
|
||||||
#line 158 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
#line 175 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
#line 158 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
#line 175 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
||||||
if (Model.PluginManifests.Count > 0)
|
if (Model.PluginManifests.Count > 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -436,14 +495,14 @@ WriteLiteral(">\r\n");
|
|||||||
#line default
|
#line default
|
||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
#line 160 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
#line 177 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
||||||
Write(Html.ActionLinkButton("Uninstall Plugins", MVC.Config.Plugins.Index(), "buttonUninstall"));
|
Write(Html.ActionLinkButton("Uninstall Plugins", MVC.Config.Plugins.Index(), "buttonUninstall"));
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
#line 160 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
#line 177 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -453,7 +512,7 @@ WriteLiteral(">\r\n");
|
|||||||
WriteLiteral(" ");
|
WriteLiteral(" ");
|
||||||
|
|
||||||
|
|
||||||
#line 162 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
#line 179 "..\..\Areas\Config\Views\Plugins\Index.cshtml"
|
||||||
Write(Html.ActionLinkButton("Install Plugins", MVC.Config.Plugins.Install()));
|
Write(Html.ActionLinkButton("Install Plugins", MVC.Config.Plugins.Install()));
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -28,10 +28,19 @@
|
|||||||
{
|
{
|
||||||
var plugin = plugins[itemNextId];
|
var plugin = plugins[itemNextId];
|
||||||
itemNextId++;
|
itemNextId++;
|
||||||
<div class="pageMenuArea pluginItem@(Plugins.PluginInstalled(plugin.Id) ? " pluginInstalled" : string.Empty)">
|
var installedPlugin = Plugins.PluginInstalled(plugin.Id) ? Plugins.GetPlugin(plugin.Id) : null;
|
||||||
<a class="pluginInstallLink" href="@(Url.Action(MVC.API.Plugin.Install(plugin.Id)))">
|
<div class="pageMenuArea pluginItem@(installedPlugin != null ? " pluginInstalled" : string.Empty)">
|
||||||
<h2 class="pluginName">@plugin.Name</h2>
|
<h2 class="pluginName">@plugin.Name
|
||||||
</a>
|
@if (installedPlugin == null){
|
||||||
|
<a class="pluginInstallLink button" href="@(Url.Action(MVC.API.Plugin.Install(plugin.Id)))">Install</a>
|
||||||
|
}else{
|
||||||
|
if (Version.Parse(plugin.LatestVersion) > installedPlugin.Version){
|
||||||
|
<a class="pluginUpdateLink button" href="@(Url.Action(MVC.API.Plugin.Update(plugin.Id)))">Update</a>
|
||||||
|
}else{
|
||||||
|
<a class="pluginInstalledLink button disabled" href="#">Installed</a>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</h2>
|
||||||
<div class="pluginItemBlurb">@(new HtmlString(plugin.Blurb))</div>
|
<div class="pluginItemBlurb">@(new HtmlString(plugin.Blurb))</div>
|
||||||
<div class="pageMenuBlurb">
|
<div class="pageMenuBlurb">
|
||||||
<span class="pluginId">@plugin.Id</span> | <span class="pluginVersion">v@(plugin.LatestVersion)</span> | @plugin.Author | <a href="@plugin.Url" target="_blank">More Information</a>
|
<span class="pluginId">@plugin.Id</span> | <span class="pluginVersion">v@(plugin.LatestVersion)</span> | @plugin.Author | <a href="@plugin.Url" target="_blank">More Information</a>
|
||||||
@@ -100,14 +109,26 @@
|
|||||||
$selectedPlugin = $this.closest('.pluginItem');
|
$selectedPlugin = $this.closest('.pluginItem');
|
||||||
$selectedPluginUrl = $this.attr('href');
|
$selectedPluginUrl = $this.attr('href');
|
||||||
|
|
||||||
if ($selectedPlugin.is('.pluginInstalled')) {
|
$('#dialogInstallPluginName').text($selectedPlugin.find('.pluginName').text());
|
||||||
alert('This plugin is already installed.');
|
$('#dialogInstallPluginDetails').text($selectedPlugin.find('.pluginId').text() + ' | ' + $selectedPlugin.find('.pluginVersion').text());
|
||||||
} else {
|
|
||||||
$('#dialogInstallPluginName').text($selectedPlugin.find('.pluginName').text());
|
$dialogInstall.dialog('option', 'title', 'Install this Plugin?');
|
||||||
$('#dialogInstallPluginDetails').text($selectedPlugin.find('.pluginId').text() + ' | ' + $selectedPlugin.find('.pluginVersion').text());
|
$dialogInstall.dialog('open');
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
$('#pageMenu').find('a.pluginUpdateLink').click(function () {
|
||||||
|
$this = $(this);
|
||||||
|
|
||||||
|
$selectedPlugin = $this.closest('.pluginItem');
|
||||||
|
$selectedPluginUrl = $this.attr('href');
|
||||||
|
|
||||||
|
$('#dialogInstallPluginName').text($selectedPlugin.find('.pluginName').text());
|
||||||
|
$('#dialogInstallPluginDetails').text($selectedPlugin.find('.pluginId').text() + ' | ' + $selectedPlugin.find('.pluginVersion').text());
|
||||||
|
|
||||||
|
$dialogInstall.dialog('option', 'title', 'Update this Plugin?');
|
||||||
|
$dialogInstall.dialog('open');
|
||||||
|
|
||||||
$dialogInstall.dialog('open');
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -147,39 +147,26 @@ WriteLiteral(" <td>\r\n");
|
|||||||
{
|
{
|
||||||
var plugin = plugins[itemNextId];
|
var plugin = plugins[itemNextId];
|
||||||
itemNextId++;
|
itemNextId++;
|
||||||
|
var installedPlugin = Plugins.PluginInstalled(plugin.Id) ? Plugins.GetPlugin(plugin.Id) : null;
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
#line hidden
|
#line hidden
|
||||||
WriteLiteral(" <div");
|
WriteLiteral(" <div");
|
||||||
|
|
||||||
WriteAttribute("class", Tuple.Create(" class=\"", 1328), Tuple.Create("\"", 1432)
|
WriteAttribute("class", Tuple.Create(" class=\"", 1449), Tuple.Create("\"", 1542)
|
||||||
, Tuple.Create(Tuple.Create("", 1336), Tuple.Create("pageMenuArea", 1336), true)
|
, Tuple.Create(Tuple.Create("", 1457), Tuple.Create("pageMenuArea", 1457), true)
|
||||||
, Tuple.Create(Tuple.Create(" ", 1348), Tuple.Create("pluginItem", 1349), true)
|
, Tuple.Create(Tuple.Create(" ", 1469), Tuple.Create("pluginItem", 1470), true)
|
||||||
|
|
||||||
#line 31 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
|
||||||
, Tuple.Create(Tuple.Create("", 1359), Tuple.Create<System.Object, System.Int32>(Plugins.PluginInstalled(plugin.Id) ? " pluginInstalled" : string.Empty
|
|
||||||
|
|
||||||
#line default
|
|
||||||
#line hidden
|
|
||||||
, 1359), false)
|
|
||||||
);
|
|
||||||
|
|
||||||
WriteLiteral(">\r\n <a");
|
|
||||||
|
|
||||||
WriteLiteral(" class=\"pluginInstallLink\"");
|
|
||||||
|
|
||||||
WriteAttribute("href", Tuple.Create(" href=\"", 1496), Tuple.Create("\"", 1551)
|
|
||||||
|
|
||||||
#line 32 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 32 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
, Tuple.Create(Tuple.Create("", 1503), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.Plugin.Install(plugin.Id))
|
, Tuple.Create(Tuple.Create("", 1480), Tuple.Create<System.Object, System.Int32>(installedPlugin != null ? " pluginInstalled" : string.Empty
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
#line hidden
|
#line hidden
|
||||||
, 1503), false)
|
, 1480), false)
|
||||||
);
|
);
|
||||||
|
|
||||||
WriteLiteral(">\r\n <h2");
|
WriteLiteral(">\r\n <h2");
|
||||||
|
|
||||||
WriteLiteral(" class=\"pluginName\"");
|
WriteLiteral(" class=\"pluginName\"");
|
||||||
|
|
||||||
@@ -187,20 +174,97 @@ WriteLiteral(">");
|
|||||||
|
|
||||||
|
|
||||||
#line 33 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 33 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
Write(plugin.Name);
|
Write(plugin.Name);
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
#line hidden
|
#line hidden
|
||||||
WriteLiteral("</h2>\r\n </a>\r\n <div" +
|
WriteLiteral("\r\n");
|
||||||
"");
|
|
||||||
|
|
||||||
|
#line 34 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
|
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
|
||||||
|
#line 34 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
|
if (installedPlugin == null){
|
||||||
|
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
WriteLiteral(" <a");
|
||||||
|
|
||||||
|
WriteLiteral(" class=\"pluginInstallLink button\"");
|
||||||
|
|
||||||
|
WriteAttribute("href", Tuple.Create(" href=\"", 1754), Tuple.Create("\"", 1809)
|
||||||
|
|
||||||
|
#line 35 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
|
, Tuple.Create(Tuple.Create("", 1761), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.Plugin.Install(plugin.Id))
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
, 1761), false)
|
||||||
|
);
|
||||||
|
|
||||||
|
WriteLiteral(">Install</a>\r\n");
|
||||||
|
|
||||||
|
|
||||||
|
#line 36 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
|
}else{
|
||||||
|
if (Version.Parse(plugin.LatestVersion) > installedPlugin.Version){
|
||||||
|
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
WriteLiteral(" <a");
|
||||||
|
|
||||||
|
WriteLiteral(" class=\"pluginUpdateLink button\"");
|
||||||
|
|
||||||
|
WriteAttribute("href", Tuple.Create(" href=\"", 2047), Tuple.Create("\"", 2101)
|
||||||
|
|
||||||
|
#line 38 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
|
, Tuple.Create(Tuple.Create("", 2054), Tuple.Create<System.Object, System.Int32>(Url.Action(MVC.API.Plugin.Update(plugin.Id))
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
, 2054), false)
|
||||||
|
);
|
||||||
|
|
||||||
|
WriteLiteral(">Update</a> \r\n");
|
||||||
|
|
||||||
|
|
||||||
|
#line 39 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
|
}else{
|
||||||
|
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
WriteLiteral(" <a");
|
||||||
|
|
||||||
|
WriteLiteral(" class=\"pluginInstalledLink button disabled\"");
|
||||||
|
|
||||||
|
WriteLiteral(" href=\"#\"");
|
||||||
|
|
||||||
|
WriteLiteral(">Installed</a> \r\n");
|
||||||
|
|
||||||
|
|
||||||
|
#line 41 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#line default
|
||||||
|
#line hidden
|
||||||
|
WriteLiteral(" </h2>\r\n <div");
|
||||||
|
|
||||||
WriteLiteral(" class=\"pluginItemBlurb\"");
|
WriteLiteral(" class=\"pluginItemBlurb\"");
|
||||||
|
|
||||||
WriteLiteral(">");
|
WriteLiteral(">");
|
||||||
|
|
||||||
|
|
||||||
#line 35 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 44 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
Write(new HtmlString(plugin.Blurb));
|
Write(new HtmlString(plugin.Blurb));
|
||||||
|
|
||||||
|
|
||||||
@@ -217,7 +281,7 @@ WriteLiteral(" class=\"pluginId\"");
|
|||||||
WriteLiteral(">");
|
WriteLiteral(">");
|
||||||
|
|
||||||
|
|
||||||
#line 37 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 46 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
Write(plugin.Id);
|
Write(plugin.Id);
|
||||||
|
|
||||||
|
|
||||||
@@ -230,7 +294,7 @@ WriteLiteral(" class=\"pluginVersion\"");
|
|||||||
WriteLiteral(">v");
|
WriteLiteral(">v");
|
||||||
|
|
||||||
|
|
||||||
#line 37 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 46 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
Write(plugin.LatestVersion);
|
Write(plugin.LatestVersion);
|
||||||
|
|
||||||
|
|
||||||
@@ -239,7 +303,7 @@ WriteLiteral(">v");
|
|||||||
WriteLiteral("</span> | ");
|
WriteLiteral("</span> | ");
|
||||||
|
|
||||||
|
|
||||||
#line 37 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 46 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
Write(plugin.Author);
|
Write(plugin.Author);
|
||||||
|
|
||||||
|
|
||||||
@@ -247,14 +311,14 @@ WriteLiteral("</span> | ");
|
|||||||
#line hidden
|
#line hidden
|
||||||
WriteLiteral(" | <a");
|
WriteLiteral(" | <a");
|
||||||
|
|
||||||
WriteAttribute("href", Tuple.Create(" href=\"", 1992), Tuple.Create("\"", 2010)
|
WriteAttribute("href", Tuple.Create(" href=\"", 2716), Tuple.Create("\"", 2734)
|
||||||
|
|
||||||
#line 37 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 46 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
, Tuple.Create(Tuple.Create("", 1999), Tuple.Create<System.Object, System.Int32>(plugin.Url
|
, Tuple.Create(Tuple.Create("", 2723), Tuple.Create<System.Object, System.Int32>(plugin.Url
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
#line hidden
|
#line hidden
|
||||||
, 1999), false)
|
, 2723), false)
|
||||||
);
|
);
|
||||||
|
|
||||||
WriteLiteral(" target=\"_blank\"");
|
WriteLiteral(" target=\"_blank\"");
|
||||||
@@ -263,7 +327,7 @@ WriteLiteral(">More Information</a>\r\n </div>\r\
|
|||||||
" </div>\r\n");
|
" </div>\r\n");
|
||||||
|
|
||||||
|
|
||||||
#line 40 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 49 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -272,7 +336,7 @@ WriteLiteral(">More Information</a>\r\n </div>\r\
|
|||||||
WriteLiteral("\r\n </td>\r\n");
|
WriteLiteral("\r\n </td>\r\n");
|
||||||
|
|
||||||
|
|
||||||
#line 43 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 52 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -281,7 +345,7 @@ WriteLiteral("\r\n </td>\r\n");
|
|||||||
WriteLiteral(" </tr>\r\n </table>\r\n");
|
WriteLiteral(" </tr>\r\n </table>\r\n");
|
||||||
|
|
||||||
|
|
||||||
#line 46 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 55 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -328,13 +392,13 @@ WriteLiteral(" style=\"padding-bottom: 10px;\"");
|
|||||||
WriteLiteral(">\r\n");
|
WriteLiteral(">\r\n");
|
||||||
|
|
||||||
|
|
||||||
#line 59 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 68 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
|
|
||||||
|
|
||||||
#line default
|
#line default
|
||||||
#line hidden
|
#line hidden
|
||||||
|
|
||||||
#line 59 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 68 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
using (Html.BeginForm(MVC.API.Plugin.InstallLocal(), FormMethod.Post, new { enctype = "multipart/form-data" }))
|
using (Html.BeginForm(MVC.API.Plugin.InstallLocal(), FormMethod.Post, new { enctype = "multipart/form-data" }))
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -358,7 +422,7 @@ WriteLiteral(" type=\"file\"");
|
|||||||
WriteLiteral(" />\r\n");
|
WriteLiteral(" />\r\n");
|
||||||
|
|
||||||
|
|
||||||
#line 63 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 72 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -391,25 +455,32 @@ WriteLiteral("></span>Warning: All plugins run with the same level of network pr
|
|||||||
" $(this).dialog(\"close\");\r\n }\r\n }\r\n }" +
|
" $(this).dialog(\"close\");\r\n }\r\n }\r\n }" +
|
||||||
");\r\n $(\'#pageMenu\').find(\'a.pluginInstallLink\').click(function () {\r\n " +
|
");\r\n $(\'#pageMenu\').find(\'a.pluginInstallLink\').click(function () {\r\n " +
|
||||||
" $this = $(this);\r\n\r\n $selectedPlugin = $this.closest(\'.plugin" +
|
" $this = $(this);\r\n\r\n $selectedPlugin = $this.closest(\'.plugin" +
|
||||||
"Item\');\r\n $selectedPluginUrl = $this.attr(\'href\');\r\n\r\n if " +
|
"Item\');\r\n $selectedPluginUrl = $this.attr(\'href\');\r\n\r\n $(\'" +
|
||||||
"($selectedPlugin.is(\'.pluginInstalled\')) {\r\n alert(\'This plugin i" +
|
"#dialogInstallPluginName\').text($selectedPlugin.find(\'.pluginName\').text());\r\n " +
|
||||||
"s already installed.\');\r\n } else {\r\n $(\'#dialogInstall" +
|
" $(\'#dialogInstallPluginDetails\').text($selectedPlugin.find(\'.pluginId\'" +
|
||||||
"PluginName\').text($selectedPlugin.find(\'.pluginName\').text());\r\n " +
|
").text() + \' | \' + $selectedPlugin.find(\'.pluginVersion\').text());\r\n\r\n " +
|
||||||
|
" $dialogInstall.dialog(\'option\', \'title\', \'Install this Plugin?\');\r\n " +
|
||||||
|
" $dialogInstall.dialog(\'open\');\r\n\r\n return false;\r\n });\r\n " +
|
||||||
|
" $(\'#pageMenu\').find(\'a.pluginUpdateLink\').click(function () {\r\n $t" +
|
||||||
|
"his = $(this);\r\n\r\n $selectedPlugin = $this.closest(\'.pluginItem\');\r\n " +
|
||||||
|
" $selectedPluginUrl = $this.attr(\'href\');\r\n\r\n $(\'#dialogIns" +
|
||||||
|
"tallPluginName\').text($selectedPlugin.find(\'.pluginName\').text());\r\n " +
|
||||||
"$(\'#dialogInstallPluginDetails\').text($selectedPlugin.find(\'.pluginId\').text() +" +
|
"$(\'#dialogInstallPluginDetails\').text($selectedPlugin.find(\'.pluginId\').text() +" +
|
||||||
" \' | \' + $selectedPlugin.find(\'.pluginVersion\').text());\r\n\r\n $dia" +
|
" \' | \' + $selectedPlugin.find(\'.pluginVersion\').text());\r\n\r\n $dialogI" +
|
||||||
"logInstall.dialog(\'open\');\r\n }\r\n return false;\r\n })" +
|
"nstall.dialog(\'option\', \'title\', \'Update this Plugin?\');\r\n $dialogIns" +
|
||||||
";\r\n\r\n // Upload\r\n var $dialogUpload = $(\'#dialogUploadPlugin\').dia" +
|
"tall.dialog(\'open\');\r\n\r\n return false;\r\n });\r\n\r\n // Upl" +
|
||||||
"log({\r\n resizable: false,\r\n modal: true,\r\n widt" +
|
"oad\r\n var $dialogUpload = $(\'#dialogUploadPlugin\').dialog({\r\n " +
|
||||||
"h: 350,\r\n autoOpen: false,\r\n buttons: {\r\n \"" +
|
"resizable: false,\r\n modal: true,\r\n width: 350,\r\n " +
|
||||||
"Upload & Install\": function () {\r\n var pluginFile = $(\'#plugi" +
|
" autoOpen: false,\r\n buttons: {\r\n \"Upload & Install\": " +
|
||||||
"nFile\');\r\n if (pluginFile.val()) {\r\n p" +
|
"function () {\r\n var pluginFile = $(\'#pluginFile\');\r\n " +
|
||||||
"luginFile.closest(\'form\').submit();\r\n $(this).dialog(\'dis" +
|
" if (pluginFile.val()) {\r\n pluginFile.closest(\'" +
|
||||||
"able\');\r\n } else {\r\n alert(\'Choose a P" +
|
"form\').submit();\r\n $(this).dialog(\'disable\');\r\n " +
|
||||||
"lugin Package to Upload\');\r\n }\r\n },\r\n " +
|
" } else {\r\n alert(\'Choose a Plugin Package to Up" +
|
||||||
" Cancel: function () {\r\n $(this).dialog(\"close\");\r\n " +
|
"load\');\r\n }\r\n },\r\n Cancel: func" +
|
||||||
" }\r\n }\r\n });\r\n $(\'#buttonUpload\').click(func" +
|
"tion () {\r\n $(this).dialog(\"close\");\r\n }\r\n " +
|
||||||
"tion () {\r\n $dialogUpload.dialog(\'open\');\r\n return false;\r" +
|
" }\r\n });\r\n $(\'#buttonUpload\').click(function () {\r\n " +
|
||||||
"\n });\r\n });\r\n</script>\r\n<div");
|
" $dialogUpload.dialog(\'open\');\r\n return false;\r\n });\r\n }" +
|
||||||
|
");\r\n</script>\r\n<div");
|
||||||
|
|
||||||
WriteLiteral(" class=\"actionBar\"");
|
WriteLiteral(" class=\"actionBar\"");
|
||||||
|
|
||||||
@@ -418,7 +489,7 @@ WriteLiteral(">\r\n");
|
|||||||
WriteLiteral(" ");
|
WriteLiteral(" ");
|
||||||
|
|
||||||
|
|
||||||
#line 142 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 163 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
Write(Html.ActionLinkButton("Update Catalogue", MVC.API.Plugin.UpdateLibraryCatalogue()));
|
Write(Html.ActionLinkButton("Update Catalogue", MVC.API.Plugin.UpdateLibraryCatalogue()));
|
||||||
|
|
||||||
|
|
||||||
@@ -429,7 +500,7 @@ WriteLiteral("\r\n");
|
|||||||
WriteLiteral(" ");
|
WriteLiteral(" ");
|
||||||
|
|
||||||
|
|
||||||
#line 143 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
#line 164 "..\..\Areas\Config\Views\Plugins\Install.cshtml"
|
||||||
Write(Html.ActionLinkButton("Install Plugin Package", MVC.API.Plugin.InstallLocal(), "buttonUpload"));
|
Write(Html.ActionLinkButton("Install Plugin Package", MVC.API.Plugin.InstallLocal(), "buttonUpload"));
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/*#source /ClientSource/Style/jQueryUI/jquery-ui.css */
|
/*#source /ClientSource/Style/jQueryUI/jquery-ui.css */
|
||||||
/*!
|
/*!
|
||||||
* jQuery UI CSS Framework 1.8.19
|
* jQuery UI CSS Framework 1.8.19
|
||||||
*
|
*
|
||||||
@@ -563,8 +563,8 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
|
|||||||
* http://docs.jquery.com/UI/Progressbar#theming
|
* http://docs.jquery.com/UI/Progressbar#theming
|
||||||
*/
|
*/
|
||||||
.ui-progressbar { height:2em; text-align: left; overflow: hidden; }
|
.ui-progressbar { height:2em; text-align: left; overflow: hidden; }
|
||||||
.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
|
.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
|
||||||
/*#source /ClientSource/Style/Site.css */
|
/*#source /ClientSource/Style/Site.css */
|
||||||
.tableData {
|
.tableData {
|
||||||
border: solid 1px #e8eef4;
|
border: solid 1px #e8eef4;
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
@@ -906,6 +906,7 @@ a:active {
|
|||||||
color: #335a87;
|
color: #335a87;
|
||||||
}
|
}
|
||||||
a.button {
|
a.button {
|
||||||
|
display: inline-block;
|
||||||
padding: 4px 10px;
|
padding: 4px 10px;
|
||||||
margin: 2px;
|
margin: 2px;
|
||||||
border: 1px solid #875a33;
|
border: 1px solid #875a33;
|
||||||
@@ -914,11 +915,11 @@ a.button {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
line-height: 2.2em;
|
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
a.button[disabled] {
|
a.button[disabled],
|
||||||
|
a.button.disabled {
|
||||||
background: #9e9e9e;
|
background: #9e9e9e;
|
||||||
border: 1px solid #696969;
|
border: 1px solid #696969;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
@@ -1357,7 +1358,8 @@ input[type="submit"] {
|
|||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
input[type="submit"].button {
|
input[type="submit"].button {
|
||||||
padding: 4px 10px;
|
font-size: 12px;
|
||||||
|
padding: 6px 10px 4px 10px;
|
||||||
margin: 2px;
|
margin: 2px;
|
||||||
border: 1px solid #875a33;
|
border: 1px solid #875a33;
|
||||||
background: #db761d;
|
background: #db761d;
|
||||||
@@ -1365,7 +1367,6 @@ input[type="submit"].button {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
line-height: 1.2em;
|
|
||||||
}
|
}
|
||||||
input[type="submit"].button:hover {
|
input[type="submit"].button:hover {
|
||||||
border: 1px solid #696969;
|
border: 1px solid #696969;
|
||||||
@@ -1686,4 +1687,4 @@ textarea.block {
|
|||||||
{
|
{
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
Binary file not shown.
|
After Width: | Height: | Size: 795 B |
Binary file not shown.
|
After Width: | Height: | Size: 795 B |
@@ -339,6 +339,7 @@ a:active {
|
|||||||
color: #335a87;
|
color: #335a87;
|
||||||
}
|
}
|
||||||
a.button {
|
a.button {
|
||||||
|
display: inline-block;
|
||||||
padding: 4px 10px;
|
padding: 4px 10px;
|
||||||
margin: 2px;
|
margin: 2px;
|
||||||
border: 1px solid #875a33;
|
border: 1px solid #875a33;
|
||||||
@@ -347,11 +348,11 @@ a.button {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
line-height: 2.2em;
|
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
a.button[disabled] {
|
a.button[disabled],
|
||||||
|
a.button.disabled {
|
||||||
background: #9e9e9e;
|
background: #9e9e9e;
|
||||||
border: 1px solid #696969;
|
border: 1px solid #696969;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
@@ -790,7 +791,8 @@ input[type="submit"] {
|
|||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
input[type="submit"].button {
|
input[type="submit"].button {
|
||||||
padding: 4px 10px;
|
font-size: 12px;
|
||||||
|
padding: 6px 10px 4px 10px;
|
||||||
margin: 2px;
|
margin: 2px;
|
||||||
border: 1px solid #875a33;
|
border: 1px solid #875a33;
|
||||||
background: #db761d;
|
background: #db761d;
|
||||||
@@ -798,7 +800,6 @@ input[type="submit"].button {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
line-height: 1.2em;
|
|
||||||
}
|
}
|
||||||
input[type="submit"].button:hover {
|
input[type="submit"].button:hover {
|
||||||
border: 1px solid #696969;
|
border: 1px solid #696969;
|
||||||
|
|||||||
+1283
-1283
File diff suppressed because it is too large
Load Diff
+1
-1
File diff suppressed because one or more lines are too long
@@ -20,7 +20,7 @@ namespace Disco.Web.Controllers
|
|||||||
#region Determine Server Is Core SKU
|
#region Determine Server Is Core SKU
|
||||||
// Added 2012-11-01 G#
|
// Added 2012-11-01 G#
|
||||||
// http://www.discoict.com.au/forum/support/2012/10/install-on-server-core.aspx
|
// http://www.discoict.com.au/forum/support/2012/10/install-on-server-core.aspx
|
||||||
private static Lazy<bool> ServerIsCoreSKU = new Lazy<bool>(() =>
|
internal static Lazy<bool> ServerIsCoreSKU = new Lazy<bool>(() =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
using System;
|
||||||
|
using System.Data.SqlClient;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Web.Mvc;
|
||||||
|
using Disco.Web.Models.InitialConfig;
|
||||||
|
using Disco.Data.Repository;
|
||||||
|
using System.Linq;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.IO.Compression;
|
||||||
|
using System.Management;
|
||||||
|
using System.Web;
|
||||||
|
using Disco.Services.Plugins;
|
||||||
|
|
||||||
|
namespace Disco.Web.Controllers
|
||||||
|
{
|
||||||
|
[OutputCache(Duration = 0, Location = System.Web.UI.OutputCacheLocation.None)]
|
||||||
|
public partial class UpdateController : Controller
|
||||||
|
{
|
||||||
|
protected override void OnActionExecuting(ActionExecutingContext filterContext)
|
||||||
|
{
|
||||||
|
if (!Request.IsLocal && !InitialConfigController.ServerIsCoreSKU.Value)
|
||||||
|
{
|
||||||
|
filterContext.Result = new HttpStatusCodeResult(System.Net.HttpStatusCode.ServiceUnavailable, "Initial Configuration of Disco is only allowed via a local connection");
|
||||||
|
}
|
||||||
|
base.OnActionExecuting(filterContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual ActionResult Index()
|
||||||
|
{
|
||||||
|
var status = UpdatePluginsAfterDiscoUpdateTask.UpdateDiscoPlugins(true);
|
||||||
|
|
||||||
|
return RedirectToAction(MVC.Config.Logging.TaskStatus(status.SessionId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -172,6 +172,7 @@
|
|||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Controllers\InitialConfigController.cs" />
|
<Compile Include="Controllers\InitialConfigController.cs" />
|
||||||
<Compile Include="Controllers\PluginWebHandlerController.cs" />
|
<Compile Include="Controllers\PluginWebHandlerController.cs" />
|
||||||
|
<Compile Include="Controllers\UpdateController.cs" />
|
||||||
<Compile Include="Extensions\HtmlExtensions.cs" />
|
<Compile Include="Extensions\HtmlExtensions.cs" />
|
||||||
<Compile Include="App_Start\AppConfig.cs" />
|
<Compile Include="App_Start\AppConfig.cs" />
|
||||||
<Compile Include="App_Start\BundleConfig.cs" />
|
<Compile Include="App_Start\BundleConfig.cs" />
|
||||||
@@ -1822,7 +1823,7 @@
|
|||||||
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
|
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
|
||||||
</WebProjectProperties>
|
</WebProjectProperties>
|
||||||
</FlavorProperties>
|
</FlavorProperties>
|
||||||
<UserProperties BuildVersion_StartDate="2001/1/1" BuildVersion_BuildAction="ReBuild" BuildVersion_UseGlobalSettings="True" BuildVersion_DetectChanges="False" />
|
<UserProperties BuildVersion_DetectChanges="False" BuildVersion_UseGlobalSettings="True" BuildVersion_BuildAction="ReBuild" BuildVersion_StartDate="2001/1/1" />
|
||||||
</VisualStudio>
|
</VisualStudio>
|
||||||
</ProjectExtensions>
|
</ProjectExtensions>
|
||||||
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
|
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
|
||||||
|
|||||||
+53
-23
@@ -24,54 +24,84 @@ namespace Disco.Web
|
|||||||
base.BeginRequest += new EventHandler(DiscoApplication_BeginRequest);
|
base.BeginRequest += new EventHandler(DiscoApplication_BeginRequest);
|
||||||
base.Error += new EventHandler(DiscoApplication_Error);
|
base.Error += new EventHandler(DiscoApplication_Error);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void Application_Start()
|
protected void Application_Start()
|
||||||
{
|
{
|
||||||
var timer = new Stopwatch();
|
var timer = new Stopwatch();
|
||||||
long timer_last;
|
long timer_last;
|
||||||
timer.Start();
|
timer.Start();
|
||||||
|
|
||||||
|
|
||||||
Debug.WriteLine("Application Startup Profiling Started");
|
Debug.WriteLine("Application Startup Profiling Started");
|
||||||
timer_last = timer.ElapsedMilliseconds;
|
timer_last = timer.ElapsedMilliseconds;
|
||||||
|
|
||||||
if (AppConfig.InitializeDatabase())
|
if (AppConfig.InitializeDatabase())
|
||||||
{
|
{
|
||||||
|
// Database Initialized
|
||||||
|
|
||||||
Debug.WriteLine("Initialized Database: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
Debug.WriteLine("Initialized Database: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
||||||
timer_last = timer.ElapsedMilliseconds;
|
timer_last = timer.ElapsedMilliseconds;
|
||||||
|
|
||||||
AreaRegistration.RegisterAllAreas();
|
// Check for Post-Update
|
||||||
|
Version previousVersion;
|
||||||
|
Version currentVersion = Disco.BI.Interop.Community.UpdateCheck.CurrentDiscoVersion();
|
||||||
|
using (DiscoDataContext dbContext = new DiscoDataContext())
|
||||||
|
{
|
||||||
|
previousVersion = dbContext.DiscoConfiguration.InstalledDatabaseVersion;
|
||||||
|
}
|
||||||
|
if (currentVersion == previousVersion)
|
||||||
|
{
|
||||||
|
// Normal Startup
|
||||||
|
|
||||||
Debug.WriteLine("Registered Areas: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
AreaRegistration.RegisterAllAreas();
|
||||||
timer_last = timer.ElapsedMilliseconds;
|
|
||||||
|
|
||||||
WebApiConfig.Register(GlobalConfiguration.Configuration);
|
|
||||||
|
|
||||||
Debug.WriteLine("Registered API: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
Debug.WriteLine("Registered Areas: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
||||||
timer_last = timer.ElapsedMilliseconds;
|
timer_last = timer.ElapsedMilliseconds;
|
||||||
|
|
||||||
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
|
|
||||||
|
|
||||||
Debug.WriteLine("Registered Global Filters: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
WebApiConfig.Register(GlobalConfiguration.Configuration);
|
||||||
timer_last = timer.ElapsedMilliseconds;
|
|
||||||
|
|
||||||
RouteConfig.RegisterRoutes(RouteTable.Routes);
|
|
||||||
|
|
||||||
Debug.WriteLine("Registered Routes: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
Debug.WriteLine("Registered API: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
||||||
timer_last = timer.ElapsedMilliseconds;
|
timer_last = timer.ElapsedMilliseconds;
|
||||||
|
|
||||||
BundleConfig.RegisterBundles();
|
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
|
||||||
|
|
||||||
Debug.WriteLine("Registered Bundles: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
Debug.WriteLine("Registered Global Filters: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
||||||
timer_last = timer.ElapsedMilliseconds;
|
timer_last = timer.ElapsedMilliseconds;
|
||||||
|
|
||||||
AppConfig.InitalizeEnvironment();
|
RouteConfig.RegisterRoutes(RouteTable.Routes);
|
||||||
|
|
||||||
Debug.WriteLine("Initialized Environment: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
Debug.WriteLine("Registered Routes: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
||||||
timer_last = timer.ElapsedMilliseconds;
|
timer_last = timer.ElapsedMilliseconds;
|
||||||
|
|
||||||
|
BundleConfig.RegisterBundles();
|
||||||
|
|
||||||
|
Debug.WriteLine("Registered Bundles: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
||||||
|
timer_last = timer.ElapsedMilliseconds;
|
||||||
|
|
||||||
|
AppConfig.InitalizeEnvironment();
|
||||||
|
|
||||||
|
Debug.WriteLine("Initialized Environment: +{0}ms", timer.ElapsedMilliseconds - timer_last);
|
||||||
|
timer_last = timer.ElapsedMilliseconds;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Post-Update Startup
|
||||||
|
AreaRegistration.RegisterAllAreas();
|
||||||
|
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
|
||||||
|
RouteConfig.RegisterUpdateRoutes(RouteTable.Routes);
|
||||||
|
BundleConfig.RegisterBundles();
|
||||||
|
AppConfig.InitializeUpdateEnvironment();
|
||||||
|
|
||||||
|
using (DiscoDataContext dbContext = new DiscoDataContext())
|
||||||
|
{
|
||||||
|
dbContext.DiscoConfiguration.InstalledDatabaseVersion = currentVersion;
|
||||||
|
dbContext.SaveChanges();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// Database Not Initialized
|
||||||
// Install
|
// Install
|
||||||
InitialConfig = true;
|
InitialConfig = true;
|
||||||
RouteConfig.RegisterInstallRoutes(RouteTable.Routes);
|
RouteConfig.RegisterInstallRoutes(RouteTable.Routes);
|
||||||
|
|||||||
@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
|
|||||||
//
|
//
|
||||||
// You can specify all the values or you can default the Revision and Build Numbers
|
// You can specify all the values or you can default the Revision and Build Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
[assembly: AssemblyVersion("1.2.0212.1702")]
|
[assembly: AssemblyVersion("1.2.0214.1848")]
|
||||||
[assembly: AssemblyFileVersion("1.2.0212.1702")]
|
[assembly: AssemblyFileVersion("1.2.0214.1848")]
|
||||||
|
|||||||
+158
-23
@@ -37,6 +37,7 @@ public static class MVC
|
|||||||
public static Disco.Web.Controllers.JobController Job = new Disco.Web.Controllers.T4MVC_JobController();
|
public static Disco.Web.Controllers.JobController Job = new Disco.Web.Controllers.T4MVC_JobController();
|
||||||
public static Disco.Web.Controllers.PluginWebHandlerController PluginWebHandler = new Disco.Web.Controllers.T4MVC_PluginWebHandlerController();
|
public static Disco.Web.Controllers.PluginWebHandlerController PluginWebHandler = new Disco.Web.Controllers.T4MVC_PluginWebHandlerController();
|
||||||
public static Disco.Web.Controllers.SearchController Search = new Disco.Web.Controllers.T4MVC_SearchController();
|
public static Disco.Web.Controllers.SearchController Search = new Disco.Web.Controllers.T4MVC_SearchController();
|
||||||
|
public static Disco.Web.Controllers.UpdateController Update = new Disco.Web.Controllers.T4MVC_UpdateController();
|
||||||
public static Disco.Web.Controllers.UserController User = new Disco.Web.Controllers.T4MVC_UserController();
|
public static Disco.Web.Controllers.UserController User = new Disco.Web.Controllers.T4MVC_UserController();
|
||||||
public static T4MVC.HomeController Home = new T4MVC.HomeController();
|
public static T4MVC.HomeController Home = new T4MVC.HomeController();
|
||||||
public static T4MVC.SharedController Shared = new T4MVC.SharedController();
|
public static T4MVC.SharedController Shared = new T4MVC.SharedController();
|
||||||
@@ -1998,6 +1999,84 @@ namespace Disco.Web.Controllers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace Disco.Web.Controllers
|
||||||
|
{
|
||||||
|
public partial class UpdateController
|
||||||
|
{
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public UpdateController() { }
|
||||||
|
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
protected UpdateController(Dummy d) { }
|
||||||
|
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
protected RedirectToRouteResult RedirectToAction(ActionResult result)
|
||||||
|
{
|
||||||
|
var callInfo = result.GetT4MVCResult();
|
||||||
|
return RedirectToRoute(callInfo.RouteValueDictionary);
|
||||||
|
}
|
||||||
|
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
protected RedirectToRouteResult RedirectToActionPermanent(ActionResult result)
|
||||||
|
{
|
||||||
|
var callInfo = result.GetT4MVCResult();
|
||||||
|
return RedirectToRoutePermanent(callInfo.RouteValueDictionary);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public UpdateController Actions { get { return MVC.Update; } }
|
||||||
|
[GeneratedCode("T4MVC", "2.0")]
|
||||||
|
public readonly string Area = "";
|
||||||
|
[GeneratedCode("T4MVC", "2.0")]
|
||||||
|
public readonly string Name = "Update";
|
||||||
|
[GeneratedCode("T4MVC", "2.0")]
|
||||||
|
public const string NameConst = "Update";
|
||||||
|
|
||||||
|
static readonly ActionNamesClass s_actions = new ActionNamesClass();
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public ActionNamesClass ActionNames { get { return s_actions; } }
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public class ActionNamesClass
|
||||||
|
{
|
||||||
|
public readonly string Index = "Index";
|
||||||
|
}
|
||||||
|
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public class ActionNameConstants
|
||||||
|
{
|
||||||
|
public const string Index = "Index";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static readonly ViewsClass s_views = new ViewsClass();
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public ViewsClass Views { get { return s_views; } }
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public class ViewsClass
|
||||||
|
{
|
||||||
|
static readonly _ViewNamesClass s_ViewNames = new _ViewNamesClass();
|
||||||
|
public _ViewNamesClass ViewNames { get { return s_ViewNames; } }
|
||||||
|
public class _ViewNamesClass
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public class T4MVC_UpdateController : Disco.Web.Controllers.UpdateController
|
||||||
|
{
|
||||||
|
public T4MVC_UpdateController() : base(Dummy.Instance) { }
|
||||||
|
|
||||||
|
public override System.Web.Mvc.ActionResult Index()
|
||||||
|
{
|
||||||
|
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Index);
|
||||||
|
return callInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace Disco.Web.Controllers
|
namespace Disco.Web.Controllers
|
||||||
{
|
{
|
||||||
public partial class UserController
|
public partial class UserController
|
||||||
@@ -6759,6 +6838,18 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
return RedirectToRoutePermanent(callInfo.RouteValueDictionary);
|
return RedirectToRoutePermanent(callInfo.RouteValueDictionary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[NonAction]
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public System.Web.Mvc.ActionResult Update()
|
||||||
|
{
|
||||||
|
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Update);
|
||||||
|
}
|
||||||
|
[NonAction]
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public System.Web.Mvc.ActionResult UpdateLocal()
|
||||||
|
{
|
||||||
|
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateLocal);
|
||||||
|
}
|
||||||
[NonAction]
|
[NonAction]
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
public System.Web.Mvc.ActionResult Uninstall()
|
public System.Web.Mvc.ActionResult Uninstall()
|
||||||
@@ -6767,16 +6858,16 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
}
|
}
|
||||||
[NonAction]
|
[NonAction]
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
public System.Web.Mvc.ActionResult InstallLocal()
|
|
||||||
{
|
|
||||||
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.InstallLocal);
|
|
||||||
}
|
|
||||||
[NonAction]
|
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
|
||||||
public System.Web.Mvc.ActionResult Install()
|
public System.Web.Mvc.ActionResult Install()
|
||||||
{
|
{
|
||||||
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Install);
|
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Install);
|
||||||
}
|
}
|
||||||
|
[NonAction]
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public System.Web.Mvc.ActionResult InstallLocal()
|
||||||
|
{
|
||||||
|
return new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.InstallLocal);
|
||||||
|
}
|
||||||
|
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
public PluginController Actions { get { return MVC.API.Plugin; } }
|
public PluginController Actions { get { return MVC.API.Plugin; } }
|
||||||
@@ -6794,21 +6885,44 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
public class ActionNamesClass
|
public class ActionNamesClass
|
||||||
{
|
{
|
||||||
public readonly string UpdateLibraryCatalogue = "UpdateLibraryCatalogue";
|
public readonly string UpdateLibraryCatalogue = "UpdateLibraryCatalogue";
|
||||||
|
public readonly string UpdateAll = "UpdateAll";
|
||||||
|
public readonly string Update = "Update";
|
||||||
|
public readonly string UpdateLocal = "UpdateLocal";
|
||||||
public readonly string Uninstall = "Uninstall";
|
public readonly string Uninstall = "Uninstall";
|
||||||
public readonly string InstallLocal = "InstallLocal";
|
|
||||||
public readonly string Install = "Install";
|
public readonly string Install = "Install";
|
||||||
|
public readonly string InstallLocal = "InstallLocal";
|
||||||
}
|
}
|
||||||
|
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
public class ActionNameConstants
|
public class ActionNameConstants
|
||||||
{
|
{
|
||||||
public const string UpdateLibraryCatalogue = "UpdateLibraryCatalogue";
|
public const string UpdateLibraryCatalogue = "UpdateLibraryCatalogue";
|
||||||
|
public const string UpdateAll = "UpdateAll";
|
||||||
|
public const string Update = "Update";
|
||||||
|
public const string UpdateLocal = "UpdateLocal";
|
||||||
public const string Uninstall = "Uninstall";
|
public const string Uninstall = "Uninstall";
|
||||||
public const string InstallLocal = "InstallLocal";
|
|
||||||
public const string Install = "Install";
|
public const string Install = "Install";
|
||||||
|
public const string InstallLocal = "InstallLocal";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static readonly ActionParamsClass_Update s_params_Update = new ActionParamsClass_Update();
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public ActionParamsClass_Update UpdateParams { get { return s_params_Update; } }
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public class ActionParamsClass_Update
|
||||||
|
{
|
||||||
|
public readonly string PluginId = "PluginId";
|
||||||
|
}
|
||||||
|
static readonly ActionParamsClass_UpdateLocal s_params_UpdateLocal = new ActionParamsClass_UpdateLocal();
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public ActionParamsClass_UpdateLocal UpdateLocalParams { get { return s_params_UpdateLocal; } }
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public class ActionParamsClass_UpdateLocal
|
||||||
|
{
|
||||||
|
public readonly string PluginId = "PluginId";
|
||||||
|
public readonly string Plugin = "Plugin";
|
||||||
|
}
|
||||||
static readonly ActionParamsClass_Uninstall s_params_Uninstall = new ActionParamsClass_Uninstall();
|
static readonly ActionParamsClass_Uninstall s_params_Uninstall = new ActionParamsClass_Uninstall();
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
public ActionParamsClass_Uninstall UninstallParams { get { return s_params_Uninstall; } }
|
public ActionParamsClass_Uninstall UninstallParams { get { return s_params_Uninstall; } }
|
||||||
@@ -6818,14 +6932,6 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
public readonly string id = "id";
|
public readonly string id = "id";
|
||||||
public readonly string UninstallData = "UninstallData";
|
public readonly string UninstallData = "UninstallData";
|
||||||
}
|
}
|
||||||
static readonly ActionParamsClass_InstallLocal s_params_InstallLocal = new ActionParamsClass_InstallLocal();
|
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
|
||||||
public ActionParamsClass_InstallLocal InstallLocalParams { get { return s_params_InstallLocal; } }
|
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
|
||||||
public class ActionParamsClass_InstallLocal
|
|
||||||
{
|
|
||||||
public readonly string Plugin = "Plugin";
|
|
||||||
}
|
|
||||||
static readonly ActionParamsClass_Install s_params_Install = new ActionParamsClass_Install();
|
static readonly ActionParamsClass_Install s_params_Install = new ActionParamsClass_Install();
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
public ActionParamsClass_Install InstallParams { get { return s_params_Install; } }
|
public ActionParamsClass_Install InstallParams { get { return s_params_Install; } }
|
||||||
@@ -6834,6 +6940,14 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
{
|
{
|
||||||
public readonly string PluginId = "PluginId";
|
public readonly string PluginId = "PluginId";
|
||||||
}
|
}
|
||||||
|
static readonly ActionParamsClass_InstallLocal s_params_InstallLocal = new ActionParamsClass_InstallLocal();
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public ActionParamsClass_InstallLocal InstallLocalParams { get { return s_params_InstallLocal; } }
|
||||||
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
|
public class ActionParamsClass_InstallLocal
|
||||||
|
{
|
||||||
|
public readonly string Plugin = "Plugin";
|
||||||
|
}
|
||||||
static readonly ViewsClass s_views = new ViewsClass();
|
static readonly ViewsClass s_views = new ViewsClass();
|
||||||
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
|
||||||
public ViewsClass Views { get { return s_views; } }
|
public ViewsClass Views { get { return s_views; } }
|
||||||
@@ -6859,6 +6973,27 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
return callInfo;
|
return callInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override System.Web.Mvc.ActionResult UpdateAll()
|
||||||
|
{
|
||||||
|
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateAll);
|
||||||
|
return callInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override System.Web.Mvc.ActionResult Update(string PluginId)
|
||||||
|
{
|
||||||
|
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Update);
|
||||||
|
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "PluginId", PluginId);
|
||||||
|
return callInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override System.Web.Mvc.ActionResult UpdateLocal(string PluginId, System.Web.HttpPostedFileBase Plugin)
|
||||||
|
{
|
||||||
|
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.UpdateLocal);
|
||||||
|
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "PluginId", PluginId);
|
||||||
|
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Plugin", Plugin);
|
||||||
|
return callInfo;
|
||||||
|
}
|
||||||
|
|
||||||
public override System.Web.Mvc.ActionResult Uninstall(string id, bool UninstallData)
|
public override System.Web.Mvc.ActionResult Uninstall(string id, bool UninstallData)
|
||||||
{
|
{
|
||||||
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Uninstall);
|
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Uninstall);
|
||||||
@@ -6867,13 +7002,6 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
return callInfo;
|
return callInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override System.Web.Mvc.ActionResult InstallLocal(System.Web.HttpPostedFileBase Plugin)
|
|
||||||
{
|
|
||||||
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.InstallLocal);
|
|
||||||
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Plugin", Plugin);
|
|
||||||
return callInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override System.Web.Mvc.ActionResult Install(string PluginId)
|
public override System.Web.Mvc.ActionResult Install(string PluginId)
|
||||||
{
|
{
|
||||||
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Install);
|
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.Install);
|
||||||
@@ -6881,6 +7009,13 @@ namespace Disco.Web.Areas.API.Controllers
|
|||||||
return callInfo;
|
return callInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override System.Web.Mvc.ActionResult InstallLocal(System.Web.HttpPostedFileBase Plugin)
|
||||||
|
{
|
||||||
|
var callInfo = new T4MVC_System_Web_Mvc_ActionResult(Area, Name, ActionNames.InstallLocal);
|
||||||
|
ModelUnbinderHelpers.AddRouteValues(callInfo.RouteValueDictionary, "Plugin", Plugin);
|
||||||
|
return callInfo;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user