aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/mauve/sender.rb79
1 files changed, 64 insertions, 15 deletions
diff --git a/lib/mauve/sender.rb b/lib/mauve/sender.rb
index c84dcb0..054313e 100644
--- a/lib/mauve/sender.rb
+++ b/lib/mauve/sender.rb
@@ -1,8 +1,21 @@
# encoding: UTF-8
require 'ipaddr'
require 'socket'
+begin
+ require 'locale'
+rescue LoadError
+ # Do nothing -- these are bonus libraries :)
+end
+
+begin
+ require 'iconv'
+rescue LoadError
+ # Do nothing -- these are bonus libraries :)
+end
+
require 'mauve/mauve_resolv'
require 'mauve/mauve_time'
+require 'mauve/proto'
module Mauve
#
@@ -129,32 +142,68 @@ module Mauve
end
- # Send an update.
- #
- # @param [Mauve::Proto] update The update to send
- # @param [Integer] vebose The verbosity -- higher is more.
+ # Sanitise all fields in an update, such that when we send, they are
+ # normal.
+ #
#
- # @return [Integer] the number of packets sent.
- def send(update, verbose=0)
-
+ def sanitize(update)
#
# Must have a source, so default to hostname if user doesn't care
update.source ||= Socket.gethostname
-
+
+ #
+ # Check the locale charset. This is to maximise the amout of information
+ # mauve receives, rather than provide proper sanitised data for the server.
+ #
+ from_charset = (Locale.current.charset || Locale.charset) if defined?(Locale)
+ from_charset ||= "UTF-8"
+
#
- # Make sure all alerts default to "-r now"
+ #
#
+ update.each_field do |field, value|
+ #
+ # Make sure all string fields are UTF8 -- to ensure the maximal amount of information is sent.
+ #
+ update.__send__("#{field.name}=", Iconv.conv("UTF-8//IGNORE", from_charset, value)) if value.is_a?(String) and defined?(Iconv)
+ end
+
update.alert.each do |alert|
- next if alert.raise_time || alert.clear_time
- alert.raise_time = Time.now.to_i
+ #
+ # Make sure all alerts default to "-r now"
+ #
+ alert.raise_time = Time.now.to_i unless (alert.raise_time > 0 or alert.clear_time > 0)
+
+ alert.each_field do |field, value|
+ #
+ # Make sure all string fields are UTF8 -- to ensure the maximal amount of information is sent.
+ #
+ alert.__send__("#{field.name}=", Iconv.conv("UTF-8//IGNORE", from_charset, value)) if value.is_a?(String) and defined?(Iconv)
+ end
end
-
+
+ #
+ # Make sure we set the transmission time and ID.
+ #
+ update.transmission_time = Time.now.to_i if update.transmission_time.nil? or update.transmission_time == 0
+ update.transmission_id = rand(2**63) if update.transmission_id.nil? or update.transmission_id == 0
+
+ update
+ end
+
+ # Send an update.
+ #
+ # @param [Mauve::Proto] update The update to send
+ # @param [Integer] vebose The verbosity -- higher is more.
+ #
+ # @return [Integer] the number of packets sent.
+ def send(update, verbose=0)
#
- # Make sure we set the transmission time
+ # Clean up the update, and set any missing fields.
#
- update.transmission_time = Time.now.to_i
+ update = sanitise(update)
- data = update.serialize_to_string
+ data = sanitize(update).serialize_to_string
if verbose == 1
summary = "#{update.transmission_id} from #{update.source}"