For more information regarding the security incident at F5, the actions we are taking to address it, and our ongoing efforts to protect our customers, click here.

LTM Image Hosting

Problem this snippet solves:

Host and Return images directly from LTM. First example is for favicon.ico, but could be more/different/etc.

  1. Save your image(s) in a file-based class (can be an internal class, but it makes the config file messy). The following script actually let’s you save multiple images in a file class. Copy them all to a directory (/var/images) and run the script. It will create base64 encoded versions of each image in the /var/class/images.class. NOTE: Must run "b load" anytime an external file-based class is created or updated!
  2. Define the class as a Data Group List in the GUI: Local Traffic -> iRules -> Data Group List -> Create...

    • Name: images_class
    • Type: (External File)
    • Path/Filename: /var/class/images.class
    • File Contents: String
    • Key/Value Pair Separator: :=
    • Access Mode: Read Only
  3. Now listen for and respond to favicon requests:

Code :

#!/bin/bash

## clear /var/class_build/images_build.class
echo -n "" > /var/class/images.class

## loop through real images and create base64 data for images_build.class
for i in $(ls /var/images); do
        echo "\"`echo \"$i\"|tr '[:upper:]' '[:lower:]'`\" := \"`base64 /var/images/$i|tr -d '\n'`\"," >> \
                /var/class/images.class
done

 
when HTTP_REQUEST { 
  if { [string tolower [HTTP::path]] equals "/favicon.ico" } {
    if { [class match [findstr [string tolower [HTTP::path]] "/" 1] equals images_class] } {
      HTTP::respond 200 content [b64decode  [class lookup [findstr [HTTP::path] "/" 1] images_class]] \
        "Content-Type" "image/x-icon" \
        "Last-Modified" "Sun, 29 Mar 1970 18:53:56 GMT"
    }
  }
}

# Note:The “Last-Modified” header is there to allow it to cache. 4. And finally, if you want to serve up multiple images, not just favicon: 

## is the request an image? Process images from the base64 encoded image class
when HTTP_REQUEST { 
  if { [string tolower [HTTP::path]] ends_with ".jpg" or [string tolower [HTTP::path]] ends_with ".png" or [string tolower [HTTP::path]] ends_with ".gif" } {
    ## assume image name is after the last forward slash character in the URI
    if { [class match [string range [HTTP::uri] [expr [string last "/" [HTTP::uri]] + 1] end] equals images_class] } {
      HTTP::respond 200 content [b64decode [class lookup [string range [HTTP::uri] [expr [string last "/" [HTTP::uri]] + 1] end] images_class]] \
        "Content-Type" "image/png" \
        "Last-Modified" "Sun, 29 Mar 1970 18:53:56 GMT"
    }
  }
}
Published Mar 18, 2015
Version 1.0
No CommentsBe the first to comment