Neben den bisher genannten Möglichkeiten können auch Informationen per http aus anderen Systemen wie in diesem Beispiel Icinga geholt und dargestellt werden. Für das Abrufen der Daten wird hier nicht die Api verwendet, sondern der http Aufruf mit entsprechendem Parameter um ein Json Array zu erhalten.
Für den Zugriff auf die Icinga Daten wurde auf dem gleichen System ein weiteres Icinga-web2 angelegt. Der in der Konfiguratin hinterlegte Benutzer für den Datenbankzugriff, hat in diesem Fall nur lesende Rechte.
Damit die Authentifizierung über htpasswd und nicht über die Datenbank erfolgt, wurde die config/authentication.ini wie folgt angepasst:
[autologin]
backend = external
Neben der erwähnten Datei muss ebenfalls die vhost Konfig für den icingaweb2 angepasst werden.
DirectoryIndex error_norewrite.html
ErrorDocument 404 /error_norewrite.html
</IfModule>
AuthType Basic
AuthName "Icinga Web 2"
AuthUserFile /etc/icingaweb2/icingaweb.htpasswd
Require valid-user
</Directory>
Die benötigte Passworddatei wird mit htpasswd -c icingaweb.htpasswd dashing erstellt.
Dashboard
Die Dateien für das Widget werden unter dem Widgetsverzeichniss icinga abgelegt, die rb Datei in dem Verzeichniss job. Innerhalb der rb Datei muss die Url zum Icinga inklusive der Benutzerdaten angepasst werden. Die Url kann so konfiguriert werden, das zum Beispiel nur Alarme einer bestimmten Hostgruppe dargestellt werden.
icinga.coffee
class Dashing.Icinga extends Dashing.Widget
onData: (data) ->
if data.blink
node = $(@node)
node.addClass(„blinking“)
setTimeout ( =>
node.removeClass(„blinking“)
), 5000
icinga.scss
// —————————————————————————-
// Sass declarations
// —————————————————————————-
@keyframes blink {
50% { opacity : 0.0; }
}
$background-color: rgba(135, 135, 135, 0.7);
$title-color: rgba(255, 255, 255, 0.7);
$in-color: rgba(255, 255, 255, 1.0);
$out-color: rgba(175, 175, 175, 1.0);
$updated-at-color: rgba(255, 255, 255, 0.7);
.widget-icinga {
background-color: $background-color;
.content {
text-align: left;
padding-top:25px;
vertical-align: top;
}
.title {
color: $title-color;
position: absolute;
top: 18px;
left: 0;
right: 0;
}
.updated-at {
color: $updated-at-color;
}
&.large h3 {
font-size: 45px;
}
li {
font-size: 15px;
margin-top: 8px;
text-indent: 10px;
font-weight: normal;
}
.host {
font-weight: bold;
width:50%;
float:left;
}
.CRITICAL {
font-weight:bold;
float:left;
text-align:right;
width:50%;
color:#ff0022;
}
.OK {
font-weight:bold;
float:left;
text-align:right;
width:50%;
color:#3bdb22;
}
.WARNING {
font-weight:bold;
float:left;
text-align:right;
width:50%;
color:#ffde00;
}
.UNKNOWN {
font-weight:bold;
float:left;
text-align:right;
width:50%;
color:#ffffff;
}
.what {
font-style:italic;
font-size:10px;
font-weight: normal;
}
&.blinking {
animation: blink 1s linear infinite;
animation-iteration-count: 2;
}
}
icinga.html
<h1 class=“title“ data-bind=“title“></h1>
<div class=“content“>
<ul>
<li data-foreach-value=“values“ data-bind-class=“value.status“>
<i data-bind-class=“value.icon“></i>
<span class=“host“ data-bind=“value.host“></span>
<span data-bind-class=“value.alert“ data-bind=“value.alert“></span>
<span class=“what“ data-bind=“value.what“></span>
</li>
</ul>
</div>
<p class=“updated-at“ data-bind=“updatedAtMessage“></p>
icinga.rb
# job um werte aus dem Icinga zu holen
require ’net/http‘
require ‚uri‘
require ‚json‘
require „addressable/uri“
review_content_hash = 0
SCHEDULER.every ’30s‘ do
#service status
uri = Addressable::URI.parse(„http://localhost/icingaweb2/monitoring/list/services?(hostgroup=web1|host=miranda)&service_state!=0&service_unhandled=1&sort=service_severity&format=json“)
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)
request.basic_auth(„dashing“, „passwd“)
response = http.request(request)
#host status
uriH = Addressable::URI.parse(„http://localhost/icingaweb2/monitoring/list/hosts?(hostgroup=web1|host=miranda)&host_state!=0&sort=service_severity&format=json“)
httpH = Net::HTTP.new(uriH.host, uriH.port)
requestH = Net::HTTP::Get.new(uriH.request_uri)
requestH.basic_auth(„dashing“, „passwd“)
responseH = httpH.request(requestH)
werteH = JSON.parse(responseH.body)
review_content = {}
# Liste der Hosts erstellen
hosts = []
werteH.length.times do |idx|
if werteH[idx][„host_state“].to_i != 0
dalert = „DOWN“
end
review_content[idx] = {:host => werteH[idx][„host_name“],:alert => dalert}
#Host der liste hinzufügen
hosts.push(werteH[idx][„host_name“])
end
laenge = review_content.length
werte = JSON.parse(response.body)
werte.length.times do |idx|
# wenn es keine hostdown Meldung gibt dann wird der Servicealarm ausgegeben
if hosts.include?(werte[idx][„host_name“]) == false
if werte[idx][„service_state“].to_i == 0
dalert = „OK“
end
if werte[idx][„service_state“].to_i == 1
dalert = „WARNING“
end
if werte[idx][„service_state“].to_i == 2
dalert = „CRITICAL“
end
if werte[idx][„service_state“].to_i == 3
dalert = „UNKNOWN“
end
laenge += 1
review_content[laenge] = {:host => werte[idx][„host_name“],:what => werte[idx][„service_description“],:alert => dalert}
end
end
if review_content_hash == review_content.to_set.hash
send_event(„icappl“,{ values: review_content.values })
else
send_event(„icappl“,{ values: review_content.values, blink: review_content.length })
end
review_content_hash = review_content.to_set.hash
# ende scheduler
end