diff --git a/lib/helpers/constants.rb b/lib/helpers/constants.rb index 41150b236..b48b1f4ed 100644 --- a/lib/helpers/constants.rb +++ b/lib/helpers/constants.rb @@ -1,5 +1,6 @@ -# ONE global variable +# datastore related global variables $datastore = {} +$datastore_iterators = {} # keeps track of previous access to datastore elements datastorevariablename => prev_index_accessed ## FILE / DIR CONSTANTS ## diff --git a/lib/objects/module.rb b/lib/objects/module.rb index ec6148f03..5d9ceeef3 100644 --- a/lib/objects/module.rb +++ b/lib/objects/module.rb @@ -37,7 +37,7 @@ class Module self.output = [] self.write_to_module_with_id = write_output_variable = '' self.received_inputs = {} - self.received_datastores = {} + self.received_datastores = {} # into_variable => [[variablename] and [access], ] self.default_inputs_selectors = {} self.default_inputs_literals = {} diff --git a/lib/objects/system.rb b/lib/objects/system.rb index 5846811c5..fb2c6a22b 100644 --- a/lib/objects/system.rb +++ b/lib/objects/system.rb @@ -110,10 +110,52 @@ class System # feed in input from any received datastores if selected.received_datastores != {} Print.verbose "Receiving datastores: #{selected.received_datastores}" - selected.received_datastores.each do |input_key, datastore_value| - datastore_value.each do |datastore| - (received_inputs[input_key] ||=[]).push(*$datastore[datastore]) - Print.verbose "Adding #{input_key} - #{datastore} (#{$datastore[datastore]})" + selected.received_datastores.each do |input_into, datastore_list| + datastore_list.each do |datastore_variablename_and_access_type| + datastore_access = datastore_variablename_and_access_type['access'] + datastore_variablename = datastore_variablename_and_access_type['variablename'] + datastore_retrieved = [] + if datastore_access == 'first' + datastore_retrieved = [$datastore[datastore_variablename].first] + elsif datastore_access == 'next' + last_accessed = $datastore_iterators[datastore_variablename] + # first use? start at beginning + if last_accessed == nil + index_to_access = 0 + else + index_to_access = last_accessed + 1 + end + $datastore_iterators[datastore_variablename] = index_to_access + datastore_retrieved = [$datastore[datastore_variablename][index_to_access]] + elsif datastore_access == 'previous' + last_accessed = $datastore_iterators[datastore_variablename] + # first use? start at end + if last_accessed == nil + index_to_access = $datastore[datastore_variablename].size - 1 + else + index_to_access = last_accessed - 1 + end + $datastore_iterators[datastore_variablename] = index_to_access + datastore_retrieved = [$datastore[datastore_variablename][index_to_access]] + elsif datastore_access.to_s == datastore_access.to_i.to_s + # Test for a valid element key (integer) + index_to_access = datastore_access.to_i + $datastore_iterators[datastore_variablename] = index_to_access + datastore_retrieved = [$datastore[datastore_variablename][index_to_access]] + elsif datastore_access == "all" + datastore_retrieved = $datastore[datastore_variablename] + else + Print.err "Error: invalid access value (#{datastore_access})" + raise 'failed' + end + if datastore_retrieved && datastore_retrieved != [nil] + (received_inputs[input_into] ||=[]).push(*datastore_retrieved) + Print.verbose "Adding (#{datastore_access}) #{datastore_variablename} to #{input_into}: #{datastore_retrieved}" + else + Print.err "Error: can't add no data. Feeding #{datastore_retrieved} into #{input_into}" + Print.err "Check the scenario, not enough data is generated for this datastore (#{datastore_variablename}) to access this index (#{datastore_access})" + raise 'failed' + end end end end @@ -137,7 +179,11 @@ class System selected.received_inputs.each do |input_key, input_values| puts input_values.inspect input_values.each do |input_element| - args_string += "'--#{input_key}=#{input_element}' " + if input_key == '' + Print.warn "Warning: output values not directed to module input" + else + args_string += "'--#{input_key}=#{input_element}' " + end end end # execute calculation script and format to JSON diff --git a/lib/readers/system_reader.rb b/lib/readers/system_reader.rb index 094d108f1..ff30da0dc 100644 --- a/lib/readers/system_reader.rb +++ b/lib/readers/system_reader.rb @@ -97,13 +97,16 @@ class SystemReader # check if we are being passed a datastore as input module_node.xpath('input/datastore').each do |input_value| + access = input_value.xpath('@access').to_s + if access == '' + access = 'all' + end variable = input_value.xpath('../@into').to_s value = input_value.text Print.verbose " -- datastore: #{variable} = #{value}" - (module_selector.received_datastores[variable] ||= []).push(value) + (module_selector.received_datastores[variable] ||= []).push('variablename' => value, 'access' => access) end - module_node.xpath('@*').each do |attr| module_selector.attributes["#{attr.name}"] = [attr.text] unless attr.text.nil? || attr.text == '' end diff --git a/lib/resources/wordlists/wordlist b/lib/resources/wordlists/wordlist index c8ee7ac02..8e0bc1797 100644 --- a/lib/resources/wordlists/wordlist +++ b/lib/resources/wordlists/wordlist @@ -249008,85 +249008,3 @@ Zyuganov zyzzyva zyzzyvas ZZZ -Zöllner -Zürich -Ångström -Ångströms -åsar -ébauche -éboulement -éboulements -ébrillade -ébrillades -ébéniste -ébénistes -écarté -échappé -échappés -éclair -éclaircissement -éclat -écorché -écorchés -écossaise -écossaises -écraseur -écraseurs -écritoire -écritoires -écuelle -écuelles -écurie -écuries -égarement -élan -éloge -éloges -émeute -émeutes -émigré -éolienne -épatant -éperdu -éperdue -épicier -épiciers -épris -éprise -éprouvette -éprouvettes -épuisé -épuisée -épée -équipe -équipes -étage -étages -étagère -étalage -étalages -étape -étapes -état -étoile -étoiles -étourderie -étourdi -étourdie -étrangèr -étrangère -étrangères -étrangèrs -étrennes -étrenness -étrier -étriers -étude -étui -évolué -évolués -événement -événements -Österreich -Übermensch -Übermenschen diff --git a/lib/schemas/scenario_schema.xsd b/lib/schemas/scenario_schema.xsd index 4822b958a..d568085b2 100644 --- a/lib/schemas/scenario_schema.xsd +++ b/lib/schemas/scenario_schema.xsd @@ -21,7 +21,7 @@ - + @@ -61,7 +61,6 @@ - @@ -129,7 +128,14 @@ + + + + + + + \ No newline at end of file diff --git a/scenarios/datastore_examples/iteration_and_element_access.xml b/scenarios/datastore_examples/iteration_and_element_access.xml new file mode 100644 index 000000000..d9535d0e4 --- /dev/null +++ b/scenarios/datastore_examples/iteration_and_element_access.xml @@ -0,0 +1,56 @@ + + + + + + + + example_server + + + + + + + + + + + + + + flags + flags + + + + + + + flags + + + + + + + flags + flags + flags + flags + + + + + + + flags + + + + + + +