# n8n Node: Pytenable

Un nodo para la comunidad de n8n que permite interactuar con las APIs de Tenable.io y Tenable.sc utilizando la librería `pytenable` de Python en un entorno de ejecución seguro y aislado basado en Docker.

## Prerrequisitos

Para utilizar este nodo, tu instancia de n8n debe cumplir con los siguientes requisitos:

1.  **Docker Instalado**: El servicio de Docker debe estar instalado y en ejecución en la misma máquina que los workers de n8n.
2.  **Acceso al Socket de Docker**: El contenedor del worker de n8n debe tener acceso al socket de Docker del host. Esto se logra montando el volumen `- /var/run/docker.sock:/var/run/docker.sock` en la configuración de tu `docker-compose.yml`.

## Instalación

Este nodo no se instala desde npm. Debe ser construido como parte de una imagen de n8n personalizada.

1.  **Crea el Dockerfile del Runner de Python**:
    Crea un archivo llamado `Dockerfile.pytenable-runner` con el siguiente contenido. Este archivo define el entorno aislado donde se ejecutará tu código.

    ```dockerfile
    # Contenido del Dockerfile.pytenable-runner...
    ```

2.  **Construye la Imagen del Runner**:
    Ejecuta el siguiente comando para construir la imagen localmente.
    ```bash
    docker build -f Dockerfile.pytenable-runner -t pytenable-runner:latest .
    ```

3.  **Modifica el Dockerfile de n8n**:
    Añade las siguientes instrucciones a tu `Dockerfile` principal de n8n para copiar e instalar el nodo.

    ```dockerfile
    # ... (instrucciones FROM n8nio/n8n...)
    USER root
    RUN apk add --no-cache curl

    # Instalar nodo personalizado
    WORKDIR /home/node/nodes
    COPY ./n8n-nodes-pytenable-main . # Asegúrate de que el nombre de la carpeta sea correcto
    RUN npm install
    WORKDIR /home/node
    RUN chown -R node:node /home/node/nodes

    USER node
    ```

## Uso

1.  **Credenciales**: Configura tus credenciales de Tenable en n8n. Este nodo buscará credenciales de tipo `TenableApi`.
2.  **Añadir el Nodo**: Busca el nodo "Pytenable" en el panel de nodos y añádelo a tu workflow.
3.  **Configurar**:
    * **Modo de Operación**: Elige si el código se ejecuta una vez para todos los ítems de entrada o una vez por cada ítem.
    * **Código Python**: Escribe tu script. Tienes acceso a las siguientes variables:
        * `_credentials`: Un diccionario con tus credenciales de Tenable.
        * `_items`: Una lista de todos los ítems de entrada (solo en modo "Ejecutar una vez para todos los items").
        * `_item`: El ítem actual en el bucle (solo en modo "Ejecutar una vez por cada item").

### Ejemplo de Código

Este script utiliza `pytenable` para listar los 5 primeros scans en Tenable.io y los devuelve como salida del nodo.

```python
# Se asume que las credenciales están configuradas.
# pytenable y sus dependencias ya están instalados en el entorno.
from tenable.io import TenableIO

# tio se inicializa automáticamente en el wrapper,
# pero lo creamos aquí para mayor claridad.
tio = TenableIO(_credentials['apikey'], _credentials['apisecret'])

# Obtenemos la lista de scans y la devolvemos
scans = tio.scans.list(limit=5)

# El nodo espera una lista de diccionarios como salida
return list(scans)
```
