public ActionResult Index(InstallModel model) { if (DataSettingsHelper.DatabaseIsInstalled()) return RedirectToRoute("HomePage"); //set page timeout to 5 minutes this.Server.ScriptTimeout = 300; if (model.SqlServerConnectionString != null) model.SqlServerConnectionString = model.SqlServerConnectionString.Trim(); if (model.MySqlConnectionString != null) model.MySqlConnectionString = model.MySqlConnectionString.Trim(); //prepare language list foreach (var lang in _locService.GetAvailableLanguages()) { model.AvailableLanguages.Add(new SelectListItem { Value = Url.Action("ChangeLanguage", "Install", new { language = lang.Code }), Text = lang.Name, Selected = _locService.GetCurrentLanguage().Code == lang.Code, }); } model.DisableSqlCompact = !String.IsNullOrEmpty(ConfigurationManager.AppSettings["UseFastInstallationService"]) && Convert.ToBoolean(ConfigurationManager.AppSettings["UseFastInstallationService"]); model.DisableSampleDataOption = !String.IsNullOrEmpty(ConfigurationManager.AppSettings["DisableSampleDataDuringInstallation"]) && Convert.ToBoolean(ConfigurationManager.AppSettings["DisableSampleDataDuringInstallation"]); if (model.DataProvider.Equals("sqlserver", StringComparison.InvariantCultureIgnoreCase)) { //raw connection string if (string.IsNullOrEmpty(model.SqlServerConnectionString)) ModelState.AddModelError("", _locService.GetResource("ConnectionStringRequired")); else { try { //try to create connection string new SqlConnectionStringBuilder(model.SqlServerConnectionString); } catch { ModelState.AddModelError("", _locService.GetResource("ConnectionStringWrongFormat")); } } } if (model.DataProvider.Equals("mysql", StringComparison.InvariantCultureIgnoreCase)) { //raw connection string if (string.IsNullOrEmpty(model.MySqlConnectionString)) ModelState.AddModelError("", _locService.GetResource("ConnectionStringRequired")); else { try { //try to create connection string new MySqlConnectionStringBuilder(model.MySqlConnectionString); } catch { ModelState.AddModelError("", _locService.GetResource("ConnectionStringWrongFormat")); } } } //Consider granting access rights to the resource to the ASP.NET request identity. //ASP.NET has a base process identity //(typically {MACHINE}\ASPNET on IIS 5 or Network Service on IIS 6 and IIS 7, //and the configured application pool identity on IIS 7.5) that is used if the application is not impersonating. //If the application is impersonating via <identity impersonate="true"/>, //the identity will be the anonymous user (typically IUSR_MACHINENAME) or the authenticated request user. var webHelper = EngineContext.Current.Resolve<IWebHelper>(); //validate permissions var dirsToCheck = FilePermissionHelper.GetDirectoriesWrite(webHelper); foreach (string dir in dirsToCheck) if (!FilePermissionHelper.CheckPermissions(dir, false, true, true, false)) ModelState.AddModelError("", string.Format(_locService.GetResource("ConfigureDirectoryPermissions"), WindowsIdentity.GetCurrent().Name, dir)); var filesToCheck = FilePermissionHelper.GetFilesWrite(webHelper); foreach (string file in filesToCheck) if (!FilePermissionHelper.CheckPermissions(file, false, true, true, true)) ModelState.AddModelError("", string.Format(_locService.GetResource("ConfigureFilePermissions"), WindowsIdentity.GetCurrent().Name, file)); if (ModelState.IsValid) { var settingsManager = new DataSettingsManager(); try { string connectionString; if (model.DataProvider.Equals("sqlserver", StringComparison.InvariantCultureIgnoreCase)) { //SQL Server //we know that MARS option is required when using Entity Framework //let's ensure that it's specified var sqlCsb = new SqlConnectionStringBuilder(model.SqlServerConnectionString); if (this.UseMars) { sqlCsb.MultipleActiveResultSets = true; } connectionString = sqlCsb.ToString(); if (model.SqlServerCreateDatabase) { if (!SqlServerDatabaseExists(connectionString)) { //create database var collation = model.UseCustomCollation ? model.Collation : ""; var errorCreatingDatabase = CreateDatabase(connectionString, collation); if (!String.IsNullOrEmpty(errorCreatingDatabase)) throw new Exception(errorCreatingDatabase); //Database cannot be created sometimes. Weird! Seems to be Entity Framework issue //that's just wait 3 seconds Thread.Sleep(3000); } } else { //check whether database exists if (!SqlServerDatabaseExists(connectionString)) throw new Exception(_locService.GetResource("DatabaseNotExists")); } } else if (model.DataProvider.Equals("mysql", StringComparison.InvariantCultureIgnoreCase)) { //SQL Server //we know that MARS option is required when using Entity Framework //let's ensure that it's specified var sqlCsb = new MySqlConnectionStringBuilder(model.MySqlConnectionString); if (this.UseMars) { sqlCsb.AllowUserVariables = true; } connectionString = sqlCsb.ToString(); if (model.MySqlCreateDatabase) { if (!mySqlDatabaseExists(connectionString)) { //create database var errorCreatingDatabase = CreateDatabase(connectionString, ""); if (!String.IsNullOrEmpty(errorCreatingDatabase)) throw new Exception(errorCreatingDatabase); //Database cannot be created sometimes. Weird! Seems to be Entity Framework issue //that's just wait 3 seconds Thread.Sleep(3000); } } else { //check whether database exists if (!mySqlDatabaseExists(connectionString)) throw new Exception(_locService.GetResource("DatabaseNotExists")); } } else { //SQL CE string databaseFileName = "Nut.Db.sdf"; string databasePath = @"|DataDirectory|\" + databaseFileName; connectionString = "Data Source=" + databasePath + ";Persist Security Info=False"; //drop database if exists string databaseFullPath = HostingEnvironment.MapPath("~/App_Data/") + databaseFileName; if (System.IO.File.Exists(databaseFullPath)) { System.IO.File.Delete(databaseFullPath); } } //save settings var dataProvider = model.DataProvider; var settings = new DataSettings { DataProvider = dataProvider, DataConnectionString = connectionString }; settingsManager.SaveSettings(settings); //init data provider var dataProviderInstance = EngineContext.Current.Resolve<BaseDataProviderManager>().LoadDataProvider(); dataProviderInstance.InitDatabase(); //now resolve installation service var installationService = EngineContext.Current.Resolve<IInstallationService>(); installationService.InstallData(model.AdminUsername, model.AdminPassword, model.InstallSampleData); //reset cache DataSettingsHelper.ResetCache(); //install plugins PluginManager.MarkAllPluginsAsUninstalled(); var pluginFinder = EngineContext.Current.Resolve<IPluginFinder>(); var plugins = pluginFinder.GetPlugins<IPlugin>(LoadPluginsMode.All) .ToList() .OrderBy(x => x.PluginDescriptor.Group) .ThenBy(x => x.PluginDescriptor.DisplayOrder) .ToList(); var pluginsIgnoredDuringInstallation = String.IsNullOrEmpty(ConfigurationManager.AppSettings["PluginsIgnoredDuringInstallation"]) ? new List<string>() : ConfigurationManager.AppSettings["PluginsIgnoredDuringInstallation"] .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(x => x.Trim()) .ToList(); foreach (var plugin in plugins) { if (pluginsIgnoredDuringInstallation.Contains(plugin.PluginDescriptor.SystemName)) continue; plugin.Install(); } //register default permissions //var permissionProviders = EngineContext.Current.Resolve<ITypeFinder>().FindClassesOfType<IPermissionProvider>(); var permissionProviders = new List<Type>(); permissionProviders.Add(typeof(StandardPermissionProvider)); foreach (var providerType in permissionProviders) { dynamic provider = Activator.CreateInstance(providerType); EngineContext.Current.Resolve<IPermissionService>().InstallPermissions(provider); } //restart application webHelper.RestartAppDomain(); //Redirect to home page return RedirectToRoute("HomePage"); } catch (Exception exception) { //reset cache DataSettingsHelper.ResetCache(); //clear provider settings if something got wrong settingsManager.SaveSettings(new DataSettings { DataProvider = null, DataConnectionString = null }); ModelState.AddModelError("", string.Format(_locService.GetResource("SetupFailed"), exception.Message)); } } return View(model); }
public ActionResult Index() { if (DataSettingsHelper.DatabaseIsInstalled()) return RedirectToRoute("HomePage"); //set page timeout to 5 minutes this.Server.ScriptTimeout = 300; var model = new InstallModel { AdminUsername = "******", InstallSampleData = false, DataProvider = "sqlserver", SqlServerConnectionString = "", SqlServerCreateDatabase = false, UseCustomCollation = false, Collation = "SQL_Latin1_General_CP1_CI_AS", MySqlConnectionString = "", MySqlCreateDatabase = false, //fast installation service does not support SQL compact DisableSqlCompact = !String.IsNullOrEmpty(ConfigurationManager.AppSettings["UseFastInstallationService"]) && Convert.ToBoolean(ConfigurationManager.AppSettings["UseFastInstallationService"]), DisableSampleDataOption = !String.IsNullOrEmpty(ConfigurationManager.AppSettings["DisableSampleDataDuringInstallation"]) && Convert.ToBoolean(ConfigurationManager.AppSettings["DisableSampleDataDuringInstallation"]), }; foreach (var lang in _locService.GetAvailableLanguages()) { model.AvailableLanguages.Add(new SelectListItem { Value = Url.Action("ChangeLanguage", "Install", new { language = lang.Code }), Text = lang.Name, Selected = _locService.GetCurrentLanguage().Code == lang.Code, }); } return View(model); }