PHP Weathermap is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

PHP Weathermap is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with PHP Weathermap; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

Parts of this software distribution are by other authors. Please see the README file for attribution and license details.

PHP Weathermap

Sample output from php-weathermap, using data collected by Cacti and MRTG.
Larger version

Introduction

PHP Weathermap is one of many implementations of the same basic idea - take data from your network devices and use it to provide a single-page overview of the current state of network, like the one to the right. It complements a tool like MRTG, Cricket or Cacti, that provide in-depth graphing, and historical information, and can use data from those systems to produce it's maps. In fact, it requires some other data-collection source, as it does no device-polling on it's own.

This particular version is written in PHP, and it can read statistics data from MRTG-produced HTML files, plain tab-seperated text files and from RRD files, such as those produced by newer MRTG setups, Cacti (my favourite) or another tool. It can also generate HTML 'holder' files for the map images, which can include 'DHTML' overlays of historical data and links into your other monitoring/statistics system. It also has a interactive map editor, so you can largely avoid the text configuration files, if you prefer.

To get a better idea of what is possible, see the example map that comes with this manual.

Requirements

Based on lessons learned with the perl version, this one has a very restricted set of dependencies - you'll need a recentish PHP (>4.3.0 I think) including the CLI version and the 'gd' extension with PNG, TrueColour and FreeType support. You will need command-line (aka shell/ssh/telnet) access to the server which will host the maps.

To read RRD files, you'll need the rrdtool command-line program.

Apart from the gd module, these requirements are the same as for Cacti, which is the most-tested partner stats system.

To use the Cacti plugin, you will need a recent version of Cacti, and the matching Cacti Plugin Architecture, from Jimmy Conner's Cactiusers.org.

Support

There are two mailing lists for php-weathermap:

php-weathermap@thingy.com
General discussion of weathermap-related issues, bug reports and development. Fairly low traffic currently. Typically contains discussion of test or beta versions too, when they are circulating.
php-weathermap-announce@thingy.com
Very low volume list for new version announcements and other similarly rare events!
More information about how to subscribe to the mailing lists is at the website.

Also, if you have an RSS reader, you can subscribe to the 'appcast' feed for php-weathermap which contains roughly the same content as the -announce mailing list.

Installation Guide

How to install Weathermap depends on how you intend to use it:

Running Weathermap

There are two ways to run Weathermap.

If you are using the Cacti plugin, then it will be run for you as part of the Cacti poller cycle. You don't need to do anything special apart from add your map configuration files, as explained in the Cacti plugin notes.

If you are using weathermap as a standalone tool, you do it using the command line version. See the CLI Reference for all possible options, but a good starting point is something like:

php ./weathermap --config myconfigfile.conf --output mymap.png --htmloutput mymap.html

You can skip the htmloutput and output parts if you have HTMLOUTPUTFILE and IMAGEOUTPUTFILE lines in your configuration file.

Usually, people want to run weathermap regularly (it's not a requirement though!). To do that, you need to create a 'cron job' or 'Task Scheduler Task' to run a command-line like the one above on a regular basis. You probably already have a similar task setup to collect the data that weathermap is reading. This is the same kind of thing.

Basics

The weathermap is defined by a plain-text file which by default is called weathermap.conf (you can have many configurations, and choose between them with command-line switches). By default, weathermap will read that file, and produce a single PNG file called weathermap.png.

The configuration file has three sections: Node definitions, Link definitions and Global settings. There is an example of a complete file at the bottom of this page.

Nodes

                                        NODE nycore1
                                            LABEL NYC
                                            POSITION 30 30
A simple NODE

Nodes are the points on your network that are joined together. Depending on the detail in the map, they might be cities or individual routers. In a basic map, a node has 3 pieces of information - an internal name which must be unique to this node, it's position from the top-left corner of the map, in pixels, and optionally a label, which will appear within the box marking the position of the node. Nodes without a label don't appear on the map at all, but can still be used as an endpoint for a link.

Links

                                        LINK backbone1
                                            NODES nycore1 paix1
                                            BANDWIDTH 3M
                                            TARGET ../my-mrtg-data/backbone1.html
A simple LINK

Links are the network routes between the Nodes. Typically they are actual network links, but they can be anything that you can get numbers for that make sense on map.

An absolute minimal link has 3 pieces of information too. They are the unique internal name for this link, and unique node names for the two endpoints. To show current usage on the map, you'll need to give two more pieces: the maximum bandwidth on the link, and a way to get the current throughput. The BANDWIDTH is measured in bits/sec, and can include the usual K,M,G and T suffixes for large values. The data-source is given in the TARGET line, and can be one of

One important note: the order of the nodes in the NODES line is significant. The first node is considered to be the 'local' one when thinking about the data source in the TARGET. 'out' will be 'out' relative to the first node. If you find the map shows all your data flowing in the wrong direction, try swapping the order of the nodes here.

Global Settings

These settings usually live at the top of the text file, and specify basic information about the map. The minimum settings are:

                                        WIDTH 800
                                        HEIGHT 600

This is specifies the size of the map in pixels. If you want something a bit fancier than a plain white background, you can make up a background image to use in PNG format. In that case, the map will be the size of the background image:

BACKGROUND western-europe.png

There are also settings to set which fonts and colours are used for various elements of the map, where to position the colour-legend (if at all), what files to output, and more advanced layout techniques. The full list is in the Config Reference.

A Sample Config

Here's a sample configuration, and here's what it produces (modified to work a little better). The data isn't live in the output, but it gives you an idea of what can be done. The initial background image is here. The configuration file is also in the docs directory of the distribution, should you want it.
                                        # some initial comments...
                                        #
                                        # This sample configuration file demonstrates most of the basic features of
                                        # PHP Weathermap, along with some of the cosmetic and layout changes possible
                                        #
                                        #
                                        BACKGROUND background.png
                                        HTMLOUTPUTFILE example.html
                                        IMAGEOUTPUTFILE example.png
                                        TITLE Network Overview
                                        HTMLSTYLE overlib
                                        KEYPOS 10 400

                                        # define some new TrueType fonts - built-in ones go from 1 to 5, so start high
                                        FONTDEFINE 100 VeraIt 8
                                        FONTDEFINE 101 Vera 12
                                        FONTDEFINE 102 Vera 9

                                        KEYFONT 102

                                        LINK DEFAULT
                                            BANDWIDTH 100M
                                            BWLABEL bits
                                            BWFONT 100
                                            OVERLIBWIDTH 395
                                            OVERLIBHEIGHT 153
                                            WIDTH 4

                                        NODE DEFAULT
                                            LABELFONT 101

                                        NODE transit
                                            POSITION 400 180
                                            LABEL TRANSIT

                                        # a little splash of background colour for these nodes
                                        NODE isp1
                                            POSITION 250 100
                                            LABEL ISP1
                                                INFOURL http://www.isp1.com/support/lookingglass.html
                                            LABELBGCOLOR 255 224 224

                                        NODE isp2
                                            POSITION 550 100
                                            LABEL ISP2
                                            INFOURL http://www.isp2.net/portal/
                                            LABELBGCOLOR 224 255 224

                                        NODE core
                                            POSITION 400 300
                                            LABEL core
                                            INFOURL https://core.mynet.net/admin/

                                        NODE customer1
                                            LABEL xy.com
                                            POSITION 150 370

                                        NODE customer2
                                            LABEL ww.co.uk
                                            POSITION 250 450

                                        NODE infra
                                            LABEL INFRASTRUCTURE
                                            POSITION 450 450

                                        # this node has an icon, and so we push the label to the South edge of it, so it
                                        # can still be read
                                        NODE sync
                                            LABEL Sync
                                            ICON my_router.png
                                            LABELOFFSET S
                                            LABELFONT 2
                                            POSITION 550 370
                                        # the icon is taken from a Nagios icon pack:
                                        #   http://www.nagiosexchange.org/Image_Packs.75.0.html?&tx_netnagext_pi1[p_view]=110&tx_netnagext_pi1[page]=10%3A10

                                        NODE site1
                                            LABEL site1
                                            POSITION 700 220

                                        NODE site2
                                            LABEL site2
                                            POSITION 750 420

                                        LINK sync-core
                                            NODES sync core
                                            TARGET data/sync_traffic_in_259.rrd
                                            OVERLIBGRAPH http://support.mynet.net/cacti/graph_image.php?local_graph_id=256&rra_id=0&graph_nolegend=true&graph_height=100&graph_width=300
                                            INFOURL http://support.mynet.net/cacti/graph.php?rra_id=all&local_graph_id=256
                                        #
                                        # Site1 has two E1s, so we use NODE-offsets to allow them to run parallel
                                        #

                                        LINK sync-site1a
                                            NODES sync:N site1:W
                                            WIDTH 3
                                            TARGET data/sync_traffic_in_257.rrd
                                            BANDWIDTH 2M
                                            OVERLIBGRAPH http://support.mynet.net/cacti/graph_image.php?local_graph_id=254&rra_id=0&graph_nolegend=true&graph_height=100&graph_width=
                                            INFOURL http://support.mynet.net/cacti/graph.php?rra_id=all&local_graph_id=126

                                        LINK sync-site1b
                                            NODES sync:E site1:SE
                                            WIDTH 3
                                            OVERLIBGRAPH http://support.mynet.net/cacti/graph_image.php?local_graph_id=255&rra_id=0&graph_nolegend=true&graph_height=100&graph_width=
                                            TARGET data/sync_traffic_in_258.rrd
                                            BANDWIDTH 2M
                                            INFOURL http://support.mynet.net/cacti/graph.php?rra_id=all&local_graph_id=56

                                        #
                                        # site2 also has two links, but this time we use the VIA to curve the links
                                        #
                                        LINK sync-site2a
                                            NODES sync site2
                                            WIDTH 3
                                            VIA 650 380
                                            TARGET data/sync_traffic_in_251.rrd
                                            OVERLIBGRAPH http://support.mynet.net/cacti/graph_image.php?local_graph_id=248&rra_id=0&graph_nolegend=true&graph_height=100&graph_width=300
                                            BANDWIDTH 1M
                                            INFOURL http://support.mynet.net/cacti/graph.php?rra_id=all&local_graph_id=252

                                        LINK sync-site2b
                                            NODES sync site2
                                            WIDTH 3
                                            VIA 650 420
                                            TARGET data/sync_traffic_in_252.rrd
                                            OVERLIBGRAPH http://support.mynet.net/cacti/graph_image.php?local_graph_id=228&rra_id=0&graph_nolegend=true&graph_height=100&graph_width=300
                                            BANDWIDTH 1M
                                            INFOURL http://support.mynet.net/cacti/graph.php?rra_id=all&local_graph_id=561

                                        #
                                        # ISP 1 has a several links, again, but they prefer to see one arrow, and the aggregate bandwidth
                                        #   so we use multiple TARGETs on one line, here, to sum the data

                                        LINK transit-isp1
                                            NODES transit isp1
                                            TARGET data/trans1_traffic_in_352.rrd data/trans1_traffic_in_378.rrd data/trans1_traffic_in_420.rrd
                                            BANDWIDTH 10M
                                            OVERLIBGRAPH http://support.mynet.net/cacti/graph_image.php?local_graph_id=355&rra_id=0&graph_nolegend=true&graph_height=100&graph_width=
                                            INFOURL http://support.mynet.net/cacti/graph.php?rra_id=all&local_graph_id=633

                                        LINK transit-isp2
                                            NODES transit isp2
                                            TARGET data/trans1_traffic_in_438.rrd
                                            BANDWIDTH 34M
                                            OVERLIBGRAPH http://support.mynet.net/cacti/graph_image.php?local_graph_id=433&rra_id=0&graph_nolegend=true&graph_height=100&graph_width=300
                                            INFOURL http://support.mynet.net/cacti/graph.php?rra_id=all&local_graph_id=265

                                        LINK core-transit
                                            NODES transit core
                                            TARGET data/trans1_traffic_in_350.rrd
                                            ARROWSTYLE compact
                                            WIDTH 4
                                            OVERLIBGRAPH http://support.mynet.net/cacti/graph_image.php?local_graph_id=347&rra_id=0&graph_nolegend=true&graph_height=100&graph_width=300
                                            INFOURL http://support.mynet.net/cacti/graph.php?rra_id=all&local_graph_id=122

                                        LINK cust1-core
                                            NODES customer1 core
                                            TARGET data/extreme_traffic_in_299.rrd
                                            OVERLIBGRAPH http://support.mynet.net/cacti/graph_image.php?local_graph_id=296&rra_id=0&graph_nolegend=true&graph_height=100&graph_width=300
                                            INFOURL http://support.mynet.net/cacti/graph.php?rra_id=all&local_graph_id=237

                                        LINK cust2-core
                                            NODES customer2 core
                                            TARGET data/extreme_traffic_in_286.rrd
                                            OVERLIBGRAPH http://support.mynet.net/cacti/graph_image.php?local_graph_id=283&rra_id=0&graph_nolegend=true&graph_height=100&graph_width=300
                                            INFOURL http://support.mynet.net/cacti/graph.php?rra_id=all&local_graph_id=222

                                        LINK infra-core
                                            NODES infra core
                                            TARGET data/extreme_traffic_in_294.rrd
                                            OVERLIBGRAPH http://support.mynet.net/cacti/graph_image.php?local_graph_id=291&rra_id=0&graph_nolegend=true&graph_height=100&graph_width=300
                                            INFOURL http://support.mynet.net/cacti/graph.php?rra_id=all&local_graph_id=228

A Sample Configuration File

Other Weathermaps

Obviously, you can't please everyone, so here's a list of other weathermap or network visualisation implementations that I know of. Some are open source, some aren't. All of them have some subtle or interesting wrinkle that the others don't. Let me know if you know of any others.

GRNET perl version by Panagiotis Christias.
Support only for MRTG, or anything else that can produce similar HTML files.
My own perl weathermap
A forked/modified version of the GRNET one above, adds imagemaps, DHTML, RRD-reading and a number of smaller tweaks. No longer updated.
Weathermap4RRD
Another fork of the GRNET perl map. Also with (only?) RRD support, and various graphical enhancements. Also now with a PHP version!
Indiana University Abilene Weathermap
Another perl (i think) script, but with a rather different map design. Can show error rates on links, too.
PREGINET Network Weathermap
Another perl open source map. Works by reading MRTG logs, as far as I can tell.
V13 netmap (click 'netmap' in the left hand panel - I love frames)
Similar output to this program, but does all it's own SNMP data collection.