mirror of
https://github.com/xcp-ng/xenadmin.git
synced 2024-12-22 00:16:03 +01:00
Merge pull request #1940 from jijiang/REQ648
Resurrect legacy CFU validator
This commit is contained in:
commit
a5c1375ead
281
CFUValidator/CFUValidator.cs
Normal file
281
CFUValidator/CFUValidator.cs
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using CFUValidator.CommandLineOptions;
|
||||||
|
using CFUValidator.OutputDecorators;
|
||||||
|
using CFUValidator.Updates;
|
||||||
|
using CFUValidator.Validators;
|
||||||
|
using Moq;
|
||||||
|
using XenAdmin;
|
||||||
|
using XenAdmin.Alerts;
|
||||||
|
using XenAdmin.Core;
|
||||||
|
using XenAdminTests;
|
||||||
|
using XenAPI;
|
||||||
|
|
||||||
|
namespace CFUValidator
|
||||||
|
{
|
||||||
|
public class CFUValidationException : Exception
|
||||||
|
{
|
||||||
|
public CFUValidationException(string message) : base(message){}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CFUValidator
|
||||||
|
{
|
||||||
|
private readonly MockObjectManager mom = new MockObjectManager();
|
||||||
|
private readonly XmlRetrieverFactory xmlFactory = new XmlRetrieverFactory();
|
||||||
|
private const string id = "id";
|
||||||
|
private string XmlLocation { get; set; }
|
||||||
|
private string ServerVersion { get; set; }
|
||||||
|
private OptionUsage UrlOrFile { get; set; }
|
||||||
|
private List<string> InstalledHotfixes { get; set; }
|
||||||
|
private bool CheckHotfixContents{ get; set; }
|
||||||
|
|
||||||
|
public CFUValidator(OptionUsage urlOrFile, string xmlLocation, string serverVersion,
|
||||||
|
List<string> installedHotfixes, bool checkHotfixContents)
|
||||||
|
{
|
||||||
|
if(urlOrFile != OptionUsage.File && urlOrFile != OptionUsage.Url)
|
||||||
|
throw new ArgumentException("urlOrFile option should be either File or Url");
|
||||||
|
|
||||||
|
mom.CreateNewConnection(id);
|
||||||
|
ConnectionsManager.XenConnections.AddRange(mom.AllConnections);
|
||||||
|
XmlLocation = xmlLocation;
|
||||||
|
ServerVersion = serverVersion;
|
||||||
|
InstalledHotfixes = installedHotfixes;
|
||||||
|
UrlOrFile = urlOrFile;
|
||||||
|
CheckHotfixContents = checkHotfixContents;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Run()
|
||||||
|
{
|
||||||
|
List<XenServerPatch> xenServerPatches;
|
||||||
|
List<XenServerVersion> xenServerVersions;
|
||||||
|
List<XenCenterVersion> xenCenterVersions;
|
||||||
|
|
||||||
|
Status = "Getting check for updates XML from " + XmlLocation + "...";
|
||||||
|
ReadCheckForUpdatesXML(out xenServerPatches, out xenServerVersions, out xenCenterVersions);
|
||||||
|
|
||||||
|
List<string> versionToCheck = GetVersionToCheck(xenServerVersions);
|
||||||
|
|
||||||
|
foreach (string ver in versionToCheck)
|
||||||
|
{
|
||||||
|
ServerVersion = ver;
|
||||||
|
RunTestsForGivenServerVersion(xenServerVersions, xenServerPatches, xenCenterVersions);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private List<string> GetVersionToCheck(List<XenServerVersion> xenServerVersions)
|
||||||
|
{
|
||||||
|
if(ServerVersion == CFUCommandLineOptionManager.AllVersions)
|
||||||
|
return xenServerVersions.ConvertAll(i => i.Version.ToString()).Distinct().ToList();
|
||||||
|
|
||||||
|
return new List<string>{ServerVersion};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RunTestsForGivenServerVersion(List<XenServerVersion> xenServerVersions,
|
||||||
|
List<XenServerPatch> xenServerPatches,
|
||||||
|
List<XenCenterVersion> xenCenterVersions)
|
||||||
|
{
|
||||||
|
CheckProvidedVersionNumber(xenServerVersions);
|
||||||
|
|
||||||
|
Status = String.Format("Generating server {0} mock-ups...", ServerVersion);
|
||||||
|
SetupMocks(xenServerPatches, xenServerVersions);
|
||||||
|
|
||||||
|
Status = "Determining XenCenter update required...";
|
||||||
|
var xcupdateAlerts = XenAdmin.Core.Updates.NewXenCenterUpdateAlerts(xenCenterVersions, new Version(ServerVersion));
|
||||||
|
|
||||||
|
Status = "Determining XenServer update required...";
|
||||||
|
var updateAlerts = XenAdmin.Core.Updates.NewXenServerVersionAlerts(xenServerVersions).Where(alert => !alert.CanIgnore).ToList();
|
||||||
|
|
||||||
|
Status = "Determining patches required...";
|
||||||
|
var patchAlerts = XenAdmin.Core.Updates.NewXenServerPatchAlerts(xenServerVersions, xenServerPatches).Where(alert => !alert.CanIgnore).ToList();
|
||||||
|
|
||||||
|
//Build patch checks list
|
||||||
|
List<AlertFeatureValidator> validators = new List<AlertFeatureValidator>
|
||||||
|
{
|
||||||
|
new CorePatchDetailsValidator(patchAlerts),
|
||||||
|
new PatchURLValidator(patchAlerts),
|
||||||
|
new ZipContentsValidator(patchAlerts)
|
||||||
|
};
|
||||||
|
|
||||||
|
Status = "Running patch check(s), this may take some time...";
|
||||||
|
RunValidators(validators);
|
||||||
|
|
||||||
|
Status = "Generating summary...";
|
||||||
|
GeneratePatchSummary(patchAlerts, validators, updateAlerts, xcupdateAlerts);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CheckProvidedVersionNumber(List<XenServerVersion> xenServerVersions)
|
||||||
|
{
|
||||||
|
if (!xenServerVersions.Any(v => v.Version.ToString() == ServerVersion))
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder("\nAvailable versions are:\n");
|
||||||
|
xenServerVersions.ConvertAll(i=>i.Version.ToString()).Distinct().ToList().ForEach(v=>sb.AppendLine(v));
|
||||||
|
throw new CFUValidationException("Could not find the version in the check for updates file: " + ServerVersion + sb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Output { get; private set; }
|
||||||
|
|
||||||
|
#region Status event code
|
||||||
|
public delegate void StatusChangedHandler(object sender, EventArgs e);
|
||||||
|
|
||||||
|
public event StatusChangedHandler StatusChanged;
|
||||||
|
|
||||||
|
protected virtual void OnStatusChanged()
|
||||||
|
{
|
||||||
|
if (StatusChanged != null)
|
||||||
|
StatusChanged(Status, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string status;
|
||||||
|
private string Status
|
||||||
|
{
|
||||||
|
get { return status; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
status = value;
|
||||||
|
OnStatusChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private void RunValidators(List<AlertFeatureValidator> validators)
|
||||||
|
{
|
||||||
|
int count = 1;
|
||||||
|
foreach (AlertFeatureValidator validator in validators)
|
||||||
|
{
|
||||||
|
if (validator is ZipContentsValidator && !CheckHotfixContents)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Status = count++ + ". " + validator.Description + "...";
|
||||||
|
|
||||||
|
validator.StatusChanged += validator_StatusChanged;
|
||||||
|
validator.Validate();
|
||||||
|
validator.StatusChanged -= validator_StatusChanged;
|
||||||
|
}
|
||||||
|
Status = "Validator checks complete";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validator_StatusChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Status = sender as string;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GeneratePatchSummary(List<XenServerPatchAlert> alerts, List<AlertFeatureValidator> validators,
|
||||||
|
List<XenServerVersionAlert> updateAlerts, List<XenCenterUpdateAlert> xcupdateAlerts)
|
||||||
|
{
|
||||||
|
OuputComponent oc = new OutputTextOuputComponent(XmlLocation, ServerVersion);
|
||||||
|
XenCenterUpdateDecorator xcud = new XenCenterUpdateDecorator(oc, xcupdateAlerts);
|
||||||
|
XenServerUpdateDecorator xsud = new XenServerUpdateDecorator(xcud, updateAlerts);
|
||||||
|
PatchAlertDecorator pad = new PatchAlertDecorator(xsud, alerts);
|
||||||
|
AlertFeatureValidatorDecorator afdCoreFields = new AlertFeatureValidatorDecorator(pad,
|
||||||
|
validators.First(v => v is CorePatchDetailsValidator),
|
||||||
|
"Core fields in patch checks:");
|
||||||
|
AlertFeatureValidatorDecorator afdPatchUrl = new AlertFeatureValidatorDecorator(afdCoreFields,
|
||||||
|
validators.First(v => v is PatchURLValidator),
|
||||||
|
"Required patch URL checks:");
|
||||||
|
AlertFeatureValidatorDecorator afdZipContents = new AlertFeatureValidatorDecorator(afdPatchUrl,
|
||||||
|
validators.First(v => v is ZipContentsValidator),
|
||||||
|
"Required patch zip content checks:");
|
||||||
|
|
||||||
|
if(CheckHotfixContents)
|
||||||
|
Output = afdZipContents.Generate().Insert(0, Output).ToString();
|
||||||
|
else
|
||||||
|
Output = afdPatchUrl.Generate().Insert(0, Output).ToString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ReadCheckForUpdatesXML(out List<XenServerPatch> patches, out List<XenServerVersion> versions, out List<XenCenterVersion> xcVersions)
|
||||||
|
{
|
||||||
|
ICheckForUpdatesXMLSource checkForUpdates = xmlFactory.GetAction(UrlOrFile, XmlLocation);
|
||||||
|
checkForUpdates.RunAsync();
|
||||||
|
|
||||||
|
ConsoleSpinner spinner = new ConsoleSpinner();
|
||||||
|
while(!checkForUpdates.IsCompleted)
|
||||||
|
{
|
||||||
|
spinner.Turn(checkForUpdates.PercentComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (checkForUpdates.ErrorRaised != null)
|
||||||
|
throw checkForUpdates.ErrorRaised;
|
||||||
|
|
||||||
|
patches = checkForUpdates.XenServerPatches;
|
||||||
|
versions = checkForUpdates.XenServerVersions;
|
||||||
|
xcVersions = checkForUpdates.XenCenterVersions;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetupMocks(List<XenServerPatch> xenServerPatches, List<XenServerVersion> xenServerVersions)
|
||||||
|
{
|
||||||
|
Mock<Host> master = mom.NewXenObject<Host>(id);
|
||||||
|
Mock<Pool> pool = mom.NewXenObject<Pool>(id);
|
||||||
|
XenRef<Host> masterRef = new XenRef<Host>("ref");
|
||||||
|
pool.Setup(p => p.master).Returns(masterRef);
|
||||||
|
pool.Setup(p => p.other_config).Returns(new Dictionary<string, string>());
|
||||||
|
mom.MockCacheFor(id).Setup(c => c.Resolve(It.IsAny<XenRef<Pool>>())).Returns(pool.Object);
|
||||||
|
mom.MockConnectionFor(id).Setup(c => c.Resolve(masterRef)).Returns(master.Object);
|
||||||
|
mom.MockConnectionFor(id).Setup(c => c.IsConnected).Returns(true);
|
||||||
|
master.Setup(h => h.software_version).Returns(new Dictionary<string, string>());
|
||||||
|
master.Setup(h => h.ProductVersion()).Returns(ServerVersion);
|
||||||
|
master.Setup(h => h.AppliedPatches()).Returns(GenerateMockPoolPatches(xenServerPatches));
|
||||||
|
|
||||||
|
//Currently build number will be referenced first so if it's present hook it up
|
||||||
|
string buildNumber = xenServerVersions.First(v => v.Version.ToString() == ServerVersion).BuildNumber;
|
||||||
|
master.Setup(h=>h.BuildNumberRaw()).Returns(buildNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Pool_patch> GenerateMockPoolPatches(List<XenServerPatch> xenServerPatches)
|
||||||
|
{
|
||||||
|
List<Pool_patch> patches = new List<Pool_patch>();
|
||||||
|
|
||||||
|
foreach (string installedHotfix in InstalledHotfixes)
|
||||||
|
{
|
||||||
|
string hotfix = installedHotfix;
|
||||||
|
XenServerPatch match = xenServerPatches.Find(m => m.Name.Contains(hotfix));
|
||||||
|
|
||||||
|
if(match == null)
|
||||||
|
throw new CFUValidationException("No patch could be found in the XML matching " + hotfix);
|
||||||
|
|
||||||
|
Mock<Pool_patch> pp = mom.NewXenObject<Pool_patch>(id);
|
||||||
|
pp.Setup(p => p.uuid).Returns(match.Uuid);
|
||||||
|
patches.Add(pp.Object);
|
||||||
|
}
|
||||||
|
|
||||||
|
return patches;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
150
CFUValidator/CFUValidator.csproj
Normal file
150
CFUValidator/CFUValidator.csproj
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>9.0.30729</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{39308480-78C3-40B4-924D-06914F343ACD}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>CFUValidator</RootNamespace>
|
||||||
|
<AssemblyName>CFUValidator</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<PublishUrl>publish\</PublishUrl>
|
||||||
|
<Install>true</Install>
|
||||||
|
<InstallFrom>Disk</InstallFrom>
|
||||||
|
<UpdateEnabled>false</UpdateEnabled>
|
||||||
|
<UpdateMode>Foreground</UpdateMode>
|
||||||
|
<UpdateInterval>7</UpdateInterval>
|
||||||
|
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||||
|
<UpdatePeriodically>false</UpdatePeriodically>
|
||||||
|
<UpdateRequired>false</UpdateRequired>
|
||||||
|
<MapFileExtensions>true</MapFileExtensions>
|
||||||
|
<ApplicationRevision>0</ApplicationRevision>
|
||||||
|
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||||
|
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||||
|
<UseApplicationTrust>false</UseApplicationTrust>
|
||||||
|
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||||
|
<FileUpgradeFlags>
|
||||||
|
</FileUpgradeFlags>
|
||||||
|
<OldToolsVersion>3.5</OldToolsVersion>
|
||||||
|
<UpgradeBackupLocation />
|
||||||
|
<TargetFrameworkProfile />
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Moq, Version=4.0.10827.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\packages\Moq.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core">
|
||||||
|
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="CFUValidator.cs" />
|
||||||
|
<Compile Include="CommandLineOptions\CommandLineArgument.cs" />
|
||||||
|
<Compile Include="CommandLineOptions\CFUCommandLineOptionManager.cs" />
|
||||||
|
<Compile Include="CommandLineOptions\CommandLineParser.cs" />
|
||||||
|
<Compile Include="ConsoleSpinner.cs" />
|
||||||
|
<Compile Include="OutputDecorators\AlertFeatureValidatorDecorator.cs" />
|
||||||
|
<Compile Include="OutputDecorators\OuputComponent.cs" />
|
||||||
|
<Compile Include="OutputDecorators\Decorator.cs" />
|
||||||
|
<Compile Include="OutputDecorators\PatchAlertDecorator.cs" />
|
||||||
|
<Compile Include="OutputDecorators\XenCenterUpdateDecorator.cs" />
|
||||||
|
<Compile Include="OutputDecorators\XenServerUpdateDecorator.cs" />
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="Updates\AlternativeUrlDownloadUpdatesXmlSourceAction.cs" />
|
||||||
|
<Compile Include="Updates\ReadFromFileUpdatesXmlSource.cs" />
|
||||||
|
<Compile Include="Updates\ICheckForUpdatesXMLSource.cs" />
|
||||||
|
<Compile Include="Updates\XmlRetrieverFactory.cs" />
|
||||||
|
<Compile Include="Validators\AlertFeatureValidator.cs" />
|
||||||
|
<Compile Include="Validators\CorePatchDetailsValidator.cs" />
|
||||||
|
<Compile Include="Validators\PatchURLValidator.cs" />
|
||||||
|
<Compile Include="Validators\ZipContentsValidator.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
|
||||||
|
<Visible>False</Visible>
|
||||||
|
<ProductName>.NET Framework Client Profile</ProductName>
|
||||||
|
<Install>false</Install>
|
||||||
|
</BootstrapperPackage>
|
||||||
|
<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
|
||||||
|
<Visible>False</Visible>
|
||||||
|
<ProductName>.NET Framework 2.0 %28x86%29</ProductName>
|
||||||
|
<Install>false</Install>
|
||||||
|
</BootstrapperPackage>
|
||||||
|
<BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
|
||||||
|
<Visible>False</Visible>
|
||||||
|
<ProductName>.NET Framework 3.0 %28x86%29</ProductName>
|
||||||
|
<Install>false</Install>
|
||||||
|
</BootstrapperPackage>
|
||||||
|
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
|
||||||
|
<Visible>False</Visible>
|
||||||
|
<ProductName>.NET Framework 3.5</ProductName>
|
||||||
|
<Install>false</Install>
|
||||||
|
</BootstrapperPackage>
|
||||||
|
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||||
|
<Visible>False</Visible>
|
||||||
|
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||||
|
<Install>true</Install>
|
||||||
|
</BootstrapperPackage>
|
||||||
|
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
|
||||||
|
<Visible>False</Visible>
|
||||||
|
<ProductName>Windows Installer 3.1</ProductName>
|
||||||
|
<Install>true</Install>
|
||||||
|
</BootstrapperPackage>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\XenAdminTests\XenAdminTests.csproj">
|
||||||
|
<Project>{21B9482C-D255-40D5-ABA7-C8F00F99547C}</Project>
|
||||||
|
<Name>XenAdminTests</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\XenAdmin\XenAdmin.csproj">
|
||||||
|
<Project>{70BDA4BC-F062-4302-8ACD-A15D8BF31D65}</Project>
|
||||||
|
<Name>XenAdmin</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\XenCenterLib\XenCenterLib.csproj">
|
||||||
|
<Project>{9861DFA1-B41F-432D-A43F-226257DEBBB9}</Project>
|
||||||
|
<Name>XenCenterLib</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\XenModel\XenModel.csproj">
|
||||||
|
<Project>{B306FC59-4441-4A5F-9F54-D3F68D4EE38D}</Project>
|
||||||
|
<Name>XenModel</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="app.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
131
CFUValidator/CommandLineOptions/CFUCommandLineOptionManager.cs
Normal file
131
CFUValidator/CommandLineOptions/CFUCommandLineOptionManager.cs
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace CFUValidator.CommandLineOptions
|
||||||
|
{
|
||||||
|
internal class CFUCommandLineOptionManager
|
||||||
|
{
|
||||||
|
private readonly List<CommandLineArgument> clas;
|
||||||
|
public CFUCommandLineOptionManager(List<CommandLineArgument> clas)
|
||||||
|
{
|
||||||
|
this.clas = clas;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Not to be called from inside this class to keep IoC
|
||||||
|
public static List<CommandLineArgument> EmptyArguments
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new List<CommandLineArgument>
|
||||||
|
{
|
||||||
|
new CommandLineArgument( OptionUsage.Help, 'h', "Display this help" ),
|
||||||
|
new CommandLineArgument( OptionUsage.CheckZipContents, 'c', "Optionally check the zip contents of the hotfixes" ),
|
||||||
|
new CommandLineArgument( OptionUsage.Url, 'u', "<URL to extract XML from> Cannot be used with -f flag"),
|
||||||
|
new CommandLineArgument( OptionUsage.File, 'f', "<File name to extract XML from> Cannot be used with -u flag" ),
|
||||||
|
new CommandLineArgument( OptionUsage.ServerVersion, 's', "<Server version to test> eg. 6.0.2" ),
|
||||||
|
new CommandLineArgument( OptionUsage.Hotfix, 'p', "<List of patches/hotfixes that server has> eg. XS602E001 (space delimited)" )
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string AllVersions = "999.999.999";
|
||||||
|
|
||||||
|
public string XmlLocation { get { return GetFileUsageCLA().Options.First(); } }
|
||||||
|
|
||||||
|
public bool CheckHotfixContents { get { return clas.First(c => c.Usage == OptionUsage.CheckZipContents).IsActiveOption; } }
|
||||||
|
|
||||||
|
private CommandLineArgument GetFileUsageCLA()
|
||||||
|
{
|
||||||
|
CommandLineArgument claForUrl = clas.First(c => c.Usage == OptionUsage.Url);
|
||||||
|
CommandLineArgument claForFle = clas.First(c => c.Usage == OptionUsage.File);
|
||||||
|
if (claForUrl.IsActiveOption && claForFle.IsActiveOption)
|
||||||
|
throw new CFUValidationException(String.Format("Switches '-{0}' and '-{1}' cannot be used at the same time", claForFle.Switch, claForUrl.Switch));
|
||||||
|
|
||||||
|
if (!claForUrl.IsActiveOption && !claForFle.IsActiveOption)
|
||||||
|
throw new CFUValidationException(String.Format("You must provide either option '-{0}' or '-{1}'", claForFle.Switch, claForUrl.Switch));
|
||||||
|
|
||||||
|
if (claForFle.IsActiveOption)
|
||||||
|
return claForFle;
|
||||||
|
|
||||||
|
return claForUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OptionUsage FileSource { get {return GetFileUsageCLA().Usage; } }
|
||||||
|
|
||||||
|
public string ServerVersion
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
CommandLineArgument cla = clas.First(c => c.Usage == OptionUsage.ServerVersion);
|
||||||
|
return !cla.IsActiveOption ? AllVersions : cla.Options.First();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<string> InstalledHotfixes
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
CommandLineArgument cla = clas.First(c => c.Usage == OptionUsage.Hotfix);
|
||||||
|
if (!cla.IsActiveOption)
|
||||||
|
return new List<string>();
|
||||||
|
return cla.Options;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public bool IsHelpRequired
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return clas.First(c => c.Usage == OptionUsage.Help).IsActiveOption;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Help
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder("Execute the command with the following command line options\n\nOptions:\n");
|
||||||
|
foreach (CommandLineArgument cla in clas.OrderBy(c => c.Switch))
|
||||||
|
{
|
||||||
|
sb.AppendLine(String.Format("-{0} {1}", cla.Switch, cla.Description));
|
||||||
|
}
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
63
CFUValidator/CommandLineOptions/CommandLineArgument.cs
Normal file
63
CFUValidator/CommandLineOptions/CommandLineArgument.cs
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace CFUValidator.CommandLineOptions
|
||||||
|
{
|
||||||
|
public enum OptionUsage
|
||||||
|
{
|
||||||
|
Help,
|
||||||
|
Url,
|
||||||
|
File,
|
||||||
|
Hotfix,
|
||||||
|
ServerVersion,
|
||||||
|
CheckZipContents
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CommandLineArgument
|
||||||
|
{
|
||||||
|
public CommandLineArgument(OptionUsage usage, char commandSwitch, string description)
|
||||||
|
{
|
||||||
|
Switch = commandSwitch;
|
||||||
|
Description = description;
|
||||||
|
Usage = usage;
|
||||||
|
Options = null;
|
||||||
|
IsActiveOption = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OptionUsage Usage { get; private set; }
|
||||||
|
public char Switch { get; private set; }
|
||||||
|
public List<string> Options { get; set; }
|
||||||
|
public string Description { get; private set; }
|
||||||
|
public bool IsActiveOption { get; set; }
|
||||||
|
}
|
||||||
|
}
|
72
CFUValidator/CommandLineOptions/CommandLineParser.cs
Normal file
72
CFUValidator/CommandLineOptions/CommandLineParser.cs
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace CFUValidator.CommandLineOptions
|
||||||
|
{
|
||||||
|
public class CommandLineParser
|
||||||
|
{
|
||||||
|
private readonly string[] args;
|
||||||
|
|
||||||
|
public List<CommandLineArgument> ParsedArguments { get; private set; }
|
||||||
|
|
||||||
|
public CommandLineParser(string[] args, List<CommandLineArgument> argsToParse)
|
||||||
|
{
|
||||||
|
this.args = args;
|
||||||
|
ParsedArguments = argsToParse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Parse()
|
||||||
|
{
|
||||||
|
string[] recastArgs = Regex.Split(string.Join(" ", args).Trim(), @"(?=[-])(?<=[ ])");
|
||||||
|
foreach (string arg in recastArgs)
|
||||||
|
{
|
||||||
|
if(String.IsNullOrEmpty(arg))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
string optionSwitch = Regex.Match(arg, "[-]{1}[a-z]{1}").Value.Trim();
|
||||||
|
char switchChar = Convert.ToChar(optionSwitch.Substring(1, 1));
|
||||||
|
string[] splitArgs = arg.Replace(optionSwitch, "").Trim().Split(' ');
|
||||||
|
|
||||||
|
CommandLineArgument cla = ParsedArguments.FirstOrDefault(c => c.Switch == switchChar);
|
||||||
|
if (cla != null)
|
||||||
|
{
|
||||||
|
cla.Options = splitArgs.Where(s=>!String.IsNullOrEmpty(s)).ToList();
|
||||||
|
cla.IsActiveOption = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
85
CFUValidator/ConsoleSpinner.cs
Normal file
85
CFUValidator/ConsoleSpinner.cs
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace CFUValidator
|
||||||
|
{
|
||||||
|
public class ConsoleSpinner
|
||||||
|
{
|
||||||
|
int counter;
|
||||||
|
private const string working = "Working ";
|
||||||
|
|
||||||
|
public ConsoleSpinner()
|
||||||
|
{
|
||||||
|
counter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Turn()
|
||||||
|
{
|
||||||
|
counter++;
|
||||||
|
switch (counter % 4)
|
||||||
|
{
|
||||||
|
case 0: WriteAtOrigin(working + "/"); break;
|
||||||
|
case 1: WriteAtOrigin(working + "-"); break;
|
||||||
|
case 2: WriteAtOrigin(working + "\\"); break;
|
||||||
|
case 3: WriteAtOrigin(working + "|"); break;
|
||||||
|
}
|
||||||
|
Thread.Sleep(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Turn(double percentageComplete)
|
||||||
|
{
|
||||||
|
counter++;
|
||||||
|
switch (counter % 4)
|
||||||
|
{
|
||||||
|
case 0: WriteAtOrigin(working + "/ (" + percentageComplete + "%)"); break;
|
||||||
|
case 1: WriteAtOrigin(working + "- (" + percentageComplete + "%)"); break;
|
||||||
|
case 2: WriteAtOrigin(working + "\\ (" + percentageComplete + "%)"); break;
|
||||||
|
case 3: WriteAtOrigin(working + "| (" + percentageComplete + "%)"); break;
|
||||||
|
}
|
||||||
|
Thread.Sleep(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WriteAtOrigin(string toWrite)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Console.SetCursorPosition(0, Console.CursorTop);
|
||||||
|
Console.Write(toWrite);
|
||||||
|
Console.SetCursorPosition(0, Console.CursorTop);
|
||||||
|
}
|
||||||
|
catch (SystemException){}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,60 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using CFUValidator.Validators;
|
||||||
|
|
||||||
|
namespace CFUValidator.OutputDecorators
|
||||||
|
{
|
||||||
|
class AlertFeatureValidatorDecorator : Decorator
|
||||||
|
{
|
||||||
|
private readonly string header;
|
||||||
|
private readonly AlertFeatureValidator validator;
|
||||||
|
public AlertFeatureValidatorDecorator(OuputComponent ouputComponent, AlertFeatureValidator validator, string header)
|
||||||
|
{
|
||||||
|
SetComponent(ouputComponent);
|
||||||
|
this.validator = validator;
|
||||||
|
this.header = header;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder Generate()
|
||||||
|
{
|
||||||
|
StringBuilder sb = base.Generate();
|
||||||
|
sb.AppendLine(header);
|
||||||
|
if (validator.ErrorsFound)
|
||||||
|
validator.Results.ForEach(v => sb.AppendLine(v));
|
||||||
|
else
|
||||||
|
sb.AppendLine("all OK");
|
||||||
|
return sb.AppendLine(String.Empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
53
CFUValidator/OutputDecorators/Decorator.cs
Normal file
53
CFUValidator/OutputDecorators/Decorator.cs
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace CFUValidator.OutputDecorators
|
||||||
|
{
|
||||||
|
abstract class Decorator : OuputComponent
|
||||||
|
{
|
||||||
|
private OuputComponent ouputComponent;
|
||||||
|
public void SetComponent(OuputComponent ouputComponentToSet)
|
||||||
|
{
|
||||||
|
ouputComponent = ouputComponentToSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder Generate()
|
||||||
|
{
|
||||||
|
if(ouputComponent != null)
|
||||||
|
return ouputComponent.Generate();
|
||||||
|
|
||||||
|
throw new NullReferenceException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
66
CFUValidator/OutputDecorators/OuputComponent.cs
Normal file
66
CFUValidator/OutputDecorators/OuputComponent.cs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace CFUValidator.OutputDecorators
|
||||||
|
{
|
||||||
|
public abstract class OuputComponent
|
||||||
|
{
|
||||||
|
public abstract StringBuilder Generate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OutputTextOuputComponent : OuputComponent
|
||||||
|
{
|
||||||
|
private readonly string location;
|
||||||
|
private readonly string serverVersion;
|
||||||
|
public OutputTextOuputComponent(string location, string serverVersion)
|
||||||
|
{
|
||||||
|
this.location = location;
|
||||||
|
this.serverVersion = serverVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder Generate()
|
||||||
|
{
|
||||||
|
string header = String.Format("\nSummary for server version {0}, XML from {1}, generated on {2}\n\n", serverVersion,
|
||||||
|
location, Date.ToLocalTime());
|
||||||
|
return new StringBuilder(header);
|
||||||
|
}
|
||||||
|
|
||||||
|
private DateTime Date
|
||||||
|
{
|
||||||
|
get { return DateTime.Now; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
80
CFUValidator/OutputDecorators/PatchAlertDecorator.cs
Normal file
80
CFUValidator/OutputDecorators/PatchAlertDecorator.cs
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using XenAdmin.Alerts;
|
||||||
|
|
||||||
|
namespace CFUValidator.OutputDecorators
|
||||||
|
{
|
||||||
|
|
||||||
|
class PatchAlertDecorator : Decorator
|
||||||
|
{
|
||||||
|
private readonly List<XenServerPatchAlert> alerts;
|
||||||
|
private const string header = "Patches required ({0}):";
|
||||||
|
private const string zeroResults = "No patches required";
|
||||||
|
private const string hotfixRegex = "XS[0-9]+E[A-Z]*[0-9]+";
|
||||||
|
private const string unknown = "Name unknown (uuid={0})";
|
||||||
|
|
||||||
|
public PatchAlertDecorator(OuputComponent ouputComponent, List<XenServerPatchAlert> alerts)
|
||||||
|
{
|
||||||
|
SetComponent(ouputComponent);
|
||||||
|
this.alerts = alerts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder Generate()
|
||||||
|
{
|
||||||
|
StringBuilder sb = base.Generate();
|
||||||
|
sb.AppendLine(String.Format(header, alerts.Count));
|
||||||
|
AddAlertSummary(sb);
|
||||||
|
return sb.AppendLine(String.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddAlertSummary(StringBuilder sb)
|
||||||
|
{
|
||||||
|
if (alerts.Count == 0)
|
||||||
|
sb.AppendLine(zeroResults);
|
||||||
|
|
||||||
|
foreach (XenServerPatchAlert alert in alerts.OrderBy(a => a.Patch.Name))
|
||||||
|
{
|
||||||
|
string patchName = Regex.Match(alert.Patch.Name, hotfixRegex).Value;
|
||||||
|
string nameToReturn = String.IsNullOrEmpty(patchName) ? alert.Patch.Name.Trim() : patchName;
|
||||||
|
|
||||||
|
sb.AppendLine(!String.IsNullOrEmpty(nameToReturn)
|
||||||
|
? nameToReturn
|
||||||
|
: String.Format(unknown, alert.Patch.Uuid));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
62
CFUValidator/OutputDecorators/XenCenterUpdateDecorator.cs
Normal file
62
CFUValidator/OutputDecorators/XenCenterUpdateDecorator.cs
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using XenAdmin.Alerts;
|
||||||
|
|
||||||
|
namespace CFUValidator.OutputDecorators
|
||||||
|
{
|
||||||
|
class XenCenterUpdateDecorator: Decorator
|
||||||
|
{
|
||||||
|
private readonly List<XenCenterUpdateAlert> alerts;
|
||||||
|
private const string header = "XenCenter updates required:";
|
||||||
|
private const string updateNotFound = "XenCenter update could not be found";
|
||||||
|
|
||||||
|
public XenCenterUpdateDecorator(OuputComponent ouputComponent, List<XenCenterUpdateAlert> alerts)
|
||||||
|
{
|
||||||
|
SetComponent(ouputComponent);
|
||||||
|
this.alerts = alerts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder Generate()
|
||||||
|
{
|
||||||
|
StringBuilder sb = base.Generate();
|
||||||
|
sb.AppendLine(header);
|
||||||
|
foreach (XenCenterUpdateAlert alert in alerts)
|
||||||
|
{
|
||||||
|
sb.AppendLine(alert == null ? updateNotFound : alert.NewVersion.VersionAndLang);
|
||||||
|
}
|
||||||
|
return sb.AppendLine(String.Empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
63
CFUValidator/OutputDecorators/XenServerUpdateDecorator.cs
Normal file
63
CFUValidator/OutputDecorators/XenServerUpdateDecorator.cs
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using XenAdmin.Alerts;
|
||||||
|
|
||||||
|
namespace CFUValidator.OutputDecorators
|
||||||
|
{
|
||||||
|
class XenServerUpdateDecorator : Decorator
|
||||||
|
{
|
||||||
|
private readonly List<XenServerVersionAlert> alerts;
|
||||||
|
private const string header = "XenServer updates required:";
|
||||||
|
private const string updateNotFound = "XenServer update could not be found";
|
||||||
|
|
||||||
|
public XenServerUpdateDecorator(OuputComponent ouputComponent, List<XenServerVersionAlert> alerts)
|
||||||
|
{
|
||||||
|
SetComponent(ouputComponent);
|
||||||
|
this.alerts = alerts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder Generate()
|
||||||
|
{
|
||||||
|
StringBuilder sb = base.Generate();
|
||||||
|
sb.AppendLine(header);
|
||||||
|
foreach (XenServerVersionAlert alert in alerts)
|
||||||
|
{
|
||||||
|
sb.AppendLine(alert == null ? updateNotFound : alert.Version.Name);
|
||||||
|
}
|
||||||
|
return sb.AppendLine(String.Empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
88
CFUValidator/Program.cs
Normal file
88
CFUValidator/Program.cs
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using CFUValidator.CommandLineOptions;
|
||||||
|
|
||||||
|
namespace CFUValidator
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
CFUValidator cfuValidator = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CommandLineParser parser = new CommandLineParser(args, CFUCommandLineOptionManager.EmptyArguments);
|
||||||
|
parser.Parse();
|
||||||
|
|
||||||
|
CFUCommandLineOptionManager manager = new CFUCommandLineOptionManager(parser.ParsedArguments);
|
||||||
|
|
||||||
|
if(manager.IsHelpRequired || args.Length == 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine(manager.Help);
|
||||||
|
Environment.Exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
cfuValidator = new CFUValidator(manager.FileSource, manager.XmlLocation,
|
||||||
|
manager.ServerVersion, manager.InstalledHotfixes,
|
||||||
|
manager.CheckHotfixContents);
|
||||||
|
cfuValidator.StatusChanged += cfuValidator_StatusChanged;
|
||||||
|
cfuValidator.Run();
|
||||||
|
Console.WriteLine(cfuValidator.Output);
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (CFUValidationException ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine(ex.Message);
|
||||||
|
Environment.Exit(1);
|
||||||
|
}
|
||||||
|
catch(Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine("\n **** Unexpected exception occured ****: " + ex.Message);
|
||||||
|
Console.WriteLine(ex.StackTrace);
|
||||||
|
Environment.Exit(1);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (cfuValidator != null)
|
||||||
|
cfuValidator.StatusChanged -= cfuValidator_StatusChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
Environment.Exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cfuValidator_StatusChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(sender as string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
67
CFUValidator/Properties/AssemblyInfo.cs
Normal file
67
CFUValidator/Properties/AssemblyInfo.cs
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("CFUValidator")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("CFUValidator")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2013")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("1fc53fff-32d6-4775-a913-203c3410d388")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
@ -0,0 +1,81 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Xml;
|
||||||
|
using XenAdmin.Actions;
|
||||||
|
using XenAdmin.Core;
|
||||||
|
using XenAPI;
|
||||||
|
|
||||||
|
namespace CFUValidator.Updates
|
||||||
|
{
|
||||||
|
class AlternativeUrlDownloadUpdatesXmlSourceAction : DownloadUpdatesXmlAction, ICheckForUpdatesXMLSource
|
||||||
|
{
|
||||||
|
private readonly string newLocation;
|
||||||
|
|
||||||
|
public AlternativeUrlDownloadUpdatesXmlSourceAction(string url)
|
||||||
|
: base(true, true, true, "CFU", "1", url)
|
||||||
|
{
|
||||||
|
newLocation = url;
|
||||||
|
ErrorRaised = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override XmlDocument FetchCheckForUpdatesXml(string location)
|
||||||
|
{
|
||||||
|
XmlDocument xdoc;
|
||||||
|
using (Stream xmlstream = GetXmlDoc())
|
||||||
|
{
|
||||||
|
xdoc = Helpers.LoadXmlDocument(xmlstream);
|
||||||
|
}
|
||||||
|
return xdoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Stream GetXmlDoc()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
WebRequest wr = WebRequest.Create(newLocation);
|
||||||
|
return wr.GetResponse().GetResponseStream();
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
ErrorRaised = new CFUValidationException("Failed to wget the URL: " + newLocation);
|
||||||
|
throw ErrorRaised;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Exception ErrorRaised { get; private set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
48
CFUValidator/Updates/ICheckForUpdatesXMLSource.cs
Normal file
48
CFUValidator/Updates/ICheckForUpdatesXMLSource.cs
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using XenAdmin.Core;
|
||||||
|
|
||||||
|
namespace CFUValidator.Updates
|
||||||
|
{
|
||||||
|
interface ICheckForUpdatesXMLSource
|
||||||
|
{
|
||||||
|
List<XenServerPatch> XenServerPatches { get; }
|
||||||
|
List<XenServerVersion> XenServerVersions{ get; }
|
||||||
|
List<XenCenterVersion> XenCenterVersions { get; }
|
||||||
|
bool IsCompleted { get; }
|
||||||
|
void RunAsync();
|
||||||
|
int PercentComplete { get; }
|
||||||
|
Exception ErrorRaised { get; }
|
||||||
|
}
|
||||||
|
}
|
77
CFUValidator/Updates/ReadFromFileUpdatesXmlSource.cs
Normal file
77
CFUValidator/Updates/ReadFromFileUpdatesXmlSource.cs
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Xml;
|
||||||
|
using XenAdmin.Actions;
|
||||||
|
|
||||||
|
namespace CFUValidator.Updates
|
||||||
|
{
|
||||||
|
class ReadFromFileUpdatesXmlSource : DownloadUpdatesXmlAction, ICheckForUpdatesXMLSource
|
||||||
|
{
|
||||||
|
private readonly string newLocation;
|
||||||
|
public ReadFromFileUpdatesXmlSource(string location)
|
||||||
|
: base(true, true, true, "CFU", "1", location)
|
||||||
|
{
|
||||||
|
newLocation = location;
|
||||||
|
ErrorRaised = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override XmlDocument FetchCheckForUpdatesXml(string location)
|
||||||
|
{
|
||||||
|
if (!File.Exists(newLocation))
|
||||||
|
{
|
||||||
|
ErrorRaised = new CFUValidationException("File not found at: " + newLocation);
|
||||||
|
throw ErrorRaised;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
XmlDocument xdoc = new XmlDocument();
|
||||||
|
using (StreamReader sr = new StreamReader(newLocation))
|
||||||
|
{
|
||||||
|
xdoc.Load(sr);
|
||||||
|
}
|
||||||
|
return xdoc;
|
||||||
|
}
|
||||||
|
catch(Exception)
|
||||||
|
{
|
||||||
|
ErrorRaised = new CFUValidationException("Could not read/parse file: " + newLocation);
|
||||||
|
throw ErrorRaised;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Exception ErrorRaised { get; private set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
50
CFUValidator/Updates/XmlRetrieverFactory.cs
Normal file
50
CFUValidator/Updates/XmlRetrieverFactory.cs
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using CFUValidator.CommandLineOptions;
|
||||||
|
using XenAdmin.Actions;
|
||||||
|
|
||||||
|
namespace CFUValidator.Updates
|
||||||
|
{
|
||||||
|
class XmlRetrieverFactory
|
||||||
|
{
|
||||||
|
public ICheckForUpdatesXMLSource GetAction(OptionUsage usage, string location)
|
||||||
|
{
|
||||||
|
if (usage == OptionUsage.Url)
|
||||||
|
return new AlternativeUrlDownloadUpdatesXmlSourceAction(location);
|
||||||
|
if (usage == OptionUsage.File)
|
||||||
|
return new ReadFromFileUpdatesXmlSource(location);
|
||||||
|
|
||||||
|
throw new ArgumentException("No action was found for the provided usage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
74
CFUValidator/Validators/AlertFeatureValidator.cs
Normal file
74
CFUValidator/Validators/AlertFeatureValidator.cs
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using XenAdmin.Alerts;
|
||||||
|
|
||||||
|
namespace CFUValidator.Validators
|
||||||
|
{
|
||||||
|
abstract class AlertFeatureValidator
|
||||||
|
{
|
||||||
|
protected List<XenServerPatchAlert> alerts;
|
||||||
|
|
||||||
|
protected AlertFeatureValidator(List<XenServerPatchAlert> alerts)
|
||||||
|
{
|
||||||
|
this.alerts = alerts;
|
||||||
|
Results = new List<string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void Validate();
|
||||||
|
public abstract string Description { get; }
|
||||||
|
public List<string> Results { get; protected set; }
|
||||||
|
public bool ErrorsFound { get { return Results.Count > 0; } }
|
||||||
|
|
||||||
|
public delegate void StatusChangedHandler(object sender, EventArgs e);
|
||||||
|
|
||||||
|
public event StatusChangedHandler StatusChanged;
|
||||||
|
|
||||||
|
protected virtual void OnStatusChanged()
|
||||||
|
{
|
||||||
|
if (StatusChanged != null)
|
||||||
|
StatusChanged(Status, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string status;
|
||||||
|
protected string Status
|
||||||
|
{
|
||||||
|
get { return status; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
status = value;
|
||||||
|
OnStatusChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
72
CFUValidator/Validators/CorePatchDetailsValidator.cs
Normal file
72
CFUValidator/Validators/CorePatchDetailsValidator.cs
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using XenAdmin.Alerts;
|
||||||
|
|
||||||
|
namespace CFUValidator.Validators
|
||||||
|
{
|
||||||
|
class CorePatchDetailsValidator : AlertFeatureValidator
|
||||||
|
{
|
||||||
|
public CorePatchDetailsValidator(List<XenServerPatchAlert> alerts) : base(alerts){}
|
||||||
|
|
||||||
|
public override void Validate()
|
||||||
|
{
|
||||||
|
foreach (XenServerPatchAlert alert in alerts)
|
||||||
|
{
|
||||||
|
VerifyPatchDetailsMissing(alert);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void VerifyPatchDetailsMissing(XenServerPatchAlert alert)
|
||||||
|
{
|
||||||
|
if(string.IsNullOrEmpty(alert.Patch.Uuid))
|
||||||
|
Results.Add("Missing patch uuid for patch: " + alert.Patch.Name);
|
||||||
|
if(string.IsNullOrEmpty(alert.Patch.Name))
|
||||||
|
Results.Add("Missing patch name for patch with UUID: " + alert.Patch.Uuid);
|
||||||
|
if(string.IsNullOrEmpty(alert.Patch.PatchUrl))
|
||||||
|
Results.Add("Missing patch patch-url for patch with UUID: " + alert.Patch.Uuid);
|
||||||
|
if (string.IsNullOrEmpty(alert.Patch.Description))
|
||||||
|
Results.Add("Missing patch description for patch with UUID: " + alert.Patch.Uuid);
|
||||||
|
if (string.IsNullOrEmpty(alert.Patch.Url))
|
||||||
|
Results.Add("Missing patch webpage url for patch with UUID: " + alert.Patch.Uuid);
|
||||||
|
if (string.IsNullOrEmpty(alert.Patch.Guidance))
|
||||||
|
Results.Add("Missing patch guidance for patch with UUID: " + alert.Patch.Uuid);
|
||||||
|
if (string.IsNullOrEmpty(alert.Patch.TimeStamp.ToString()))
|
||||||
|
Results.Add("Missing patch timestamp for patch with UUID: " + alert.Patch.Uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string Description
|
||||||
|
{
|
||||||
|
get { return "Verify core patch details"; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
104
CFUValidator/Validators/PatchURLValidator.cs
Normal file
104
CFUValidator/Validators/PatchURLValidator.cs
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Net;
|
||||||
|
using XenAdmin.Alerts;
|
||||||
|
|
||||||
|
namespace CFUValidator.Validators
|
||||||
|
{
|
||||||
|
class PatchURLValidator : AlertFeatureValidator
|
||||||
|
{
|
||||||
|
private readonly BackgroundWorker workerThread;
|
||||||
|
public PatchURLValidator(List<XenServerPatchAlert> alerts) : base(alerts)
|
||||||
|
{
|
||||||
|
workerThread = new BackgroundWorker();
|
||||||
|
workerThread.DoWork += CheckAllPatchURLs;
|
||||||
|
workerThread.RunWorkerCompleted += RunWorkerCompletedMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool isComplete;
|
||||||
|
|
||||||
|
public override void Validate()
|
||||||
|
{
|
||||||
|
isComplete = false;
|
||||||
|
ConsoleSpinner spinner = new ConsoleSpinner();
|
||||||
|
workerThread.RunWorkerAsync();
|
||||||
|
|
||||||
|
while(!isComplete)
|
||||||
|
spinner.Turn();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RunWorkerCompletedMethod(object sender, RunWorkerCompletedEventArgs e)
|
||||||
|
{
|
||||||
|
isComplete = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CheckAllPatchURLs(object sender, DoWorkEventArgs e)
|
||||||
|
{
|
||||||
|
foreach (XenServerPatchAlert alert in alerts)
|
||||||
|
{
|
||||||
|
if(String.IsNullOrEmpty(alert.Patch.PatchUrl))
|
||||||
|
{
|
||||||
|
Results.Add(String.Format("Patch '{0}' URL is missing", alert.Patch.Name));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpWebResponse response = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
WebRequest request = WebRequest.Create(alert.Patch.PatchUrl);
|
||||||
|
request.Method = "HEAD";
|
||||||
|
response = (HttpWebResponse)request.GetResponse();
|
||||||
|
if (response == null || response.StatusCode != HttpStatusCode.OK)
|
||||||
|
Results.Add(String.Format("Patch '{0}' URL '{1}' is invalid", alert.Patch.Name, alert.Patch.PatchUrl));
|
||||||
|
}
|
||||||
|
catch(WebException ex)
|
||||||
|
{
|
||||||
|
Results.Add(String.Format("Patch '{0}' URL '{1}' failed: {2}", alert.Patch.Name, alert.Patch.PatchUrl, ex.Message));
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if(response != null)
|
||||||
|
response.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string Description
|
||||||
|
{
|
||||||
|
get { return "Checking the patch URLs return a suitable http response"; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
99
CFUValidator/Validators/ZipContentsValidator.cs
Normal file
99
CFUValidator/Validators/ZipContentsValidator.cs
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/* Copyright (c) Citrix Systems, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms,
|
||||||
|
* with or without modification, are permitted provided
|
||||||
|
* that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the
|
||||||
|
* following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using XenAdmin;
|
||||||
|
using XenAdmin.Actions;
|
||||||
|
using XenAdmin.Alerts;
|
||||||
|
using XenCenterLib.Archive;
|
||||||
|
|
||||||
|
namespace CFUValidator.Validators
|
||||||
|
{
|
||||||
|
class ZipContentsValidator : AlertFeatureValidator
|
||||||
|
{
|
||||||
|
public ZipContentsValidator(List<XenServerPatchAlert> alerts) : base(alerts){}
|
||||||
|
|
||||||
|
public override void Validate()
|
||||||
|
{
|
||||||
|
foreach (XenServerPatchAlert alert in alerts.OrderBy(a=>a.Patch.Name))
|
||||||
|
{
|
||||||
|
DownloadPatchFile(alert);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string Description
|
||||||
|
{
|
||||||
|
get { return "Downloading and checking the contents of the zip files in the patch"; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private string NewTempPath()
|
||||||
|
{
|
||||||
|
return Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DownloadPatchFile(XenServerPatchAlert patch)
|
||||||
|
{
|
||||||
|
if(string.IsNullOrEmpty(patch.Patch.PatchUrl))
|
||||||
|
{
|
||||||
|
Results.Add("Patch conatined no URL: " + patch.Patch.Name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string tempFileName = NewTempPath();
|
||||||
|
DownloadAndUnzipXenServerPatchAction action = new DownloadAndUnzipXenServerPatchAction(patch.Patch.Name,
|
||||||
|
new Uri(patch.Patch.PatchUrl),
|
||||||
|
tempFileName, false, Branding.Update, Branding.UpdateIso);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Status = "Download and unzip patch " + patch.Patch.Name;
|
||||||
|
|
||||||
|
ConsoleSpinner spinner = new ConsoleSpinner();
|
||||||
|
action.RunAsync();
|
||||||
|
while(!action.IsCompleted)
|
||||||
|
{
|
||||||
|
spinner.Turn(action.PercentComplete);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!action.Succeeded)
|
||||||
|
Results.Add("Patch download and unzip unsuccessful: " + action.Exception.Message);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Results.Add("Patch download error: " + ex.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
CFUValidator/app.config
Normal file
3
CFUValidator/app.config
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<configuration>
|
||||||
|
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/></startup></configuration>
|
12
XenAdmin.sln
12
XenAdmin.sln
@ -29,6 +29,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XenOvfApi", "XenOvfApi\XenO
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XenOvfTransport", "XenOvfTransport\XenOvfTransport.csproj", "{9F7E6285-5CBF-41B4-8CB9-AB06DFF90DC0}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XenOvfTransport", "XenOvfTransport\XenOvfTransport.csproj", "{9F7E6285-5CBF-41B4-8CB9-AB06DFF90DC0}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CFUValidator", "CFUValidator\CFUValidator.csproj", "{39308480-78C3-40B4-924D-06914F343ACD}"
|
||||||
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XenServerHealthCheck", "XenServerHealthCheck\XenServerHealthCheck.csproj", "{DEB3208D-1153-407C-8C99-0D8899BE25A5}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XenServerHealthCheck", "XenServerHealthCheck\XenServerHealthCheck.csproj", "{DEB3208D-1153-407C-8C99-0D8899BE25A5}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
@ -145,6 +147,16 @@ Global
|
|||||||
{9F7E6285-5CBF-41B4-8CB9-AB06DFF90DC0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
{9F7E6285-5CBF-41B4-8CB9-AB06DFF90DC0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
{9F7E6285-5CBF-41B4-8CB9-AB06DFF90DC0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
{9F7E6285-5CBF-41B4-8CB9-AB06DFF90DC0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
{9F7E6285-5CBF-41B4-8CB9-AB06DFF90DC0}.Release|Win32.ActiveCfg = Release|Any CPU
|
{9F7E6285-5CBF-41B4-8CB9-AB06DFF90DC0}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||||
|
{39308480-78C3-40B4-924D-06914F343ACD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{39308480-78C3-40B4-924D-06914F343ACD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{39308480-78C3-40B4-924D-06914F343ACD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{39308480-78C3-40B4-924D-06914F343ACD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{39308480-78C3-40B4-924D-06914F343ACD}.Debug|Win32.ActiveCfg = Debug|Any CPU
|
||||||
|
{39308480-78C3-40B4-924D-06914F343ACD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{39308480-78C3-40B4-924D-06914F343ACD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{39308480-78C3-40B4-924D-06914F343ACD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{39308480-78C3-40B4-924D-06914F343ACD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{39308480-78C3-40B4-924D-06914F343ACD}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||||
{DEB3208D-1153-407C-8C99-0D8899BE25A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{DEB3208D-1153-407C-8C99-0D8899BE25A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{DEB3208D-1153-407C-8C99-0D8899BE25A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{DEB3208D-1153-407C-8C99-0D8899BE25A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{DEB3208D-1153-407C-8C99-0D8899BE25A5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
{DEB3208D-1153-407C-8C99-0D8899BE25A5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
Loading…
Reference in New Issue
Block a user