dbtop 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.bnsignore ADDED
@@ -0,0 +1,18 @@
1
+ # The list of files that should be ignored by Mr Bones.
2
+ # Lines that start with '#' are comments.
3
+ #
4
+ # A .gitignore file can be used instead by setting it as the ignore
5
+ # file in your Rakefile:
6
+ #
7
+ # Bones {
8
+ # ignore_file '.gitignore'
9
+ # }
10
+ #
11
+ # For a project with a C extension, the following would be a good set of
12
+ # exclude patterns (uncomment them if you want to use them):
13
+ # *.[oa]
14
+ # *~
15
+ announcement.txt
16
+ coverage
17
+ doc
18
+ pkg
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org"
2
+ gem "terminal-table"
data/Gemfile.lock ADDED
@@ -0,0 +1,10 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ terminal-table (1.4.5)
5
+
6
+ PLATFORMS
7
+ ruby
8
+
9
+ DEPENDENCIES
10
+ terminal-table
data/History.txt ADDED
@@ -0,0 +1,4 @@
1
+ == 1.0.0 / 2012-05-24
2
+
3
+ * 1 major enhancement
4
+ * Birthday!
data/README.md ADDED
@@ -0,0 +1,104 @@
1
+ dbtop
2
+ ===========
3
+
4
+ Similar to the Unix 'top' tool, this Ruby gem will provide process
5
+ monitoring for your MySQL database instance.
6
+
7
+ By using command line arguments or environmental variables, dbtop will
8
+ connect to your db and return your current process list (minus Sleep
9
+ processes) on screen, in a terminal Curses buffer.
10
+
11
+ By default, the port used will be 3306 unless the environment
12
+ variable for MYSQL_PORT is specified.
13
+
14
+ Features
15
+ --------
16
+
17
+ Easy out-of-the-box connectivity to your database if you use
18
+ environmental variables.
19
+
20
+ Won't make a mess of your terminal (drawn to a Curses buffer).
21
+
22
+ Examples
23
+ --------
24
+
25
+ If you don't have environmental variables set for your MySQL database,
26
+ run dbtop with command line arguments:
27
+
28
+ ```bash
29
+ ruby dbtop.rb -u #{user} -p #{pass} -h #{host} -d #{database} -i 1
30
+ ```
31
+
32
+ If you have environmental variables set for your MySQL database already,
33
+ just run dbtop :)
34
+
35
+ ```bash
36
+ ruby dbtop.rb
37
+ ```
38
+
39
+ ```bash
40
+ ruby dbtop.rb -i 1
41
+ ```
42
+
43
+ Note: You can quit the application by pressing 'q'
44
+
45
+ Requirements
46
+ ------------
47
+
48
+ Ruby 1.9.2+
49
+
50
+ If you're using ENV variables:
51
+
52
+ MYSQL_USER
53
+ MYSQL_PASSWORD
54
+ MYSQL_HOST
55
+ MYSQL_DATABASE
56
+ MYSQL_PORT
57
+
58
+ Install
59
+ -------
60
+
61
+ Install all required gems by running:
62
+
63
+ ```bash
64
+ bundle install
65
+ ```
66
+
67
+ Install the gem manually by running:
68
+
69
+ ```bash
70
+ rake gem:install
71
+ ```
72
+
73
+ in the application folder.
74
+
75
+ Author
76
+ ------
77
+
78
+ Original author: Alfred Moreno
79
+
80
+ License
81
+ -------
82
+
83
+ (The MIT License)
84
+
85
+ Copyright (c) 2012 Alfred Moreno
86
+
87
+ Permission is hereby granted, free of charge, to any person obtaining
88
+ a copy of this software and associated documentation files (the
89
+ 'Software'), to deal in the Software without restriction, including
90
+ without limitation the rights to use, copy, modify, merge, publish,
91
+ distribute, sublicense, and/or sell copies of the Software, and to
92
+ permit persons to whom the Software is furnished to do so, subject to
93
+ the following conditions:
94
+
95
+ The above copyright notice and this permission notice shall be
96
+ included in all copies or substantial portions of the Software.
97
+
98
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
99
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
100
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
101
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
102
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
103
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
104
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+
2
+ begin
3
+ require 'bones'
4
+ rescue LoadError
5
+ abort '### Please install the "bones" gem ###'
6
+ end
7
+
8
+ task :default => 'test:run'
9
+ task 'gem:release' => 'test:run'
10
+
11
+ Bones {
12
+ name 'dbtop'
13
+ authors 'Alfred Moreno'
14
+ email 'kryptek@kryptek.org'
15
+ url 'http://github.com/kryptek'
16
+ }
17
+
data/bin/dbtop ADDED
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env ruby
2
+ # ::::::::: :::::::::: ::: ::: :::::::: ::::::::: ::::::::
3
+ # :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+:
4
+ # +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+
5
+ # +#+ +:+ +#++:++# +#+ +:+ +#+ +:+ +#++:++#+ +#++:++#++
6
+ # +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+
7
+ # #+# #+# #+# #+#+#+# #+# #+# #+# #+# #+#
8
+ # ######### ########## ### ######## ### ########
9
+ #
10
+ # @ Zumba Fitness, LLC
11
+ # ------------------------------------------------------------------------------
12
+ # filename: dbtop.rb
13
+ # author: alfred.moreno@zumba.com
14
+ # purpose: Process monitor for MySQL Databases; ignores 'Sleep' processes.
15
+ # ------------------------------------------------------------------------------
16
+ require 'curses'
17
+ require 'terminal-table'
18
+ require 'optparse'
19
+ include Curses
20
+
21
+ class MysqlTop
22
+
23
+ #############################################################################
24
+ # Public: Initialize the MysqlTop class and screen buffer
25
+ #
26
+ # Returns: nothing
27
+ #############################################################################
28
+ def initialize(options)
29
+
30
+ @user = options[:user] || ENV['MYSQL_USER']
31
+ @pass = options[:pass] || ENV['MYSQL_PASSWORD']
32
+ @host = options[:host] || ENV['MYSQL_HOST']
33
+ @db = options[:db] || ENV['MYSQL_DATABASE']
34
+ @port = 3306 || ENV['MYSQL_PORT']
35
+ @interval = options[:interval] || 5
36
+ validate
37
+
38
+ tbl = Terminal::Table.new headings: [
39
+ 'Time',
40
+ 'User',
41
+ 'Host',
42
+ 'DB',
43
+ 'State',
44
+ 'Cmd'
45
+ ]
46
+
47
+ begin
48
+ Curses.timeout=0
49
+ loop do
50
+
51
+ case getch
52
+ when 'q'
53
+ exit
54
+ end
55
+
56
+ %x[mysql -A -u #@user -p#@pass -h #@host #@db -e "show processlist"].lines.each do |line|
57
+ next if line.include?('Sleep')
58
+
59
+ line = line.split(' ')
60
+
61
+ row = {
62
+ id: line[0],
63
+ user: line[1],
64
+ host: line[2],
65
+ db: line[3],
66
+ cmd: line[4],
67
+ time: line[5],
68
+ state: line[6],
69
+ info: line[7]
70
+ }
71
+ tbl << [line[5], line[1], line[2], line[3], line[6], line[4]]
72
+ end
73
+
74
+ write(0,0,tbl.to_s)
75
+ tbl.rows = tbl.rows.clear
76
+ sleep @interval
77
+
78
+ end
79
+ ensure
80
+ close_screen
81
+ end
82
+
83
+ end
84
+
85
+ #############################################################################
86
+ # Public: Validates that credentials for connecting to the DB are complete
87
+ #
88
+ # Returns: nothing
89
+ #############################################################################
90
+ def validate
91
+ [@user,@pass,@host,@db].each { |param|
92
+ raise "Insufficient parameters to connect to MySQL Database!" if param.nil?
93
+ }
94
+ end
95
+
96
+ #############################################################################
97
+ # Public: Initializes the screen buffer with specified options.
98
+ #
99
+ # Returns: nothing
100
+ #############################################################################
101
+ def init_screen
102
+ nl
103
+ Curses.noecho # Don't echo characters to the screen.
104
+ crmode
105
+ Curses.init_screen # Initialize the screen buffer.
106
+ Curses.start_color
107
+ #Curses.color_set(COLOR_GREEN)
108
+ Curses.stdscr.keypad(true) # Enable arrow keys.
109
+ Curses.doupdate
110
+ curs_set(0,0)
111
+ begin
112
+ yield
113
+ ensure
114
+ Curses.close_screen
115
+ end
116
+ end
117
+
118
+ #############################################################################
119
+ # Public: Writes text at a specific set of coordinates on your screen
120
+ #
121
+ # Returns: nothing
122
+ #############################################################################
123
+ def write(x,y,text)
124
+ Curses.setpos(x,y)
125
+ Curses.addstr(text)
126
+ for x in 1..Curses.lines
127
+ Curses.deleteln
128
+ end
129
+ Curses.setpos(text.lines.count-1,0)
130
+ Curses.addstr(text.lines.take(3)[2])
131
+ Curses.refresh
132
+ end
133
+
134
+ end
135
+
136
+ options = {}
137
+ opts = OptionParser.new do |opts|
138
+ opts.on('-u U', String, 'Database username') do |user|
139
+ options[:user] = user
140
+ end
141
+ opts.on('-p P', String, 'Database password') do |password|
142
+ options[:pass] = password
143
+ end
144
+ opts.on('-h H', String, 'Database hostname') do |hostname|
145
+ options[:host] = hostname
146
+ end
147
+ opts.on('-d D', String, 'Database to use') do |database|
148
+ options[:db] = database
149
+ end
150
+ opts.on('-i I', Integer, 'Integer for refresh') do |interval|
151
+ options[:interval] = interval
152
+ end
153
+ end
154
+ opts.parse!(ARGV)
155
+
156
+ mysqltop = MysqlTop.new(options)
157
+
data/lib/dbtop.rb ADDED
@@ -0,0 +1,60 @@
1
+
2
+ module Dbtop
3
+
4
+ # :stopdoc:
5
+ LIBPATH = ::File.expand_path('..', __FILE__) + ::File::SEPARATOR
6
+ PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
7
+ VERSION = ::File.read(PATH + 'version.txt').strip
8
+ # :startdoc:
9
+
10
+ # Returns the library path for the module. If any arguments are given,
11
+ # they will be joined to the end of the libray path using
12
+ # <tt>File.join</tt>.
13
+ #
14
+ def self.libpath( *args )
15
+ rv = args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
16
+ if block_given?
17
+ begin
18
+ $LOAD_PATH.unshift LIBPATH
19
+ rv = yield
20
+ ensure
21
+ $LOAD_PATH.shift
22
+ end
23
+ end
24
+ return rv
25
+ end
26
+
27
+ # Returns the lpath for the module. If any arguments are given,
28
+ # they will be joined to the end of the path using
29
+ # <tt>File.join</tt>.
30
+ #
31
+ def self.path( *args )
32
+ rv = args.empty? ? PATH : ::File.join(PATH, args.flatten)
33
+ if block_given?
34
+ begin
35
+ $LOAD_PATH.unshift PATH
36
+ rv = yield
37
+ ensure
38
+ $LOAD_PATH.shift
39
+ end
40
+ end
41
+ return rv
42
+ end
43
+
44
+ # Utility method used to require all files ending in .rb that lie in the
45
+ # directory below this file that has the same name as the filename passed
46
+ # in. Optionally, a specific _directory_ name can be passed in such that
47
+ # the _filename_ does not have to be equivalent to the directory.
48
+ #
49
+ def self.require_all_libs_relative_to( fname, dir = nil )
50
+ dir ||= ::File.basename(fname, '.*')
51
+ search_me = ::File.expand_path(
52
+ ::File.join(::File.dirname(fname), dir, '**', '*.rb'))
53
+
54
+ Dir.glob(search_me).sort.each {|rb| require rb}
55
+ end
56
+
57
+ end # module Dbtop
58
+
59
+ Dbtop.require_all_libs_relative_to(__FILE__)
60
+
@@ -0,0 +1,6 @@
1
+
2
+ require File.expand_path('../spec_helper', __FILE__)
3
+
4
+ describe Dbtop do
5
+ end
6
+
@@ -0,0 +1,17 @@
1
+
2
+ require 'rubygems'
3
+ require 'rspec'
4
+
5
+ require File.expand_path('../../lib/dbtop', __FILE__)
6
+
7
+ RSpec.configure do |config|
8
+ # == Mock Framework
9
+ #
10
+ # RSpec uses it's own mocking framework by default. If you prefer to
11
+ # use mocha, flexmock or RR, uncomment the appropriate line:
12
+ #
13
+ # config.mock_framework = :mocha
14
+ # config.mock_framework = :flexmock
15
+ # config.mock_framework = :rr
16
+ end
17
+
File without changes
data/version.txt ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dbtop
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Alfred Moreno
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-24 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bones
16
+ requirement: &70169320893340 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 3.8.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70169320893340
25
+ description: ! 'Similar to the Unix ''top'' tool, this Ruby gem will provide process
26
+
27
+ monitoring for your MySQL database instance.'
28
+ email: kryptek@kryptek.org
29
+ executables:
30
+ - dbtop
31
+ extensions: []
32
+ extra_rdoc_files:
33
+ - History.txt
34
+ - bin/dbtop
35
+ files:
36
+ - .bnsignore
37
+ - Gemfile
38
+ - Gemfile.lock
39
+ - History.txt
40
+ - README.md
41
+ - Rakefile
42
+ - bin/dbtop
43
+ - lib/dbtop.rb
44
+ - spec/dbtop_spec.rb
45
+ - spec/spec_helper.rb
46
+ - test/test_dbtop.rb
47
+ - version.txt
48
+ homepage: http://github.com/kryptek
49
+ licenses: []
50
+ post_install_message:
51
+ rdoc_options:
52
+ - --main
53
+ - README.md
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ requirements: []
69
+ rubyforge_project: dbtop
70
+ rubygems_version: 1.8.6
71
+ signing_key:
72
+ specification_version: 3
73
+ summary: Similar to the Unix 'top' tool, this Ruby gem will provide process monitoring
74
+ for your MySQL database instance.
75
+ test_files:
76
+ - test/test_dbtop.rb