55require "socket" # for Socket.gethostname
66require "manticore"
77require "rufus/scheduler"
8+ require "yaml" # persistence
89
910class LogStash ::Inputs ::HTTP_Poller < LogStash ::Inputs ::Base
1011 include LogStash ::PluginMixins ::HttpClient
@@ -57,10 +58,15 @@ def setup_requests!
5758 @requests = Hash [ @urls . map { |name , url | [ name , normalize_request ( url ) ] } ]
5859 end
5960
61+ private
62+ def filter_dynamic_params ( allowed_keys , params )
63+ params . slice ( *allowed_keys )
64+ end
65+
6066 private
6167 def normalize_request ( url_or_spec )
6268 if url_or_spec . is_a? ( String )
63- res = [ :get , url_or_spec ]
69+ res = [ :get , url_or_spec , { } ]
6470 elsif url_or_spec . is_a? ( Hash )
6571 # The client will expect keys / values
6672 spec = Hash [ url_or_spec . clone . map { |k , v | [ k . to_sym , v ] } ] # symbolize keys
@@ -77,17 +83,29 @@ def normalize_request(url_or_spec)
7783 auth = spec [ :auth ]
7884 user = spec . delete ( :user ) || ( auth && auth [ "user" ] )
7985 password = spec . delete ( :password ) || ( auth && auth [ "password" ] )
80-
86+
8187 if user . nil? ^ password . nil?
8288 raise LogStash ::ConfigurationError , "'user' and 'password' must both be specified for input HTTP poller!"
8389 end
8490
8591 if user && password
8692 spec [ :auth ] = {
87- user : user ,
93+ user : user ,
8894 pass : password ,
8995 eager : true
90- }
96+ }
97+
98+ if spec . delete ( :use_dynamic_params )
99+ last_dynamic_params_location = spec [ :last_dynamic_params ]
100+ dynamic_params_map = spec [ :dynamic_params_map ]
101+
102+ if last_dynamic_params_location . is_a? ( String ) && File . exist? ( last_dynamic_params_location )
103+ dynamic_params = YAML . load ( File . read ( last_dynamic_params_location ) )
104+ allowed_keys = dynamic_params_map . is_a? ( Hash ) ? dynamic_params_map . keys : [ ]
105+ spec [ :dynamic_params ] = filter_dynamic_params ( allowed_keys , dynamic_params )
106+ else
107+ spec [ :dynamic_params ] = { }
108+ end
91109 end
92110 res = [ method , url , spec ]
93111 else
@@ -133,13 +151,23 @@ def setup_schedule(queue)
133151
134152 @scheduler = Rufus ::Scheduler . new ( :max_work_threads => 1 )
135153 #as of v3.0.9, :first_in => :now doesn't work. Use the following workaround instead
136- opts = schedule_type == "every" ? { :first_in => 0.01 } : { }
154+ opts = schedule_type == "every" ? { :first_in => 0.01 } : { }
137155 @scheduler . send ( schedule_type , schedule_value , opts ) { run_once ( queue ) }
138156 @scheduler . join
139157 end
140158
159+ private
160+ def assign_dynamic_params ( request )
161+ params = request [ 2 ] [ :dynamic_params ]
162+ request [ 2 ] [ :query ] = { } if !request [ 2 ] [ :query ]
163+ params . keys . each do |key |
164+ request [ 2 ] [ :query ] [ key ] = params [ key ]
165+ end
166+ end
167+
141168 def run_once ( queue )
142169 @requests . each do |name , request |
170+ assign_dynamic_params ( request ) if request [ 2 ] [ :dynamic_params ]
143171 request_async ( queue , name , request )
144172 end
145173
@@ -175,11 +203,23 @@ def handle_success(queue, name, request, response, execution_time)
175203 end
176204 end
177205
206+ private
207+ def update_dynamic_params ( request , event )
208+ request [ 2 ] [ :dynamic_params_map ] . keys . each do |key |
209+ value = request [ 2 ] [ :dynamic_params_map ] [ key ]
210+ event_value = event . get ( value )
211+ request [ 2 ] [ :dynamic_params ] [ key ] = event_value if event_value
212+ end
213+ File . write ( request [ 2 ] [ :last_dynamic_params ] , YAML . dump ( request [ 2 ] [ :dynamic_params ] ) )
214+ end
215+
178216 private
179217 def handle_decoded_event ( queue , name , request , response , event , execution_time )
180218 apply_metadata ( event , name , request , response , execution_time )
181219 decorate ( event )
182220 queue << event
221+
222+ update_dynamic_params ( request , event ) if request [ 2 ] [ :dynamic_params ]
183223 rescue StandardError , java . lang . Exception => e
184224 @logger . error? && @logger . error ( "Error eventifying response!" ,
185225 :exception => e ,
0 commit comments