using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Web.Script.Serialization;
using Umbraco.Core;
using umbraco;
namespace Umbraco.Web.Install
{
///
/// An MVC controller for the installation process regarding packages
///
///
/// Currently this is used for web services however we should/could eventually migrate the whole installer to MVC as it
/// is a bit of a mess currently.
///
[UmbracoInstallAuthorize]
public class InstallPackageController : Controller
{
private readonly ApplicationContext _applicationContext;
public InstallPackageController()
: this(ApplicationContext.Current)
{
}
public InstallPackageController(ApplicationContext applicationContext)
{
_applicationContext = applicationContext;
}
private const string RepoGuid = "65194810-1f85-11dd-bd0b-0800200c9a66";
///
/// Empty action, useful for retrieving the base url for this controller
///
///
public ActionResult Index()
{
throw new NotImplementedException();
}
///
/// Connects to the repo, downloads the package and creates the manifest
///
///
///
[HttpPost]
public JsonResult DownloadPackageFiles(Guid kitGuid)
{
var repo = global::umbraco.cms.businesslogic.packager.repositories.Repository.getByGuid(RepoGuid);
if (!repo.HasConnection())
{
return Json(new {success = false, error = "cannot_connect"});
}
var installer = new global::umbraco.cms.businesslogic.packager.Installer();
var tempFile = installer.Import(repo.fetch(kitGuid.ToString()));
installer.LoadConfig(tempFile);
var pId = installer.CreateManifest(tempFile, kitGuid.ToString(), RepoGuid);
return Json(new
{
success = true,
manifestId = pId,
packageFile = tempFile,
percentage = 10,
message = "Downloading starter kit files..."
});
}
///
/// Installs the files in the package
///
///
[HttpPost]
public JsonResult InstallPackageFiles(Guid kitGuid, int manifestId, string packageFile)
{
packageFile = Server.UrlDecode(packageFile);
var installer = new global::umbraco.cms.businesslogic.packager.Installer();
installer.LoadConfig(packageFile);
installer.InstallFiles(manifestId, packageFile);
return Json(new
{
success = true,
manifestId,
packageFile,
percentage = 20,
message = "Installing starter kit files"
});
}
///
/// Ensures the app pool is restarted
///
///
[HttpPost]
public JsonResult RestartAppPool()
{
_applicationContext.RestartApplicationPool(HttpContext);
return Json(new
{
success = true,
percentage = 25,
message = "Installing starter kit files"
});
}
///
/// Checks if the app pool has completed restarted
///
///
[HttpPost]
public JsonResult CheckAppPoolRestart()
{
if (HttpContext.Application.AllKeys.Contains("AppPoolRestarting"))
{
return Json(new
{
successs = false
});
}
return Json(new
{
success = true,
percentage = 30
});
}
///
/// Installs the business logic portion of the package after app restart
///
///
[HttpPost]
public JsonResult InstallBusinessLogic(Guid kitGuid, int manifestId, string packageFile)
{
packageFile = Server.UrlDecode(packageFile);
var installer = new global::umbraco.cms.businesslogic.packager.Installer();
installer.LoadConfig(packageFile);
installer.InstallBusinessLogic(manifestId, packageFile);
return Json(new
{
success = true,
manifestId,
packageFile,
percentage = 70,
message = "Installing starter kit files"
});
}
///
/// Cleans up the package installation
///
///
[HttpPost]
public JsonResult CleanupInstallation(Guid kitGuid, int manifestId, string packageFile)
{
packageFile = Server.UrlDecode(packageFile);
var installer = new global::umbraco.cms.businesslogic.packager.Installer();
installer.LoadConfig(packageFile);
installer.InstallCleanUp(manifestId, packageFile);
library.RefreshContent();
return Json(new
{
success = true,
manifestId,
packageFile,
percentage = 100,
message = "Starter kit has been installed"
});
}
}
}