#!/usr/bin/env ruby # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # Program to check that certin services are running on a host # # Copyright (c) 2006 Eric Davis # Released under the MIT License # Details: http://dropbox.theadmin.org/bin/server_up/LICENSE.txt # # Last Revision: [2006/04/27] # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # require 'rubygems' require 'net/ping' require 'net/http' require 'net/smtp' require 'net/ftp' require 'time' def log_error(error) File.open(@log_file, 'a') do |log| log.puts Time.now.rfc2822.to_s + ": " + error end end def check_ping(host) if not Net::PingExternal.new(host).ping log_error("Error: #{host} is not responding to a ping") end end def check_mail(host, port=25, ehlo=host) begin Net::SMTP.start(host, port, ehlo) do |smtp| log_error("Mail Server down") unless smtp.started? end rescue SocketError => socket_error log_error("Error Connecting To SMTP: #{socket_error}") rescue TimeoutError => timeout_error log_error("SMTP connection timed out: #{timeout_error}") end end def check_web(host, file='/') begin Net::HTTP.start(host) do |http| response = http.get(file) if not response.code.match(/200/) log_error("Web Server down or not resonding: #{response.code} #{response.message}") end end rescue SocketError => socket_error log_error("Error Connecting To Web: #{socket_error}") rescue TimeoutError => timeout_error log_error("Web connection timed out: #{timeout_error}") end end def check_ftp(host, login, password) begin Net::FTP.open(host) do |ftp| log_error("FTP Server down or not responding #{ftp.last_response_code}") unless ftp.last_response_code.match(/220/) if password.empty? ftp.login(login) else ftp.login(login, password) end end rescue Net::FTPPermError => login_error log_error("FTP Server not allowing logins for '#{login}' using '#{password}': #{login_error}") rescue SocketError => socket_error log_error("Error Connecting To FTP: #{socket_error}") rescue TimeoutError => timeout_error log_error("FTP connection timed out: #{timeout_error}") end end ftp_user = ARGV[1] || 'guest' ftp_password = ARGV[2] || 'guest' @log_file = ARGV[3] || '/tmp/server_up.log' check_ping(ARGV[0]) check_mail(ARGV[0]) check_web(ARGV[0]) check_ftp(ARGV[0], ftp_user, ftp_password)