| 52 | |
| 53 | |
| 54 | class DependantScriptValuesProvider(ValuesProvider): |
| 55 | |
| 56 | def __init__(self, script, parameters_supplier, shell, process_invoker: ProcessInvoker) -> None: |
| 57 | pattern = re.compile('\${([^}]+)\}') |
| 58 | |
| 59 | search_start = 0 |
| 60 | script_template = '' |
| 61 | required_parameters = set() |
| 62 | |
| 63 | while search_start < len(script): |
| 64 | match = pattern.search(script, search_start) |
| 65 | if not match: |
| 66 | script_template += script[search_start:] |
| 67 | break |
| 68 | param_start = match.start() |
| 69 | if param_start > search_start: |
| 70 | script_template += script[search_start:param_start] |
| 71 | |
| 72 | param_name = match.group(1) |
| 73 | required_parameters.add(param_name) |
| 74 | |
| 75 | search_start = match.end() + 1 |
| 76 | |
| 77 | self._required_parameters = tuple(required_parameters) |
| 78 | self._script_template = script |
| 79 | self._parameters_supplier = parameters_supplier |
| 80 | self._shell = shell |
| 81 | self._process_invoker = process_invoker |
| 82 | |
| 83 | def get_required_parameters(self): |
| 84 | return self._required_parameters |
| 85 | |
| 86 | def get_values(self, parameter_values): |
| 87 | for param_name in self._required_parameters: |
| 88 | value_wrapper = parameter_values.get(param_name) |
| 89 | if (value_wrapper is None) or is_empty(value_wrapper.mapped_script_value): |
| 90 | return [] |
| 91 | |
| 92 | parameters = self._parameters_supplier() |
| 93 | script = fill_parameter_values(parameters, self._script_template, parameter_values) |
| 94 | |
| 95 | try: |
| 96 | script_output = self._process_invoker.invoke(script, shell=self._shell) |
| 97 | except Exception as e: |
| 98 | LOGGER.warning('Failed to execute script. ' + str(e)) |
| 99 | return [] |
| 100 | |
| 101 | script_output = script_output.rstrip('\n') |
| 102 | return [line for line in script_output.split('\n') if not is_empty(line)] |
| 103 | |
| 104 | |
| 105 | class FilesProvider(ValuesProvider): |
no outgoing calls