Skip to content

Instantly share code, notes, and snippets.

@joshuafernandes
Forked from willjohnson/README.md
Last active December 9, 2018 04:21
Show Gist options
  • Save joshuafernandes/3c38af9295cb262dbcd00d3cf4719a09 to your computer and use it in GitHub Desktop.
Save joshuafernandes/3c38af9295cb262dbcd00d3cf4719a09 to your computer and use it in GitHub Desktop.
Server Status Widget for Dashing

Description

A Dashing widget that checks whether a server is responding to either an http or ping request. It displays either a check or alert depending on the response.

Usage

  1. Include the typhoeus gem to your Gemfile and then update with bundle

  2. Add the widget HTML to your dashboard

    <li data-row="1" data-col="1" data-sizex="1" data-sizey="1">
      <div data-id="server_status" data-view="ServerStatus" data-title="Server Status"></div>
    </li>
  1. Create a directory titled "server_status" under your widgets directory and move server_status.coffee, server_status.html, and server_status.scss into that directory.

  2. Modify the servers array of the server_status.rb file.

  3. Move server_status.rb into your jobs folder.

class Dashing.ServerStatus extends Dashing.Widget
<li data-row="1" data-col="1" data-sizex="1" data-sizey="1">
<div data-id="server_status" data-view="ServerStatus" data-title="Server Status"></div>
</li>
<h1 class="title" data-bind="title"></h1>
<ul>
<li data-foreach-item="items">
<span class="label" data-bind="item.label"></span>
<span class="value"><div data-bind-class="item.color"><i data-bind-class="item.arrow"></i></div></span>
</li>
</ul>
<p class="more-info" data-bind="moreinfo"></p>
<p class="updated-at" data-bind="updatedAtMessage"></p>
#!/usr/bin/env ruby
require 'typhoeus'
# Check whether a server is responding
# you can set a server to check via http request or ping
#
# server options:
# name: how it will show up on the dashboard
# url: either a website url or an IP address (do not include https:// when usnig ping method)
# method: either 'http' or 'ping'
# if the server you're checking redirects (from http to https for example) the check will
# return false
def bool_to_i(b)
(b) ? 1 : 0
end
def send_request(method, uri, headers={}, body={}, params={}, verbose=false)
cookie_jar = "tmp"
response = Typhoeus::Request.new(
uri.to_s,
:headers => headers,
:body => body,
:params => params,
:method => method,
:ssl_verifypeer =>false,
:ssl_verifyhost => 0,
:followlocation => true,
:timeout => 60,
:verbose => verbose,
:cookiefile => cookie_jar,
:cookiejar => cookie_jar,
:maxredirs => 10
).run
return response
end
servers = [{:name=> 'server1', :url=> 'https://www.test.com', :method=> 'http'},
{:name=> 'server2', :url=> 'https://www.test2.com', :method=> 'http'},
{:name=> 'server3', :url=> '192.168.0.1', :method=> 'ping'}]
SCHEDULER.every '1m', :first_in => 0 do |job|
include Typhoeus
statuses = Array.new
# check status for each server
servers.each do |server|
case server[:method]
when "http"
response = send_request(:get, server[:url])
result = (response.code == 200)
when "ping"
ping_count = 10
ping_req = `ping -q -c #{ping_count} #{server[:url]}`
result = !($?.exitstatus == 0)
else
puts "pebcak error..."
end
arrow = (result) ? "icon-ok-sign" : "icon-warning-sign"
color = (result) ? "green" : "red"
statuses.push({:label => server[:name], :value=> bool_to_i(result), :arrow=> arrow, :color=> color})
puts "statuses #{statuses}"
end
# print statuses to dashboard
send_event('server_status', {items: statuses})
end
// ----------------------------------------------------------------------------
// Sass declarations
// ----------------------------------------------------------------------------
$background-color: #12b0c5;
$value-color: #fff;
$title-color: rgba(255, 255, 255, 0.7);
$label-color: rgba(255, 255, 255, 0.7);
$moreinfo-color: rgba(255, 255, 255, 0.7);
// ----------------------------------------------------------------------------
// Widget-list styles
// ----------------------------------------------------------------------------
.widget-server-status {
background-color: $background-color;
vertical-align: top;
.title {
color: $title-color;
}
ol, ul {
margin: 0 15px;
text-align: left;
color: $label-color;
}
ol {
list-style-position: inside;
}
li {
margin-bottom: 5px;
}
.list-nostyle {
list-style: none;
}
.label {
color: $label-color;
}
.value {
float: right;
margin-left: 12px;
font-weight: 600;
color: $value-color;
}
.updated-at {
color: rgba(0, 0, 0, 0.3);
}
.more-info {
color: $moreinfo-color;
}
.red {
color: red;
}
.green {
color: green;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment