ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/host/c++/SysMon.cpp
(Generate patch)

Comparing projects/cms/source/host/c++/SysMon.cpp (file contents):
Revision 1.1 by ab11, Mon Feb 26 15:00:42 2001 UTC vs.
Revision 1.9 by tdb, Sat May 18 18:15:56 2002 UTC

# Line 1 | Line 1
1 + /*
2 + * i-scream central monitoring system
3 + * Copyright (C) 2000-2002 i-scream
4 + *
5 + * This program is free software; you can redistribute it and/or
6 + * modify it under the terms of the GNU General Public License
7 + * as published by the Free Software Foundation; either version 2
8 + * of the License, or (at your option) any later version.
9 + *
10 + * This program is distributed in the hope that it will be useful,
11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 + * GNU General Public License for more details.
14 + *
15 + * You should have received a copy of the GNU General Public License
16 + * along with this program; if not, write to the Free Software
17 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 + */
19 +
20   #include "SysMon.h"
21  
22   SysMon::SysMon( Config config, int printDebug){
# Line 11 | Line 30 | SysMon::SysMon( Config config, int printDebug){
30          // setup some standard variables
31          sequence = 0; // no packets sent yet
32          
14        // get our values from config
15        
16        
33          // setup our arrays
34          titlepointer = 0;
35 <        for ( int i=0; i < 40; i++ ){
35 >        for ( int i=0; i < max_titles; i++ ){
36                  titles[i] = "";
37                  values[i] = "";
38          }
# Line 28 | Line 44 | SysMon::SysMon( Config config, int printDebug){
44   int SysMon::collect(){
45          if ( debug == 1 ){
46                  std::cout << "SysMon::collect()\n";
47 <        }
47 >        } // if
48          
49          // say we have checked again
50          checks++;
51          
52          // collect the system data and place it in an array of strings.
53          // presume that the data is all formtted correctly.
54 <        char input[2048];
54 >
55          if ( debug == 1 ){
56                  std::cout << "SysMon::collect::ipipestream\n";
57          }
58 <        ipipestream p("statgrab.pl");
58 >
59 >        p = new SubPipe("./statgrab.pl");
60          
61          // get the output into input from statgrab
62 <        while ( p.getline (input, 2048) ){
63 <                // find the first non-whitespace char in input
64 <                string sinput = input;
62 >        string sinput;
63 >        while ( p->getLine(&sinput) == 0 ){
64 >                
65 >                if ( titlepointer == max_titles ){
66 >                    std::cout << "WARNING: Max Titles reached, skipping remaining" << endl;
67 >                    std::cout << "Try recompiling with a value greater than the current (" << max_titles << ")" << endl;
68 >                    titlepointer--;
69 >                    break;
70 >                } // if
71 >                
72                  // locate the first white space
73                  int found = sinput.find(" ",0);
74                  if ( found == string::npos ){
75                          // error
76                          if ( debug == 1 ){
77                                  std::cout << "SysMon::collect::Parse error from statgrab.pl\n";
78 <                        }
78 >                        } // if
79                  } else {
80                          int gotTitle = 0;
81                          // now use the array of titles and values
82 <                        for ( int i = 0; i < 60; i++ ){
82 >                        for ( int i = 0; i < max_titles; i++ ){
83                                  // check against the array value
84                                  if ( titles[i] == sinput.substr(0,found) ){
85                                          // is the one we are looking for.
86 <                                        if ( debug == 1 ){
86 >                                        if ( debug == 2 ){
87                                                  std::cout << "SysMon::collect::Found Value\n";
88 <                                                gotTitle = 1;
89 <                                        }
88 >                                        } // if debug
89 >                                        
90 >                                        gotTitle = 1;
91                                          // now modify the data in the arrays if they are numbers
92 <                                        int * end;
68 <                                        char *buffer;
69 <                                        // buffer = sinput.substr(found+1, sinput.length());
70 <                                        double dbl = 0; // strtod((char *) sinput.substr(found+1, sinput.length()), &end);
71 <                                        if ( dbl == 0 ){
72 <                                                // error? we aren't so sure. check the position
73 <                                                // of end.
74 <                                                if ( *end == sinput.length()-1 ){
75 <                                                        // was the end.. ok
76 <                                                        
77 <                                                } // if
78 <                                        } else {
79 <                                                // must have worked!
80 <                                                double dbl2 = 0; //strtod(values[i], &end);
81 <                                                dbl2 += dbl;
82 <                                                char *buffer;
83 <                                                int precision = 5;
84 <                                                int decimal, sign;
85 <                                                buffer = ecvt (dbl2, precision, &decimal, &sign);
86 <                                        } // if
87 <                                } // if
92 >                            } // if (titles[i])
93                          } // for
94 +                                        
95                          // did we find this title? if not add it
96                          if ( gotTitle == 0 ){
97                                  // didnt
98                                  if ( debug == 1 ){
99 <                                                std::cout << "SysMon::collect::Adding New Value\n";
100 <                                                std::cout << "'" << sinput.substr(0,found) << "'\n";
101 <                                                std::cout << "'" <<  sinput.substr(found+1, sinput.length()) << "'\n";
102 <                                }
99 >                                        std::cout << "SysMon::collect::Adding New Value\n";
100 >                                        std::cout << "'" << sinput.substr(0,found) << "' : ";
101 >                                        std::cout << "'" <<  sinput.substr(found+1, sinput.length()) << "'\n";
102 >                                } // if
103                                  titles[titlepointer] = sinput.substr(0,found);
104                                  values[titlepointer] = sinput.substr(found+1, sinput.length());
105                                  titlepointer++;
# Line 103 | Line 109 | int SysMon::collect(){
109                  
110          } // while
111          
112 +        // delete the pointer to free up memory
113 +        delete p;
114 +        
115          if ( debug == 1 ){
116                  std::cout << "SysMon::collect::Parse from StatGrab finished\n";
117 <        }
117 >        } // if
118          
110        // alert?
111        // return 1;
112        
119          // return sucessful
120          return 0;
121          
122   } // collect
123  
124 + void SysMon::clearData(){
125 +    
126 +    titlepointer = 0;
127 +        for ( int i=0; i < max_titles; i++ ){
128 +                titles[i] = "";
129 +                values[i] = "";
130 +        } // for
131 +    
132 +    return;
133 +    
134 + } // clearData
135 +
136 +
137   string SysMon::getData(){
138          
139          if ( debug == 1 ){
140                  std::cout << "SysMon::getData()\n";
141 <        }
141 >        } // if
142          
143          // create an xml object
144          XMLFormatter xml = XMLFormatter();
145 +
146 +    if ( debug == 1 ){
147 +                std::cout << "SysMon::getData::Sorting " << titlepointer << " elements\n";
148 +        } // if
149 +
150 +    // firstly sort the data.
151 +    // simple bubble sort
152 +    int flag = 1;
153 +    while ( flag == 1 ){
154 +        flag = 0;
155 +        for ( int i=1; i<=titlepointer; i++ ){
156 +                 if (titles[i-1].compare(titles[i]) > 0 ){
157 +                    // swap them
158 +                    string temp;
159 +                    temp = titles[i-1];
160 +                    titles[i-1] = titles[i];
161 +                    titles[i] = temp;
162 +                    // now do the values
163 +                    temp = values[i-1];
164 +                    values[i-1] = values[i];
165 +                    values[i] = temp;
166 +                    // say we have changed something
167 +                    flag = 1;                    
168 +                 }  // if  
169 +        } // for
170 +    } // while
171 +        
172 +    /* used to check the array has sorted correctly
173 +    for ( int i=0; i < titlepointer; i++ ){
174 +        std::cout << titles[i] << endl;    
175 +    }
176 +    */
177 +      
178 +        // work through each one of the titles in turn and
179 +        // work out their levels.
180          
181 <        // spammage
182 <                // xml.addElement(titles[0],values[0]); // version
183 <                xml.addNest("os");
184 <                        xml.addElement("name",values[1]);    // packet.os.name
185 <                        xml.addElement("release",values[2]); // packet.os.release
186 <                        xml.addElement("platform",values[3]); // packet.os.platform
187 <                        xml.addElement("sysname",values[4]); // packet.os.sysname
188 <                        xml.addElement("version",values[5]); // packet.os.version
135 <                        xml.addElement("uptime",values[9]); // packet.os.uptime
136 <                xml.closeNest();
137 <                xml.addNest("load");
138 <                        xml.addElement("load1",values[6]); // packet.load.load1
139 <                        xml.addElement("load5",values[7]); // packet.load.load5
140 <                        xml.addElement("load15",values[8]); // packet.load.load15
141 <                xml.closeNest();        
142 <                xml.addNest("users");
143 <                        xml.addElement("count",values[10]); // packet.users.count
144 <                        // xml.addElement("list",values[11]);  // packet.users.list
145 <                        // xml.addElement("list",values[11]);  // packet.users.list
146 <                xml.closeNest();
147 <                
148 <                
181 >        int count = 0;
182 >        string currentLevel = "packet";
183 >        string currentLevels[10];
184 >        int currentLevelint = 0;
185 >        int retryCount = 0;
186 >        string attributes = "";
187 >        int isAttrib = 0;
188 >        string attributeLevel = "";
189          
190 +        // init that array quickly ;)
191 +        for ( int i=0; i< 10; i++ ){
192 +            currentLevels[i] = "";
193 +        } // for
194          
195 +        if ( debug == 1 ){
196 +                std::cout << "SysMon::getData::Starting while\n";
197 +        } // if
198          
199 <        // xml.
200 <                
201 <                
202 <        // } // for
203 <        
199 >        while ( count <= titlepointer ){
200 >
201 >            if ( debug == 1 ){
202 >                    std::cout << "Processing: " << titles[count] << endl;
203 >            } // if
204 >            
205 >            retryCount++;
206 >                    
207 >            currentLevel = "";
208 >        for ( int i=0; i<currentLevelint; i++ ){
209 >            if (( currentLevel != "" ) && ( i != currentLevelint )){
210 >                currentLevel += ".";
211 >            } // if
212 >            currentLevel += currentLevels[i];
213 >        } // for  
214 >            
215 >            // set the title into a variable
216 >            string currentTitle = titles[count];
217 >            
218 >            // make an array of strings to hold the levels
219 >            string levels[10];
220 >            for ( int i=0; i< 10; i++ ){
221 >                levels[i] = "";
222 >            } // for
223 >            int level = 0;
224 >          
225 >            
226 >            // firstly find the first .
227 >            int dotPosition = currentTitle.find(".");
228 >                  
229 >            while ( dotPosition != string::npos ){
230 >                
231 >                levels[level] = currentTitle.substr(0,dotPosition);
232 >                
233 >                // now remove this bit
234 >                currentTitle = currentTitle.substr(dotPosition+1);
235 >                
236 >                // now find the position of the next dot
237 >                dotPosition = currentTitle.find(".");          
238 >                
239 >                // increment level etc
240 >                level++;
241 >                
242 >                // we already are at 'packet' level because of
243 >                // the outer packet tags, get rif of it , only
244 >                // first one mind!      
245 >                if ( levels[0] == "packet" ){
246 >                    level--;
247 >                } // if
248 >                        
249 >            } // while dotPosition
250 >            
251 >            // now grab the value title
252 >            levels[level] = currentTitle;
253 >            
254 >            // now have the levels and the level depth.
255 >            // check it against the last one, reconstruct a
256 >            // level string
257 >            
258 >            // only do this if the 2nd to last string is not
259 >            // atrribute
260 >            string newLevelString = "";
261 >            
262 >            if ( level > 0 ){
263 >            if ( levels[level-1] != "attributes" ){
264 >                // say it isn't an attribute, but write out
265 >                // the attribute first if the last one was
266 >                if ( attributeLevel != "" ){
267 >                         xml.addElement(attributeLevel,attributes,"");
268 >                         if ( debug == 1 ){
269 >                               std::cout << "Adding Element + attributes" << endl;
270 >                         } // if
271 >                        
272 >                    } // if
273 >                isAttrib = 0;
274 >                attributeLevel = "";
275 >                attributes = "";
276 >                
277 >                for ( int i=0; i < level; i++ ){
278 >                    newLevelString += levels[i];                
279 >                    if ( i != level-1 ){
280 >                        newLevelString += ".";
281 >                    } // if
282 >                } // for
283 >            } // if levels[level]
284 >            
285 >            else
286 >            
287 >            {
288 >                 // we need to add to the attributes
289 >                level -= 2;
290 >                for ( int i=0; i < level; i++ ){
291 >                    newLevelString += levels[i];                
292 >                    if ( i != level-1 ){
293 >                        newLevelString += ".";
294 >                    } // if
295 >                } // for
296 >                
297 >                isAttrib = 1;
298 >                if ( attributeLevel == "" ){
299 >                    // set this attribute to be the level
300 >                    attributeLevel = levels[level];
301 >                } else {
302 >                   if ( levels[level] != attributeLevel ){
303 >                        // arrg! its a different level!
304 >                        if ( attributeLevel != levels[level] ){
305 >                           xml.addElement(attributeLevel,attributes,"");
306 >                           if ( debug == 1 ){
307 >                                        std::cout << "Adding Element + attributes1" << endl;
308 >                                } // if
309 >                           attributeLevel = "";
310 >                           attributes = "";
311 >                           count++;
312 >                        } // if
313 >                        if ( count == titlepointer ){
314 >                                xml.addElement(attributeLevel,attributes,"");
315 >                            if ( debug == 1 ){
316 >                                        std::cout << "Adding Element + attributes2" << endl;
317 >                                } // if
318 >                            attributeLevel = "";
319 >                            attributes = "";
320 >                            count++;
321 >                        } // if
322 >                   } // if
323 >                } // if else
324 >                    
325 >            } // else attributes
326 >            } // if level > 1
327 >            else {
328 >            if ( count == titlepointer ){
329 >                if ( attributeLevel != "" ){
330 >                    xml.addElement(attributeLevel,attributes,"");
331 >                    if ( debug == 1 ){
332 >                                std::cout << "Adding Element + attributes3" << endl;
333 >                        } // if
334 >                    attributeLevel = "";
335 >                    attributes = "";
336 >                    count++;
337 >                } // if
338 >            } // if
339 >                
340 >                
341 >                for ( int i=0; i < level; i++ ){
342 >                    newLevelString += levels[i];                
343 >                    if ( i != level-1 ){
344 >                        newLevelString += ".";
345 >                    } // if
346 >                } // for
347 >            } // if level == 1
348 >            
349 >            // check if it is the same
350 >            if ( newLevelString == currentLevel ){
351 >                // it is the same level, just add this as another element  
352 >                if ( isAttrib ){
353 >                    attributes += levels[level+2];
354 >                    attributes += "=\"";
355 >                    attributes += values[count];        
356 >                    attributes += "\" ";
357 >                            
358 >                } else {
359 >                xml.addElement(levels[level],  values[count]);
360 >                count++;            
361 >                if ( debug == 1 ){
362 >                    std::cout << "Adding Element" << endl;
363 >                } // if
364 >            } // if
365 >                    
366 >            } else {
367 >                // gotta change it    
368 >                
369 >                while( newLevelString.find(currentLevel) == string::npos ){
370 >                
371 >                if ( currentLevelint <= 0 ){
372 >                    break;
373 >                } // if
374 >                
375 >                // back up atleast one level...
376 >                xml.closeNest();
377 >                if ( debug == 1 ){
378 >                    std::cout << "Closing Nest" << endl;
379 >                } // if
380 >                // remove the last item
381 >                currentLevelint--;
382 >                
383 >                currentLevel = "";
384 >                for ( int i=0; i<currentLevelint; i++ ){
385 >                    currentLevel += currentLevels[i];
386 >                    if ( i != currentLevelint-1 ){
387 >                            currentLevel += ".";
388 >                    } // if
389 >                } // for        
390 >                                
391 >                } // while
392 >                
393 >                
394 >                while ( newLevelString != currentLevel ){
395 >                                    
396 >                // now got to a level which we like.
397 >                currentLevels[currentLevelint] = levels[currentLevelint];
398 >                
399 >                // add in one more level and restart the loop
400 >                xml.addNest(levels[currentLevelint]);
401 >                if ( debug == 1 ){
402 >                    std::cout << "Adding nest " << levels[currentLevelint] << endl;
403 >                } // if
404 >                
405 >                // set this to be the top level of the new level
406 >                currentLevelint++;
407 >                
408 >                currentLevel = "";
409 >                for ( int i=0; i<currentLevelint; i++ ){
410 >                    currentLevel += currentLevels[i];
411 >                    if ( i != currentLevelint-1 ){
412 >                            currentLevel += ".";
413 >                    } // if
414 >                } // for  
415 >                
416 >            } // while
417 >                
418 >                        
419 >            } // if
420 >          
421 >            if ( debug == 1 ){
422 >             std::cout << "Retrying Main While" << endl;
423 >        } // if
424 >          
425 >            if ( retryCount > 10 ){
426 >                count++;
427 >                if ( debug == 1 ){
428 >                std::cout << "Tried too many times" << endl;
429 >            } // if
430 >                retryCount = 0;
431 >            } // if
432 >            
433 >        } // while
434 >
435 >    if ( debug == 1 ){
436 >                std::cout << "\n";
437 >        } // if
438 >
439          // return the string
440          return xml.returnXML();
441          

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines