diff options
Diffstat (limited to 'bin/mauveclient')
-rwxr-xr-x | bin/mauveclient | 329 |
1 files changed, 0 insertions, 329 deletions
diff --git a/bin/mauveclient b/bin/mauveclient deleted file mode 100755 index 77b8506..0000000 --- a/bin/mauveclient +++ /dev/null @@ -1,329 +0,0 @@ -#! /usr/bin/ruby1.8 -# NAME -# mauveclient - send alert(s) to a given alert station -# -# SYNOPSIS -# mauveclient [<destination>] -# [ --help | -h ] [ --manual | -m ] [ --version | -V ] -# [--source | -o <source>] [--replace | -p] [--verbose | -v] -# [--id <alertid> ... ] -# -# OPTIONS -# <destination> Where the alert should go. This can be either a hostname or -# an IP address, and optionally a port, separated by a colon. -# The default port is 32741. -# -# If no destination is supplied, the value from the file -# /etc/mauvealert/mauveclient.destination is used. If no -# destination can be determined, an error is raised. -# -# If a hostname is given and no port is specified, SRV records -# are used to determine where the alerts should go to. The SRV -# prefix is _mauvealert._udp. If no SRV records are found, A -# records are used instead. -# -# IPv6 addresses can be used, but must be enclosed in square -# brackets, e.g. [2001:41c8::12]. -# -# --source, -o <source> identify the source of the alert (defaults to -# hostname, but you might want to name your monitoring -# systems more explicitly). -# -# --replace, -p Send an update replacing all other alerts for this -# source -- any previous alerts not specified in this -# update are assumed to be cleared. If you specify this -# option, you don't have to supply *any* alerts to raise -# or clear (in which case all alerts from that source -# will be cleared). -# -# --verbose, -v If you specify this option once, it will print the -# transmission ID of the packet for debugging. If you -# specify it twice, it will print the entire data -# structure. -# -# --help, -h Display a short help message, and exit. -# -# --manual, -m Display this manual, and exit. -# -# --version, -V Display the version number for Mauve and exit. -# -# You can specify any number of alerts in an update - every time you specify -# --id starts a new alert. -# -# --id, -i <alertid> Unique specified for each alert raised. This should -# be unique on a per-source basis, i.e. for an -# individual application or host. -# -# --summary, -s <summary> Text for humans describing the nature of the alert, -# first 100 characters are only ones guaranteed to make -# it to pagers, twitter, SMS etc. -# -# --detail, -d <detail> HTML fragment describing the alert in more detail, -# no limit on length. -# -# --subject, -u <subject> Set the subject of the alert (i.e. the server/entity -# that this alert concerns). If no subject is -# specified, it is assumed to be the same as <source>, -# detailed above. -# -# --raise, -r <time> Mark the alert to be (re)raised at the given time. -# If no time is supplied, "now" is assumed. See -# SPECIFYING TIMES below for the format of <time>. -# -# --clear, -c <time> Mark the alert to be cleared at the given time. If -# no time is specified, "now" is assumed. See -# SPECIFYING TIMES below for the format of <time>. -# -# SPECIFYING TIMES -# -# Times can be specified for an alert to be raised or cleared. This can be -# specified as any time in the past or future. The format is + or -, followed -# by a number, followed by a letter determining the units, one of s, m, h, d, -# representing seconds, minutes, hours, and days, respectively. If no units are -# specified, seconds is assumed. If no sign is specified, "+" is assumed. -# -# Some example times are: -# -# now Immediately -# 10 In 10 seconds time -# +10m In 10 minutes time -# -10h 10 Hours ago -# -# SENISBLE USAGE -# -# Mauve uses UDP to transmit data, which means that there is no guarrantee a -# single packet will reach the server. Therefore: -# -# * The host/application should send "raise" notification regularly until the -# alert clears, whereupon it should regularly send "cleared" notifications. -# -# * When setting a heartbeat-type alert, make sure that the raise time is more -# than double the period of the "clear" notifications. For example, if the -# host is sending a clear every 120 seconds, the raise time should be -# greater than 240 seconds, preferably greater than 360 seconds to allow for -# packets going missing, reducing the likelihood of false alerts. -# -# Try to convey salient details about the alerts in the relevant fields. A -# typical short alert from Mauve might read -# -# RAISED: <subject>: <summary> -- <source> -# -# Make sure that the alert will be understood with just those three fields -# displayed. -# -# * Keep the summary brief and salient. -# -# * Keep the summary constant, unless there has been a material change to the -# nature of the alert. Mauve may re-send any messages when the subject -# changes. If something is changing quickly, like load averages, best not -# to put them in the summary. -# -# * Make sure that the subject is set correctly. Remember if no subject is -# set, then the source of the alert is used instead. -# -# * Make sure that the source is correct too -- nothing worse than an alert -# that comes in with an ambiguous origin. -# -# * The alert ID is used internally by Mauve to keep alerts consistent. This -# must be unique on a per-source basis. It is OK to have many alerts with the -# ID "heartbeat" as long as the source of the alert is different in each case. -# -# The raise and clear times can be specified, if needed, but generally leaving -# them empty, i.e. setting them to "now" is sufficient. Mauve remembers when -# an alert is first raised. -# -# EXAMPLES -# -# To raise an alert: -# -# mauveclient -s smtp-out-1.example.com -i mailqueue \\ -# -d "Mail queue has <b>54232</b> messages in it. That's <em>LOADS</em>" \\ -# -u "Mail queue too big on outgoing SMTP server" -r -# -# To clear an alert: -# -# mauveclient -s smtp-out-1.example.com -i mailqueue -c -# -# To create a "heartbeat" alert, i.e. one that says "Currently OK, but raise in the future if nothing more is heard": -# -# mauveclient -i heartbeat -d "No heartbeat received for 1.2.3.4. Could be down!" -s "heartbeat failed" -c -r +10m -# -# SEE ALSO -# -# mauveconsole(1), mauveserver(1) -# -# AUTHOR -# -# Patrick J Cherry <patrick@bytemark.co.uk> -# - -require 'getoptlong' - -%w(sender mauve_time version proto).each do |r| - begin - require "mauve/#{r}" - rescue LoadError => ex - puts ex.to_s - end -end - -NOW = Mauve::MauveTime.now - -def error(msg) - STDERR.print "*** Error: #{msg}\n" - STDERR.print "*** For help, type: #{$0} -h\n" - exit 1 -end - -def parse_time_spec(spec = "now") - # - # Default to now - # - spec = "now" if spec.empty? - - case spec - when "now" - NOW - - when /^(\+|-)?(\d+)([smhd])?$/ - if $1 == "-" - multiplier = -1 - else - multiplier = 1 - end - - multiplier *= case $3 - when "m" then 60 - when "h" then 3600 - when "d" then 86400 - else - 1 - end - - NOW + $2.to_i * multiplier - - else - raise ArgumentError, "Unrecognised time format #{spec.inspect}" - - end -end - -begin - begin - update = Mauve::Proto::AlertUpdate.new - update.replace = false - update.alert = [] - rescue NameError - # - # Do nothing .. When generating manpages in the build process we don't need - # to have Protobuf available. - # - update = nil - end - message = nil - verbose = 0 - help = false - manual = false - version = false - - opts = GetoptLong.new( - ['-h', '--help', GetoptLong::NO_ARGUMENT], - ['-m', '--manual', GetoptLong::NO_ARGUMENT], - ['-V', '--version', GetoptLong::NO_ARGUMENT], - ['-o', '--source', GetoptLong::OPTIONAL_ARGUMENT], - ['-p', '--replace', GetoptLong::NO_ARGUMENT], - ['-i', '--id', GetoptLong::OPTIONAL_ARGUMENT], - ['-s', '--summary', GetoptLong::OPTIONAL_ARGUMENT], - ['-u', '--subject', GetoptLong::OPTIONAL_ARGUMENT], - ['-c', '--clear', GetoptLong::OPTIONAL_ARGUMENT], - ['-r', '--raise', GetoptLong::OPTIONAL_ARGUMENT], - ['-d', '--detail', GetoptLong::OPTIONAL_ARGUMENT], - ['-v', '--verbose', GetoptLong::NO_ARGUMENT] - ).each do |opt,arg| - - # - # Can catch empty arguments better if we set the GetoptLong things to - # "optional" rather than "required" and catch the empty arg here. - error "#{opt} cannot be empty" if arg.empty? and not %w(-h -m -V -p -v -c -r).include?(opt) - - case opt - when '-h' - help = true - when '-m' - manual = true - when '-V' - version = true - when '-p' - error "Cannot send update -- not all libraries are available" if update.nil? - update.replace = true - when '-i' - error "Cannot send update -- not all libraries are available" if update.nil? - error "Cannot specify the same ID twice in one update -- ID #{arg}" if update.alert.any?{|a| a.id == arg} - message = Mauve::Proto::Alert.new - message.id = arg - update.alert << message - when '-o' - error "Cannot send update -- not all libraries are available" if update.nil? - error "Can only specify one source" if update.source - update.source = arg - when '-v' - verbose += 1 - else - error "Cannot send update -- not all libraries are available" if update.nil? - error "Must specify --id before message" unless message - case opt - when '-s' then message.summary = arg - when '-u' then message.subject = arg - when '-d' then message.detail = arg - when '-c' then message.clear_time = parse_time_spec(arg).to_i - when '-r' then message.raise_time = parse_time_spec(arg).to_i - else - error "Unknown option #{opt}" - end - end - end - - # CAUTION! Kwality kode. - # - if manual or help - # Open the file, stripping the shebang line - lines = File.open(__FILE__){|fh| fh.readlines}[1..-1] - - found_synopsis = false - - lines.each do |line| - - line.chomp! - break if line.empty? - - if help and !found_synopsis - found_synopsis = (line =~ /^#\s+SYNOPSIS\s*$/) - next - end - - puts line[2..-1].to_s - - break if help and found_synopsis and line =~ /^#\s*$/ - - end - end - - puts "#{$0}: version "+Mauve::VERSION if version - - exit 0 if help or version or manual - - error "Cannot send update -- not all libraries are available" if update.nil? - error "No alerts specified" unless !update.alert.empty? || update.replace - - update.transmission_id = rand(2**63) - - Mauve::Sender.new(ARGV).send(update, verbose) - -rescue ArgumentError => ae - error ae.message - -rescue StandardError => ae - error ae.message - -end - |