1
0

WebAdmin is stopped properly on server shutdown / restart.

Fixes #272.
This commit is contained in:
madmaxoft 2014-02-07 12:26:41 +01:00
parent 916020d6c2
commit e165da946e
3 changed files with 55 additions and 36 deletions

View File

@ -219,17 +219,14 @@ void cRoot::Start(void)
delete m_InputThread; m_InputThread = NULL; delete m_InputThread; m_InputThread = NULL;
#endif #endif
// Deallocate stuffs // Stop the server:
if m_WebAdmin->Stop();
LOG("Shutting down server..."); LOG("Shutting down server...");
m_Server->Shutdown(); m_Server->Shutdown();
LOGD("Shutting down deadlock detector..."); LOGD("Shutting down deadlock detector...");
dd.Stop(); dd.Stop();
LOGD("Stopping world threads..."); LOGD("Stopping world threads...");
StopWorlds(); StopWorlds();
LOGD("Stopping authenticator..."); LOGD("Stopping authenticator...");
m_Authenticator.Stop(); m_Authenticator.Stop();

View File

@ -42,6 +42,7 @@ public:
cWebAdmin::cWebAdmin(void) : cWebAdmin::cWebAdmin(void) :
m_IsInitialized(false), m_IsInitialized(false),
m_IsRunning(false),
m_TemplateScript("<webadmin_template>") m_TemplateScript("<webadmin_template>")
{ {
} }
@ -52,29 +53,26 @@ cWebAdmin::cWebAdmin(void) :
cWebAdmin::~cWebAdmin() cWebAdmin::~cWebAdmin()
{ {
if (m_IsInitialized) ASSERT(!m_IsRunning); // Was the HTTP server stopped properly?
{
LOGD("Stopping WebAdmin...");
}
} }
void cWebAdmin::AddPlugin( cWebPlugin * a_Plugin ) void cWebAdmin::AddPlugin(cWebPlugin * a_Plugin)
{ {
m_Plugins.remove( a_Plugin ); m_Plugins.remove(a_Plugin);
m_Plugins.push_back( a_Plugin ); m_Plugins.push_back(a_Plugin);
} }
void cWebAdmin::RemovePlugin( cWebPlugin * a_Plugin ) void cWebAdmin::RemovePlugin(cWebPlugin * a_Plugin)
{ {
m_Plugins.remove( a_Plugin ); m_Plugins.remove(a_Plugin);
} }
@ -87,7 +85,8 @@ bool cWebAdmin::Init(void)
{ {
LOGWARN("Regenerating webadmin.ini, all settings will be reset"); LOGWARN("Regenerating webadmin.ini, all settings will be reset");
m_IniFile.AddHeaderComment(" This file controls the webadmin feature of MCServer"); m_IniFile.AddHeaderComment(" This file controls the webadmin feature of MCServer");
m_IniFile.AddHeaderComment(" Username format: [User:*username*] | Password format: Password=*password*; for example:"); m_IniFile.AddHeaderComment(" Username format: [User:*username*]");
m_IniFile.AddHeaderComment(" Password format: Password=*password*; for example:");
m_IniFile.AddHeaderComment(" [User:admin]"); m_IniFile.AddHeaderComment(" [User:admin]");
m_IniFile.AddHeaderComment(" Password=admin"); m_IniFile.AddHeaderComment(" Password=admin");
} }
@ -134,7 +133,24 @@ bool cWebAdmin::Start(void)
m_TemplateScript.Close(); m_TemplateScript.Close();
} }
return m_HTTPServer.Start(*this); m_IsRunning = m_HTTPServer.Start(*this);
return m_IsRunning;
}
void cWebAdmin::Stop(void)
{
if (!m_IsRunning)
{
return;
}
LOGD("Stopping WebAdmin...");
m_HTTPServer.Stop();
m_IsRunning = false;
} }

View File

@ -56,13 +56,13 @@ struct HTTPRequest
AString Username; AString Username;
// tolua_end // tolua_end
/// Parameters given in the URL, after the questionmark /** Parameters given in the URL, after the questionmark */
StringStringMap Params; // >> EXPORTED IN MANUALBINDINGS << StringStringMap Params; // >> EXPORTED IN MANUALBINDINGS <<
/// Parameters posted as a part of a form - either in the URL (GET method) or in the body (POST method) /** Parameters posted as a part of a form - either in the URL (GET method) or in the body (POST method) */
StringStringMap PostParams; // >> EXPORTED IN MANUALBINDINGS << StringStringMap PostParams; // >> EXPORTED IN MANUALBINDINGS <<
/// Same as PostParams /** Same as PostParams */
FormDataMap FormData; // >> EXPORTED IN MANUALBINDINGS << FormDataMap FormData; // >> EXPORTED IN MANUALBINDINGS <<
} ; // tolua_export } ; // tolua_export
@ -107,14 +107,17 @@ public:
cWebAdmin(void); cWebAdmin(void);
virtual ~cWebAdmin(); virtual ~cWebAdmin();
/// Initializes the object. Returns true if successfully initialized and ready to start /** Initializes the object. Returns true if successfully initialized and ready to start */
bool Init(void); bool Init(void);
/// Starts the HTTP server taking care of the admin. Returns true if successful /** Starts the HTTP server taking care of the admin. Returns true if successful */
bool Start(void); bool Start(void);
void AddPlugin( cWebPlugin* a_Plugin ); /** Stops the HTTP server, if it was started. */
void RemovePlugin( cWebPlugin* a_Plugin ); void Stop(void);
void AddPlugin(cWebPlugin * a_Plugin);
void RemovePlugin(cWebPlugin * a_Plugin);
// TODO: Convert this to the auto-locking callback mechanism used for looping players in worlds and such // TODO: Convert this to the auto-locking callback mechanism used for looping players in worlds and such
PluginList GetPlugins() const { return m_Plugins; } // >> EXPORTED IN MANUALBINDINGS << PluginList GetPlugins() const { return m_Plugins; } // >> EXPORTED IN MANUALBINDINGS <<
@ -123,13 +126,13 @@ public:
sWebAdminPage GetPage(const HTTPRequest & a_Request); sWebAdminPage GetPage(const HTTPRequest & a_Request);
/// Returns the contents of the default page - the list of plugins and players /** Returns the contents of the default page - the list of plugins and players */
AString GetDefaultPage(void); AString GetDefaultPage(void);
/// Returns the prefix needed for making a link point to the webadmin root from the given URL ("../../../webadmin"-style) /** Returns the prefix needed for making a link point to the webadmin root from the given URL ("../../../webadmin"-style) */
AString GetBaseURL(const AString & a_URL); AString GetBaseURL(const AString & a_URL);
/// Escapes text passed into it, so it can be embedded into html. /** Escapes text passed into it, so it can be embedded into html. */
static AString GetHTMLEscapedString(const AString & a_Input); static AString GetHTMLEscapedString(const AString & a_Input);
AString GetIPv4Ports(void) const { return m_PortsIPv4; } AString GetIPv4Ports(void) const { return m_PortsIPv4; }
@ -137,21 +140,21 @@ public:
// tolua_end // tolua_end
/// Returns the prefix needed for making a link point to the webadmin root from the given URL ("../../../webadmin"-style) /** Returns the prefix needed for making a link point to the webadmin root from the given URL ("../../../webadmin"-style) */
AString GetBaseURL(const AStringVector& a_URLSplit); AString GetBaseURL(const AStringVector& a_URLSplit);
protected: protected:
/// Common base class for request body data handlers /** Common base class for request body data handlers */
class cRequestData class cRequestData
{ {
public: public:
virtual ~cRequestData() {} // Force a virtual destructor in all descendants virtual ~cRequestData() {} // Force a virtual destructor in all descendants
/// Called when a new chunk of body data is received /** Called when a new chunk of body data is received */
virtual void OnBody(const char * a_Data, int a_Size) = 0; virtual void OnBody(const char * a_Data, int a_Size) = 0;
} ; } ;
/// The body handler for requests in the "/webadmin" and "/~webadmin" paths /** The body handler for requests in the "/webadmin" and "/~webadmin" paths */
class cWebadminRequestData : class cWebadminRequestData :
public cRequestData, public cRequestData,
public cHTTPFormParser::cCallbacks public cHTTPFormParser::cCallbacks
@ -182,10 +185,13 @@ protected:
} ; } ;
/// Set to true if Init() succeeds and the webadmin isn't to be disabled /** Set to true if Init() succeeds and the webadmin isn't to be disabled */
bool m_IsInitialized; bool m_IsInitialized;
/// The webadmin.ini file, used for the settings and allowed logins /** Set to true if Start() succeeds in starting the server, reset back to false in Stop(). */
bool m_IsRunning;
/** The webadmin.ini file, used for the settings and allowed logins */
cIniFile m_IniFile; cIniFile m_IniFile;
PluginList m_Plugins; PluginList m_Plugins;
@ -193,19 +199,19 @@ protected:
AString m_PortsIPv4; AString m_PortsIPv4;
AString m_PortsIPv6; AString m_PortsIPv6;
/// The Lua template script to provide templates: /** The Lua template script to provide templates: */
cLuaState m_TemplateScript; cLuaState m_TemplateScript;
/// The HTTP server which provides the underlying HTTP parsing, serialization and events /** The HTTP server which provides the underlying HTTP parsing, serialization and events */
cHTTPServer m_HTTPServer; cHTTPServer m_HTTPServer;
AString GetTemplate(void); AString GetTemplate(void);
/// Handles requests coming to the "/webadmin" or "/~webadmin" URLs /** Handles requests coming to the "/webadmin" or "/~webadmin" URLs */
void HandleWebadminRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Request); void HandleWebadminRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Request);
/// Handles requests for the root page /** Handles requests for the root page */
void HandleRootRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Request); void HandleRootRequest(cHTTPConnection & a_Connection, cHTTPRequest & a_Request);
// cHTTPServer::cCallbacks overrides: // cHTTPServer::cCallbacks overrides: