------ art_40394_14943809.1132597680814 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Thanks a lot to all for your imput. different ways to work with are always good for learning ruby the practical way. Best wishes, Torsten ---------- Forwarded message ---------- From: Ara.T.Howard <ara.t.howard / noaa.gov> Date: 21.11.2005 16:57 Subject: Re: url-monitoring script question To: ruby-talk ML <ruby-talk / ruby-lang.org> On Mon, 21 Nov 2005, Torsten Schmidt wrote: > Hi @all, > > i made a script, that monitors some web-sites of our company using net::http > and net::smtp. > > it pings multiple sites and it's based on this script: > http://habtm.com/articles/2005/09/29/website-monitoring-script > > every time an error occures, an email ist sent. > i want to do this every 5 min as a cron-job. > > Is there a way to limit the email-notification, that for example only 3 > emails with the same error are delivered? > > i would like to prevent my mailbox being filled up, when one site is down > for the whole night or so > as it can be done with nagios. > > one problem is, that the script has no 'history' information to recognize, > how many notifications have been sent already. > > any suggestion how that can be done? here's mine - it mails only 3 times. it's ugly, but functional: harp:~ > cat bin/uriup.rb #! /home/ahoward/bin/ruby # # simple script to monitor uris # # sample cron line # # */5 * * * * /usr/local/ruby-1.8.0/bin/ruby /full/path/to/this/script > /dev/null 2>&1 # require "net/http" require "net/smtp" require "yaml/store" require "socket" # # array of urls to ping # uris = %w( www.codeforpeople.com <http://www.codeforpeople.com> sciruby.codeforpeople.com <http://sciruby.codeforpeople.com> www.zstone.net <http://www.zstone.net> www.ithmezipper.net <http://www.ithmezipper.net> ) # # array of people to notify if urls are down # recipients = %w( ara.t.howard / noaa.gov ) # # message format string # msg_fmt = %Q( URI: %s TIME: %s EXCEPTION: %s\n%s ) # # user to send messages as # user = ENV["USER"] || "ahoward" # # host to send messages from # host = ENV["HOSTNAME"] || ENV["HOST"] || Socket::gethostname # # maximum number of messages to send # msg_max = 3 # # db class to store codes/notifications # class DB attr "path" attr "db" def initialize path = File::join(File::expand_path("~"), ".uri.db") @path = path @db = ::YAML::Store::new @path end def reset uri @db.transaction{ @db[uri] = {"success" => true, "msgs" => 0} } end def [] uri @db.transaction{ @db[uri] } || reset(uri) end def []= uri, record @db.transaction{ @db[uri] = record } end end # # umbrella error class # class SiteDownError < StandardError; end # # ping each url, mail messages if failure for any reason... # db = DB::new uris.each do |uri| begin raise SiteDownError unless Net::HTTPOK === Net::HTTP::new(uri, 80).get("/") y uri => "up" db.reset uri rescue Exception => e y uri => "down" record = db[uri] if record["msgs"] < msg_max now = Time::now msg = msg_fmt % [uri, now, e, e.backtrace.join("\n").gsub(%r/^/,"\t")] from = "%s@%s" % [user, host] Net::SMTP::start("localhost") do |smtp| recipients.each do |recipient| email = "From: #{ from }\r\n" << "To: #{ recipient }\r\n" << "Subject: #{ uri } DOWN @ #{ now }\r\n" << "\r\n#{ msg }" smtp.send_message email, from, recipient end end record["success"] = false record["msgs"] += 1 db[uri] = record end end end the database files looks like this: harp:~ > cat ~/.uri.db --- www.codeforpeople.com <http://www.codeforpeople.com>: success: true msgs: 0 www.ithmezipper.net <http://www.ithmezipper.net>: msgs: 0 success: true sciruby.codeforpeople.com <http://sciruby.codeforpeople.com>: msgs: 0 success: true www.zstone.net <http://www.zstone.net>: success: true msgs: 0 using YAML::Store eliminates the need to roll-your-own. regards. -a -- =============================================================================== | ara [dot] t [dot] howard [at] gmail [dot] com | all happiness comes from the desire for others to be happy. all misery | comes from the desire for oneself to be happy. | -- bodhicaryavatara =============================================================================== ------ art_40394_14943809.1132597680814--