00001 /* 00002 * Copyright (C) 2011, Edmundo Albuquerque de Souza e Silva. 00003 * 00004 * This file may be distributed under the terms of the Q Public License 00005 * as defined by Trolltech AS of Norway and appearing in the file 00006 * LICENSE.QPL included in the packaging of this file. 00007 * 00008 * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING 00009 * THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00010 * PURPOSE. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, 00011 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING 00012 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 00013 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 00014 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 00015 * 00016 */ 00017 00018 #ifndef __USERLOGS_H_ 00019 #define __USERLOGS_H_ 00020 00021 // Unidades usadas do RIO. 00022 #include "LogRotation.h" 00023 00024 // Unidades usadas do apache 00025 #include <http_config.h> 00026 #include <http_log.h> 00027 //#include <http_protocol.h> 00028 00029 // Unidade usada do sistema 00030 #include <pthread.h> 00031 00032 // Endereco IP usado pela classe (127.0.0.1). Talvez mudar, por eficiencia, 00033 // para o valor do IP 127.0.0.1 na ordem de rede. 00034 #define USERLOGS_UDP_IP inet_addr( "127.0.0.1" ) 00035 00036 // Novas constantes usadas pela implementacao da classe de logs, para o socket 00037 // UDP auxiliar. 00038 // Flags usadas ao receber os dados via UDP. 00039 #define UDP_FLAGS_RECEIVE MSG_WAITALL 00040 // Flags usadas ao enviar o tamanho e o tempo via UDP. 00041 #define UDP_FLAGS_PARTIALSEND MSG_CONFIRM | MSG_MORE 00042 // Flags usadas ao enviar o log via UDP. 00043 #define UDP_FLAGS_SENDDATA MSG_CONFIRM 00044 00045 // Armazena o numero de sockets (um no momento,o UDP usado para receber as 00046 // linhas de log, usado por um objeto da classe CUserLogs). 00047 #define USERLOGSSOCKETSNUMBER 1 00048 00049 // Armazena as entradas usadas pela estrutura do poll. 00050 #define USERLOGSSOCKETUDP 0 // Posicao do socket UDP. 00051 00052 // Classe para receber os logs pelo socket UDP e salva-los no log gerenciado 00053 // pela classe e associado ao modulo. 00054 class CServerUserLogs 00055 { 00056 private: 00057 /** Variavel booleana que indica se a classe foi inicializada */ 00058 bool m_Initialized; 00059 /** Identificador da thread que recebe os dados a serem colocados no 00060 * log. */ 00061 pthread_t m_ServerUserLogsThread; 00062 /** Ponteiro para a estrutura com as informacoes do servidor. */ 00063 server_rec *m_Server; 00064 /** Ponteiro para o objeto da classe de gerenciamento de logs usada por 00065 * esta classe. */ 00066 CLogRotation *m_LogRotation; 00067 /** Socket usado para enviar dados para a thread da classe, usando a 00068 * funcao estatica SendLogLine da classe. */ 00069 int m_Socket; 00070 /** Armazena o endereco do socket usado para gerar os logs. */ 00071 struct sockaddr_in m_SocketAddr; 00072 /** Armazena a porta usada pela thread que envia os logs. */ 00073 int m_LogsServerPort; 00074 00075 /** 00076 * Funcao usada para receber uma string com um log pelo socket UDP. 00077 * @param Log ponteiro a string que armazenara a linha de log recebida. 00078 * Se algum erro ocorrer, sera retornada uma string vazia, com tamanho 00079 * 0. Em caso contrario sera retornada a string recebida, que pode ser 00080 * vazia quando uma mensagem de termino de conexao for recebida. 00081 * @param Port ponteiro para armazenar a porta da qual se originou a 00082 * mensagem com a linha do log. 00083 * @return S_OK se o log foi recebido pelo socket UDP com sucesso, ou 00084 * o codigo de erro se algum erro ocorrer durante o recebimento do log. 00085 */ 00086 RioResult ReceiveLogLine( char *LogLine, int *LogLinePort ); 00087 00088 /** 00089 * Funcao para enviar o resultado dado como parametro para o socket UDP 00090 * cuja porta tambem e dada como parametro. 00091 * @param Port porta UDP para a qual o resultado deve ser enviado. 00092 * @param RioResult Resultado (codigo de erro) a ser enviado. 00093 * @return S_OK se o resultado foi enviado pelo socket UDP com sucesso, 00094 * ou o codigo de erro se algum erro ocorrer durante o envio do 00095 * resultado. 00096 */ 00097 RioResult SendResult( int Port, int Result ); 00098 00099 /** 00100 * Funcao executada pela thread da classe. 00101 * @return true se o objeto deve ser removido antes de a thread ser 00102 * finalizada (quando a thread for finalizada por uma mensagem especial 00103 * enviada por um objeto da classe cliente) ou false em caso contrario 00104 * (quando a thread for finalizada pelo destrutor do objeto). 00105 */ 00106 bool ServerUserLogsThread(); 00107 /** 00108 * Funcao que chama a funcao executada pela thread da classe, usada 00109 * quando a thread e criada. 00110 * @param Param ponteiro para o parametro da thread (no caso, um 00111 * ponteiro para um objeto da classe), passado ao criar a thread. 00112 */ 00113 static void* ServerUserLogsThreadEp( void *Param ); 00114 00115 public: 00116 /** 00117 * Construtor da classe, usado ao criar um objeto da classe. 00118 * @param Server ponteiro para a requisicao associada a conexao http 00119 * com o servidor. 00120 */ 00121 CServerUserLogs( server_rec *Server ); 00122 /** 00123 * Destrutor da classe, usado ao remover um objeto da classe. 00124 */ 00125 virtual ~CServerUserLogs(); 00126 /** 00127 * Funcao usada para inicializar um objeto da classe CUserLogs. O 00128 * objeto deve estar inicializado para podermos usar a funcao NewLogLine 00129 * (caso o objeto nao esteja inicializado, e retornado o erro 00130 * ERROR_SERVERUSERLOGS + ERROR_NOT_INITIALIZED). 00131 * @param LogsFilePrefixPath nome do caminho do prefixo para os arquivos 00132 * de log. Este caminho deve incluir, alem do prefixo, o nome do 00133 * diretorio onde os logs serao armazenados. Por exemplo, o parametro 00134 * "/home/xandao/TesteLogs" indica que os logs serao armazenados no 00135 * diretorio "/home/xandao", com nomes com o prefixo de "TesteLogs". 00136 * @param MaxLogFileSize tamanho maximo que o arquivo de log deve ter. 00137 * Quando o tamanho passar do tamanho maximo, o arquivo de log sera 00138 * compactado e um novo arquivo de log (com o prefixo dado) sera criado. 00139 * @param MaxCombinedLogFilesSize valor maximo para o tamanho combinado 00140 * dos arquivos com os logs. 00141 * @param LogsPort Porta UDP a ser usada (sem ser na ordem de rede). 00142 * @return S_OK se a inicializacao foi feita com sucesso, e um valor 00143 * diferente de S_OK em caso contrario. 00144 */ 00145 virtual RioResult Initialize( char *LogsFilePrefixPath, 00146 unsigned int MaxLogFileSize, 00147 unsigned long long int MaxCombinedLogFilesSize, 00148 int LogsPort ); 00149 /** 00150 * Funcao para bloquear o processo ate a thread que recebe os logs 00151 * termine de executar. 00152 */ 00153 void JoinThread(); 00154 }; 00155 00156 // Classe para enviar os logs pelo socket UDP para serem salvos. 00157 class CClientUserLogs 00158 { 00159 private: 00160 /** Variavel booleana que indica se a classe foi inicializada */ 00161 bool m_Initialized; 00162 /** Ponteiro para a requisicao com os dados do pedido HTTP. */ 00163 request_rec *m_Request; 00164 /** Socket usado para enviar dados para a thread da classe, usando a 00165 * funcao estatica SendLogLine da classe. */ 00166 int m_Socket; 00167 /** Armazena o endereco do socket usado para gerar os logs. */ 00168 struct sockaddr_in m_SocketAddr; 00169 /** Armazena a porta usada pela thread que envia os logs. */ 00170 int m_LogsServerPort; 00171 00172 /** 00173 * Funcao usada para enviar uma string com um log pelo socket UDP. 00174 * @param Log ponteiro para a string com o log a ser enviado pelo socket 00175 * UDP para ser salvo. 00176 * @return S_OK se o log foi enviado pelo socket UDP com sucesso, ou 00177 * o codigo de erro se algum erro ocorrer durante o envio do log. 00178 */ 00179 RioResult SendLogLine( char *LogLine ); 00180 00181 public: 00182 /** 00183 * Construtor da classe, usado ao criar um objeto da classe. 00184 * @param Request ponteiro para a requisicao associada a conexao http 00185 * com o cliente. 00186 */ 00187 CClientUserLogs( request_rec *Request ); 00188 /** 00189 * Destrutor da classe, usado ao remover um objeto da classe. 00190 */ 00191 virtual ~CClientUserLogs(); 00192 00193 /** 00194 * Funcao usada para inicializar um objeto da classe CUserLogs. O 00195 * objeto deve estar inicializado para podermos usar a funcao NewLogLine 00196 * (caso o objeto nao esteja inicializado, e retornado o erro 00197 * ERROR_CLIENTUSERLOGS + ERROR_NOT_INITIALIZED). 00198 * @param LogsServerPort porta UDP (sem ser na ordem da rede) usada pelo 00199 * servidor que recebe os logs. 00200 * @return S_OK se a inicializacao foi feita com sucesso, e um valor 00201 * diferente de S_OK em caso contrario. 00202 */ 00203 virtual RioResult Initialize( int LogsServerPort ); 00204 00205 /** 00206 * Funcao para criar uma nova solicitacao de impressao de uma linha no 00207 * log. Esta linha e enviada pelo socket USERLOGS_UDP_PORT. 00208 * @param LogInfo linha a ser impressa no log. A linha deve incluir o 00209 * caractere de retorno de carro (o "\n" do comando printf), pois a 00210 * funcao de impressao supoe a existencia do "\n" na linha. 00211 * @return S_OK se a solicitacao foi criada com sucesso, e um valor 00212 * diferente de S_OK se algum erro ocorreu ao criarmos a solicitacao. 00213 */ 00214 virtual RioResult NewLogLine( char *LogInfo ); 00215 }; 00216 00217 #endif /* __USERLOGS_H_ */