Preload all scripts to execute on startup to avoid scanning the
directory on every event.
This commit is contained in:
parent
d48ee1f02b
commit
b2948cba5b
2 changed files with 40 additions and 21 deletions
|
@ -16,6 +16,7 @@
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#endif // _LINUX
|
#endif // _LINUX
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#ifdef _LINUX
|
#ifdef _LINUX
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -30,6 +31,7 @@
|
||||||
#include "common/Strings.h"
|
#include "common/Strings.h"
|
||||||
|
|
||||||
typedef std::list<TelldusCore::Socket *> SocketList;
|
typedef std::list<TelldusCore::Socket *> SocketList;
|
||||||
|
typedef std::list<std::string> StringList;
|
||||||
|
|
||||||
class EventUpdateManager::PrivateData {
|
class EventUpdateManager::PrivateData {
|
||||||
public:
|
public:
|
||||||
|
@ -37,6 +39,9 @@ public:
|
||||||
TelldusCore::EventRef stopEvent, updateEvent, clientConnectEvent;
|
TelldusCore::EventRef stopEvent, updateEvent, clientConnectEvent;
|
||||||
SocketList clients;
|
SocketList clients;
|
||||||
ConnectionListener *eventUpdateClientListener;
|
ConnectionListener *eventUpdateClientListener;
|
||||||
|
#ifdef _LINUX
|
||||||
|
std::map<std::string, StringList> fileList;
|
||||||
|
#endif // _LINUX
|
||||||
};
|
};
|
||||||
|
|
||||||
EventUpdateManager::EventUpdateManager()
|
EventUpdateManager::EventUpdateManager()
|
||||||
|
@ -46,6 +51,13 @@ EventUpdateManager::EventUpdateManager()
|
||||||
d->updateEvent = d->eventHandler.addEvent();
|
d->updateEvent = d->eventHandler.addEvent();
|
||||||
d->clientConnectEvent = d->eventHandler.addEvent();
|
d->clientConnectEvent = d->eventHandler.addEvent();
|
||||||
d->eventUpdateClientListener = new ConnectionListener(L"TelldusEvents", d->clientConnectEvent);
|
d->eventUpdateClientListener = new ConnectionListener(L"TelldusEvents", d->clientConnectEvent);
|
||||||
|
#ifdef _LINUX
|
||||||
|
loadScripts("deviceevent");
|
||||||
|
loadScripts("devicechangeevent");
|
||||||
|
loadScripts("rawdeviceevent");
|
||||||
|
loadScripts("sensorevent");
|
||||||
|
loadScripts("controllerevent");
|
||||||
|
#endif // _LINUX
|
||||||
}
|
}
|
||||||
|
|
||||||
EventUpdateManager::~EventUpdateManager(void) {
|
EventUpdateManager::~EventUpdateManager(void) {
|
||||||
|
@ -89,6 +101,25 @@ void EventUpdateManager::run() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EventUpdateManager::loadScripts(const std::string &folder) {
|
||||||
|
#ifdef _LINUX
|
||||||
|
std::string path = TelldusCore::formatf("/usr/local/share/telldus/scripts/%s", folder.c_str());
|
||||||
|
struct dirent **namelist;
|
||||||
|
int count = scandir(path.c_str(), &namelist, NULL, alphasort);
|
||||||
|
if (count < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < count; ++i) {
|
||||||
|
if (strcmp(namelist[i]->d_name, ".") != 0 && strcmp(namelist[i]->d_name, "..") != 0) {
|
||||||
|
d->fileList[folder].push_back(namelist[i]->d_name);
|
||||||
|
}
|
||||||
|
free(namelist[i]);
|
||||||
|
}
|
||||||
|
free(namelist);
|
||||||
|
#endif // _LINUX
|
||||||
|
}
|
||||||
|
|
||||||
void EventUpdateManager::sendMessageToClients(EventUpdateData *data) {
|
void EventUpdateManager::sendMessageToClients(EventUpdateData *data) {
|
||||||
int connected = 0;
|
int connected = 0;
|
||||||
for(SocketList::iterator it = d->clients.begin(); it != d->clients.end();) {
|
for(SocketList::iterator it = d->clients.begin(); it != d->clients.end();) {
|
||||||
|
@ -194,29 +225,13 @@ void EventUpdateManager::executeScripts(EventUpdateData *data) {
|
||||||
}
|
}
|
||||||
newEnv[env.size()] = 0; // Mark end of array
|
newEnv[env.size()] = 0; // Mark end of array
|
||||||
|
|
||||||
// List files to execute
|
for(StringList::iterator it = d->fileList[dir].begin(); it != d->fileList[dir].end(); ++it) {
|
||||||
std::string path = TelldusCore::formatf("/usr/local/share/telldus/scripts/%s", dir.c_str());
|
executeScript(TelldusCore::formatf("/usr/local/share/telldus/scripts/%s/%s", dir.c_str(), (*it).c_str()), (*it), newEnv);
|
||||||
struct dirent **namelist;
|
|
||||||
int count = scandir(path.c_str(), &namelist, NULL, alphasort);
|
|
||||||
if (count <= 0) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i < count; ++i) {
|
|
||||||
if (strcmp(namelist[i]->d_name, ".") == 0 || strcmp(namelist[i]->d_name, "..") == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
executeScript(TelldusCore::formatf("%s/%s", path.c_str(), namelist[i]->d_name), namelist[i]->d_name, newEnv);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int i = 0; i < count; ++i) {
|
|
||||||
free(namelist[i]);
|
|
||||||
}
|
|
||||||
free(namelist);
|
|
||||||
#endif // _LINUX
|
#endif // _LINUX
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventUpdateManager::executeScript(std::string script, char *name, char ** env) {
|
void EventUpdateManager::executeScript(std::string script, const std::string &name, char ** env) {
|
||||||
#ifdef _LINUX
|
#ifdef _LINUX
|
||||||
pid_t pid = fork();
|
pid_t pid = fork();
|
||||||
if (pid == -1) {
|
if (pid == -1) {
|
||||||
|
@ -225,8 +240,11 @@ void EventUpdateManager::executeScript(std::string script, char *name, char ** e
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pid == 0) {
|
if (pid == 0) {
|
||||||
static char * argv[] = { name };
|
char *n = new char[name.length()+1];
|
||||||
|
snprintf(n, name.length()+1, "%s", name.c_str());
|
||||||
|
static char * argv[] = { n };
|
||||||
execve(script.c_str(), argv, env);
|
execve(script.c_str(), argv, env);
|
||||||
|
delete[] n;
|
||||||
Log::error("Could not execute %s (%i): %s", script.c_str(), errno, strerror(errno));
|
Log::error("Could not execute %s (%i): %s", script.c_str(), errno, strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,9 +44,10 @@ protected:
|
||||||
private:
|
private:
|
||||||
class PrivateData;
|
class PrivateData;
|
||||||
PrivateData *d;
|
PrivateData *d;
|
||||||
|
void loadScripts(const std::string &folder);
|
||||||
void sendMessageToClients(EventUpdateData *data);
|
void sendMessageToClients(EventUpdateData *data);
|
||||||
void executeScripts(EventUpdateData *data);
|
void executeScripts(EventUpdateData *data);
|
||||||
static void executeScript(std::string script, char *name, char **env);
|
static void executeScript(std::string script, const std::string &name, char **env);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TELLDUS_CORE_SERVICE_EVENTUPDATEMANAGER_H_
|
#endif // TELLDUS_CORE_SERVICE_EVENTUPDATEMANAGER_H_
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue