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>");
        }
Beispiel #3
0
        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;
        }