00001 /* 00002 * Copyright (C) 2009, 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 __MONITORWINDOW_H__ 00019 #define __MONITORWINDOW_H__ 00020 00021 #include <qdatetimeedit.h> 00022 #include <qbuttongroup.h> 00023 #include <qscrollview.h> 00024 #include <qmainwindow.h> 00025 #include <qworkspace.h> 00026 #include <qspinbox.h> 00027 #include <qtable.h> 00028 #include <qtimer.h> 00029 #include <qevent.h> 00030 #include <qlabel.h> 00031 #include <qcombobox.h> 00032 #include <qwidgetstack.h> 00033 00034 #include <qwt_scale_draw.h> 00035 #include <qwt_plot_curve.h> 00036 #include <qwt_plot.h> 00037 #include <qwt_data.h> 00038 #include <qwt_text.h> 00039 00040 #ifdef USE_QT_GRID 00041 #include <unistd.h> 00042 #endif 00043 00044 #include "RioQt.h" 00045 #include "RioInterface.h" 00046 00047 // Define a classe com o evento SearchLogsEvent, pois precisamos do tipo para 00048 // a funcao que processa este evento. 00049 class SearchLogsEvent; 00050 00051 // Define a classe MonitorWindow, pois precisamos do tipo para a estrutura 00052 // MonitorLogsData. 00053 class MonitorWindow; 00054 00055 // Estrutura usada pela callback que recebe os dados dos graficos. 00056 00057 struct MonitorLogsData 00058 { 00059 // Ponteiro para o objeto da classe MonitorWindow; 00060 MonitorWindow *Monitor; 00061 // Tipo da busca (usado para sabermos como o arquivo sera processado). 00062 unsigned int SearchType; 00063 // Nome do arquivo com o resultado da busca (usado para podermos saber qual 00064 // arquivo deve ser processado). 00065 char *ResultFileName; 00066 }; 00067 00068 class RioQt; 00069 00070 class ClientTable : public QTable 00071 { 00072 Q_OBJECT 00073 00074 public: 00075 ClientTable( QWidget *parent = 0 , const char *name = 0 ); 00076 void setTable( vector<ClientData> table ); 00077 00078 private: 00079 CSessionManager *m_manager; 00080 QTimer *timer; 00081 }; 00082 00083 class StorageTable : public QTable 00084 { 00085 Q_OBJECT 00086 00087 public: 00088 StorageTable( QWidget *parent = 0 , const char *name = 0 ); 00089 void setTable( vector<StorageData> table ); 00090 00091 private: 00092 CSessionManager *m_manager; 00093 QTimer timer; 00094 00095 private slots: 00096 void clear(); 00097 }; 00098 00099 // Classe que implementa o vetor com os pontos (derivada da classe abstrata 00100 // QwtData). 00101 class LogPoints : public QwtData 00102 { 00103 private: 00104 /** Vetor com os pontos do grafico. */ 00105 vector< QwtDoublePoint > Points; 00106 public: 00107 /** 00108 * Funcao para copiar os dados (faz uma copia do conteudo de um objeto 00109 * da classe). 00110 * @return um ponteiro para uma copia dos dados 00111 */ 00112 QwtData* copy() const; 00113 /** 00114 * Funcao para retornar o numero de pontos no vetor com os pontos. 00115 * @return Numero de pontos associados ao objeto. 00116 */ 00117 size_t size() const; 00118 /** 00119 * Funcao para retornar a abscissa da posicao i do vetor. 00120 * @param posicao i do vetor com os pontos. 00121 * @return valor da abscissa do ponto da posicao i. Se a posicao i nao 00122 * for valida, e retornado o valor -1. 00123 */ 00124 double x( size_t i ) const; 00125 /** 00126 * Funcao para retornar a ordenada da posicao i do vetor. 00127 * @param i posicao no vetor com os pontos. 00128 * @return valor da ordenada do ponto da posicao i. Se a posicao i nao 00129 * for valida, e retornado o valor -1. 00130 */ 00131 double y( size_t i ) const; 00132 /** 00133 * Funcao para alterar a abscissa da posicao i do vetor. 00134 * @param i posicao no vetor com os pontos. 00135 * @param valor da nova abscissa do ponto da posicao i. 00136 * @return true se a alteracao teve sucesso ou false em caso contrario 00137 * (se a posicao i nao for valida). 00138 */ 00139 bool push( double x, double y ); 00140 /** 00141 * Funcao para retornar a primeira abscissa do vetor. 00142 * @return valor da abscissa do primeiro ponto. Se o vetor estiver 00143 * vazio, e retornado o valor -1. 00144 */ 00145 double firstX(); 00146 /** 00147 * Funcao para retornar a primeira ordeanda do vetor. 00148 * @return valor da ordenada do primeiro ponto. Se o vetor estiver 00149 * vazio, e retornado o valor -1. 00150 */ 00151 double firstY(); 00152 /** 00153 * Funcao para retornar a ultima abscissa do vetor. 00154 * @return valor da abscissa do primeiro ponto. Se o vetor estiver 00155 * vazio, e retornado o valor -1. 00156 */ 00157 double lastX(); 00158 /** 00159 * Funcao para retornar a ultima ordeanda do vetor. 00160 * @return valor da ordenada do primeiro ponto. Se o vetor estiver 00161 * vazio, e retornado o valor -1. 00162 */ 00163 double lastY(); 00164 /** 00165 * Funcao para alterar a ultima abscissa do vetor. 00166 * @param x valor da nova abscissa ultimo ponto. 00167 * @return true se a alteracao teve sucesso ou false em caso contrario 00168 * (se a posicao i nao for valida). 00169 */ 00170 bool setLastX( double x ); 00171 /** 00172 * Funcao para alterar a ultima ordenada do vetor. 00173 * @param y valor da nova ordenada do ultimo ponto. 00174 * @return true se a alteracao teve sucesso ou false em caso contrario 00175 * (se a posicao i nao for valida). 00176 */ 00177 bool setLastY( double y ); 00178 /** 00179 * Funcao para limpar o vetor com os pontos. 00180 */ 00181 void clear(); 00182 }; 00183 00184 /** Novo tipo para definir o que imprimir no eixo x (o tempo ou a data). */ 00185 enum AxisLabel { DateLabel, TimeLabel }; 00186 00187 // Classe que plota o eixo x. 00188 class TimeScaleDraw : public QwtScaleDraw 00189 { 00190 /** Define o que sera impresso nos rotulos do eixo x. */ 00191 AxisLabel m_AxisLabel; 00192 public: 00193 /** 00194 * Construtor da classe, chamado ao criarmos um novo objeto desta classe. 00195 */ 00196 TimeScaleDraw(); 00197 /** 00198 * Retorna o valor atual da variavel m_AxisLabel, que indica se devemos 00199 * imprimir o componente data (Date) de um tempo ou o componente hora 00200 * ( Time ) deste tempo. 00201 * @return valor atual de m_AxisLabel. 00202 */ 00203 AxisLabel getAxisLabel( void ); 00204 /** 00205 * Altera o valor de m_AxisLabel, cujo significado foi definido na funcao 00206 * getAxisLabel. 00207 * @param Label novo valor para m_AxisLabel. 00208 */ 00209 void setAxisLabel( AxisLabel Label ); 00210 /** 00211 * Funcao que redefine o rotulo impresso pelo eixo x da classe (o default e 00212 * o de imprimir um numero -no formato e do printf- ). 00213 * @param v Numero cujo rotulo devemos determinar. No nosso caso, este 00214 * numero sera um tempo da funcao time do Linux (tempo em segundos desde 00215 * a Epoch (00:00:00 UTC, Janeiro 1 de 1970). 00216 * @return string com o rotulo. No nosso caso, dependendo de m_AxisLabel, 00217 * sera o componente data de v, impresso como "dia/mes", se m_AxisLabel for 00218 * Date, ou o componente hora de v, impresso como "hora:minuto" em caso 00219 * contrario (se m_AxisLabel for igual a Time). 00220 */ 00221 QwtText label( double v ) const; 00222 }; 00223 00224 // Classe que plota o grafico 00225 class LogPlot : public QwtPlot 00226 { 00227 private: 00228 /** Vetor com os pontos da curva atualmente no grafico. */ 00229 LogPoints Points; 00230 /** Ponteiro para a curva com o grafico atual. */ 00231 QwtPlotCurve *LogCurve; 00232 /** Classe que plota o eixo x. */ 00233 TimeScaleDraw *xAxis; 00234 00235 /** 00236 * Funcao para processar uma linha do resultado da busca nos logs de 00237 * clientes conectados (do servidor de gerenciamento). 00238 * @param LogLine linha do log a ser processada. 00239 * @result true se a linha foi processada com sucesso, ou false se algum 00240 * erro ocorreu ao processar a linha. 00241 */ 00242 bool ProcessConnectedClientsLogLine( char *LogLine ); 00243 /** 00244 * Funcao para processar uma linha do resultado da busca nos logs de 00245 * pacotes enviados (de um dos servidores de armazenamento). 00246 * @param LogLine linha do log a ser processada. 00247 * @result true se a linha foi processada com sucesso, ou false se algum 00248 * erro ocorreu ao processar a linha. 00249 */ 00250 bool ProcessSendRateLogLine( char *LogLine ); 00251 00252 public: 00253 /** 00254 * Construtor da classe 00255 */ 00256 LogPlot( QWidget *parent = 0, char *name = 0 ); 00257 /** 00258 * Funcao para processar um arquivo com o resultado de uma busca nos logs. 00259 * @param FileName arquivo (compactado) com os logs. 00260 * @param SearchType tipo da busca (SEARCHINTRAFFICLOGS para buscas nos 00261 * logs de um dos servidores de armazenamento e SEARCHINCLIENTSLOGS para 00262 * buscas nos logs do servidor de gerenciamento). 00263 * Obs: Os pontos computados a partir dos logs sao colocados nos vetores 00264 * XPoint (as abscissas dos pontos) e YPoint (as ordenadas dos pontos) 00265 * @param ServerAddress string com o endereco IP do servidor associado a 00266 * busca. 00267 * @result true se o grafico foi plotado com sucesso ou false se algum erro 00268 * ocorreu ao plotarmos o grafico. 00269 */ 00270 bool ProcessSearchLogs( char *FileName, unsigned int SearchType, 00271 QString ServerAddress ); 00272 /** 00273 * Funcao para salvar os logs em um arquivo. 00274 * @param DataFileName nome do arquivo em que os logs serao salvos. 00275 * @return true se os dados foram salvos com sucesso e false em caso 00276 * contrario. 00277 */ 00278 bool SaveLogsData( const char *DataFileName ); 00279 }; 00280 00281 class MonitorWindow : public QMainWindow, public RioExplorer 00282 { 00283 Q_OBJECT 00284 00285 RioQt *rioQt; 00286 ClientTable *client_table; 00287 StorageTable *storage_table; 00288 LogPlot *data_plot; 00289 QTimer *timer; 00290 QString userName; 00291 QButtonGroup *data_bg; 00292 QButtonGroup *options_bg; 00293 QDateTimeEdit *history_start_date_time; 00294 QDateTimeEdit *history_end_date_time; 00295 QSpinBox *refresh_period_sb; 00296 QLabel *generate_msg; 00297 QString data_file; 00298 QPushButton *save_button; 00299 QPushButton *gen_button; 00300 00301 // ComboBox para armazenar os IPs dos servidores de armazenamento. 00302 QComboBox *storages_address; 00303 00304 // QWidgetStack para armenar os graficos e um rotulo, sendo que somente cada 00305 // um destes esta visivel em um dado momento. 00306 QWidgetStack *results_widgets; 00307 00308 // Vetor com os enderecos (IP, porta) das maquinas para as quais precisamos 00309 // enviar periodicamente pacotes Fake. 00310 struct sockaddr_in *m_ServerAddress; 00311 // Numero de maquinas no vetor m_ServerAddress. 00312 unsigned int m_ServerAddressSize; 00313 00314 // Variavel booleana usada para indicar se ja fizemos (com sucesso ou nao) 00315 // um grafico com os logs. 00316 bool m_UsedHistoricData; 00317 // No caso de termos feito uma busca, esta variavel indicara qual busca 00318 // foi realizada. 00319 int m_LastSearchType; 00320 00321 static const int MAXLEN_FILE = 1024; 00322 static const int MAXLEN_MESSAGE = 1024*5; 00323 00324 unsigned int blockSize; 00325 char home[ MAXLEN_FILE + 1 ]; 00326 char *host; 00327 00328 bool showMessage( int, string, string = "" ); 00329 void updateCopyProgress( void ); 00330 void setMD5Calculation( char *, bool ); 00331 void setSyncCheck( char *, bool ); 00332 void closeEvent( QCloseEvent * closeEvent ); 00333 00334 // Novas funcoes usadas pela implementacao que faz buscas nos logs do 00335 // servidor. 00336 00337 /** 00338 * Funcao para executar uma busca nos logs dos servidores. 00339 * @param SearchType tipo da busca (SEARCHINTRAFFICLOGS para buscas nos 00340 * logs de um dos servidores de armazenamento e SEARCHINCLIENTSLOGS para 00341 * buscas nos logs do servidor de gerenciamento). 00342 * @param StartTime tempo inicial da faixa de logs a ser obtida. 00343 * @param EndTime tempo final da faixa de logs a ser obtida. 00344 * @return true se a busca foi inicializada com sucesso e false caso a 00345 * inicializacao da busca tenha falhado. 00346 */ 00347 bool ExecuteSearch( unsigned int SearchType, time_t StartTime, 00348 time_t EndTime ); 00349 00350 /** 00351 * Funcao de callback chamada quando a busca terminar (com ou sem sucesso 00352 * tanto para o pedido de busca, como para a propria busca a ser executada) 00353 * @param callbackparm parametro generico passado a callback. No caso dos 00354 * objetos da classe MonitorWindow, ele sera um ponteiro para uma estrutura 00355 * do tipo SearchLogsData com a informacao da busca a ser executada. 00356 * @result retorno ao executar a busca. Os erros passados sao os seguintes: 00357 * - SEARCHLOGSFAILED a solicitacao de busca foi executada com sucesso, mas 00358 * logs nao existem dentro da faixa de tempo passada. 00359 * - SEARCHLOGSSUCESS a solicitacao de busca foi executada com sucesso e 00360 * logs foram achados dentro da faixa de tempo passada. 00361 * - SEARCHLOGSERROR ocorreu um erro na solicitacao da busca nos logs. 00362 */ 00363 static void ExecuteSearchCallback( void *callbackparm, int result ); 00364 00365 private slots: 00366 bool refresh(); 00367 void buttonSelected( int id ); 00368 void generateStats(); 00369 void saveGraph(); 00370 00371 public slots: 00372 void setUpdateInterval( int ); 00373 00374 public: 00375 MonitorWindow( QWidget *, RioQt *, int ); 00376 ClientTable *getClientTable(); 00377 StorageTable *getStorageTable(); 00378 bool connectRioServer( char *, char *, char * ); 00379 00380 // Nova funcao usadas pela implementacao que faz buscas nos logs do 00381 // servidor. 00382 00383 /** 00384 * Funcao para processar o evento enviado pela callback. 00385 * ExecuteSearchCallback. O envio do evento e necessario porque nao podemos 00386 * acessar componentes do QT em outra thread diferente da thread principal 00387 * usada pelo QT. 00388 * @param event evento gerado pela callback ExecuteSearchCallback. 00389 */ 00390 void processSearchLogsEvent( SearchLogsEvent *event ); 00391 00392 signals: 00393 void showQueue(); 00394 void hideQueue(); 00395 }; 00396 00397 #endif