<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2900.3157" name=GENERATOR></HEAD>
<BODY>
<DIV><FONT face=Arial size=2><SPAN class=442423412-12102007>(This is a resend 
since the formatting was crapped out in the previous mail)</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>Hi.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>The problem with parsing is to know what you want 
to parse.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>The first step is to send your information to 
hobbit and see it displayed.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>Second step is to configure hobbitlaunch.cfg file 
to send the data from the column to your script.<BR>  FROM 
/etc/hobbit/hobbitlaunch.cfg<BR>[rrdstatus]<BR>        
ENVFILE 
/usr/lib/hobbit/server/etc/hobbitserver.cfg<BR>        
NEEDS hobbitd<BR>        CMD hobbitd_channel 
--channel=status --log=$BBSERVERLOGS/rrd-status.log hobbitd_rrd 
--extra-tests=hitastig --extra-script=/usr/lib/hobbit/server/ext/rrd_digitemp.pl 
--rrddir=$BBVAR/rrd The --extra-tests is the definition of what columns you want 
to parse. You can have as many columns as you like, comma seperated.<BR>The 
--extra-script is the path to the script that you wish to run to do the parsing. 
You can only have one there.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>Then you have to edit hobbitserver.cfg and add the 
test to TEST2RRD and GRAPHS variables.<BR>Then either reboot the server or kill 
hobbit_channel processes (they should restart the next time they are scheduled 
to run)</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>To begin to know what you have to parse, just tell 
the script to write to some file (overwrite, not append .. Unless of course you 
want it to grow bigger and bigger). It should be very similar to what the web 
site shows.<BR>Alternatively there should be a way to use the bb program to 
display it, but I didn't bother finding out how.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>Then of course you do your parsing.<BR>I recommend 
that you read about RRD graphs and how you can display different values (is it a 
counter, is it a variable like temperature, percentage etc etc) on the official 
RRD website which slips my mind ATM where it is located .. Google will probably 
help.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>You should receive 3 args from hobbit when it runs 
your script, it behaves so: $scriptname $hostname $testname $messagefile The 
messagefile is a temporary file which you shall parse.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>The final stage is to output your information to 
hobbit in a way it understands, printing directly to STDOUT.<BR>The format is 
so, note that you don’t have to have the type GAUGE, replace with what you 
need:<BR>DS:<datasetname>:GAUGE:600:0:100<BR><Testname>.<sensorname>.rrd<BR><value><BR>DS:<datasetname>:GAUGE:600:0:100<BR><Testname>.<sensor2name>.rrd<BR><value><BR>Etc 
etc..</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>A tip for the wise, I had a lot of struggle with 
this when I was making it, and then realised that I can't have the datasetnames 
any different in all the files, it has to be static, that is, one 
name.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>Then you should check if there are any RRD files 
being made.<BR>They should be located in 
/var/lib/hobbit/rrd/<hostname>/</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>Then there comes the fun, to be able to show off 
your results in a graph. You should edit hobbitgraph.cfg file for that.<BR>Mine 
looks like this:<BR>[hitastig]<BR>        
FNPATTERN hitastig.(.*).rrd<BR>        TITLE 
Hitastig<BR>        YAXIS 
Celsius<BR>        
DEF:h@RRDIDX@=@RRDFN@:temperature:AVERAGE<BR>        
LINE2:h@RRDIDX@#@COLOR@:@RRDPARAM@<BR>        
GPRINT:h@RRDIDX@:LAST: \: %5.1lf 
(cur)<BR>        GPRINT:h@RRDIDX@:MAX: \: 
%5.1lf (max)<BR>        GPRINT:h@RRDIDX@:MIN: 
\: %5.1lf (min)<BR>        
GPRINT:h@RRDIDX@:AVERAGE: \: %5.1lf (avg)\n</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>The files it expects are 
hitastig.<sensorname>.rrd, don't let that extra dot fool you, it needs to 
be there.<BR>See in the DEF line, the name I chose for the datasets is 
temperature. (I REMIND YOU AGAIN, IT NEEDS TO BE STATIC)</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>If you do this successfully, you should see a graph 
in hobbit as soon as you finish this last thing (just let the website refresh 
once).</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>For reference (and of course to future developers 
that will read the mailing list archive) I will attach my scripts here so you 
know what to expect.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>dgitemp.pl -- This script reads from digitemp 
values, names and peak values from the MySQL database and sends them to 
hobbit.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>#!/usr/bin/perl<BR># This script reads digitemp 
values and writes them to a # temporary file which the hobbit client sends out 
to # the Hobbit Monitor.<BR># This script really should be rewritten so it will 
contain subs for operations.<BR># That would be much more tidier.<BR># Written 
by Sigurdur Gudbrandsson<BR># <A 
href="mailto:sigurdur@raforninn.is">sigurdur@raforninn.is</A></FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>use strict;<BR>use DBI;</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Lets declare our variables</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>my $db_user = "username"; # Change to whatever your 
username is my $db_pass = "password"; # Change to whatever your password is my 
$db_name = "stats"; my $table_meta = "digitemp_metadata"; my $table = 
"digitemp";</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># We need to get some variables from the 
environment, don't change this my $BB = $ENV{BB}; my $BBDISP = $ENV{BBDISP}; my 
$MACHINE = $ENV{MACHINE}; my $BBTMP = $ENV{BBTMP};</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Change this to whatever you want your test to be 
named my $testname = "hitastig";</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Don't change this or your test will never be 
green my $color = "green";</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Set this to other than 0 if you want to debug my 
$debug = 0;</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Lets connect to the database<BR>my $dbh = 
DBI->connect("DBI:mysql:$db_name","$db_user","$db_pass")<BR>          
or die "I cannot connect to dbi:mysql:$db_name as $db_user - 
$DBI::errstr\n";</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Lets get the sensor ID's, names and min/max 
values</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>my $sql = "SELECT 
SerialNumber,name,description,min,max FROM $db_name.$table_meta";</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>my $sth = $dbh->prepare($sql) or die "Can't 
execute statement $sql because: $DBI::errstr"; $sth->execute();</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>my (@sensors) = ();<BR>while (my @ary = 
$sth->fetchrow_array()) {<BR>        if 
($ary[3] == "NULL") 
{<BR>                
$ary[3] = 0.000;<BR>        
}<BR>        if ($ary[4] == "NULL") 
{<BR>                
$ary[4] = 99.999;<BR>        
}<BR>        push(@sensors, [@ary]);  # 
[@ary] is a reference } $sth->finish();</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Now we have all the sensors in a two dimensional 
array, @sensors # Also, if there is a NULL value in min or max, it has been 
substituted with a value</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Now we will get the temperature of each sensor 
from the database # and check if the temp is too high or too low.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>my $count = 0;<BR>while (@{sensors[$count]}) 
{<BR>        print "WHILE: entering first 
while loop\n" if ($debug);<BR>        my $sql 
= "SELECT Fahrenheit FROM $db_name.$table WHERE 
SerialNumber='$sensors[$count][0]' ORDER BY dtKey DESC LIMIT 
0,1";<BR>        print "SQL: term is \" $sql 
\" \n" if ($debug);<BR>        my $sth = 
$dbh->prepare($sql) or die "Can't execute statement $sql because: 
$DBI::errstr";<BR>        
$sth->execute();<BR>        
$sensors[$count][5] = 
$sth->fetchrow_array();<BR>        if 
($sensors[$count][5] > 
$sensors[$count][4]){<BR>                
print "IF: status for $sensors[$count][1] is red\n" if 
($debug);<BR>                
$sensors[$count][6] = 
"&red";<BR>                
$color = "red";<BR>        
}<BR>        elsif ($sensors[$count][5] < 
$sensors[$count][3]){<BR>                
print "IF: status for $sensors[$count][1] is yellow\n" if 
($debug);<BR>                
$sensors[$count][6] = 
"&yellow";<BR>                
if ($color != 
"red"){<BR>                        
$color = 
"yellow";<BR>                
}<BR>        
}<BR>        else 
{<BR>                
print "IF: status for $sensors[$count][1] is green\n" if 
($debug);<BR>                
$sensors[$count][6] = 
"&green";<BR>        
}<BR>        
$sth->finish();<BR>        
$count++;<BR>}</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># We can close the database 
now<BR>$dbh->disconnect();</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Next is to get our results into an array # For 
reference, 0=SerialNumber 1=name 2=description 3=min 4=max 5=value 6=color in 
our array</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>my $tmp = 
"\n";         # First line in the 
array<BR>print $color if ($debug);<BR>$count = 0;<BR>while (@{sensors[$count]}) 
{<BR>        print "WHILE: entering second 
while loop\n" if ($debug);<BR>        print 
"WHILE: $sensors[$count][1] is being printed\n" if 
($debug);<BR>        $tmp = 
$tmp."    $sensors[$count][6]    
$sensors[$count][1] = 
$sensors[$count][5]\n";<BR>        $tmp = 
$tmp."            : 
min=$sensors[$count][3] 
max=$sensors[$count][4]\n";<BR>        $tmp = 
$tmp."            : 
$sensors[$count][2]\n\n";<BR>        
$count++;<BR>}</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Now we decode from UTF-8 to latin1 (iso-8859-1) 
if there is anything in utf8 open(TEMP, ">$BBTMP/$testname.tmp.txt"); print 
TEMP $tmp; close(TEMP);</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Now we get the converted data<BR>$tmp = 
`/usr/bin/iconv -f utf8 -t iso-8859-1 $BBTMP/$testname.tmp.txt`;</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2># Now finally we output the information to our 
beloved hobbit my $date = localtime; my $cmd = "$BB $BBDISP \"status 
$MACHINE.$testname $color $date \n $tmp \n \""; system($cmd);</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>print $cmd if ($debug);<BR>print $tmp if 
($debug);</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>exit;</FONT></DIV>
<DIV> </DIV><FONT face=Arial size=2>
<DIV><BR>Here is the output from this script</DIV>
<DIV> </DIV>
<DIV>    &green    Tölvu_kæling = 21.25 
C<BR>            : 
min=1.000 
max=25.000<BR>            
: This sensor has not yet been described</DIV>
<DIV> </DIV>
<DIV>    &green    Verkstæði = 25.81 
C<BR>            : 
min=0.000 
max=99.999<BR>            
: This sensor has not yet been described</DIV>
<DIV> </DIV>
<DIV>    &green    Tölvuskápur = 22.12 
C<BR>            : 
min=14.000 
max=25.000<BR>            
: This sensor has not yet been described</DIV>
<DIV> </DIV>
<DIV>    &green    Tölvu_kæl_út = 46.38 
C<BR>            : 
min=0.000 
max=99.999<BR>            
: This sensor has not yet been described</DIV>
<DIV> </DIV>
<DIV>rrd_digitemp.pl -- This script parses the information from hobbit and 
produces the channel data to make the RRD files.</DIV>
<DIV> </DIV>
<DIV>#!/usr/bin/perl</DIV>
<DIV> </DIV>
<DIV>use strict;</DIV>
<DIV> </DIV>
<DIV># Input parameters: Hostname, testname (column), and messagefile my 
$hostname=$ARGV[0]; my $testname=$ARGV[1]; my $fname=$ARGV[2];</DIV>
<DIV> </DIV>
<DIV>my ($line1, @line, @buff, @key, @value, $value, @tmp);</DIV>
<DIV> </DIV>
<DIV>open(IN,"$fname");<BR>read(IN, $line1, 
10000);<BR>@line=split('\n',$line1);<BR>@buff = grep(/ = 
/,@line);<BR>close(IN);<BR>chomp(@buff);                                   
# Lets strip the newline if there is any.<BR>for( my $i = 0; $i < 
scalar(@buff); $i++)       # Now we go through the 
whole array of lines<BR>{<BR>        
$buff[$i] = substr($buff[$i], 10);      # Trimming the 
beginning<BR>        $buff[$i] =~ s/ 
C//g;                   
# Removing the end<BR>        $buff[$i] =~ s/ 
//g;                    
# Removing all the whitespace<BR>        @tmp 
= split('=', $buff[$i]);<BR>        $key[$i] 
= makesafe($tmp[0]);<BR>        $value[$i] = 
$tmp[1];<BR>#        print 
$buff[$i]."\n";                   
# Printing a test line to view the results<BR>}</DIV>
<DIV> </DIV>
<DIV>open(IN,">>/var/log/hobbit/custrrd.log");<BR>write($buff[1]);<BR>close(IN);</DIV>
<DIV> </DIV>
<DIV><BR># The next loop will print out the information for making the RRD 
file.<BR>for( my $i = 0; $i < scalar(@key); $i++ ) 
{<BR>        print 
"DS:temperature:GAUGE:600:0:100\n";      # Prints out 
each sensor name<BR>#       print 
"DS:".$key[$i].":GAUGE:600:0:100\n";      # Prints out 
each sensor name<BR>        print 
$testname.".".$key[$i].".rrd\n";          
# Prints out the rrd file name<BR>        
print 
$value[$i]."\n";                          
# Prints out the value<BR>}</DIV>
<DIV> </DIV>
<DIV># This sub produces safe output so hobbit will be able to make the files # 
(It seems that hobbit doesn't like special letters in file names) sub makesafe 
{<BR>        my $word = 
shift;<BR>        $word =~ 
s/ö/o/g;<BR>        $word =~ 
s/á/a/g;<BR>        $word =~ 
s/í/i/g;<BR>        $word =~ 
s/é/e/g;<BR>        $word =~ 
s/ó/o/g;<BR>        $word =~ 
s/ý/y/g;<BR>        $word =~ 
s/ú/u/g;<BR>        $word =~ 
s/æ/ae/g;<BR>        $word =~ 
s/ð/d/g;<BR>        $word =~ 
s/þ/th/g;<BR>#       $word =~ 
s/_//g;<BR>#       $word = 
lc($word);<BR>        return 
$word;<BR>}</DIV>
<DIV> </DIV>
<DIV>exit;</DIV>
<DIV> </DIV>
<DIV><BR>I hope this isn't overkill. :)</DIV>
<DIV> </DIV>
<DIV>With regards,</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>------------------------------</DIV>
<DIV> </DIV>
<DIV>Sigurður Guðbrandsson</DIV>
<DIV> </DIV>
<DIV>Raförninn ehf.</DIV>
<DIV> </DIV>
<DIV>Suðurhlíð 35</DIV>
<DIV> </DIV>
<DIV>105 Reykjavik | Iceland</DIV>
<DIV> </DIV>
<DIV><A href="mailto:sigurdur@raforninn.is">sigurdur@raforninn.is</A> | <A 
href="http://www.raforninn.is">www.raforninn.is</A></DIV>
<DIV> </DIV>
<DIV>Office: +(354) 552 2070</DIV>
<DIV> </DIV>
<DIV>Mobile: +(354) 867 3573</DIV>
<DIV> </DIV>
<DIV>------------------------------</DIV>
<DIV> </DIV>
<DIV><BR>-----Original Message-----<BR>From: Alan Sparks 
[mailto:asparks@doublesparks.net]<BR>Sent: 10. október 2007 21:06<BR>To: 
Sigurður Guðbrandsson<BR>Subject: Re: [hobbit] Custom graphs with multiple data 
sources</DIV>
<DIV> </DIV>
<DIV>Since I am in the same boat with my server (downtime not an option), I am 
interested in your approach.  I already have custom scripts for this, but 
am interested in what you do differently as far as parsing.  Are you 
parsing the incoming messages and re-sending them to Hobbit?  What is the 
"proper format?"<BR>Thanks for your reply.<BR>-Alan</DIV>
<DIV> </DIV>
<DIV>  wrote:<BR>> Hi.<BR>><BR>> There is a fourth option, which I 
took as updating to snapshot caused my hobbit to break for some reason, and 
seeing that it is a system I must have up 99% of the day, I just 
backported.<BR>> Well, that was not the option anyways :)<BR>><BR>> My 
suggestion is that you make a custom script to parse your information and create 
the RRD's (actually the hobbit server manages creating the RRD's .. You just 
have to parse the information and send it in the proper format to 
hobbit).<BR>> That way you can have your multi-file RRD's (one per balancer 
or some) and you don't have to update to snapshot.<BR>><BR>> I wrote my 
script in perl (my very first perl script .. How I hate the language ;) and it 
works very well.<BR>> You will not find it in the Shire, mainly because I 
haven't posted it there yet.<BR>><BR>> If you need info on how the 
information is, and how to parse it, just drop me a line.<BR>><BR>> With 
regards,<BR>><BR>><BR>> ------------------------------<BR>><BR>> 
Sigur ur Gu brandsson<BR>><BR>> Raf rninn ehf.<BR>><BR>> Su 
urhl   35<BR>><BR>> 105 Reykjavik | Iceland<BR>><BR>> <A 
href="mailto:sigurdur@raforninn.is">sigurdur@raforninn.is</A> | <A 
href="http://www.raforninn.is">www.raforninn.is</A><BR>><BR>> Office: 
+(354) 552 2070<BR>><BR>> Mobile: +(354) 867 3573<BR>><BR>> 
------------------------------<BR>><BR>><BR>> -----Original 
Message-----<BR>> From: Charles Goyard 
[mailto:charles.goyard@orange-ftgroup.com]<BR>> Sent: 10. okt ber 2007 
06:50<BR>> To: <A href="mailto:hobbit@hswn.dk">hobbit@hswn.dk</A><BR>> 
Subject: Re: [hobbit] Custom graphs with multiple data sources<BR>><BR>> 
Hi,<BR>><BR>><BR>> Alan Sparks wrote :<BR>><BR>>   
<BR>>> However, with this, I am only able to manage one graph, and one 
data <BR>>> source, per device.  I would like to graph all the 
session values.<BR>>> I would also like to use multiple RRD files.  
My experience with the <BR>>> single-file, multiple-DS approach is that, 
if I add another virtual, <BR>>> graphing will break (updates error out, 
probably since the RRD was <BR>>> not created with this new data source 
defined).<BR>>> [...]<BR>>>     <BR>><BR>> 
Check the september 2007 mail archives, there's a discussion about 
it.<BR>><BR>> There's three solutions :<BR>><BR>> - apply a patch I 
posted on the list (does split-ncv on a testname<BR>>   basis). My 
patch has a memory leak, so beware (I kill my hobbitd_rrd<BR>>   
every 24h).<BR>> - send "data" messages with a body like 
"foo.rrd:mydsname:GAUGE:500<BR>>   (Sorry, no pointers for that 
one, and it needs a recent snapshot).<BR>> - take a snapshot or a least the 
hobbitd/rrd directory from the source,<BR>>   it includes the 
split-ncv feature without the memory leak (thank<BR>>   
Henrik).<BR>><BR>><BR>> --<BR>> Charles Goyard - <A 
href="mailto:charles.goyard@orange-ftgroup.com">charles.goyard@orange-ftgroup.com</A> 
- (+33) 1 45 38 01<BR>> 31 Orange Business Services - online multimedia  
// ing nierie<BR>><BR>> To unsubscribe from the hobbit list, send an 
e-mail to <BR>> <A 
href="mailto:hobbit-unsubscribe@hswn.dk">hobbit-unsubscribe@hswn.dk</A><BR>><BR>><BR>> 
To unsubscribe from the hobbit list, send an e-mail to <BR>> <A 
href="mailto:hobbit-unsubscribe@hswn.dk">hobbit-unsubscribe@hswn.dk</A><BR>><BR>><BR>><BR>>   
</DIV>
<DIV> </DIV>
<DIV><BR>--<BR>Alan Sparks, UNIX/Linux Systems Integration and Administration 
<<A 
href="mailto:asparks@doublesparks.net">asparks@doublesparks.net</A>><BR></FONT></DIV>
<DIV> </DIV>
<DIV align=left><FONT size=2>
<P align=left>------------------------------</P>
<P>Sigurður Guðbrandsson<BR>Raförninn ehf.<BR>Suðurhlíð 35<BR>105 Reykjavik | 
Iceland<BR><A 
href="mailto:sigurdur@raforninn.is">sigurdur@raforninn.is</A> | <A 
href="http://www.raforninn.is/">www.raforninn.is</A></FONT><BR><FONT 
size=2>Office: +(354) 552 2070<BR>Mobile: +(354) 867 3573</P>
<P>------------------------------</P></FONT></DIV>
<DIV> </DIV></BODY></HTML>