Yemi,

 COOL. I have seen others to comment on it. When you are ready with the
"final" patch just open an bugzilla entry and attach the patch to it
(diff -udpr). Post the bugzilla # and someone will take care of the
thing.

Martin

--- Adeyemi Adesanya <[EMAIL PROTECTED]> wrote:

> 
> OK,
> 
> To those of you who have been waiting for my Ganglia host spoofing  
> mod/hack - I'm sorry! Time to put the powers of open source  
> development to work. This modification of mine will allow you to send
>  
> gmetric messages on behalf of another host. This host may be real or 
> 
> imaginary. No steps are taken to verify the host name and IP you  
> provide to gmetric!!!
> 
> Example:
> 
> gmetric --conf=/var/ganglia/gmond.conf -- 
> spoof=123.456.678.901:YemiAbstractDevice --name=speed --value=35 -- 
> units=mph --type=uint8
> 
> Will cause recipient gmond daemons to insert the metric update under 
> 
> the host name "YemiAbstractDevice" with the IP address
> 123.456.678.901 .
> 
> This may prove to be invaluable for monitoring SNMP devices or  
> anything else you cannot run gmond on directly.
> 
> To implement this feature I added a spoof gmetric message structure  
> to the xdr protocol. The spoof data consists of the fake name and IP 
> 
> address along with the regular gmetric data. Nothing fancy. When  
> gmond gets this message it uses the spoof data instead of taking the 
> 
> info from the IP header. Once the data is inserted into the gmond  
> hash table it is indistinguishable. You can see this by querying the 
> 
> XML port.
> 
> This is a first attempt and I hope that we can revise and improve  
> this code in order to get it into a future release. We should  
> consider the security implications of this feature. I suggest you  
> restrict your user's access to this patched implementation for now.
> 
> 
> Below are patches for the ganglia-3.0.3 source code files:
> 
> lib/protocol.x
> lib/libgmond.c
> lib/ganglia.h
> gmond/gmond.c
> gmetric/gmetric.c
> 
> Save the patches to patchfiles and use the patch command:
> 
> patch <originalfile> <patchfile>
> 
> The only other mod required is to gmetric/cmdline.sh . Just add the  
> following option line to this file and run gengetopt:
>       option "spoof" S "IP address and name of host/device (colon  
> separated) we are spoofing" string default="" no
> 
> I think gmetric/cmdline.sh may only be available from the CVS source 
> 
> tree.
> 
> That's it. recompile and try sending a spoof message to a modified  
> gmond. I look forward to your feedback. Let's see if we can get this 
> 
> (or something like it) in an upcoming release.
> 
> -------
> Yemi
> 
> 
> 
> 
> ===== Use the following to patch lib/protocol.x ==========
> 26a27,33
>  > /* Yemi */
>  > struct Ganglia_spoof_message {
>  >   string spoofName<>;
>  >   string spoofIP<>;
>  >   struct Ganglia_gmetric_message gmetric;
>  > };
>  >
> 95c102,104
> <    GANGLIA_NUM_25_METRICS /* this should always directly follow the
>  
> last 25 metric_* */
> ---
>  >    GANGLIA_NUM_25_METRICS, /* this should always directly follow  
> the last 25 metric_* */
>  > /* Yemi */
>  >    spoof_metric
> 100a110,112
>  > /* Yemi */
>  >   case spoof_metric:
>  >     Ganglia_spoof_message spmetric;
> ===== Use the following to patch lib/libgmond.c ==========
> 702a703,750
>  > // Yemi
>  > int
>  > Ganglia_gmetric_send_spoof( Ganglia_gmetric gmetric,  
> Ganglia_udp_send_channels send_channels, char* spoof_info)
>  > {
>  >   int len;
>  >   XDR x;
>  >   char gmetricmsg[1500];
>  >   Ganglia_message msg;
>  >   char *spoofName;
>  >   char *spoofIP;
>  >   char *buff;
>  >   int spoof_info_len;
>  >   int result;
>  >
>  >   spoof_info_len = strlen(spoof_info);
>  >   buff = malloc(spoof_info_len+1);
>  >   strcpy(buff,spoof_info);
>  >   spoofIP = buff;
>  >   if( !(spoofName = strchr(buff+1,':')) ){
>  >       fprintf(stderr,"Incorrect format for spoof argument.
> exiting. 
> \n");
>  >       exit(1);
>  >   }
>  >   *spoofName = 0;
>  >   spoofName++;
>  >   if(!(*spoofName)){
>  >       fprintf(stderr,"Incorrect format for spoof argument.
> exiting. 
> \n");
>  >       exit(1);
>  >   }
>  >   printf(" spoofName: %s    spoofIP: %s \n",spoofName,spoofIP);
>  >
>  >   msg.id = spoof_metric;
>  >
>  >   msg.Ganglia_message_u.spmetric.spoofName = spoofName;
>  >   msg.Ganglia_message_u.spmetric.spoofIP = spoofIP;
>  >   msg.Ganglia_message_u.spmetric.gmetric = *(gmetric->msg);
>  >
>  >   // memcpy( &(msg.Ganglia_message_u.gmetric), gmetric->msg,
> sizeof 
> (Ganglia_gmetric_message));
>  >
>  >   /* Send the message */
>  >   xdrmem_create(&x, gmetricmsg, 1500, XDR_ENCODE);
>  >   xdr_Ganglia_message(&x, &msg);
>  >   len = xdr_getpos(&x);
>  >   result = Ganglia_udp_send_message( send_channels, gmetricmsg,
> len);
>  >   free(buff);
>  >   return result;
>  >
>  > }
>  >
> ===== Use the following to patch lib/ganglia.h ==========
> 60a61,62
>  > // Yemi
>  > int Ganglia_gmetric_send_spoof( Ganglia_gmetric gmetric,  
> Ganglia_udp_send_channels send_channels, char* spoof_info);
> ===== Use the following to patch gmond/gmond.c ==========
> 581c581
> <
> ---
>  > // Yemi
> 583c583
> < Ganglia_host_get( char *remoteip, apr_sockaddr_t *sa,  
> Ganglia_message *fullmsg)
> ---
>  > Ganglia_host_get( char *remIP, apr_sockaddr_t *sa, Ganglia_message
>  
> *fullmsg)
> 589c589,590
> <
> ---
>  >   char *remoteip = remIP;
>  >
> 593a595,599
>  >
>  >   if(fullmsg->id == spoof_metric){
>  >       hostname = fullmsg->Ganglia_message_u.spmetric.spoofName;
>  >       remoteip = fullmsg->Ganglia_message_u.spmetric.spoofIP;
>  >   }
> 741a748,756
>  > // Yemi
>  > static Ganglia_metric *
>  > Ganglia_message_find_spmetric( Ganglia_host *host, Ganglia_message
>  
> *message)
>  > {
>  >   /* Keyed on the name element of the gmetric sent */
>  >   return (Ganglia_metric *)apr_hash_get( host->gmetrics,
>  >                                  message- 
>  >Ganglia_message_u.spmetric.gmetric.name,
>  >                                  APR_HASH_KEY_STRING);
>  > }
> 756c771
> <
> ---
>  >
> 764a780,784
>  >   // Yemi
>  >   else if(message->id == spoof_metric)
>  >     {
>  >       metric = Ganglia_message_find_spmetric( host, message);
>  >     }
> 787a808,812
>  >       // Yemi
>  >       if(message->id == spoof_metric)
>  >       {
>  >         metric->name = apr_pstrdup( metric->pool, message- 
>  >Ganglia_message_u.spmetric.gmetric.name );
>  >       }
> 796c821,823
> <   memcpy(&(metric->message), message, sizeof(Ganglia_message));
> ---
>  >   // Yemi
>  >   if(message->id == spoof_metric){
>  >     // Store data as regular gmetric in hash table!!
> 798c825,833
> <   if(message->id == metric_user_defined)
> ---
>  >       metric->message.id = metric_user_defined;
>  >       metric->message.Ganglia_message_u.gmetric = message- 
>  >Ganglia_message_u.spmetric.gmetric;
>  >
>  >
>  >   }else{
>  >       memcpy(&(metric->message), message,
> sizeof(Ganglia_message));
>  >   }
>  >
>  >   if(message->id == metric_user_defined || message->id ==  
> spoof_metric)
> ===== Use the following to patch gmetric/gmetric.c ==========
> 75c75,81
> <   rval = Ganglia_gmetric_send(gmetric, send_channels);
> ---
>  >   //Yemi
>  >   if(!strlen(args_info.spoof_arg))
>  >     {
>  >       rval = Ganglia_gmetric_send(gmetric, send_channels);
>  >     }else{
>  >       rval = Ganglia_gmetric_send_spoof(gmetric,  
> send_channels,args_info.spoof_arg);
>  >     }
> ==== end of patches ======= 
>     
> 
> 
> -------------------------------------------------------
> Using Tomcat but need to do more? Need to support web services,
> security?
> Get stuff done quickly with pre-integrated technology to make your
> job easier
> Download IBM WebSphere Application Server v.1.0.1 based on Apache
> Geronimo
>
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
> _______________________________________________
> Ganglia-developers mailing list
> Ganglia-developers@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/ganglia-developers
> 
> 

------------------------------------------------------
Martin Knoblauch
email: k n o b i AT knobisoft DOT de
www:   http://www.knobisoft.de

Reply via email to