ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/host/c++/Host.cpp
Revision: 1.2
Committed: Mon Mar 5 12:40:32 2001 UTC (23 years, 8 months ago) by ab11
Branch: MAIN
Changes since 1.1: +121 -34 lines
Log Message:
Added support for Heartbeats - still sending incorrect date and sequence due to l64a function doing something silly

File Contents

# Content
1 #include <iostream.h>
2 #include <unistd.h> // linux header for the sleep function
3 #include <stdlib.h> // itoa()
4 #include <time.h>
5 #include "SysMon.h"
6 // #include "Config.h" - redefinition error - turns out i don't need it
7 #ifndef XMLFORMATTER_H /* Has the file been INCLUDE'd already? */
8 #define XMLFORMATTER_H yes
9 #include "XMLFormatter.h"
10 #endif
11
12 using std::string;
13
14 int main(){
15
16 // list of local variables
17 int noErrors = 1;
18 int reloadConfig = 0;
19
20 // print some extra info..
21 int debug = 0;
22
23 // create a new connection with the Config Host
24 // values hard coded for the moment
25 std::cout << "C Host starting..\n";
26
27 std::cout << "Attemping to load config\n";
28 Config config("raptor.ukc.ac.uk",4567,debug); // host, port, debug (0/1)
29
30 std::cout << "Creating data collector\n";
31 SysMon sysMon(config, debug);
32
33 std::cout << "Configuring UDPUpdateTime\n";
34 int UDPUpdateTime = config.getIntProperty("UDPUpdateTime");
35 if ( UDPUpdateTime == -1 ){
36 if ( debug == 1 ){
37 std::cout << "Using Default time!\n";
38 UDPUpdateTime = 5;
39 } // if
40 } // if
41
42
43 std::cout << "Configuring TCPUpdateTime\n";
44 int TCPUpdateTime = config.getIntProperty("TCPUpdateTime");
45 if ( TCPUpdateTime == -1){
46 if ( debug == 1 ){
47 std::cout << "Using Default time!\n";
48 TCPUpdateTime = 10;
49 } // if
50 } // if
51
52 std::cout << "Configuring AveragerUpdateTime\n";
53 int AveragerUpdateTime = config.getIntProperty("AVERAGERUpdateTime");
54 if ( AveragerUpdateTime == -1){
55 if ( debug == 1 ){
56 std::cout << "Using Default time!\n";
57 } // if
58 AveragerUpdateTime = 2;
59 } // if
60
61 std::cout << "Configuring Filter Retry Tolerances\n";
62 int MaxFilterRetrys = config.getIntProperty("MAXTCPFilterRetries");
63 if ( MaxFilterRetrys == -1){
64 if ( debug == 1 ){
65 std::cout << "Using Default Tolerance\n";
66 } // if
67 MaxFilterRetrys = 5;
68 } // if
69
70
71 std::cout << "Configuring Alerter\n";
72 // Set the values at which the Alerter should kick in. and how many packets it should
73 // send
74
75 // now do the data collection
76
77 std::cout << "Starting Data Collection\n";
78 // work out which is closer, the next heartbeat or the next data collection
79 long localTime = time(NULL);
80 // std::cout << "#";
81 int nextUDPTime = localTime + UDPUpdateTime;
82 int nextAveragerTime = localTime + AveragerUpdateTime;
83 int nextTCPTime = localTime + TCPUpdateTime;
84 long sequence = 0;
85
86 int nextAction = 0;
87 while ( noErrors == 1){
88 // firstly check we haven't got to reload our config
89 if ( reloadConfig == 1 ){
90 // reload the config by starting a new
91 std::cout << "Forcing reload of Configuration\n";
92 config = Config("raptor.ukc.ac.uk",4567,debug);
93
94 std::cout << "Configuring UDPUpdateTime\n";
95 int UDPUpdateTime = config.getIntProperty("UDPUpdateTime");
96 if ( UDPUpdateTime == -1 ){
97 if ( debug == 1 ){
98 std::cout << "Using Default time!\n";
99 UDPUpdateTime = 5;
100 } // if
101 } // if
102
103
104 std::cout << "Configuring TCPUpdateTime\n";
105 int TCPUpdateTime = config.getIntProperty("TCPUpdateTime");
106 if ( TCPUpdateTime == -1){
107 if ( debug == 1 ){
108 std::cout << "Using Default time!\n";
109 TCPUpdateTime = 10;
110 } // if
111 } // if
112
113 std::cout << "Configuring AveragerUpdateTime\n";
114 int AveragerUpdateTime = config.getIntProperty("AVERAGERUpdateTime");
115 if ( AveragerUpdateTime == -1){
116 if ( debug == 1 ){
117 std::cout << "Using Default time!\n";
118 } // if
119 AveragerUpdateTime = 2;
120 } // if
121
122 std::cout << "Configuring Filter Retry Tolerances\n";
123 int MaxFilterRetrys = config.getIntProperty("MAXTCPFilterRetries");
124 if ( MaxFilterRetrys == -1){
125 if ( debug == 1 ){
126 std::cout << "Using Default Tolerance\n";
127 } // if
128 MaxFilterRetrys = 5;
129 } // if
130
131 } // if reloadconfig
132
133
134 localTime = time(NULL);
135 // std::cout << ".";
136 // keep going while no non-fatal errors have occurred
137 int waitTime = 0;
138
139 if ( nextTCPTime <= nextAveragerTime ){
140 // std::cout << "-";
141 if ( nextTCPTime >= nextUDPTime ){
142 // std::cout << "}";
143 nextAction = 3;
144 waitTime = nextUDPTime - localTime;
145 } else {
146 // set the heartbeat to be the next item
147 // std::cout << "{";
148 nextAction = 1;
149 waitTime = nextTCPTime - localTime;
150 } // if
151 } else {
152 // std::cout << "+";
153 if ( nextAveragerTime >= nextUDPTime ){
154 // std::cout << "[";
155 nextAction = 3;
156 waitTime = nextUDPTime - localTime;
157 } else {
158 // set grabstats to be in the next action
159 // std::cout << "]";
160 nextAction = 2;
161 waitTime = nextAveragerTime - localTime;
162 } // if
163 } // if
164
165 // sleep until this time only if it is greater than 1!
166 if ( waitTime >= 1 ){
167 // need to output \n to std::cout or the wait is infinate!!!! ?????
168 // will core dump if debug = 0
169 sleep(waitTime); /// crashes here
170
171 }
172
173
174 localTime = time(NULL);
175 int con = -1;
176 int conCount = 0;
177
178 // do the action
179 switch (nextAction){
180 case 1: std::cout << "Scheduled TCP Heartbeat Connection" << endl;
181 nextTCPTime = localTime + TCPUpdateTime;
182 // connect to the filter - should do all the talking within config.
183 con = (config.getSmallNet())->connectHeartBeat(config.getUDPFilterName(), config.getFilterPort());
184 conCount = 0;
185 while (( con != 0 ) && ( conCount < MaxFilterRetrys )){
186 int con = (config.getSmallNet())->connectHeartBeat(config.getUDPFilterName(), config.getFilterPort());
187 conCount++;
188 }
189 // if con != 0, then we must reconnect to the main filter manager and
190 // reload our config!
191 if ( con == 0 ){
192 // run the chat script
193 int result = config.chatHeartBeat();
194 if ( result != 0 ){
195 // gotta reload our config
196 reloadConfig = 1;
197 } // if
198 } else {
199 // set the config to be reloaded next time
200 reloadConfig = 1;
201 } // if con =!= 0
202
203 break;
204 case 2: nextAveragerTime = localTime + AveragerUpdateTime;
205 if ( sysMon.collect() > 0 ){
206 // suggests that there should be an alert
207 std::cout << "Alert Status" << endl;
208 }
209 break;
210 default: std::cout << "Scheduled UDP Connection" << endl;
211 nextUDPTime = localTime + UDPUpdateTime;
212 // package up the system data
213 string host = (config.getSmallNet())->getHostName();
214 string ip = (config.getSmallNet())->getHostIP();
215
216 char * buffer;
217 buffer = l64a( sequence );
218 char * seq = buffer;
219 buffer = l64a( localTime );
220 char * date = buffer;
221
222
223 string attributes = "type=\"data\" machine_name=\""+host+"\" ip=\""+ip+"\" date=\""+date+"\" seq_no=\""+seq+"\"";
224
225 XMLFormatter xml("packet",attributes);
226 // put in the data
227 xml.addString(sysMon.getData());
228 (config.getSmallNet())->sendUPDPacket(config.getUDPFilterName(), config.getUDPFilterPort(), xml.returnXML());
229
230 break;
231 } // switch
232
233 } // while
234
235 std::cout << "A fatal error occurred which caused this program to quit\n";
236 std::cout << "It is suggested that all belly button lint should be removed\n";
237 std::cout << "prior to use of this program\n";
238 std::cout << "Oh and BTW, All you BASE are belong to us!\n";
239 std::cout << "Error Code: " << noErrors << "\n";
240
241 return 0;
242
243 } // main