Original project changes: Config restore: shutdown SSH RSAKeyGen as necessary, fixes issue
This commit is contained in:
parent
54edebfb5b
commit
1bbb754ff7
|
@ -158,6 +158,7 @@ OvmsSSH::OvmsSSH()
|
||||||
using std::placeholders::_2;
|
using std::placeholders::_2;
|
||||||
MyEvents.RegisterEvent(tag,"network.mgr.init", std::bind(&OvmsSSH::NetManInit, this, _1, _2));
|
MyEvents.RegisterEvent(tag,"network.mgr.init", std::bind(&OvmsSSH::NetManInit, this, _1, _2));
|
||||||
MyEvents.RegisterEvent(tag,"network.mgr.stop", std::bind(&OvmsSSH::NetManStop, this, _1, _2));
|
MyEvents.RegisterEvent(tag,"network.mgr.stop", std::bind(&OvmsSSH::NetManStop, this, _1, _2));
|
||||||
|
MyEvents.RegisterEvent(tag,"config.restore", std::bind(&OvmsSSH::ConfigRestore, this, _1, _2));
|
||||||
MyConfig.RegisterParam("ssh.server", "SSH server private key store", true, false);
|
MyConfig.RegisterParam("ssh.server", "SSH server private key store", true, false);
|
||||||
MyConfig.RegisterParam("ssh.info", "SSH server information", false, true);
|
MyConfig.RegisterParam("ssh.info", "SSH server information", false, true);
|
||||||
MyConfig.RegisterParam("ssh.keys", "SSH public key store", true, true);
|
MyConfig.RegisterParam("ssh.keys", "SSH public key store", true, true);
|
||||||
|
@ -232,6 +233,14 @@ void OvmsSSH::NetManStop(std::string event, void* data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OvmsSSH::ConfigRestore(std::string event, void* data)
|
||||||
|
{
|
||||||
|
if (RSAKeyGenerator::KillInstance())
|
||||||
|
{
|
||||||
|
ESP_LOGW(tag, "RSAKeyGenerator killed by request");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int OvmsSSH::Authenticate(uint8_t type, WS_UserAuthData* data, void* ctx)
|
int OvmsSSH::Authenticate(uint8_t type, WS_UserAuthData* data, void* ctx)
|
||||||
{
|
{
|
||||||
ConsoleSSH* cons = (ConsoleSSH*)ctx;
|
ConsoleSSH* cons = (ConsoleSSH*)ctx;
|
||||||
|
@ -1058,11 +1067,26 @@ int SendCallback(WOLFSSH* ssh, void* data, uint32_t size, void* ctx)
|
||||||
// Class RSAKeyGenerator
|
// Class RSAKeyGenerator
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
RSAKeyGenerator* RSAKeyGenerator::s_instance = NULL;
|
||||||
|
|
||||||
RSAKeyGenerator::RSAKeyGenerator() : TaskBase("RSAKeyGen", 7*1024, 0)
|
RSAKeyGenerator::RSAKeyGenerator() : TaskBase("RSAKeyGen", 7*1024, 0)
|
||||||
{
|
{
|
||||||
|
s_instance = this;
|
||||||
Instantiate();
|
Instantiate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RSAKeyGenerator::~RSAKeyGenerator()
|
||||||
|
{
|
||||||
|
s_instance = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RSAKeyGenerator::KillInstance()
|
||||||
|
{
|
||||||
|
if (!s_instance) return false;
|
||||||
|
s_instance->Kill();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void RSAKeyGenerator::Service()
|
void RSAKeyGenerator::Service()
|
||||||
{
|
{
|
||||||
// Generate a random 2048-bit SSH host key for the SSH server in DER format.
|
// Generate a random 2048-bit SSH host key for the SSH server in DER format.
|
||||||
|
|
|
@ -49,6 +49,7 @@ class OvmsSSH
|
||||||
void EventHandler(struct mg_connection *nc, int ev, void *p);
|
void EventHandler(struct mg_connection *nc, int ev, void *p);
|
||||||
void NetManInit(std::string event, void* data);
|
void NetManInit(std::string event, void* data);
|
||||||
void NetManStop(std::string event, void* data);
|
void NetManStop(std::string event, void* data);
|
||||||
|
void ConfigRestore(std::string event, void* data);
|
||||||
static int Authenticate(uint8_t type, WS_UserAuthData* data, void* ctx);
|
static int Authenticate(uint8_t type, WS_UserAuthData* data, void* ctx);
|
||||||
WOLFSSH_CTX* ctx() { return m_ctx; }
|
WOLFSSH_CTX* ctx() { return m_ctx; }
|
||||||
|
|
||||||
|
@ -118,14 +119,18 @@ class ConsoleSSH : public OvmsConsole
|
||||||
|
|
||||||
class RSAKeyGenerator : public TaskBase
|
class RSAKeyGenerator : public TaskBase
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
static RSAKeyGenerator* s_instance;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RSAKeyGenerator();
|
RSAKeyGenerator();
|
||||||
virtual ~RSAKeyGenerator() {}
|
virtual ~RSAKeyGenerator();
|
||||||
|
static bool KillInstance();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Service();
|
void Service();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
byte m_der[1200]; // Big enough for 2048-bit private key
|
byte m_der[1200]; // Big enough for 2048-bit private key
|
||||||
};
|
};
|
||||||
#endif //#ifndef __CONSOLE_SSH_H__
|
#endif //#ifndef __CONSOLE_SSH_H__
|
||||||
|
|
|
@ -44,6 +44,7 @@ static const char *TAG = "config";
|
||||||
#include "ovms_events.h"
|
#include "ovms_events.h"
|
||||||
#include "ovms_utils.h"
|
#include "ovms_utils.h"
|
||||||
#include "ovms_boot.h"
|
#include "ovms_boot.h"
|
||||||
|
#include "ovms_semaphore.h"
|
||||||
|
|
||||||
#ifdef CONFIG_OVMS_SC_ZIP
|
#ifdef CONFIG_OVMS_SC_ZIP
|
||||||
#include "zip_archive.h"
|
#include "zip_archive.h"
|
||||||
|
@ -852,7 +853,24 @@ bool OvmsConfig::Restore(std::string path, std::string password, OvmsWriter* wri
|
||||||
else
|
else
|
||||||
ESP_LOGD(TAG, "Restore: reading '%s'...", path.c_str());
|
ESP_LOGD(TAG, "Restore: reading '%s'...", path.c_str());
|
||||||
|
|
||||||
m_store_lock.Lock();
|
// Lock config store:
|
||||||
|
if (!m_store_lock.Lock(pdMS_TO_TICKS(5000)))
|
||||||
|
{
|
||||||
|
if (writer)
|
||||||
|
writer->puts("Error: config store currently in use by another process");
|
||||||
|
else
|
||||||
|
ESP_LOGE(TAG, "Restore: timeout waiting for config lock");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Signal & wait for components to shutdown:
|
||||||
|
{
|
||||||
|
OvmsSemaphore eventdone;
|
||||||
|
auto callback = [](const char* event, void* data) { ((OvmsSemaphore*)data)->Give(); };
|
||||||
|
MyEvents.SignalEvent("config.restore", &eventdone, callback);
|
||||||
|
eventdone.Take();
|
||||||
|
}
|
||||||
|
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
|
|
||||||
// unzip into restore directory:
|
// unzip into restore directory:
|
||||||
|
|
|
@ -165,10 +165,11 @@ void TaskBase::Task(void *object)
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function should be overridden in the derived class to perform any
|
// This function should be overridden in the derived class to perform any
|
||||||
// cleanup operations that must be done before the task is deleted.
|
// cleanup operations that must be done after Service() has finished/stopped
|
||||||
|
// and before the TaskBase instance is deleted.
|
||||||
// This function should NOT be called from the destructor because it is
|
// This function should NOT be called from the destructor because it is
|
||||||
// called explicitly here before the object is deleted. That separation
|
// called explicitly here before the object is deleted. That separation
|
||||||
// is needed so DeleteTask can clean up before deleting the task and still
|
// is needed so DeleteFromParent can clean up before deleting the task and still
|
||||||
// wait to delete the object until after the task is deleted.
|
// wait to delete the object until after the task is deleted.
|
||||||
void TaskBase::Cleanup()
|
void TaskBase::Cleanup()
|
||||||
{
|
{
|
||||||
|
@ -192,8 +193,21 @@ void TaskBase::DeleteFromParent()
|
||||||
// parent object's task.
|
// parent object's task.
|
||||||
void TaskBase::DeleteTask()
|
void TaskBase::DeleteTask()
|
||||||
{
|
{
|
||||||
Cleanup();
|
|
||||||
if (m_taskid)
|
if (m_taskid)
|
||||||
|
{
|
||||||
|
ESP_LOGD(TAG, "Task %s deletion at %u stack free", m_name, uxTaskGetStackHighWaterMark(m_taskid));
|
||||||
vTaskDelete(m_taskid);
|
vTaskDelete(m_taskid);
|
||||||
|
}
|
||||||
|
Cleanup();
|
||||||
delete this;
|
delete this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Kill: immediate task removal and instance deletion.
|
||||||
|
// ATT: This will terminate the running task (Service()) unconditionally!
|
||||||
|
// This function must NOT be called from the TaskBase object's own task.
|
||||||
|
void TaskBase::Kill()
|
||||||
|
{
|
||||||
|
if (m_parent)
|
||||||
|
m_parent->RemoveChild(this);
|
||||||
|
DeleteTask();
|
||||||
|
}
|
||||||
|
|
|
@ -66,6 +66,7 @@ class TaskBase
|
||||||
public:
|
public:
|
||||||
TaskBase(const char* name, int stack = DEFAULT_STACK, UBaseType_t priority = DEFAULT_PRIORITY, Parent* parent = NULL);
|
TaskBase(const char* name, int stack = DEFAULT_STACK, UBaseType_t priority = DEFAULT_PRIORITY, Parent* parent = NULL);
|
||||||
Parent* parent() { return m_parent; }
|
Parent* parent() { return m_parent; }
|
||||||
|
virtual void Kill();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ~TaskBase();
|
virtual ~TaskBase();
|
||||||
|
|
Loading…
Reference in New Issue