Auf Wunsch eines einzelnen Herren habe ich mich auf die Suche gemacht OpenNMS zu zu erweitern, dass man auch nach der sys location suchen kann. Das Vorhandensein von ein paar Skripten von der Seite Doug Bakewell haben die Aufgabe recht einfach gemacht. Ich konnte mein Skript a) hiervon ableiten und b) gleich hier mit ablegen, ohne weitere Veränderung an der Konfiguration des Servers. Die Skripte haben ein paar kleine Schwächen (verwenden zu hoher Rechte, shell/SQL injection) dazu später eventuell mehr.
1. Anlegen einer Header- (opennmsfooter.shtml) und Footerdatei (opennmsheader.shtml),
dazu einfach die Hauptseite von OpenNMS aufrufen und den Quelltext extrahieren und zwei Dateien ablegen. Der erste Teil geht bis zur Zeile <!– Body –> und der Zweite Teil geht ab <!– Footer –> los. (Genau genommen habe ich in die Header Datei noch die 6 Zeilen mit aufgenommen)
2. Anlegen des CGI Skriptes,
/opt/noc/http/locationsummary.cgi (Rechte zum Ausführen nicht vergessen), durch welches dann der HTML Output dynamisch zusammengestellt und an den Browser zurückgegeben wird.
#!/bin/bash
source /etc/noc.conf
cat << EOF
Content-Type: text/html
Expires: 0
EOF
cat /opt/noc/http/opennmsheader.shtml
<div id="content">
<!-- End of Content -->
<div class="spacer"><!-- --></div>
Abfragen des übergebenen Suchstrings, prüfen auf kritische Zeichen und Befehle, SQL Abfrage vorbereiten und Ausführen, Ergebnis der SQL Abfrage in HTML Seite einbetten.
</div><!-- id="content" -->
</div>
cat /opt/noc/http/opennmsfooter.shtml
3. Abfragen des übergebenen Suchstrings, prüfen auf kritische Zeichen und Befehle
Eine ausgesprochen Elegante Art die übergebenen Parameter in Variablen zu überführen. Bei aller Eleganz ist es aber mit Sicherheit auch etwas gefährlich, da praktisch jede andere Variable überschieben werden kann. Das birgt mit Sicherheit ordentlich Risiken. Aber “no risk no fun”, hatte ein alter Kollege auf seiner Tasse stehen.
for VAR in `echo $QUERY_STRING | tr "&" "\t"`
do
NAME=$(echo $VAR | tr = " " | awk '{print $1}';);
VALUE=$(echo $VAR | tr = " " | awk '{ print $2}' | tr + " ");
declare $NAME="$VALUE";
done
4. SQL Abfrage vorbereiten und Ausführen, Ergebnis der SQL Abfrage in HTML Seite einbetten
echo "<ul class="plain">"
C=1
sql "select distinct node.nodesyslocation from node where nodesyslocation~*'$nod
eloc' and nodetype!='D' order by nodesyslocation;" | \
sed -e 's/^ *\(.*\) *$/\1/' | \
while read; do
if [ "$REPLY" != "" ]; then
echo "<li>"
if [ "$listLocations" != "" ]; then
echo "$REPLY <ul><li>"
fi
sql "select node.nodeid, node.nodelabel from node where
node.nodesyslocation='$REPLY' and \
nodetype!='D' order by node.nodelabel;" | \
sed -e 's/^ *\([0-9]*\) *|\(.*\)$/<a href="\/ope
nnms\/element\/node.jsp?node=\1">\2<\/a><br>/'
echo "</li>"
if [ "$listLocations" != "" ]; then
echo "</ul></li>"
fi
C=`expr $C + 1`
fi
done
echo "</ul>"
5. Einbinden des CGI Skriptes in die Oberfläche von OpenNMS
zuerst sichern der original Dateien
cd /opt/opennms/jetty-webapps/opennms/
cp ./element/index.jsp ./element/index.jsp.org
cp ./includes/quicksearch-box.jsp ./includes/quicksearch-box.jsp.org
Einfügen der Suchform an geeigneter Stelle.
<form action="/locationsummary.cgi" method="get">
<p align="right">Node location like:
<input type="hidden" name="listLocations" value="true"/>
<input type="text" size="20" name="nodeloc" />
<input type="submit" value="Search"/></p>
</form>
Änderungen sichern, um nach möglichen Updates auf die gemachten Änderungen wieder zugreifen zu können.
cp ./element/index.jsp ./element/index.jsp.ki73buz
cp ./includes/quicksearch-box.jsp ./includes/quicksearch-box.jsp.ki73buz
Das CGI Skript und die beiden statischen Dateien können hier nochmal geladen werden sysloc.tar (als Backup so zusagen).