paramsx 2.2.1__tar.gz → 2.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,38 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.3.0
4
+
5
+ ### Añadido
6
+
7
+ - **La descripción de los parámetros, editable como el valor.** El fichero exportado trae un campo `parameter_description` **debajo del nombre y antes del valor**: se lee de AWS, lo editas y al cargar se actualiza. Los cambios de descripción se detectan igual que los de valor y aparecen en la pantalla de confirmación como `Modificado (descripción)`. La opción 4 también la pide al crear un parámetro, entre la ruta y el valor.
8
+ - Los backups incluyen la descripción, así que un backup restaura también las descripciones.
9
+ - **Flag `forzar_securestring`** (por defecto `True`, el comportamiento de siempre): todo lo que sube ParamsX va cifrado como `SecureString`. Con `False` se respeta el tipo que ya tuviera el parámetro en AWS: al actualizar no se manda el tipo y AWS conserva el suyo (`Type` solo es obligatorio al crear). El fichero exportado trae además un campo `parameter_type` editable, por si quieres cambiar el tipo a propósito, y sus cambios se detectan como los del valor o la descripción. El tipo se lee de la misma llamada que el valor, así que no hace falta ningún permiso nuevo.
10
+
11
+ ### Nota sobre el valor y la descripción
12
+
13
+ `put_parameter` con `Overwrite=True` reescribe la definición del parámetro, así que ParamsX **manda siempre la descripción que trae el fichero**, incluso cuando lo único que cambió fue el valor. Antes no se mandaba, y una descripción que ya existiera en AWS podía quedarse vacía al editar el valor.
14
+
15
+ ### Nota sobre permisos
16
+
17
+ Leer las descripciones necesita **`ssm:DescribeParameters`**, porque no vienen en `GetParametersByPath` (son metadatos, no valores). Si tu rol no lo tiene, ParamsX te avisa al leer, el campo no aparece en el fichero y al cargar **no se toca** la descripción que haya en AWS. El resto sigue funcionando igual.
18
+
19
+ ## 2.2.2
20
+
21
+ Un renombrado de la configuración, sin cambios de comportamiento. **Los nombres antiguos
22
+ se siguen aceptando**, así que no tienes que tocar tu fichero para actualizar.
23
+
24
+ ### Cambiado
25
+
26
+ - **Un solo nombre para el concepto: `perfiles` / `perfil`.** El mismo concepto se llamaba de tres formas distintas: el diccionario era `naming`, la clave de cada entrada de `parameter_list` era `convencion` y la documentación decía "perfil". Explicárselo a alguien obligaba a traducir dos veces. Ahora:
27
+
28
+ | Antes | Ahora |
29
+ |---|---|
30
+ | `naming = {...}` | `perfiles = {...}` |
31
+ | `{"path": "/rds", "convencion": "min"}` | `{"path": "/rds", "perfil": "min"}` |
32
+ | `convencion_nuevos = "min"` | `perfil_nuevos = "min"` |
33
+
34
+ - `paramsx configure` te dice qué nombres antiguos usas y cómo se llaman ahora, incluidas las entradas de `parameter_list`. Los viejos (`naming`, `convencion`, `convencion_nuevos` y el `abac` de la 2.0) se traducen al cargar, así que dentro del programa solo existe el nombre nuevo.
35
+
3
36
  ## 2.2.1
4
37
 
5
38
  Solo comandos de terminal y documentación: no cambia nada de la lectura, la carga ni la
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: paramsx
3
- Version: 2.2.1
3
+ Version: 2.3.0
4
4
  Summary: Librería para gestionar y respaldar parámetros de AWS SSM de manera sencilla y eficiente.
5
5
  Home-page: https://github.com/pistatxos/paramsx
6
6
  Author: Mariox
@@ -24,7 +24,7 @@ ParamsX es una herramienta diseñada para gestionar y organizar parámetros de A
24
24
 
25
25
  ## ⚠ Breaking change en la versión 2.0.0
26
26
 
27
- Si vienes de la 1.x tienes que **actualizar a mano tu `~/.xsoft/paramsx_config.py`**: `parameter_list` ya no es una lista de strings, ahora cada entrada es un diccionario con su convención de naming. La versión antigua **no es compatible** y ParamsX se niega a arrancar mostrando cómo migrarla. Detalle completo en el [CHANGELOG](CHANGELOG.md).
27
+ Si vienes de la 1.x tienes que **actualizar a mano tu `~/.xsoft/paramsx_config.py`**: `parameter_list` ya no es una lista de strings, ahora cada entrada es un diccionario que declara su perfil. La versión antigua **no es compatible** y ParamsX se niega a arrancar mostrando cómo migrarla. Detalle completo en el [CHANGELOG](CHANGELOG.md).
28
28
 
29
29
  ### Estructura Recomendada
30
30
  La convención de naming es de 5 niveles, donde los últimos segmentos son opcionales según el caso:
@@ -70,7 +70,7 @@ Al ejecutar ```paramsx``` desde la terminal, accedes a un menú interactivo con
70
70
  - Navega por la lista de parámetros configurada en tu archivo de configuración y selecciona cuál descargar.
71
71
  - Elige el entorno deseado (por ejemplo, dev o prod).
72
72
  - Archivos generados:
73
- - parameters_dev.py o parameters_prod.py → Edita estos archivos para modificar, añadir o eliminar parámetros (valores y tags).
73
+ - parameters_dev.py o parameters_prod.py → Edita estos archivos para modificar, añadir o eliminar parámetros (descripciones, valores y tags).
74
74
  - parameters_dev_backup.py → Respaldo automático del archivo descargado, incluidas las tags.
75
75
  Los archivos se crean en la misma ruta desde donde ejecutas paramsx, evitando movernos innecesariamente entre carpetas.
76
76
  - Si tu rol IAM no tiene permisos sobre la ruta configurada, verás un mensaje claro en lugar de una traza de boto3:
@@ -97,10 +97,11 @@ Esto te permitirá mantener respaldos seguros o realizar migraciones/reorganizac
97
97
 
98
98
  4. Crear nuevo parámetro
99
99
  - Crea un parámetro desde cero sin salir de la herramienta. Te pedirá, en este orden:
100
- - La ruta **sin el entorno**, igual que la declaras en `parameter_list`: el perfil de naming se encarga de colocarlo. Verás en pantalla la ruta resultante en AWS antes de seguir.
100
+ - La ruta **sin el entorno**, igual que la declaras en `parameter_list`: el perfil se encarga de colocarlo. Verás en pantalla la ruta resultante en AWS antes de seguir.
101
+ - La descripción, opcional: para qué sirve el parámetro. Se guarda en AWS y luego se puede editar en el fichero exportado.
101
102
  - El valor: texto plano o JSON en una línea (por ejemplo `{"host": "x", "user": "y", "pass": "z"}`), que se valida antes de continuar.
102
103
  - Las tags obligatorias, si tienes `tags_activas = True`.
103
- - El perfil que se usa es el que declares en `convencion_nuevos`. Si tu perfil es de tipo `mixto`, escribe el `*` en la ruta para indicar dónde va el entorno.
104
+ - El perfil que se usa es el que declares en `perfil_nuevos`. Si tu perfil es de tipo `mixto`, escribe el `*` en la ruta para indicar dónde va el entorno.
104
105
  - Antes de subirlo verás una pantalla de confirmación con la ruta, el valor y las tags. El parámetro se crea con `Overwrite=False`, así que nunca machaca uno existente.
105
106
  - Tras crearlo aparecerá la próxima vez que leas la ruta correspondiente de tu `parameter_list`.
106
107
 
@@ -135,7 +136,7 @@ Ejemplo del contenido de paramsx_config.py:
135
136
  ```python
136
137
  ## Configuraciones ParamsX
137
138
 
138
- # --- Perfiles de naming -------------------------------------------------------------
139
+ # --- Perfiles -------------------------------------------------------------
139
140
  # Un perfil dice CÓMO se construye la ruta real en AWS a partir de la ruta que declaras
140
141
  # en 'parameter_list' y del entorno que eliges en el menú. Los nombres son tuyos: define
141
142
  # solo los que uses y llámalos como quieras. Un perfil tiene tres campos:
@@ -177,7 +178,7 @@ Ejemplo del contenido de paramsx_config.py:
177
178
  # Combina los tres campos como necesites: no hay una lista cerrada de perfiles. En el
178
179
  # README tienes más ejemplos.
179
180
 
180
- naming = {
181
+ perfiles = {
181
182
  "min": {"posicion_entorno": "inicio", "case_entorno": "lower", "case_ruta": "lower"},
182
183
  "max": {"posicion_entorno": "final", "case_entorno": "upper", "case_ruta": "ninguno"},
183
184
  "mixto_max": {"posicion_entorno": "mixto", "case_entorno": "upper", "case_ruta": "ninguno"},
@@ -190,19 +191,19 @@ configuraciones = {
190
191
  "region_name": "eu-south-2", # Cambiar por tu región de AWS
191
192
  "entornos": ['dev', 'pre', 'prod'], # SIEMPRE en minúscula, es la lista canónica única
192
193
  "parameter_list": [
193
- {"path": "/common", "convencion": "min"}, # -> /dev/common
194
- {"path": "/rds", "convencion": "min"}, # -> /dev/rds
195
- {"path": "/EMAIL", "convencion": "max"}, # -> /EMAIL/DEV
196
- {"path": "/API/STA", "convencion": "max"}, # -> /API/STA/DEV
194
+ {"path": "/common", "perfil": "min"}, # -> /dev/common
195
+ {"path": "/rds", "perfil": "min"}, # -> /dev/rds
196
+ {"path": "/EMAIL", "perfil": "max"}, # -> /EMAIL/DEV
197
+ {"path": "/API/STA", "perfil": "max"}, # -> /API/STA/DEV
197
198
  # Con 'mixto' acotas por debajo del entorno: esto lee solo stan_ai, en vez de
198
199
  # todo lo que cuelga de /API/MULTIAPI/DEV
199
- {"path": "/API/MULTIAPI/*/stan_ai", "convencion": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
200
+ {"path": "/API/MULTIAPI/*/stan_ai", "perfil": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
200
201
  ]
201
202
  }
202
203
 
203
- # Perfil de naming que se usa al crear un parámetro nuevo (opción 4 del menú).
204
- # Si no lo defines, se usa el primer perfil de 'naming'.
205
- convencion_nuevos = "min"
204
+ # Perfil que se usa al crear un parámetro nuevo (opción 4 del menú).
205
+ # Si no lo defines, se usa el primero de 'perfiles'.
206
+ perfil_nuevos = "min"
206
207
 
207
208
  # ¿El nombre del fichero exportado incluye la ruta leída?
208
209
  # False -> parameters_dev.py (comportamiento de siempre)
@@ -212,6 +213,16 @@ convencion_nuevos = "min"
212
213
  # segunda lectura te machaque el fichero de la primera.
213
214
  fichero_por_ruta = False
214
215
 
216
+ # ¿Todo lo que sube ParamsX va cifrado como SecureString?
217
+ # True (por defecto) -> sí, siempre. Es lo recomendable: los parámetros de una cuenta
218
+ # suelen tener secretos, y así no depende de acordarse.
219
+ # False -> se respeta el tipo que ya tuviera el parámetro en AWS (String, StringList o
220
+ # SecureString): al actualizar no se manda el tipo, así que AWS conserva el suyo.
221
+ # En este modo el fichero exportado trae además un campo 'parameter_type' que
222
+ # puedes editar si quieres cambiarlo a propósito. Los parámetros que crees con
223
+ # la opción 4 se siguen creando como SecureString.
224
+ forzar_securestring = True
225
+
215
226
 
216
227
  ## Configuraciones Tags
217
228
 
@@ -244,9 +255,9 @@ tags_obligatorias = [
244
255
  ```
245
256
  Nota: Si el archivo paramsx_config.py ya existe, no será sobrescrito durante la instalación para proteger las configuraciones personalizadas.
246
257
 
247
- ### Los perfiles de naming
258
+ ### Los perfiles
248
259
 
249
- Cada organización nombra sus parámetros a su manera, así que ParamsX no impone ninguna convención: **tú defines los perfiles que uses en el diccionario `naming` y les pones el nombre que quieras**. Cada entrada de `parameter_list` declara con qué perfil se construye su ruta completa. Los tres campos de un perfil y sus valores están explicados en el propio fichero de configuración, ahí arriba.
260
+ Cada organización nombra sus parámetros a su manera, así que ParamsX no impone ninguna convención: **tú defines los perfiles que uses en el diccionario `perfiles` y les pones el nombre que quieras**. Cada entrada de `parameter_list` declara con qué perfil se construye su ruta completa, con la clave `perfil`. Los tres campos de un perfil y sus valores están explicados en el propio fichero de configuración, ahí arriba.
250
261
 
251
262
  **No hay una lista cerrada de perfiles.** Los tres campos se combinan libremente, así que la plantilla no intenta traértelos todos: define los dos o tres que use tu organización y olvídate del resto. `min` y `max` vienen predefinidos porque son los que ParamsX traía antes de que los perfiles fueran configurables.
252
263
 
@@ -266,15 +277,47 @@ En el nombre van el entorno, la ruta y el perfil, porque dos entradas pueden com
266
277
 
267
278
  | Entrada | Fichero |
268
279
  |---|---|
269
- | `{"path": "/API/STA", "convencion": "max"}` | `parameters_dev__API_STA__max.py` |
270
- | `{"path": "/API/*/STA", "convencion": "mixto_max"}` | `parameters_dev__API_env_STA__mixto_max.py` |
280
+ | `{"path": "/API/STA", "perfil": "max"}` | `parameters_dev__API_STA__max.py` |
281
+ | `{"path": "/API/*/STA", "perfil": "mixto_max"}` | `parameters_dev__API_env_STA__mixto_max.py` |
282
+
283
+ ### La descripción de los parámetros
284
+
285
+ El fichero exportado trae un campo `parameter_description` **debajo del nombre y antes del valor**. Se lee de AWS, se edita como cualquier otro campo y se aplica al cargar:
286
+
287
+ ```python
288
+ parametros = [
289
+ {'parameter_name': '/dev/api/sta/token',
290
+ 'parameter_description': "Token JWT de la API, rota cada 90 dias",
291
+ 'parameter_value': """abc123"""},
292
+ ]
293
+ ```
294
+
295
+ Dos cosas que conviene saber:
296
+
297
+ - **Hace falta el permiso `ssm:DescribeParameters`.** La descripción no viaja en `GetParametersByPath` como el valor: es un metadato y se pide con `DescribeParameters`. Si tu rol no lo tiene, ParamsX te avisa, el campo **no aparece** en el fichero y al cargar no se toca la descripción que haya en AWS.
298
+ - **Al actualizar un parámetro, AWS reescribe su definición entera.** Por eso ParamsX manda siempre la descripción del fichero cuando cambia el valor, aunque no la hayas tocado: si no la mandara, se perdería. Y como no existe una API para cambiar solo la descripción, editarla crea una versión nueva del parámetro igual que cambiar el valor.
299
+
300
+ Un cambio de descripción se ve en la pantalla de confirmación como `Modificado (descripción)`, y si cambias las dos cosas, `Modificado (valor | descripción)`.
301
+
302
+ ### Cifrado: `forzar_securestring`
303
+
304
+ ParamsX sube todo como **SecureString** por defecto, y así se recomienda dejarlo: los parámetros de una cuenta acaban teniendo secretos, y con esto no depende de que nadie se acuerde.
305
+
306
+ | `forzar_securestring` | Qué hace |
307
+ |---|---|
308
+ | `True` (por defecto) | Todo lo que se sube va cifrado como `SecureString`, sea del tipo que sea en AWS. |
309
+ | `False` | Se respeta el tipo que ya tuviera el parámetro (`String`, `StringList` o `SecureString`): al actualizar no se manda el tipo, y AWS conserva el suyo. El fichero exportado trae además un campo `parameter_type` que puedes editar si quieres cambiarlo a propósito, y ese cambio cuenta como uno más: verás `Modificado (tipo: SecureString)`. |
310
+
311
+ Los parámetros que creas con la opción 4 se crean siempre como `SecureString`, en los dos modos.
312
+
313
+ El tipo se lee de la misma llamada que el valor, así que **no hace falta ningún permiso extra** para esto (a diferencia de la descripción).
271
314
 
272
315
  ### Cómo acotar tu parameter_list (recomendación)
273
316
 
274
317
  `parameter_list` es solo tu vista de trabajo: **la seguridad real la impone IAM, no este fichero**. La recomendación de uso es:
275
318
 
276
- - **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "convencion": "min"}` → `/dev/rds`.
277
- - **Usuarios normales**: conviene acotar la ruta a lo que su rol IAM tiene realmente autorizado, por ejemplo `{"path": "/rds/cee-dev/api", "convencion": "min"}` → `/dev/rds/cee-dev/api`.
319
+ - **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "perfil": "min"}` → `/dev/rds`.
320
+ - **Usuarios normales**: conviene acotar la ruta a lo que su rol IAM tiene realmente autorizado, por ejemplo `{"path": "/rds/cee-dev/api", "perfil": "min"}` → `/dev/rds/cee-dev/api`.
278
321
 
279
322
  Si configuras una ruta más amplia que tus permisos, no pasa nada grave: ParamsX te avisará con un mensaje claro de acceso denegado en vez de una traza de boto3. Pero afinar la ruta te ahorra el error.
280
323
 
@@ -300,6 +343,7 @@ Formato del fichero exportado con `tags_activas = True`:
300
343
  ```python
301
344
  parametros = [
302
345
  {'parameter_name': '/dev/email/users',
346
+ 'parameter_description': "Buzon que recibe los avisos de altas",
303
347
  'parameter_value': """agpetrovici@stanalytics.es""",
304
348
  'tagApplication': "",
305
349
  'tagEnvironment': "",
@@ -383,7 +427,7 @@ El programa mostrará un menú donde Podrás:
383
427
  - Crear un parámetro nuevo.
384
428
 
385
429
  ### Leer Parámetros:
386
- 1. Selecciona la opción "Leer parámetros" en el menú. La lista muestra cada ruta con su perfil de naming, por ejemplo `/rds [min]` o `/API/STA [max]`.
430
+ 1. Selecciona la opción "Leer parámetros" en el menú. La lista muestra cada ruta con su perfil, por ejemplo `/rds [min]` o `/API/STA [max]`.
387
431
  2. Elige el prefijo y el entorno que deseas consultar.
388
432
  3. Los parámetros serán descargados y guardados en archivos como:
389
433
  - parameters_dev.py
@@ -404,7 +448,7 @@ El programa mostrará un menú donde Podrás:
404
448
 
405
449
  ### Crear un parámetro nuevo:
406
450
  1. Selecciona la opción "Crear nuevo parámetro" y elige el entorno.
407
- 2. Escribe la ruta **sin el entorno**, como en tu `parameter_list`: ParamsX le aplica el perfil de `convencion_nuevos` y te enseña la ruta resultante en AWS para que la confirmes.
451
+ 2. Escribe la ruta **sin el entorno**, como en tu `parameter_list`: ParamsX le aplica el perfil de `perfil_nuevos` y te enseña la ruta resultante en AWS para que la confirmes.
408
452
  3. Escribe el valor: texto plano o JSON en una línea.
409
453
  4. Rellena las tags obligatorias (si `tags_activas = True`). `Environment` viene precargada con el entorno elegido. Con `obligatorias_vacias = True` puedes dejar alguna en blanco pulsando Enter: esas no se crearán en AWS.
410
454
  5. Confirma en la pantalla de resumen. Si es un parámetro de RDS y falta su contraparte (común o privado), verás el aviso de correlación de naming ahí mismo.
@@ -4,7 +4,7 @@ ParamsX es una herramienta diseñada para gestionar y organizar parámetros de A
4
4
 
5
5
  ## ⚠ Breaking change en la versión 2.0.0
6
6
 
7
- Si vienes de la 1.x tienes que **actualizar a mano tu `~/.xsoft/paramsx_config.py`**: `parameter_list` ya no es una lista de strings, ahora cada entrada es un diccionario con su convención de naming. La versión antigua **no es compatible** y ParamsX se niega a arrancar mostrando cómo migrarla. Detalle completo en el [CHANGELOG](CHANGELOG.md).
7
+ Si vienes de la 1.x tienes que **actualizar a mano tu `~/.xsoft/paramsx_config.py`**: `parameter_list` ya no es una lista de strings, ahora cada entrada es un diccionario que declara su perfil. La versión antigua **no es compatible** y ParamsX se niega a arrancar mostrando cómo migrarla. Detalle completo en el [CHANGELOG](CHANGELOG.md).
8
8
 
9
9
  ### Estructura Recomendada
10
10
  La convención de naming es de 5 niveles, donde los últimos segmentos son opcionales según el caso:
@@ -50,7 +50,7 @@ Al ejecutar ```paramsx``` desde la terminal, accedes a un menú interactivo con
50
50
  - Navega por la lista de parámetros configurada en tu archivo de configuración y selecciona cuál descargar.
51
51
  - Elige el entorno deseado (por ejemplo, dev o prod).
52
52
  - Archivos generados:
53
- - parameters_dev.py o parameters_prod.py → Edita estos archivos para modificar, añadir o eliminar parámetros (valores y tags).
53
+ - parameters_dev.py o parameters_prod.py → Edita estos archivos para modificar, añadir o eliminar parámetros (descripciones, valores y tags).
54
54
  - parameters_dev_backup.py → Respaldo automático del archivo descargado, incluidas las tags.
55
55
  Los archivos se crean en la misma ruta desde donde ejecutas paramsx, evitando movernos innecesariamente entre carpetas.
56
56
  - Si tu rol IAM no tiene permisos sobre la ruta configurada, verás un mensaje claro en lugar de una traza de boto3:
@@ -77,10 +77,11 @@ Esto te permitirá mantener respaldos seguros o realizar migraciones/reorganizac
77
77
 
78
78
  4. Crear nuevo parámetro
79
79
  - Crea un parámetro desde cero sin salir de la herramienta. Te pedirá, en este orden:
80
- - La ruta **sin el entorno**, igual que la declaras en `parameter_list`: el perfil de naming se encarga de colocarlo. Verás en pantalla la ruta resultante en AWS antes de seguir.
80
+ - La ruta **sin el entorno**, igual que la declaras en `parameter_list`: el perfil se encarga de colocarlo. Verás en pantalla la ruta resultante en AWS antes de seguir.
81
+ - La descripción, opcional: para qué sirve el parámetro. Se guarda en AWS y luego se puede editar en el fichero exportado.
81
82
  - El valor: texto plano o JSON en una línea (por ejemplo `{"host": "x", "user": "y", "pass": "z"}`), que se valida antes de continuar.
82
83
  - Las tags obligatorias, si tienes `tags_activas = True`.
83
- - El perfil que se usa es el que declares en `convencion_nuevos`. Si tu perfil es de tipo `mixto`, escribe el `*` en la ruta para indicar dónde va el entorno.
84
+ - El perfil que se usa es el que declares en `perfil_nuevos`. Si tu perfil es de tipo `mixto`, escribe el `*` en la ruta para indicar dónde va el entorno.
84
85
  - Antes de subirlo verás una pantalla de confirmación con la ruta, el valor y las tags. El parámetro se crea con `Overwrite=False`, así que nunca machaca uno existente.
85
86
  - Tras crearlo aparecerá la próxima vez que leas la ruta correspondiente de tu `parameter_list`.
86
87
 
@@ -115,7 +116,7 @@ Ejemplo del contenido de paramsx_config.py:
115
116
  ```python
116
117
  ## Configuraciones ParamsX
117
118
 
118
- # --- Perfiles de naming -------------------------------------------------------------
119
+ # --- Perfiles -------------------------------------------------------------
119
120
  # Un perfil dice CÓMO se construye la ruta real en AWS a partir de la ruta que declaras
120
121
  # en 'parameter_list' y del entorno que eliges en el menú. Los nombres son tuyos: define
121
122
  # solo los que uses y llámalos como quieras. Un perfil tiene tres campos:
@@ -157,7 +158,7 @@ Ejemplo del contenido de paramsx_config.py:
157
158
  # Combina los tres campos como necesites: no hay una lista cerrada de perfiles. En el
158
159
  # README tienes más ejemplos.
159
160
 
160
- naming = {
161
+ perfiles = {
161
162
  "min": {"posicion_entorno": "inicio", "case_entorno": "lower", "case_ruta": "lower"},
162
163
  "max": {"posicion_entorno": "final", "case_entorno": "upper", "case_ruta": "ninguno"},
163
164
  "mixto_max": {"posicion_entorno": "mixto", "case_entorno": "upper", "case_ruta": "ninguno"},
@@ -170,19 +171,19 @@ configuraciones = {
170
171
  "region_name": "eu-south-2", # Cambiar por tu región de AWS
171
172
  "entornos": ['dev', 'pre', 'prod'], # SIEMPRE en minúscula, es la lista canónica única
172
173
  "parameter_list": [
173
- {"path": "/common", "convencion": "min"}, # -> /dev/common
174
- {"path": "/rds", "convencion": "min"}, # -> /dev/rds
175
- {"path": "/EMAIL", "convencion": "max"}, # -> /EMAIL/DEV
176
- {"path": "/API/STA", "convencion": "max"}, # -> /API/STA/DEV
174
+ {"path": "/common", "perfil": "min"}, # -> /dev/common
175
+ {"path": "/rds", "perfil": "min"}, # -> /dev/rds
176
+ {"path": "/EMAIL", "perfil": "max"}, # -> /EMAIL/DEV
177
+ {"path": "/API/STA", "perfil": "max"}, # -> /API/STA/DEV
177
178
  # Con 'mixto' acotas por debajo del entorno: esto lee solo stan_ai, en vez de
178
179
  # todo lo que cuelga de /API/MULTIAPI/DEV
179
- {"path": "/API/MULTIAPI/*/stan_ai", "convencion": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
180
+ {"path": "/API/MULTIAPI/*/stan_ai", "perfil": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
180
181
  ]
181
182
  }
182
183
 
183
- # Perfil de naming que se usa al crear un parámetro nuevo (opción 4 del menú).
184
- # Si no lo defines, se usa el primer perfil de 'naming'.
185
- convencion_nuevos = "min"
184
+ # Perfil que se usa al crear un parámetro nuevo (opción 4 del menú).
185
+ # Si no lo defines, se usa el primero de 'perfiles'.
186
+ perfil_nuevos = "min"
186
187
 
187
188
  # ¿El nombre del fichero exportado incluye la ruta leída?
188
189
  # False -> parameters_dev.py (comportamiento de siempre)
@@ -192,6 +193,16 @@ convencion_nuevos = "min"
192
193
  # segunda lectura te machaque el fichero de la primera.
193
194
  fichero_por_ruta = False
194
195
 
196
+ # ¿Todo lo que sube ParamsX va cifrado como SecureString?
197
+ # True (por defecto) -> sí, siempre. Es lo recomendable: los parámetros de una cuenta
198
+ # suelen tener secretos, y así no depende de acordarse.
199
+ # False -> se respeta el tipo que ya tuviera el parámetro en AWS (String, StringList o
200
+ # SecureString): al actualizar no se manda el tipo, así que AWS conserva el suyo.
201
+ # En este modo el fichero exportado trae además un campo 'parameter_type' que
202
+ # puedes editar si quieres cambiarlo a propósito. Los parámetros que crees con
203
+ # la opción 4 se siguen creando como SecureString.
204
+ forzar_securestring = True
205
+
195
206
 
196
207
  ## Configuraciones Tags
197
208
 
@@ -224,9 +235,9 @@ tags_obligatorias = [
224
235
  ```
225
236
  Nota: Si el archivo paramsx_config.py ya existe, no será sobrescrito durante la instalación para proteger las configuraciones personalizadas.
226
237
 
227
- ### Los perfiles de naming
238
+ ### Los perfiles
228
239
 
229
- Cada organización nombra sus parámetros a su manera, así que ParamsX no impone ninguna convención: **tú defines los perfiles que uses en el diccionario `naming` y les pones el nombre que quieras**. Cada entrada de `parameter_list` declara con qué perfil se construye su ruta completa. Los tres campos de un perfil y sus valores están explicados en el propio fichero de configuración, ahí arriba.
240
+ Cada organización nombra sus parámetros a su manera, así que ParamsX no impone ninguna convención: **tú defines los perfiles que uses en el diccionario `perfiles` y les pones el nombre que quieras**. Cada entrada de `parameter_list` declara con qué perfil se construye su ruta completa, con la clave `perfil`. Los tres campos de un perfil y sus valores están explicados en el propio fichero de configuración, ahí arriba.
230
241
 
231
242
  **No hay una lista cerrada de perfiles.** Los tres campos se combinan libremente, así que la plantilla no intenta traértelos todos: define los dos o tres que use tu organización y olvídate del resto. `min` y `max` vienen predefinidos porque son los que ParamsX traía antes de que los perfiles fueran configurables.
232
243
 
@@ -246,15 +257,47 @@ En el nombre van el entorno, la ruta y el perfil, porque dos entradas pueden com
246
257
 
247
258
  | Entrada | Fichero |
248
259
  |---|---|
249
- | `{"path": "/API/STA", "convencion": "max"}` | `parameters_dev__API_STA__max.py` |
250
- | `{"path": "/API/*/STA", "convencion": "mixto_max"}` | `parameters_dev__API_env_STA__mixto_max.py` |
260
+ | `{"path": "/API/STA", "perfil": "max"}` | `parameters_dev__API_STA__max.py` |
261
+ | `{"path": "/API/*/STA", "perfil": "mixto_max"}` | `parameters_dev__API_env_STA__mixto_max.py` |
262
+
263
+ ### La descripción de los parámetros
264
+
265
+ El fichero exportado trae un campo `parameter_description` **debajo del nombre y antes del valor**. Se lee de AWS, se edita como cualquier otro campo y se aplica al cargar:
266
+
267
+ ```python
268
+ parametros = [
269
+ {'parameter_name': '/dev/api/sta/token',
270
+ 'parameter_description': "Token JWT de la API, rota cada 90 dias",
271
+ 'parameter_value': """abc123"""},
272
+ ]
273
+ ```
274
+
275
+ Dos cosas que conviene saber:
276
+
277
+ - **Hace falta el permiso `ssm:DescribeParameters`.** La descripción no viaja en `GetParametersByPath` como el valor: es un metadato y se pide con `DescribeParameters`. Si tu rol no lo tiene, ParamsX te avisa, el campo **no aparece** en el fichero y al cargar no se toca la descripción que haya en AWS.
278
+ - **Al actualizar un parámetro, AWS reescribe su definición entera.** Por eso ParamsX manda siempre la descripción del fichero cuando cambia el valor, aunque no la hayas tocado: si no la mandara, se perdería. Y como no existe una API para cambiar solo la descripción, editarla crea una versión nueva del parámetro igual que cambiar el valor.
279
+
280
+ Un cambio de descripción se ve en la pantalla de confirmación como `Modificado (descripción)`, y si cambias las dos cosas, `Modificado (valor | descripción)`.
281
+
282
+ ### Cifrado: `forzar_securestring`
283
+
284
+ ParamsX sube todo como **SecureString** por defecto, y así se recomienda dejarlo: los parámetros de una cuenta acaban teniendo secretos, y con esto no depende de que nadie se acuerde.
285
+
286
+ | `forzar_securestring` | Qué hace |
287
+ |---|---|
288
+ | `True` (por defecto) | Todo lo que se sube va cifrado como `SecureString`, sea del tipo que sea en AWS. |
289
+ | `False` | Se respeta el tipo que ya tuviera el parámetro (`String`, `StringList` o `SecureString`): al actualizar no se manda el tipo, y AWS conserva el suyo. El fichero exportado trae además un campo `parameter_type` que puedes editar si quieres cambiarlo a propósito, y ese cambio cuenta como uno más: verás `Modificado (tipo: SecureString)`. |
290
+
291
+ Los parámetros que creas con la opción 4 se crean siempre como `SecureString`, en los dos modos.
292
+
293
+ El tipo se lee de la misma llamada que el valor, así que **no hace falta ningún permiso extra** para esto (a diferencia de la descripción).
251
294
 
252
295
  ### Cómo acotar tu parameter_list (recomendación)
253
296
 
254
297
  `parameter_list` es solo tu vista de trabajo: **la seguridad real la impone IAM, no este fichero**. La recomendación de uso es:
255
298
 
256
- - **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "convencion": "min"}` → `/dev/rds`.
257
- - **Usuarios normales**: conviene acotar la ruta a lo que su rol IAM tiene realmente autorizado, por ejemplo `{"path": "/rds/cee-dev/api", "convencion": "min"}` → `/dev/rds/cee-dev/api`.
299
+ - **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "perfil": "min"}` → `/dev/rds`.
300
+ - **Usuarios normales**: conviene acotar la ruta a lo que su rol IAM tiene realmente autorizado, por ejemplo `{"path": "/rds/cee-dev/api", "perfil": "min"}` → `/dev/rds/cee-dev/api`.
258
301
 
259
302
  Si configuras una ruta más amplia que tus permisos, no pasa nada grave: ParamsX te avisará con un mensaje claro de acceso denegado en vez de una traza de boto3. Pero afinar la ruta te ahorra el error.
260
303
 
@@ -280,6 +323,7 @@ Formato del fichero exportado con `tags_activas = True`:
280
323
  ```python
281
324
  parametros = [
282
325
  {'parameter_name': '/dev/email/users',
326
+ 'parameter_description': "Buzon que recibe los avisos de altas",
283
327
  'parameter_value': """agpetrovici@stanalytics.es""",
284
328
  'tagApplication': "",
285
329
  'tagEnvironment': "",
@@ -363,7 +407,7 @@ El programa mostrará un menú donde Podrás:
363
407
  - Crear un parámetro nuevo.
364
408
 
365
409
  ### Leer Parámetros:
366
- 1. Selecciona la opción "Leer parámetros" en el menú. La lista muestra cada ruta con su perfil de naming, por ejemplo `/rds [min]` o `/API/STA [max]`.
410
+ 1. Selecciona la opción "Leer parámetros" en el menú. La lista muestra cada ruta con su perfil, por ejemplo `/rds [min]` o `/API/STA [max]`.
367
411
  2. Elige el prefijo y el entorno que deseas consultar.
368
412
  3. Los parámetros serán descargados y guardados en archivos como:
369
413
  - parameters_dev.py
@@ -384,7 +428,7 @@ El programa mostrará un menú donde Podrás:
384
428
 
385
429
  ### Crear un parámetro nuevo:
386
430
  1. Selecciona la opción "Crear nuevo parámetro" y elige el entorno.
387
- 2. Escribe la ruta **sin el entorno**, como en tu `parameter_list`: ParamsX le aplica el perfil de `convencion_nuevos` y te enseña la ruta resultante en AWS para que la confirmes.
431
+ 2. Escribe la ruta **sin el entorno**, como en tu `parameter_list`: ParamsX le aplica el perfil de `perfil_nuevos` y te enseña la ruta resultante en AWS para que la confirmes.
388
432
  3. Escribe el valor: texto plano o JSON en una línea.
389
433
  4. Rellena las tags obligatorias (si `tags_activas = True`). `Environment` viene precargada con el entorno elegido. Con `obligatorias_vacias = True` puedes dejar alguna en blanco pulsando Enter: esas no se crearán en AWS.
390
434
  5. Confirma en la pantalla de resumen. Si es un parámetro de RDS y falta su contraparte (común o privado), verás el aviso de correlación de naming ahí mismo.
@@ -0,0 +1 @@
1
+ __version__ = "2.3.0"