A good starting Weathermap example fromr a weathermap addict

Support questions about the Network Weather Map plugin

Moderators: Moderators, Developers

Author
Message
ikorzha758
Cacti User
Posts: 162
Joined: Thu Jan 21, 2010 8:41 pm

A good starting Weathermap example fromr a weathermap addict

#1 Post by ikorzha758 » Wed Feb 04, 2015 9:39 am

To All, I been using Howie weathermaps for the last 5 years plus. Over the years I have developed a strong addiction to network environment monitoring via Howie's tool :) and infected everyone around me to the point that we use Cacti as our primary network monitoring tool with Cacti Weathermap being the main focus!
Today I would like to share my best knowledge that I have acquired over the last 5 years as well as some transparent images and fonts I have created and collected over the years to support my habit.
I'm including a complete example of map config file as a starting point for anyone looking to create a professional looking map. Of cause I have removed some of the private data to protect the innocent. Please note: There are few features (such as VPN tunnel uptime and CISCO ASA VPN tunnel logout) that use features that isn't currently publicly released code by Howie, but part of development SVN.
Attachments
Example-map.png
Example-map.png (142.44 KiB) Viewed 9300 times
images.rar
Cacti weathermap Images folder. All the custom images I have created over time.
(2.18 MiB) Downloaded 1001 times
Example-map.rar
Map Example conf file + fonts details
(504.4 KiB) Downloaded 1280 times

Atreides
Cacti User
Posts: 151
Joined: Mon May 31, 2010 9:26 am

Re: A good starting Weathermap example fromr a weathermap ad

#2 Post by Atreides » Sat Feb 14, 2015 3:27 pm

Hello,
I wanna be the first to thank you for you work and for sharing. In a world where's so much competition and more and more people are keeping things for themselfs, its a breath of fresh air to see a post like yours.


PS : I've shown your maps to almost everyone I know and its into Cacti/Monitoring.


SO : A big thank you.

ikorzha758
Cacti User
Posts: 162
Joined: Thu Jan 21, 2010 8:41 pm

Re: A good starting Weathermap example fromr a weathermap ad

#3 Post by ikorzha758 » Sun Feb 15, 2015 2:38 pm

Thank your for a big thank you, but in my opinion the BIGGEST thank you deserves Howie!
Also I would like to comment that I wish people who have done a quality Maps In cacti would post their configs for users to review and use as a starting point. In opinion it would go a long way in increasing visibility of this great project. I for my part always love to examine other people's configs for the maps to learn new ways of how to do things in cacti or at a very least pick new ideas since that is what makes this project great.

P.S I have posted some of my quality maps starting from this page forward: http://forums.cacti.net/viewtopic.php?f ... &start=120
Just screenshots no configs.

User avatar
Happiness0
Cacti User
Posts: 63
Joined: Wed Oct 29, 2014 5:01 am
Contact:

Re: A good starting Weathermap example fromr a weathermap ad

#4 Post by Happiness0 » Wed Feb 25, 2015 8:24 am

Great, thanks for sharing!

aftershocks
Cacti User
Posts: 117
Joined: Fri Aug 22, 2014 2:11 pm

Re: A good starting Weathermap example fromr a weathermap ad

#5 Post by aftershocks » Sat Apr 11, 2015 11:24 am

Hi ikorzha758,

Your weathermap is truly amazing and advanced!

I downloaded your weather map example and was shocked at how you were able to achieve so many different functions that I did not know you could do..

I do have a few questions if that's ok..

Is your ISP icon changing colours based on the status? For example, if the ISP is "down", then it shows red? If up, it's green?

How were you able to do the interface status? I'm trying to traceback your source code but I got way too confused.. May you also please explain to me how you were able to put all the info such as:

firewall policy - last pushed, I assume?
is primary xxx vpn tunnel up - how did you make a dynamic picture display yes/no based on status?
active/standby - how do you show the status dynamically?

Thanks so much for your help!!

aftershocks
Cacti User
Posts: 117
Joined: Fri Aug 22, 2014 2:11 pm

Re: A good starting Weathermap example fromr a weathermap ad

#6 Post by aftershocks » Sun Apr 12, 2015 3:39 am

May I also know how you were able to display your bandwidth in percentage?

zeki893
Posts: 8
Joined: Wed Jan 04, 2012 9:17 pm

Re: A good starting Weathermap example fromr a weathermap ad

#7 Post by zeki893 » Wed Apr 15, 2015 3:09 am

awesome map :D
i wish there was a quicker way to make diagrams like your switches. i have about 300 switches.

User avatar
Howie
Cacti Guru User
Posts: 5362
Joined: Thu Sep 16, 2004 5:53 am
Location: United Kingdom
Contact:

Re: A good starting Weathermap example fromr a weathermap ad

#8 Post by Howie » Wed Apr 15, 2015 9:06 am

There is a quicker way - scripting! Or even Excel to calculate the positions for the nodes. I'll write up an example on my blog sometime.
Weathermap 0.98a is out! & QuickTree 1.0. Superlinks is over there now (and built-in to Cacti 1.x).
Some Other Cacti tweaks, including strip-graphs, icons and snmp/netflow stuff.
(Let me know if you have UK DevOps or Network Ops opportunities, too!)

aftershocks
Cacti User
Posts: 117
Joined: Fri Aug 22, 2014 2:11 pm

Re: A good starting Weathermap example fromr a weathermap ad

#9 Post by aftershocks » Mon Apr 27, 2015 12:19 pm

@ ikorzha758: any chance you could reply when you're free regarding my questions? :) You have some pretty awesome features you implemented there...

User avatar
Happiness0
Cacti User
Posts: 63
Joined: Wed Oct 29, 2014 5:01 am
Contact:

Re: A good starting Weathermap example fromr a weathermap ad

#10 Post by Happiness0 » Tue Apr 28, 2015 1:10 am

I'm not ikorzha758 but to display percent of bandwidth you should look at http://network-weathermap.com/manual/0. ... NK_BWLABEL :-)

ch3i
Posts: 17
Joined: Tue Mar 03, 2015 6:22 am

Re: A good starting Weathermap example fromr a weathermap ad

#11 Post by ch3i » Fri May 29, 2015 5:11 am

deleted

ch3i
Posts: 17
Joined: Tue Mar 03, 2015 6:22 am

Re: A good starting Weathermap example fromr a weathermap ad

#12 Post by ch3i » Fri May 29, 2015 7:23 am

Hi,

Thank you for your great job, I use it to manage around 100 Cisco 2960.
To create my weathermaps I use a script in bash.

I use three files, one is the script and the two others are for the position of each node :

The script file :

Code: Select all

#!/bin/bash

##################################################
# Configuration
##################################################
CACTI_DB="cacti_database_name"
CACTI_USER="cacti_user" #in my case I create a user in read only
CACTI_PASSWORD="cacti_password"
CACTI_IP="cacti_ip_address"

##################################################
# Get device name and position
##################################################

echo -n "Cacti device name : "; read -e DEVICE_NAME
echo -n "Overlibgraph device port index : "; read -e DEVICE_OVERLIBGRAPH_PORT
echo -n "Position switch (like 200 50) : "; read -e DEVICE_POSITION
DEVICE_ID=$(mysql --host="$CACTI_IP" --user="$CACTI_USER" --password="$CACTI_PASSWORD" "$CACTI_DB" -Bse "SELECT id FROM host WHERE description='$DEVICE_NAME'";)

#check if device exist
if [ "$DEVICE_ID" = "" ]
then
	echo "No device found... exit";
	exit
else
	##################################################
	# Create port nodes
	##################################################
	
	#lower case the name of device to match with rdd files
	DEVICE_NAME_LC=$(echo "$DEVICE_NAME"  | awk '{print tolower($0)}')
	
	#empty result file if exist
	echo "" > $DEVICE_NAME
	
	# get switch ports and data IDs
	mysql --host="$CACTI_IP" --user="$CACTI_USER" --password="$CACTI_PASSWORD" "$CACTI_DB" -Bse "SELECT data_local.id AS data_id, graph_local.snmp_index AS snmp_index, SUBSTRING(graph_local.snmp_index, 4, 2) AS sw_port, SUBSTRING(graph_local.snmp_index, 1, 3) AS sw_port_type FROM data_local INNER JOIN graph_local ON (data_local.host_id=graph_local.host_id AND data_local.snmp_index=graph_local.snmp_index) WHERE data_local.host_id=$DEVICE_ID AND data_template_id=73 AND graph_template_id=48" | while read DATA_ID SNMP_INDEX SW_PORT SW_PORT_TYPE;
	do
		# get graphs speed IDs
		GRAPH_SPEED_ID=$(mysql --host="$CACTI_IP" --user="$CACTI_USER" --password="$CACTI_PASSWORD" "$CACTI_DB" -Bse "SELECT id FROM graph_local WHERE host_id=$DEVICE_ID AND graph_template_id=2 AND snmp_index=$SNMP_INDEX";)
		
		# get ethernet port type (fast or giga) and port position
		if [ "$SW_PORT_TYPE" = "100" ]
		then
			POSITION=$(sed -n $SW_PORT'p' distrib_48_position_fast)
			SW_PORT_TYPE_NAME="F"
		elif [ "$SW_PORT_TYPE" = "101" ]
		then
			POSITION=$(sed -n $SW_PORT'p' distrib_48_position_giga)
			SW_PORT_TYPE_NAME="G"
		fi
		
		# write file
		echo "NODE $DEVICE_NAME-$SW_PORT_TYPE_NAME$SW_PORT
	INFOURL /cacti/graph.php?rra_id=all&local_graph_id=$GRAPH_SPEED_ID
	OVERLIBGRAPH /cacti/graph_image.php?rra_id=0&graph_nolegend=true&graph_height=100&graph_width=300&local_graph_id=$GRAPH_SPEED_ID
	ICON images/port_{node:this:inscaletag}.png
	TARGET gauge:/var/lib/cacti/rra/${DEVICE_NAME_LC}_int_status_$DATA_ID.rrd:int_status:-
	USESCALE ifstatus in percent
	POSITION $DEVICE_NAME $POSITION
	" >> $DEVICE_NAME
	done
	##################################################
	# Create switch node
	##################################################
	
	# get graphs speed IDs
	DEVICE_GRAPH_SPEED_ID=$(mysql --host="$CACTI_IP" --user="$CACTI_USER" --password="$CACTI_PASSWORD" "$CACTI_DB" -Bse "SELECT id FROM graph_local WHERE host_id=$DEVICE_ID AND graph_template_id=2 AND snmp_index=$DEVICE_OVERLIBGRAPH_PORT";)
	
	echo "NODE $DEVICE_NAME
	LABEL $DEVICE_NAME
	ZORDER 200
	LABELOFFSET W
	LABELFONT 111
	LABELANGLE 90
	LABELOUTLINECOLOR none
	LABELBGCOLOR none
	INFOURL /cacti/graph.php?rra_id=all&local_graph_id=$DEVICE_GRAPH_SPEED_ID
	OVERLIBGRAPH /cacti/graph_image.php?rra_id=0&graph_nolegend=true&graph_height=100&graph_width=300&local_graph_id=$DEVICE_GRAPH_SPEED_ID
	ICON images/sw_2960_distrib.png
	POSITION $DEVICE_POSITION" >> $DEVICE_NAME
	
	exit
fi
The position file fort FAST nodes (in my case named "distrib_48_position_fast", used in the script):

Code: Select all

-384 -12
-384 16
-355 -12
-355 16
-326 -12
-326 16
-297 -12
-297 16
-268 -12
-268 16
-239 -12
-239 16
-198 -12
-198 16
-169 -12
-169 16
-140 -12
-140 16
-111 -12
-111 16
-82 -12
-82 16
-53 -12
-53 16
-12 -12
-12 16
17 -12
17 16
46 -12
46 16
75 -12
75 16
104 -12
104 16
133 -12
133 16
174 -12
174 16
203 -12
203 16
232 -12
232 16
261 -12
261 16
290 -12
290 16
319 -12
319 16
The line 1 is for port 1, line 2 fort port 2, etc...

The position file fort GIGA nodes (in my case named "distrib_48_position_giga", used in the script):

Code: Select all

374 21
421 21
After executing the script :
>> Copy/Paste the result of script (stored in a file named as switch name) in the conf file

Script execution :
Image

Two switchs configured in one minute :p
Image

I'm working to determine if port is on top or bottom (the first switch is corrected direct in conf file).

It's not awesome but usefull.

Regards,
Ch3i.

User avatar
Happiness0
Cacti User
Posts: 63
Joined: Wed Oct 29, 2014 5:01 am
Contact:

Re: A good starting Weathermap example fromr a weathermap ad

#13 Post by Happiness0 » Fri May 29, 2015 8:58 am

I do such a thing with a perl script.

This is the code to generate the ports:

Code: Select all

use strict;
use warnings;
use Net::SNMP;
use RRD::Query;

my ($community, $img, $out) = 'xxxx';
open(my $fh, '>', 'carte_switch_mae.conf');
sub newSwitch {
    my ($name, $ip, $x, $y) = @_;
    my $self = {
        'name' => $name,
        'ip'   => $ip,
        'x'    => $x,
        'y'    => $y
    };
    bless($self, $name);
    return $self;
}
sub genPort {
    my ($self) = @_;
    my $session = Net::SNMP->session( Hostname  => $self->{ip},
                                      Community => $community,
                                      port      => 161)
                                                    or die "Session: $!";
    # for the ethernet ports
    for (1..48) {
        my $query = $session->get_request("1.3.6.1.2.1.2.2.1.8.$_");
        my $state = $query->{"1.3.6.1.2.1.2.2.1.8.$_"};
        $img = $state == 1
                ? 'port_up.png'
                : 'port_down.png';
        $out = "NODE " . $self->{name} . "_$_\n"
            . "\tPOSITION " . $self->{x} . " " .  $self->{y} . "\n"
            .  "\tICON images/$img\n";
        print $fh $out;
        # for the position of the ports
        $self->{x} += 17;
        $self->{x} += 4
            if /\A8\z|16|32|40/;
        $self->{x}--
            if /\A[3-6]\z|1[024-7]|2[02-47]|3[014-69]|4[0-267]/;
        if ($_ == 24) {
            $self->{x} -= 403;
            $self->{y} += 20;
        }
    }
    $self->{x} += 22;
    $self->{y} -= 32;
    # for sfp ports
    for (1,2) {
        my $rq = new RRD::Query('../../../rra/switch_'
                . (split '\.', $self->{ip})[-1]
                . '_traffic_g' . $_ . '.rrd')
                or die ($!);
        $img = $rq->fetch('traffic_out', offset => 10)
            ?  'port_up.png'
            :  'port_down.png';
        $out = "NODE " . $self->{name} . "g$_\n"
            . "\tTEMPLATE port\n"
            . "\tPOSITION " . $self->{x} . " " .  $self->{y} . "\n"
            . "\tICON images/$img\n";
        print $fh $out;
        $self->{y} += 13;
    }
    $session->close();
}

[Some stuff here...]

my $switch1 = newSwitch('switch1', 'xxx.xxx.xxx.xxx', 121, 109);
print 'Generating config for ' . $switch1->{ip} . "\n";
genPort($switch1);
The code for the switches:

Code: Select all

my $dsn = 'dbi:mysql:cacti:xxxx:3306';
my ($user, $pwd) = qw (xxx xxx);
my ($dbh, $error) = DBI->connect($dsn, $user, $pwd)
    or die "MySQL : $!";
my $query = 'SELECT DISTINCT (b.id), (b.nom_dns), (a.id), (c.id)
FROM graph_tree_items AS a
LEFT OUTER JOIN host AS b
ON b.id = a.host_id
LEFT JOIN graph_local AS c
ON b.id = c.host_id
WHERE c.graph_template_id = 43 OR c.graph_template_id = 52
ORDER BY b.nom_dns';
my $sth = $dbh->prepare($query);
$sth->execute() or die 'Cannot execute :' . $sth->errstr();
my @row;
my ($x, $y);
while (@row = $sth->fetchrow_array) {
    if ($row[1] =~ /40|11/) {
        $y = 120
    } elsif ($row[1] =~ /25|50/) {
        $y = 780
    } elsif ($row[1] =~ /30\z|60\z/) {
        $y = 550
    }
    if ($row[1] =~ /40\z|30\z|25\z/) {
        $x = 314;
    } elsif ($row[1] =~ /11\z|50\z|60\z/) {
        $x = 2050;
    } elsif ($row[1] =~ /21\z/) {
        $x = 1944;
        $y = 1180;
    }
    $out = "NODE img_switch" . $row[0] . "\n";
    $out .= "\tTEMPLATE port" . "\n"
    if $row[1] !~ /21/;
    if ($row[1] =~ /21/) {
        $out .= "\tLABELFONT 110\n"
        . "\tLABELOFFSET 426 0\n"
        . "\tICON images/swich_24.png\n";
    }
    $out .= "\tLABEL " . $row[1] . "\n"
    . "\tINFOURL /cacti/graph_view.php?action=tree_content&tree_id=2&leaf_id=" . $row[2]. "&host_group_data=\n"
    . "\tOVERLIBGRAPH /cacti/graph_image.php?rra_id=0&graph_height=200&graph_width=500&local_graph_id=". $row[3] . "\n"
    . "\tPOSITION " . $x . ' ' . $y . "\n";
    print $fh $out;
    $y += 100;
}
$sth->finish;
$dbh->disconnect;

The result is the one I posted in the "Show off your Weathermaps." thread. The ports are identified with a for loop, so I can perform actions for specific ports and manage the position with $self->{x}. The whole script writes the configuration file for the map in about 15 secs

ch3i i don't know what you grab from your mysql queries but you should check if the port is on top or bottom by testing if the port number is > 24?

ch3i
Posts: 17
Joined: Tue Mar 03, 2015 6:22 am

Re: A good starting Weathermap example fromr a weathermap ad

#14 Post by ch3i » Fri May 29, 2015 12:49 pm

Happiness0 : In my cisco on top 1 3 5 7... on bottom 2 4 6 8... :D

I'll post the full script next week, I had the generation of switch an possibility to add it directly on an exisiting map.

DanielU
Posts: 8
Joined: Tue Jan 24, 2017 7:19 am
Location: Bydgoszcz, Poland

Re: A good starting Weathermap example fromr a weathermap ad

#15 Post by DanielU » Tue Jan 24, 2017 7:36 am

I'd like to put on my map links to ssh console to my network devices.
I 'd found in conf file posted by ikorzha758:

Code: Select all

NODE XXX_RTR_ssh
	INFOURL ssh://[email protected]
	NOTES Click here to open XXX Router Console
	ICON 13 13 images/ssh.gif
	POSITION XXX_2851 106 0 
What I should do to made "INFOURL ssh://" workable?
Script on cacti?
Something on web browser client site?

Post Reply