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.

iRule stats formatter

Problem this snippet solves:

When you have a load of iRule stats in text format from your F5 device and need to get them into a nicer format.

The following Python 3 script takes in a text file in the following format:

------------------------------------------------------------------------------------------------------
Ltm::Rule Event: /web_testing/test_environment_rule:HTTP_RESPONSE
------------------------------------------------------------------------------------------------------
Priority                       12
Executions             
  Total                  31686860
  Failures                      0
  Aborts                        0
CPU Cycles on Executing
  Average                  404058
  Maximum                10703959
  Minimum                  264201

 (raw)                 
------------------------------------------------------------------------------------------------------
Ltm::Rule Event: /web_testing/test_environment_rule:HTTP_REQUEST
------------------------------------------------------------------------------------------------------
Priority                      899
Executions             
  Total                  31686860
  Failures                      0
  Aborts                        0
CPU Cycles on Executing
  Average                  404058
  Maximum                10703959
  Minimum                  264201

Put through the following python script to output a CSV file for further data manipulation.

How to use this snippet:

Python3 script, to use run the following (can also add in '--o' to define an output file, if not will replace the file extension '.txt' with '.csv' by default):

python statformating.py --i my_irule_stats.txt

output will be something like

Openning 'my_irule_stats.txt'
Saving output csv to 'my_irule_stats.csv'

Usage/help output:

usage: statformating.py [-h] [--i INPUT] [--o OUTPUT]

optional arguments:
  -h, --help  show this help message and exit
  --i INPUT   iRule Stats File input file name
  --o OUTPUT  iRule Stats File output csv file name

Code :

import re
import os
import argparse

def iruleStatsFormat(inputFile, outputFile):
    print('Openning \'{}\''.format(inputFile))
    iruleStats = open(inputFile, 'rt').read()

    iruleStats = re.sub(r'[ ]{2,}', ' ', iruleStats)
    iruleStats = re.sub(r'\n\s\(raw\)\s{1,}', '', iruleStats)
    iruleStats = re.sub(r'[-]{2,}\n', '', iruleStats)
    iruleStats = re.sub(r'\n ', r'\n', iruleStats)
    iruleStats = re.sub(r'CPU Cycles on Executing\n', '', iruleStats)
    iruleStats = re.sub(r'Executions \n', '', iruleStats)
    iruleStats = re.sub(r'\nPriority (\d{1,})\nTotal (\d{1,})\nFailures (\d{1,})\nAborts (\d{1,})\nAverage (\d{1,})\nMaximum (\d{1,})\nMinimum (\d{1,})', r'\t\1\t\2\t\3\t\4\t\5\t\6\t\7', iruleStats)
    iruleStats = re.sub(r'Ltm::Rule Event: /(.*?)/(.*?):(.*?\t)', r'\1\t\2\t\3', iruleStats)
    iruleStats = re.sub(r'Ltm::Rule Event: (.*?):(.*?\t)', r'Common\t\1\t\2', iruleStats)
    iruleStats = re.sub(r'\n{2,}', r'\n', iruleStats)
    iruleStats = re.sub(r'\t', r',', iruleStats)
    print('Saving output csv to \'{}\''.format(outputFile))
    with open(outputFile, 'wt') as f:
        print(iruleStats, file=f)

if __name__=='__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("--i", dest='input', help="iRule Stats File input file name", type=str)
    parser.add_argument("--o", dest='output', help="iRule Stats File output csv file name", type=str, default="")
    args = parser.parse_args()

    if args.input and os.path.isfile(args.input):
        if not args.output:
            args.output = args.input[:-3] + 'csv'
        iruleStatsFormat(args.input, args.output)
    else:
        parser.print_help()
Updated Jun 06, 2023
Version 2.0
No CommentsBe the first to comment