2012-06-14 09:06:06 -04:00
|
|
|
|
|
|
|
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
|
|
|
|
|
2012-09-23 18:09:57 -04:00
|
|
|
#include "WebAdmin.h"
|
|
|
|
#include "StringMap.h"
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2012-09-23 18:09:57 -04:00
|
|
|
#include "WebPlugin.h"
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2012-09-23 18:09:57 -04:00
|
|
|
#include "PluginManager.h"
|
|
|
|
#include "Plugin.h"
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2012-09-23 18:09:57 -04:00
|
|
|
#include "World.h"
|
2013-08-19 05:39:13 -04:00
|
|
|
#include "Entities/Player.h"
|
2012-09-23 18:09:57 -04:00
|
|
|
#include "Server.h"
|
|
|
|
#include "Root.h"
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
#include "HTTPServer/HTTPMessage.h"
|
|
|
|
#include "HTTPServer/HTTPConnection.h"
|
2012-06-14 09:06:06 -04:00
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
#include <psapi.h>
|
2013-09-21 13:00:01 -04:00
|
|
|
#elif defined(__linux__)
|
|
|
|
#include <fstream>
|
2013-09-21 16:39:22 -04:00
|
|
|
#elif defined(__APPLE__)
|
2013-09-21 20:21:37 -04:00
|
|
|
#include <mach/mach.h>
|
2012-06-14 09:06:06 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Helper class - appends all player names together in a HTML list
|
|
|
|
class cPlayerAccum :
|
|
|
|
public cPlayerListCallback
|
|
|
|
{
|
|
|
|
virtual bool Item(cPlayer * a_Player) override
|
|
|
|
{
|
|
|
|
m_Contents.append("<li>");
|
|
|
|
m_Contents.append(a_Player->GetName());
|
|
|
|
m_Contents.append("</li>");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
AString m_Contents;
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cWebAdmin * WebAdmin = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
cWebAdmin::cWebAdmin(void) :
|
|
|
|
m_IsInitialized(false),
|
|
|
|
m_TemplateScript("<webadmin_template>"),
|
|
|
|
m_IniFile("webadmin.ini")
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
|
|
|
WebAdmin = this;
|
|
|
|
m_Event = new cEvent();
|
|
|
|
}
|
|
|
|
|
2013-02-05 14:57:22 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-06-14 09:06:06 -04:00
|
|
|
cWebAdmin::~cWebAdmin()
|
|
|
|
{
|
2013-07-28 20:37:59 -04:00
|
|
|
|
2012-06-14 09:06:06 -04:00
|
|
|
WebAdmin = 0;
|
|
|
|
|
|
|
|
m_Event->Wait();
|
|
|
|
delete m_Event;
|
|
|
|
}
|
|
|
|
|
2013-02-05 14:57:22 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-08-22 10:22:21 -04:00
|
|
|
void cWebAdmin::AddPlugin( cWebPlugin * a_Plugin )
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
|
|
|
m_Plugins.remove( a_Plugin );
|
|
|
|
m_Plugins.push_back( a_Plugin );
|
|
|
|
}
|
|
|
|
|
2013-02-05 14:57:22 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-08-22 10:22:21 -04:00
|
|
|
void cWebAdmin::RemovePlugin( cWebPlugin * a_Plugin )
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
|
|
|
m_Plugins.remove( a_Plugin );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
bool cWebAdmin::Init(void)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-10-05 17:08:16 -04:00
|
|
|
if (!m_IniFile.ReadFile())
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-10-05 17:08:16 -04:00
|
|
|
return false;
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
AString PortsIPv4 = m_IniFile.GetValue("WebAdmin", "Port", "8080");
|
|
|
|
AString PortsIPv6 = m_IniFile.GetValue("WebAdmin", "PortsIPv6", "");
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
if (!m_HTTPServer.Initialize(PortsIPv4, PortsIPv6))
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-10-05 17:08:16 -04:00
|
|
|
return false;
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
2013-10-05 17:08:16 -04:00
|
|
|
m_IsInitialized = true;
|
|
|
|
return true;
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
bool cWebAdmin::Start(void)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-10-05 17:08:16 -04:00
|
|
|
if (!m_IsInitialized)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-10-05 17:08:16 -04:00
|
|
|
// Not initialized
|
|
|
|
return false;
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
2013-10-05 17:08:16 -04:00
|
|
|
|
2013-07-28 20:37:59 -04:00
|
|
|
// Initialize the WebAdmin template script and load the file
|
2013-08-08 10:30:02 -04:00
|
|
|
m_TemplateScript.Create();
|
|
|
|
if (!m_TemplateScript.LoadFile(FILE_IO_PREFIX "webadmin/template.lua"))
|
2013-07-28 20:37:59 -04:00
|
|
|
{
|
2013-08-08 10:30:02 -04:00
|
|
|
LOGWARN("Could not load WebAdmin template \"%s\", using default template.", FILE_IO_PREFIX "webadmin/template.lua");
|
|
|
|
m_TemplateScript.Close();
|
2013-07-28 20:37:59 -04:00
|
|
|
}
|
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
return m_HTTPServer.Start(*this);
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
AString cWebAdmin::GetTemplate()
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-10-05 17:08:16 -04:00
|
|
|
AString retVal = "";
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
char SourceFile[] = "webadmin/template.html";
|
|
|
|
|
|
|
|
cFile f;
|
|
|
|
if (!f.Open(SourceFile, cFile::fmRead))
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-10-05 17:08:16 -04:00
|
|
|
return "";
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
// copy the file into the buffer:
|
|
|
|
f.ReadRestOfFile(retVal);
|
|
|
|
|
|
|
|
return retVal;
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
void cWebAdmin::HandleWebadminRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Request)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-10-05 17:08:16 -04:00
|
|
|
if (!a_Request.HasAuth())
|
|
|
|
{
|
|
|
|
a_Connection.SendNeedAuth("MCServer WebAdmin");
|
|
|
|
return;
|
|
|
|
}
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
// Check auth:
|
|
|
|
AString UserPassword = m_IniFile.GetValue("User:" + a_Request.GetAuthUsername(), "Password", "");
|
|
|
|
if ((UserPassword == "") || (a_Request.GetAuthPassword() != UserPassword))
|
|
|
|
{
|
|
|
|
a_Connection.SendNeedAuth("MCServer WebAdmin - bad username or password");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check if the contents should be wrapped in the template:
|
|
|
|
AString URL = a_Request.GetBareURL();
|
|
|
|
ASSERT(URL.length() > 0);
|
|
|
|
bool ShouldWrapInTemplate = ((URL.length() > 1) && (URL[1] != '~'));
|
|
|
|
|
|
|
|
// Retrieve the request data:
|
|
|
|
cWebadminRequestData * Data = (cWebadminRequestData *)(a_Request.GetUserData());
|
|
|
|
if (Data == NULL)
|
|
|
|
{
|
|
|
|
a_Connection.SendStatusAndReason(500, "Bad UserData");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Wrap it all up for the Lua call:
|
|
|
|
AString Template;
|
|
|
|
HTTPTemplateRequest TemplateRequest;
|
|
|
|
TemplateRequest.Request.Username = a_Request.GetAuthUsername();
|
|
|
|
TemplateRequest.Request.Method = a_Request.GetMethod();
|
|
|
|
TemplateRequest.Request.Path = URL.substr(1);
|
|
|
|
|
|
|
|
if (Data->m_Form.Finish())
|
|
|
|
{
|
|
|
|
for (cHTTPFormParser::const_iterator itr = Data->m_Form.begin(), end = Data->m_Form.end(); itr != end; ++itr)
|
|
|
|
{
|
|
|
|
HTTPFormData HTTPfd;
|
|
|
|
HTTPfd.Value = itr->second;
|
|
|
|
HTTPfd.Type = "";
|
|
|
|
HTTPfd.Name = itr->first;
|
|
|
|
TemplateRequest.Request.FormData[itr->first] = HTTPfd;
|
|
|
|
TemplateRequest.Request.PostParams[itr->first] = itr->second;
|
|
|
|
TemplateRequest.Request.Params[itr->first] = itr->second;
|
|
|
|
} // for itr - Data->m_Form[]
|
|
|
|
}
|
|
|
|
|
|
|
|
// Try to get the template from the Lua template script
|
|
|
|
if (ShouldWrapInTemplate)
|
|
|
|
{
|
|
|
|
if (WebAdmin->m_TemplateScript.Call("ShowPage", WebAdmin, &TemplateRequest, cLuaState::Return, Template))
|
|
|
|
{
|
|
|
|
cHTTPResponse Resp;
|
|
|
|
Resp.SetContentType("text/html");
|
|
|
|
a_Connection.Send(Resp);
|
|
|
|
a_Connection.Send(Template.c_str(), Template.length());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
a_Connection.SendStatusAndReason(500, "m_TemplateScript failed");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
AString BaseURL = GetBaseURL(URL);
|
|
|
|
AString Menu;
|
|
|
|
Template = "{CONTENT}";
|
|
|
|
AString FoundPlugin;
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
for (PluginList::iterator itr = m_Plugins.begin(); itr != m_Plugins.end(); ++itr)
|
2012-06-14 09:06:06 -04:00
|
|
|
{
|
2013-10-05 17:08:16 -04:00
|
|
|
cWebPlugin * WebPlugin = *itr;
|
|
|
|
std::list< std::pair<AString, AString> > NameList = WebPlugin->GetTabNames();
|
|
|
|
for (std::list< std::pair<AString, AString> >::iterator Names = NameList.begin(); Names != NameList.end(); ++Names)
|
|
|
|
{
|
|
|
|
Menu += "<li><a href='" + BaseURL + WebPlugin->GetWebTitle().c_str() + "/" + (*Names).second + "'>" + (*Names).first + "</a></li>";
|
|
|
|
}
|
2012-06-14 09:06:06 -04:00
|
|
|
}
|
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
sWebAdminPage Page = GetPage(TemplateRequest.Request);
|
|
|
|
AString Content = Page.Content;
|
|
|
|
FoundPlugin = Page.PluginName;
|
|
|
|
if (!Page.TabName.empty())
|
|
|
|
{
|
|
|
|
FoundPlugin += " - " + Page.TabName;
|
|
|
|
}
|
2012-06-14 09:06:06 -04:00
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
if (FoundPlugin.empty()) // Default page
|
|
|
|
{
|
|
|
|
Content = GetDefaultPage();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ShouldWrapInTemplate && (URL.size() > 1))
|
|
|
|
{
|
|
|
|
Content += "\n<p><a href='" + BaseURL + "'>Go back</a></p>";
|
|
|
|
}
|
|
|
|
|
|
|
|
int MemUsageKiB = GetMemoryUsage();
|
|
|
|
if (MemUsageKiB > 0)
|
|
|
|
{
|
|
|
|
ReplaceString(Template, "{MEM}", Printf("%.02f", (double)MemUsageKiB / 1024));
|
|
|
|
ReplaceString(Template, "{MEMKIB}", Printf("%d", MemUsageKiB));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ReplaceString(Template, "{MEM}", "unknown");
|
|
|
|
ReplaceString(Template, "{MEMKIB}", "unknown");
|
|
|
|
}
|
|
|
|
ReplaceString(Template, "{USERNAME}", a_Request.GetAuthUsername());
|
|
|
|
ReplaceString(Template, "{MENU}", Menu);
|
|
|
|
ReplaceString(Template, "{PLUGIN_NAME}", FoundPlugin);
|
|
|
|
ReplaceString(Template, "{CONTENT}", Content);
|
|
|
|
ReplaceString(Template, "{TITLE}", "MCServer");
|
|
|
|
|
|
|
|
AString NumChunks;
|
|
|
|
Printf(NumChunks, "%d", cRoot::Get()->GetTotalChunkCount());
|
|
|
|
ReplaceString(Template, "{NUMCHUNKS}", NumChunks);
|
|
|
|
|
|
|
|
cHTTPResponse Resp;
|
|
|
|
Resp.SetContentType("text/html");
|
|
|
|
a_Connection.Send(Resp);
|
|
|
|
a_Connection.Send(Template.c_str(), Template.length());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cWebAdmin::HandleRootRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Request)
|
|
|
|
{
|
|
|
|
static const char LoginForm[] = \
|
|
|
|
"<h1>MCServer WebAdmin</h1>" \
|
|
|
|
"<center>" \
|
|
|
|
"<form method='get' action='webadmin/'>" \
|
|
|
|
"<input type='submit' value='Log in'>" \
|
|
|
|
"</form>" \
|
|
|
|
"</center>";
|
|
|
|
cHTTPResponse Resp;
|
|
|
|
Resp.SetContentType("text/html");
|
|
|
|
a_Connection.Send(Resp);
|
|
|
|
a_Connection.Send(LoginForm, sizeof(LoginForm) - 1);
|
|
|
|
a_Connection.FinishResponse();
|
2013-07-28 20:37:59 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
sWebAdminPage cWebAdmin::GetPage(const HTTPRequest & a_Request)
|
2013-07-28 20:37:59 -04:00
|
|
|
{
|
|
|
|
sWebAdminPage Page;
|
|
|
|
AStringVector Split = StringSplit(a_Request.Path, "/");
|
|
|
|
|
|
|
|
// Find the plugin that corresponds to the requested path
|
|
|
|
AString FoundPlugin;
|
|
|
|
if (Split.size() > 1)
|
|
|
|
{
|
|
|
|
for (PluginList::iterator itr = WebAdmin->m_Plugins.begin(); itr != WebAdmin->m_Plugins.end(); ++itr)
|
|
|
|
{
|
|
|
|
if ((*itr)->GetWebTitle() == Split[1])
|
|
|
|
{
|
|
|
|
Page.Content = (*itr)->HandleWebRequest(&a_Request);
|
|
|
|
cWebPlugin * WebPlugin = *itr;
|
|
|
|
FoundPlugin = WebPlugin->GetWebTitle();
|
|
|
|
AString TabName = WebPlugin->GetTabNameForRequest(&a_Request).first;
|
|
|
|
Page.PluginName = FoundPlugin;
|
|
|
|
Page.TabName = TabName;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return the page contents
|
|
|
|
return Page;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
AString cWebAdmin::GetDefaultPage(void)
|
|
|
|
{
|
|
|
|
AString Content;
|
|
|
|
Content += "<h4>Server Name:</h4>";
|
|
|
|
Content += "<p>" + AString( cRoot::Get()->GetServer()->GetServerID() ) + "</p>";
|
|
|
|
|
|
|
|
Content += "<h4>Plugins:</h4><ul>";
|
|
|
|
cPluginManager * PM = cPluginManager::Get();
|
|
|
|
const cPluginManager::PluginMap & List = PM->GetAllPlugins();
|
|
|
|
for (cPluginManager::PluginMap::const_iterator itr = List.begin(); itr != List.end(); ++itr)
|
|
|
|
{
|
|
|
|
if (itr->second == NULL)
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
AString VersionNum;
|
|
|
|
AppendPrintf(Content, "<li>%s V.%i</li>", itr->second->GetName().c_str(), itr->second->GetVersion());
|
|
|
|
}
|
|
|
|
Content += "</ul>";
|
|
|
|
Content += "<h4>Players:</h4><ul>";
|
|
|
|
|
|
|
|
cPlayerAccum PlayerAccum;
|
|
|
|
cWorld * World = cRoot::Get()->GetDefaultWorld(); // TODO - Create a list of worlds and players
|
|
|
|
if( World != NULL )
|
|
|
|
{
|
|
|
|
World->ForEachPlayer(PlayerAccum);
|
|
|
|
Content.append(PlayerAccum.m_Contents);
|
|
|
|
}
|
|
|
|
Content += "</ul><br>";
|
|
|
|
return Content;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-07-28 20:37:59 -04:00
|
|
|
AString cWebAdmin::GetBaseURL( const AString& a_URL )
|
|
|
|
{
|
|
|
|
return GetBaseURL(StringSplit(a_URL, "/"));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AString cWebAdmin::GetBaseURL( const AStringVector& a_URLSplit )
|
|
|
|
{
|
|
|
|
AString BaseURL = "./";
|
|
|
|
if (a_URLSplit.size() > 1)
|
|
|
|
{
|
|
|
|
for (unsigned int i = 0; i < a_URLSplit.size(); i++)
|
|
|
|
{
|
|
|
|
BaseURL += "../";
|
|
|
|
}
|
|
|
|
BaseURL += "webadmin/";
|
|
|
|
}
|
|
|
|
return BaseURL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-09-21 13:00:01 -04:00
|
|
|
int cWebAdmin::GetMemoryUsage(void)
|
2013-07-28 20:37:59 -04:00
|
|
|
{
|
2013-09-21 13:00:01 -04:00
|
|
|
#ifdef _WIN32
|
|
|
|
PROCESS_MEMORY_COUNTERS pmc;
|
|
|
|
if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)))
|
|
|
|
{
|
|
|
|
return (int)(pmc.WorkingSetSize / 1024);
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
#elif defined(__linux__)
|
|
|
|
// Code adapted from http://stackoverflow.com/questions/63166/how-to-determine-cpu-and-memory-consumption-from-inside-a-process
|
|
|
|
std::ifstream StatFile("/proc/self/status");
|
|
|
|
if (!StatFile.good())
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
while (StatFile.good())
|
|
|
|
{
|
|
|
|
AString Line;
|
|
|
|
std::getline(StatFile, Line);
|
|
|
|
if (strncmp(Line.c_str(), "VmSize:", 7) == 0)
|
|
|
|
{
|
|
|
|
int res = atoi(Line.c_str() + 8);
|
|
|
|
return (res == 0) ? -1 : res; // If parsing failed, return -1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return -1;
|
2013-09-21 16:39:22 -04:00
|
|
|
#elif defined (__APPLE__)
|
2013-09-22 03:46:23 -04:00
|
|
|
// Code adapted from http://stackoverflow.com/questions/63166/how-to-determine-cpu-and-memory-consumption-from-inside-a-process
|
2013-09-21 20:21:37 -04:00
|
|
|
struct task_basic_info t_info;
|
|
|
|
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
|
|
|
|
|
2013-09-22 03:46:23 -04:00
|
|
|
if (KERN_SUCCESS == task_info(
|
|
|
|
mach_task_self(),
|
|
|
|
TASK_BASIC_INFO,
|
|
|
|
(task_info_t)&t_info,
|
|
|
|
&t_info_count
|
|
|
|
))
|
2013-09-21 20:21:37 -04:00
|
|
|
{
|
2013-09-22 03:46:23 -04:00
|
|
|
return (int)(t_info.resident_size / 1024);
|
2013-09-21 20:21:37 -04:00
|
|
|
}
|
|
|
|
return -1;
|
2013-09-21 13:00:01 -04:00
|
|
|
#else
|
|
|
|
LOGINFO("%s: Unknown platform, cannot query memory usage", __FUNCTION__);
|
|
|
|
return -1;
|
|
|
|
#endif
|
2013-07-28 20:37:59 -04:00
|
|
|
}
|
2013-09-21 16:39:22 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-10-05 17:08:16 -04:00
|
|
|
|
|
|
|
void cWebAdmin::OnRequestBegun(cHTTPConnection & a_Connection, cHTTPRequest & a_Request)
|
|
|
|
{
|
|
|
|
const AString & URL = a_Request.GetURL();
|
|
|
|
if (
|
|
|
|
(strncmp(URL.c_str(), "/webadmin", 9) == 0) ||
|
|
|
|
(strncmp(URL.c_str(), "/~webadmin", 10) == 0)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
a_Request.SetUserData(new cWebadminRequestData(a_Request));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (URL == "/")
|
|
|
|
{
|
|
|
|
// The root needs no body handler and is fully handled in the OnRequestFinished() call
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// TODO: Handle other requests
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cWebAdmin::OnRequestBody(cHTTPConnection & a_Connection, cHTTPRequest & a_Request, const char * a_Data, int a_Size)
|
|
|
|
{
|
|
|
|
cRequestData * Data = (cRequestData *)(a_Request.GetUserData());
|
|
|
|
if (Data == NULL)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Data->OnBody(a_Data, a_Size);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cWebAdmin::OnRequestFinished(cHTTPConnection & a_Connection, cHTTPRequest & a_Request)
|
|
|
|
{
|
|
|
|
const AString & URL = a_Request.GetURL();
|
|
|
|
if (
|
|
|
|
(strncmp(URL.c_str(), "/webadmin", 9) == 0) ||
|
|
|
|
(strncmp(URL.c_str(), "/~webadmin", 10) == 0)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
HandleWebadminRequest(a_Connection, a_Request);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (URL == "/")
|
|
|
|
{
|
|
|
|
// The root needs no body handler and is fully handled in the OnRequestFinished() call
|
|
|
|
HandleRootRequest(a_Connection, a_Request);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// TODO: Handle other requests
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// cWebAdmin::cWebadminRequestData
|
|
|
|
|
|
|
|
void cWebAdmin::cWebadminRequestData::OnBody(const char * a_Data, int a_Size)
|
|
|
|
{
|
|
|
|
m_Form.Parse(a_Data, a_Size);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|