Blog do kivanio

As aventuras de um tal kivanio na TI

Rails Summit Latin America

 Depois de instalar o snort e ver o bicho pegando os espião, você se depara com uma mensagem estranha no seu log:

 
database: mysql_error: MySQL server has gone away SQL=BEGIN
 
WTF?
 
não, você não foi vencido por um sobrinho de alguém praticando invasão :D
 
acontece(e não entendo porque não corrigiram ainda) que há um bug no conector com a versão 5.1 do mysql que faz com que o mesmo não se reconecte após uma queda de conexão.
 
para solucionar isso é preciso alterar o fonte antes da compilação.
 
nos fontes do snort, na pasta "src/output-plugins/" procure pelo arquivo "spo_database.c", com seu editor preferido abra o arquivo e por volta da linha 2943, em um trecho de código do mysql:
 

#ifdef ENABLE_MYSQL
    if(data->shared->dbtype_id == DB_MYSQL)
    {
        data->m_sock = mysql_init(NULL);
        if(data->m_sock == NULL)
        {
            FatalError("database: Connection to database '%s' failed\n", data->shared->dbname);
        }
        if(data->port != NULL)
        {
            x = atoi(data->port);
        }
        else
        {                                                                                                               
            x = 0;                                                                                                      
        }                                                                                                               
        if(mysql_real_connect(data->m_sock, data->shared->host, data->user, data->password, data->shared->dbname, x, NULL, 0) == 0)
        {                                                                                                               
            if(mysql_errno(data->m_sock))
            {
                FatalError("database: mysql_error: %s\n", mysql_error(data->m_sock));
            }
            FatalError("database: Failed to logon to database '%s'\n", data->shared->dbname);
        }
    }
#endif

 
antes da última chave } coloque "data->m_sock->reconnect = 1;"
 

#ifdef ENABLE_MYSQL
    if(data->shared->dbtype_id == DB_MYSQL)
    {
        data->m_sock = mysql_init(NULL);
        if(data->m_sock == NULL)
        {
            FatalError("database: Connection to database '%s' failed\n", data->shared->dbname);
        }
        if(data->port != NULL)
        {
            x = atoi(data->port);
        }
        else
        {
            x = 0;
        }
        if(mysql_real_connect(data->m_sock, data->shared->host, data->user, data->password, data->shared->dbname, x, NULL, 0) == 0)
        {
            if(mysql_errno(data->m_sock))
            {
                FatalError("database: mysql_error: %s\n", mysql_error(data->m_sock));
            }
            FatalError("database: Failed to logon to database '%s'\n", data->shared->dbname);
        }
        data->m_sock->reconnect = 1;
    }
#endif

 
Isso fará com que o maledito se reconecte evitando o erro e os logs.