private void CreateClient(HttpContext context) { // Get the client name from // the http request's parameters. string clientName = context.Request.Params["Client"]; // Get the source instance name from // the http request's parameters. string instanceName = context.Request.Params["Instance"]; string hostname = string.Format( ConfigurationManager.AppSettings["Hostname"], clientName ); InstanceCollection instances = new InstanceCollection( ConfigurationManager.AppSettings["InstanceRoot"] ); if (!instances.Instances.ContainsKey(instanceName)) { context.Response.Write("__ERROR__Instance does not exist on the server."); return; } Instance instance = instances.Instances[instanceName]; ClientManager clientManager = new ClientManager(Path.Combine( ConfigurationManager.AppSettings["InstanceRoot"], instanceName, "App_Data", "Clients.xml" )); clientManager.Append( clientName.ToLower(), clientName, hostname, "#6CAEE0", "#FCB040", DateTime.Today.ToString("dd-MM-yyyy"), context.Request.Params["Servers"] ); InstanceVersion version = new InstanceVersion(instance.Version); string databaseScriptsDirectory = Path.Combine( context.Request.PhysicalApplicationPath, "App_Data", "ClientCreation", version.ToString(), "DATABASE" ); while (!Directory.Exists(databaseScriptsDirectory)) { version -= 1; if (version.ToString() == "0.0.0.0") { return; } databaseScriptsDirectory = Path.Combine( context.Request.PhysicalApplicationPath, "App_Data", "ClientCreation", version.ToString(), "DATABASE" ); } string databaseRoot = ConfigurationManager.AppSettings["DatabaseRoot"]; int i = 0; foreach (string scriptFile in Directory.GetFiles(databaseScriptsDirectory)) { string script = File.ReadAllText(scriptFile); script = script.Replace("###CLIENTNAME###", clientName); script = script.Replace("###DATABASEROOT###", databaseRoot); ExecuteQuery( i == 0 ? "master" : clientName, script ); i++; } string fileSystemRoot = Path.Combine( context.Request.PhysicalApplicationPath, "App_Data", "ClientCreation", version.ToString(), "FILESYSTEM" ); foreach (string directory in Directory.GetDirectories(fileSystemRoot)) { string target = directory.Replace( fileSystemRoot, Path.Combine( ConfigurationManager.AppSettings["InstanceRoot"], instanceName )); CopyDirectory( directory, target, clientName ); } try { IISBindings iisBindings = new IISBindings(); iisBindings.AddBindings(instanceName, hostname); } catch { } string caseDataDirectory = Path.Combine( ConfigurationManager.AppSettings["CaseDataPath"], clientName ); if (!Directory.Exists(caseDataDirectory)) { Directory.CreateDirectory(caseDataDirectory); } ExecuteQuery(clientName, "INSERT INTO [Roles] (Id, CreationDate, Name, Description) " + "VALUES ({0}, {1}, {2}, {3})", Guid.Parse("00000000-0000-0000-0000-000000000000"), DateTime.Now, "Administrators", "Blueocean administrators" ); XmlDocument document = new XmlDocument(); document.Load(Path.Combine( ConfigurationManager.AppSettings["InstanceRoot"], instanceName, "App_Data", "Permissions.xml" )); foreach (XmlNode xmlNodePermission in document.SelectNodes("//Permission")) { ExecuteQuery(clientName, "INSERT INTO [RolePermissions] (Id, IdRole, Permission, CreationDate) " + "VALUES (NEWID(), {0}, {1}, {2})", Guid.Parse("00000000-0000-0000-0000-000000000000"), int.Parse(xmlNodePermission.Attributes["Id"].Value), DateTime.Now ); } }
private void DeployUpdate(HttpContext context) { context.Response.Write("<Errors>"); // Get the source instance name from // the http request's parameters. string instanceName = context.Request.Params["Instance"]; InstanceVersion toVersion = new InstanceVersion(context.Request.Params["Version"]); string instanceRoot = ConfigurationManager.AppSettings["InstanceRoot"]; InstanceCollection instances = new InstanceCollection(instanceRoot); if (!instances.Instances.ContainsKey(instanceName)) { return; } InstanceVersion version = new InstanceVersion(instances.Instances[instanceName].Version); version += 1; while (version.ToInt() <= toVersion.ToInt()) { string directory = Path.Combine( context.Request.PhysicalApplicationPath, "App_Data", "SoftwareUpdate", version.ToString() ); if (!Directory.Exists(directory)) { continue; } string fileArchive = Path.Combine( directory, "Files.zip" ); if (File.Exists(fileArchive)) { try { string tempDirectory = Path.Combine( Path.GetTempPath(), Guid.NewGuid().ToString() ); Directory.CreateDirectory(tempDirectory); System.IO.Compression.ZipFile.ExtractToDirectory( fileArchive, tempDirectory ); DeployDirectory(tempDirectory, Path.Combine( instanceRoot, instanceName ), version.ToString()); } catch (Exception ex) { context.Response.Write(string.Format( "<Error Type=\"Software\" Version=\"{1}\">{0}</Error>", ex.ToString(), version.ToString() )); } } string databaseScripts = Path.Combine( directory, "DATABASE" ); if (!Directory.Exists(databaseScripts)) { version += 1; continue; } Client[] clients = instances.Instances[instanceName].GetClients(); foreach (Client client in clients) { foreach (string script in Directory.GetFiles(databaseScripts)) { try { ExecuteQuery(client.Database, File.ReadAllText(script)); } catch (Exception ex) { context.Response.Write(string.Format( "<Error Type=\"Database\" Version=\"{1}\" Client=\"{2}\">{0}</Error>", ex.ToString(), version.ToString(), client.Name )); } } } version += 1; } context.Response.Write("</Errors>"); }
private void DeployUpdateAsynch(object _parameters) { object[] paramters = (object[])_parameters; Instance instance = (Instance)paramters[0]; HttpSessionState session = (HttpSessionState)paramters[1]; InstanceVersion version = new InstanceVersion((string)paramters[2]); string physicalApplicationPath = (string)paramters[3]; StringBuilder result = new StringBuilder(); result.Append("<Servers>"); int step = 0; foreach (string server in instance.Servers) { session["DeploymentStep"] = step++; // Take the server offline for the deployment. instance.Owner.Servers.Items[server].State = ServerState.Offline; instance.Owner.Servers.Save(); session["DeploymentStep"] = step++; ServiceLink service = new ServiceLink(string.Format( "http://{0}:8080/Handler.ashx", server )); string xmlString = service.Request(new string[] { "Method=DeployUpdate", "Instance=" + instance.Name, "Version=" + version.ToString() }); result.Append(string.Format( "<Server IP=\"{0}\">{1}</Server>", server, xmlString )); session["DeploymentStep"] = step++; // Bring the server online. instance.Owner.Servers.Items[server].State = ServerState.Online; instance.Owner.Servers.Save(); } result.Append("</Servers>"); string fileName = Path.Combine( physicalApplicationPath, "Logs", "Deployment_" + DateTime.Now.ToString("yyyyMMddHHmmss") ); File.WriteAllText( fileName, result.ToString() ); session["DeploymentResult"] = fileName; session["DeploymentStep"] = null; }