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" }); } } }