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."); }
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); }
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); }
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 + "!"); }
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); }
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); }