コード例 #1
0
        public static int RunTerminalCommand(string cmd, IManagerCommandLogger logger, string logTopic, string logMessage)
        {
            //Start logging session
            logger?.LogCLIBegin(logTopic, logMessage);

            //Start process
            Process p;

            if (Environment.OSVersion.Platform == PlatformID.Unix)
            {
                //Linux
                p = Process.Start(new ProcessStartInfo
                {
                    FileName  = "/bin/bash",
                    Arguments = cmd,
                    RedirectStandardOutput = true,
                    UseShellExecute        = false,
                    CreateNoWindow         = true
                });
            }
            else
            {
                //Windows
                p = Process.Start(new ProcessStartInfo
                {
                    FileName  = "cmd.exe",
                    Arguments = "/C " + cmd,
                    RedirectStandardOutput = true
                });
            }

            return(BaseRunProcess(p, logger));
        }
コード例 #2
0
        public void DestoryInstance(ManagerSession session, IManagerCommandLogger logger)
        {
            //Stop the current instance
            logger.Log("DestroyInstance", "Shutting down current instance...");
            if (StopInstance())
            {
                logger.Log("DestroyInstance", "Instance shut down gracefully.");
            }
            else
            {
                logger.Log("DestroyInstance", "Waiting for stop timed out after 10 seconds. Instance was forcefully killed.");
            }

            //Remove this from the list and remove used ports
            logger.Log("DestroyInstance", "Applying changes...");
            session.instances.Remove(this);
            foreach (int port in ports)
            {
                session.used_user_ports.Remove(port);
            }

            //Save
            session.Save();

            //Done
            logger.FinishSuccess("Successfully removed instance.");
        }
コード例 #3
0
        public ManagerSite AddSite(ManagerAddSite cmd, IManagerCommandLogger logger)
        {
            //Generate a new ID
            long id;

            while (true)
            {
                //Create
                byte[] idBytes = new byte[8];
                rand.NextBytes(idBytes);
                id = Math.Abs(BitConverter.ToInt64(idBytes));

                //Check
                if (!sites.ContainsKey(id.ToString()))
                {
                    break;
                }
            }

            //Create site data
            ManagerSite site = new ManagerSite
            {
                id            = id.ToString(),
                cert_name     = "DeltaManagedCert_" + id.ToString(),
                document_root = cmd.document_root,
                proxies       = new LibDeltaSystem.CoreNet.NetMessages.Master.Entities.NetManagerSite_Proxy[]
                {
                    new LibDeltaSystem.CoreNet.NetMessages.Master.Entities.NetManagerSite_Proxy
                    {
                        to_path   = "/",
                        from_path = cmd.proxy_root,
                        proto     = cmd.proto
                    }
                },
                site_domain = cmd.domain,
                cert_expiry = DateTime.UtcNow.AddMonths(3)
            };

            //Create+sign SSL certificate
            logger?.Log("AddSite", "Creating and signing a new SSL certificate...");
            int status = CLITool.RunCLIProcess("certbot", $"certonly -n --cert-name {site.cert_name} --standalone --preferred-challenges http -d {site.site_domain}", logger, "AddSite", "Creating and signing SSL certificate...");

            if (status != 0)
            {
                logger?.FinishFail($"Could not create SSL certificate! (Code {status})");
                return(null);
            }

            //Add
            sites.Add(site.id, site);
            Save();

            //Finish
            RefreshSites();
            logger.FinishSuccess($"Successfully added site {site.site_domain}.");

            return(site);
        }
コード例 #4
0
        public int DownloadUpdate(ManagerSession session, IManagerCommandLogger logger, string topic)
        {
            //Pull new code from GIT
            GitTool git    = new GitTool(GetGitPath(session), logger);
            int     status = git.Pull(topic, $"[{name}] Pulling updated source from Git...");

            //Loop through dependencies and update them
            foreach (var d in dependencies)
            {
                status += session.packages[d].DownloadUpdate(session, logger, topic);
            }

            return(status);
        }
コード例 #5
0
        public ManagerPackage AddPackage(ManagerAddPackage cmd, IManagerCommandLogger logger)
        {
            //Make sure the package doesn't already exist
            if (packages.ContainsKey(cmd.name))
            {
                logger.FinishFail("The package requested already exists.");
                return(null);
            }

            //Make sure all requested dependencies exist
            foreach (var d in cmd.dependencies)
            {
                if (!packages.ContainsKey(d))
                {
                    logger.FinishFail($"The requested dependency \"{d}\" does not exist.");
                    return(null);
                }
            }

            //Create package
            ManagerPackage package = new ManagerPackage
            {
                name                = cmd.name,
                project_path        = cmd.project_path,
                git_repo            = cmd.git_repo,
                exec                = cmd.exec,
                required_user_ports = cmd.required_user_ports,
                dependencies        = cmd.dependencies
            };

            //Clone GIT directory
            logger.Log("AddPackage", "Cloning source project files...");
            int status = new GitTool(package.GetGitPath(this), logger).Clone(cmd.git_repo, "AddPackage", "Cloning...");

            if (status != 0)
            {
                logger.FinishFail($"Failed to clone source project files. (Code {status}) Aborting!");
                return(null);
            }

            //Add
            packages.Add(cmd.name, package);
            Save();

            //Finish
            logger.FinishSuccess($"Successfully added package {package.name}.");

            return(package);
        }
コード例 #6
0
        public static int RunCLIProcess(string path, string args, IManagerCommandLogger logger, string logTopic, string logMessage)
        {
            //Start logging session
            logger?.LogCLIBegin(logTopic, logMessage);

            //Start process
            Process p = Process.Start(new ProcessStartInfo
            {
                FileName  = path,
                Arguments = args,
                RedirectStandardOutput = true
            });

            return(BaseRunProcess(p, logger));
        }
コード例 #7
0
        public ManagerVersion BuildUpdatedVersion(ManagerSession session, IManagerCommandLogger logger, string topic)
        {
            //Download the update
            logger.Log(topic, "Downloading new updates...");
            if (DownloadUpdate(session, logger, topic) != 0)
            {
                logger.FinishFail("Failed to download updates. Aborting!");
                return(null);
            }

            //Create new version ID
            string id = ObjectId.GenerateNewId().ToString();

            while (session.versions.ContainsKey(id))
            {
                id = ObjectId.GenerateNewId().ToString();
            }

            //Create new version
            ManagerVersion version = new ManagerVersion
            {
                id           = id,
                package_name = name,
                time         = DateTime.UtcNow
            };

            //Create output folder
            Directory.CreateDirectory(version.GetPath(session));

            //Build new version
            logger.Log(topic, "Building version from source...");
            if (CLITool.RunCLIProcess(session.dotnet_path, $"build -o {version.GetPath(session)} {GetProjectPath(session)}", logger, topic, "Building project files...") != 0)
            {
                logger.FinishFail("Failed to build project. Aborting!");
                return(null);
            }

            //Add to versions
            lock (session.versions)
                session.versions.Add(id, version);
            latest_version = version.id;
            session.Save();

            //Log
            logger.FinishSuccess($"Successfully created new version {version.id} for package {version.package_name}.");

            return(version);
        }
コード例 #8
0
        public void DeleteVersion(ManagerSession session, IManagerCommandLogger logger)
        {
            //Make sure there aren't any instances using this version
            int uses = 0;

            foreach (var i in session.instances)
            {
                if (i.version_id == id)
                {
                    uses++;
                }
            }

            //Check if failed
            if (uses != 0)
            {
                logger.FinishFail($"Can't delete version. There are {uses} other instances using this version that must be updated or removed first.");
                return;
            }

            //Remove version
            session.versions.Remove(id);

            //If the current package has this set as the latest version, clear that
            var package = GetPackage(session);

            if (package != null && package.latest_version == id)
            {
                package.latest_version = null;
            }

            //Delete directory
            Directory.Delete(GetPath(session), true);

            //Save
            session.Save();

            //Finish
            logger.FinishSuccess("Successfully removed version.");
        }
コード例 #9
0
        public void UpdateInstance(ManagerSession session, IManagerCommandLogger logger)
        {
            //Get the ID of the new version ID
            ManagerPackage package = GetPackage(session);
            string         newId   = package.latest_version;

            if (newId == null)
            {
                logger.FinishFail("There is no current version to upgrade to!");
                return;
            }
            if (version_id == package.latest_version)
            {
                logger.FinishSuccess("The version is already up to date.");
                return;
            }

            //Stop the current instance
            logger.Log("UpdateInstance", "Shutting down current instance...");
            if (StopInstance())
            {
                logger.Log("UpdateInstance", "Instance shut down gracefully.");
            }
            else
            {
                logger.Log("UpdateInstance", "Waiting for stop timed out after 10 seconds. Instance was forcefully killed.");
            }

            //Update
            logger.Log("UpdateInstance", "Applying changes and restarting instance...");
            version_id = newId;
            StartInstance(session);

            //Save
            session.Save();

            //Done
            logger.FinishSuccess("Successfully updated instance to version " + newId + "!");
        }
コード例 #10
0
        private static int BaseRunProcess(Process p, IManagerCommandLogger logger)
        {
            //Compute
            while (!p.StandardOutput.EndOfStream)
            {
                //Get line
                string line = p.StandardOutput.ReadLine();
                logger?.LogCLIOutput(line);
            }

            //Wait for end
            if (!p.HasExited)
            {
                logger?.LogCLIOutput("Output stream closed. Waiting for process to exit...");
                p.WaitForExit();
            }

            //Log
            logger?.LogCLICompletion(p.ExitCode);

            return(p.ExitCode);
        }
コード例 #11
0
        public ManagerInstance[] CreateNewInstance(ManagerPackage package, IManagerCommandLogger logger, int count = 1, bool spawn = true)
        {
            //Make sure this has a version
            if (package.latest_version == null)
            {
                logger?.FinishFail("Package has no version. Please compile a new version before continuing.");
                return(null);
            }

            //Loop through creation
            ManagerInstance[] newInstances = new ManagerInstance[count];
            for (int i = 0; i < count; i++)
            {
                //Generate a new ID
                long id;
                while (true)
                {
                    //Create
                    byte[] idBytes = new byte[8];
                    rand.NextBytes(idBytes);
                    id = Math.Abs(BitConverter.ToInt64(idBytes));

                    //Validate
                    bool exists = false;
                    foreach (var s in instances)
                    {
                        exists = exists || s.id == id;
                    }
                    if (!exists)
                    {
                        break;
                    }
                }

                //Allocate ports
                int[] ports = new int[package.required_user_ports];
                for (int p = 0; p < ports.Length; p++)
                {
                    ports[p] = ClaimNewUserPort();
                }

                //Create
                ManagerInstance instance = new ManagerInstance
                {
                    id           = id,
                    package_name = package.name,
                    ports        = ports,
                    version_id   = package.latest_version
                };
                instances.Add(instance);
                newInstances[i] = instance;

                //Spawn
                if (spawn)
                {
                    instance.StartInstance(this);
                }

                //Log
                logger?.Log("CreateNewInstance", $"Created instance {id} with version {package.latest_version}.");
            }

            //Save
            Save();

            //Log
            logger?.FinishSuccess("Created " + newInstances.Length + " instances.");
            return(newInstances);
        }
コード例 #12
0
 public GitTool(string path, IManagerCommandLogger logger)
 {
     this.path   = path;
     this.logger = logger;
 }