00001 /* 00002 * Copyright (C) 2010, 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 __SERVERINSTANCE_H_ 00019 #define __SERVERINSTANCE_H_ 00020 00021 // Unidades usadas do apache 00022 #include <httpd.h> 00023 00024 // Unidade usada do sistema 00025 #include <pthread.h> 00026 00027 // Define a classe que implementa o modulo do apache 00028 00029 // Unidades usadas do RIO. 00030 #include "RioInterface.h" 00031 #include "RioInterfaceTypes.h" 00032 #include "CircularBuffer.h" 00033 #include "RioModuleTypes.h" 00034 #include "RioExplorer.h" 00035 00036 // Constantes que definem os comandos. 00037 #define CMD_LOGIN_ID 0 00038 #define CMD_QUIT_ID 1 00039 #define CMD_SESSIONS_ID 2 00040 #define CMD_LS_ID 3 00041 #define CMD_RM_ID 4 00042 #define CMD_MKDIR_ID 5 00043 #define CMD_DOWNLOAD_ID 6 00044 #define CMD_MV_ID 7 00045 #define CMD_UPLOAD_ID 8 00046 #define CMD_ADDUSER_ID 9 00047 #define CMD_DELUSER_ID 10 00048 #define CMD_PASSWD_ID 11 00049 #define CMD_USERLIST_ID 12 00050 #define CMD_INV_ID 13 00051 00052 using namespace std; 00053 00054 // Estrutura para de um comando usado pela opcao "exec.rio". 00055 typedef struct 00056 { 00057 const char *Command; 00058 unsigned int CommandId; 00059 unsigned int MininumParams; 00060 unsigned int MaximumParams; 00061 } TExecCmd; 00062 00063 // Estrutura para armazenar os comandos que precisamos ocultar a senha, com as 00064 // posicoes dos parametros. 00065 typedef struct 00066 { 00067 const char *Command; 00068 unsigned int PasswordParam; 00069 } TLogCmd; 00070 00071 // Define a classe derivada da RioExplorer, necessaria para definirmos as 00072 // funcoes virtuais. 00073 class CModuleRioExplorer : public RioExplorer 00074 { 00075 private: 00076 // Ponteiro para o objeto com as informacoes do servidor do apache 00077 // (usado somente para impressao) 00078 server_rec *m_Server; 00079 public: 00080 /** 00081 * Construtor da classe RioModule, para criar um novo objeto desta 00082 * classe. 00083 * @param Server ponteiro para a estrutura do servidor. 00084 */ 00085 CModuleRioExplorer( server_rec *Server ); 00086 /** 00087 * Destrutor da classe RioModule, usado quando um objeto e removido. 00088 */ 00089 ~CModuleRioExplorer(); 00090 /** 00091 * Funcao para mostrar uma mensagem no log do apache. 00092 */ 00093 bool showMessage( int, string, string = "" ); 00094 /** 00095 * Funcao nao usada, mas que precisa ser implementada. 00096 */ 00097 void updateCopyProgress( void ) {}; 00098 /** 00099 * Funcao nao usada, mas que precisa ser implementada. 00100 */ 00101 void setMD5Calculation( char *, bool ) {}; 00102 /** 00103 * Funcao nao usada, mas que precisa ser implementada. 00104 */ 00105 void setSyncCheck( char *, bool ) {}; 00106 }; 00107 00108 // Define a classe principal do modulo. 00109 class CServerInterface 00110 { 00111 private: 00112 // Variavel usada para indicar se o objeto foi inicializado (ou seja, 00113 // se uma conexo ativa com o servidor RIO foi criada). 00114 bool m_Started; 00115 // Ponteiro para o objeto com as informacoes do servidor do apache 00116 // (usado somente para impressao) 00117 server_rec *m_Server; 00118 // Ponteiro para a sessao associada a copia. 00119 CRioSession *m_Session; 00120 // Valor com o identificador da sessao atualmente aberta (se existir). 00121 // Se nenhuma sessao existir, o valor do identificador sera 0. 00122 unsigned int m_SessionId; 00123 // Valor default para as sessoes. Se for 0 (o padrao), um identificador 00124 // aleatorio sera usado mas se for diferente de 0, este identificador 00125 // sempre sera usado. 00126 unsigned int m_DefaultSessionId; 00127 // Variavel booleana que indica se uma sessao foi aberta. 00128 bool m_isSessionOpen; 00129 // Ponteiro para o stream associado a copia. 00130 CRioStream *m_Stream; 00131 // Variavel booleana que indica se um stream foi aberto. 00132 bool m_isStreamOpen; 00133 // Objeto associado ao arquivo a ser copiado. 00134 CRioObject *m_Object; 00135 // Variavel booleana que indica se um objeto foi aberto. 00136 bool m_isObjectOpen; 00137 // Servidor que sera usado pela conexao. Se o arquivo .rio estiver 00138 // vazio ou nao existir, sera usado o servidor default definido pela 00139 // configuracao do modulo. 00140 char *m_ServerName; 00141 // Nome do arquivo que esta sendo copiado. Ele e passado como parametro 00142 // para o modulo (parametro args de m_Request. 00143 // Obs: Se necessario, podemos futuramente mudar isso, pois o modulo 00144 // possui acesso a todos os campos da requisicao. 00145 char *m_FileName; 00146 // Variaveis usadas para armazenar os erros ocorridos durante a copia 00147 // do arquivo. 00148 apr_status_t m_ApacheStatus; // Erro gerado pelas funcoes da biblioteca 00149 // do apache. 00150 int m_SystemStatus; // Erro gerado pelas funcoes da biblioteca do 00151 // sistema. 00152 RioResult m_RioStatus; // Erro gerado pelas funcoes da biblioteca do 00153 // RIO. 00154 // Buffer circular usado para armazenar os blocos lidos do servidor e 00155 // variaveis para controla-lo. 00156 CircularBuffer *m_CircularBuffer; 00157 // Define o tamanho (numero de entradas) do buffer circular. Cada 00158 // entrada tem o tamanho de um bloco do servidor. 00159 unsigned int m_CircularBufferSize; 00160 // Buffer para armazenar o ultimo bloco lido (ou, no futuro, escrito) do 00161 // (para) o servidor RIO (antes de copia-lo para o buffer circular, no 00162 // caso da leitura? ou vamos tambem usar o buffer na escrita?). 00163 char *m_RioBuffer; 00164 // Buffer para armazenar o proximo bloco a ser enviado (ou, no futuro, 00165 // ser recebido) para (do) cliente. 00166 char *m_ApacheBuffer; 00167 // Numero do proximo bloco do arquivo a ser lido(ou escrito) do (no) 00168 // servidor RIO. 00169 RioBlock m_RioBlock; 00170 // Numero do proximo bloco do arquivo a ser enviado ao cliente. 00171 RioBlock m_SendBlock; 00172 // Numero total de blocos do arquivo a ser copiado para o cliente. 00173 unsigned int m_TotalBlocks; 00174 // Tamanho de cada bloco. 00175 unsigned int m_BlockSize; 00176 // Tamanho de cada fragmento enviado ao cliente. 00177 unsigned int m_FragmentSize; 00178 // Indica se uma copia para o cliente esta em progresso. 00179 bool m_isReadingRioFile; 00180 // Variavel de condicao usada pela thread de copia para esperar pelo 00181 // inicio da copia de blocos para o cliente. 00182 pthread_cond_t m_ReadRioStarted; 00183 // Variavel de condicao usada pelas funcoes que iniciam a copia para 00184 // esperar que a thread de copia para o cliente bloqueie em 00185 // m_ReadRioStarted. 00186 pthread_cond_t m_ThreadBlocked; 00187 // Mutex e variavel de condicao usadas ao copiarmos os blocos atraves 00188 // de uma conexao em tempo real. O mutex somente foi criado para 00189 // podermos usar a funcao da variavel de condicao que permite uma 00190 // espera com timeout, necessaria para esperarmos pelo bloco por um 00191 // dado intervalo de tempo. 00192 pthread_mutex_t m_ReadWriteMutex; // Mutex usado pela leitura e pela 00193 // escrita do bloco do RIO. 00194 pthread_cond_t m_ReadWriteCond; // Variavel de condicao usada pela 00195 // leitura e pela escrita do bloco. 00196 // Identificador da thread usada para copiar os blocos do servidor e 00197 // coloca-los no buffer circular. 00198 pthread_t m_ReadRioThread; 00199 // Variavel usada para indicar se devemos parar a execucao da thread. 00200 bool m_ThreadCanceled; 00201 // Mutex para acesso exclusivo as variaveis da classe. 00202 pthread_mutex_t m_Mutex; 00203 // Ponteiro para o objeto da classe RioExplorer, responsavel por 00204 // executar os outros comandos diferentes da copia. 00205 CModuleRioExplorer *m_RioExplorer; 00206 // Armazena o nome do usuario associado a sessao ativa. 00207 char *m_UserName; 00208 // Tamanho do bloco ultimo bloco lido pelo apache (quando m_IsApacheEof 00209 // for igual a true). 00210 unsigned int m_LastApacheBlockSize; 00211 // Define se a copia dos blocos do apache terminou 00212 bool m_IsApacheEof; 00213 // Ponteiro para a requisicao associada ao comando upload. 00214 request_rec *m_UploadRequest; 00215 // Indica se uma copia do cliente esta em progresso. 00216 bool m_isReadingApacheFile; 00217 // Variavel de condicao usada pela thread de copia para esperar pelo 00218 // inicio da copia de blocos para o cliente. 00219 pthread_cond_t m_ReadApacheStarted; 00220 // Identificador da thread usada para copiar os blocos do cliente e 00221 // coloca-los no buffer circular. 00222 pthread_t m_ReadApacheThread; 00223 // Porta UDP usada pelo objeto da classe que salva os logs dos comandos. 00224 unsigned int m_ExecLogPort; 00225 00226 /** 00227 * Funcao para enviar dados ao cliente, armazenados no buffer passado 00228 * no parametro Data. O numero de bytes e dado em DataSize. Os dados 00229 * serao enviados em fragmentos de tamanho de no maximo m_FragmentSize 00230 * bytes (note que o ultimo fragmento pode ser menor, caso DataSize nao 00231 * seja multiplo de m_FragmentSize). 00232 * @param Request ponteiro para a requisicao pela qual enviaremos o 00233 * bloco. 00234 * @param Data ponteiro para o buffer com os dados (o bloco atual). 00235 * @param DataSize tamanho dos dados (quando a implementacao estiver 00236 * completa, este tamanho sera igual ao do bloco para os blocos 00237 * intermediarios mas podera nao ser este tamanho para o bloco inicial - 00238 * caso a copia nao comece no inicio do arquivo - e para o bloco final - 00239 * pois o tamanho do arquivo nao e necessariamente multiplo do bloco-). 00240 * @return true se os dados foram enviados com sucesso e false em caso 00241 * contrario (neste caso, m_ApacheStatus indicara o erro que ocorreu). 00242 */ 00243 bool SendBlock( request_rec *Request, const char *Data, 00244 unsigned int DataSize ); 00245 /** 00246 * Funcao para receber dados do cliente, os armazenando no buffer 00247 * passado no parametro Data, sendo que no maximo DataSize bytes 00248 * serao recebidos. 00249 * @param Request ponteiro para a requisicao da qual receberemos o 00250 * bloco. 00251 * @param Data ponteiro para o buffer com os dados (o bloco atual). 00252 * @param DataSize ponteiro para o tamanho maximo dos dados. Este 00253 * parametro sera alterado pela funcao para o numero de bytes 00254 * realmente lidos do cliente (este valor pode ser menor do que o 00255 * valor passado, se o cliente enviou menos dados do que o desejado). 00256 * @param IsEOF ponteiro para um valor booleano que, se for igual a 00257 * true, indicara que o bloco lido e o ultimo lido do apache e, em caso 00258 * contrario, que mais blocos ainda devem ser lidos do apache. 00259 * @return true se os dados foram recebidos com sucesso e false em caso 00260 * contrario (neste caso, m_ApacheStatus indicara o erro que ocorreu). 00261 */ 00262 bool ReceiveBlock( request_rec *Request, char *Data, 00263 unsigned int *DataSize, bool *IsEOF ); 00264 /** 00265 * Funcao para terminar o envio de dados ao client. 00266 * @param Request ponteiro para a requisicao associada a copia (de/para 00267 * o servidor) de um arquivo. 00268 * @return true se a copia foi terminada com sucesso, ou false em caso 00269 * contrario (neste caso, m_ApacheStatus indicara o erro que ocorreu). 00270 */ 00271 bool TerminateCopyToClient( request_rec *Request ); 00272 /** 00273 * Funcao para abrir a sessao com o servidor RIO, com o servidor dado 00274 * pelo parametro m_ServerName. 00275 * @param ServerName ponteiro para o nome do servidor RIO. 00276 * @param UserName ponteiro para o nome do usuario do RIO. 00277 * @param UserPassword ponteiro para a senha do usuario apontado por 00278 * UserName. 00279 * @return true se a sessao foi criada com sucesso e false em caso 00280 * contrario (neste caso, m_RioStatus indicara o erro que ocorreu). 00281 */ 00282 bool OpenRioSession( const char *ServerName, const char *UserName, 00283 const char *UserPassword ); 00284 /** 00285 * Funcao para fechar a sessao apontada por m_Session. 00286 * @return true se a sessao foi fechada com sucesso e false em caso 00287 * contrario (neste caso, m_RioStatus indicara o erro que ocorreu). 00288 */ 00289 bool CloseRioSession(); 00290 /** 00291 * Funcao para abrir um stream associado a sessao apontada pelo 00292 * ponteiro m_Session. 00293 * @return true se o stream foi criada com sucesso e false em caso 00294 * contrario (neste caso, m_RioStatus indicara o erro que ocorreu). 00295 */ 00296 bool OpenRioStream( RioStreamDirection Direction ); 00297 /* Funcao para fechar o stream apontado por m_Stream. 00298 * @param Direction direcao do stream (leitura, escrita e 00299 * leitura/escrita). 00300 * @return true se o stream foi fechada com sucesso e false em caso 00301 * contrario (neste caso, m_RioStatus indicara o erro que ocorreu). 00302 */ 00303 bool CloseRioStream(); 00304 /* 00305 * Funcao para abrir um objeto do RIO, cujo nome de caminho no RIO e 00306 * dado pelo parametro FileName. 00307 * @param FileName ponteiro para o caminho do objeto a ser aberto. 00308 * @param Access tipo de acesso desejado ao objeto. 00309 * @return true se o objeto foi aberto com sucesso e false em caso 00310 * contrario (neste caso, m_RioStatus indicara o erro que ocorreu). 00311 */ 00312 bool OpenRioObject( const char *FileName, RioAccess Access ); 00313 /* 00314 * Funcao para fechar um objeto do RIO, cujo objeto e apontado pelo 00315 * ponteiro m_Object. 00316 * @return true se o objeto foi fechado com sucesso e false em caso 00317 * contrario (neste caso, m_RioStatus indicara o erro que ocorreu). 00318 */ 00319 bool CloseRioObject(); 00320 00321 /** 00322 * Funcao para gerar um sinal para a variavel de condicao m_CopyCond 00323 * (esta funcao e usada pela callback chamada apos o recebimento de 00324 * um bloco). 00325 * @return true se o sinal foi enviado com sucesso e false se algum 00326 * erro ocorreu ao enviar o sinal. 00327 */ 00328 bool SendSignal(); 00329 00330 /** 00331 * Funcao de callback executada apos a leitura (com sucesso ou nao) do 00332 * bloco. 00333 * @param Request ponteiro para o pedido do bloco. 00334 */ 00335 static void ReadCallBack( RioRequest *Request ); 00336 00337 /** 00338 * Funcao de callback executada apos a escrita (com sucesso ou nao) do 00339 * bloco. 00340 * @param Request ponteiro para o pedido do bloco. 00341 */ 00342 static void WriteCallBack( RioRequest *Request ); 00343 00344 /* 00345 * Funcao para ler um bloco do RIO, cujo objeto e apontado pelo ponteiro 00346 * m_Object. 00347 * @param Block bloco a ser lido do arquivo. 00348 * @return true se o bloco foi lido com sucesso e copiado para o buffer 00349 * apontado por m_RioBuffer, e false em caso contrario (neste caso, 00350 * m_RioStatus indicara o erro que ocorreu). 00351 */ 00352 bool ReadRioObjectBlock( RioBlock Block ); 00353 /* 00354 * Funcao para salvar um bloco no RIO, cujo objeto e apontado pelo 00355 * ponteiro m_Object. 00356 * @param Block bloco a ser salvo no arquivo. 00357 * @param Md5Sum ponteiro para a string com o MD5 do arquivo que esta 00358 * sendo salvo. 00359 * @param UsedBlockSize numero de bytes usados do bloco. Se o bloco nao 00360 * for o ultimo bloco do arquivo, este parametro sempre devera ser igual 00361 * ao tamanho do arquivo. No caso do ultimo bloco, o parametro e igual 00362 * ao numero de bytes finais do arquivo, e somente sera igual ao tamanho 00363 * do bloco se o tamanho do arquivo for multiplo do tamanho do bloco. 00364 * @param ActualFileSize ponteiro para o tamanho atual do arquivo que 00365 * ja foi copiado. 00366 * @return true se o bloco foi salvo com sucesso, e false em caso 00367 * contrario (neste caso, m_RioStatus indicara o erro que ocorreu). 00368 */ 00369 bool WriteRioObjectBlock( RioBlock Block, char *Md5Sum, 00370 RioObjectSize UsedBlockSize, 00371 RioObjectSize *ActualFileSize ); 00372 00373 /** 00374 * Funcao usada pela thread que copia os blocos para o cliente. A funcao 00375 * simplesmente converte o ponteiro e depois chama a funcao 00376 * ReadRioThreadFunction. 00377 * @param Class ponteiro para o objeto da classe que criou a thread. 00378 * @return valor nulo. 00379 */ 00380 static void *ReadRioThreadFunctionEp( void *Class ); 00381 00382 /** 00383 * Funcao usada pela thread que copia os blocos para o cliente. 00384 * @param Class ponteiro para o objeto da classe que criou a thread. 00385 * @return valor nulo. 00386 */ 00387 void ReadRioThreadFunction(); 00388 00389 /** 00390 * Funcao usada pela thread que recebe os blocos do cliente. A funcao 00391 * simplesmente converte o ponteiro e depois chama a funcao 00392 * ReadApacheThreadFunction. 00393 * @param Class ponteiro para o objeto da classe que criou a thread. 00394 * @return valor nulo. 00395 */ 00396 static void *ReadApacheThreadFunctionEp( void *Class ); 00397 00398 /** 00399 * Funcao usada pela thread que copia os blocos do cliente. 00400 * @param Class ponteiro para o objeto da classe que criou a thread. 00401 * @return valor nulo. 00402 */ 00403 void ReadApacheThreadFunction(); 00404 00405 /** 00406 * Funcao para tratar da execucao do comando login (ou seja, se logar no 00407 * servidor e inicializar as variaveis que dependem da conexao e criar e 00408 * inicializar os objetos que tambem dependem da conexao). 00409 * @param Request ponteiro para a requisicao associada a conexao http 00410 * com o cliente. 00411 * @param UserName nome do usuario para o qual desejamos abrir uma 00412 * sessao. 00413 * @param UserPassword senha do usuario UserName no servidor. 00414 * @return true se a conexao foi aberta com sucesso e false em caso 00415 * contrario (as variaveis m_RioStatus, m_ApacheStatus e m_SystemStatus 00416 * indicarao qual foi o erro). 00417 */ 00418 bool Connect( request_rec *Request, const char *UserName, 00419 const char *UserPassword ); 00420 00421 /** 00422 * Funcao para fechar a sessao ativa (e o objeto e stream ativo) e 00423 * remover todos as estruturas associadas a sessao atual). 00424 * @return true se a conexao foi fechada com sucesso e false em caso 00425 * contrario (as variaveis m_RioStatus, m_ApacheStatus e m_SystemStatus 00426 * indicarao qual foi o erro). 00427 */ 00428 bool Disconnect(); 00429 00430 /** 00431 * Funcao para gerar o inicio do xml, usando uma TAG composta por 00432 * rioexec mais, se existir, o nome do comando. 00433 * @param Request ponteiro para a requisicao associada a conexao http 00434 * com o cliente. 00435 * @param CommandId Identificador do comando executado. Se o comando for 00436 * CMD_INV_ID (na verdade, qualquer valor maior ou igual a este), a TAG 00437 * sera rioexec. Porem, caso o valor seja menor do que CMD_INV_ID, a 00438 * TAG sera rioexec_<commando>, onde commando sera obtido da posicao 00439 * CommandId da tabela CommandTable dada em ServerInterface.cpp. 00440 */ 00441 static void StartXML( request_rec *Request, unsigned int CommandId ); 00442 00443 /** 00444 * Gera a parte do XML (o comando <session id="0" [erros] </session>) 00445 * para os erros passados como parametros. 00446 * @param Request ponteiro para a requisicao associada a conexao http 00447 * com o cliente. 00448 * @param ApacheStatus codigo de erro do Apache. Somente sera colocado 00449 * no XML se for diferente de APR_SUCCESS. 00450 * @param SystemStatus codigo de erro do sistema. Somente sera colocado 00451 * no XML se for diferente de 0. 00452 * @param RioStatus codigo de erro do RIO. Somente sera colocado no XML 00453 * se for diferente de S_OK. 00454 */ 00455 static void AddErrorToXML( request_rec *Request, 00456 apr_status_t ApacheStatus, int SystemStatus, 00457 RioResult RioStatus ); 00458 00459 /** 00460 * Adiciona o estado da execucao de um comando a um xml que esta sendo 00461 * gerado (o estado e composto pela id se nenhum erro ocorreu ou por uma 00462 * id igual a 0 e os erros caso eles tenham ocorrido). 00463 * @param Request ponteiro para a requisicao associada a conexao http 00464 * com o cliente. 00465 * @param SessionId identificador da sessao a ser usado caso nao exista 00466 * nenhum erro reportado no objeto. 00467 */ 00468 void AddStatusToXML( request_rec *Request, 00469 unsigned int SessionId ); 00470 00471 /** 00472 * Funcao para gerar o final do xml, usando uma TAG composta por rioexec 00473 * mais, se existir, o nome do comando. 00474 * @param Request ponteiro para a requisicao associada a conexao http 00475 * com o cliente. 00476 * @param CommandId Identificador do comando executado. Se o comando for 00477 * CMD_INV_ID (na verdade, qualquer valor maior ou igual a este), a TAG 00478 * sera rioexec. Porem, caso o valor seja menor do que CMD_INV_ID, a 00479 * TAG sera rioexec_<commando>, onde commando sera obtido da posicao 00480 * CommandId da tabela CommandTable dada em ServerInterface.cpp. 00481 */ 00482 static void EndXML( request_rec *Request, unsigned int CommandId ); 00483 00484 /** 00485 * Funcao para gerar o estado da execucao dos comandos que nao retornam 00486 * informacoes no XML diferente do estado (isto e, todos os comandos com 00487 * excecao do sessions e do ls), usando uma TAG composta por rioexec 00488 * mais, se existir, o nome do comando. 00489 * @param Request ponteiro para a requisicao associada a conexao http 00490 * com o cliente. 00491 * @param CommandId Identificador do comando executado. Se o comando for 00492 * CMD_INV_ID (na verdade, qualquer valor maior ou igual a este), a TAG 00493 * sera rioexec. Porem, caso o valor seja menor do que CMD_INV_ID, a 00494 * TAG sera rioexec_<commando>, onde commando sera obtido da posicao 00495 * CommandId da tabela CommandTable dada em ServerInterface.cpp. 00496 * @param SessionId identificador da sessao a ser usado caso nao exista 00497 * nenhum erro reportado no objeto. 00498 */ 00499 void GenerateXMLStatus( request_rec *Request, unsigned int CommandId, 00500 unsigned int SessionId ); 00501 00502 /** 00503 * Gera uma linha no log da classe que executa os comandos. 00504 * @param Request ponteiro para a requisicao associada a conexao http 00505 * com o cliente. 00506 * @param UserName nome do usuario a ser salvo no log. 00507 * @param SessionId identificador de sessao a ser salvo no log. 00508 * @param ApacheStatus codigo de erro do Apache. Somente sera colocado 00509 * no XML se for diferente de APR_SUCCESS. 00510 * @param SystemStatus codigo de erro do sistema. Somente sera colocado 00511 * no XML se for diferente de 0. 00512 * @param RioStatus codigo de erro do RIO. Somente sera colocado no XML 00513 * se for diferente de S_OK. 00514 * @param Command ponteiro para a string com o comando. 00515 * @param ExecPort porta UDP usado para enviar os logs para a classe de 00516 * logs associada com a classe que executa os comandos. 00517 */ 00518 static void GenerateExecLogLine( request_rec *Request, 00519 const char *UserName, 00520 unsigned int SessionId, 00521 apr_status_t ApacheStatus, 00522 int SystemStatus, RioResult RioStatus, 00523 const char *Command, 00524 unsigned int ExecPort ); 00525 00526 /** 00527 * Funcao para gerar uma linha no log dos comandos, usando a porta 00528 * definida na classe (se o valor for 0, nenhum log sera gerado), e os 00529 * erros da classe (a funcao estatica GenerateExecLogLine e usada ao 00530 * gerar os logs). 00531 * @param Request ponteiro para a requisicao associada a conexao http 00532 * com o cliente. 00533 * @param Command ponteiro para a string com o comando. 00534 */ 00535 void SaveExecLogLine( request_rec *Request, const char *Command ); 00536 00537 /** 00538 * Funcao para efetivamente executar o comando login, chamando a funcao 00539 * Connect para efetuar o login no servidor e depois o XML com o 00540 * resultado do comando. 00541 * @param Request ponteiro para a requisicao associada a conexao http 00542 * com o cliente. 00543 * @param Params lista de parametros do comando, terminada em NULL. O 00544 * primeiro parametro (o 0) sempre e o comando. 00545 * @return true se a comando foi executado com sucesso e false em caso 00546 * contrario (as variaveis m_RioStatus, m_ApacheStatus e m_SystemStatus 00547 * indicarao qual foi o erro). 00548 */ 00549 bool ExecuteLoginCommand( request_rec *Request, char **Params ); 00550 00551 /** 00552 * Funcao para efetivamente executar o comando quit, usado para 00553 * finalizar uma conexao ativa com o servidor RIO. 00554 * @param Request ponteiro para a requisicao associada a conexao http 00555 * com o cliente. 00556 * @param Params lista de parametros do comando, terminada em NULL. O 00557 * primeiro parametro (o 0) sempre e o comando. 00558 * @return true se a comando foi executado com sucesso e false em caso 00559 * contrario (as variaveis m_RioStatus, m_ApacheStatus e m_SystemStatus 00560 * indicarao qual foi o erro). 00561 */ 00562 bool ExecuteQuitCommand( request_rec *Request, char **Params ); 00563 00564 /** 00565 * Funcao para efetivamente executar o comando session, usado para 00566 * mostrar as informacoes sobre as sessoes do servidor RIO. 00567 * @param Request ponteiro para a requisicao associada a conexao http 00568 * com o cliente. 00569 * @param Params lista de parametros do comando, terminada em NULL. O 00570 * primeiro parametro (o 0) sempre e o comando. 00571 * @return true se a comando foi executado com sucesso e false em caso 00572 * contrario (as variaveis m_RioStatus, m_ApacheStatus e m_SystemStatus 00573 * indicarao qual foi o erro). 00574 */ 00575 bool ExecuteSessionsCommand( request_rec *Request, char **Params ); 00576 00577 /** 00578 * Funcao para efetivamente executar o comando ls, usado para 00579 * mostrar as informacoes sobre um diretorio do servidor RIO. 00580 * @param Request ponteiro para a requisicao associada a conexao http 00581 * com o cliente. 00582 * @param Params lista de parametros do comando, terminada em NULL. O 00583 * primeiro parametro (o 0) sempre e o comando. 00584 * @return true se a comando foi executado com sucesso e false em caso 00585 * contrario (as variaveis m_RioStatus, m_ApacheStatus e m_SystemStatus 00586 * indicarao qual foi o erro). 00587 */ 00588 bool ExecuteLsCommand( request_rec *Request, char **Params ); 00589 00590 /** 00591 * Funcao para converter um caminho com ".", ".." e multiplas "/" 00592 * consecutivas em um caminho sem o ".", ".." e com somente uma "/" 00593 * entre os componentes. 00594 * @param Request ponteiro para a requisicao associada a conexao http 00595 * com o cliente. 00596 * @param OriginalPath string com o caminho a ser convertido. 00597 * @param ConvertedPath string que armazenara o caminho convertido. 00598 * @param ConvertedPathSize numero maximo de caracteres que podem 00599 * existir no caminho convertido (sem contar o terminador). 00600 * @return true se o caminho foi convertido com sucesso e false caso 00601 * algum erro ocorreu (a variavel m_RioStatus indicara qual foi o erro). 00602 */ 00603 bool ConvertPath( request_rec *Request, char *OriginalPath, 00604 char *ConvertedPath, unsigned int ConvertedPathSize ); 00605 00606 /** 00607 * Funcao para efetivamente executar o comando rm, usado para remover 00608 * um arquivo ou um diretorio (de modo recursivo). 00609 * @param Request ponteiro para a requisicao associada a conexao http 00610 * com o cliente. 00611 * @param Params lista de parametros do comando, terminada em NULL. O 00612 * primeiro parametro (o 0) sempre e o comando. 00613 * @return true se a comando foi executado com sucesso e false em caso 00614 * contrario (as variaveis m_RioStatus, m_ApacheStatus e m_SystemStatus 00615 * indicarao qual foi o erro). 00616 */ 00617 bool ExecuteRmCommand( request_rec *Request, char **Params ); 00618 00619 /** 00620 * Funcao para efetivamente executar o comando mkdir, usado para criar 00621 * um diretorio. 00622 * @param Request ponteiro para a requisicao associada a conexao http 00623 * com o cliente. 00624 * @param Params lista de parametros do comando, terminada em NULL. O 00625 * primeiro parametro (o 0) sempre e o comando. 00626 * @return true se a comando foi executado com sucesso e false em caso 00627 * contrario (as variaveis m_RioStatus, m_ApacheStatus e m_SystemStatus 00628 * indicarao qual foi o erro). 00629 */ 00630 bool ExecuteMkdirCommand( request_rec *Request, char **Params ); 00631 00632 /** 00633 * Funcao para cancelar uma copia em andamento. 00634 * @param Request ponteiro para a requisicao associada a conexao http 00635 * com o cliente. 00636 * @return true se a copia foi cancelada com sucesso ou false se algum 00637 * erro ocorreu ao cancelar a copia. 00638 */ 00639 bool FinalizeCopy( request_rec *Request ); 00640 00641 /** 00642 * Funcao para fechar o ultimo arquivo aberto, terminando qualquer 00643 * copia em andamento. 00644 * @param Request ponteiro para a requisicao associada a conexao http 00645 * com o cliente. 00646 * @return true se o arquivo foi fechado com sucesso ou false se algum 00647 * erro ocorreu ao fecharmos o arquivo. 00648 */ 00649 bool Close( request_rec *Request ); 00650 00651 /** 00652 * Funcao para enviar um cabecalho antes dos dados do arquivo, caso o 00653 * arquivo necessite do envio deste cabecalho. 00654 * @param Request ponteiro para a requisicao associada a conexao http 00655 * com o cliente. 00656 * @param FileName nome do arquivo que desejamos avaliar se o envio do 00657 * cabecalho e necessario. 00658 * @param FileSize variavel com o tamanho do arquivo, para sabermos como 00659 * calcular o tamanho a ser colocado no campo da resposta que define o 00660 * tamanho do arquivo. 00661 * @return true a funcao foi executada com sucesso e false, em caso 00662 * contrario, ou seja, se foi necessario enviar o cabecalho mais um 00663 * erro ocorreu ao fazermos isso. 00664 */ 00665 bool SendFileHeader( request_rec *Request, const char *FileName, 00666 RioObjectSize FileSize ); 00667 00668 /** 00669 * Funcao para abrir um arquivo do servidor RIO para copiar os seus 00670 * blocos para o cliente. 00671 * @param Request ponteiro para a requisicao associada a conexao http 00672 * com o cliente. 00673 * @param FileName ponteiro para o nome do arquivo a ser aberto. 00674 * @param SendXML ponteiro para um valor booleano que, depois da 00675 * execucao da funcao, sera true se um XML deve ser enviado em caso de 00676 * erro ou igual a false em caso contrario. 00677 * @param StartPosition posicao do byte inicial do arquivo a ser 00678 * copiado. Se nao for usado, a posicao inicial sera 0, o primeiro byte 00679 * do arquivo 00680 * @param SendHeader se for igual a true, deveremos enviar um cabecalho 00681 * (atualmente, somente para os arquivos .flv) se StartPosition for 00682 * diferente de 0. 00683 * @return OK se a copia foi executada com sucesso ou o codigo adequado 00684 * do protocolo HTTP em caso contrario. 00685 */ 00686 int DownloadFile( request_rec *Request, const char *FileName, 00687 bool *SendXML, RioObjectSize StartPosition = 0, 00688 bool SendHeader = false ); 00689 00690 /** 00691 * Funcao para verificar se o usuario da sessao atualmente aberta tem 00692 * permissao para acessar um diretorio de um arquivo a ser lido/criado. 00693 * @param FileName ponteiro para o nome do objeto cujo caminho 00694 * desejamos verificar. 00695 * @return true se o arquivo pode ser acessado ou false se nao pode ser 00696 * acessado ou caso algum outro erro tenha ocorrido. 00697 */ 00698 bool CheckDirectoryPermission( char *FileName ); 00699 00700 /** 00701 * Funcao para efetivamente executar o comando download, usado para 00702 * enviar um arquivo do servidor para o cliente. 00703 * @param Request ponteiro para a requisicao associada a conexao http 00704 * com o cliente. 00705 * @param Params lista de parametros do comando, terminada em NULL. O 00706 * primeiro parametro (o 0) sempre e o comando. 00707 * @param TotalParams numero de parametros passados ao comando. 00708 * @return OK se nenhum erro ocorreu ou o erro do protocolo http caso 00709 * algum erro ocorra. 00710 */ 00711 int ExecuteDownloadCommand( request_rec *Request, char **Params, 00712 unsigned int TotalParams ); 00713 00714 /** 00715 * Funcao para efetivamente executar o comando mv, usado para criar um 00716 * diretorio. 00717 * @param Request ponteiro para a requisicao associada a conexao http 00718 * com o cliente. 00719 * @param Params lista de parametros do comando, terminada em NULL. O 00720 * primeiro parametro (o 0) sempre e o comando. 00721 * @return true se a comando foi executado com sucesso e false em caso 00722 * contrario (as variaveis m_RioStatus, m_ApacheStatus e m_SystemStatus 00723 * indicarao qual foi o erro). 00724 */ 00725 bool ExecuteMvCommand( request_rec *Request, char **Params ); 00726 00727 /** 00728 * Funcao para criar um arquivo no servidor RIO com os seus bytes 00729 * enviados pelo cliente. 00730 * @param Request ponteiro para a requisicao associada a conexao http 00731 * com o cliente. 00732 * @param FileName ponteiro para o nome do arquivo a ser aberto. 00733 * @param FileMd5sum ponteiro para o valor MD5 do arquivo a ser criado e 00734 * copiado para o servidor 00735 * @return true se a copia foi cancelada com sucesso ou false se algum 00736 * erro ocorreu ao copiar o arquivo do cliente. 00737 */ 00738 bool UploadFile( request_rec *Request, const char *FileName, 00739 char *FileMd5sum ); 00740 00741 /** 00742 * Funcao para efetivamente executar o comando upload, usado para 00743 * enviar um arquivo do cliente para o servidor. 00744 * @param Request ponteiro para a requisicao associada a conexao http 00745 * com o cliente. 00746 * @param Params lista de parametros do comando, terminada em NULL. O 00747 * primeiro parametro (o 0) sempre e o comando. 00748 * @return true se a copia foi cancelada com sucesso ou false se algum 00749 * erro ocorreu ao copiar o arquivo do cliente. 00750 */ 00751 bool ExecuteUploadCommand( request_rec *Request, char **Params ); 00752 00753 /** 00754 * Funcao para efetivamente executar o comando adduser, que cria um novo 00755 * usuario no servidor RIO. 00756 * @param Request ponteiro para a requisicao associada a conexao http 00757 * com o cliente. 00758 * @param Params lista de parametros do comando, terminada em NULL. O 00759 * primeiro parametro (o 0) sempre e o comando. 00760 * @return true se a comando foi executado com sucesso e false em caso 00761 * contrario (as variaveis m_RioStatus, m_ApacheStatus e m_SystemStatus 00762 * indicarao qual foi o erro). 00763 */ 00764 bool ExecuteAdduserCommand( request_rec *Request, char **Params ); 00765 00766 /** 00767 * Funcao para efetivamente executar o comando deluser, que remove um 00768 * usuario do servidor RIO. 00769 * @param Request ponteiro para a requisicao associada a conexao http 00770 * com o cliente. 00771 * @param Params lista de parametros do comando, terminada em NULL. O 00772 * primeiro parametro (o 0) sempre e o comando. 00773 * @return true se a comando foi executado com sucesso e false em caso 00774 * contrario (as variaveis m_RioStatus, m_ApacheStatus e m_SystemStatus 00775 * indicarao qual foi o erro). 00776 */ 00777 bool ExecuteDeluserCommand( request_rec *Request, char **Params ); 00778 00779 /** 00780 * Funcao para efetivamente executar o comando passwd, que muda a senha 00781 * de um usuario do RIO. 00782 * @param Request ponteiro para a requisicao associada a conexao http 00783 * com o cliente. 00784 * @param Params lista de parametros do comando, terminada em NULL. O 00785 * primeiro parametro (o 0) sempre e o comando. 00786 * @return true se a comando foi executado com sucesso e false em caso 00787 * contrario (as variaveis m_RioStatus, m_ApacheStatus e m_SystemStatus 00788 * indicarao qual foi o erro). 00789 */ 00790 bool ExecutePasswdCommand( request_rec *Request, char **Params ); 00791 00792 /** 00793 * Funcao para efetivamente executar o comando userlist, que retorna a 00794 * lista com todos os usuarios do RIO. 00795 * @param Request ponteiro para a requisicao associada a conexao http 00796 * com o cliente. 00797 * @param Params lista de parametros do comando, terminada em NULL. O 00798 * primeiro parametro (o 0) sempre e o comando. 00799 * @return true se a comando foi executado com sucesso e false em caso 00800 * contrario (as variaveis m_RioStatus, m_ApacheStatus e m_SystemStatus 00801 * indicarao qual foi o erro). 00802 */ 00803 bool ExecuteUserListCommand( request_rec *Request, char **Params ); 00804 00805 public: 00806 /** 00807 * Construtor da classe RioModule, para criar um novo objeto desta 00808 * classe. 00809 * @param Server ponteiro para a estrutura do servidor. 00810 */ 00811 CServerInterface( server_rec *Server ); 00812 00813 /** 00814 * Destrutor da classe RioModule, usado quando um objeto e removido. 00815 */ 00816 ~CServerInterface(); 00817 00818 /** 00819 * Funcao para inicializar o objeto da classe RioModule (ou seja, abrir 00820 * a conexao e o stream). 00821 * @param ServerName nome do servidor a que vamos nos conectar. 00822 * @param CircularBufferSize numero de entradas do buffer de recepcao. 00823 * @param FragmentSize tamanho dos fragmentos enviados ao cliente. 00824 * @param DefaultSessionId valor default para o identificador da sessao. 00825 * Se for igual a 0 (o valor default, se o parametro nao for usado, um 00826 * identificador aleatorio sera usado. Porem, se for diferente de 0, o 00827 * identificador passado sempre sera usado. 00828 * @param ExecLogPort novo parametro indicando a porta UDP usada pelos 00829 * logs. O valor 0 default do parametro desabilita a geracao dos logs. 00830 * @return true se a inicializacao do objeto foi completada com sucesso 00831 * ou false em caso contrario. 00832 */ 00833 bool Start( char *ServerName, unsigned int CircularBufferSize, 00834 unsigned int FragmentSize, 00835 unsigned int DefaultSessionId = 0, 00836 unsigned int ExecLogPort = 0 ); 00837 /* 00838 * Funcao para parar o objeto da classe RioModule (ou seja, fechar a 00839 * conexao e o stream). 00840 * @return true se o objeto foi paradocom sucesso ou false em caso 00841 * contrario. 00842 */ 00843 bool Stop(); 00844 00845 /** Funcao para decodificar e executar todos os comandos do objeto da 00846 * classe, similares aos comandos do riosh. 00847 * @param Request ponteiro para a requisicao associada a conexao http 00848 * com o cliente. 00849 * @param Command ponteiro para a string com o comando 00850 * @param RemoveObject ponteiro para um valor booleando que, quando for 00851 * alterado para true indicara, a quem chamou a funcao, que o objeto 00852 * deve ser removido (isso acontecera quando o comando login falhar, ou 00853 * quando o comando quit, para terminar a conexao com o servidor, for 00854 * executado). 00855 * @param SessionId ponteiro para o endereco com o valor do Id associado 00856 * a sessao. No caso do comando login, o ponteiro devera ser NULL e, 00857 * nos outros comandos, devera ser diferente de NULL. 00858 * @return codigo do protocolo http que sera repassado ao cliente. Caso 00859 * ocorra algum erro, ele sera passado via arquivo de XML ao cliente 00860 * para todos os comandos com excecao dos comandos download e upload, 00861 * cujo codigo de erro sera retornado aqui. 00862 */ 00863 int ExecuteCommands( request_rec *Request, char *Command, 00864 bool *RemoveObject, 00865 unsigned int *SessionId ); 00866 /** 00867 * Funcao para retornar os codigos de erro caso alguma das funcoes 00868 * acima retorne false. O erro somente sera enviado se alguma das 00869 * variaveis indicarem um erro, ou seja, se ApacheStatus for diferente 00870 * de APR_SUCCESS, SystemStatus for diferente de 0, ou RioStatus for 00871 * diferente de S_OK. 00872 * @param ApacheStatus ponteiro para armazenar o codigo de erro do 00873 * Apache. Se for NULL, o erro nao sera armazenado. 00874 * @param SystemStatus ponteiro para armazenar o codigo de erro do 00875 * sistema. Se for NULL, o erro nao sera armazenado. 00876 * @param RioStatus ponteiro para armazenar o codigo de erro do RIO. Se 00877 * for NULL, o erro nao sera armazenado. 00878 */ 00879 void GetErrors( apr_status_t *ApacheStatus, int *SystemStatus, 00880 RioResult *RioStatus ); 00881 /** 00882 * Funcao para verificar se algum erro ocorreu ao executarmos uma das 00883 * funcoes da classe. 00884 * @return true se nenhum erro ocorreu ou false se algum erro ocorreu. 00885 */ 00886 bool NoError(); 00887 00888 /** 00889 * Gera o XML com os erros passados como parametro, usando a TAG 00890 * rioexec. 00891 * @param Request ponteiro para a requisicao associada a conexao http 00892 * com o cliente. 00893 * @param ApacheStatus codigo de erro do Apache. Somente sera colocado 00894 * no XML se for diferente de APR_SUCCESS. 00895 * @param SystemStatus codigo de erro do sistema. Somente sera colocado 00896 * no XML se for diferente de 0. 00897 * @param RioStatus codigo de erro do RIO. Somente sera colocado no XML 00898 * se for diferente de S_OK. 00899 */ 00900 static void GenerateXMLError( request_rec *Request, 00901 apr_status_t ApacheStatus, 00902 int SystemStatus, RioResult RioStatus ); 00903 00904 /** 00905 * Gera uma linha no log da classe que executa os comandos. O usuario 00906 * usado, neste caso, sera "none" e o identificador da sessao sera 00907 * 0. 00908 * @param Request ponteiro para a requisicao associada a conexao http 00909 * com o cliente. 00910 * @param ApacheStatus codigo de erro do Apache. Somente sera colocado 00911 * no XML se for diferente de APR_SUCCESS. 00912 * @param SystemStatus codigo de erro do sistema. Somente sera colocado 00913 * no XML se for diferente de 0. 00914 * @param RioStatus codigo de erro do RIO. Somente sera colocado no XML 00915 * se for diferente de S_OK. 00916 * @param Command ponteiro para a string com o comando. 00917 * @param ExecPort porta UDP usado para enviar os logs para a classe de 00918 * logs associada com a classe que executa os comandos. 00919 */ 00920 static void SaveExecLogLineError( request_rec *Request, 00921 apr_status_t ApacheStatus, 00922 int SystemStatus, RioResult RioStatus, 00923 const char *Command, 00924 unsigned int ExecPort ); 00925 00926 /** 00927 * Funcao para mostrar os codigos de erro no log do apache. Somente os 00928 * codigos com erro serao mostrados (ou seja, nao sera mostrado o erro 00929 * do apache se ele for APR_SUCCESS, nao sera mostrado o erro do sistema 00930 * se ele for 0, e nao sera mostrado o erro do RIO se ele for S_OK). 00931 */ 00932 void PrintErrors(); 00933 00934 /** 00935 * Funcao para obter um ponteiro para a requisicao HTTP associada ao 00936 * servidor apache2. 00937 * @return ponteiro para a estrutura do sevidor apache2. 00938 */ 00939 server_rec *GetServer(); 00940 }; 00941 00942 #endif /* __SERVERINSTANCE_H_*/ 00943