For the duration of the Edinburgh Festival Fringe I’m responsible for a couple of Samsung MagicNet plasma screens which run 24/7 in the windows outside a venue. They’re essentially 32″ screens with a built in PC running Windows XP and a VNC server. They’re pretty flexible as you can set them to open a webpage fullscreen then display just about anything.

Unfortunately, they’re prone to faults and I have no real way of knowing when one occurs until I attempt to VNC into (or walk passed) one of them which brings me to the purpose of this post: How to ensure your remote VNC sessions are doing what they’re supposed to.

Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/perl
 
use Net::VNC;
use strict;
 
my $vnc;
my $path = "/home/rob/Desktop";
#my $path = "screens/";
#my $path = "/var/www/vnc-monitoring";
#my $path = "/home/rob/public_html/vnc-monitoring";
 
open(LOG, ">>monitoring.log"); # Open the log file.
 
open(SERVERS , "vnc-servers"); # Open the list of VNC servers, one IP,password per line:
                               # 192.168.0.2,password
                               # 192.168.0.3
                               # 192.168.0.4,anotherpassword
while(<SERVERS>)
{
    my ($address,$password) = split(/,/,$_);
    $address =~ s/r//g;
    $address =~ s/n//g;
    $password =~ s/r//g;
    $password =~ s/n//g;
 
    $vnc = Net::VNC->new({hostname => $address, password => $password}); # Create a new connection to vnc.
    $vnc->depth(24);
 
    my $message = "";
    my $image;
    eval
    {
        $vnc->login; # Must be within an eval else the script will bail on error.
        $message = "Connected: ".$address." (".$vnc->name.")";
        $image = $vnc->capture;
    };
    if ($@)
    {
        $message = $@;
        $image = Image::Imlib2->new(200, 200); # Create a blank image to indicate a problem. Could also copy a preset "error" image.
                # We could also send out an email here since we definitely have an issue.
    }
 
    $address =~ s/./_/g;
 
    print LOG $message."n";
 
    $image->save("$path/$address-capture.png");
}
 
close(LOG);
close(SERVERS);
#!/usr/bin/perl

use Net::VNC;
use strict;

my $vnc;
my $path = "/home/rob/Desktop";
#my $path = "screens/";
#my $path = "/var/www/vnc-monitoring";
#my $path = "/home/rob/public_html/vnc-monitoring";

open(LOG, ">>monitoring.log"); # Open the log file.

open(SERVERS , "vnc-servers"); # Open the list of VNC servers, one IP,password per line:
                               # 192.168.0.2,password
                               # 192.168.0.3
                               # 192.168.0.4,anotherpassword
while(<SERVERS>)
{
	my ($address,$password) = split(/,/,$_);
	$address =~ s/r//g;
	$address =~ s/n//g;
	$password =~ s/r//g;
	$password =~ s/n//g;

	$vnc = Net::VNC->new({hostname => $address, password => $password}); # Create a new connection to vnc.
	$vnc->depth(24);

	my $message = "";
	my $image;
	eval
	{
		$vnc->login; # Must be within an eval else the script will bail on error.
		$message = "Connected: ".$address." (".$vnc->name.")";
		$image = $vnc->capture;
	};
	if ($@)
	{
		$message = $@;
		$image = Image::Imlib2->new(200, 200); # Create a blank image to indicate a problem. Could also copy a preset "error" image.
                # We could also send out an email here since we definitely have an issue.
	}

	$address =~ s/./_/g;

	print LOG $message."n";

	$image->save("$path/$address-capture.png");
}

close(LOG);
close(SERVERS);

This Perl script uses Net::VNC to connect to each specified VNC server, capture a screenshot and save it to the specified directory.

From there all you need to do is add it to a Cron job and decide how you’re going to monitor the resultant images:

  • Slideshow software on a dedicated screen.
  • Embedded into a web page.
  • Simply saved to your Desktop (Gnome refreshes thumbnails automatically).
  • Maybe even use NotifyOSD (or similar)?