2012-11-20 Sergio Martin <sergio.martin@artica.es>

* pandora_windows_service.h
	  pandora_windows_service.cc: Added support for
	gis_exec (Automatic gis coordinates)



git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@7180 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
zarzuelo 2012-11-21 17:13:05 +00:00
parent 0fd24a4de9
commit 930b09e5f3
3 changed files with 205 additions and 29 deletions

View File

@ -1,3 +1,9 @@
2012-11-20 Sergio Martin <sergio.martin@artica.es>
* pandora_windows_service.h
pandora_windows_service.cc: Added support for
gis_exec (Automatic gis coordinates)
2012-11-20 Sergio Martin <sergio.martin@artica.es>
* pandora_windows_service.cc: Fixed some bugs

View File

@ -40,6 +40,8 @@
#include <fstream>
#include <unistd.h>
#define BUFSIZE 4096
using namespace std;
using namespace Pandora;
using namespace Pandora_Modules;
@ -369,9 +371,10 @@ string
Pandora_Windows_Service::getXmlHeader () {
char timestamp[20];
string agent_name, os_name, os_version, encoding, value, xml, address, parent_agent_name;
string custom_id, url_address, latitude, longitude, altitude, position_description;
string custom_id, url_address, latitude, longitude, altitude, position_description, gis_exec, gis_result;
time_t ctime;
struct tm *ctime_tm = NULL;
unsigned int pos;
// Get agent name
agent_name = conf->getValue ("agent_name");
@ -442,6 +445,44 @@ Pandora_Windows_Service::getXmlHeader () {
}
// Get Coordinates
gis_exec = conf->getValue ("gis_exec");
if(gis_exec != "") {
gis_result = getCoordinatesFromGisExec(gis_exec);
if(gis_result != "") {
// Delete carriage return if is provided
pos = gis_result.find("\n");
if(pos != string::npos) {
gis_result.erase(pos, gis_result.size () - pos);
}
pos = gis_result.find("\r");
if(pos != string::npos) {
gis_result.erase(pos, gis_result.size () - pos);
}
// Process the result as "latitude,longitude,altitude"
pandoraDebug ("getCoordinatesFromGisExec: Parsing coordinates %s", gis_result.c_str ());
pos = gis_result.find(",");
if (pos != string::npos && pos != 0) {
latitude = gis_result;
gis_result = gis_result.substr(pos+1);
latitude.erase(pos, latitude.size () - pos);
pos = gis_result.find(",");
if(pos != string::npos && pos != 0) {
longitude = gis_result;
altitude = gis_result.substr(pos+1);
longitude.erase(pos, longitude.size () - pos);
}
xml += "\" latitude=\"";
xml += latitude;
xml += "\" longitude=\"";
xml += longitude;
xml += "\" altitude=\"";
xml += altitude;
}
}
}
else {
latitude = conf->getValue ("latitude");
longitude = conf->getValue ("longitude");
if(latitude != "" && longitude != "") {
@ -457,11 +498,13 @@ Pandora_Windows_Service::getXmlHeader () {
}
position_description = conf->getValue ("position_description");
position_description = "";
if(position_description != "") {
xml += "\" position_description=\"";
xml += position_description;
}
}
}
xml += "\" interval=\"" + conf->getValue ("interval") +
"\" os_name=\"" + os_name +
@ -471,6 +514,131 @@ Pandora_Windows_Service::getXmlHeader () {
return xml;
}
string
Pandora_Windows_Service::getCoordinatesFromGisExec (string gis_exec)
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
DWORD retval, dwRet;
SECURITY_ATTRIBUTES attributes;
HANDLE out, new_stdout, out_read, job;
string working_dir;
string output = "";
int timeout = 30;
/* Set the bInheritHandle flag so pipe handles are inherited. */
attributes.nLength = sizeof (SECURITY_ATTRIBUTES);
attributes.bInheritHandle = TRUE;
attributes.lpSecurityDescriptor = NULL;
/* Create a job to kill the child tree if it become zombie */
/* CAUTION: In order to compile this, WINVER should be defined to 0x0500.
This may need no change, since it was redefined by the
program, but if needed, the macro is defined
in <windef.h> */
job = CreateJobObject (&attributes, NULL);
if (job == NULL) {
pandoraLog ("getCoordinatesFromGisExec: CreateJobObject failed. Err: %d", GetLastError ());
return "";
}
/* Get the handle to the current STDOUT. */
out = GetStdHandle (STD_OUTPUT_HANDLE);
if (! CreatePipe (&out_read, &new_stdout, &attributes, 0)) {
pandoraLog ("getCoordinatesFromGisExec: CreatePipe failed. Err: %d", GetLastError ());
return "";
}
/* Ensure the read handle to the pipe for STDOUT is not inherited */
SetHandleInformation (out_read, HANDLE_FLAG_INHERIT, 0);
ZeroMemory (&si, sizeof (si));
GetStartupInfo (&si);
si.cb = sizeof (si);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.hStdError = new_stdout;
si.hStdOutput = new_stdout;
/* Set up members of the PROCESS_INFORMATION structure. */
ZeroMemory (&pi, sizeof (pi));
pandoraDebug ("Executing gis_exec: %s", gis_exec.c_str ());
/* Create the child process. */
if (CreateProcess (NULL , (CHAR *)gis_exec.c_str (), NULL, NULL, TRUE,
CREATE_SUSPENDED | CREATE_NO_WINDOW, NULL, NULL, &si, &pi) == 0) {
pandoraLog ("getCoordinatesFromGisExec: %s CreateProcess failed. Err: %d",
gis_exec.c_str (), GetLastError ());
return "";
} else {
char buffer[BUFSIZE + 1];
unsigned long read, avail;
if (! AssignProcessToJobObject (job, pi.hProcess)) {
pandoraLog ("getCoordinatesFromGisExec: could not assign proccess to job (error %d)",
GetLastError ());
}
ResumeThread (pi.hThread);
/*string output;*/
int tickbase = GetTickCount();
while ( (dwRet = WaitForSingleObject (pi.hProcess, 500)) != WAIT_ABANDONED ) {
PeekNamedPipe (out_read, buffer, BUFSIZE, &read, &avail, NULL);
if (avail > 0) {
ReadFile (out_read, buffer, BUFSIZE, &read, NULL);
buffer[read] = '\0';
output += (char *) buffer;
}
if (dwRet == WAIT_OBJECT_0) {
break;
} else if(timeout < GetTickCount() - tickbase) {
/* STILL_ACTIVE */
TerminateProcess(pi.hThread, STILL_ACTIVE);
pandoraLog ("getCoordinatesFromGisExec: %s timed out (retcode: %d)", gis_exec.c_str (), STILL_ACTIVE);
break;
}
}
GetExitCodeProcess (pi.hProcess, &retval);
if (retval != 0) {
if (! TerminateJobObject (job, 0)) {
pandoraLog ("getCoordinatesFromGisExec: TerminateJobObject failed. (error %d)",
GetLastError ());
}
if (retval != STILL_ACTIVE) {
pandoraLog ("getCoordinatesFromGisExec: %s did not executed well (retcode: %d)",
gis_exec.c_str (), retval);
}
/* Close job, process and thread handles. */
CloseHandle (job);
CloseHandle (pi.hProcess);
CloseHandle (pi.hThread);
CloseHandle (new_stdout);
CloseHandle (out_read);
return "";
}
/* Close job, process and thread handles. */
CloseHandle (job);
CloseHandle (pi.hProcess);
CloseHandle (pi.hThread);
}
CloseHandle (new_stdout);
CloseHandle (out_read);
return output;
}
int
Pandora_Windows_Service::copyTentacleDataFile (string host,
string filename,
@ -1336,12 +1504,13 @@ Pandora_Windows_Service::sendXml (Pandora_Module_List *modules) {
/* Write custom fields */
int c = 1;
char custom_field_name_token[21]; // enough to hold all numbers up to 64-bits
char custom_field_value_token[21]; // enough to hold all numbers up to 64-bits
sprintf(custom_field_name_token, "custom_field%d_name", c);
sprintf(custom_field_value_token, "custom_field%d_value", c);
string token_name = conf->getValue (custom_field_name_token);
string token_value = conf->getValue (custom_field_value_token);
char token_name_token[21]; // enough to hold all numbers up to 64-bits
char token_value_token[21]; // enough to hold all numbers up to 64-bits
sprintf(token_name_token, "custom_field%d_name", c);
sprintf(token_value_token, "custom_field%d_value", c);
string token_name = conf->getValue (token_name_token);
string token_value = conf->getValue (token_value_token);
if(token_name != "" && token_value != "") {
data_xml += "<custom_fields>\n";
@ -1352,10 +1521,10 @@ Pandora_Windows_Service::sendXml (Pandora_Module_List *modules) {
data_xml += " </field>\n";
c++;
sprintf(custom_field_name_token, "custom_field%d_name", c);
sprintf(custom_field_value_token, "custom_field%d_value", c);
token_name = conf->getValue (custom_field_name_token);
token_value = conf->getValue (custom_field_value_token);
sprintf(token_name_token, "custom_field%d_name", c);
sprintf(token_value_token, "custom_field%d_value", c);
token_name = conf->getValue (token_name_token);
token_value = conf->getValue (token_value_token);
}
data_xml += "</custom_fields>\n";
}

View File

@ -53,6 +53,7 @@ namespace Pandora {
string getXmlHeader ();
int copyDataFile (string filename);
string getCoordinatesFromGisExec (string gis_exec);
int copyTentacleDataFile (string host,
string filename,
string port,