server-status 1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: af20ee25a465ed5e45e9a0018dcacb9afc3f94e4
4
+ data.tar.gz: 3110214e2c5ce45799d213a9e97505b5ce82dd6a
5
+ SHA512:
6
+ metadata.gz: c7c22c4d49b1c6fee75812769db130051a98406729dcc39e96c508e535e06c35bc93a4a64dd2821be07790a47e32ce722f41ea964d8fcbce4d99d30b411547c9
7
+ data.tar.gz: be97a5537f8c72f8d570fbdab9c8d945baa5aef74f96a85616ba48a58448bdc6899452f8e105579d4f0683e71f3273d1adaa4257f6bc55c7cbedc910a85e8421
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in server-status.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2016 James Brooks
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # Server Status
2
+
3
+ [![Code Climate](https://codeclimate.com/github/jamesbrooks/server-status.png)](https://codeclimate.com/github/JamesBrooks/git-runner)
4
+ [![Gem Version](https://badge.fury.io/rb/server-status.png)](http://badge.fury.io/rb/git-runner)
5
+ [![Dependency Status](https://gemnasium.com/jamesbrooks/server-status.png)](https://gemnasium.com/JamesBrooks/git-runner)
6
+
7
+ Command line tool for quickly fetching and displaying vital host metrics.
8
+
9
+ ## Installation
10
+
11
+ `gem install server-status`
12
+
13
+ ## Usage
14
+
15
+ ### Add a host
16
+
17
+ ```sh
18
+ # Track a host (uses the host name as the friendly name)
19
+ server-status add ubuntu@server.net
20
+
21
+ # Track a host using a friendly name
22
+ server-status add ubuntu@server.net personal-server
23
+ ```
24
+
25
+ ### Remove a host
26
+
27
+ ```sh
28
+ server-status remove personal-server
29
+ ```
30
+
31
+ ### List all hosts
32
+
33
+ ```sh
34
+ server-status list
35
+ ```
36
+
37
+ ### Fetch statuses of all tracked hosts
38
+
39
+ ```sh
40
+ server-status
41
+ ```
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "server/status"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/server-status ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require 'server-status'
3
+ ServerStatus::Application.new.run
@@ -0,0 +1,88 @@
1
+ module ServerStatus
2
+ class Application
3
+ include Commander::Methods
4
+
5
+ attr_accessor :configuration
6
+
7
+
8
+ def initialize
9
+ @config = ServerStatus::Configuration.new
10
+ end
11
+
12
+ def run
13
+ never_trace!
14
+
15
+ program :name, 'Server Status'
16
+ program :version, ServerStatus::VERSION
17
+ program :description, 'Fast remote host statuses'
18
+
19
+ default_command :run
20
+
21
+ command :run do |c|
22
+ c.description = 'Fetch statuses of all tracked hosts (default)'
23
+
24
+ c.option '--[no-]os'
25
+ c.option '--[no-]uptime'
26
+ c.option '--[no-]load'
27
+ c.option '--[no-]disk-usage'
28
+ c.option '--[no-]inode-usage'
29
+ c.option '--[no-]memory-usage'
30
+ c.option '--[no-]package-updates'
31
+ c.option '--[no-]reboot-required'
32
+
33
+ c.action do |args, options|
34
+ options.default({
35
+ os: false,
36
+ uptime: true,
37
+ load: true,
38
+ disk_usage: true,
39
+ inode_usage: true,
40
+ memory_usage: true,
41
+ package_updates: true,
42
+ reboot_required: true
43
+ }.merge(@config.options))
44
+
45
+ ServerStatus::Commands::Run.new(@config, options).perform
46
+ end
47
+ end
48
+
49
+ command :list do |c|
50
+ c.description = 'List all currently tracked hosts'
51
+
52
+ c.action do
53
+ ServerStatus::Commands::List.new(@config).perform
54
+ end
55
+ end
56
+
57
+ command :add do |c|
58
+ c.syntax = 'add <host> [name]'
59
+ c.description = 'Add a remote host'
60
+
61
+ c.action do |args, options|
62
+ if args.size < 1 || args.size > 2
63
+ puts "requires either 1 or 2 arguments\n\n\tadd <host> [friendly-name]\n\n"
64
+ exit(1)
65
+ end
66
+
67
+ ServerStatus::Commands::Add.new(@config, *args).perform
68
+ end
69
+ end
70
+
71
+ command :remove do |c|
72
+ c.syntax = 'remove <name>'
73
+ c.description = 'Remove a remote host'
74
+
75
+ c.action do |args, options|
76
+ unless args.size == 1
77
+ puts "requires 1 argument\n\n\tremove <name>\n\n"
78
+ exit(1)
79
+ end
80
+
81
+ ServerStatus::Commands::Remove.new(@config, *args).perform
82
+ end
83
+ end
84
+
85
+ run!
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,29 @@
1
+ module ServerStatus
2
+ module Commands
3
+ class Add < BaseCommand
4
+ def initialize(config, host, name=nil)
5
+ super(config)
6
+
7
+ @host = host
8
+ @name = name || host
9
+ end
10
+
11
+ def perform
12
+ settings['hosts'] ||= {}
13
+
14
+ # Check to see if we're already tracking
15
+ settings['hosts'].each do |name, host|
16
+ if name == @name
17
+ puts "#{name} already exists"
18
+ exit(1)
19
+ end
20
+ end
21
+
22
+ settings['hosts'][@name] = @host
23
+ config.save
24
+
25
+ puts "Added #{@name}"
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ module ServerStatus
2
+ module Commands
3
+ class BaseCommand
4
+ attr_accessor :config
5
+
6
+
7
+ def initialize(config)
8
+ @config = config
9
+ end
10
+
11
+ def settings
12
+ config.settings
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ module ServerStatus
2
+ module Commands
3
+ class List < BaseCommand
4
+ def perform
5
+ if settings['hosts'].any?
6
+ longest_name = settings['hosts'].map { |n, h| n.size }.max
7
+
8
+ settings['hosts'].each do |name, host|
9
+ puts "#{name.ljust(longest_name)} #{host}"
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ module ServerStatus
2
+ module Commands
3
+ class Remove < BaseCommand
4
+ def initialize(config, name)
5
+ super(config)
6
+ @name = name
7
+ end
8
+
9
+ def perform
10
+ if settings['hosts'] && settings['hosts'][@name]
11
+ settings['hosts'].delete(@name)
12
+ config.save
13
+
14
+ puts "Removed #{@name}"
15
+
16
+ return
17
+ end
18
+
19
+ puts "#{@name} does not exist"
20
+ exit(1)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module ServerStatus
2
+ module Commands
3
+ class Run < BaseCommand
4
+ def initialize(config, options)
5
+ super(config)
6
+
7
+ @options = options
8
+ end
9
+
10
+ def perform
11
+ unless settings['hosts']
12
+ puts "No hosts tracked. To add hosts: server-status add <host> [name]"
13
+ exit(1)
14
+ end
15
+
16
+ host_set = ServerStatus::HostSet.new(config, @options, settings['hosts'])
17
+ host_set.fetch_statuses
18
+
19
+ report = ServerStatus::Report.new(config, @options, host_set)
20
+ puts report.generate_table
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,31 @@
1
+ require 'json'
2
+
3
+ module ServerStatus
4
+ class Configuration
5
+ CONFIG_PATH = File.join(Dir.home, '.server-status.json')
6
+
7
+ attr_accessor :settings
8
+
9
+
10
+ def initialize
11
+ if File.exist?(CONFIG_PATH)
12
+ @settings = JSON.parse(File.open(CONFIG_PATH).read)
13
+ else
14
+ @settings = {}
15
+ end
16
+ end
17
+
18
+ def save
19
+ File.open(CONFIG_PATH, 'w') do |file|
20
+ file.write JSON.pretty_generate(@settings)
21
+ end
22
+ end
23
+
24
+ def options
25
+ # symbolize keys
26
+ (settings['options'] || {}).each_with_object({}) do |(key, value), hash|
27
+ hash[key.to_sym] = value
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,50 @@
1
+ module ServerStatus
2
+ class Host
3
+ class RemoteCommandFailure < StandardError ; end
4
+
5
+ attr_accessor :name, :status
6
+
7
+
8
+ def initialize(config, name, host)
9
+ @config = config
10
+ @name = name
11
+ @host = host
12
+
13
+ @feteched_status = false
14
+ end
15
+
16
+ def feteched_status?
17
+ @feteched_status
18
+ end
19
+
20
+ def fetch_status(status_command)
21
+ # Fetch statuses
22
+ raw_statuses = execute_command(status_command)
23
+
24
+ # Hashed statuses
25
+ raw_statuses = raw_statuses.split(ServerStatus::StatusCommand::SEPARATOR)
26
+ raw_statuses = raw_statuses.map(&:strip)
27
+ raw_statuses = status_command.requested_options.zip(raw_statuses).to_h
28
+
29
+ @feteched_status = true
30
+
31
+ @status = raw_statuses
32
+
33
+
34
+ rescue RemoteCommandFailure => ex
35
+ @status = { error: ex.message }
36
+ end
37
+
38
+
39
+ private
40
+ def execute_command(status_command)
41
+ stdin, stdout, stderr, wait_thread = Open3.popen3("ssh #{@host} \"bash -s\" << EOF\n#{status_command.to_script}\nEOF")
42
+
43
+ if wait_thread.value.success?
44
+ stdout.read
45
+ else
46
+ raise RemoteCommandFailure, stderr.read
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,28 @@
1
+ module ServerStatus
2
+ class HostSet
3
+ attr_accessor :config, :options, :hosts
4
+
5
+
6
+ def initialize(config, options, hosts)
7
+ @config = config
8
+ @options = options
9
+ @hosts = hosts.map { |host, name| Host.new(config, host, name) }
10
+ end
11
+
12
+ def fetch_statuses
13
+ threads = @hosts.map do |host|
14
+ Thread.new do
15
+ host.fetch_status(status_command)
16
+ end
17
+ end
18
+
19
+ threads.each(&:join)
20
+ end
21
+
22
+
23
+ private
24
+ def status_command
25
+ @status_command ||= ServerStatus::StatusCommand.new(@options)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,132 @@
1
+ module ServerStatus
2
+ class Report
3
+ COLUMN_SPACING = 5
4
+
5
+
6
+ def initialize(config, options, host_set)
7
+ @config = config
8
+ @options = options
9
+ @host_set = host_set
10
+ end
11
+
12
+ def generate_table
13
+ str = "\n"
14
+
15
+ # Report any failures
16
+ if (failed_hosts = @host_set.hosts.reject(&:feteched_status?)).any?
17
+ failed_hosts.each do |host|
18
+ str << "Failure #{host.name} - #{host.status[:error]}\n".colorize(:red)
19
+ end
20
+
21
+ str << "\n"
22
+ end
23
+
24
+ columns = [ :host ] + @host_set.hosts.detect(&:feteched_status?).status.keys
25
+
26
+ # Process status values
27
+ statuses = @host_set.hosts.select(&:feteched_status?).map do |host|
28
+ host.status.each_with_object({ host: host.name }) do |(k, v), hash|
29
+ hash[k] = send("format_#{k}", v)
30
+ end
31
+ end
32
+
33
+ # Determine column widths
34
+ column_widths = columns.each_with_object({}) do |col, hash|
35
+ sizes = statuses.map { |s| s[col].uncolorize.size }
36
+ sizes << col.to_s.size
37
+
38
+ hash[col] = sizes.max
39
+ end
40
+
41
+
42
+ # Render headings
43
+ column_widths.each do |col, col_width|
44
+ str << col.to_s.upcase.colorize(:blue)
45
+ str << ' ' * (COLUMN_SPACING + col_width - col.size)
46
+ end
47
+
48
+ str << "\n"
49
+
50
+
51
+ # Render table
52
+ statuses.sort { |x,y| x[:host] <=> y[:host] }.each do |status|
53
+ column_widths.each do |col, col_width|
54
+ str << status[col]
55
+ str << ' ' * (COLUMN_SPACING + col_width - status[col].uncolorize.size)
56
+ end
57
+
58
+ str << "\n"
59
+ end
60
+
61
+ str << "\n"
62
+ str
63
+ end
64
+
65
+
66
+ private
67
+ # Formatters
68
+ def format_os(val)
69
+ val
70
+ end
71
+
72
+ def format_uptime(val)
73
+ "#{val.to_i / 86400} days"
74
+ end
75
+
76
+ def format_load(val)
77
+ val
78
+ end
79
+
80
+ def format_disk_usage(val)
81
+ format_percentage(val)
82
+ end
83
+
84
+ def format_inode_usage(val)
85
+ format_percentage(val)
86
+ end
87
+
88
+ def format_memory_usage(val)
89
+ used, available = val.split(' ').map(&:to_f)
90
+ format_percentage(used / (used + available))
91
+ end
92
+
93
+ def format_package_updates(val)
94
+ str = ''
95
+
96
+ if val =~ /(\d+) packages can be updated/
97
+ str << $1 if $1.to_i != 0
98
+ end
99
+
100
+ if val =~ /(\d+) (updates are|update is a) security update(s)?/
101
+ str << " (#{$1} security)".colorize(:red) if $1.to_i != 0
102
+ end
103
+
104
+ str
105
+ end
106
+
107
+ def format_reboot_required(val)
108
+ if val.to_i == 1
109
+ 'YES'.colorize(:yellow)
110
+ else
111
+ 'NO'
112
+ end
113
+ end
114
+
115
+ def format_percentage(val)
116
+ if val.is_a?(String)
117
+ # Convert from string % to float
118
+ val = val.to_f / 100
119
+ end
120
+
121
+ color = if val > 0.85
122
+ :red
123
+ elsif val > 0.7
124
+ :yellow
125
+ else
126
+ :normal
127
+ end
128
+
129
+ "#{(val * 100).round(0)}%".colorize(color)
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,51 @@
1
+ module ServerStatus
2
+ class StatusCommand
3
+ SEPARATOR = '###'
4
+
5
+
6
+ def initialize(options)
7
+ @options = options
8
+ @parts = []
9
+ end
10
+
11
+ def requested_options
12
+ @requested_options ||= @options.__hash__.select { |k,v| k if v }.keys
13
+ end
14
+
15
+ def to_script
16
+ if @options.os
17
+ @parts << "lsb_release -d | cut -f2"
18
+ end
19
+
20
+ if @options.uptime
21
+ @parts << "cat /proc/uptime | cut -d\" \" -f1"
22
+ end
23
+
24
+ if @options.load
25
+ @parts << "cat /proc/loadavg | cut -d\" \" -f -3"
26
+ end
27
+
28
+ if @options.disk_usage
29
+ @parts << "df -h | awk '/\\/$/' | sed 's/ \\+/ /g' | cut -d\" \" -f5"
30
+ end
31
+
32
+ if @options.inode_usage
33
+ @parts << "df -hi | awk '/\\/$/' | sed 's/ \\+/ /g' | cut -d\" \" -f5"
34
+ end
35
+
36
+ if @options.memory_usage
37
+ @parts << "free -m | sed -n 3p | sed 's/ \\+/ /g' | cut -d\" \" -f 3-"
38
+ end
39
+
40
+ if @options.package_updates
41
+ @parts << "cat /var/lib/update-notifier/updates-available 2>/dev/null"
42
+ end
43
+
44
+ if @options.reboot_required
45
+ @parts << "if [ -f /var/run/reboot-required ]; then echo 1 ; fi"
46
+ end
47
+
48
+ @parts.join("\necho '#{SEPARATOR}'\n")
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,3 @@
1
+ module ServerStatus
2
+ VERSION = '1.0'
3
+ end
@@ -0,0 +1,18 @@
1
+ require 'open3'
2
+ require 'commander'
3
+ require 'colorize'
4
+
5
+ require 'server-status/version'
6
+ require 'server-status/application'
7
+ require 'server-status/configuration'
8
+
9
+ require 'server-status/host_set'
10
+ require 'server-status/host'
11
+ require 'server-status/status_command'
12
+ require 'server-status/report'
13
+
14
+ require 'server-status/commands/base'
15
+ require 'server-status/commands/add'
16
+ require 'server-status/commands/list'
17
+ require 'server-status/commands/remove'
18
+ require 'server-status/commands/run'
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'server-status/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "server-status"
8
+ spec.version = ServerStatus::VERSION
9
+ spec.authors = ["James Brooks"]
10
+ spec.email = ["james@jamesbrooks.net"]
11
+
12
+ spec.summary = "Command line tool for quickly fetching and displaying vital host metrics"
13
+ spec.description = "Command line tool for quickly fetching and displaying vital host metrics"
14
+ spec.homepage = "https://github.com/jamesbrooks/server-status"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.executables = ["server-status"]
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "commander", "~> 4.3"
21
+ spec.add_dependency "colorize", "~> 0.7.7"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.11"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ end
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: server-status
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ platform: ruby
6
+ authors:
7
+ - James Brooks
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: commander
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: colorize
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.7.7
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.7.7
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.11'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.11'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ description: Command line tool for quickly fetching and displaying vital host metrics
70
+ email:
71
+ - james@jamesbrooks.net
72
+ executables:
73
+ - server-status
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - Gemfile
79
+ - LICENSE
80
+ - README.md
81
+ - Rakefile
82
+ - bin/console
83
+ - bin/server-status
84
+ - lib/server-status.rb
85
+ - lib/server-status/application.rb
86
+ - lib/server-status/commands/add.rb
87
+ - lib/server-status/commands/base.rb
88
+ - lib/server-status/commands/list.rb
89
+ - lib/server-status/commands/remove.rb
90
+ - lib/server-status/commands/run.rb
91
+ - lib/server-status/configuration.rb
92
+ - lib/server-status/host.rb
93
+ - lib/server-status/host_set.rb
94
+ - lib/server-status/report.rb
95
+ - lib/server-status/status_command.rb
96
+ - lib/server-status/version.rb
97
+ - server-status.gemspec
98
+ homepage: https://github.com/jamesbrooks/server-status
99
+ licenses: []
100
+ metadata: {}
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 2.5.1
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: Command line tool for quickly fetching and displaying vital host metrics
121
+ test_files: []