Class: MysqlHealth::CommandLine

Inherits:
Object
  • Object
show all
Defined in:
lib/mysql_health/command_line.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeCommandLine

Returns a new instance of CommandLine.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/mysql_health/command_line.rb', line 46

def initialize
  @options = {}
  @options[:server] = {}
  @options[:check] = {}
  @options[:log] = {}

  begin
    @optparse = OptionParser.new do |opts|
      opts.banner = "Usage: #{$0} options"
      #
      # Health check
      #
      @options[:check][:master] = false
      opts.on( '--check:master', 'Master health check') do
        @options[:check][:master] = true
      end

      @options[:check][:slave] = false
      opts.on( '--check:slave', 'Slave health check') do |host|
        @options[:check][:slave] = true
      end

      @options[:check][:database] = nil
      opts.on( '--check:database NAME', 'Ensure that database exists') do |name|
        @options[:check][:database] = name
      end

      @options[:check][:allow_overlapping] = false
      opts.on( '--check:allow-overlapping', "Allow overlapping health checks (default: #{@options[:check][:allow_overlapping]})") do
        @options[:check][:allow_overlapping] = true
      end

      @options[:check][:allow_master] = false
      opts.on( '--check:allow-master', "Allow master to act as slave when --check:slave is used (default: #{@options[:check][:allow_master]})") do
        @options[:check][:allow_master] = true
      end

      @options[:check][:interval] = '10s'
      opts.on( '--check:interval INTERVAL', "Check health every INTERVAL (default: #{@options[:check][:interval]})") do |interval|
        @options[:check][:interval] = interval.to_s
      end

      @options[:check][:delay] = '0s'
      opts.on( '--check:delay DELAY', "Delay health checks for INTERVAL (default: #{@options[:check][:delay]})") do |delay|
        @options[:check][:delay] = delay.to_s
      end

      @options[:check][:dsn] ||= "DBI:Mysql:mysql:localhost"
      opts.on( '--check:dsn DSN', "MySQL DSN (default: #{@options[:check][:dsn]})") do |dsn|
        @options[:check][:dsn] = dsn.to_s
      end

      @options[:check][:username] ||= "root"
      opts.on( '--check:username USERNAME', "MySQL Username (default: #{@options[:check][:username]})") do |username|
        @options[:check][:username] = username.to_s
      end

      @options[:check][:password] ||= ""
      opts.on( '--check:password PASSWORD', "MySQL Password (default: #{@options[:check][:password]})") do |password|
        @options[:check][:password] = password.to_s
      end

      # Server
      @options[:server][:listen] = '0.0.0.0'
      opts.on( '-l', '--server:listen ADDR', "Server listen address (default: #{@options[:server][:listen]})") do |addr|
        @options[:server][:addr] = addr.to_s
      end

      @options[:server][:port] = 3305
      opts.on( '-p', '--server:port PORT', "Server listen port (default: #{@options[:server][:port]})") do |port|
        @options[:server][:port] = port.to_i
      end

      @options[:server][:daemonize] = false
      opts.on( '-d', '--server:daemonize', "Daemonize the process (default: #{@options[:server][:daemonize]})") do
        @options[:server][:daemonize] = true
      end

      @options[:server][:pid_file] = false
      opts.on('-P', '--server:pid-file PID-FILE', "Pid-File to save the process id (default: #{@options[:server][:pid_file]})") do |pid_file|
        @options[:server][:pid_file] = pid_file
      end
 

      #
      # Logging
      #

      @options[:log][:level] = Logger::INFO
      opts.on( '--log:level LEVEL', 'Logging level (default: INFO)' ) do|level|
        @options[:log][:level] = Logger.const_get level.upcase
      end

      @options[:log][:file] = STDERR
      opts.on( '--log:file FILE', 'Write logs to FILE (default: STDERR)' ) do|file|
        @options[:log][:file] = File.open(file, File::WRONLY | File::APPEND | File::CREAT)
      end

      @options[:log][:age] = 7
      opts.on( '--log:age DAYS', "Rotate logs after DAYS pass (default: #{@options[:log][:age]})" ) do|days|
        @options[:log][:age] = days.to_i
      end

      @options[:log][:size] = 1024*1024*10
      opts.on( '--log:size SIZE', "Rotate logs after the grow past SIZE bytes (default: #{@options[:log][:size]})" ) do |size|
        @options[:log][:size] = size.to_i
      end
    end
    @optparse.parse!

    raise ArgumentException.new("No action specified") if @options[:check][:master] == false && @options[:check][:slave] == false
    @log = Logger.new(@options[:log][:file], @options[:log][:age], @options[:log][:size])
    @log.level = @options[:log][:level]

  rescue ArgumentException => e
    puts e.message
    puts @optparse
    exit 1
  end
end

Instance Attribute Details

#optionsObject

Returns the value of attribute options.



45
46
47
# File 'lib/mysql_health/command_line.rb', line 45

def options
  @options
end

Instance Method Details

#daemonizeObject



167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/mysql_health/command_line.rb', line 167

def daemonize
  # Become a daemon
  if RUBY_VERSION < "1.9"
    exit if fork
    Process.setsid
    exit if fork
    Dir.chdir "/" 
    STDIN.reopen "/dev/null"
    STDOUT.reopen "/dev/null", "a" 
    STDERR.reopen "/dev/null", "a" 
  else
    Process.daemon
  end 
end

#executeObject



193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# File 'lib/mysql_health/command_line.rb', line 193

def execute
  begin
    daemonize if @options[:server][:daemonize]
    write_pid_file if @options[:server][:pid_file]

    MysqlHealth.log = @log
    MysqlHealth.health = Health.new(@options[:check])

    ::EM.run do
      ::EM.start_server @options[:server][:listen], @options[:server][:port], Server
    end
    remove_pid_file()
  rescue ArgumentException => e
    remove_pid_file()
    @log.fatal(e.message)
  rescue Interrupt => e
    remove_pid_file()
    @log.info("exiting...")
  rescue Exception => e
    remove_pid_file()
    @log.fatal(e.message + e.backtrace.join("\n"))
  end
end

#remove_pid_fileObject



189
190
191
# File 'lib/mysql_health/command_line.rb', line 189

def remove_pid_file
  File.unlink(@options[:server][:pid_file]) if @options[:server][:pid_file] && File.exists?(@options[:server][:pid_file])
end

#write_pid_fileObject



182
183
184
185
186
187
# File 'lib/mysql_health/command_line.rb', line 182

def write_pid_file
  @log.debug("writing pid file #{@options[:server][:pid_file]}")
  File.open(@options[:server][:pid_file], 'w') do |f| 
    f.write(Process.pid)
  end
end