Changeset 1173

Show
Ignore:
Timestamp:
03/24/07 23:31:06 (1 year ago)
Author:
oxff
Message:

submit-mwserv: added frequent heartbeats, including the software version; server controls when next heartbeat comes

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • nepenthes/trunk/modules/submit-mwserv/TransferSession.cpp

    r1169 r1173  
    108108} 
    109109 
    110 void TransferSession::transferSample(TransferSample& sample, string url) 
     110void TransferSession::transfer(TransferSample& sample, string url) 
    111111{ 
    112112        m_sample = sample; 
     
    123123         
    124124        initializeHandle(); 
    125          
    126125} 
    127126 
     
    135134        m_postInfo = m_postInfoLast = 0; 
    136135         
    137         if(m_type != TSS_HEARTBEAT) 
    138         { 
    139                 curl_formadd(&m_postInfo, &m_postInfoLast, CURLFORM_PTRNAME, "guid", 
     136        curl_formadd(&m_postInfo, &m_postInfoLast, CURLFORM_PTRNAME, "guid", 
    140137                        CURLFORM_COPYCONTENTS, m_sample.guid.c_str(), CURLFORM_END); 
    141                 curl_formadd(&m_postInfo, &m_postInfoLast, CURLFORM_PTRNAME, 
    142                         "maintainer", CURLFORM_COPYCONTENTS, m_sample.maintainer.c_str(), 
    143                         CURLFORM_END); 
    144                 curl_formadd(&m_postInfo, &m_postInfoLast, CURLFORM_PTRNAME, "secret", 
    145                         CURLFORM_COPYCONTENTS, m_sample.secret.c_str(), CURLFORM_END); 
     138        curl_formadd(&m_postInfo, &m_postInfoLast, CURLFORM_PTRNAME, 
     139                "maintainer", CURLFORM_COPYCONTENTS, m_sample.maintainer.c_str(), 
     140                CURLFORM_END); 
     141        curl_formadd(&m_postInfo, &m_postInfoLast, CURLFORM_PTRNAME, "secret", 
     142                CURLFORM_COPYCONTENTS, m_sample.secret.c_str(), CURLFORM_END); 
     143         
     144        if(m_type != TST_HEARTBEAT) 
     145        { 
    146146                curl_formadd(&m_postInfo, &m_postInfoLast, CURLFORM_PTRNAME, "url", 
    147147                        CURLFORM_COPYCONTENTS, m_sample.url.c_str(), CURLFORM_END); 
     
    153153                        CURLFORM_COPYCONTENTS, m_sample.daddr.c_str(), CURLFORM_END); 
    154154                 
    155                 if(m_type == TSS_SAMPLE) 
     155                if(m_type == TST_SAMPLE) 
    156156                { 
    157157                        curl_formadd(&m_postInfo, &m_postInfoLast, CURLFORM_PTRNAME, "data", 
     
    159159                                m_sample.binarySize, CURLFORM_END); 
    160160                } 
    161  
    162                 curl_easy_setopt(m_curlHandle, CURLOPT_HTTPPOST, m_postInfo); 
    163                 curl_easy_setopt(m_curlHandle, CURLOPT_SSL_VERIFYHOST, false); 
    164                 curl_easy_setopt(m_curlHandle, CURLOPT_SSL_VERIFYPEER, false); 
    165                 curl_easy_setopt(m_curlHandle, CURLOPT_URL, m_targetUrl.c_str()); 
    166                 curl_easy_setopt(m_curlHandle, CURLOPT_USERAGENT, 
    167                         "nepenthes " VERSION " (" MY_OS ", " MY_ARCH ", " MY_COMPILER ")"); 
    168                 curl_easy_setopt(m_curlHandle, CURLOPT_WRITEDATA, this); 
    169                 curl_easy_setopt(m_curlHandle, CURLOPT_WRITEFUNCTION, 
    170                         TransferSession::readData); 
    171161        } 
    172162        else 
     
    176166                        ", " MY_COMPILER ")", CURLFORM_END); 
    177167        } 
     168         
     169        curl_easy_setopt(m_curlHandle, CURLOPT_HTTPPOST, m_postInfo); 
     170        curl_easy_setopt(m_curlHandle, CURLOPT_SSL_VERIFYHOST, false); 
     171        curl_easy_setopt(m_curlHandle, CURLOPT_SSL_VERIFYPEER, false); 
     172        curl_easy_setopt(m_curlHandle, CURLOPT_URL, m_targetUrl.c_str()); 
     173        curl_easy_setopt(m_curlHandle, CURLOPT_USERAGENT, 
     174                "nepenthes " VERSION " (" MY_OS ", " MY_ARCH ", " MY_COMPILER ")"); 
     175        curl_easy_setopt(m_curlHandle, CURLOPT_WRITEDATA, this); 
     176        curl_easy_setopt(m_curlHandle, CURLOPT_WRITEFUNCTION, 
     177                TransferSession::readData); 
    178178                 
    179179        CURLMcode error; 
     
    197197TransferSession::Status TransferSession::getTransferStatus() 
    198198{ 
    199         if(m_buffer == "OK") 
    200                 return TSS_OK; 
    201         else if(m_buffer == "UNKNOWN") 
    202                 return TSS_UNKNOWN; 
     199        if(m_type != TST_HEARTBEAT) 
     200        { 
     201                if(m_buffer == "OK") 
     202                        return TSS_OK; 
     203                else if(m_buffer == "UNKNOWN") 
     204                        return TSS_UNKNOWN; 
     205                else 
     206                        return TSS_ERROR; 
     207        } 
    203208        else 
    204                 return TSS_ERROR; 
     209        { 
     210                if(m_buffer.substr(0, 4) == "OK: ") 
     211                        return TSS_HEARTBEAT; 
     212                else 
     213                        return TSS_ERROR; 
     214        } 
    205215} 
    206216 
     
    232242                &maxFd))) 
    233243        { 
    234                 printf("Obtaining write socket failed: %s\n", 
     244                logCrit("Obtaining write socket failed: %s\n", 
    235245                        curl_multi_strerror(error)); 
    236246                return false; 
     
    256266        while((message = curl_multi_info_read(m_multiHandle, &queued))) 
    257267        {                                
    258                 if(message->msg == CURLMSG_DONE != CURLE_OK
     268                if(message->msg == CURLMSG_DONE
    259269                { 
    260270                        if(message->data.result) 
     
    283293                                        m_sample.binary = 0; 
    284294                                         
    285                                         return 0; 
     295                                        break; 
     296                                 
     297                                case TransferSession::TSS_HEARTBEAT: 
     298                                        { 
     299                                                unsigned long delta = strtoul(m_buffer.substr(4). 
     300                                                        c_str(), 0, 0); 
     301                                                logInfo("Next heartbeat in %u seconds.\n", delta); 
     302                                                 
     303                                                m_parent->scheduleHeartbeat(delta); 
     304                                                 
     305                                                return 0; 
     306                                        } 
    286307                                 
    287308                                case TransferSession::TSS_ERROR: 
     309                                        if(m_type == TST_HEARTBEAT) 
     310                                                m_parent->scheduleHeartbeat(DEFAULT_HEARTBEAT_DELTA); 
     311                                         
    288312                                        logCrit("%s reported \"%s\"\n", m_targetUrl.c_str(), 
    289313                                                m_buffer.c_str()); 
     
    311335                &maxFd))) 
    312336        { 
    313                 printf("Obtaining read socket failed: %s\n", 
     337                logCrit("Obtaining read socket failed: %s\n", 
    314338                        curl_multi_strerror(error)); 
    315339                return -1; 
     
    322346                !FD_ISSET(maxFd, &errorSet)) 
    323347        { 
    324                 printf("maxFd not in set: %i!\n", maxFd); 
     348                logCrit("maxFd not in set: %i!\n", maxFd); 
    325349                return -1; 
    326350        } 
  • nepenthes/trunk/modules/submit-mwserv/TransferSession.hpp

    r1169 r1173  
    6868        enum Type 
    6969        { 
    70                 TSS_INSTANCE, 
    71                 TSS_SAMPLE, 
    72                 TSS_HEARTBEAT, 
     70                TST_INSTANCE, 
     71                TST_SAMPLE, 
     72                TST_HEARTBEAT, 
    7373        }; 
    7474         
     
    8080                TSS_OK, 
    8181                TSS_UNKNOWN, 
     82                TSS_HEARTBEAT, 
    8283                TSS_ERROR, 
    8384        }; 
     
    8586        TransferSession::Status getTransferStatus(); 
    8687         
    87         void transferSample(TransferSample& sample, string url);       
     88        void transfer(TransferSample& sample, string url);     
    8889         
    8990        // POLLSocket    
     
    117118        Type m_type; 
    118119        SubmitMwservModule * m_parent; 
     120         
     121        unsigned long m_heartbeatDelta; 
    119122 
    120123private: 
  • nepenthes/trunk/modules/submit-mwserv/submit-mwserv.cpp

    r1169 r1173  
    5050 
    5151#define SUBMIT_URI "nepenthes/submit" 
    52 #define HEARTBEAT_URI "nepenthes/heartbeat" 
     52#define HEARTBEAT_URI "heartbeat" 
    5353 
    5454 
     
    6565        m_SubmitterName = "submit-mwserv"; 
    6666        m_SubmitterDescription = "mwserv.py HTTP Post Submission"; 
    67  
    68         m_Timeout = time(0); 
    69         m_Events.reset(); 
    7067} 
    7168 
     
    10198        } 
    10299         
     100        if(* m_url.rbegin() != '/') 
     101                m_url += "/"; 
     102         
    103103        REG_SUBMIT_HANDLER(this); 
    104104        REG_EVENT_HANDLER(this); 
    105105         
     106        handleEvent(0); 
     107         
    106108        return true; 
    107109} 
     
    121123        TransferSample sample; 
    122124        TransferSession * session = new TransferSession(TransferSession:: 
    123                 TSS_INSTANCE, this); 
     125                TST_INSTANCE, this); 
    124126         
    125127        { 
     
    145147        } 
    146148         
    147         session->transferSample(sample, m_url + SUBMIT_URI); 
     149        session->transfer(sample, m_url + SUBMIT_URI); 
    148150        g_Nepenthes->getSocketMgr()->addPOLLSocket(session); 
    149151} 
     
    156158{ 
    157159        TransferSession * session = new TransferSession(TransferSession:: 
    158                 TSS_SAMPLE, this); 
    159          
    160         session->transferSample(sample, m_url + SUBMIT_URI); 
     160                TST_SAMPLE, this); 
     161         
     162        session->transfer(sample, m_url + SUBMIT_URI); 
    161163        g_Nepenthes->getSocketMgr()->addPOLLSocket(session); 
    162164} 
     
    164166uint32_t SubmitMwservModule::handleEvent(Event * ev) 
    165167{ 
     168        m_Events.reset(EV_TIMEOUT); 
     169         
     170        TransferSample sample; 
     171        TransferSession * session = new TransferSession(TransferSession:: 
     172                TST_HEARTBEAT, this); 
     173         
     174        sample.guid = m_guid; 
     175        sample.maintainer = m_maintainer; 
     176        sample.secret = m_secret; 
     177        sample.binary = 0; 
     178         
     179        session->transfer(sample, m_url + HEARTBEAT_URI); 
     180        g_Nepenthes->getSocketMgr()->addPOLLSocket(session); 
     181         
    166182        return 0; 
     183} 
     184 
     185void SubmitMwservModule::scheduleHeartbeat(unsigned long delta) 
     186{ 
     187        if(delta > MAX_HEARTBEAT_DELTA) 
     188        { 
     189                logInfo("Capping server heartbeat delta of %u sec to %u sec.\n", delta, 
     190                        MAX_HEARTBEAT_DELTA); 
     191         
     192                delta = MAX_HEARTBEAT_DELTA; 
     193        } 
     194                 
     195        m_Events.set(EV_TIMEOUT); 
     196        m_Timeout = time(0) + delta; 
    167197} 
    168198 
  • nepenthes/trunk/modules/submit-mwserv/submit-mwserv.hpp

    r1169 r1173  
    4040 
    4141 
     42#define DEFAULT_HEARTBEAT_DELTA 30 
     43#define MAX_HEARTBEAT_DELTA 300 
     44 
     45 
    4246using namespace std; 
    4347 
     
    6266        void submitSample(TransferSample& sample);       
    6367        void retrySample(TransferSample& sample); 
     68        void scheduleHeartbeat(unsigned long delta); 
    6469 
    6570protected: