Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added functionality to manage Virtual Directories #11

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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


}
}