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.28 by pajs, Mon Mar 3 12:18:35 2003 UTC vs.
Revision 1.50 by tdb, Sun May 30 17:13:05 2004 UTC

# Line 1 | Line 1
1   /*
2   * i-scream central monitoring system
3 < * http://www.i-scream.org.uk
3 > * http://www.i-scream.org
4   * Copyright (C) 2000-2002 i-scream
5   *
6   * This program is free software; you can redistribute it and/or
# Line 31 | Line 31
31   #include <stdarg.h>
32   #include <errno.h>
33   #include <netdb.h>
34 + #include <netinet/in.h>
35  
36   #include <ukcprog.h>
37 < #include "statgrab.h"
37 > #include <statgrab.h>
38  
39   #define LOG_CRIT 0
40   #define LOG_ERR 1
41   #define LOG_INFO 2
42   #define LOG_DEBUG 3
43  
43 #define PID_FILE "/var/run/ihost.pid"
44 #define LOGFILE_PATH "/var/log/ihost.log"
45 #define VERSION ".03"
46
47 #define MAX_UDP_PACKET_SIZE 8192
48
44   typedef struct{
45          int filtermanager_port;
46          char *filtermanager_host;
47  
48          char *host_ip;
49          char *host_fqdn;
50 +        int preset_fqdn;
51 +        int preset_ip;
52  
53          char *server_fqdn;
54          int server_udp_port;
# Line 81 | Line 78 | typedef struct{
78  
79   ihost_config_t ihost_config;
80  
81 + extern int errno;
82 +
83 + /* Taken from the OpenSSH code. Its licence included in function.*/
84 + #ifndef HAVE_STRLCAT
85 +
86 + /*
87 + * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
88 + * All rights reserved.
89 + *
90 + * Redistribution and use in source and binary forms, with or without
91 + * modification, are permitted provided that the following conditions
92 + * are met:
93 + * 1. Redistributions of source code must retain the above copyright
94 + *    notice, this list of conditions and the following disclaimer.
95 + * 2. Redistributions in binary form must reproduce the above copyright
96 + *    notice, this list of conditions and the following disclaimer in the
97 + *    documentation and/or other materials provided with the distribution.
98 + * 3. The name of the author may not be used to endorse or promote products
99 + *    derived from this software without specific prior written permission.
100 + *
101 + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
102 + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
103 + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
104 + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
105 + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
106 + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
107 + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
108 + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
109 + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
110 + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
111 + */
112 +
113 + /*
114 + * Appends src to string dst of size siz (unlike strncat, siz is the
115 + * full size of dst, not space left).  At most siz-1 characters
116 + * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
117 + * Returns strlen(src) + MIN(siz, strlen(initial dst)).
118 + * If retval >= siz, truncation occurred.
119 + */
120 + size_t
121 + strlcat(dst, src, siz)
122 +        char *dst;
123 +        const char *src;
124 +        size_t siz;
125 + {
126 +        register char *d = dst;
127 +        register const char *s = src;
128 +        register size_t n = siz;
129 +        size_t dlen;
130 +
131 +        /* Find the end of dst and adjust bytes left but don't go past end */
132 +        while (n-- != 0 && *d != '\0')
133 +                d++;
134 +        dlen = d - dst;
135 +        n = siz - dlen;
136 +
137 +        if (n == 0)
138 +                return(dlen + strlen(s));
139 +        while (*s != '\0') {
140 +                if (n != 1) {
141 +                        *d++ = *s;
142 +                        n--;
143 +                }
144 +                s++;
145 +        }
146 +        *d = '\0';
147 +
148 +        return(dlen + (s - src));       /* count does not include NUL */
149 + }
150 +
151 + #endif
152 + /* End strlcat function taken from OpenSSH */
153 +
154   void log_msg(int level, char *format, ...){
85        extern int errno;
155          int cur_errno;
156          va_list ap;
157  
# Line 97 | Line 166 | void log_msg(int level, char *format, ...){
166                  }else{
167                          fprintf(ihost_config.log, "\n");
168                  }
169 +                fflush(ihost_config.log);
170          }
171   }
172  
103 /* Takes many pointers, checks if they are NULL or not, and then free's them */
104 /* Deprciated - and i only wrote it today! :)
105 void m_free(int num_pointers, ...){
106        int x=0;
107        va_list ap;
108        void *p;
109
110        va_start(ap, num_pointers);
111        for(;x<num_pointers;x++){
112                p=va_arg(ap, void*);
113                if(p!=NULL){
114                        free(p);
115                }
116        }
117        va_end(ap);
118 }
119 */
120
173   int create_udp_sockinfo(udp_sockinfo_t *udp_sockinfo, char *hostname, int port){
174  
175          struct in_addr haddr;
# Line 156 | Line 208 | FILE *create_tcp_connection(char *hostname, int port){
208  
209          if((get_host_addr(hostname, &haddr))!=0){
210                  log_msg(LOG_CRIT, "Failed to lookup name for %s", hostname);
211 +                close(sock);
212                  return NULL;
213          }
214  
# Line 167 | Line 220 | FILE *create_tcp_connection(char *hostname, int port){
220          log_msg(LOG_DEBUG, "Creating a tcp connection");
221          if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) !=0){
222                  log_msg(LOG_CRIT, "Failed to connect to hostname %s on port %d", hostname, port);
223 +                close(sock);
224                  return NULL;
225          }
226  
# Line 187 | Line 241 | int tcp_comm(FILE *f, char *send, char **response, cha
241          *response=fpgetline(f);
242          fseek(f, 0, SEEK_CUR);
243  
244 <        if(*response!=NULL) log_msg(LOG_DEBUG, "Recieved %s", *response);
244 >        if(*response!=NULL) log_msg(LOG_DEBUG, "Received %s", *response);
245  
246          if( (*response==NULL) || (strcmp(*response, "ERROR")==0) ) return -1;
247          
# Line 226 | Line 280 | int ihost_getconfig(ihost_state_t *ihost_state){
280          int server_udp_port=0;
281          time_t config_ttl=0;
282  
283 <        tcp_con=create_tcp_connection(ihost_state->filtermanager_host, ihost_state->filtermanager_port);
283 >        if((tcp_con=create_tcp_connection(ihost_state->filtermanager_host, ihost_state->filtermanager_port))==NULL){
284 >                return -1;
285 >        }
286  
287          if(ihost_state->file_list!=NULL || ihost_state->last_modified!=NULL){
288                  if(tcp_con==NULL){
# Line 242 | Line 298 | int ihost_getconfig(ihost_state_t *ihost_state){
298                  }
299          
300                  if((tcp_comm(tcp_con, ihost_state->last_modified, &response, "OK"))==0){
301 <                        if((tcp_comm(tcp_con, "END", &response, "OK"))==0){
301 >                        if((tcp_comm(tcp_con, "END", &response, "OK"))!=0){
302                                  goto error;
303                          }
304                          fclose(tcp_con);
# Line 313 | Line 369 | int ihost_getconfig(ihost_state_t *ihost_state){
369                          goto error;
370                  }
371  
316                printf("string : %s\n", response_ptr);
372                  server_udp_port=atoi(response_ptr);
373  
374                  if (server_udp_port==0){
# Line 334 | Line 389 | int ihost_getconfig(ihost_state_t *ihost_state){
389           * this already be NULL */
390          if(ihost_state->file_list!=NULL) free(ihost_state->file_list);
391          if(ihost_state->last_modified!=NULL) free(ihost_state->last_modified);
337        if(ihost_state->host_fqdn!=NULL) free(ihost_state->host_fqdn);
392          if(ihost_state->server_fqdn!=NULL) free(ihost_state->server_fqdn);
339        if(ihost_state->host_ip!=NULL) free(ihost_state->host_ip);
393  
394 +        if(ihost_state->preset_fqdn){
395 +                if(host_fqdn != NULL) free(host_fqdn);
396 +        }else{
397 +                if(ihost_state->host_fqdn!=NULL) free(ihost_state->host_fqdn);
398 +                ihost_state->host_fqdn=host_fqdn;
399 +        }
400 +
401 +        if(ihost_state->preset_ip){
402 +                if(host_ip != NULL) free(host_ip);
403 +        }else{
404 +                if(ihost_state->host_ip!=NULL) free(ihost_state->host_ip);
405 +                ihost_state->host_ip=host_ip;
406 +        }
407 +
408 +
409          ihost_state->file_list=file_list;
410          ihost_state->last_modified=last_modified;
343        ihost_state->host_fqdn=host_fqdn;
344        ihost_state->host_ip=host_ip;
411          ihost_state->server_fqdn=server_fqdn;
412          ihost_state->server_udp_port=server_udp_port;
413          ihost_state->udp_update_time=udp_update_time;
# Line 366 | Line 432 | error:
432  
433   int get_system_stats(int seq_no, ihost_state_t *ihost_state, char *xml, int size){
434          char tmp[size];
435 <        cpu_percent_t *cpu_percent;    
436 <        mem_stat_t *mem_stats;
437 <        load_stat_t *load_stats;
438 <        user_stat_t *user_stats;
439 <        swap_stat_t *swap_stats;
440 <        general_stat_t *general_stats;
441 <        disk_stat_t *disk_stats;
442 <        diskio_stat_t *diskio_stats;
443 <        process_stat_t *process_stats;
444 <        network_stat_t *network_stats;
445 <        page_stat_t *page_stats;
435 >        sg_cpu_percents *cpu_percent;  
436 >        sg_mem_stats *mem_stats;
437 >        sg_load_stats *load_stats;
438 >        sg_user_stats *user_stats;
439 >        sg_swap_stats *swap_stats;
440 >        sg_host_info *general_stats;
441 >        sg_fs_stats *disk_stats;
442 >        sg_disk_io_stats *diskio_stats;
443 >        sg_process_count *process_stats;
444 >        sg_network_io_stats *network_stats;
445 >        sg_page_stats *page_stats;
446          int disk_entries=0;
447          int diskio_entries=0;
448          int network_entries=0;
# Line 390 | Line 456 | int get_system_stats(int seq_no, ihost_state_t *ihost_
456                   seq_no, ihost_state->host_fqdn, time(NULL), ihost_state->host_ip);
457  
458          /* Get cpu stats, check it is correct, then fill in its entry for the xml */
459 <        if((cpu_percent=cpu_percent_usage())==NULL){
459 >        if((cpu_percent=sg_get_cpu_percents())==NULL){
460                  log_msg(LOG_CRIT, "Failed to get cpu statistics");
461          }else{
462                  snprintf(tmp, size, \
# Line 406 | Line 472 | int get_system_stats(int seq_no, ihost_state_t *ihost_
472  
473          
474          /*Get mem stats, and fill in xml */    
475 <        if((mem_stats=get_memory_stats())==NULL){
475 >        if((mem_stats=sg_get_mem_stats())==NULL){
476                  log_msg(LOG_CRIT, "Failed to get memory statistics");
477          }else{
478                  snprintf(tmp, size, \
# Line 421 | Line 487 | int get_system_stats(int seq_no, ihost_state_t *ihost_
487  
488  
489          /* Get load stats */    
490 <        if((load_stats=get_load_stats())==NULL){
490 >        if((load_stats=sg_get_load_stats())==NULL){
491                  log_msg(LOG_CRIT, "Failed to get load statistics");
492          }else{
493                  snprintf(tmp, size, \
# Line 435 | Line 501 | int get_system_stats(int seq_no, ihost_state_t *ihost_
501  
502          /* get user stats */
503          
504 <        if((user_stats=get_user_stats())==NULL){
504 >        if((user_stats=sg_get_user_stats())==NULL){
505                  log_msg(LOG_CRIT, "Failed to get user statistics");
506          }else{
507  
# Line 449 | Line 515 | int get_system_stats(int seq_no, ihost_state_t *ihost_
515  
516  
517          /* swap stats */
518 <        if((swap_stats=get_swap_stats())==NULL){
518 >        if((swap_stats=sg_get_swap_stats())==NULL){
519                  log_msg(LOG_CRIT, "Failed to get swap statistics");    
520          }else{
521                  snprintf(tmp, size, \
# Line 464 | Line 530 | int get_system_stats(int seq_no, ihost_state_t *ihost_
530  
531          /* general stats */
532          
533 <        if((general_stats=get_general_stats())==NULL){
533 >        if((general_stats=sg_get_host_info())==NULL){
534                  log_msg(LOG_CRIT, "Failed to get general statistics");
535          }else{
536                  snprintf(tmp, size, \
# Line 482 | Line 548 | int get_system_stats(int seq_no, ihost_state_t *ihost_
548  
549          
550          /* process stats */
551 <        if((process_stats=get_process_stats())==NULL){  
551 >        if((process_stats=sg_get_process_count())==NULL){      
552                  log_msg(LOG_CRIT, "Failed to get general statistics");
553          }else{
554                  snprintf(tmp, size, \
# Line 499 | Line 565 | int get_system_stats(int seq_no, ihost_state_t *ihost_
565  
566  
567          /* Get paging stats */
568 <        if((page_stats=get_page_stats_diff())==NULL){
568 >        if((page_stats=sg_get_page_stats_diff())==NULL){
569                  log_msg(LOG_CRIT, "Failed to get paging statistics");
570          }else{
571                  if(page_stats->systime!=0){
# Line 510 | Line 576 | int get_system_stats(int seq_no, ihost_state_t *ihost_
576                          y=page_stats->pages_pageout;
577                  }
578                  snprintf(tmp, size, \
579 <                        "<pages><swapins>%lld</swapins><swapouts>%lld</swapouts></pages>", \
579 >                        "<pages><pageins>%lld</pageins><pageouts>%lld</pageouts></pages>", \
580                          x, \
581                          y);
582          
# Line 520 | Line 586 | int get_system_stats(int seq_no, ihost_state_t *ihost_
586  
587          /* get diskio stats */
588          
589 <        if((diskio_stats=get_diskio_stats_diff(&diskio_entries))==NULL){
589 >        if((diskio_stats=sg_get_disk_io_stats_diff(&diskio_entries))==NULL){
590                  log_msg(LOG_CRIT, "Failed to get diskio statistics");
591          }else{
592                  strlcat(xml, "<diskio>", size);
# Line 553 | Line 619 | int get_system_stats(int seq_no, ihost_state_t *ihost_
619          
620          /* get networks stats */
621          
622 <        if((network_stats=get_network_stats_diff(&network_entries))==NULL){
622 >        if((network_stats=sg_get_network_io_stats_diff(&network_entries))==NULL){
623                  log_msg(LOG_CRIT, "Failed to get network statistics");
624          }else{
625                  strlcat(xml, "<net>", size);
# Line 585 | Line 651 | int get_system_stats(int seq_no, ihost_state_t *ihost_
651  
652          /* get disk stats */
653          
654 <        if((disk_stats=get_disk_stats(&disk_entries))==NULL){
654 >        if((disk_stats=sg_get_fs_stats(&disk_entries))==NULL){
655                  log_msg(LOG_CRIT, "Failed to get disk statistics");
656          }else{
657                  strlcat(xml, "<disk>", size);
# Line 627 | Line 693 | too_big_error:
693  
694          
695   void usage(char *progname){
696 <        fprintf(stderr, "Usage %s [options] server port\n", progname);
697 <        fprintf(stderr, "Options\n");
698 <        fprintf(stderr, "  -v           Verbose mode,-vv would make even more verbose\n");
699 <        fprintf(stderr, "  -f           Foreground mode, print errors to stderr\n");
700 <        fprintf(stderr, "  -V           Print version number\n");
701 <        fprintf(stderr, "  -h           Prints this help page\n");
696 >        fprintf(stderr, "Usage %s [-v[v]] [-f] [-n name] [-i ip] [-s server] [-p port] [-V] [-h]\n\n", progname);
697 >        fprintf(stderr, "  -v    Verbose mode, -vv would make even more verbose\n");
698 >        fprintf(stderr, "  -f    Foreground mode, print errors to stderr\n");
699 >        fprintf(stderr, "  -n    Set the machine name to be reported as\n");
700 >        fprintf(stderr, "  -i    Set the IP to be reported as\n");
701 >        fprintf(stderr, "  -s    Specifies the i-scream server to connect to\n");
702 >        fprintf(stderr, "          default: %s\n", DEF_SERVER_NAME);
703 >        fprintf(stderr, "  -p    Specifies the i-scream server port\n");
704 >        fprintf(stderr, "          default: %d\n", DEF_SERVER_PORT);
705 >        fprintf(stderr, "  -V    Print version number\n");
706 >        fprintf(stderr, "  -h    Prints this help page\n");
707 >        fprintf(stderr, "\nReport bugs to <%s>.\n", PACKAGE_BUGREPORT);
708          exit(1);
709   }
710  
# Line 659 | Line 731 | int main(int argc, char **argv){
731          ihost_config.log=stderr;
732  
733          /* Blank ihost_state to default settings */
734 <        ihost_state.filtermanager_host=NULL;
734 >        ihost_state.filtermanager_host=DEF_SERVER_NAME;
735 >        ihost_state.filtermanager_port=DEF_SERVER_PORT;
736          ihost_state.host_fqdn=NULL;
737          ihost_state.host_ip=NULL;
738 +        ihost_state.preset_fqdn = 0;
739 +        ihost_state.preset_ip = 0;
740          ihost_state.server_fqdn=NULL;
741          ihost_state.file_list=NULL;
742          ihost_state.last_modified=NULL;
743  
744 <        while((cmdopt=getopt(argc, argv, "vfhV")) != -1){
744 >        while((cmdopt=getopt(argc, argv, "vfVn:i:s:p:h")) != -1){
745                  switch(cmdopt){
746                          case 'v':
747                                  ihost_config.verbose++;
# Line 677 | Line 752 | int main(int argc, char **argv){
752                                  ihost_config.daemon=0;
753                                  break;
754  
680                        case 'h':
681                                usage(argv[0]);
682                                break;
683
755                          case 'V':
756 <                                fprintf(stderr, "%s version %s", argv[0], VERSION);
756 >                                fprintf(stderr, "%s version %s\n", argv[0], VERSION);
757                                  break;
758 +                        case 'n':
759 +                                ihost_state.preset_fqdn = 1;
760 +                                ihost_state.host_fqdn = strdup(optarg);
761 +                                if(ihost_state.host_fqdn == NULL){
762 +                                        fprintf(stderr, "Missing hostname\n");  
763 +                                        usage(argv[0]);
764 +                                }
765 +                                break;
766 +                        case 'i':
767 +                                /* Hmm.. Someone could set any string to be the IP, and it will let it */
768 +                                ihost_state.preset_ip = 1;
769 +                                ihost_state.host_ip = strdup(optarg);
770 +                                if(ihost_state.host_ip == NULL){
771 +                                        fprintf(stderr, "Missing ip\n");        
772 +                                        usage(argv[0]);
773 +                                }
774 +                                break;
775  
776 +                        case 's':
777 +                                ihost_state.filtermanager_host=strdup(optarg);
778 +                                break;
779 +
780 +                        case 'p':
781 +                                ihost_state.filtermanager_port=atoi(optarg);
782 +                                break;
783 +
784 +                        case 'h':
785                          default:
786                                  usage(argv[0]);
787                                  exit(1);
788                  }
789          }
790  
694        if(argc!=optind+2){
695                usage(argv[0]);
696                exit(1);
697        }
698
699        ihost_state.filtermanager_host=strdup(argv[optind]);
700        ihost_state.filtermanager_port=atoi(argv[optind+1]);
701        
791          if(gethostbyname(ihost_state.filtermanager_host)==NULL){
792                  log_msg(LOG_CRIT, "Failed to lookup hostname. Please check settings");
793                  exit(1);
# Line 723 | Line 812 | int main(int argc, char **argv){
812                          exit(1);
813                  }
814          
815 <                if((ihost_config.log=fopen(LOGFILE_PATH, "a"))==NULL){
815 >                if((ihost_config.log=fopen(LOG_FILE, "a"))==NULL){
816                          ihost_config.log=stderr;
817 <                        log_msg(LOG_CRIT, "Failed to open Logfiles %s for writing", LOGFILE_PATH);
817 >                        log_msg(LOG_CRIT, "Failed to open Logfiles %s for writing", LOG_FILE);
818                          exit(1);
819                  }
820  
# Line 735 | Line 824 | int main(int argc, char **argv){
824  
825          }
826  
827 <        log_msg(LOG_INFO, "Starting ihost");
827 >        log_msg(LOG_INFO, "Starting ihost...");
828 >
829 >        log_msg(LOG_DEBUG, "Running statgrab_init()");
830 >        if(statgrab_init()){
831 >                log_msg(LOG_CRIT, "statgrab_init failed (%m)");
832 >                exit(1);
833 >        }
834          
835          log_msg(LOG_DEBUG,"Writing PID FILE");
836  
# Line 763 | Line 858 | int main(int argc, char **argv){
858                  sleep(10);
859          }
860  
766        printf("%s\n%d\n", ihost_state.server_fqdn, ihost_state.server_udp_port);
861          while((create_udp_sockinfo(&udp_sockinfo, ihost_state.server_fqdn, ihost_state.server_udp_port))!=0){
862                  log_msg(LOG_ERR, "Failed to create udp socket");        
863                  sleep(10);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines