paramsx 2.2.1__tar.gz → 2.2.2__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.
- {paramsx-2.2.1 → paramsx-2.2.2}/CHANGELOG.md +17 -0
- {paramsx-2.2.1/paramsx.egg-info → paramsx-2.2.2}/PKG-INFO +22 -22
- {paramsx-2.2.1 → paramsx-2.2.2}/README.md +21 -21
- paramsx-2.2.2/paramsx/__init__.py +1 -0
- {paramsx-2.2.1 → paramsx-2.2.2}/paramsx/funcions.py +6 -6
- {paramsx-2.2.1 → paramsx-2.2.2}/paramsx/main.py +100 -58
- {paramsx-2.2.1 → paramsx-2.2.2}/paramsx/paramsx_config.py +10 -10
- {paramsx-2.2.1 → paramsx-2.2.2/paramsx.egg-info}/PKG-INFO +22 -22
- paramsx-2.2.1/paramsx/__init__.py +0 -1
- {paramsx-2.2.1 → paramsx-2.2.2}/LICENSE +0 -0
- {paramsx-2.2.1 → paramsx-2.2.2}/MANIFEST.in +0 -0
- {paramsx-2.2.1 → paramsx-2.2.2}/paramsx/text.py +0 -0
- {paramsx-2.2.1 → paramsx-2.2.2}/paramsx.egg-info/SOURCES.txt +0 -0
- {paramsx-2.2.1 → paramsx-2.2.2}/paramsx.egg-info/dependency_links.txt +0 -0
- {paramsx-2.2.1 → paramsx-2.2.2}/paramsx.egg-info/entry_points.txt +0 -0
- {paramsx-2.2.1 → paramsx-2.2.2}/paramsx.egg-info/requires.txt +0 -0
- {paramsx-2.2.1 → paramsx-2.2.2}/paramsx.egg-info/top_level.txt +0 -0
- {paramsx-2.2.1 → paramsx-2.2.2}/setup.cfg +0 -0
- {paramsx-2.2.1 → paramsx-2.2.2}/setup.py +0 -0
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.2.2
|
|
4
|
+
|
|
5
|
+
Un renombrado de la configuración, sin cambios de comportamiento. **Los nombres antiguos
|
|
6
|
+
se siguen aceptando**, así que no tienes que tocar tu fichero para actualizar.
|
|
7
|
+
|
|
8
|
+
### Cambiado
|
|
9
|
+
|
|
10
|
+
- **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:
|
|
11
|
+
|
|
12
|
+
| Antes | Ahora |
|
|
13
|
+
|---|---|
|
|
14
|
+
| `naming = {...}` | `perfiles = {...}` |
|
|
15
|
+
| `{"path": "/rds", "convencion": "min"}` | `{"path": "/rds", "perfil": "min"}` |
|
|
16
|
+
| `convencion_nuevos = "min"` | `perfil_nuevos = "min"` |
|
|
17
|
+
|
|
18
|
+
- `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.
|
|
19
|
+
|
|
3
20
|
## 2.2.1
|
|
4
21
|
|
|
5
22
|
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.
|
|
3
|
+
Version: 2.2.2
|
|
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
|
|
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:
|
|
@@ -97,10 +97,10 @@ 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
|
|
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
101
|
- 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
102
|
- Las tags obligatorias, si tienes `tags_activas = True`.
|
|
103
|
-
- El perfil que se usa es el que declares en `
|
|
103
|
+
- 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
104
|
- 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
105
|
- Tras crearlo aparecerá la próxima vez que leas la ruta correspondiente de tu `parameter_list`.
|
|
106
106
|
|
|
@@ -135,7 +135,7 @@ Ejemplo del contenido de paramsx_config.py:
|
|
|
135
135
|
```python
|
|
136
136
|
## Configuraciones ParamsX
|
|
137
137
|
|
|
138
|
-
# --- Perfiles
|
|
138
|
+
# --- Perfiles -------------------------------------------------------------
|
|
139
139
|
# Un perfil dice CÓMO se construye la ruta real en AWS a partir de la ruta que declaras
|
|
140
140
|
# en 'parameter_list' y del entorno que eliges en el menú. Los nombres son tuyos: define
|
|
141
141
|
# solo los que uses y llámalos como quieras. Un perfil tiene tres campos:
|
|
@@ -177,7 +177,7 @@ Ejemplo del contenido de paramsx_config.py:
|
|
|
177
177
|
# Combina los tres campos como necesites: no hay una lista cerrada de perfiles. En el
|
|
178
178
|
# README tienes más ejemplos.
|
|
179
179
|
|
|
180
|
-
|
|
180
|
+
perfiles = {
|
|
181
181
|
"min": {"posicion_entorno": "inicio", "case_entorno": "lower", "case_ruta": "lower"},
|
|
182
182
|
"max": {"posicion_entorno": "final", "case_entorno": "upper", "case_ruta": "ninguno"},
|
|
183
183
|
"mixto_max": {"posicion_entorno": "mixto", "case_entorno": "upper", "case_ruta": "ninguno"},
|
|
@@ -190,19 +190,19 @@ configuraciones = {
|
|
|
190
190
|
"region_name": "eu-south-2", # Cambiar por tu región de AWS
|
|
191
191
|
"entornos": ['dev', 'pre', 'prod'], # SIEMPRE en minúscula, es la lista canónica única
|
|
192
192
|
"parameter_list": [
|
|
193
|
-
{"path": "/common", "
|
|
194
|
-
{"path": "/rds", "
|
|
195
|
-
{"path": "/EMAIL", "
|
|
196
|
-
{"path": "/API/STA", "
|
|
193
|
+
{"path": "/common", "perfil": "min"}, # -> /dev/common
|
|
194
|
+
{"path": "/rds", "perfil": "min"}, # -> /dev/rds
|
|
195
|
+
{"path": "/EMAIL", "perfil": "max"}, # -> /EMAIL/DEV
|
|
196
|
+
{"path": "/API/STA", "perfil": "max"}, # -> /API/STA/DEV
|
|
197
197
|
# Con 'mixto' acotas por debajo del entorno: esto lee solo stan_ai, en vez de
|
|
198
198
|
# todo lo que cuelga de /API/MULTIAPI/DEV
|
|
199
|
-
{"path": "/API/MULTIAPI/*/stan_ai", "
|
|
199
|
+
{"path": "/API/MULTIAPI/*/stan_ai", "perfil": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
|
|
200
200
|
]
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
-
# Perfil
|
|
204
|
-
# Si no lo defines, se usa el
|
|
205
|
-
|
|
203
|
+
# Perfil que se usa al crear un parámetro nuevo (opción 4 del menú).
|
|
204
|
+
# Si no lo defines, se usa el primero de 'perfiles'.
|
|
205
|
+
perfil_nuevos = "min"
|
|
206
206
|
|
|
207
207
|
# ¿El nombre del fichero exportado incluye la ruta leída?
|
|
208
208
|
# False -> parameters_dev.py (comportamiento de siempre)
|
|
@@ -244,9 +244,9 @@ tags_obligatorias = [
|
|
|
244
244
|
```
|
|
245
245
|
Nota: Si el archivo paramsx_config.py ya existe, no será sobrescrito durante la instalación para proteger las configuraciones personalizadas.
|
|
246
246
|
|
|
247
|
-
### Los perfiles
|
|
247
|
+
### Los perfiles
|
|
248
248
|
|
|
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 `
|
|
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 `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
250
|
|
|
251
251
|
**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
252
|
|
|
@@ -266,15 +266,15 @@ En el nombre van el entorno, la ruta y el perfil, porque dos entradas pueden com
|
|
|
266
266
|
|
|
267
267
|
| Entrada | Fichero |
|
|
268
268
|
|---|---|
|
|
269
|
-
| `{"path": "/API/STA", "
|
|
270
|
-
| `{"path": "/API/*/STA", "
|
|
269
|
+
| `{"path": "/API/STA", "perfil": "max"}` | `parameters_dev__API_STA__max.py` |
|
|
270
|
+
| `{"path": "/API/*/STA", "perfil": "mixto_max"}` | `parameters_dev__API_env_STA__mixto_max.py` |
|
|
271
271
|
|
|
272
272
|
### Cómo acotar tu parameter_list (recomendación)
|
|
273
273
|
|
|
274
274
|
`parameter_list` es solo tu vista de trabajo: **la seguridad real la impone IAM, no este fichero**. La recomendación de uso es:
|
|
275
275
|
|
|
276
|
-
- **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "
|
|
277
|
-
- **Usuarios normales**: conviene acotar la ruta a lo que su rol IAM tiene realmente autorizado, por ejemplo `{"path": "/rds/cee-dev/api", "
|
|
276
|
+
- **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "perfil": "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", "perfil": "min"}` → `/dev/rds/cee-dev/api`.
|
|
278
278
|
|
|
279
279
|
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
280
|
|
|
@@ -383,7 +383,7 @@ El programa mostrará un menú donde Podrás:
|
|
|
383
383
|
- Crear un parámetro nuevo.
|
|
384
384
|
|
|
385
385
|
### Leer Parámetros:
|
|
386
|
-
1. Selecciona la opción "Leer parámetros" en el menú. La lista muestra cada ruta con su perfil
|
|
386
|
+
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
387
|
2. Elige el prefijo y el entorno que deseas consultar.
|
|
388
388
|
3. Los parámetros serán descargados y guardados en archivos como:
|
|
389
389
|
- parameters_dev.py
|
|
@@ -404,7 +404,7 @@ El programa mostrará un menú donde Podrás:
|
|
|
404
404
|
|
|
405
405
|
### Crear un parámetro nuevo:
|
|
406
406
|
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 `
|
|
407
|
+
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
408
|
3. Escribe el valor: texto plano o JSON en una línea.
|
|
409
409
|
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
410
|
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
|
|
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:
|
|
@@ -77,10 +77,10 @@ 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
|
|
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
81
|
- 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
82
|
- Las tags obligatorias, si tienes `tags_activas = True`.
|
|
83
|
-
- El perfil que se usa es el que declares en `
|
|
83
|
+
- 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
84
|
- 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
85
|
- Tras crearlo aparecerá la próxima vez que leas la ruta correspondiente de tu `parameter_list`.
|
|
86
86
|
|
|
@@ -115,7 +115,7 @@ Ejemplo del contenido de paramsx_config.py:
|
|
|
115
115
|
```python
|
|
116
116
|
## Configuraciones ParamsX
|
|
117
117
|
|
|
118
|
-
# --- Perfiles
|
|
118
|
+
# --- Perfiles -------------------------------------------------------------
|
|
119
119
|
# Un perfil dice CÓMO se construye la ruta real en AWS a partir de la ruta que declaras
|
|
120
120
|
# en 'parameter_list' y del entorno que eliges en el menú. Los nombres son tuyos: define
|
|
121
121
|
# solo los que uses y llámalos como quieras. Un perfil tiene tres campos:
|
|
@@ -157,7 +157,7 @@ Ejemplo del contenido de paramsx_config.py:
|
|
|
157
157
|
# Combina los tres campos como necesites: no hay una lista cerrada de perfiles. En el
|
|
158
158
|
# README tienes más ejemplos.
|
|
159
159
|
|
|
160
|
-
|
|
160
|
+
perfiles = {
|
|
161
161
|
"min": {"posicion_entorno": "inicio", "case_entorno": "lower", "case_ruta": "lower"},
|
|
162
162
|
"max": {"posicion_entorno": "final", "case_entorno": "upper", "case_ruta": "ninguno"},
|
|
163
163
|
"mixto_max": {"posicion_entorno": "mixto", "case_entorno": "upper", "case_ruta": "ninguno"},
|
|
@@ -170,19 +170,19 @@ configuraciones = {
|
|
|
170
170
|
"region_name": "eu-south-2", # Cambiar por tu región de AWS
|
|
171
171
|
"entornos": ['dev', 'pre', 'prod'], # SIEMPRE en minúscula, es la lista canónica única
|
|
172
172
|
"parameter_list": [
|
|
173
|
-
{"path": "/common", "
|
|
174
|
-
{"path": "/rds", "
|
|
175
|
-
{"path": "/EMAIL", "
|
|
176
|
-
{"path": "/API/STA", "
|
|
173
|
+
{"path": "/common", "perfil": "min"}, # -> /dev/common
|
|
174
|
+
{"path": "/rds", "perfil": "min"}, # -> /dev/rds
|
|
175
|
+
{"path": "/EMAIL", "perfil": "max"}, # -> /EMAIL/DEV
|
|
176
|
+
{"path": "/API/STA", "perfil": "max"}, # -> /API/STA/DEV
|
|
177
177
|
# Con 'mixto' acotas por debajo del entorno: esto lee solo stan_ai, en vez de
|
|
178
178
|
# todo lo que cuelga de /API/MULTIAPI/DEV
|
|
179
|
-
{"path": "/API/MULTIAPI/*/stan_ai", "
|
|
179
|
+
{"path": "/API/MULTIAPI/*/stan_ai", "perfil": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
|
|
180
180
|
]
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
-
# Perfil
|
|
184
|
-
# Si no lo defines, se usa el
|
|
185
|
-
|
|
183
|
+
# Perfil que se usa al crear un parámetro nuevo (opción 4 del menú).
|
|
184
|
+
# Si no lo defines, se usa el primero de 'perfiles'.
|
|
185
|
+
perfil_nuevos = "min"
|
|
186
186
|
|
|
187
187
|
# ¿El nombre del fichero exportado incluye la ruta leída?
|
|
188
188
|
# False -> parameters_dev.py (comportamiento de siempre)
|
|
@@ -224,9 +224,9 @@ tags_obligatorias = [
|
|
|
224
224
|
```
|
|
225
225
|
Nota: Si el archivo paramsx_config.py ya existe, no será sobrescrito durante la instalación para proteger las configuraciones personalizadas.
|
|
226
226
|
|
|
227
|
-
### Los perfiles
|
|
227
|
+
### Los perfiles
|
|
228
228
|
|
|
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 `
|
|
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 `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
230
|
|
|
231
231
|
**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
232
|
|
|
@@ -246,15 +246,15 @@ En el nombre van el entorno, la ruta y el perfil, porque dos entradas pueden com
|
|
|
246
246
|
|
|
247
247
|
| Entrada | Fichero |
|
|
248
248
|
|---|---|
|
|
249
|
-
| `{"path": "/API/STA", "
|
|
250
|
-
| `{"path": "/API/*/STA", "
|
|
249
|
+
| `{"path": "/API/STA", "perfil": "max"}` | `parameters_dev__API_STA__max.py` |
|
|
250
|
+
| `{"path": "/API/*/STA", "perfil": "mixto_max"}` | `parameters_dev__API_env_STA__mixto_max.py` |
|
|
251
251
|
|
|
252
252
|
### Cómo acotar tu parameter_list (recomendación)
|
|
253
253
|
|
|
254
254
|
`parameter_list` es solo tu vista de trabajo: **la seguridad real la impone IAM, no este fichero**. La recomendación de uso es:
|
|
255
255
|
|
|
256
|
-
- **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "
|
|
257
|
-
- **Usuarios normales**: conviene acotar la ruta a lo que su rol IAM tiene realmente autorizado, por ejemplo `{"path": "/rds/cee-dev/api", "
|
|
256
|
+
- **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "perfil": "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", "perfil": "min"}` → `/dev/rds/cee-dev/api`.
|
|
258
258
|
|
|
259
259
|
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
260
|
|
|
@@ -363,7 +363,7 @@ El programa mostrará un menú donde Podrás:
|
|
|
363
363
|
- Crear un parámetro nuevo.
|
|
364
364
|
|
|
365
365
|
### Leer Parámetros:
|
|
366
|
-
1. Selecciona la opción "Leer parámetros" en el menú. La lista muestra cada ruta con su perfil
|
|
366
|
+
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
367
|
2. Elige el prefijo y el entorno que deseas consultar.
|
|
368
368
|
3. Los parámetros serán descargados y guardados en archivos como:
|
|
369
369
|
- parameters_dev.py
|
|
@@ -384,7 +384,7 @@ El programa mostrará un menú donde Podrás:
|
|
|
384
384
|
|
|
385
385
|
### Crear un parámetro nuevo:
|
|
386
386
|
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 `
|
|
387
|
+
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
388
|
3. Escribe el valor: texto plano o JSON en una línea.
|
|
389
389
|
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
390
|
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.2.2"
|
|
@@ -30,7 +30,7 @@ def _codigo_error(error):
|
|
|
30
30
|
return error.response.get("Error", {}).get("Code", "")
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
# Valores admitidos en un perfil
|
|
33
|
+
# Valores admitidos en un perfil
|
|
34
34
|
POSICIONES_ENTORNO = ("inicio", "final", "mixto", "ninguno")
|
|
35
35
|
CASES_ENTORNO = ("lower", "upper", "capitalize")
|
|
36
36
|
CASES_RUTA = ("lower", "upper", "capitalize", "ninguno")
|
|
@@ -61,7 +61,7 @@ def aplicar_case_ruta(path, case_ruta):
|
|
|
61
61
|
return path
|
|
62
62
|
|
|
63
63
|
|
|
64
|
-
# Construir la ruta completa aplicando el perfil de
|
|
64
|
+
# Construir la ruta completa aplicando el perfil de la entrada.
|
|
65
65
|
# Las tres posiciones son la misma operación: se normaliza la ruta a una plantilla con
|
|
66
66
|
# un único marcador y se sustituye por el entorno. "ninguno" no lleva marcador.
|
|
67
67
|
def build_full_path(path, perfil, entorno):
|
|
@@ -96,20 +96,20 @@ def build_full_path(path, perfil, entorno):
|
|
|
96
96
|
|
|
97
97
|
|
|
98
98
|
# Trozo de nombre de fichero derivado de una entrada de parameter_list:
|
|
99
|
-
# {"path": "/API/*/STA", "
|
|
99
|
+
# {"path": "/API/*/STA", "perfil": "mixto_max"} -> API_env_STA__mixto_max
|
|
100
100
|
# Lleva la posición del marcador y el perfil porque dos entradas distintas pueden
|
|
101
101
|
# compartir la ruta declarada (con perfiles distintos, o con el entorno en otro sitio)
|
|
102
102
|
# y apuntar a rutas de AWS diferentes: sus ficheros no se pueden pisar.
|
|
103
103
|
def slug_entrada(entrada):
|
|
104
104
|
segmentos = [s for s in entrada["path"].strip("/").split("/") if s]
|
|
105
105
|
ruta = "_".join("env" if s == MARCADOR_ENTORNO else s for s in segmentos)
|
|
106
|
-
|
|
107
|
-
return f"{ruta}__{
|
|
106
|
+
perfil = entrada.get("perfil")
|
|
107
|
+
return f"{ruta}__{perfil}" if perfil else ruta
|
|
108
108
|
|
|
109
109
|
|
|
110
110
|
# Etiqueta legible de una entrada de parameter_list para los menús
|
|
111
111
|
def etiqueta_entrada(entrada):
|
|
112
|
-
return f"{entrada['path']} [{entrada['
|
|
112
|
+
return f"{entrada['path']} [{entrada['perfil']}]"
|
|
113
113
|
|
|
114
114
|
|
|
115
115
|
# Ficheros exportados que hay en el directorio actual listos para cargar: los que
|
|
@@ -31,17 +31,17 @@ PLANTILLA_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "param
|
|
|
31
31
|
MENSAJE_MIGRACION = """BREAKING CHANGE en la configuración de ParamsX
|
|
32
32
|
------------------------------------------------
|
|
33
33
|
'parameter_list' ya no es una lista de strings: ahora cada entrada es un diccionario
|
|
34
|
-
que declara qué perfil
|
|
34
|
+
que declara qué perfil usa. Edita a mano ~/.xsoft/paramsx_config.py:
|
|
35
35
|
|
|
36
36
|
"entornos": ['dev', 'pre', 'prod'], # SIEMPRE en minúscula
|
|
37
37
|
"parameter_list": [
|
|
38
|
-
{"path": "/common", "
|
|
39
|
-
{"path": "/rds", "
|
|
40
|
-
{"path": "/EMAIL", "
|
|
41
|
-
{"path": "/API/STA", "
|
|
38
|
+
{"path": "/common", "perfil": "min"}, # /common + dev -> /dev/common
|
|
39
|
+
{"path": "/rds", "perfil": "min"}, # /rds + dev -> /dev/rds
|
|
40
|
+
{"path": "/EMAIL", "perfil": "max"}, # /EMAIL + dev -> /EMAIL/DEV
|
|
41
|
+
{"path": "/API/STA", "perfil": "max"}, # /API/STA + dev -> /API/STA/DEV
|
|
42
42
|
]
|
|
43
43
|
|
|
44
|
-
Los perfiles se definen en el diccionario '
|
|
44
|
+
Los perfiles se definen en el diccionario 'perfiles' del mismo fichero, con la posición
|
|
45
45
|
y el case del entorno. 'min' y 'max' vienen predefinidos en la plantilla.
|
|
46
46
|
|
|
47
47
|
Ya no existe 'entornos_old': el entorno se escribe a partir de la lista 'entornos',
|
|
@@ -51,10 +51,18 @@ que va siempre en minúscula, aplicándole el 'case_entorno' del perfil."""
|
|
|
51
51
|
# Opciones que viven fuera de 'configuraciones' y son opcionales: si el usuario no las
|
|
52
52
|
# tiene, se usa el valor de la plantilla. Se listan para poder decirle qué le falta.
|
|
53
53
|
CLAVES_OPCIONALES = (
|
|
54
|
-
"
|
|
54
|
+
"perfiles", "perfil_nuevos", "fichero_por_ruta",
|
|
55
55
|
"tags_activas", "obligatorias_vacias", "tags_obligatorias",
|
|
56
56
|
)
|
|
57
57
|
|
|
58
|
+
# Nombres antiguos que se siguen aceptando -> nombre actual. Se traducen al cargar, así
|
|
59
|
+
# que dentro del código solo existe el nombre nuevo.
|
|
60
|
+
NOMBRES_ANTIGUOS = {
|
|
61
|
+
"naming": "perfiles", # 2.2.0
|
|
62
|
+
"convencion_nuevos": "perfil_nuevos", # 2.2.0
|
|
63
|
+
"abac": "tags_activas", # 2.0.0 y 2.1.0
|
|
64
|
+
}
|
|
65
|
+
|
|
58
66
|
|
|
59
67
|
# Ejecutar el fichero de configuración del usuario y devolver el módulo resultante
|
|
60
68
|
def cargar_modulo_config():
|
|
@@ -73,7 +81,10 @@ def load_config():
|
|
|
73
81
|
config = dict(modulo.configuraciones)
|
|
74
82
|
# Todo lo que va fuera de 'configuraciones' es opcional en el fichero del usuario:
|
|
75
83
|
# si no está, se usa el valor de la plantilla que trae el paquete.
|
|
76
|
-
|
|
84
|
+
# 'naming' es el nombre que tuvo 'perfiles' en la 2.2.0
|
|
85
|
+
config["perfiles"] = dict(
|
|
86
|
+
getattr(modulo, "perfiles", getattr(modulo, "naming", plantilla_config.perfiles))
|
|
87
|
+
)
|
|
77
88
|
# 'abac' es el nombre antiguo (2.0/2.1) de 'tags_activas': se sigue aceptando.
|
|
78
89
|
config["tags_activas"] = bool(
|
|
79
90
|
getattr(modulo, "tags_activas", getattr(modulo, "abac", plantilla_config.tags_activas))
|
|
@@ -88,8 +99,13 @@ def load_config():
|
|
|
88
99
|
getattr(modulo, "fichero_por_ruta", plantilla_config.fichero_por_ruta)
|
|
89
100
|
)
|
|
90
101
|
# Si no se declara, los parámetros nuevos usan el primer perfil definido
|
|
91
|
-
|
|
92
|
-
|
|
102
|
+
# ('convencion_nuevos' es el nombre que tuvo en la 2.2.0)
|
|
103
|
+
primer_perfil = next(iter(config["perfiles"]), None)
|
|
104
|
+
config["perfil_nuevos"] = (
|
|
105
|
+
getattr(modulo, "perfil_nuevos", None)
|
|
106
|
+
or getattr(modulo, "convencion_nuevos", None)
|
|
107
|
+
or primer_perfil
|
|
108
|
+
)
|
|
93
109
|
return config
|
|
94
110
|
|
|
95
111
|
|
|
@@ -112,21 +128,21 @@ def validate_config(config):
|
|
|
112
128
|
elif "entornos" in config:
|
|
113
129
|
errores.append("'entornos' debe ser una lista no vacía de entornos en minúscula.")
|
|
114
130
|
|
|
115
|
-
|
|
116
|
-
if not isinstance(
|
|
131
|
+
perfiles = config.get("perfiles")
|
|
132
|
+
if not isinstance(perfiles, dict) or not perfiles:
|
|
117
133
|
errores.append(
|
|
118
|
-
"'
|
|
134
|
+
"'perfiles' debe ser un diccionario con al menos un perfil "
|
|
119
135
|
"(ver la plantilla en el propio fichero de configuración)."
|
|
120
136
|
)
|
|
121
|
-
|
|
137
|
+
perfiles = {}
|
|
122
138
|
else:
|
|
123
|
-
errores.extend(
|
|
139
|
+
errores.extend(validar_perfiles(perfiles))
|
|
124
140
|
|
|
125
|
-
|
|
126
|
-
if
|
|
141
|
+
perfil_nuevos = config.get("perfil_nuevos")
|
|
142
|
+
if perfiles and perfil_nuevos not in perfiles:
|
|
127
143
|
errores.append(
|
|
128
|
-
f"'
|
|
129
|
-
f"Perfiles definidos en '
|
|
144
|
+
f"'perfil_nuevos' apunta a un perfil que no existe: {perfil_nuevos!r}. "
|
|
145
|
+
f"Perfiles definidos en 'perfiles': {', '.join(sorted(perfiles))}."
|
|
130
146
|
)
|
|
131
147
|
|
|
132
148
|
parameter_list = config.get("parameter_list")
|
|
@@ -144,26 +160,26 @@ def validate_config(config):
|
|
|
144
160
|
errores.append(f"Entrada inválida en parameter_list: {entrada!r}")
|
|
145
161
|
continue
|
|
146
162
|
path = entrada.get("path")
|
|
147
|
-
|
|
163
|
+
nombre_perfil = perfil_de(entrada)
|
|
148
164
|
if not isinstance(path, str) or not path.strip("/"):
|
|
149
165
|
errores.append(f"'path' inválido o vacío en parameter_list: {entrada!r}")
|
|
150
166
|
continue
|
|
151
167
|
if not path.startswith("/"):
|
|
152
168
|
errores.append(f"El 'path' debe empezar por '/': {path!r}")
|
|
153
|
-
if
|
|
169
|
+
if nombre_perfil not in perfiles:
|
|
154
170
|
errores.append(
|
|
155
|
-
f"'
|
|
156
|
-
f"Perfiles definidos en '
|
|
171
|
+
f"'perfil' inválido en {path!r}: {nombre_perfil!r}. "
|
|
172
|
+
f"Perfiles definidos en 'perfiles': {', '.join(sorted(perfiles)) or '(ninguno)'}."
|
|
157
173
|
)
|
|
158
174
|
continue
|
|
159
|
-
errores.extend(validar_marcador(path,
|
|
175
|
+
errores.extend(validar_marcador(path, nombre_perfil, perfiles[nombre_perfil]))
|
|
160
176
|
|
|
161
177
|
# Dos entradas que resuelvan a la misma ruta no rompen nada, pero duplican trabajo
|
|
162
178
|
# y confunden en el menú, así que se avisa.
|
|
163
179
|
vistas = {}
|
|
164
180
|
entornos_muestra = config.get("entornos") or ["dev"]
|
|
165
181
|
for entrada in parameter_list:
|
|
166
|
-
perfil =
|
|
182
|
+
perfil = perfiles.get(perfil_de(entrada)) if isinstance(entrada, dict) else None
|
|
167
183
|
if not isinstance(perfil, dict):
|
|
168
184
|
continue
|
|
169
185
|
try:
|
|
@@ -181,12 +197,20 @@ def validate_config(config):
|
|
|
181
197
|
return errores, avisos
|
|
182
198
|
|
|
183
199
|
|
|
184
|
-
#
|
|
185
|
-
|
|
200
|
+
# Nombre del perfil que usa una entrada. 'convencion' es el nombre que tuvo esta clave
|
|
201
|
+
# en la 2.0, la 2.1 y la 2.2.0, y se sigue aceptando.
|
|
202
|
+
def perfil_de(entrada):
|
|
203
|
+
if not isinstance(entrada, dict):
|
|
204
|
+
return None
|
|
205
|
+
return entrada.get("perfil", entrada.get("convencion"))
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
# Validar los perfiles. Devuelve la lista de errores.
|
|
209
|
+
def validar_perfiles(perfiles):
|
|
186
210
|
errores = []
|
|
187
|
-
for nombre, perfil in
|
|
211
|
+
for nombre, perfil in perfiles.items():
|
|
188
212
|
if not isinstance(perfil, dict):
|
|
189
|
-
errores.append(f"El perfil
|
|
213
|
+
errores.append(f"El perfil {nombre!r} debe ser un diccionario.")
|
|
190
214
|
continue
|
|
191
215
|
|
|
192
216
|
posicion = perfil.get("posicion_entorno")
|
|
@@ -215,7 +239,7 @@ def validar_naming(naming):
|
|
|
215
239
|
|
|
216
240
|
# El marcador '*' y la posición del perfil tienen que contar la misma historia: si no,
|
|
217
241
|
# la ruta se construye mal y SSM devuelve cero parámetros sin decir por qué.
|
|
218
|
-
def validar_marcador(path,
|
|
242
|
+
def validar_marcador(path, nombre_perfil, perfil):
|
|
219
243
|
segmentos = [s for s in path.strip("/").split("/") if s]
|
|
220
244
|
marcadores = segmentos.count(MARCADOR_ENTORNO)
|
|
221
245
|
posicion = perfil.get("posicion_entorno")
|
|
@@ -228,14 +252,14 @@ def validar_marcador(path, convencion, perfil):
|
|
|
228
252
|
|
|
229
253
|
if posicion == "mixto" and marcadores != 1:
|
|
230
254
|
return [
|
|
231
|
-
f"La ruta {path!r} usa el perfil {
|
|
255
|
+
f"La ruta {path!r} usa el perfil {nombre_perfil!r} ('mixto') y debe llevar "
|
|
232
256
|
f"exactamente un '{MARCADOR_ENTORNO}' que marque dónde va el entorno "
|
|
233
257
|
f"(tiene {marcadores})."
|
|
234
258
|
]
|
|
235
259
|
|
|
236
260
|
if posicion != "mixto" and marcadores:
|
|
237
261
|
return [
|
|
238
|
-
f"La ruta {path!r} lleva un '{MARCADOR_ENTORNO}' pero su perfil {
|
|
262
|
+
f"La ruta {path!r} lleva un '{MARCADOR_ENTORNO}' pero su perfil {nombre_perfil!r} "
|
|
239
263
|
f"tiene posicion_entorno='{posicion}', que ya decide dónde va el entorno. "
|
|
240
264
|
"Usa un perfil 'mixto' o quita el marcador."
|
|
241
265
|
]
|
|
@@ -246,8 +270,10 @@ def validar_marcador(path, convencion, perfil):
|
|
|
246
270
|
# Normalizar la configuración ya validada
|
|
247
271
|
def normalize_config(config):
|
|
248
272
|
config["entornos"] = [str(e).lower() for e in config["entornos"]]
|
|
273
|
+
# Se normaliza la clave del perfil: aunque el usuario haya escrito 'convencion',
|
|
274
|
+
# dentro del programa las entradas solo tienen 'perfil'.
|
|
249
275
|
config["parameter_list"] = [
|
|
250
|
-
{"path": "/" + entrada["path"].strip("/"), "
|
|
276
|
+
{"path": "/" + entrada["path"].strip("/"), "perfil": perfil_de(entrada)}
|
|
251
277
|
for entrada in config["parameter_list"]
|
|
252
278
|
]
|
|
253
279
|
return config
|
|
@@ -282,8 +308,8 @@ def leer_ruta(stdscr, ssm, full_path, tags_activas, tags_obligatorias):
|
|
|
282
308
|
return parameters, avisos
|
|
283
309
|
|
|
284
310
|
|
|
285
|
-
# Feature 2: crear un parámetro nuevo con el perfil
|
|
286
|
-
def crear_parametro(stdscr, ssm, entornos, perfil,
|
|
311
|
+
# Feature 2: crear un parámetro nuevo con el perfil declarado en 'perfil_nuevos'
|
|
312
|
+
def crear_parametro(stdscr, ssm, entornos, perfil, nombre_perfil, tags_activas,
|
|
287
313
|
tags_obligatorias, obligatorias_vacias=False):
|
|
288
314
|
env_choice = show_environment_selection(stdscr, entornos)
|
|
289
315
|
if env_choice is None:
|
|
@@ -309,7 +335,7 @@ def crear_parametro(stdscr, ssm, entornos, perfil, convencion, tags_activas,
|
|
|
309
335
|
path = prompt_input(
|
|
310
336
|
stdscr,
|
|
311
337
|
"Crear nuevo parámetro (1/4): ruta",
|
|
312
|
-
f"Ruta del parámetro (
|
|
338
|
+
f"Ruta del parámetro (perfil '{nombre_perfil}', sin el entorno):",
|
|
313
339
|
valor=path,
|
|
314
340
|
ayuda=ayudas.get(posicion, ""),
|
|
315
341
|
)
|
|
@@ -323,7 +349,7 @@ def crear_parametro(stdscr, ssm, entornos, perfil, convencion, tags_activas,
|
|
|
323
349
|
show_message(stdscr, "La ruta no puede estar vacía.", 2)
|
|
324
350
|
continue
|
|
325
351
|
|
|
326
|
-
problemas = validar_marcador(path,
|
|
352
|
+
problemas = validar_marcador(path, nombre_perfil, perfil)
|
|
327
353
|
if problemas:
|
|
328
354
|
show_message(stdscr, problemas[0], 2)
|
|
329
355
|
continue
|
|
@@ -335,7 +361,7 @@ def crear_parametro(stdscr, ssm, entornos, perfil, convencion, tags_activas,
|
|
|
335
361
|
|
|
336
362
|
if not show_report(
|
|
337
363
|
stdscr, "Crear nuevo parámetro (2/4): confirmar la ruta",
|
|
338
|
-
[f"
|
|
364
|
+
[f"Perfil: {nombre_perfil}",
|
|
339
365
|
f"Escrita: {path_declarado}",
|
|
340
366
|
f"En AWS: {path}",
|
|
341
367
|
"",
|
|
@@ -481,12 +507,12 @@ def main(stdscr, config=None):
|
|
|
481
507
|
|
|
482
508
|
environments = config['entornos']
|
|
483
509
|
PARAMETER_LIST = config['parameter_list']
|
|
484
|
-
|
|
510
|
+
PERFILES = config['perfiles']
|
|
485
511
|
TAGS_ACTIVAS = config['tags_activas']
|
|
486
512
|
TAGS_OBLIGATORIAS = config['tags_obligatorias']
|
|
487
513
|
OBLIGATORIAS_VACIAS = config.get('obligatorias_vacias', False)
|
|
488
514
|
FICHERO_POR_RUTA = config.get('fichero_por_ruta', False)
|
|
489
|
-
|
|
515
|
+
PERFIL_NUEVOS = config.get('perfil_nuevos')
|
|
490
516
|
|
|
491
517
|
# Nombre del fichero exportado: con fichero_por_ruta cada ruta tiene el suyo, así que
|
|
492
518
|
# leer una segunda ruta del mismo entorno no machaca lo que estabas editando.
|
|
@@ -512,9 +538,9 @@ def main(stdscr, config=None):
|
|
|
512
538
|
|
|
513
539
|
selected_env = environments[env_choice]
|
|
514
540
|
|
|
515
|
-
# Crear el prefijo completo según el perfil de
|
|
541
|
+
# Crear el prefijo completo según el perfil de la entrada
|
|
516
542
|
full_path = build_full_path(
|
|
517
|
-
selected_param["path"],
|
|
543
|
+
selected_param["path"], PERFILES[selected_param["perfil"]], selected_env
|
|
518
544
|
)
|
|
519
545
|
show_message(stdscr, f"Buscando parámetros en: {full_path}...", 3) # Mensaje inicial
|
|
520
546
|
|
|
@@ -727,7 +753,7 @@ def main(stdscr, config=None):
|
|
|
727
753
|
for entrada in PARAMETER_LIST:
|
|
728
754
|
for env in environments:
|
|
729
755
|
full_path = build_full_path(
|
|
730
|
-
entrada["path"],
|
|
756
|
+
entrada["path"], PERFILES[entrada["perfil"]], env
|
|
731
757
|
)
|
|
732
758
|
try:
|
|
733
759
|
# Obtener parámetros desde AWS SSM
|
|
@@ -791,9 +817,9 @@ def main(stdscr, config=None):
|
|
|
791
817
|
|
|
792
818
|
selected_env = environments[env_choice]
|
|
793
819
|
|
|
794
|
-
# Crear el prefijo completo según el perfil de
|
|
820
|
+
# Crear el prefijo completo según el perfil de la entrada
|
|
795
821
|
full_path = build_full_path(
|
|
796
|
-
selected_param["path"],
|
|
822
|
+
selected_param["path"], PERFILES[selected_param["perfil"]], selected_env
|
|
797
823
|
)
|
|
798
824
|
|
|
799
825
|
parameters, avisos = leer_ruta(stdscr, ssm, full_path, TAGS_ACTIVAS, TAGS_OBLIGATORIAS)
|
|
@@ -818,9 +844,9 @@ def main(stdscr, config=None):
|
|
|
818
844
|
show_report(stdscr, "Backup creado", lineas, color_pair=3)
|
|
819
845
|
|
|
820
846
|
elif choice == 4:
|
|
821
|
-
# Crear nuevo parámetro con el perfil declarado en '
|
|
847
|
+
# Crear nuevo parámetro con el perfil declarado en 'perfil_nuevos'
|
|
822
848
|
crear_parametro(
|
|
823
|
-
stdscr, ssm, environments,
|
|
849
|
+
stdscr, ssm, environments, PERFILES[PERFIL_NUEVOS], PERFIL_NUEVOS,
|
|
824
850
|
TAGS_ACTIVAS, TAGS_OBLIGATORIAS, OBLIGATORIAS_VACIAS
|
|
825
851
|
)
|
|
826
852
|
|
|
@@ -856,7 +882,7 @@ def create_config(escribir_ejemplo=False):
|
|
|
856
882
|
print(" paramsx configure --ejemplo")
|
|
857
883
|
|
|
858
884
|
|
|
859
|
-
# Valor por defecto en una línea: el repr de '
|
|
885
|
+
# Valor por defecto en una línea: el repr de 'perfiles' o de las tags ocupa media pantalla
|
|
860
886
|
def resumir_valor(valor):
|
|
861
887
|
if isinstance(valor, dict):
|
|
862
888
|
return f"{len(valor)} perfiles ({', '.join(valor)})"
|
|
@@ -878,11 +904,27 @@ def revisar_config(config_file):
|
|
|
878
904
|
return
|
|
879
905
|
|
|
880
906
|
faltan = [clave for clave in CLAVES_OPCIONALES if not hasattr(modulo, clave)]
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
907
|
+
|
|
908
|
+
# Los nombres antiguos siguen funcionando, así que lo que cubren no "falta":
|
|
909
|
+
# solo se avisa de que hay una forma más clara de escribirlo.
|
|
910
|
+
antiguos = [(v, n) for v, n in NOMBRES_ANTIGUOS.items() if hasattr(modulo, v)]
|
|
911
|
+
lista = getattr(modulo, "configuraciones", {})
|
|
912
|
+
lista = lista.get("parameter_list", []) if isinstance(lista, dict) else []
|
|
913
|
+
con_convencion = [
|
|
914
|
+
e for e in lista
|
|
915
|
+
if isinstance(e, dict) and "perfil" not in e and "convencion" in e
|
|
916
|
+
]
|
|
917
|
+
|
|
918
|
+
if antiguos or con_convencion:
|
|
919
|
+
print("Nombres antiguos que sigues usando. Funcionan, pero el nuevo se entiende mejor:")
|
|
920
|
+
for viejo, nuevo in antiguos:
|
|
921
|
+
if nuevo in faltan:
|
|
922
|
+
faltan.remove(nuevo)
|
|
923
|
+
print(f" {viejo:20} -> {nuevo}")
|
|
924
|
+
if con_convencion:
|
|
925
|
+
print(f" {'convencion':20} -> perfil "
|
|
926
|
+
f"(en {len(con_convencion)} entrada(s) de parameter_list)")
|
|
927
|
+
print()
|
|
886
928
|
|
|
887
929
|
if faltan:
|
|
888
930
|
print("Opciones que no tienes y que ParamsX rellena con el valor por defecto:")
|
|
@@ -943,14 +985,14 @@ Opciones del menú:
|
|
|
943
985
|
2. Cargar parámetros Elige uno de los ficheros exportados que tengas en el
|
|
944
986
|
directorio, compara y aplica los cambios en AWS.
|
|
945
987
|
3. Crear Backup de parámetros Respalda una ruta, la lista completa o toda la cuenta.
|
|
946
|
-
4. Crear nuevo parámetro Crea un parámetro nuevo con el perfil '
|
|
988
|
+
4. Crear nuevo parámetro Crea un parámetro nuevo con el perfil de 'perfil_nuevos'.
|
|
947
989
|
|
|
948
990
|
Configuración (~/.xsoft/paramsx_config.py). El fichero trae comentada cada opción:
|
|
949
991
|
profile_name Perfil de ~/.aws/credentials.
|
|
950
992
|
region_name Región de AWS.
|
|
951
993
|
entornos Lista de entornos, SIEMPRE en minúscula: ['dev', 'pre', 'prod'].
|
|
952
|
-
Cada perfil
|
|
953
|
-
|
|
994
|
+
Cada perfil decide cómo se escriben en la ruta.
|
|
995
|
+
perfiles Cómo se construye la ruta real en AWS. Los
|
|
954
996
|
nombres los eliges tú y combinas estos tres campos:
|
|
955
997
|
posicion_entorno 'inicio' /rds -> /dev/rds
|
|
956
998
|
'final' /API/STA -> /API/STA/DEV
|
|
@@ -959,8 +1001,8 @@ Configuración (~/.xsoft/paramsx_config.py). El fichero trae comentada cada opci
|
|
|
959
1001
|
case_entorno 'lower' | 'upper' | 'capitalize'
|
|
960
1002
|
case_ruta 'lower' | 'upper' | 'capitalize' | 'ninguno'
|
|
961
1003
|
(solo al crear parámetros, opción 4)
|
|
962
|
-
parameter_list Lista de dicts {"path": "/rds", "
|
|
963
|
-
|
|
1004
|
+
parameter_list Lista de dicts {"path": "/rds", "perfil": "<nombre de un perfil>"}.
|
|
1005
|
+
perfil_nuevos Perfil que usan los parámetros creados con la opción 4.
|
|
964
1006
|
fichero_por_ruta True -> el fichero exportado lleva entorno, ruta y perfil en el
|
|
965
1007
|
nombre, para que leer otra ruta del mismo entorno no machaque la
|
|
966
1008
|
anterior: parameters_dev__API_STA__max.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## Configuraciones ParamsX
|
|
2
2
|
|
|
3
|
-
# --- Perfiles
|
|
3
|
+
# --- Perfiles -------------------------------------------------------------
|
|
4
4
|
# Un perfil dice CÓMO se construye la ruta real en AWS a partir de la ruta que declaras
|
|
5
5
|
# en 'parameter_list' y del entorno que eliges en el menú. Los nombres son tuyos: define
|
|
6
6
|
# solo los que uses y llámalos como quieras. Un perfil tiene tres campos:
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
# Combina los tres campos como necesites: no hay una lista cerrada de perfiles. En el
|
|
43
43
|
# README tienes más ejemplos.
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
perfiles = {
|
|
46
46
|
"min": {"posicion_entorno": "inicio", "case_entorno": "lower", "case_ruta": "lower"},
|
|
47
47
|
"max": {"posicion_entorno": "final", "case_entorno": "upper", "case_ruta": "ninguno"},
|
|
48
48
|
"mixto_max": {"posicion_entorno": "mixto", "case_entorno": "upper", "case_ruta": "ninguno"},
|
|
@@ -55,19 +55,19 @@ configuraciones = {
|
|
|
55
55
|
"region_name": "eu-south-2", # Cambiar por tu región de AWS
|
|
56
56
|
"entornos": ['dev', 'pre', 'prod'], # SIEMPRE en minúscula, es la lista canónica única
|
|
57
57
|
"parameter_list": [
|
|
58
|
-
{"path": "/common", "
|
|
59
|
-
{"path": "/rds", "
|
|
60
|
-
{"path": "/EMAIL", "
|
|
61
|
-
{"path": "/API/STA", "
|
|
58
|
+
{"path": "/common", "perfil": "min"}, # -> /dev/common
|
|
59
|
+
{"path": "/rds", "perfil": "min"}, # -> /dev/rds
|
|
60
|
+
{"path": "/EMAIL", "perfil": "max"}, # -> /EMAIL/DEV
|
|
61
|
+
{"path": "/API/STA", "perfil": "max"}, # -> /API/STA/DEV
|
|
62
62
|
# Con 'mixto' acotas por debajo del entorno: esto lee solo stan_ai, en vez de
|
|
63
63
|
# todo lo que cuelga de /API/MULTIAPI/DEV
|
|
64
|
-
{"path": "/API/MULTIAPI/*/stan_ai", "
|
|
64
|
+
{"path": "/API/MULTIAPI/*/stan_ai", "perfil": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
|
|
65
65
|
]
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
# Perfil
|
|
69
|
-
# Si no lo defines, se usa el
|
|
70
|
-
|
|
68
|
+
# Perfil que se usa al crear un parámetro nuevo (opción 4 del menú).
|
|
69
|
+
# Si no lo defines, se usa el primero de 'perfiles'.
|
|
70
|
+
perfil_nuevos = "min"
|
|
71
71
|
|
|
72
72
|
# ¿El nombre del fichero exportado incluye la ruta leída?
|
|
73
73
|
# False -> parameters_dev.py (comportamiento de siempre)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: paramsx
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.2
|
|
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
|
|
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:
|
|
@@ -97,10 +97,10 @@ 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
|
|
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
101
|
- 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
102
|
- Las tags obligatorias, si tienes `tags_activas = True`.
|
|
103
|
-
- El perfil que se usa es el que declares en `
|
|
103
|
+
- 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
104
|
- 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
105
|
- Tras crearlo aparecerá la próxima vez que leas la ruta correspondiente de tu `parameter_list`.
|
|
106
106
|
|
|
@@ -135,7 +135,7 @@ Ejemplo del contenido de paramsx_config.py:
|
|
|
135
135
|
```python
|
|
136
136
|
## Configuraciones ParamsX
|
|
137
137
|
|
|
138
|
-
# --- Perfiles
|
|
138
|
+
# --- Perfiles -------------------------------------------------------------
|
|
139
139
|
# Un perfil dice CÓMO se construye la ruta real en AWS a partir de la ruta que declaras
|
|
140
140
|
# en 'parameter_list' y del entorno que eliges en el menú. Los nombres son tuyos: define
|
|
141
141
|
# solo los que uses y llámalos como quieras. Un perfil tiene tres campos:
|
|
@@ -177,7 +177,7 @@ Ejemplo del contenido de paramsx_config.py:
|
|
|
177
177
|
# Combina los tres campos como necesites: no hay una lista cerrada de perfiles. En el
|
|
178
178
|
# README tienes más ejemplos.
|
|
179
179
|
|
|
180
|
-
|
|
180
|
+
perfiles = {
|
|
181
181
|
"min": {"posicion_entorno": "inicio", "case_entorno": "lower", "case_ruta": "lower"},
|
|
182
182
|
"max": {"posicion_entorno": "final", "case_entorno": "upper", "case_ruta": "ninguno"},
|
|
183
183
|
"mixto_max": {"posicion_entorno": "mixto", "case_entorno": "upper", "case_ruta": "ninguno"},
|
|
@@ -190,19 +190,19 @@ configuraciones = {
|
|
|
190
190
|
"region_name": "eu-south-2", # Cambiar por tu región de AWS
|
|
191
191
|
"entornos": ['dev', 'pre', 'prod'], # SIEMPRE en minúscula, es la lista canónica única
|
|
192
192
|
"parameter_list": [
|
|
193
|
-
{"path": "/common", "
|
|
194
|
-
{"path": "/rds", "
|
|
195
|
-
{"path": "/EMAIL", "
|
|
196
|
-
{"path": "/API/STA", "
|
|
193
|
+
{"path": "/common", "perfil": "min"}, # -> /dev/common
|
|
194
|
+
{"path": "/rds", "perfil": "min"}, # -> /dev/rds
|
|
195
|
+
{"path": "/EMAIL", "perfil": "max"}, # -> /EMAIL/DEV
|
|
196
|
+
{"path": "/API/STA", "perfil": "max"}, # -> /API/STA/DEV
|
|
197
197
|
# Con 'mixto' acotas por debajo del entorno: esto lee solo stan_ai, en vez de
|
|
198
198
|
# todo lo que cuelga de /API/MULTIAPI/DEV
|
|
199
|
-
{"path": "/API/MULTIAPI/*/stan_ai", "
|
|
199
|
+
{"path": "/API/MULTIAPI/*/stan_ai", "perfil": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
|
|
200
200
|
]
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
-
# Perfil
|
|
204
|
-
# Si no lo defines, se usa el
|
|
205
|
-
|
|
203
|
+
# Perfil que se usa al crear un parámetro nuevo (opción 4 del menú).
|
|
204
|
+
# Si no lo defines, se usa el primero de 'perfiles'.
|
|
205
|
+
perfil_nuevos = "min"
|
|
206
206
|
|
|
207
207
|
# ¿El nombre del fichero exportado incluye la ruta leída?
|
|
208
208
|
# False -> parameters_dev.py (comportamiento de siempre)
|
|
@@ -244,9 +244,9 @@ tags_obligatorias = [
|
|
|
244
244
|
```
|
|
245
245
|
Nota: Si el archivo paramsx_config.py ya existe, no será sobrescrito durante la instalación para proteger las configuraciones personalizadas.
|
|
246
246
|
|
|
247
|
-
### Los perfiles
|
|
247
|
+
### Los perfiles
|
|
248
248
|
|
|
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 `
|
|
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 `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
250
|
|
|
251
251
|
**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
252
|
|
|
@@ -266,15 +266,15 @@ En el nombre van el entorno, la ruta y el perfil, porque dos entradas pueden com
|
|
|
266
266
|
|
|
267
267
|
| Entrada | Fichero |
|
|
268
268
|
|---|---|
|
|
269
|
-
| `{"path": "/API/STA", "
|
|
270
|
-
| `{"path": "/API/*/STA", "
|
|
269
|
+
| `{"path": "/API/STA", "perfil": "max"}` | `parameters_dev__API_STA__max.py` |
|
|
270
|
+
| `{"path": "/API/*/STA", "perfil": "mixto_max"}` | `parameters_dev__API_env_STA__mixto_max.py` |
|
|
271
271
|
|
|
272
272
|
### Cómo acotar tu parameter_list (recomendación)
|
|
273
273
|
|
|
274
274
|
`parameter_list` es solo tu vista de trabajo: **la seguridad real la impone IAM, no este fichero**. La recomendación de uso es:
|
|
275
275
|
|
|
276
|
-
- **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "
|
|
277
|
-
- **Usuarios normales**: conviene acotar la ruta a lo que su rol IAM tiene realmente autorizado, por ejemplo `{"path": "/rds/cee-dev/api", "
|
|
276
|
+
- **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "perfil": "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", "perfil": "min"}` → `/dev/rds/cee-dev/api`.
|
|
278
278
|
|
|
279
279
|
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
280
|
|
|
@@ -383,7 +383,7 @@ El programa mostrará un menú donde Podrás:
|
|
|
383
383
|
- Crear un parámetro nuevo.
|
|
384
384
|
|
|
385
385
|
### Leer Parámetros:
|
|
386
|
-
1. Selecciona la opción "Leer parámetros" en el menú. La lista muestra cada ruta con su perfil
|
|
386
|
+
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
387
|
2. Elige el prefijo y el entorno que deseas consultar.
|
|
388
388
|
3. Los parámetros serán descargados y guardados en archivos como:
|
|
389
389
|
- parameters_dev.py
|
|
@@ -404,7 +404,7 @@ El programa mostrará un menú donde Podrás:
|
|
|
404
404
|
|
|
405
405
|
### Crear un parámetro nuevo:
|
|
406
406
|
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 `
|
|
407
|
+
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
408
|
3. Escribe el valor: texto plano o JSON en una línea.
|
|
409
409
|
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
410
|
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.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2.2.1"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|