Saltstack Official OpenSSH Formula
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

209 lines
5.8KB

  1. {#- -*- coding: utf-8 -*- #}
  2. {#- vim: ft=jinja #}
  3. {#- Get the `tplroot` from `tpldir` #}
  4. {%- set tplroot = tpldir.split("/")[0] %}
  5. {%- from tplroot ~ "/libsaltcli.jinja" import cli %}
  6. {%- set query_map = {
  7. "C": "config.get",
  8. "G": "grains.get",
  9. "I": "pillar.get",
  10. } %}
  11. {#- When no part before `@` is provided: #}
  12. {#- - define a filename path, noted `F` #}
  13. {#- - use `salt["config.get"]`, noted `C` #}
  14. {%- set _defaults = {
  15. "type": "F",
  16. "query_type": "C",
  17. } %}
  18. {%- macro parse_matchers(
  19. matchers,
  20. config_get_strategy=None,
  21. log_prefix="libmatchers: "
  22. ) %}
  23. {#- matcher format is `[<TYPE>[:<OPTION>]@]<KEY>` #}
  24. {#- each matcher has a type: #}
  25. {#- - `F` to build a file name (the default when no type is set) #}
  26. {#- - `C` to lookup values with `config.get` #}
  27. {#- - `G` to lookup values with `grains.get` #}
  28. {#- - `I` to lookup values with `pillar.get` #}
  29. {#- The `FILE` type option can define query type to build the file name: #}
  30. {#- - `C` for query with `config.get` (the default when to query type is set) #}
  31. {#- - `G` for query with `grains.get` #}
  32. {#- - `I` for query with `pillar.get` #}
  33. {%- set parsed_matchers = [] %}
  34. {%- for matcher in matchers %}
  35. {%- do salt["log.debug"](
  36. log_prefix
  37. ~ "process matcher: '"
  38. ~ matcher
  39. ~ "'"
  40. ) %}
  41. {%- set parsed = {} %}
  42. {%- set matcher_parts = matcher.split('@') %}
  43. {%- if matcher_parts | length == 1 %}
  44. {#- By default we load YAML files for config looked up by `config.get` #}
  45. {%- do parsed.update(
  46. {
  47. "type": _defaults["type"],
  48. "option": None,
  49. "query_method": query_map[_defaults["query_type"]],
  50. "query": matcher
  51. }
  52. ) %}
  53. {%- do salt["log.debug"](
  54. log_prefix
  55. ~ "use built-in defaults for matcher:\n"
  56. ~ parsed
  57. | yaml(False)
  58. | indent(4, True)
  59. ) %}
  60. {%- else %}
  61. {%- do salt["log.debug"](
  62. log_prefix
  63. ~ "parse matcher: '"
  64. ~ matcher
  65. ~ "'"
  66. ) %}
  67. {%- set metadatas = matcher_parts[0].split(":") %}
  68. {%- do parsed.update(
  69. {
  70. "query": matcher_parts[1]
  71. }
  72. ) %}
  73. {%- if metadatas | length == 1 %}
  74. {%- do parsed.update(
  75. {
  76. "type": metadatas[0],
  77. "option": "C",
  78. }
  79. ) %}
  80. {%- do salt["log.debug"](
  81. log_prefix
  82. ~ "parse as 1 metadata matcher:\n"
  83. ~ parsed
  84. | yaml(False)
  85. | indent(4, True)
  86. ) %}
  87. {%- elif metadatas | length == 2 %}
  88. {%- do parsed.update(
  89. {
  90. "type": metadatas[0],
  91. "option": metadatas[1],
  92. }
  93. ) %}
  94. {%- do salt["log.debug"](
  95. log_prefix
  96. ~ "parse as 2 metadata matcher:\n"
  97. ~ parsed
  98. | yaml(False)
  99. | indent(4, True)
  100. ) %}
  101. {%- elif metadatas | length == 3 %}
  102. {%- do parsed.update(
  103. {
  104. "type": metadatas[0],
  105. "option": metadatas[1],
  106. }
  107. ) %}
  108. {%- do salt["log.debug"](
  109. log_prefix
  110. ~ "parse as 3 metadata matcher:\n"
  111. ~ parsed
  112. | yaml(False)
  113. | indent(4, True)
  114. ) %}
  115. {%- elif metadatas | length == 4 %}
  116. {%- do parsed.update(
  117. {
  118. "type": metadatas[0],
  119. "option": metadatas[1],
  120. }
  121. ) %}
  122. {%- do salt["log.debug"](
  123. log_prefix
  124. ~ "parse as 4 metadata matcher:\n"
  125. ~ parsed
  126. | yaml(False)
  127. | indent(4, True)
  128. ) %}
  129. {%- endif %}
  130. {%- endif %}
  131. {#- The `<OPTION>` has different meaning based on type #}
  132. {%- if query_map.get(parsed.type, False) %}
  133. {%- do parsed.update(
  134. {
  135. "query_method": query_map[parsed.type]
  136. }
  137. ) %}
  138. {%- else %}
  139. {%- do parsed.update(
  140. {
  141. "query_method": query_map[
  142. parsed.option
  143. | default("C", boolean=True)
  144. ]
  145. }
  146. ) %}
  147. {%- endif %}
  148. {#- Add `merge:` option to `salt["config.get"]` if configured #}
  149. {%- if cli in ["minion", "local"] and parsed.query_method == "config.get" and config_get_strategy %}
  150. {%- set merge_opt = {"merge": config_get_strategy} %}
  151. {%- set merge_msg = (
  152. ", merge: strategy='"
  153. ~ config_get_strategy
  154. ~ "'"
  155. ) %}
  156. {%- else %}
  157. {%- if cli not in ["minion", "local"] %}
  158. {%- do salt["log.error"](
  159. log_prefix
  160. ~ "the 'merge' option of 'config.get' is skipped when the salt command type is '"
  161. ~ cli
  162. ~ "'"
  163. ) %}
  164. {%- endif %}
  165. {%- set merge_opt = {} %}
  166. {%- set merge_msg = "" %}
  167. {%- endif %}
  168. {%- do salt["log.debug"](
  169. log_prefix
  170. ~ "lookup '"
  171. ~ parsed.query
  172. ~ "' with '"
  173. ~ parsed.query_method
  174. ~ "'"
  175. ~ merge_msg
  176. ) %}
  177. {%- set values = salt[parsed.query_method](
  178. parsed.query,
  179. default=[],
  180. **merge_opt
  181. ) %}
  182. {%- do parsed.update(
  183. {
  184. "value": values
  185. }
  186. ) %}
  187. {%- do parsed_matchers.append(parsed) %}
  188. {%- endfor %}
  189. {%- do salt["log.debug"](
  190. log_prefix
  191. ~ "parsed matchers:\n"
  192. ~ parsed_matchers
  193. | yaml(False)
  194. | indent(4, True)
  195. ) %}
  196. {{ parsed_matchers | yaml }}
  197. {%- endmacro %}