fixed written accent problems in windows agent

This commit is contained in:
fermin831 2015-09-11 14:35:11 +02:00
parent 3ead8f15c5
commit 651fe51a2f
3 changed files with 314 additions and 4 deletions

View File

@ -21,6 +21,8 @@
#include "pandora_module_exec.h"
#include "../pandora_strutils.h"
#include <windows.h>
#include <fstream>
#include <map>
#define BUFSIZE 4096
@ -39,6 +41,46 @@ Pandora_Module_Exec::Pandora_Module_Exec (string name, string exec)
this->module_exec = "cmd.exe /c \"" + exec + "\"";
this->proc = 0;
this->setKind (module_exec_str);
this->native_encoding = -1;
}
/**
* Creates a Pandora_Module_Exec object.
*
* @param name Module name
* @param exec Command to be executed.
* @param native indicates an output conversion
*/
Pandora_Module_Exec::Pandora_Module_Exec (string name, string exec, string native)
: Pandora_Module (name) {
this->module_exec = "cmd.exe /c \"" + exec + "\"";
this->proc = 0;
this->setKind (module_exec_str);
if (native.c_str () != ""){
getOutputEncoding();
while (native[0] == ' ') { //remove begin whitespaces
native = native.substr( 1, native.length ());
}
if (!native.compare ("ANSI")){
this->native_encoding = GetACP ();
} else if (!native.compare ("OEM")){
this->native_encoding = GetOEMCP ();
} else if (!native.compare ("UTFLE")){
this->native_encoding = 1200; //UTF-16 little-endian code page
} else if (!native.compare ("UTFBE")){
this->native_encoding = 1201; //UTF-16 big-endian code page
} else {
this->native_encoding = -1;
pandoraDebug("module_native %s in %s module is not a properly encoding",
native.c_str (), name.c_str ());
}
} else {
this->output_encoding = "";
this->native_encoding = -1;
}
}
void
@ -101,11 +143,14 @@ Pandora_Module_Exec::run () {
/* Set up members of the PROCESS_INFORMATION structure. */
ZeroMemory (&pi, sizeof (pi));
pandoraDebug ("Executing: %s", this->module_exec.c_str ());
/* Set the working directory of the process. It's "utils" directory
to find the GNU W32 tools */
working_dir = getPandoraInstallDir () + "util\\";
/*always change input from UTF-8 to ANSI*/
changeInputEncoding();
/* Create the child process. */
if (! CreateProcess (NULL, (CHAR *) this->module_exec.c_str (), NULL,
NULL, TRUE, CREATE_SUSPENDED | CREATE_NO_WINDOW, NULL,
@ -136,6 +181,11 @@ Pandora_Module_Exec::run () {
output += (char *) buffer;
}
/* Change the output encoding */
if (this->native_encoding != -1){
changeOutputEncoding(&output);
}
if (dwRet == WAIT_OBJECT_0) {
break;
} else if(this->getTimeout() < GetTickCount() - tickbase) {
@ -186,3 +236,240 @@ Pandora_Module_Exec::run () {
CloseHandle (out_read);
}
UINT Pandora_Module_Exec::getNumberEncoding (string encoding){
map<string,UINT> code_pages;
//Code page from https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx
//The key has been copied from .NET Name column
code_pages["IBM037"] = 37;
code_pages["IBM437"] = 437;
code_pages["IBM500"] = 500;
code_pages["ASMO-708"] = 708;
code_pages["ASMO-449+"] = 709; //Name of Information column
//710 not .NET name
code_pages["COD-720"] = 720;
code_pages["IBM737"] = 737;
code_pages["IBM775"] = 775;
code_pages["IBM850"] = 850;
code_pages["IBM852"] = 850;
code_pages["IBM855"] = 855;
code_pages["IBM00858"] = 858;
code_pages["IBM860"] = 860;
code_pages["IBM861"] = 861;
code_pages["DOS-862"] = 862;
code_pages["IBM863"] = 863;
code_pages["IBM864"] = 864;
code_pages["IBM865"] = 865;
code_pages["CP866"] = 866;
code_pages["IBM869"] = 869;
code_pages["IBM870"] = 870;
code_pages["WINDOWS-874"] = 874;
code_pages["CP875"] = 875;
code_pages["SHIFT_JIS"] = 932;
code_pages["GB2312"] = 936;
code_pages["KS_C_5601-1987"] = 949;
code_pages["BIG5"] = 950;
code_pages["IBM1026"] = 1026;
code_pages["IBM1140"] = 1140;
code_pages["IBM1141"] = 1141;
code_pages["IBM1142"] = 1142;
code_pages["IBM1143"] = 1143;
code_pages["IBM1144"] = 1144;
code_pages["IBM1145"] = 1145;
code_pages["IBM1146"] = 1146;
code_pages["IBM1147"] = 1147;
code_pages["IBM1148"] = 1148;
code_pages["IBM1149"] = 1149;
code_pages["UTF-16"] = 1200;
code_pages["UNICODEFFFE"] = 1201;
code_pages["WINDOWS-1250"] = 1250;
code_pages["WINDOWS-1251"] = 1251;
code_pages["WINDOWS-1252"] = 1252;
code_pages["WINDOWS-1253"] = 1253;
code_pages["WINDOWS-1254"] = 1254;
code_pages["WINDOWS-1255"] = 1255;
code_pages["WINDOWS-1256"] = 1256;
code_pages["WINDOWS-1257"] = 1257;
code_pages["WINDOWS-1258"] = 1258;
code_pages["JOHAB"] = 1361;
code_pages["MACINTOSH"] = 10000;
code_pages["X-MAC-JAPANESE"] = 10001;
code_pages["X-MAC-CHINESETRAD"] = 10002;
code_pages["X-MAC-KOREAN"] = 10003;
code_pages["X-MAC-ARABIC"] = 10004;
code_pages["X-MAC-HEBREW"] = 10005;
code_pages["X-MAC-GREEK"] = 10006;
code_pages["X-MAC-CYRILLIC"] = 10007;
code_pages["X-MAC-CHINESESIMP"] = 10008;
code_pages["X-MAC-ROMANIAN"] = 10010;
code_pages["X-MAC-UKRANIAN"] = 10017;
code_pages["X-MAC-THAI"] = 10021;
code_pages["X-MAC-CE"] = 10029;
code_pages["X-MAC-ICELANDIC"] = 10079;
code_pages["X-MAC-TURKISH"] = 10081;
code_pages["X-MAC-CROATIAN"] = 10082;
code_pages["UTF-32"] = 12000;
code_pages["UTF-32BE"] = 12001;
code_pages["X-CHINESE_CNS"] = 20000;
code_pages["X-CP20001"] = 20001;
code_pages["X-CHINESE-ETEN"] = 20002;
code_pages["X-CP20003"] = 20003;
code_pages["X-CP20004"] = 20004;
code_pages["X-CP20005"] = 20005;
code_pages["X-IA5"] = 20105;
code_pages["X-IA5-GERMAN"] = 20106;
code_pages["X-IA5-SWEDISH"] = 20107;
code_pages["X-IA5-NORWEGIAN"] = 20108;
code_pages["US-ASCII"] = 20127;
code_pages["X-IA5-GERMAN"] = 20106;
code_pages["X-CP20261"] = 20261;
code_pages["X-CP20259"] = 20269;
code_pages["IBM273"] = 20273;
code_pages["IBM277"] = 20277;
code_pages["IBM278"] = 20278;
code_pages["IBM280"] = 20280;
code_pages["IBM284"] = 20284;
code_pages["IBM285"] = 20285;
code_pages["IBM290"] = 20290;
code_pages["IBM297"] = 20297;
code_pages["IBM420"] = 20420;
code_pages["IBM423"] = 20423;
code_pages["IBM424"] = 20424;
code_pages["X-EBCDIC-KOREANEXTENDED"]= 20833;
code_pages["IBM-THAI"] = 20838;
code_pages["KOI8-R"] = 20866;
code_pages["IBM871"] = 20871;
code_pages["IBM880"] = 20880;
code_pages["IBM905"] = 20905;
code_pages["IBM00924"] = 20924;
code_pages["EUC-JP"] = 20932;
code_pages["X-CP20936"] = 20936;
code_pages["X-CP20949"] = 20949;
code_pages["CP1025"] = 21025;
//21027 code page is deprecated
code_pages["KOI8-U"] = 21866;
code_pages["ISO-8859-1"] = 28591;
code_pages["ISO-8859-2"] = 28592;
code_pages["ISO-8859-3"] = 28593;
code_pages["ISO-8859-4"] = 28594;
code_pages["ISO-8859-5"] = 28595;
code_pages["ISO-8859-6"] = 28596;
code_pages["ISO-8859-7"] = 28597;
code_pages["ISO-8859-8"] = 28598;
code_pages["ISO-8859-9"] = 28599;
code_pages["ISO-8859-13"] = 28603;
code_pages["ISO-8859-15"] = 28605;
code_pages["X-EUROPA"] = 29001;
code_pages["ISO-8859-8-I"] = 39598;
code_pages["ISO-2022-JP"] = 50220;
code_pages["CSISO2022JP"] = 50221;
code_pages["ISO-2022-JP"] = 50222;
code_pages["ISO-2022-KR"] = 50225;
code_pages["X-CP50227"] = 50227;
//50229 not .NET name
//50930 not .NET name
//50933 not .NET name
//50931 not .NET name
//50935 not .NET name
//50936 not .NET name
//50937 not .NET name
//50939 not .NET name
code_pages["EUC-JP"] = 51932;
code_pages["EUC-CN"] = 51936;
code_pages["EUC-KR"] = 51949;
//51950 not .NET name
code_pages["HZ-GB-2312"] = 52936;
code_pages["X-ISCII-DE"] = 57002;
code_pages["X-ISCII-BE"] = 57003;
code_pages["X-ISCII-TA"] = 57004;
code_pages["X-ISCII-TE"] = 57005;
code_pages["X-ISCII-AS"] = 57006;
code_pages["X-ISCII-OR"] = 57007;
code_pages["X-ISCII-KA"] = 57008;
code_pages["X-ISCII-MA"] = 57009;
code_pages["X-ISCII-GU"] = 57010;
code_pages["X-ISCII-PA"] = 57010;
code_pages["UTF-7"] = 65000;
code_pages["UTF-8"] = 65001;
for (int i = 0; i < encoding.length(); i++){
encoding[i] = toupper(encoding[i]);
}
if (code_pages.count(encoding)){
return code_pages[encoding];
} else{
return 0;
}
}
void Pandora_Module_Exec::getOutputEncoding(){
this->output_encoding = "ISO-8859-1"; //initialize with default encoding
string buffer, filename;
int pos;
filename = Pandora::getPandoraInstallDir ();
filename += "pandora_agent.conf";
ifstream file;
file.open (filename.c_str ());
bool token_found = false;
while (!file.eof () && !token_found) {
/* Set the value from each line */
getline (file, buffer);
/* Ignore blank or commented lines */
if (buffer[0] != '#' && buffer[0] != '\n' && buffer[0] != '\0') {
/*Check if is the encoding line*/
pos = buffer.find("encoding");
if (pos != string::npos){
this->output_encoding = "";
this->output_encoding = buffer.substr(pos+9);
token_found = true;
}
}
}
file.close();
}
void Pandora_Module_Exec::changeInputEncoding(){
int size_wchar = MultiByteToWideChar( CP_UTF8 , 0 , this->module_exec.c_str () , -1, NULL , 0 );
wchar_t* wstr = new wchar_t[size_wchar];
if (size_wchar != 0){
MultiByteToWideChar( CP_UTF8 , 0 , this->module_exec.c_str () , -1, wstr , size_wchar );
char buf[BUFSIZE + 1];
wcstombs(buf, wstr, size_wchar);
buf[size_wchar] = '\0';
this->module_exec = buf;
}
delete[] wstr;
}
void Pandora_Module_Exec::changeOutputEncoding(string * string_change){
//first change: from native encoding to system encoding
UINT cp_output = getNumberEncoding(this->output_encoding);
if (cp_output != 0) {
int size_wchar = MultiByteToWideChar( this->native_encoding , 0 , string_change->c_str() , -1, NULL , 0 );
wchar_t* wstr = new wchar_t[size_wchar];
if (size_wchar != 0){
MultiByteToWideChar( this->native_encoding , 0 , string_change->c_str() , -1, wstr , size_wchar );
//second change: from system encoding to output encoding
int size_schar = WideCharToMultiByte( cp_output, 0, wstr, -1, NULL, 0, NULL, NULL);
char* sstr = new char[size_schar];
if (size_schar != 0){
WideCharToMultiByte( cp_output, 0, wstr, -1, sstr, size_schar, NULL, NULL);
* string_change = sstr;
}
delete[] sstr;
}
delete[] wstr;
} else {
pandoraDebug ("Cannot find code page of encoding: %s", this->output_encoding.c_str ());
}
}

View File

@ -34,9 +34,17 @@ namespace Pandora_Modules {
class Pandora_Module_Exec : public Pandora_Module {
private:
string module_exec;
UINT native_encoding;
string output_encoding;
UINT getNumberEncoding(string encoding);
void getOutputEncoding();
void changeInputEncoding();
void changeOutputEncoding(string * string_change);
public:
unsigned char proc;
Pandora_Module_Exec (string name, string exec);
Pandora_Module_Exec (string name, string exec);
//overloaded constructor for module_exec
Pandora_Module_Exec (string name, string exec, string native);
void run ();
};

View File

@ -118,6 +118,7 @@ using namespace Pandora_Strutils;
#define TOKEN_QUIET ("module_quiet ")
#define TOKEN_MODULE_FF_INTERVAL ("module_ff_interval ")
#define TOKEN_MACRO ("module_macro")
#define TOKEN_NATIVE ("module_native")
string
parseLine (string line, string token) {
@ -170,6 +171,7 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
string module_unit, module_group, module_custom_id, module_str_warning, module_str_critical;
string module_critical_instructions, module_warning_instructions, module_unknown_instructions, module_tags;
string module_critical_inverse, module_warning_inverse, module_quiet, module_ff_interval;
string module_native;
string macro;
Pandora_Module *module;
bool numeric;
@ -247,6 +249,7 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
module_warning_inverse = "";
module_quiet = "";
module_ff_interval = "";
module_native = "";
macro = "";
stringtok (tokens, definition, "\n");
@ -489,6 +492,11 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
if (module_quiet == "") {
module_quiet = parseLine (line, TOKEN_QUIET);
}
if (module_native == "") {
module_native = parseLine (line, TOKEN_NATIVE);
}
if (module_ff_interval == "") {
module_ff_interval = parseLine (line, TOKEN_MODULE_FF_INTERVAL);
}
@ -1047,6 +1055,13 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
module_quiet.replace(pos_macro, macro_name.size(), macro_value);
}
}
if (module_native != "") {
pos_macro = module_native.find(macro_name);
if (pos_macro != string::npos){
module_native.replace(pos_macro, macro_name.size(), macro_value);
}
}
if (module_ff_interval != "") {
pos_macro = module_ff_interval.find(macro_name);
@ -1061,7 +1076,7 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
/* Create module objects */
if (module_exec != "") {
module = new Pandora_Module_Exec (module_name,
module_exec);
module_exec, module_native);
if (module_timeout != "") {
module->setTimeout (atoi (module_timeout.c_str ()));
}