public static bool MatchNonPublicParamByTags(DeploymentParameter param) { foreach (string nonPublicParamTag in DeploymentParameter.NON_PUBLIC_PARAM_TAGS) { if (MatchParameterTag(param, nonPublicParamTag)) { return(true); } } // return(false); }
public static bool MatchParameterByNames(DeploymentParameter param, string[] namesMatches) { foreach (string nameMatch in namesMatches) { if (MatchParameterName(param, nameMatch)) { return(true); } } // return(false); }
public DeploymentParameter GetParameter() { DeploymentParameter parameter = new DeploymentParameter(); parameter.Name = this.Name; parameter.FriendlyName = this.FriendlyName; parameter.Description = this.Description; parameter.Value = GetParameterValue(); parameter.DefaultValue = this.DefaultValue; parameter.WellKnownTags = this.WellKnownTags; parameter.ValidationKind = this.ValidationKind; parameter.ValidationString = this.ValidationString; return(parameter); }
public static bool MatchParameterName(DeploymentParameter param, string nameMatch) { if (param == null || String.IsNullOrEmpty(nameMatch)) { return(false); } // if (String.IsNullOrEmpty(param.Name)) { return(false); } // Match parameter name return(param.Name.ToLowerInvariant() == nameMatch.ToLowerInvariant()); }
public static bool MatchParameterTag(DeploymentParameter param, string tagMatch) { if (param == null || String.IsNullOrEmpty(tagMatch)) { return(false); } // if (String.IsNullOrEmpty(param.Tags)) { return(false); } // Lookup for specific tags within the parameter return(Array.Exists <string>(param.Tags.ToLowerInvariant().Split(','), x => x.Trim() == tagMatch.ToLowerInvariant())); }
public void BindParameter(DeploymentParameter param) { // store parameter details this.Name = param.Name; this.FriendlyName = param.FriendlyName; this.Description = param.Description; this.DefaultValue = param.DefaultValue; this.wellKnownTags = param.WellKnownTags; this.validationKind = param.ValidationKind; this.validationString = param.ValidationString; // toggle controls BindControls(); }
private bool ApplyPrefixSuffixPolicy(DeploymentParameter parameter, string policyValue) { if (null != policyValue) { string prefix, suffix; ParsePolicyPrefixSuffix(policyValue, out prefix, out suffix); if (!string.IsNullOrEmpty(prefix)) { parameter.ValuePrefix = prefix; } if (!string.IsNullOrEmpty(suffix)) { parameter.ValueSuffix = suffix; } return(true); } return(false); }
private List <DeploymentParameter> GetParameters() { // get the information about selected database engine string resourceGroup = GetSelectedDatabaseResourceGroup(); DeploymentParameterWellKnownTag databaseEngine = GetSelectedDatabaseEngine(); // collect parameters List <DeploymentParameter> parameters = new List <DeploymentParameter>(); foreach (RepeaterItem item in repParams.Items) { WebApplicationGalleryParamControl paramControl = item.FindControl("param") as WebApplicationGalleryParamControl; if (paramControl != null) { // store parameter in the collection DeploymentParameter param = paramControl.GetParameter(); parameters.Add(param); // set database engine flag param.WellKnownTags &= ~databaseEngineTags; // reset all database flags param.WellKnownTags |= databaseEngine; // set seleced } } // add the information about selected resource group if (!String.IsNullOrEmpty(resourceGroup)) { parameters.Add(new DeploymentParameter() { Name = DeploymentParameter.ResourceGroupParameterName, Value = resourceGroup, WellKnownTags = databaseEngine }); } return(parameters); }
private List <DeploymentParameter> GetParameters() { List <DeploymentParameter> parameters = new List <DeploymentParameter>(); foreach (GridViewRow row in gvParams.Rows) { string name = string.Empty; DataKey key = gvParams.DataKeys[row.DataItemIndex]; if (key != null) { name = key.Value as string; } TextBox txt = row.FindControl("txtParamValue") as TextBox; if (!String.IsNullOrEmpty(name) && txt != null) { DeploymentParameter param = new DeploymentParameter(); param.Name = name; param.Value = txt.Text; parameters.Add(param); } } DeploymentParameter userName = new DeploymentParameter(); userName.Name = _DATABASE_USERNAME_PARAM; userName.Value = rblUser.SelectedValue == "New" ? databaseUser.Text : ddlUser.SelectedItem.Text; DeploymentParameter password = new DeploymentParameter(); password.Name = _DATABASE_USERNAMEPWD_PARAM; password.Value = databasePassword.Password; DeploymentParameter database = new DeploymentParameter(); database.Name = _DATABASE_NAME_PARAM; database.Value = rblDatabase.SelectedValue == "New" ? databaseName.Text : ddlDatabase.SelectedItem.Text; database.Tags = ddlDatabaseGroup.SelectedValue; if (!String.IsNullOrEmpty(userName.Name) && !String.IsNullOrEmpty(userName.Value)) { parameters.Add(userName); } if (!String.IsNullOrEmpty(password.Name) && !String.IsNullOrEmpty(password.Value)) { parameters.Add(password); } if (!String.IsNullOrEmpty(database.Name) && !String.IsNullOrEmpty(database.Value)) { parameters.Add(database); } return(parameters); }
public string InstallApplication(string productId, List <DeploymentParameter> updatedParameters) { string packageFile = GetApplicationPackagePath(productId); string applicationPath = null; if (String.IsNullOrEmpty(packageFile)) { return(null); } Log.WriteInfo("WebApp Package Path: {0}", packageFile); if (!File.Exists(packageFile)) { throw new Exception(GalleryErrors.PackageFileNotFound); } // Setup source deployment options DeploymentBaseOptions sourceOptions = new DeploymentBaseOptions(); // Add tracing capabilities sourceOptions.Trace += new EventHandler <DeploymentTraceEventArgs>(sourceOptions_Trace); sourceOptions.TraceLevel = TraceLevel.Verbose; // Setup deployment provider DeploymentProviderOptions providerOptions = new DeploymentProviderOptions(DeploymentWellKnownProvider.Package); // Set the package path location providerOptions.Path = packageFile; // Prepare the package deployment procedure using (DeploymentObject iisApplication = DeploymentManager.CreateObject(providerOptions, sourceOptions)) { // Setup destination deployment options DeploymentBaseOptions destinationOptions = new DeploymentBaseOptions(); // Add tracing capabilities destinationOptions.Trace += new EventHandler <DeploymentTraceEventArgs>(sourceOptions_Trace); destinationOptions.TraceLevel = TraceLevel.Verbose; // MSDEPLOY TEAM COMMENTS: For each parameter that was specified in the UI, set its value DeploymentParameterWellKnownTag databaseEngine = DeploymentParameterWellKnownTag.None; int i = 0; while (i < iisApplication.SyncParameters.Count) { // try to find parameter in updated parameters string name = iisApplication.SyncParameters[i].Name; DeploymentParameter updatedParameter = updatedParameters.Find(p => { return(String.Compare(p.Name, name) == 0); }); if (updatedParameter != null) { // parameter found // update its value iisApplication.SyncParameters[i].Value = updatedParameter.Value; i++; // advance to the next parameter // check for selected database engine if ((updatedParameter.WellKnownTags & DeploymentParameterWellKnownTag.MySql) == DeploymentParameterWellKnownTag.MySql) { databaseEngine = DeploymentParameterWellKnownTag.MySql; } else if ((updatedParameter.WellKnownTags & DeploymentParameterWellKnownTag.Sql) == DeploymentParameterWellKnownTag.Sql) { databaseEngine = DeploymentParameterWellKnownTag.Sql; } // get application path if ((updatedParameter.WellKnownTags & DeploymentParameterWellKnownTag.IisApp) == DeploymentParameterWellKnownTag.IisApp) { applicationPath = updatedParameter.Value; } } else { // parameter not found // delete it iisApplication.SyncParameters.Remove(name); } } // Skip SQL Server database scripts if not SQL Server was selected if (databaseEngine != DeploymentParameterWellKnownTag.Sql) { sourceOptions.SkipDirectives.Add(SkipMsSQL); } // Skip MySQL database scripts if not MySQL was selected if (databaseEngine != DeploymentParameterWellKnownTag.MySql) { sourceOptions.SkipDirectives.Add(SkipMySQL); } // Setup deployment options DeploymentSyncOptions syncOptions = new DeploymentSyncOptions(); // Add tracing capabilities //syncOptions..Action += new EventHandler<DeploymentActionEventArgs>(syncOptions_Action); // Issue a syncronization signal between the parties iisApplication.SyncTo(DeploymentWellKnownProvider.Auto, applicationPath, destinationOptions, syncOptions); // Log.WriteInfo("{0}: {1}", "Application path", applicationPath); // } // return(applicationPath); }
public List <DeploymentParameter> GetApplicationParameters(string productId) { string packageFile = GetApplicationPackagePath(productId); // if (String.IsNullOrEmpty(packageFile)) { return(null); } // List <DeploymentParameter> appParams = new List <DeploymentParameter>(); // DeploymentObject iisApplication = null; // try { iisApplication = DeploymentManager.CreateObject(DeploymentWellKnownProvider.Package, packageFile); // foreach (DeploymentSyncParameter parameter in iisApplication.SyncParameters) { DeploymentParameter p = new DeploymentParameter { Name = parameter.Name, FriendlyName = !String.IsNullOrEmpty(parameter.FriendlyName) ? parameter.FriendlyName : parameter.Name, Value = parameter.Value, DefaultValue = parameter.DefaultValue, Description = parameter.Description, ValidationKind = (DeploymentParameterValidationKind)parameter.Validation.Kind, ValidationString = parameter.Validation.ValidationString, WellKnownTags = (DeploymentParameterWellKnownTag)parameter.WellKnownTags }; // add to the list appParams.Add(p); // fix tags for parameters with hard-coded names if (wellKnownParameters.ContainsKey(p.Name)) { p.WellKnownTags |= wellKnownParameters[p.Name]; } } } catch (Exception ex) { // Log an error Log.WriteError( String.Format("Could not read deployment parameters from '{0}' package.", packageFile), ex); // throw; } finally { if (iisApplication != null) { iisApplication.Dispose(); } } // return(appParams); }
public static bool MatchNonPublicParamByNames(DeploymentParameter param) { return(MatchParameterByNames(param, DeploymentParameter.NON_PUBLIC_PARAM_NAMES)); }
public static StringResultObject Install(int packageId, string webAppId, string siteName, string virtualDir, List <DeploymentParameter> updatedParameters) { StringResultObject result = new StringResultObject(); // int dbItemResult = -1, dbUserResult = -1; WebSite webSite = default(WebSite); WebVirtualDirectory webVirtualDir = default(WebVirtualDirectory); WebVirtualDirectory iisAppNode = default(WebVirtualDirectory); // try { SecurityContext.SetThreadSupervisorPrincipal(); // TaskManager.StartTask(TASK_MANAGER_SOURCE, "INSTALL_WEB_APP"); // TaskManager.WriteParameter("Package ID", packageId); TaskManager.WriteParameter("Site Name", siteName); // WebServer webServer = GetAssociatedWebServer(packageId); // ERROR: WAG is not available if (!webServer.IsMsDeployInstalled()) { return(WAG_MODULE_NOT_AVAILABLE <StringResultObject>()); } // GalleryApplicationResult appResult = webServer.GetGalleryApplication(webAppId); #region Preparations and tracing // Trace at least Web Application Id for troubleshooting purposes if (!appResult.IsSuccess || appResult.Value == null) { TaskManager.WriteError("Could not find an application to install with ID: {0}.", webAppId); // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } // Assign web app pack title to the currently running task TaskManager.ItemName = appResult.Value.Title; // Trace additional details from the feed TraceGalleryAppPackInfo(appResult.Value); // Trace out all deployment parameters Array.ForEach <DeploymentParameter>(updatedParameters.ToArray(), p => TaskManager.WriteParameter(p.Name, p.Value)); // Check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) { TaskManager.WriteError("Account check has been failed. Status: {0};", accountCheck.ToString()); // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } // Check package int packageCheck = SecurityContext.CheckPackage(packageId, DemandPackage.IsActive); if (packageCheck < 0) { TaskManager.WriteError("Package check has been failed. Status: {0};", packageCheck.ToString()); // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } // Check web site for existence webSite = WebServerController.GetWebSite(packageId, siteName); if (webSite == null) { TaskManager.WriteError("Web site check has been failed. Status: {0};", BusinessErrorCodes.ERROR_WEB_INSTALLER_WEBSITE_NOT_EXISTS.ToString()); // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } #endregion DeploymentParametersResult appParamsResult = GetGalleryApplicationParamsInternally(packageId, webAppId); // if (!appParamsResult.IsSuccess) { foreach (string errorMessage in appParamsResult.ErrorCodes) { TaskManager.WriteError(errorMessage); } // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } List <DeploymentParameter> origParams = appParamsResult.Value; // if (Array.Exists <DeploymentParameter>(origParams.ToArray(), p => MatchParameterTag(p, DeploymentParameter.SQL_PARAM_TAG) || MatchParameterTag(p, DeploymentParameter.MYSQL_PARAM_TAG))) { // Match input parameters from the client DeploymentParameter dbNameParam = Array.Find <DeploymentParameter>(updatedParameters.ToArray(), p => MatchParameterByNames(p, DeploymentParameter.DATABASE_NAME_PARAMS) || MatchParameterTag(p, DeploymentParameter.DB_NAME_PARAM_TAG)); // DeploymentParameter dbUserParam = Array.Find <DeploymentParameter>(updatedParameters.ToArray(), p => MatchParameterByNames(p, DeploymentParameter.DATABASE_USERNAME_PARAMS) || MatchParameterTag(p, DeploymentParameter.DB_USERNAME_PARAM_TAG)); // DeploymentParameter dbUserPwParam = Array.Find <DeploymentParameter>(updatedParameters.ToArray(), p => MatchParameterByNames(p, DeploymentParameter.DATABASE_USERPWD_PARAMS) || MatchParameterTag(p, DeploymentParameter.DB_PASSWORD_PARAM_TAG)); #region Pre-conditions verification... // if (dbNameParam == null) { // TaskManager.WriteError(PARAMETER_IS_NULL_OR_EMPTY, DeploymentParameter.DATABASE_NAME_PARAM); // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } // if (String.IsNullOrEmpty(dbNameParam.Tags)) { // TaskManager.WriteError("{0} parameter tags does not contain information about the database resource group should be used", DeploymentParameter.DATABASE_NAME_PARAM); // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } // int dbServiceId = PackageController.GetPackageServiceId(packageId, dbNameParam.Tags); // if (dbServiceId <= 0) { // TaskManager.WriteError("{0} parameter tags contains wrong information about the database resource group should be used. Resource group: " + dbNameParam.Tags, DeploymentParameter.DATABASE_NAME_PARAM); // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } #endregion // DeploymentParameter dbServerParam = Array.Find <DeploymentParameter>(origParams.ToArray(), p => MatchParameterByNames(p, DeploymentParameter.DB_SERVER_PARAMS) || MatchParameterTag(p, DeploymentParameter.DB_SERVER_PARAM_TAG)); // DeploymentParameter dbAdminParam = Array.Find <DeploymentParameter>(origParams.ToArray(), p => MatchParameterByNames(p, DeploymentParameter.DB_ADMIN_PARAMS) || MatchParameterTag(p, DeploymentParameter.DB_ADMIN_USERNAME_PARAM_TAG)); // DeploymentParameter dbAdminPwParam = Array.Find <DeploymentParameter>(origParams.ToArray(), p => MatchParameterByNames(p, DeploymentParameter.DB_ADMINPWD_PARAMS) || MatchParameterTag(p, DeploymentParameter.DB_ADMIN_PASSWORD_PARAM_TAG)); #region Pre-conditions verification... // if (dbAdminParam == null) { // TaskManager.WriteError(NO_DB_PARAMETER_MATCHES_MSG, NAMES_MATCH, String.Join(", ", DeploymentParameter.DB_ADMIN_PARAMS)); // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } // if (dbServerParam == null) { // TaskManager.WriteError(NO_DB_PARAMETER_MATCHES_MSG, NAMES_MATCH, String.Join(", ", DeploymentParameter.DB_SERVER_PARAMS)); // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } // if (dbAdminPwParam == null) { // TaskManager.WriteError(NO_DB_PARAMETER_MATCHES_MSG, NAMES_MATCH, String.Join(", ", DeploymentParameter.DB_ADMINPWD_PARAMS)); // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } #endregion #region Read & substitute database server settings // StringDictionary dbSettings = ServerController.GetServiceSettingsAdmin(dbServiceId); // InternalAddress setting is common for all DB service providers dbServerParam.Value = dbSettings["InternalAddress"]; // Set database administrator login if (!String.IsNullOrEmpty(dbSettings["RootLogin"])) { dbAdminParam.Value = dbSettings["RootLogin"]; } else if (!String.IsNullOrEmpty(dbSettings["SaLogin"])) { dbAdminParam.Value = dbSettings["SaLogin"]; } else { // TaskManager.WriteError(CANNOT_SET_PARAMETER_VALUE, dbAdminParam.Name); // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } // Set database administrator password if (!String.IsNullOrEmpty(dbSettings["RootPassword"])) { dbAdminPwParam.Value = dbSettings["RootPassword"]; } else if (!String.IsNullOrEmpty(dbSettings["SaPassword"])) { dbAdminPwParam.Value = dbSettings["SaPassword"]; } else { // TaskManager.WriteError(CANNOT_SET_PARAMETER_VALUE, dbAdminPwParam.Name); // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } #endregion // updatedParameters.AddRange(new List <DeploymentParameter> { dbServerParam, dbAdminParam, dbAdminPwParam }); #region Create database and db user account if new selected // SqlDatabase db = PackageController.GetPackageItemByName(packageId, dbNameParam.Value, typeof(SqlDatabase)) as SqlDatabase; // if (db == null) { db = new SqlDatabase(); db.PackageId = packageId; db.Name = dbNameParam.Value; // dbItemResult = DatabaseServerController.AddSqlDatabase(db, dbNameParam.Tags); // if (dbItemResult < 0) { // Put specific error message into the trace log TaskManager.WriteError("Could not create {0} database. Error code: {1}.", dbNameParam.Tags, dbItemResult.ToString()); // Return generic error return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } } // SqlUser user = PackageController.GetPackageItemByName(packageId, dbUserParam.Value, typeof(SqlUser)) as SqlUser; // if (user == null) { user = new SqlUser(); user.PackageId = packageId; user.Name = dbUserParam.Value; user.Databases = new string[] { dbNameParam.Value }; user.Password = dbUserPwParam.Value; // dbUserResult = DatabaseServerController.AddSqlUser(user, dbNameParam.Tags); // if (dbUserResult < 0) { // Rollback and remove db if created if (dbItemResult > 0) { DatabaseServerController.DeleteSqlDatabase(dbItemResult); } // Put specific error message into the trace log TaskManager.WriteError("Could not create {0} user account. Error code: {1}.", dbNameParam.Tags, dbUserResult.ToString()); // Return generic error return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } } #endregion } // DeploymentParameter appPathParam = Array.Find <DeploymentParameter>(origParams.ToArray(), p => MatchParameterName(p, DeploymentParameter.APPICATION_PATH_PARAM) || MatchParameterTag(p, DeploymentParameter.IISAPP_PARAM_TAG)); // if (String.IsNullOrEmpty(virtualDir)) { appPathParam.Value = siteName; } else { appPathParam.Value = String.Format("{0}/{1}", siteName, virtualDir); } // updatedParameters.Add(appPathParam); // result = webServer.InstallGalleryApplication(webAppId, updatedParameters.ToArray()); // #region Rollback in case of failure // Rollback - remove resources have been created previously if (!result.IsSuccess) { // if (dbUserResult > 0) { DatabaseServerController.DeleteSqlUser(dbUserResult); } // if (dbItemResult > 0) { DatabaseServerController.DeleteSqlDatabase(dbItemResult); } // foreach (string errorCode in result.ErrorCodes) { TaskManager.WriteError(errorCode); } // return(result); } #endregion // Reload web site details webSite = WebServerController.GetWebSite(packageId, siteName); // Reload virtual directory defaults if (!String.IsNullOrEmpty(virtualDir)) { webVirtualDir = WebServerController.GetVirtualDirectory(webSite.Id, virtualDir); } // We are going to install application on website or virtual directory iisAppNode = (webVirtualDir != null) ? webVirtualDir : webSite; // Put correct ASP.NET version depending on a web server's version iisAppNode.AspNetInstalled = (iisAppNode.IIs7) ? "2I" : "2"; // if (MatchParticularAppDependency(appResult.Value.Dependency, SupportedAppDependencies.PHP_SCRIPTING)) { // Enable PHP 5 extensions for web site iisAppNode.PhpInstalled = "5"; // Set the correct default document for PHP apps if (iisAppNode.DefaultDocs.IndexOf("index.php", StringComparison.InvariantCultureIgnoreCase) == -1) { iisAppNode.DefaultDocs += ",index.php"; } // int docsResult = 0; // if (webVirtualDir == null) { docsResult = WebServerController.UpdateWebSite(webSite); } else { docsResult = WebServerController.UpdateVirtualDirectory(webSite.Id, webVirtualDir); } // if (docsResult < 0) { TaskManager.WriteWarning("Could not update website/virtual directory default documents with the value of index.php. Result code: {0}", docsResult.ToString()); } } // if (MatchParticularAppDependency(appResult.Value.Dependency, SupportedAppDependencies.ASPNET_SCRIPTING)) { // Set the correct default document for ASP.NET apps if (iisAppNode.DefaultDocs.IndexOf("Default.aspx", StringComparison.InvariantCultureIgnoreCase) == -1) { iisAppNode.DefaultDocs += ",Default.aspx"; } // int aspnetResult = 0; // if (webVirtualDir == null) { aspnetResult = WebServerController.UpdateWebSite(webSite); } else { aspnetResult = WebServerController.UpdateVirtualDirectory(webSite.Id, webVirtualDir); } // if (aspnetResult < 0) { TaskManager.WriteWarning("Could not set default documents/enable ASP.NET 2.0 (Integrated Mode) for website/virtual directory. Result code: {0}", aspnetResult.ToString()); } } // return(result); } catch (Exception ex) { // TaskManager.WriteError(ex); // return(WAG_INSTALL_GENERIC_MODULE_ERROR <StringResultObject>()); } finally { TaskManager.CompleteTask(); } }
public static StringResultObject Install(int packageId, string webAppId, string siteName, string virtualDir, List <DeploymentParameter> parameters) { StringResultObject result = new StringResultObject(); try { // database operation results int databaseResult = -1; int databaseUserResult = -1; // initialize task manager TaskManager.StartTask(TASK_MANAGER_SOURCE, "INSTALL_WEB_APP"); TaskManager.WriteParameter("Package ID", packageId); TaskManager.WriteParameter("Site Name", siteName); #region Check Space and Account // Check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) { return(Warning <StringResultObject>((-accountCheck).ToString())); } // Check space int packageCheck = SecurityContext.CheckPackage(packageId, DemandPackage.IsActive); if (packageCheck < 0) { return(Warning <StringResultObject>((-packageCheck).ToString())); } #endregion #region Check MS Deploy, web site and application pack // get target web server WebServer webServer = GetAssociatedWebServer(packageId); // Check if Web App Gallery is installed if (!webServer.IsMsDeployInstalled()) { return(Error <StringResultObject>(GalleryErrors.MsDeployIsNotInstalled)); } // Check web site for existence WebSite webSite = WebServerController.GetWebSite(packageId, siteName); if (webSite == null) { return(Error <StringResultObject>(GalleryErrors.WebSiteNotFound, siteName)); } // get application pack details GalleryApplicationResult app = webServer.GetGalleryApplication(webAppId); if (!app.IsSuccess) { return(Error <StringResultObject>(app, GalleryErrors.GeneralError)); } if (app.Value == null) { return(Error <StringResultObject>(GalleryErrors.WebApplicationNotFound, webAppId)); } #endregion #region Trace app details // Assign web app pack title to the currently running task TaskManager.ItemName = app.Value.Title; // Trace additional details from the feed TaskManager.WriteParameter("Title", app.Value.Title); TaskManager.WriteParameter("Version", app.Value.Version); TaskManager.WriteParameter("Download URL", app.Value.DownloadUrl); TaskManager.WriteParameter("Author", app.Value.AuthorName); TaskManager.WriteParameter("Last Updated", app.Value.LastUpdated); // Trace out all deployment parameters Array.ForEach <DeploymentParameter>(parameters.ToArray(), p => TaskManager.WriteParameter(p.Name, p.Value)); #endregion // elevate security context SecurityContext.SetThreadSupervisorPrincipal(); #region Set AppPath // set correct application path DeploymentParameter appPath = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.IisApp); if (appPath == null) { return(Error <StringResultObject>(GalleryErrors.AppPathParameterNotFound)); } appPath.Value = String.IsNullOrEmpty(virtualDir) ? siteName : String.Format("{0}/{1}", siteName, virtualDir); #endregion // database context // find database resource parameter DeploymentParameter databaseResoure = parameters.Find(p => { return(p.Name == DeploymentParameter.ResourceGroupParameterName); }); // database is required for this application if (databaseResoure != null) { // try to get database service int dbServiceId = PackageController.GetPackageServiceId(packageId, databaseResoure.Value); if (dbServiceId == 0) { return(Error <StringResultObject>(GalleryErrors.DatabaseServiceIsNotAvailable)); } #region Setup Database server and DB Admin credentials // get database service settings StringDictionary dbSettings = ServerController.GetServiceSettingsAdmin(dbServiceId); // database server DeploymentParameter databaseServer = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.DBServer); if (databaseServer != null) { databaseServer.Value = dbSettings["ExternalAddress"]; if (String.IsNullOrEmpty(databaseServer.Value)) { return(Error <StringResultObject>(GalleryErrors.DatabaseServerExternalAddressIsEmpty)); } } // database admin DeploymentParameter databaseAdminUsername = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.DBAdminUserName); if (databaseAdminUsername != null) { databaseAdminUsername.Value = dbSettings["RootLogin"]; if (String.IsNullOrEmpty(databaseAdminUsername.Value)) { databaseAdminUsername.Value = dbSettings["SaLogin"]; } // raise error if database service is in Integrated Security mode (for SQL Server) // or DB Admin username is not provided if (String.IsNullOrEmpty(databaseAdminUsername.Value)) { return(Error <StringResultObject>(GalleryErrors.DatabaseAdminUsernameNotSpecified)); } } // database admin password DeploymentParameter databaseAdminPassword = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.DBAdminPassword); if (databaseAdminPassword != null) { databaseAdminPassword.Value = dbSettings["RootPassword"]; if (String.IsNullOrEmpty(databaseAdminPassword.Value)) { databaseAdminPassword.Value = dbSettings["SaPassword"]; } // raise error if database service is in Integrated Security mode (for SQL Server) // or DB Admin password is not provided if (String.IsNullOrEmpty(databaseAdminPassword.Value)) { return(Error <StringResultObject>(GalleryErrors.DatabaseAdminPasswordNotSpecified)); } } #endregion #region Create database and db user account if new selected // create database DeploymentParameter databaseName = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.DBName); if (databaseName != null) { SqlDatabase db = PackageController.GetPackageItemByName(packageId, databaseResoure.Value, databaseName.Value, typeof(SqlDatabase)) as SqlDatabase; if (db == null) { try { db = new SqlDatabase(); db.PackageId = packageId; db.Name = databaseName.Value; // create databaseResult = DatabaseServerController.AddSqlDatabase(db, databaseResoure.Value); if (databaseResult < 0) { result.ErrorCodes.Add((-databaseResult).ToString()); return(Error <StringResultObject>(result, GalleryErrors.DatabaseCreationError)); } } catch (Exception ex) { // log exception TaskManager.WriteError(ex); // return error return(Error <StringResultObject>(GalleryErrors.DatabaseCreationException)); } } } // create database user DeploymentParameter databaseUsername = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.DBUserName); DeploymentParameter databaseUserPassword = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.DBUserPassword); if (databaseUsername != null && databaseUserPassword != null) { SqlUser user = PackageController.GetPackageItemByName(packageId, databaseResoure.Value, databaseUsername.Value, typeof(SqlUser)) as SqlUser; // if (user == null) { // create new user account try { user = new SqlUser(); user.PackageId = packageId; user.Name = databaseUsername.Value; user.Databases = (databaseName != null) ? new string[] { databaseName.Value } : new string[0]; user.Password = databaseUserPassword.Value; // create databaseUserResult = DatabaseServerController.AddSqlUser(user, databaseResoure.Value); // check results if (databaseUserResult < 0) { // Rollback and remove db if created if (databaseResult > 0) { DatabaseServerController.DeleteSqlDatabase(databaseResult); } // raise error result.ErrorCodes.Add((-databaseUserResult).ToString()); return(Error <StringResultObject>(result, GalleryErrors.DatabaseUserCreationError)); } } catch (Exception ex) { // log exception TaskManager.WriteError(ex); // return error return(Error <StringResultObject>(GalleryErrors.DatabaseUserCreationException, ex.Message)); } } else { // check existing user account DatabaseServer databaseService = DatabaseServerController.GetDatabaseServer(dbServiceId); if (!databaseService.CheckConnectivity(databaseName.Value, databaseUsername.Value, databaseUserPassword.Value)) { return(Error <StringResultObject>(GalleryErrors.DatabaseUserCannotAccessDatabase, databaseUsername.Value)); } } } #endregion // remove database resource parameter from the list // before calling "install" method parameters.Remove(databaseResoure); } // install application result = webServer.InstallGalleryApplication(webAppId, parameters.ToArray()); #region Rollback in case of failure // Rollback - remove resources have been created previously if (!result.IsSuccess) { // delete database if (databaseUserResult > 0) { DatabaseServerController.DeleteSqlUser(databaseUserResult); } // delete database user if (databaseResult > 0) { DatabaseServerController.DeleteSqlDatabase(databaseResult); } // exit with errors return(Error <StringResultObject>(result, GalleryErrors.ApplicationInstallationError)); } #endregion #region Update Web Application settings WebVirtualDirectory iisApp = null; if (String.IsNullOrEmpty(virtualDir)) { // load web site iisApp = WebServerController.GetWebSite(packageId, siteName); } else { // load virtual directory iisApp = WebServerController.GetVirtualDirectory(webSite.Id, virtualDir); } // put correct extensions if ((app.Value.WellKnownDependencies & GalleryApplicationWellKnownDependency.AspNet20) == GalleryApplicationWellKnownDependency.AspNet20) { // ASP.NET 2.0 iisApp.AspNetInstalled = (iisApp.IIs7) ? "2I" : "2"; AddDefaultDocument(iisApp, "default.aspx"); } else if ((app.Value.WellKnownDependencies & GalleryApplicationWellKnownDependency.AspNet40) == GalleryApplicationWellKnownDependency.AspNet40) { // ASP.NET 4.0 iisApp.AspNetInstalled = (iisApp.IIs7) ? "4I" : "4"; AddDefaultDocument(iisApp, "default.aspx"); } else if ((app.Value.WellKnownDependencies & GalleryApplicationWellKnownDependency.PHP) == GalleryApplicationWellKnownDependency.PHP) { // PHP 5 iisApp.PhpInstalled = "5"; AddDefaultDocument(iisApp, "index.php"); } // update web site or virtual directory int updateResult = 0; if (String.IsNullOrEmpty(virtualDir)) { // update web site updateResult = WebServerController.UpdateWebSite(iisApp as WebSite); } else { // update virtual directory updateResult = WebServerController.UpdateVirtualDirectory(webSite.Id, iisApp); } if (updateResult < 0) { TaskManager.WriteWarning("Cannot update website or virtual directory programming extensions and default documents. Result code: {0}", updateResult.ToString()); } #endregion return(result); } catch (Exception ex) { // log error TaskManager.WriteError(ex); // exit with error code return(Error <StringResultObject>(GalleryErrors.GeneralError)); } finally { TaskManager.CompleteTask(); } }
public string InstallApplication(string productId, List <DeploymentParameter> updatedValues) { string packageFile = GetApplicationPackagePath(productId); string applicationPath = null; // if (String.IsNullOrEmpty(packageFile)) { return(null); } // Log.WriteInfo("WebApp Package Path: {0}", packageFile); // if (!File.Exists(packageFile)) { throw new Exception(GalleryErrorCodes.FILE_NOT_FOUND); } // // Setup source deployment options DeploymentBaseOptions sourceOptions = new DeploymentBaseOptions(); // Add tracing capabilities sourceOptions.Trace += new EventHandler <DeploymentTraceEventArgs>(sourceOptions_Trace); sourceOptions.TraceLevel = TraceLevel.Verbose; // Setup deployment provider DeploymentProviderOptions providerOptions = new DeploymentProviderOptions(DeploymentWellKnownProvider.Package); // Set the package path location providerOptions.Path = packageFile; // Prepare the package deployment procedure using (DeploymentObject iisApplication = DeploymentManager.CreateObject(providerOptions, sourceOptions)) { // Setup destination deployment options DeploymentBaseOptions destinationOptions = new DeploymentBaseOptions(); // Add tracing capabilities destinationOptions.Trace += new EventHandler <DeploymentTraceEventArgs>(sourceOptions_Trace); destinationOptions.TraceLevel = TraceLevel.Verbose; // MSDEPLOY TEAM COMMENTS: For each parameter that was specified in the UI, set its value foreach (DeploymentParameter updatedValue in updatedValues) { DeploymentSyncParameter parameter = null; // Assert whether a parameter assigned a value Trace.Assert(!String.IsNullOrEmpty(updatedValue.Name)); if (!iisApplication.SyncParameters.TryGetValue(updatedValue.Name, out parameter)) { throw new InvalidOperationException("Could not find a parameter with the name " + updatedValue.Name); } parameter.Value = updatedValue.Value; } // Find database parameter received in updated parameters arrays DeploymentParameter dbNameParam = Array.Find <DeploymentParameter>(updatedValues.ToArray(), p => MatchParameterByNames(p, DeploymentParameter.DATABASE_NAME_PARAMS) || MatchParameterTag(p, DeploymentParameter.DB_NAME_PARAM_TAG)); // MSDEPLOY TEAM COMMENTS: There may be a bunch of hidden parameters that never got set. // set these to their default values (which will probably be calculated based on the other // parameters that were set). foreach (DeploymentSyncParameter parameter in iisApplication.SyncParameters) { // Ensure all syncronization parameters are set if (parameter.Value == null) { throw new InvalidOperationException("Parameter '" + parameter.Name + "' value was not set. This indicates an issue with the package itself. Contact your system administrator."); } // Detect application path parameter in order to return it to the client if (MatchParameterTag(parameter, DeploymentParameter.IISAPP_PARAM_TAG)) { applicationPath = parameter.Value; continue; } // if (dbNameParam == null) { continue; } // if (!MatchParameterTag(parameter, DeploymentParameter.DB_NAME_PARAM_TAG) && !MatchParameterByNames(parameter, DeploymentParameter.DATABASE_NAME_PARAMS)) { continue; } // Application supports both databases MySQL & MSSQL - one of them should be skipped if (MatchParameterTag(parameter, DeploymentParameter.MYSQL_PARAM_TAG) && MatchParameterTag(parameter, DeploymentParameter.SQL_PARAM_TAG)) { if (dbNameParam.Tags.ToLowerInvariant().StartsWith("mssql")) { sourceOptions.SkipDirectives.Add(SkipMySQL); } // Skip MySQL database scripts else if (dbNameParam.Tags.ToLowerInvariant().StartsWith("mysql")) { sourceOptions.SkipDirectives.Add(SkipMsSQL); } } } // Setup deployment options DeploymentSyncOptions syncOptions = new DeploymentSyncOptions(); // Add tracing capabilities //syncOptions..Action += new EventHandler<DeploymentActionEventArgs>(syncOptions_Action); // Issue a syncronization signal between the parties iisApplication.SyncTo(DeploymentWellKnownProvider.Auto, applicationPath, destinationOptions, syncOptions); // Log.WriteInfo("{0}: {1}", DeploymentParameter.APPICATION_PATH_PARAM, applicationPath); // } // return(applicationPath); }