<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body bgcolor=white lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt'>I wrote one that works with the REST API on ISAM appliances.  I believe they’re pretty similar to the datapower appliances.  There’s 2 parts to it and you’ll need to have node.js installed, as well as the jq - commandline JSON processor executable.  The username and password for the appliance should go on the line immediately following the tag for this host.  I found that putting the user/passwd on the same line as the host/tags made the information show up on the “info” page in xymon and I don’t think you want credentials published there.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt'>This particular test only checks to see if any of the junctions are “red” and reports a red status if so.  The entire junction tree is reported along with green/red for good/bad junctions.  I didn’t write in anything for junction specificity, though that’s probably coming soon.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt'>The first file I called isam-junctions.sh and the 2<sup>nd</sup> file I called isam-jct-parse.js<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt'>I know it’s not exactly what you’re looking for but I hope it will help you to develop one that you can use for the datapower appliances.<o:p></o:p></span></p><div class=MsoNormal align=center style='text-align:center'><span style='font-size:11.0pt'><hr size=2 width="100%" align=center></span></div><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>#!/bin/bash<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>#<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'># get the status of junctions from ISAM appliances<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>#<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>HOSTTAG=junctions                                                       # What we put in hosts.cfg to trigger this test<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>COLUMN=junctions                                                        # Name of the column, often same as tag in hosts.cfg<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>CURLCOMMAND=/usr/bin/curl                                         # where to find curl executable<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>CURLOPTIONS="-skH 'Accept:application/json'"                # set any preferred options here<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>SEARCHTEXT='ServiceAccount'                                             # set the content to look for here<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>$XYMONHOME/bin/xymongrep $HOSTTAG | while read L<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>do<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>set $L                                                                              # To get one line of output from xymongrep<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>JCTUID=`grep -A 1 $2 /etc/xymon/hosts.cfg | egrep -io 'jctuid=[^[:space:]]+' | cut -f2 -d '='`<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>JCTPWD=`grep -A 1 $2 /etc/xymon/hosts.cfg | egrep -io 'jctpwd=[^[:space:]]+' | cut -f2 -d '='`<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>COLOR="green"                                                                 # default to all is ok<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>RESULT="0"<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>HOSTIP="$1"<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>MACHINEDOTS="$2"<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>MACHINE=`echo $2 | sed -e's/\./,/g'`<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>URL="https://$MACHINEDOTS/wga/widgets/health.json"                                              # set the URL here<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>RESPONSE=`$CURLCOMMAND $CURLOPTIONS --user "$JCTUID:$JCTPWD" -X GET $URL`          # get the HTTP response from the URL<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>HTML=`echo "$RESPONSE" | jq '.items[] | walk(if type == "array" then (sort_by(.label | ascii_downcase)) else . end)' | /etc/xymon/ext/isam-jct-parse.js`<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>RESULT=`echo "$HTML" | grep -ic "color:red"`                                                    # check to see if search text is present in the response<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>[[ "$RESULT" -ne "0" ]] && COLOR="red"<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>$XYMON $XYMSRV "status $MACHINE.$COLUMN $COLOR `date`<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>${HTML}"<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>done<o:p></o:p></span></p><div class=MsoNormal align=center style='text-align:center'><span style='font-size:11.0pt'><hr size=2 width="100%" align=center></span></div><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>#!/usr/bin/env node<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>var parseJsonAsHTMLTree = function(jsn){<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>    var result = '';<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>    if(jsn.label){<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>        switch(jsn.health){<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>        case "0":<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>        result += '<ul style="list-style-type:none; color:green;"><li>' + jsn.label + "\n";<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>        break;<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>        case "1":<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>        result += '<ul style="list-style-type:none; color:red;"><li>' + jsn.label + "\n";<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>        break;<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>        }<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>        for(var i in jsn.children)<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>            result += parseJsonAsHTMLTree(jsn.children[i]); <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>        result += '</li></ul>';<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>    }<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>    return result;<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>}<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>process.stdin.resume();<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>process.stdin.setEncoding('utf8');<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>process.stdin.on('data', function(data) {<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>var result = parseJsonAsHTMLTree(JSON.parse(data));<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>process.stdout.write("<pre>" + result + "</pre>\n");<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:Consolas'>});<o:p></o:p></span></p><div class=MsoNormal align=center style='text-align:center'><span style='font-size:11.0pt'><hr size=2 width="100%" align=center></span></div><p class=MsoNormal><span style='font-size:11.0pt'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='font-size:11.0pt'>From:</span></b><span style='font-size:11.0pt'> Xymon [mailto:xymon-bounces@xymon.com] <b>On Behalf Of </b>McDonald, Daniel (Dan)<br><b>Sent:</b> Friday, March 3, 2017 7:29 AM<br><b>To:</b> xymon@xymon.com<br><b>Subject:</b> [Xymon] Anyone have a plugin for IBM Datapower?<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='font-size:11.0pt'>I’ve been asked to monitor an IBM Datapower XML gateway, and wanted to see if anyone else had a plugin to do it before I re-invented the wheel.  They have a mib, so supposedly I can poll it with mrtg and feed statuses into xymon with bbmrtg.pl, but IBM claims that their web service has greater detail and information.  So, if anyone has written a xymon plugin to poll a datapower webservice and come up with useful stats to display in xymon, I’d love to hear about it.<o:p></o:p></span></p></div></body></html>