An alternative to UBB.threads
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
FLocal/Patcher.Web/MainHandler.cs

109 lines
3.6 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.IO;
namespace Patcher.Web {
abstract public class MainHandler : IHttpHandler {
private const string ACTION_INSTALLALL = "InstallAll";
private const string ACTION_ROLLBACKLATEST = "RollbackLatest";
abstract protected PatcherInfo patcherInfo {
get;
}
abstract protected string GetAdminConnectionString(HttpContext context);
public bool IsReusable {
get { return true; }
}
private void Install(HttpContext context) {
context.Response.ContentType = "text/plain";
context.Response.Output.WriteLine("Installing...");
var updater = new Updater(new UpdateParams(this.patcherInfo.configuration, this.GetAdminConnectionString(context)), new InteractiveResponseStream(context));
int resultCode = updater.ApplyAll();
if(resultCode == 0) {
this.patcherInfo.PatchesInstalled();
context.Response.Output.WriteLine("Installed");
} else {
context.Response.Output.WriteLine("Failed to install: error code {0}", resultCode);
}
}
private void RollbackLatest(HttpContext context) {
context.Response.ContentType = "text/plain";
context.Response.Output.WriteLine("Uninstalling...");
var updater = new Updater(new UpdateParams(this.patcherInfo.configuration, this.GetAdminConnectionString(context)), new InteractiveResponseStream(context));
this.patcherInfo.DisallowMainHandler();
int resultCode = updater.RollbackLastPatch();
if(resultCode == 0) {
context.Response.Output.WriteLine("Uninstalled");
} else {
context.Response.Output.WriteLine("Failed to uninstall: error code {0}", resultCode);
}
}
private void WriteForm(TextWriter writer, string method, string methodDescription) {
writer.WriteLine("<form method=\"POST\">");
writer.WriteLine("<input type=\"password\" name=\"data\"/><br/>");
writer.WriteLine("<input type=\"hidden\" name=\"{0}\" value=\"{0}\"/>", method);
writer.WriteLine("<input type=\"submit\" value=\"{0}\"/>", methodDescription);
writer.WriteLine("</form>");
}
private void ShowInfo(HttpContext context) {
var writer = context.Response.Output;
var checker = new Checker(new CheckParams(this.patcherInfo.configuration));
{
writer.WriteLine("<h1>Patches to install</h1>");
int totalPatches = 0;
writer.WriteLine("<ol>");
foreach(var patchId in checker.GetPatchesToInstall()) {
writer.WriteLine("<li>{0}: \"{1}\"</li>", patchId.version, patchId.name);
totalPatches++;
}
writer.WriteLine("</ol>");
writer.WriteLine("<p>Total patches: {0}</p>", totalPatches);
if(totalPatches > 0) {
WriteForm(writer, ACTION_INSTALLALL, "Install all patches");
}
}
{
writer.WriteLine("<h1>Installed patches</h1>");
int totalPatches = 0;
writer.WriteLine("<ol>");
foreach(var patchId in checker.GetInstalledPatches()) {
writer.WriteLine("<li>{0}: \"{1}\"</li>", patchId.version, patchId.name);
totalPatches++;
}
writer.WriteLine("</ol>");
writer.WriteLine("<p>Total patches: {0}</p>", totalPatches);
if(totalPatches > 0) {
WriteForm(writer, ACTION_ROLLBACKLATEST, "Uninstall latest patch");
}
}
}
public void ProcessRequest(HttpContext context) {
if(context.Request.Form[ACTION_INSTALLALL] == ACTION_INSTALLALL) {
this.Install(context);
} else if(context.Request.Form[ACTION_ROLLBACKLATEST] == ACTION_ROLLBACKLATEST) {
this.RollbackLatest(context);
} else {
this.ShowInfo(context);
}
}
}
}