Blog


jNag ‘coming soon’ features

I’ve not really had chance to work on jNag over the last couple of days, but I managed to snatch an hour at lunch yesterday to refactor some code and do some architectural changes in preperation for 0.4.  The major new feature for this release will be a ‘livestatus‘ backend in addition to the current statusjson system.  You’ll be able to switch between the two by a simple config change.

Other planned features include:

  • Multiple server support
  • Configuration page (for jNag)
  • Nagios control page (restart Nagios, reschedule checks etc)

If there’s any other features you’d like to see added, feel free to comment.  And look out for jNag 0.4 in the next couple of days.




jNag 0.3 released

Another day another release of jNag, the Jquery mobile based mobile interface for Nagios.

V0.3 adds:

  • ajax problem polling
  • browse by Hosts and services, as well as host groups
  • a tider interface

As usual the demo is available here

And the download is here

Here’s a couple of screenshots showing off the new features:

That yellow box at the top Pulses on and off if there’s any problems, and it updates via ajax…so no page refresh is required!

Showing off the new, tidier interface when viewing all services monitored by Nagios




jNag 0.2 released

Yesterday I released jNag, my new mobile web interface for the rather spiffy Nagios network monitoring tool.

Today I’ve updated it with some new features:

  • You can now see host problems as well as service problems
  • Acknowledged problems now don’t show in the main list on the front screen
  • (this is the major one) you can now acknowledge problems right from jNag!

download it here

demo is here

Here’s a screenshot of the new ‘acknowledge function in use:




jNag – mobile interface for Nagios

I recently became aware of Jquery Mobile, a new framework from the group behind the rather excellent jquery, that focuses on mobile development. Using the framework you can quickly and easily produce a web app that’s tailored for mobile devices and offers a consistent user experience across a range of mobile platforms.

I decided I needed a little project to get to grips with how JQuery mobile works and, since I’d spent an afternoon at work this week setting up the rather excellent Nagios (a network monitoring server) I thought I’d have a go at producing a mobile interface for it.

Nagios helpfully provides a way of getting JSON formatted data about it’s current status via a cgi script (statusjson.cgi) so it was simply a case of parsing that data and outputting it via the jquery mobile stuff.

Here’s what I came up with: jNag (apologies for the name, it’s late).  It’s a bit rough and ready at the moment, but it can display alerts (warning / critical), allow you to browse through your tree of devices and drill down to view service output.  If you combine it with the rather excellent NagDroid to give you notifications you have a full mobile admin suite.  Not bad for a few hours work.

download here (extracted files need uploading to your nagios webroot)

There’s a demo here (best viewed on an Android device or  iPhone)

here’s how it looks on my Desire HD




Reverse Geocoding in PHP

  • December 24, 2010
  • None

A project I’m working on at the moment had a requirement for reverse geocoding (ie: taking a set of latitude / longitude co-ordinates and returning a placename) of some data coming from an iPhone application.

There’s plenty of information available for doing address to long/lat encoding using google maps and the like, but not much on going the other way.

Luckily, I found the GeoNames database, a freely accessible geographical database which offers an easy to use api.

The specific bit I’m interested in is accessed by calling this url (with your lat/long co-ordinates of course!)

http://ws.geonames.org/findNearbyPlaceNameJSON?lat=53.4978&lng=-2.5013

This returns some JSON encoded data as follows:

{"geonames":
      [{
         "countryName":"United Kingdom",
         "adminCode1":"ENG",
         "fclName":"city,village,...",
         "countryCode":"GB",
         "lng":-2.5166667,
         "fcodeName":"populated place",
         "distance":"1.90284",
         "toponymName":"Leigh",
         "fcl":"P",
         "name":"Leigh",
         "fcode":"PPL",
         "geonameId":2644660,
         "lat":53.4833333,
         "adminName1":"England",
         "population":43626}
      ]}

There’s a lot of info there, but the specific bits I was interested in are the placename and the country.

Here’s the code:

      $url = "http://ws.geonames.org/findNearbyPlaceNameJSON?lat=$lat&lng=$long";
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_HEADER, 0);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
      curl_setopt($ch, CURLOPT_PROXY, 'myproxy:800');
      $json = curl_exec($ch);
      curl_close($ch);      
      $data = json_decode($json, true);
      foreach ($data["geonames"] as $key => $val) {
        $placename = $val["name"];
        $countryname = $val['countryName'];
        $countrycode = $val["countryCode"];
      }

As you can see, I’m sat behind a proxy so I have to use curl to get the page. If you’re not, you can replace all the curl stuff with a simple file_get_contents($url) (depending on your PHP config of course).

Also of note, if you live in the US you can get the nearest address instead of the nearest placename using a different GeoName api call. There’s a list of API calls available here




CPU / GPU temperature gadgets

Just a quick post today, I found these handy desktop gadgets (for windows 7 and probably vista too) and thought I’d share:

The top one, which monitors CPU temperatures is an add on available for CoreTemp. You need to have the coretemp program running for the gadget to work, but the program is fairly unobtrusive and just sits in the taskbar doing it’s thing.

CoreTemp download
CoreTemp add-ons page

The bottom Gadget is monitoring my GPU (graphics card) temperature. Useful if you have an overclocked box and want to keep an eye on your temperatures while gaming. This gadget works for ATI & Nvidia cards, it automagically detects which card you have so there’s no setup needed… just drop it on your desktop. The homepage for this is in German, but if you scroll down a bit you can easily spot the download link

GPU observer gadget




WP Akismet plugin behind proxy

The new HTTP Api in wordpress 2.9 is fantastic, it standardises http requests and allows you to define a proxy through which all http requests are routed.  Useful if, like me, you run a wordpress server on a corporate network.

You can configure your proxy server by adding the following lines to your ‘wp-config.php’

define('WP_PROXY_HOST', '192.168.250.1');
define('WP_PROXY_PORT', '800');
define('WP_USEPROXY','TRUE');

However there’s currently one problem with the default installation of wordpress when it comes to proxy support. Akismet (the spam filtering plugin) Doesn’t work behind the proxy. No matter what you put in for your proxy settings you’ll be told ‘unable to connect’.

The reason is that Akismet uses a ‘raw’ socket connection to do its http requests, rather than the spiffy new API. So, here’s how to fix it:

you need to edit the file ‘/wp-content/plugins/akismet/akismet.php’.

search for the function ‘akismet_http_post’ and replace the entire function (you can just rename the old function) with my newly crafted one:

function akismet_http_post($request, $host, $path, $port = 80, $ip=null){
        global $wp_version;
	$akismet_version = constant('AKISMET_VERSION');
        $args = array(
             'method'=>'POST',
             'user-agent'=>"User-Agent: WordPress/$wp_version | Akismet/$akismet_version",
             'body'=>$request
        );
         $url = "http://".$host.$path;

         if( !class_exists( 'WP_Http' ) )
         include_once( ABSPATH . WPINC. '/class-http.php' );
	 $http_request = new WP_Http;
         $http_response = $http_request->request($url,$args);
         if( is_wp_error( $http_response ) )
              return;
         $response[0] = $http_response['headers'];
         $response[1] = $http_response['body'];
	return $response;
}

And voila, working spam detection behind a proxy.




Joomla Hack: autofill subject line on contact email

So, imagine you have a Joomla site containing lots of pages about…well, anything really. It’d be nice if you could have a ‘request info’ link on each page so users could send you an email with a pre-generated subject line about that page, so you can parse emails (either manually or using some kind of automatic system) coming from the site.

eg: your site has seperate pages about ‘product A’ and ‘product B’. you want a link on ‘product A’s’ page that sends you an email with the subject line ‘yoursite.com: product A enquiry’ and the same for product B.

I can’t find any way of doing this ‘properly’ in Joomla, so here’s a hack I came up with. What it does basically is take a variable from your URL and put it into the subject box. So you can setup a link to ‘http://yoursite.com/contact-us?subject=test subject’ and the contact email form will automagically have the subject line filled in with ‘test subject’.

First up, setup a contact to send the emails from (you’ve probably done this anyway if you have a ‘contact us’ page).

Now publish that contact using the ‘contact’ view under something like yoursite.com/contact-us

now here’s the hack:

open up “components/com_contact/views/contact/tmpl/default_form.php”

the line you’re looking for is this one (it’s line 50 in my copy of the file)

change that to this:


The additional line uses the JRequest class to get the value of our ‘subject’ variable. Then we simply write that into the subject field. We also set a default value ‘website enquiry’ so if the subject variable is unset we have a nice default subject line instead of a blank box. using JRequest::getWord to retrieve the variable means our input is automatically filtered to strip out any html / javascript injection attempts.

you can now set up links anywhere in your site to ‘contact-us?subject=your subject’ to automatically fill out the subject line.




JQuery ‘exists’ and ‘checked’ functionality

  • April 20, 2010
  • None

One of the brilliant things about jquery is that it’s so easy to extend, whether that be by writing your own full blown plugin, or with a quick 1 liner to add new functionality.

Here’s a couple that I always find handy. First up, adding an ‘exists’ function, so you can do this:

if ($(selector).exists()){
    //do something here if our selected element exists
}

the code is really quite simple, basically we return true if the JQuery object returned by our selector has a length greater than 0 (ie: if the selector matches anything), and false if it doesn’t.

jQuery.fn.exists = function(){
          return jQuery(this).length>0;
}

Next we have something I use all the time, a really simple function that returns true if the checkbox element you call it on is in the ‘checked’ state, and false if it isn’t. So you can do this:

if ('#mycheckbox').checked(){
      //do something here if the checkbox is checked
}

and the code to add that function is:

jQuery.fn.checked = function(){
         return jQuery(this).is(':checked');
}

Hopefully those will be of use to someone else, they’re not particularly complex but they can make your code easier to understand and save you a bit of typing.




Produce a ‘patch’ from a subversion repository

I use subversion quite extensively for PHP code versioning (in particular the excellent Redmine software project management tool has a built in subversion server) and recently had a requirement to produce a set of files that had changed from one revision to another. Specifically my repository has some changes committed to it that I don’t want propagating to the live server just yet, but I want some later changes moving across.

Subversion offers excellent branch / tag support, so if I’d thought this through properly I could have created a new branch for the dangerous changes I didn’t want to move to live, then merged any changes from there onwards back into the ‘live’ trunk…basically keeping two seperate branches in the repository.

However, as usual I didn’t think it through and had to hack together a solution to fit the problem.

Here’s the solution, it’s a bash shell script that takes 2 revisions as an argument and produces a directory containing all the files that have changed between those two revisions, maintaining the directory structure. You pretty much end up with a directory that you can drop straight into your live site to update it to whatever revision you like.

For example, my live site is at revision 10. I committed changes at revision 11 that I don’t want going into the live site, but everything from 12 onwards to the current revision of 15 needs patching in. run ‘make patch 12 15’ and then drop the produced directory into your live site.

#!/bin/bash
#simple script to make a very simple patch from a repository
#call with make patch.sh low high
#
# where low is the revision your unpatched project is currently at
# and high is the revision you want the patch to go up to
# eg: if your live system is at revision 100 and you want to
# patch it to revision 120 you'd do:
# 
#our subversion url
url=svn://svn-server/my-repo/

#first we need to get a list of changes since requested revision 
svn diff -r$1:$2 $url --summarize > filelist.txt

#now remove the repo information from each line, so we're just left with the path from the root upwards
sed -i "s#svn://redmine.tyrrellsystems.com/tms/tms_dev/Trunk/# #g" filelist.txt
sed -i "s#M  # #g" filelist.txt
sed -i "s#A  # #g" filelist.txt

#now loop through what we've got
#create the relevant folder, and export the file into it
for i in $(cat filelist.txt); 
do 
	filename=$(basename $i);
	path=$(dirname $i);
	mkdir -p patch-r$1/$path 
	svn export --force $url$path/$filename patch-r$1/$path/$filename
	echo "$filename"; 
done