Skip to content

Commit

Permalink
Merge pull request #11 from Symbianx/feature-create-virtual-directories
Browse files Browse the repository at this point in the history
Added functionality to manage Virtual Directories
  • Loading branch information
SharpeRAD committed Oct 23, 2016
2 parents ed867eb + 6798965 commit a518977
Show file tree
Hide file tree
Showing 5 changed files with 338 additions and 0 deletions.
36 changes: 36 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ Cake-Build addin that extends Cake with IIS extensions
* Set server Unavailable
* Is server Healthy
* Get server State
* Create Virtual Directory
* Delete Virtual Directory
* Virtual Directory Exists



Expand Down Expand Up @@ -221,6 +224,39 @@ Task("WebFarm-Server-Unavailable")
SetServerUnavailable("remote-server-name", "Batman", "Gotham");
});

Task("VirtualDirectory-Create")
.Description("Creates a Virtual Directory")
.Does(() =>
{
AddSiteVirtualDirectory("remote-server-name", new VirtualDirectorySettings(){
PhysicalDirectory = "C:/Apps/Directory/",
SiteName = "Default Website",
ApplicationPath = "/",
Path = "/Directory"
});
});

Task("VirtualDirectory-Remove")
.Description("Removes a Virtual Directory")
.Does(() =>
{
RemoveSiteVirtualDirectory("remote-server-name", new VirtualDirectorySettings(){
SiteName = "Default Website",
ApplicationPath = "/",
Path = "/Directory"
});
});

Task("VirtualDirectory-Exists")
.Description("Checks if a Virtual Directory exists")
.Does(() =>
{
SiteVirtualDirectoryExists("remote-server-name", new VirtualDirectorySettings(){
SiteName = "Default Website",
ApplicationPath = "/",
Path = "/Directory"
});
});
RunTarget("Website-Create");
```

Expand Down
94 changes: 94 additions & 0 deletions src/IIS/Aliases/VirtualDirectoryAliases.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
using Cake.Core;
using Cake.Core.Annotations;
using Microsoft.Web.Administration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cake.IIS
{
/// <summary>
/// Contains aliases for working with IIS virtual applications.
/// </summary>
[CakeAliasCategory("IIS")]
[CakeNamespaceImport("Microsoft.Web.Administration")]
public static class VirtualDirectoryAliases
{
/// <summary>
/// Adds site virtual directory to local IIS.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="settings">The virtual directory settings.</param>
[CakeMethodAlias]
public static void AddSiteVirtualDirectory(this ICakeContext context, VirtualDirectorySettings settings)
{
context.AddSiteVirtualDirectory("", settings);
}

/// <summary>
/// Adds site virtual directory to remote IIS.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="server">The remote server name.</param>
/// <param name="settings">The virtual directory settings.</param>
[CakeMethodAlias]
public static void AddSiteVirtualDirectory(this ICakeContext context, string server, VirtualDirectorySettings settings)
{
using (ServerManager manager = BaseManager.Connect(server))
{
settings.ComputerName = server;

WebsiteManager
.Using(context.Environment, context.Log, manager)
.AddVirtualDirectory(settings);
}
}

/// <summary>
/// Removes site virtual directory from local IIS.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="settings">The virtual directory settings.</param>
[CakeMethodAlias]
public static void RemoveSiteVirtualDirectory(this ICakeContext context, VirtualDirectorySettings settings)
{
context.RemoveSiteVirtualDirectory("", settings);
}

/// <summary>
/// Removes site virtual directory from remote IIS.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="server">The remote server name.</param>
/// <param name="settings">The virtual directory settings.</param>
[CakeMethodAlias]
public static void RemoveSiteVirtualDirectory(this ICakeContext context, string server, VirtualDirectorySettings settings)
{
using (ServerManager manager = BaseManager.Connect(server))
{
WebsiteManager
.Using(context.Environment, context.Log, manager)
.RemoveVirtualDirectory(settings);
}
}

/// <summary>
/// Checks if site virtual directory exists in remote IIS.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="server">The remote server name.</param>
/// <param name="settings">The virtual directory settings.</param>
[CakeMethodAlias]
public static bool SiteVirtualDirectoryExists(this ICakeContext context, string server, VirtualDirectorySettings settings)
{
using (ServerManager manager = BaseManager.Connect(server))
{
return WebsiteManager
.Using(context.Environment, context.Log, manager)
.VirtualDirectoryExists(settings);
}
}
}
}
2 changes: 2 additions & 0 deletions src/IIS/Cake.IIS.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
<Compile Include="Aliases\ApplicationPoolAliases.cs" />
<Compile Include="Aliases\BindingAliases.cs" />
<Compile Include="Aliases\ApplicationAliases.cs" />
<Compile Include="Aliases\VirtualDirectoryAliases.cs" />
<Compile Include="Aliases\WebFarmAliases.cs" />
<Compile Include="Interfaces\IDirectorySettings.cs" />
<Compile Include="Manager\Base\BaseManager.cs" />
Expand All @@ -61,6 +62,7 @@
<Compile Include="Extensions\BindingExtensions.cs" />
<Compile Include="Bindings\HostBindingSettings.cs" />
<Compile Include="Bindings\PortBindingSettings.cs" />
<Compile Include="Settings\VirtualDirectorySettings.cs" />
<Compile Include="Settings\WebFarmSettings.cs" />
<Compile Include="Types\IdentityType.cs" />
<Compile Include="Settings\ApplicationPoolSettings.cs" />
Expand Down
166 changes: 166 additions & 0 deletions src/IIS/Manager/Base/BaseSiteManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -588,6 +588,172 @@ public bool RemoveApplication(ApplicationSettings settings)
throw new Exception("Site '" + settings.SiteName + "' does not exist.");
}
}


/// <summary>
/// Adds a virtual directory to a IIS site
/// </summary>
/// <param name="settings">The settings of the virtual directory to add</param>
/// <returns>If the virtual directory was added.</returns>
public bool AddVirtualDirectory(VirtualDirectorySettings settings)
{
if (settings == null)
{
throw new ArgumentNullException("settings");
}

if (string.IsNullOrWhiteSpace(settings.Path))
{
throw new ArgumentException("Site name cannot be null!");
}

if (string.IsNullOrWhiteSpace(settings.ApplicationPath))
{
throw new ArgumentException("Applicaiton path cannot be null!");
}


//Get Site
Site site = _Server.Sites.SingleOrDefault(p => p.Name == settings.SiteName);

if (site == null)
{
throw new Exception("Site '" + settings.SiteName + "' does not exist.");
}
//Get Application
Application app = site.Applications.SingleOrDefault(p => p.Path == settings.ApplicationPath);

if (app == null)
{
throw new Exception("Application '" + settings.ApplicationPath + "' does not exist.");
}

if(app.VirtualDirectories.Any(vd => vd.Path == settings.Path))
{
throw new Exception("Virtual Directory '" + settings.Path + "' already exists.");
}

//Get Directory
VirtualDirectory vDir = app.VirtualDirectories.CreateElement();
vDir.Path = settings.Path;
vDir.PhysicalPath = this.GetPhysicalDirectory(settings);

app.VirtualDirectories.Add(vDir);

//this.SetAuthentication("webServer", settings.SiteName, settings.ApplicationPath, settings.Authentication);
//this.SetAuthorization("webServer", settings.SiteName, settings.ApplicationPath, settings.Authorization);

_Server.CommitChanges();

return true;
}
/// <summary>
/// Removes a virtual directory from a IIS site
/// </summary>
/// <param name="settings">The settings of the virtual directory to remove</param>
/// <returns>If the virtual directory was removed.</returns>
public bool RemoveVirtualDirectory(VirtualDirectorySettings settings)
{
if (settings == null)
{
throw new ArgumentNullException("settings");
}

if (string.IsNullOrWhiteSpace(settings.SiteName))
{
throw new ArgumentException("Site name cannot be null!");
}

if (string.IsNullOrWhiteSpace(settings.ApplicationPath))
{
throw new ArgumentException("Applicaiton path cannot be null!");
}



//Get Site
Site site = _Server.Sites.SingleOrDefault(p => p.Name == settings.SiteName);

if (site != null)
{
//Get Application
Application app = site.Applications.SingleOrDefault(p => p.Path == settings.ApplicationPath);

if (app == null)
{
throw new Exception("Application '" + settings.ApplicationPath + "' does not exist.");
}
else
{

VirtualDirectory vd = app.VirtualDirectories.FirstOrDefault(p => p.Path == settings.Path);
if (vd == null)
{
throw new Exception("Virtual directory '" + settings.Path + "' does not exist.");
}
else
{
app.VirtualDirectories.Remove(vd);
_Server.CommitChanges();

return true;
}
}
}
else
{
throw new Exception("Site '" + settings.SiteName + "' does not exist.");
}
}

/// <summary>
/// Checks if a virtual directory exists in a IIS site
/// </summary>
/// <param name="settings">The settings of the virtual directory to check</param>
/// <returns>If the virtual directory exists.</returns>
public bool VirtualDirectoryExists(VirtualDirectorySettings settings)
{
if (settings == null)
{
throw new ArgumentNullException("settings");
}

if (string.IsNullOrWhiteSpace(settings.SiteName))
{
throw new ArgumentException("Site name cannot be null!");
}

if (string.IsNullOrWhiteSpace(settings.ApplicationPath))
{
throw new ArgumentException("Applicaiton path cannot be null!");
}



//Get Site
Site site = _Server.Sites.SingleOrDefault(p => p.Name == settings.SiteName);

if (site != null)
{
//Get Application
Application app = site.Applications.SingleOrDefault(p => p.Path == settings.ApplicationPath);

if (app == null)
{
throw new Exception("Application '" + settings.ApplicationPath + "' does not exist.");
}
else
{

VirtualDirectory vd = app.VirtualDirectories.FirstOrDefault(p => p.Path == settings.Path);
return vd != null;
}
}
else
{
throw new Exception("Site '" + settings.SiteName + "' does not exist.");
}
}
#endregion
}
}
40 changes: 40 additions & 0 deletions src/IIS/Settings/VirtualDirectorySettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Cake.Core.IO;

namespace Cake.IIS
{
public class VirtualDirectorySettings : IDirectorySettings
{
#region Constructor (1)
public VirtualDirectorySettings()
{

}
#endregion

#region Properties (8)

public string ComputerName { get; set; }

public DirectoryPath PhysicalDirectory { get; set; }

public DirectoryPath WorkingDirectory { get; set; }
public string SiteName { get; set; }

public string ApplicationPath { get; set; }

public string Path { get; set; }

public AuthenticationSettings Authentication { get; set; }

public AuthorizationSettings Authorization { get; set; }

#endregion


}
}

0 comments on commit a518977

Please sign in to comment.