public override HttpHandlerResult Get() { var sessionId = GetQuery("session"); try { if (!PhotonServer.Instance.Sessions.TryGet(sessionId, out var session)) { return(Response.BadRequest().SetText($"Server Session '{sessionId}' was not found!")); } if (!(session is ServerUpdateSession updateSession)) { throw new Exception($"Session '{sessionId}' is not a valid update session!"); } // TODO: Get something from session? var responseMessage = new HttpAgentUpdateResultResponse(); return(Response.Json(responseMessage)); } catch (Exception error) { return(Response.Exception(error)); } }
public async Task Run(CommandContext context) { var server = context.Servers.Get(ServerName); ConsoleEx.Out.WriteLine("Retrieving latest agent version...", ConsoleColor.DarkCyan); var agentIndex = await DownloadTools.GetLatestAgentIndex(); var latestVersion = agentIndex.Version; ConsoleEx.Out .Write("Found Latest Version ", ConsoleColor.DarkCyan) .WriteLine(latestVersion, ConsoleColor.Cyan) .WriteLine("Checking agent versions...", ConsoleColor.DarkCyan); HttpAgentVersionListResponse agentVersionResponse = null; await AuthRetryAsync(async() => { agentVersionResponse = await WebClient(server, async client => { var json = (await client.DownloadStringTaskAsync("api/agent/versions")).Trim(); return(JsonConvert.DeserializeObject <HttpAgentVersionListResponse>(json)); }); }); var updateAgents = new List <string>(); foreach (var agentVersion in agentVersionResponse.VersionList.OrderBy(x => x.AgentName)) { if (!string.IsNullOrEmpty(agentVersion.Exception)) { ConsoleEx.Out.Write("Failed to get version of agent ", ConsoleColor.DarkYellow) .Write(agentVersion.AgentName, ConsoleColor.Yellow) .WriteLine($"! {agentVersion.Exception}", ConsoleColor.DarkYellow); continue; } if (!VersionTools.HasUpdates(agentVersion.AgentVersion, latestVersion)) { ConsoleEx.Out.Write("Agent ", ConsoleColor.DarkBlue) .Write(agentVersion.AgentName, ConsoleColor.Blue) .WriteLine(" is up-to-date.", ConsoleColor.DarkBlue); continue; } ConsoleEx.Out.Write("Updating ", ConsoleColor.DarkCyan) .Write(agentVersion.AgentName, ConsoleColor.Cyan) .Write(" from version ", ConsoleColor.DarkCyan) .Write(agentVersion.AgentVersion, ConsoleColor.Cyan) .WriteLine(".", ConsoleColor.DarkCyan); updateAgents.Add(agentVersion.AgentId); } if (!updateAgents.Any()) { ConsoleEx.Out.WriteLine("All agents are up-to-date.", ConsoleColor.DarkGreen); return; } // Download update msi ConsoleEx.Out.Write("Downloading Agent update ", ConsoleColor.DarkCyan) .Write(agentIndex.Version, ConsoleColor.Cyan) .WriteLine("...", ConsoleColor.DarkCyan); var url = NetPath.Combine(Configuration.DownloadUrl, "agent", agentIndex.Version, agentIndex.MsiFilename); var updateDirectory = Path.Combine(Configuration.Directory, "Updates"); var updateFilename = Path.Combine(updateDirectory, "Photon.Agent.msi"); PathEx.CreatePath(updateDirectory); using (var client = new WebClient()) { await client.DownloadFileTaskAsync(url, updateFilename); } ConsoleEx.Out.WriteLine("Download Complete.", ConsoleColor.DarkBlue); // Perform updates var agentIdList = updateAgents.ToArray(); var startResult = await StartSession(server, agentIdList, updateFilename); var sessionId = startResult?.SessionId; if (string.IsNullOrEmpty(sessionId)) { throw new ApplicationException($"An invalid session-id was returned! [{sessionId}]"); } var position = 0; while (true) { var data = await UpdateOutput(server, sessionId, position); if (data == null) { throw new ApplicationException("An empty session-output response was returned!"); } if (data.IsComplete) { break; } if (!data.IsModified) { await Task.Delay(PollIntervalMs); continue; } position = data.NewLength; ConsoleEx.Out.WriteLine(data.NewText, ConsoleColor.Gray); } Result = await GetResult(server, sessionId); ConsoleEx.Out.WriteLine("Update completed successfully.", ConsoleColor.DarkGreen); }