Qué es NSDdm
nsddm lee los Data Definition Modules (ficheros .NSD) de un directorio fuser de Software AG Natural y los convierte en un JSON estructurado: metadatos del fichero, campos con formato/longitud/descriptores, índices y relaciones entre DDMs. Trabaja en dos modos excluyentes:
- Modo generación: escanea el fuser y produce el JSON (
-fuserdirobligatorio). - Modo consulta: interroga un JSON ya generado sin tocar el fuser (
-inputobligatorio).
Los nombres de ficheros y campos de los ejemplos son ficticios.
Casos de uso
1. Inventario vivo de DDMs
Generar cada noche el JSON de la librería SYSTEM y versionarlo en git: cualquier alta, baja o cambio de campo queda registrado en el historial.
nsddm -fuserdir /opt/softwareag/fuser -lib SYSTEM -outfile ddm-system.json
git add ddm-system.json && git commit -m "inventario DDM $(date +%F)"
2. Preparar una migración Adabas
Antes de migrar, listar todos los ficheros con su DBID, número y longitud para dimensionar el destino y detectar rarezas (DB 0, longitudes extremas).
nsddm -fuserdir /opt/softwareag/fuser -lib SYSTEM -outfile full.json
nsddm -input full.json -list number
3. Triaje de data masking con NSAdaMask
Localizar los campos con datos personales (DNI, IBAN, email, teléfono…) para anonimizarlos después con nsadamask. La categoría la pone la IA (-ia) o la heurística por nombre.
nsddm -input full.json -datamask
Salida típica:
[228] IV2-DATOECON-COM NIF-TOMADOR A 14 conf=0.95 dni
[123] IV2-CARGAS-AUT NOMBRE-PERSONA A 50 conf=0.95 nombre
[108] IV2-DATORECI-T NUM-CUENTA-BCO N 16 conf=0.95 iban
4. Análisis de impacto de un cambio
Va a cambiar el campo COD-PAIS: averigüe en qué ficheros aparece y cuál es el maestro que lo define.
nsddm -input full.json -search COD-PAIS
nsddm -input full.json -schema COD-PAIS -relations
5. Documentación navegable del modelo de datos
Combinar -schema por fichero con la columna REL (fichero padre) para dibujar el mapa de maestros y movimientos sin abrir Natural.
for f in 108 1100 228; do
nsddm -input full.json -schema $f
done
Referencia de comandos
Modo generación
| Parámetro | Descripción | Requerido |
|---|---|---|
-fuserdir | Ruta al directorio fuser de Natural (busca .NSD en <fuserdir>/<lib>/SRC/ o <fuserdir>/SRC/) | Sí |
-lib | Librería = subdirectorio bajo fuserdir (p. ej. SYSTEM). Por defecto SYSTEM | No |
-outfile | Fichero JSON de salida (stdout si se omite) | No |
-files | Filtro por número o rango: 120, (100,200,300), (10-20,100-300), (10-20,50,100-300) | No |
-dbid | Filtro por base de datos. "", 000, 0000 y 0 equivalen a DB 0 | No |
-default-dbid | DBID asumido para ficheros cuyo NSD no trae DB | No |
-ia | Enriquece con IA: descripciones, datos sensibles y relaciones (requiere -ai-key o AI_API_KEY) | No |
-ai-endpoint | Endpoint OpenAI-compatible (por defecto OpenRouter) | No |
-ai-key | Clave de API (o variable AI_API_KEY) | Con -ia |
-ai-model | Modelo (por defecto deepseek/deepseek-chat) | No |
-ai-cache | Fichero de caché de respuestas IA (por defecto ai_cache.json) | No |
Modo consulta (-input obligatorio, incompatible con los de generación)
| Parámetro | Descripción |
|---|---|
-input | JSON generado previamente |
-schema | Esquema en columnas de un DDM (nombre completo/parcial o nº de fichero) |
-relations | Con -schema: detalle de relaciones de cada campo (sin -schema no hace nada) |
-datamask | Campos con datos sensibles: fichero, campo, formato, longitud, confianza y categoría |
-search | Búsqueda parcial insensible a mayúsculas en el nombre del campo |
-fnr | DDMs que contienen ese número de fichero |
-list | Ficheros ordenados por nombre de DDM (por defecto) o por número (-list number) |
Comunes
| Parámetro | Descripción |
|---|---|
-version | Versión, build, fecha, host y plataforma |
-license | Ruta del license.key (por defecto: resolución automática) |
Incompatibilidades
-inputcon flags de generación (-fuserdir,-lib,-files,-dbid,-ia…): se ignora la generación.-relationssin-schema: sin efecto.-iasin-ai-keyniAI_API_KEY: error.
Ejemplos comentados
# 1. Extracción básica a stdout
nsddm -fuserdir /opt/softwareag/fuser -lib SYSTEM
# 2. Solo el fichero 120 de CUSTOMER, guardado
nsddm -fuserdir /opt/softwareag/fuser -lib CUSTOMER -files 120 -outfile c120.json
# 3. Rango + DBID combinados (comillas para que el shell no toque los paréntesis)
nsddm -fuserdir /opt/softwareag/fuser -lib ORDERS -dbid 50 \
-files '(10-20,100-300)' -outfile orders.json
# 4. Enriquecido con IA (descripciones + sensibles + relaciones)
export AI_API_KEY="su-clave"
nsddm -fuserdir /opt/softwareag/fuser -lib SYSTEM -ia -outfile full.json
# La 2ª ejecución sobre el mismo fuser es casi instantánea (caché ai_cache.json)
# 5. Esquema de un DDM y sus relaciones
nsddm -input full.json -schema IV2-POLIZA-T
nsddm -input full.json -schema 108 -relations
# 6. ¿Dónde se usa el campo NUM-CUENTA-BCO?
nsddm -input full.json -search CUENTA
Formato de salida (resumen)
Cada fichero aporta metadata (source_file, ddm_name, db, file_number, record_type, total_fields, total_length), fields (nivel, nombre corto AA, field_name, format, length, descriptor, attribute —MU/PE/GR/SD—, remark, fields hijos, source_fields, comment, más description, mask_category, mask_confidence si hubo IA) e index.
La columna REL de -schema indica el fichero padre (maestro) de la relación many_to_one —el DDM que define el dato— o ←N si el campo es padre referenciado por N ficheros. La detección del padre es determinista (nombre del concepto + descriptor + prefijo de maestro FU-/MA-/TAB-); los campos genéricos (FECHA, IMPORTE…) no generan relación.
Códigos de retorno y entorno
| Código | Significado |
|---|---|
0 | Éxito |
1 | Error en parámetros |
2 | Error de sistema de ficheros (directorio no encontrado, etc.) |
El progreso va por stderr; las advertencias no interrumpen (archivos no procesables se saltan). Variables: AI_API_KEY (clave IA), LANG (idioma de mensajes), GOOS/GOARCH solo para compilar desde fuente (CGO_ENABLED=0 go build -o nsddm ., Go ≥ 1.24, sin dependencias).
Preguntas frecuentes
¿Puedo consultar sin acceso al fuser? Sí: genere una vez el JSON y distribuya el fichero; -input no toca el fuser.
¿Los remark con acentos salen rotos? No: los trozos de ~30 caracteres del NSD se unen y se normaliza ISO-8859-1 → UTF-8.
¿-datamask necesita IA? No: sin -ia aplica una heurística determinista por nombre (NIF, NOMBRE, IBAN, TELEFONO, EMAIL, TARJETA, IP…); con -ia la clasifica el modelo con confianza.
¿Qué DB tienen los ficheros sin campo DB? Se normalizan a 0; -dbid 0 los incluye. Con -default-dbid puede asumir otro valor al generar.