Note

Whereas you can still customize your BIG-IP with perl-scripts and sorry pages in this way, F5 has made this far easier with iFiles, introduced in 11.1. This tech tip on iFiles should be the recommended path for sorry pages going forward.

I’ve posted on this before (Host that Sorry Page on your BIG-IP!) but it’s been a while and there have been a few updates. Besides, narrowing the application to only sorry pages is a bit myopic—I’m sure my BIG-IP is offended that I treated it so callously. Anyway, I got an inquiry a week or so ago about the images in tables not being picked up by the script. The images in the table were referenced as such:

#<table background="genericofflinebackground.gif" align="center" width="1024" height="768" >

I reached out to the author, Kirk Bauer, and he gave me some pointers as where to look. There’s a function in the perl script that parses the html to look for items of interest:
 
sub start { 
   my ($self, $tag, $attr, $attrseq, $origtext) = @_;  
   # print out original text  
   if ($tag eq 'img') {  
      if ($attr->{'src'}) {  
         $attr->{'src'} = &handle_object($tag, 'src', $attr->{'src'});  
      }  
   }

Modifying the if ($tag..) conditional to match the table wasn’t that hard at all:

sub start { 
   my ($self, $tag, $attr, $attrseq, $origtext) = @_;  
   # print out original text  
   if ($tag eq 'img') {  
      if ($attr->{'src'}) {  
         $attr->{'src'} = &handle_object($tag, 'src', $attr->{'src'});  
      }  
   }  
   if ($tag eq 'table') {  
      if ($attr->{'background'}) {  
         $attr->{'background'} = &handle_object($tag, 'background', $attr->{'background'});  
      }  
   }

That solved problem number one. The second problem with the script was that it wasn’t asking about partition preference, rather it just dumped the iRule and datagroups into the last partition defined in bigip.conf. This was strange, as the code to handle partitions was in place:

my @partitions; 
open (CONF, "/config/bigip.conf") or die "Could not read /config/bigip.conf: $!\n";  
while (my $line = <CONF>) {  
   if ($line =~ /^partition (.+) {/) {  
      push @partitions, $1;  
   }  
}

The problem is that the regex is trying to match “partition <my partition> {“ and that is (at least in 10.2.1 HF3) no longer in the bigip.conf file. It has been moved to bigip_sys.conf. Updating the code as shown below solved the issue and now the user is asked for the appropriate partition and the iRule and datagroup gets deployed as expected.

my @partitions; 
      open (CONF, "/config/bigip_sys.conf") or die "Could not read /config/bigip_sys.conf: $!\n";  
      while (my $line = <CONF>) {  
         if ($line =~ /^partition (.+) {/) {  
            push @partitions, $1;  
         }  
      }

For the full script, head to the iRules wiki entry LTM Maintenance Page Generator and grab version 2.2.

 

Related Articles