If you came here because of the title, chances are your server isn't down. But if by some miraculous reason it is:
A while ago, I posted a program that would ssh and ping all the servers at work. I got some very good feedback and went ahead and rolled with it.
Here's what I came up with:
- It now is much more readable, in my opinion
- Pings the servers after SSHing into them
- Then if it finds one of the servers to be offline, or errors out connecting, writes data to a
.txt
file containing the server name, and the user who deployed the program.
I of course will be leaving some information off due to security.
Source code:
#!/usr/local/bin/ruby
require 'rubygems'
require 'net/ssh/gateway'
require 'work/mail/gem'
require 'etc'
def mail_error(e)
x = AD::Mail.new
x.from = "[email protected]"
x.to = "[email protected]"
x.subject = "Server Loading Error"
x.body = e.message
x.send
end
def scanning_all_servers(server)
begin
check = Net::SSH.start(server, @username, :password => @password)
cmd = "ping -c 1 #{server}"
check.exec!(cmd)
rescue => e
mail_error(e)
:error
write_data(server)
end
end
def server_status(server)
result = scanning_all_servers(server)
message_server_online = /1 received, 0% packet loss/i
message_server_offline = Regexp.union('0 recieved, +1 errors', 'Connection closed')
result =~ message_server_online ? :online :
result =~ message_server_offline ? :offline : :error
end
def status_message(server, status)
status == :online ? "server online: #{server}" :
status == :offline ? "[#{Time.now}] SERVER OFFLINE: #{server}" :
"[#{Time.now}] Error loading server: #{server}."
end
def write_data(server)
x = "[#{Time.now}]: Server: #{server} down. Checked by #{@username}. ------------"
if File.exist?("path/to/log")
File.open("path/to/log", "a+"){ |s| s.write(x) }
else
new_file = File.new("path/to/log", "w")
new_file.puts(x)
new_file.close
end
end
@username = Etc.getlogin
@password = nil
server_list = %w(all of our servers)
server_list.each do |server|
status = server_status(server)
puts status_message(server, status)
end
Example of usage:
server online: server server online: server SERVER OFFLINE: server server online: server server online: server server online: server server online: server server online: server Error loading server: server server online: server server online: server server online: server server online: server server online: server server online: server server online: server server online: server server online: server server online: server server online: server
Example of log:
[2015-12-14 06:11:41 -0600]: Server: server down. Checked by user. ------------
[2015-12-14 06:11:45 -0600]: Server: server down. Checked by user. ------------
What I would like to know:
- Is there any better ways to write data to files?
- Is there also more readable syntax to use here?