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

Comparing projects/cms/source/ihost/ihost.c (file contents):
Revision 1.9 by pajs, Fri May 17 11:21:17 2002 UTC vs.
Revision 1.17 by pajs, Mon May 20 12:28:46 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 <stdio.h>
2 #include <sys/socket.h>
21   #include <stdlib.h>
22   #include <unistd.h>
23   #include <syslog.h>
24   #include <netinet/in.h>
25   #include "ukcprog.h"
26   #include <netdb.h>
27 < #include <strings.h>
27 > #include <string.h>
28   #include "statgrab.h"
29 + #include <time.h>
30 + #include <sys/socket.h>
31 + #include <netinet/in.h>
32 + #include <arpa/inet.h>
33  
34 + #define versionNo 0.8
35   #define RECONFIGURE_RETURN_CODE 2
36   #define UDP_MAX_PACKET_SIZE 8192
37  
38   typedef struct{
39          int fm_port;
40          char *fm_host;
41 <        
41 >
42 >        char *my_ip;    
43          char *my_fqdn;
44          char *server_fqdn;
45          int server_udp_port;
# Line 40 | Line 64 | char* sock_comm(FILE *f_r, FILE *f_w, char *sendString
64   int ihost_configure(ihost_state_t *ihost_state){
65          struct sockaddr_in addr;
66          struct in_addr haddr;
67 +        struct sockaddr ip;
68 +        int ip_len;
69          int sd;
70          FILE *fm_fd_r, *fm_fd_w;
71          char *reply;
# Line 81 | Line 107 | int ihost_configure(ihost_state_t *ihost_state){
107                  errf("Failed to open write stream (%m)");
108                  return -1;
109          }
110 +        ip_len=sizeof ip;
111 +        memset(&ip, 0, ip_len);
112 +        if((getsockname(sd, &ip, &ip_len)) != 0){
113 +                errf("Failed to get IP address (%m)");
114 +                return -1;
115 +        }
116 +        if (ip.sa_family!=AF_INET){
117 +                errf("sa family is wrong type");
118 +                return -1;
119 +        }
120 +        
121 +        if((ihost_state->my_ip=inet_ntoa(((struct sockaddr_in *)&ip)->sin_addr))==NULL){
122 +                errf("Failed to get IP (%m)");
123 +                return -1;
124 +        }      
125  
126          reply=sock_comm(fm_fd_r, fm_fd_w, "STARTCONFIG");
127          if ((reply==NULL) || (strncasecmp(reply, "OK", 2) != 0) ) {
# Line 274 | Line 315 | int heartbeat(ihost_state_t *ihost_state){
315                  return -1;
316          }
317  
318 +        fflush(fm_fd_r);
319 +        fflush(fm_fd_w);
320 +
321          if(fclose(fm_fd_r) !=0){
322                  errf("Failed to close read FD (%m)");
323                  return -1;
# Line 323 | Line 367 | char *stat_grab(ihost_state_t *ihost_state, int counte
367                  free(stats[x]);
368          }
369          xml_data_p=xml_data;
370 <        xml_data=strf("<packet seq_no=\"%d\" machine_name=\"%s\" date=\"%ld\" type=\"data\" ip=\"%s\" key=\"%s\">%s</packet>", counter, ihost_state->my_fqdn, time(NULL), "127.0.0.1", ihost_state->key, xml_data);
370 >        xml_data=strf("<packet seq_no=\"%d\" machine_name=\"%s\" date=\"%ld\" type=\"data\" ip=\"%s\" key=\"%s\">%s</packet>", counter, ihost_state->my_fqdn, time(NULL), ihost_state->my_ip, ihost_state->key, xml_data);
371          free(xml_data_p);
372          
373          return xml_data;
# Line 362 | Line 406 | int send_stats(ihost_state_t *ihost_state, char *data_
406                  return -1;
407          }
408  
409 +        close(sd);
410 +
411          return 0;      
412   }
413  
414 + void usage(char *progname){
415 +        fprintf(stderr, "Usage %s [options] server port\n", progname);
416 +        fprintf(stderr, "Options\n");
417 +        fprintf(stderr, "  -v           Verbose, the more v flags the more verbose, eg -vv\n");
418 +        fprintf(stderr, "  -d           Daemon mode, self backgrounding\n");
419 +        fprintf(stderr, "  -s           Send errors to syslog\n");
420 +        fprintf(stderr, "  -V           Print version number\n");
421 +        fprintf(stderr, "  -h           Prints this help page\n");      
422 +        exit(1);        
423 + }
424 +
425   int main(int argc, char **argv){
426          ihost_state_t ihost_state;
427          int heartbeat_exit;
428          int counter=0;
429 <        long udp_time=0, tcp_time=0, cur_time=0;
429 >        long udp_time=0, tcp_time=0, stat_grab_time=0, cur_time=0;
430          int sleep_delay=0;
431          char *xml_stats;
432  
433 +        int cmdopt;
434 +        extern int optind;
435 +        int verbose=0, daemon=0, syslog=0 ;
436 +        
437          /* NULL'ify so i can tell if i need to free it or not */
438          ihost_state.fm_host=NULL;
439          ihost_state.my_fqdn=NULL;
# Line 382 | Line 443 | int main(int argc, char **argv){
443          ihost_state.key=NULL;
444  
445          errf_set_progname(argv[0]);
446 <        if(argc!=3){
447 <                errf_usage("<host> <port>");    
446 >
447 >        while((cmdopt=getopt(argc, argv, "vdshV")) != -1){
448 >                switch(cmdopt){
449 >                        case 'v':
450 >                                verbose++;
451 >                                break;
452 >                        
453 >                        case 'd':
454 >                                daemon=1;
455 >                                break;
456 >                        
457 >                        case 's':
458 >                                syslog=1;
459 >                                break;
460 >        
461 >                        case 'h':
462 >                                usage(argv[0]);
463 >                                break;
464 >                        case 'V':
465 >                                errf("%s version %f",argv[0], versionNo);
466 >                                break;
467 >                        default:
468 >                                usage(argv[0]);
469 >                                exit(1);
470 >                }
471 >        }
472 >
473 >        if(argc!=optind+2){
474 >                usage(argv[0]);
475                  exit(1);
476          }
477 +        ihost_state.fm_host=argv[optind];
478 +        ihost_state.fm_port=atoi(argv[optind+1]);
479 +        if(ihost_state.fm_port==0){
480 +                errf("Invalid port number");
481 +                usage(argv[0]);
482 +        }
483 +        printf("%s\n%d\n",ihost_state.fm_host, ihost_state.fm_port);
484  
390        ihost_state.fm_host=argv[1];
391        ihost_state.fm_port=atoi(argv[2]);
392
485          if(ihost_configure(&ihost_state)!=0){
486                  errf("configure failed");
487                  /* Ok, ideally we prob should have 2 copies of the structure and carry on if this
# Line 397 | Line 489 | int main(int argc, char **argv){
489                  exit(1);
490          }
491  
400        /* get starting stats */        
401        if((heartbeat(&ihost_state)) == -1){
402                errf("inital heartbeat failed (%m)");
403                exit(1);
404        }
405
406        
407        if((xml_stats=stat_grab(&ihost_state, counter)) == NULL){
408                errf("Failed to get stats (%m)");
409                exit(1);
410        }
411
412
492          for(;;){
493                  cur_time=time(NULL);
494                  if(cur_time>=tcp_time){
495 +                        /*printf("sending TCP\n");*/
496                          heartbeat_exit=heartbeat(&ihost_state);
497                          if(heartbeat_exit==RECONFIGURE_RETURN_CODE){
498 <                                errf("heartbeat needs to be reconfigured");
498 >                                /*errf("heartbeat needs to be reconfigured");*/
499                                  ihost_configure(&ihost_state);
500                                  /* So udp doesn't wait til next sending before updating */
501                                  udp_time=0;
# Line 426 | Line 506 | int main(int argc, char **argv){
506                          }
507                          tcp_time=time(NULL)+ihost_state.tcp_update_time;
508                  }
509 +
510                  if(cur_time>=udp_time){
511 <                        send_stats(&ihost_state, xml_stats);
512 <                        free(xml_stats);
513 <                        if((xml_stats=stat_grab(&ihost_state, counter)) == NULL){
511 >                        /*printf("sending UDP\n");*/
512 >                        stat_grab_time=time(NULL);
513 >                        if((xml_stats=stat_grab(&ihost_state, counter++)) == NULL){
514                                  errf("Failed to get stats (%m)");
515                                  exit(1);
516                          }
517 <                        udp_time=time(NULL)+ihost_state.udp_update_time;
517 >                        stat_grab_time=time(NULL)-stat_grab_time;
518 >                        send_stats(&ihost_state, xml_stats);
519 >                        free(xml_stats);
520 >                        udp_time=time(NULL)+ihost_state.udp_update_time-stat_grab_time;
521                  }
522 <                if(tcp_time>udp_time){
523 <                        sleep_delay=time(NULL)-tcp_time;
522 >
523 >                if(tcp_time<udp_time){
524 >                        sleep_delay=tcp_time-time(NULL);
525                  }else{
526 <                        sleep_delay=time(NULL)-udp_time;
526 >                        sleep_delay=udp_time-time(NULL);
527                  }
528 <                sleep(sleep_delay);
528 >
529 >                /*printf("tcp epoc: %ld \t udp epoc: %ld\ntime:%ld \tsleeping: %d\n", tcp_time, udp_time, time(NULL), sleep_delay);*/
530 >                if(sleep_delay>0) sleep(sleep_delay);
531          }
532          return 0;
533   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines