Qué es NSNatIDE
nsnatide (NSNatIDE) es el IDE web de Nacarsoft para programar en
Natural desde el navegador. Ofrece la comodidad de un editor moderno (Monaco,
el mismo de VS Code) y las operaciones propias del entorno Natural: explorar
librerías y objetos, editar, compilar (STOW) y ejecutar programas, con
control de versiones Git y un asistente de IA integrados. Además
distribuye software entre entornos con paquetes SYSOBJH y despliegue
con trazabilidad y auditoría.

Los nombres de librerías, programas y usuarios de los ejemplos son ficticios.
Características principales
- Editor tipo VS Code (Monaco): resaltado de sintaxis Natural, numeración de
secuencia automática, autocompletado de variables (
#VAR), campos deVIEW OF(DDM),USING(área de datos),INCLUDE, variables de sistema y palabras clave; hover, ir a definición y diagnóstico de variables no declaradas. - Explorador FUSER: librerías y objetos leídos de
FILEDIR.SAG, búsqueda en todas las librerías del entorno, filtro por tipo, insignias S/C (fuente y/o catalogado) y modo (Structured/Report/DES6), y propiedades completas (fechas, tamaños, permisos y propietario). - Edición y compilación de todos los tipos con fuente (P N S M C D L G A H T),
con errores de STOW resaltados (código, línea y mensaje vía
LASTMSG). - Editores estructurados de DDM, áreas de datos (Local/Global/Parameter) y mapas (MAP2) con previsualización de pantalla y vista de texto.
- Asistente IA: generar, completar, explicar/documentar y corregir errores de compilación, con el contexto de símbolos y DDMs de la librería.
- Git integrado: estado, diff, commit, historial y push/pull a un remoto.
- CATALL con informe detallado y apertura del objeto con error en el editor.
- Panel de control: paquetes por estado, gráficos de despliegues, tasa de éxito y próximos despliegues programados.
- Paquetes SYSOBJH y despliegue: distribución de software entre entornos con snapshot previo, rollback, despliegue inmediato o programado, y auditoría completa.
- Copias snapshot: backup híbrido por entorno (hardlinks recientes + tar mensual comprimido) con recuperación inmediata de módulos, diff y STOW opcional.
- Entornos remotos: gestiona FUSER de otras máquinas por SSH desde el mismo interfaz: editar, stow/run, Git y backups.
- Multi-entorno DEV/TST/PRD, RBAC por entorno/librería y auditoría.
- Consola en español e inglés y 6 temas de interfaz.
Requisitos
- Linux (RHEL 8/9).
- Software AG Natural + cliente Adabas (
sagenv) con buffer pool arrancado. - Un FUSER por entorno con el layout
<FUSER>/<LIB>/{FILEDIR.SAG,SRC,GP}. giten el PATH del servicio para el control de versiones (opcional).- Proxy inverso con HTTPS en producción.
Arranque
# Inicializar (crea config.yaml 0600, db y usuario admin) y arrancar
./nsnatide init ./data
./nsnatide start ./data
./nsnatide status ./data
./nsnatide stop ./data
Consola web en http://host:11033/ (login admin; cambia la contraseña tras el
primer acceso). El comando nsnatide passwd permite recuperar el acceso.
Configuración
Entornos (FUSER)
Cada entorno apunta a un directorio FUSER. Los campos vacíos heredan la sección
natural global:
natural:
naturalBin: "/opt/softwareag/Natural/bin/natural"
sagenv: ". /opt/softwareag/sagenv"
bp: "NATBP"
ftouchBin: "/opt/softwareag/Natural/bin/ftouch"
fuserDbid: "22"
fuserFnr: "20"
fuserPath: "/data/ns/fusers/dev"
environments:
DEV:
fuser: "/data/ns/fusers/dev"
TST:
fuser: "/data/ns/fusers/tst"
Entornos remotos (SSH)
Además de FUSER locales, NSNatIDE gestiona entornos alojados en otra máquina con el mismo interfaz: la edición, el run/stow, el Git y los backups se ejecutan en el remoto de forma transparente.
environments:
PRD:
remote: true
server: "prd.example.com"
user: "natural"
port: 22
sshKey: "/home/sag/.ssh/id_ed25519" # ruta o contenido de la clave
agentBin: "nsnatide" # binario en el remoto (o ruta absoluta)
fuser: "/data/ns/fusers/prd" # ruta del FUSER EN el servidor remoto
La instancia principal es el único plano de control (usuarios, RBAC,
auditoría) y se comunica por SSH con el agente headless del remoto
(nsnatide agent: no abre puertos ni requiere autenticación adicional). El
botón + entorno pide la clave y la ruta FUSER (la del servidor remoto en
entornos SSH). Seguridad: clave en config.yaml (0600) o por ruta,
BatchMode/IdentitiesOnly, host key accept-new, multiplexación SSH
(ControlMaster) y confinamiento de rutas al FUSER.
El asistente de acceso SSH (botón Acceso SSH) simplifica el alta:
muestra el destino, pide la contraseña una sola vez, genera un par de claves
ed25519, instala la pública en el authorized_keys remoto y guarda sshKey;
desde entonces todo va por clave. Si prefieres tu agente SSH, usa sshAgent
(socket SSH_AUTH_SOCK); con sshKey vacío se usa el SSH del sistema
(~/.ssh/config y claves por defecto).
El remoto necesita el agente actualizado: puede ser el propio binario o el
estático nsnatide-agent (sin CGO/SQLite, para glibc antiguas). El botón
Desplegar agente lo sube al servidor (con copia .prev), verifica
checksum y hace ping de versión (POST /api/remote/deploy-agent); úsalo tras
cada actualización de nsnatide.
Cada entorno tiene interruptor Activo (inactivo = desaparece del IDE y se rechazan sus operaciones) y color propio (indicador junto al selector y fondo de sus pestañas).
Interfaz de configuración (/config)
Panel lateral de secciones (Server, Correo, License, Editor,
AI, Git, Environments) con formulario apilado. Los cambios se
escriben en config.yaml y se aplican en caliente. Cada sección tiene un
botón de prueba contextual: Test Email, Test AI y Test Git.
IA (opcional)
ai:
enabled: true
provider: "opencode-go" # openai | openrouter | opencode-go | ollama | anthropic | google
model: "deepseek-v4-pro"
api_key: "CHANGE_ME" # o AI__API_KEY
timeoutSec: 120
maxConcurrent: 3
Git (opcional)
git:
enabled: true
repoMode: "environment" # un repositorio por FUSER
autoCommit: "off"
authorFallback: "nsnatide <nsnatide@localhost>"
ignore: ["**/GP/", "**/FILEDIR.SAG", "**/*.bak"]
remotes:
DEV:
name: "origin"
url: "https://github.com/acme/natural-dev.git"
auth: "token" # none | token | ssh
username: "x-access-token"
token: "CHANGE_ME" # o GIT_REMOTE_DEV_TOKEN
branch: "main"
Uso
Explorador y editor
- Selector de entorno → librerías (con
FILEDIR.SAGprimero) → objetos con insignia de tipo. El filtro busca en todas las librerías del entorno; un segundo filtro por tipo restringe la lista. - Guardar (
Ctrl+S) escribe enSRC/; Stow guarda +ftouch+ compila; Run (F8) ejecuta programas y muestra elCMPRINTen el panel Output. Los botones aparecen según el contexto: Guardar solo con cambios sin guardar, Stow al editar un módulo editable y Run solo al editar un Program. - Si un programa usa
INPUT, al ejecutar se abre una ventana para introducir una línea por cadaINPUT(evitaNAT6016).
Tipos estructurados
Al abrir un DDM (.NSD), un área de datos (.NSL/.NSG/.NSA) o un
mapa (.NSM) se muestra un editor estructurado (rejilla) con alta/baja de
campos, HD=, superdescriptores, INIT, atributos y previsualización de la
pantalla, más un botón Ver como texto. El tipo A es Parameter data area.
Asistente IA
Botón ✦ AI en la barra superior: Generar, Completar, Explicar,
Documentar y Corregir con IA (usa el LASTMSG del STOW). En + Object
hay una casilla Generar con IA para crear el fuente desde una descripción.
La propuesta se revisa y se aplica al editor con Aplicar (queda sin guardar).
Git
Botón ⑂ Git: rama y ahead/behind, ficheros Preparados/Cambios con
stage/unstage/descartar, mensaje + Confirmar, Historial con parche, y
diff con el editor de diferencias de Monaco. El bloque Remoto permite
Fetch / Pull / Push y ⚙ Configurar remoto (URL, token/ssh, rama).
El autor de cada commit es el usuario de la aplicación.
CATALL
Clic derecho en una librería → Catalogar librería (CATALL): se eligen
tipos de objeto (por defecto todos) y un filtro de nombre (por defecto
*), y se muestra un informe con objetos catalogados, errores y duración. Cada
objeto con error tiene un botón Abrir que lo lleva al editor.
Paquetes y despliegue (SYSOBJH)
La página Paquetes distribuye software entre entornos: se crea el paquete, se añaden objetos de las librerías origen (uno a uno o en lote, con reordenado), se genera el SYSOBJH (ficheros, informe y bundle descargable) y se despliega al entorno destino de forma inmediata o programada.
Cada despliegue hace un snapshot previo del destino (permite rollback),
ejecuta LOADALL + CATALL y limpia el buffer pool. La página Despliegues
lista el historial con estado, informe y rollback en un clic; todo queda en
auditoría (DEPLOY_*, con email opcional). Permisos packages create|read|update|delete|deploy y deployments read|delete. En esta fase
solo se despliega a entornos locales.
El despliegue puede ser inmediato o programado (fecha/hora concreta o
ventana cron por defecto del paquete). Desde Despliegues se puede
cancelar un despliegue pendiente y hacer rollback de uno completado
(restaura el snapshot previo). Al terminar se notifica por email
(natNotify + notifyEmails en la configuración).
Panel de control
La página Panel resume la actividad de distribución: paquetes por estado, gráficos de despliegues de los últimos 12 meses y 14 días, tasa de éxito de 30 días, totales por entorno, próximos despliegues programados e historial reciente.
Buffer pools
La página Buffer pools muestra por entorno el estado (Arrancado / Detenido
/ Desconocido) y permite ver el Estado (natbpmon status), los Módulos
cargados (dir con patrón), Borrar entradas por patrón, Parar y
Arrancar el pool. Permisos bufferpool view (rol bpview) y
bufferpool manage (rol bpmanager). En remotos opera vía el agente.
Copiar y comparar
Clic derecho en una librería → Copiar librería (elige entorno y nombre
destino; copia SRC/GP/FILEDIR, regenera el FILEDIR y limpia los buffer pools
adicionales; funciona en el mismo host y entre hosts por SSH). Copiar dentro
del mismo entorno requiere ide save; entre entornos, ide copy (rol
copy). Auditoría LIB_COPY.
Comparar librería/objeto muestra por objeto el estado (same,
source_diff, catalog_diff, type_diff, mode_diff, only_a/b) con las
fuentes por SHA-256; al pulsar un objeto se abre su diff lado a lado en una
pestaña del editor. Solo requiere ide read en ambos lados.
Detalles del editor
Pestañas preview (un clic = vista previa reutilizable; doble clic o editar
la fija; ● marca cambios sin guardar), Modo Vim opcional, botón ✎
Editar (Buscar/Reemplazar/Ir a línea), ventana Propiedades por objeto
(fechas, tamaños, permisos, propietario) y panel Problemas/Salida (errores
STOW clicables que saltan a la línea). Los objetos de tipo Text se pueden
grabar pero no compilar (text objects cannot be stowed).
Espacios de trabajo
Sección Workspaces sobre las librerías: conjuntos nombrados por usuario de
referencias vivas entorno/librería/módulo. Clic abre en preview, + añade el
módulo activo, ▷ abre todo fijando pestañas; con renombrar, duplicar, borrar
y limpieza de módulos que ya no existen.
Copias de seguridad (snapshots)
Modelo híbrido por entorno (environments.<ENV>.backup) con dos niveles
de retención:
- Snapshots recientes: copias del FUSER mediante hardlinks — solo
ocupan lo cambiado, se crean en segundos y son totalmente navegables. Se
conservan
snapshotDaysdías (p. ej. 30) y son la base de la recuperación inmediata de módulos. - Archivo mensual en tar: los snapshots que superan
snapshotDaysse consolidan en un único tar comprimido por mes (tarDir,tarFormat: tar.zst|tar.gz) y se eliminan los árboles. Los tar se conservanretentionYearsaños (p. ej. 5); al superarlo se mueven aarchiveDiro se borran.
Programación automática: completo mensual (fullDayOfMonth + fullTime,
fullMode: link|copy) e incrementales diarios (incrementalTimes, por
defecto 08:00/12:00/15:00/18:00). También se lanzan a mano (Completo ahora
/ Incremental ahora, con ventana de progreso: fase, %, ficheros y duración)
o por CLI: nsnatide backup <dir> [--env DEV] [--full].
environments:
DEV:
fuser: "/data/ns/fusers/dev"
backup:
enabled: true
dir: "/data/backup/dev" # snapshots recientes (hardlinks)
fullDayOfMonth: 1
fullTime: "01:00"
fullMode: "link" # link | copy
incrementalTimes: ["08:00", "12:00", "15:00", "18:00"]
timezone: "Europe/Madrid"
snapshotDays: 30
tarDir: "/data/backup/dev/tar" # archivo mensual comprimido
tarFormat: "tar.zst" # tar.zst | tar.gz
retentionYears: 5
archiveDir: "" # "" = borrar al superar la retención
exclude: [] # globs, p. ej. "**/*.bak"
timeoutSec: 3600
Recuperación inmediata de un módulo
La página /backup reúne estado, snapshots, archivos mensuales, explorador
del snapshot, diff contra la versión en vivo, restaurar módulo (con
STOW opcional), borrado, Consolidar ahora y la configuración por entorno.
Flujo típico ante una regresión: abrir el snapshot → localizar el módulo →
comparar con diff → restaurar en un clic al FUSER en vivo. Todo queda en
auditoría (BACKUP_*).
Dónde viven los backups
dir y tarDir son rutas del sistema de ficheros: apunta tarDir a un
filesystem remoto montado (NFS/CIFS) para que el archivo mensual viva
fuera del servidor, mientras los snapshots recientes quedan en disco rápido
local. Funciona igual en entornos remotos: el backup se ejecuta en el
servidor remoto y se gestiona desde el mismo interfaz.
Usuarios, grupos y permisos
RBAC con ámbitos por entorno o librería: un grupo puede tener env (entorno
completo o *) o lib (DEV/NSNAT). Roles: admin, developer (leer, guardar,
stow, run, git read/commit), viewer (solo lectura), copy (copiar librerías
entre entornos), bpview (ver buffer pools) y bpmanager (gestionarlos).
Permisos: ide read|save|stow|run|copy|manage, git read|commit|manage,
backup read|manage, bufferpool view|manage, environments read|manage,
users manage, groups manage, roles manage, config manage. La casilla
Acceso a snapshots (recuperar ficheros) de cada grupo habilita ver
snapshots, explorar módulos, diff y restaurar; ejecutar, borrar,
consolidar y configurar backups sigue siendo de admin (backup manage).
Recuperación de contraseña por email (/forgot-password) si el correo está
configurado; si no, el admin genera el enlace desde /users.
API (autenticada por cookie JWT)
GET /api/ide/envs · /api/ide/libs · /api/ide/objects · /api/ide/search
GET /api/ide/object · /api/ide/ddm · /api/ide/da · /api/ide/map
POST /api/ide/object · /api/ide/stow · /api/ide/run · /api/ide/catall
POST /api/ai/{generate,complete,fix,explain} · /api/ai/ping
GET /api/git/{status,diff,log,show,remote}
POST /api/git/{init,stage,commit,restore,fetch,pull,push,remote,test}
GET /api/backup/{status,snapshots,libs,objects,object,diff,search}
POST /api/backup/{run,restore,delete,consolidate} · PUT /api/backup/config/:env
GET /api/users · /api/groups · /api/roles · /api/permissions · /api/audit
POST /api/packages · GET /api/packages · GET/PUT/DELETE /api/packages/:id
POST /api/packages/:id/objects[/batch] · DELETE /api/packages/:id/objects/:oid
POST /api/packages/:id/sysobjh · GET /api/packages/:id/sysobjh-{files,report,bundle}
POST /api/packages/:id/deploy · GET /api/deployments[/:id]
GET /api/syslog · /api/workspaces · POST /api/remote/deploy-agent
Toda acción de guardado, compilación, ejecución, IA, Git o backup queda en
auditoría (BACKUP_* para las operaciones de copia y restauración,
LIB_COPY para copias de librerías). La página Auditoría muestra el
identificador de usuario y la columna Entorno, con filtros por usuario,
entorno, fechas y acción; la página Logs del sistema (/syslogs, solo
admin) muestra el nsnatide.log con filtros y auto-actualización. Ante un
401, el frontend renueva la sesión (POST /api/auth/refresh) y reintenta
antes de redirigir al login.
Seguridad
- JWT firmado con HS256 y contraseñas con bcrypt.
- Claves (JWT, correo, IA, tokens Git) en
config.yamlcon permisos 0600 o por variable de entorno; nunca se registran en logs. - Los tokens de Git se inyectan por entorno y no se exponen en la API ni en
git remote -v. - La clave SSH de entornos remotos vive en
config.yaml(0600) o por ruta, y el agente remoto tiene las rutas confinadas al FUSER. - Validación y saneado de nombres de librería/objeto y rutas.
Solución de problemas
- STOW falla: revisa el panel Problems (código, línea y mensaje). El
buffer pool debe estar arrancado y
bpcorrecto. - No aparecen librerías: revisa
fuserdel entorno y que existaFILEDIR.SAG. - Run sin salida: comprueba
sagenv, el binarionaturaly que el programa esté catalogado. - Git no disponible: el botón aparece atenuado si
git.enabledesfalse; usa Configuración → Git → Test Git para ver qué falta. - El backup no arranca: revisa
backup.enabled, quedir/tarDirexistan con escritura ytimeoutSec; el estado y el último error están en /backup. - El remoto no conecta: comprueba
server/user/port/sshKey, que el binarioagentBinexista en el remoto y la conectividad SSH. Tras actualizar nsnatide, usa Desplegar agente para que el remoto soporte las nuevas operaciones. - El despliegue falla: revisa el informe en Despliegues (objeto, SYSOBJH y LOADALL/CATALL); el buffer pool del destino debe estar arrancado. El rollback restaura el snapshot previo al despliegue.
- Puerto ocupado: cámbialo en
config.yaml(server.port).