server_status 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.rvmrc ADDED
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # This is an RVM Project .rvmrc file, used to automatically load the ruby
4
+ # development environment upon cd'ing into the directory
5
+
6
+ # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
7
+ # Only full ruby name is supported here, for short names use:
8
+ # echo "rvm use 1.9.3" > .rvmrc
9
+ environment_id="1.9.3@status"
10
+
11
+ # Uncomment the following lines if you want to verify rvm version per project
12
+ # rvmrc_rvm_version="1.16.17 (stable)" # 1.10.1 seams as a safe start
13
+ # eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
14
+ # echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
15
+ # return 1
16
+ # }
17
+
18
+ # First we attempt to load the desired environment directly from the environment
19
+ # file. This is very fast and efficient compared to running through the entire
20
+ # CLI and selector. If you want feedback on which environment was used then
21
+ # insert the word 'use' after --create as this triggers verbose mode.
22
+ if [[ -d "${rvm_path:-$HOME/.rvm}/environments"
23
+ && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
24
+ then
25
+ \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
26
+ [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]] &&
27
+ \. "${rvm_path:-$HOME/.rvm}/hooks/after_use" || true
28
+ else
29
+ # If the environment file has not yet been created, use the RVM CLI to select.
30
+ rvm --create "$environment_id" || {
31
+ echo "Failed to create RVM environment '${environment_id}'."
32
+ return 1
33
+ }
34
+ fi
35
+
36
+ # If you use bundler, this might be useful to you:
37
+ # if [[ -s Gemfile ]] && {
38
+ # ! builtin command -v bundle >/dev/null ||
39
+ # builtin command -v bundle | GREP_OPTIONS= \grep $rvm_path/bin/bundle >/dev/null
40
+ # }
41
+ # then
42
+ # printf "%b" "The rubygem 'bundler' is not installed. Installing it now.\n"
43
+ # gem install bundler
44
+ # fi
45
+ # if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
46
+ # then
47
+ # bundle install | GREP_OPTIONS= \grep -vE '^Using|Your bundle is complete'
48
+ # fi
data/Gemfile ADDED
@@ -0,0 +1,20 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ gem 'sinatra'
9
+ gem 'slim'
10
+ gem 'thin'
11
+ gem 'settingslogic'
12
+ gem 'rest-client'
13
+
14
+ group :development do
15
+ gem "rspec"
16
+ gem "yard"
17
+ gem "rdoc"
18
+ gem "bundler"
19
+ gem "jeweler"
20
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,60 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ daemons (1.1.9)
5
+ diff-lcs (1.1.3)
6
+ eventmachine (1.0.0)
7
+ git (1.2.5)
8
+ jeweler (1.8.4)
9
+ bundler (~> 1.0)
10
+ git (>= 1.2.5)
11
+ rake
12
+ rdoc
13
+ json (1.7.5)
14
+ mime-types (1.19)
15
+ rack (1.4.1)
16
+ rack-protection (1.2.0)
17
+ rack
18
+ rake (10.0.2)
19
+ rdoc (3.12)
20
+ json (~> 1.4)
21
+ rest-client (1.6.7)
22
+ mime-types (>= 1.16)
23
+ rspec (2.12.0)
24
+ rspec-core (~> 2.12.0)
25
+ rspec-expectations (~> 2.12.0)
26
+ rspec-mocks (~> 2.12.0)
27
+ rspec-core (2.12.0)
28
+ rspec-expectations (2.12.0)
29
+ diff-lcs (~> 1.1.3)
30
+ rspec-mocks (2.12.0)
31
+ settingslogic (2.0.8)
32
+ sinatra (1.3.3)
33
+ rack (~> 1.3, >= 1.3.6)
34
+ rack-protection (~> 1.2)
35
+ tilt (~> 1.3, >= 1.3.3)
36
+ slim (1.3.4)
37
+ temple (~> 0.5.5)
38
+ tilt (~> 1.3.3)
39
+ temple (0.5.5)
40
+ thin (1.5.0)
41
+ daemons (>= 1.0.9)
42
+ eventmachine (>= 0.12.6)
43
+ rack (>= 1.0.0)
44
+ tilt (1.3.3)
45
+ yard (0.8.3)
46
+
47
+ PLATFORMS
48
+ ruby
49
+
50
+ DEPENDENCIES
51
+ bundler
52
+ jeweler
53
+ rdoc
54
+ rest-client
55
+ rspec
56
+ settingslogic
57
+ sinatra
58
+ slim
59
+ thin
60
+ yard
data/LICENSE.txt ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2012 Jeong, Jiung
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+ 2. Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+
13
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
14
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
17
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
+
24
+ The views and conclusions contained in the software and documentation are those
25
+ of the authors and should not be interpreted as representing official policies,
26
+ either expressed or implied, of the FreeBSD Project.
data/README.md ADDED
@@ -0,0 +1,69 @@
1
+ Server Status
2
+ ==========
3
+ [![Dependency Status](https://gemnasium.com/astral1/server_status.png)](https://gemnasium.com/astral1/server_status)
4
+ [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/astral1/server_status)
5
+
6
+ 서버의 상태를 체크하고 쉽게 확인하기 위한 도구입니다. 도메인 별로 port 상태와 대표 API의 동작 여부를 확인합니다.
7
+
8
+ 사용법
9
+ ----
10
+ ```bash
11
+ gem install server_status
12
+ statusd <path to config file>
13
+ ```
14
+
15
+ API
16
+ ---
17
+ - **/servers** - 확인 대상의 목록
18
+ ```
19
+ ["google","test"]
20
+ ```
21
+ - **/:server_name/status - 해당 대상의 상태
22
+ ```
23
+ {"name":"google","code":404,"description":"Google Portal","is_open":true}
24
+ ```
25
+
26
+ 예제 설정
27
+ ----
28
+ ```yaml
29
+ port: 4568
30
+ servers:
31
+ google:
32
+ protocol: http
33
+ domain: www.google.com
34
+ ssl: false
35
+ description: Google Portal
36
+ port: 80
37
+ apis:
38
+ default:
39
+ url: /deaddead
40
+ details:
41
+ index:
42
+ description: Index Page
43
+ url: /
44
+ test:
45
+ protocol: http
46
+ domain: localhost
47
+ ssl: false
48
+ description: Test Dummy
49
+ port: 4567
50
+ apis:
51
+ default:
52
+ url: /
53
+ payload:
54
+ header:
55
+ content_type: application/json
56
+ params:
57
+ query: TEST
58
+ encode: json
59
+ method: get
60
+ ```
61
+
62
+ Copyright
63
+ ---------
64
+
65
+ 이 프로젝트는 Simplified BSD 2.0 라이센스로 제공되고 있습니다.
66
+
67
+ Copyright (c) 2012 Jeong, Jiung. See LICENSE.txt for
68
+ further details.
69
+
data/Rakefile ADDED
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "server_status"
18
+ gem.homepage = "http://github.com/astral1/server_status"
19
+ gem.license = "BSD"
20
+ gem.summary = %Q{Server Status check}
21
+ gem.description = %Q{
22
+ Server Status check
23
+ }
24
+ gem.email = "ethernuiel@sanultari.com"
25
+ gem.authors = ["Jeong, Jiung"]
26
+ # dependencies defined in Gemfile
27
+ end
28
+ Jeweler::RubygemsDotOrgTasks.new
29
+
30
+ require 'rspec/core'
31
+ require 'rspec/core/rake_task'
32
+ RSpec::Core::RakeTask.new(:spec) do |spec|
33
+ spec.pattern = FileList['spec/**/*_spec.rb']
34
+ end
35
+ task :default => :spec
36
+
37
+ require 'yard'
38
+ YARD::Rake::YardocTask.new
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/bin/statusd ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ if ARGV.length < 1
3
+ puts 'usage: statusd <config file>'
4
+ exit 1
5
+ end
6
+
7
+ require 'server_status'
8
+
9
+ set_config ARGV[0]
10
+ ServerStatusApp.run!
@@ -0,0 +1,46 @@
1
+ class ServerStatusApp < Sinatra::Base
2
+ set :root, GEM_ROOT
3
+ set :server, :thin
4
+
5
+ class << self
6
+ def check server
7
+ server_config = ServerStatusConfig.servers[server.to_sym]
8
+ client = ServerStatusClient.new server_config
9
+ status_code = client.request.to_s
10
+ Status.new server, server_config[:description.to_s], status_code, client.is_port_open?
11
+ end
12
+ end
13
+
14
+ get '/' do
15
+ @server_status = ServerStatusConfig.servers.keys.collect do |server|
16
+ ServerStatusApp.check server
17
+ end
18
+
19
+ slim :index
20
+ end
21
+
22
+ get '/servers' do
23
+ ServerStatusConfig.servers.keys.to_json
24
+ end
25
+
26
+ get '/:server/status' do
27
+ ServerStatusApp.check(params[:server].to_sym).to_json
28
+ end
29
+
30
+ class Status
31
+ attr_reader :code, :name, :description
32
+
33
+ def initialize name, description, code, is_open
34
+ @code, @name, @description, @is_open = code.to_i, name, description, is_open
35
+ end
36
+
37
+ def is_open?
38
+ @is_open
39
+ end
40
+
41
+ def to_json
42
+ {name: @name, code: @code, description: @description, is_open: @is_open}.to_json
43
+ end
44
+ end
45
+ end
46
+
@@ -0,0 +1,68 @@
1
+ require 'rest-client'
2
+ require 'socket'
3
+ require 'timeout'
4
+
5
+ class ServerStatusClient
6
+ def initialize(hash)
7
+ @domain = hash[:domain.to_s]
8
+ @port = hash[:port.to_s]
9
+ @scheme = hash[:ssl.to_s] ? 'https' : 'http'
10
+ @url = "#@scheme://#@domain:#@port"
11
+ @default = hash[:apis.to_s][:default.to_s]
12
+ @payload = @default[:payload.to_s]
13
+ @payload ||= {}
14
+ end
15
+
16
+ def request
17
+ header, method, params = parse_params
18
+ Timeout::timeout(5) do
19
+ begin
20
+ case method
21
+ when :get
22
+ header[:params] = params
23
+ response = RestClient.get "#@url#{@default[:url.to_s]}", header
24
+ when :post
25
+ response = RestClient.post "#@url#{@default[:url.to_s]}", params.to_json, header
26
+ end
27
+ response.code
28
+ rescue => e
29
+ e.response.code
30
+ end
31
+ end
32
+ rescue Timeout::Error
33
+ return 408
34
+ end
35
+
36
+ def parse_params
37
+ header = {}
38
+ method = :get
39
+ params = {}
40
+ if @payload.has_key? :header.to_s
41
+ header = @payload[:header.to_s]
42
+ end
43
+ if @payload.has_key? :method.to_s
44
+ method = @payload[:method.to_s].downcase.to_sym
45
+ end
46
+ if @payload.has_key? :params.to_s
47
+ params = @payload[:params.to_s]
48
+ end
49
+ [header, method, params]
50
+ end
51
+
52
+ #noinspection RubyResolve
53
+ def is_port_open?
54
+ Timeout::timeout(1) do
55
+ begin
56
+ s = TCPSocket.new(@domain, @port)
57
+ s.close
58
+ return true
59
+ rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
60
+ return false
61
+ end
62
+ end
63
+ rescue Timeout::Error
64
+ return false
65
+ end
66
+
67
+ private :parse_params
68
+ end
@@ -0,0 +1,4 @@
1
+ require 'settingslogic'
2
+
3
+ class ServerStatusConfig < Settingslogic
4
+ end
@@ -0,0 +1,19 @@
1
+ require 'sinatra/base'
2
+ require 'slim'
3
+ require 'json'
4
+ require 'server_status/config'
5
+ require 'server_status/client'
6
+
7
+ Slim::Engine.set_default_options pretty: true
8
+
9
+ LIB_ROOT = File.expand_path File.dirname(__FILE__)
10
+ GEM_ROOT = File.expand_path '..', LIB_ROOT
11
+ STATIC_ROOT = File.expand_path 'public', GEM_ROOT
12
+ VIEW_ROOT = File.expand_path 'views', GEM_ROOT
13
+
14
+ require 'server_status/app'
15
+
16
+ def set_config file_name
17
+ ServerStatusConfig.source File.expand_path file_name
18
+ ServerStatusApp.set :port, ServerStatusConfig.port
19
+ end
@@ -0,0 +1,7 @@
1
+ html,body{height: 100%;}
2
+ .container{min-height: 100%;height: auto !important;height: 100%;margin: 0 auto -60px;}
3
+ .push,footer{height: 60px;}
4
+ footer{background-color: #f5f5f5;}
5
+
6
+ footer .credit{margin: 20px 0;text-align: center;}
7
+ .table td.center,.table th.center{text-align: center;}