Class: ScoutAgent::Assignment::Queue

Inherits:
ScoutAgent::Assignment show all
Defined in:
lib/scout_agent/assignment/queue.rb

Constant Summary collapse

ERRORS =
[ [ :missing_db,
"Queue database could not be loaded." ],
                 [ :missing_id,
"You must pass a mission ID or delivery type." ],
                 [ :invalid_id,
"You must pass a mission ID or " +
"'report', 'hint', 'alert', or 'error'." ],
                 [ :missing_fields,
"You must provide fields to queue." ],
                 [ :invalid_fields,
"You must pass valid JSON for the fields." ],
                 [ :invalid_report_fields,
"Field data must be a Hash to pass to the server." ],
                 [ :missing_plugin_id_field,
"A plugin_id field is required by the server." ],
                 [ :invalid_plugin_id_field,
"The plugin_id field must be a positive integer." ],
                 [ :failed_to_queue_message,
"Your message could not be queued at this time." ] ]

Instance Attribute Summary

Attributes inherited from ScoutAgent::Assignment

#group, #other_args, #switches, #user

Instance Method Summary collapse

Methods inherited from ScoutAgent::Assignment

#initialize, #prepare_and_execute

Methods included from Tracked

#clear_status, #force_status_database_reload, #status, #status_database, #status_log

Constructor Details

This class inherits a constructor from ScoutAgent::Assignment

Instance Method Details

#executeObject



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/scout_agent/assignment/queue.rb', line 30

def execute
  log = ScoutAgent.prepare_wire_tap(:queue, :skip_stdout)

  status_database(log)
  status("Queuing message", :queue)
  at_my_exit do
    clear_status(:queue)
  end
  
  unless db = Database.load(:queue, log)
    abort_with_error(:missing_db)
  end
  
  log.info("Validating message for queuing.")
  unless id = Array(other_args).shift
    abort_with_error(:missing_id)
  end
  unless id =~ /\A(?:report|hint|alert|error|\d*[1-9])\z/
    abort_with_error(:invalid_id)
  end
  
  fields = ARGF.read unless ARGV.empty? and not $stdin.ready?
  if fields.nil? or fields.empty?
    abort_with_error(:missing_fields)
  end
  bytes = fields.size
  begin
    fields = JSON.parse(fields.to_s)
  rescue JSON::ParserError
    abort_with_error(:invalid_fields)
  end
  
  if %w[report hint alert error].include? id
    unless fields.is_a? Hash
      abort_with_error(:invalid_report_fields)
    end
    unless fields.include? "plugin_id"
      abort_with_error(:missing_plugin_id_field)
    end
    unless fields["plugin_id"].to_s =~ /\A\d*[1-9]\z/
      abort_with_error(:invalid_plugin_id_field)
    end
    log.info("Message is a valid #{id} (#{bytes} bytes).")
  else
    log.info("Message is valid (#{bytes} bytes).")
  end
  
  log.info("Queuing message.")
  unless db.enqueue(id, fields)
    abort_with_error(:failed_to_queue_message)
  end
  
  db.maintain
  
  log.info("Messages queued successfully.")
end