---
title: PSS Lic Perfect Streamer Toolkit v2.0 — licencia del nodo
url: https://doc2.pstreamer.tv/es/manual/toolkit/pss_lic.html
lang: es
product: Perfect Streamer
version: 2.0.1.264
---

# PSS Lic Perfect Streamer Toolkit v2.0 — licencia del nodo

Parte del **Perfect Streamer Toolkit** — [https://pstreamer.tv](https://pstreamer.tv)

Utilidad de consola para gestionar la licencia de un nodo: aplica la actualización de licencia enviada por el proveedor, exporta el estado de la clave para la solicitud de activación y traslada la licencia de un nodo a otro.

Funciona con la misma clave del sistema de protección que el propio streamer: de software (SL) o de hardware (HL). El acceso a la clave se realiza a través del servicio **aksusbd** del sistema de protección, por eso la utilidad solo funciona allí donde ese servicio está en marcha.

La herramienta forma parte del paquete **pstreamer** y tras la instalación se encuentra en `/opt/pss/tools/pss_lic`: no hay que instalar nada por separado.

## Cuándo hace falta la utilidad

La pantalla [Licencia](../webui/administration.md#webui-license) sabe exportar el C2V y aplicar la clave V2C recibida, pero nada más. Desde la consola están disponibles todas las operaciones con la clave, y solo desde aquí se hace lo demás:

- activación y actualización de la licencia en un nodo sin acceso a la interfaz web;
- automatización: despliegue de un parque de nodos, renovación planificada de licencias, comprobaciones desde un sistema de monitorización;
- traslado de una licencia entre nodos, permanente o temporal.

La utilidad no necesita permisos de root: la escritura en el almacenamiento seguro la realiza el servicio del sistema de protección, no la propia utilidad. Root solo hace falta para escribir el archivo de salida en un directorio del sistema y para reiniciar el servicio **pss** tras el cambio de licencia.

La activación inicial de la licencia de prueba no la realiza esta utilidad, sino el script `/opt/pss/tools/activate.sh`: véase [Activación temporal e inicio](../first_start/index.md#first-start-activation). El script llama a **pss_lic** por sí mismo y a continuación reinicia el servicio **pss** y habilita su arranque automático. El procedimiento para obtener una licencia permanente se describe en [Activación permanente](../first_start/index.md#first-start-permanent-activation).

## Uso

```
pss_lic <comando> [opciones]
```

Ejecutado sin argumentos, con `-h` o con `--help`, imprime la ayuda integrada y termina con el código `0`. Las opciones se sitúan después del comando; antes del comando solo se admiten `-h`, `--help`, `-V` y `--version`. No se aceptan argumentos posicionales: todo se indica mediante opciones.

### Comandos

| Comando | Función | Opciones obligatorias |
| --- | --- | --- |
| `apply` | Aplicar al nodo una actualización de licencia: un archivo V2C, H2R o R2H | `--in` |
| `c2v` | Exportar el estado de la clave (C2V) para enviarlo al proveedor | — |
| `fingerprint` | Exportar la huella del nodo | — |
| `recipient` | Exportar el bloque recipient del nodo: la descripción del nodo como receptor de un traslado | — |
| `keys` | Enumerar las claves del sistema de protección visibles desde este nodo | — |
| `detach` | Transferir temporalmente la licencia del producto a otro nodo; el resultado es un archivo H2R | `--product-id` |
| `rehost` | Trasladar la clave a otro nodo; el resultado es un archivo V2C y la licencia se retira del nodo actual | `--key-id` |
| `cancel` | Devolver anticipadamente una licencia transferida temporalmente; el resultado es un archivo R2H | `--key-id` |
| `version` | Mostrar la versión de la utilidad y la versión de la API del sistema de protección | — |
| `help` | Mostrar la ayuda integrada | — |

### Opciones

| Opción | Descripción | Aceptada por |
| --- | --- | --- |
| `-i, --in <archivo>` | Datos de entrada | `apply` |
| `-o, --out <archivo>` | Datos de salida; por defecto `-`, es decir, stdout | todos excepto `version` y `help` |
| `-r, --recipient <archivo>` | Bloque recipient del nodo receptor | `detach`, `rehost` |
| `-k, --key-id <id>` | Identificador de la clave, decimal | `c2v`, `keys`, `detach`, `rehost`, `cancel` |
| `-p, --product-id <id>` | Identificador del producto, decimal | `detach` |
| `--duration <seg>` | Duración de la transferencia temporal en segundos; por defecto `120`, máximo `31536000` | `detach` |
| `--fast` | Instantánea reducida del estado; en una clave de hardware (HL), un archivo más pequeño | `c2v` |
| `--ids` | Imprimir solo los identificadores de las claves, uno por línea | `keys` |
| `-y, --yes` | No solicitar confirmación | `rehost`, `cancel` |
| `-q, --quiet` | Solo errores | todos |
| `-v, --verbose` | Registro detallado de las llamadas al sistema de protección | todos |
| `-V, --version` | Mostrar las versiones y salir | todos |
| `-h, --help` | Mostrar la ayuda | todos |

Una opción que no figura en la línea de su comando es un error de sintaxis, no un indicador ignorado en silencio: la utilidad informa, por ejemplo, `--key-id is not valid for 'fingerprint'`, y a menudo añade una línea con la causa. Los valores de `--key-id`, `--product-id` y `--duration` son solo números decimales a partir de `1`; el cero no se admite.

### Entrada y salida

Cualquier argumento de archivo —`--in`, `--out`, `--recipient`— acepta `-`: lectura desde stdin, escritura en stdout. Por defecto la salida va a stdout.

A **stdout** solo llegan los propios datos: el bloque de licencia. Los mensajes de éxito, los avisos y los errores van a **stderr** y empiezan con el prefijo `pss_lic:`. Gracias a ello, cualquier comando se puede redirigir a un archivo o a una tubería sin analizar la salida.

Si no se indica un archivo de salida y stdout es un terminal, los comandos `detach`, `rehost` y `cancel` advierten de que el resultado de la transferencia acabará en la pantalla y se perderá:

```
pss_lic: writing the V2C to the terminal; use --out <file> to keep it
```

El archivo de entrada se comprueba antes de dirigirse al sistema de protección: se rechazan un archivo vacío, un archivo que contenga un byte nulo y un archivo mayor de 8 MiB. La marca de orden de bytes UTF-8 al principio del archivo —la añaden algunos clientes de correo y editores— se elimina automáticamente.

## Aplicación de una actualización de licencia

El archivo enviado por el proveedor se aplica con un solo comando:

```bash
# apply a licence update sent by the vendor
/opt/pss/tools/pss_lic apply --in license.v2c

# the same file through a pipe
cat license.v2c | /opt/pss/tools/pss_lic apply --in -
```

Si tiene éxito, en stderr aparece:

```
pss_lic: update applied
```

**La utilidad no reinicia el servicio.** Un streamer en funcionamiento mantiene la licencia anterior en memoria, por eso, tras cambiar la licencia, reinicie el servicio a mano:

```bash
sudo systemctl restart pss
```

Volver a aplicar el mismo archivo no se considera un error: la utilidad informa `this V2C is already installed, nothing to do` y termina con el código `0`. En esa propiedad se basa la repetibilidad del script `activate.sh`.

No confunda este mensaje con el rechazo `the update is older than the one already installed (stale or rolled-back V2C)` (estado 54): este significa que se está aplicando un archivo obsoleto y termina con el código `1`. En ese caso, solicite al proveedor un V2C nuevo.

Con el comando `apply` se aplican los tres tipos de actualización: el V2C del proveedor, el H2R de una transferencia temporal y el R2H de su devolución.

## Exportación de los datos para el proveedor

La solicitud de activación o de ampliación de la licencia se construye a partir de un archivo C2V, una instantánea del estado actual de la clave:

```bash
# export the key state for the vendor
/opt/pss/tools/pss_lic c2v --out host.c2v
```

Si el nodo ve varias claves, el sistema de protección no adivinará cuál es la buscada y responde con el rechazo `too many keys match the scope` (estado 37). El comando `keys` enumera los identificadores de las claves:

```bash
# list the key ids visible on this host, then scope the export to one of them
/opt/pss/tools/pss_lic keys --ids
/opt/pss/tools/pss_lic c2v --key-id <id> --out host.c2v
```

Sin `--ids`, el comando `keys` imprime la lista de claves y de sus licencias tal como la devuelve el sistema de protección: un documento XML, no una tabla. Para elegir un valor de `--key-id` basta con la forma `--ids`.

La opción `--fast` solicita a la clave una instantánea reducida del estado. En una clave de hardware (HL) ese archivo resulta aproximadamente un orden de magnitud menor que el completo; en una de software (SL) el tamaño es el mismo: solo se diferencia por los datos que contiene.

**El contenido de un C2V no se puede leer en el nodo**, por eso el identificador de la clave se obtiene con el comando `keys` y no del propio archivo.

**Un C2V, una solicitud.** No envíe al proveedor el mismo C2V dos veces: el segundo V2C emitido a partir de él puede aplicarse solo en parte. Para una nueva solicitud, exporte el C2V de nuevo.

Los comandos `fingerprint` y `recipient` exportan la huella del nodo y el bloque recipient. La huella describe la máquina y es lo que necesita el proveedor cuando todavía no hay licencia en el nodo: a ella se vincula una nueva clave de software. El bloque recipient describe el nodo como receptor de un traslado y no lo necesita el proveedor, sino el segundo nodo: véase Traslado de la licencia a otro nodo. Ambos se refieren al nodo en su conjunto y no a una clave concreta, por eso la opción `--key-id` no es válida para ellos.

## Traslado de la licencia a otro nodo

El traslado de una licencia entre nodos solo es posible con una clave de software (SL): una clave de hardware viaja con el propio dispositivo y los comandos de la utilidad no la afectan. La licencia de prueba no se traslada. La posibilidad del traslado la fijan las condiciones de la licencia; si no está prevista, el sistema de protección responde con el rechazo `rehost is not allowed for this licence`. Aclárelo de antemano con el proveedor.

> **Advertencia**
>
> `rehost` retira la licencia del nodo actual. El archivo obtenido solo se puede aplicar en el nodo cuyo bloque recipient se pasó en `--recipient`. Si el archivo se pierde o el nodo receptor no está accesible, la licencia se pierde con él: no hay vuelta atrás local. Indique siempre `--recipient` y guarde el resultado en un archivo, no en la pantalla.

El traslado se realiza en tres pasos y afecta a ambos nodos. A continuación, A es el nodo del que sale la licencia y B el nodo al que se traslada.

1. En el nodo **B**, exportar el bloque recipient y pasar el archivo al nodo A:

   ```bash
   /opt/pss/tools/pss_lic recipient --out b.rcp
   ```
2. En el nodo **A**, trasladar la clave. La utilidad pedirá confirmación:

   ```bash
   /opt/pss/tools/pss_lic rehost --key-id <id> --recipient b.rcp --out a2b.v2c
   ```

   ```
   pss_lic: about to move the licence off this host. This cannot be undone. Continue? [y/N]
   ```

   Se considera confirmación toda respuesta que empiece por `y` o `Y`: `yes` confirma igual que `y`. Cualquier otra respuesta, incluida una línea vacía, cancela la operación. La pregunta se plantea directamente en el terminal, de modo que redirigir la salida no la oculta. Si no hay terminal —por ejemplo, si el comando se ha lanzado desde un planificador—, la utilidad se niega a realizar el traslado y propone indicar `--yes`.
3. En el nodo **B**, aplicar el archivo recibido y reiniciar el servicio:

   ```bash
   /opt/pss/tools/pss_lic apply --in a2b.v2c
   sudo systemctl restart pss
   ```

Desde que se ejecuta el paso 2 hasta que se completa el paso 3, la licencia no está en ninguno de los dos nodos. Planifique el traslado de modo que ese intervalo sea corto.

El archivo obtenido es inútil en cualquier sitio salvo en el nodo B: en otra máquina da un rechazo con el estado 62. Intentar aplicar en el nodo A un archivo antiguo de la misma clave da el estado 70 o 71: la clave ya se ha trasladado.

## Transferencia temporal de la licencia

`detach` transfiere la licencia del producto a otro nodo durante un plazo determinado y `cancel` la devuelve anticipadamente. Igual que el traslado permanente, la transferencia temporal solo funciona con una clave de software y solo si las condiciones de la licencia lo permiten; en caso contrario, el sistema de protección responde con un rechazo de estado 67. Con una licencia de prueba, ese rechazo es el resultado esperado y no una avería.

El identificador de producto de Perfect Streamer es `2`. El plazo se indica en segundos con la opción `--duration`; **el valor por defecto es de 120 segundos**, así que en explotación indíquelo siempre de forma explícita. El límite superior de la propia utilidad es de `31536000` segundos (un año), pero el límite real lo fija la licencia: con un plazo demasiado largo, el sistema de protección responde con el rechazo `invalid duration specified`. El plazo solicitado es justamente eso, una solicitud: el valor definitivo lo determina la clave y puede resultar menor.

1. En el nodo **B**, exportar el bloque recipient y pasar el archivo al nodo A:

   ```bash
   /opt/pss/tools/pss_lic recipient --out b.rcp
   ```
2. En el nodo **A**, transferir la licencia por un día:

   ```bash
   /opt/pss/tools/pss_lic detach --product-id 2 --duration 86400 --recipient b.rcp --out b.h2r
   ```

   ```
   pss_lic: product 2 detached, 86400 s requested
   ```
3. En el nodo **B**, aplicar el archivo recibido y reiniciar el servicio:

   ```bash
   /opt/pss/tools/pss_lic apply --in b.h2r
   sudo systemctl restart pss
   ```

Al expirar el plazo, la licencia vuelve al nodo A por sí sola. La devolución anticipada va en sentido contrario: el archivo R2H se crea en el nodo receptor y se aplica en el nodo de origen. Si para entonces el plazo ya ha expirado, no hay nada que devolver: la utilidad informa `the R2H: nothing to write` y termina con el código `1`.

1. En el nodo **B**, averiguar el identificador de la clave transferida y cancelar la transferencia:

   ```bash
   /opt/pss/tools/pss_lic keys --ids
   /opt/pss/tools/pss_lic cancel --key-id <id> --out back.r2h
   ```
2. En el nodo **A**, aplicar el archivo recibido y reiniciar el servicio:

   ```bash
   /opt/pss/tools/pss_lic apply --in back.r2h
   sudo systemctl restart pss
   ```

La opción `--recipient` no es válida para `cancel`: la licencia vuelve de donde vino. Al igual que `rehost`, el comando `cancel` pide confirmación. `detach` no la pide: la transferencia está limitada por su duración y es reversible.

Conserve los archivos intermedios con el mismo cuidado que en un traslado permanente: mientras el H2R no se haya aplicado en el nodo B, y el R2H en el nodo A, la licencia no está disponible en ninguno de los dos y solo vuelve al expirar la duración de la transferencia.

## Códigos de salida

| Código | Significado |
| --- | --- |
| `0` | La operación se ha realizado. El mismo código se devuelve cuando la actualización ya se había aplicado antes |
| `1` | El sistema de protección ha rechazado la operación: el mensaje indica el número de estado. El mismo código se devuelve cuando la operación ha terminado sin datos, por ejemplo `the R2H: nothing to write` |
| `2` | Error de sintaxis: comando desconocido, opción no válida para el comando, opción obligatoria ausente, valor no válido. El mismo código se devuelve cuando el operador ha respondido «no» a la solicitud de confirmación |
| `3` | Error de entrada/salida: el archivo no se puede abrir, leer ni escribir |

Dos casos conviene tener en cuenta en los scripts. La negativa del operador a confirmar es el código `2`, no `0`: una comprobación de tipo «código distinto de cero significa avería» tomará la cancelación por un fallo. Un archivo de entrada ilegible es el código `3`, no `1`: no se llegó al sistema de protección.

```bash
# distinguish a refusal by the key from a bad command line or a missing file
/opt/pss/tools/pss_lic apply --in license.v2c || {
    case $? in
        1) echo "the key refused the update" >&2 ;;
        2) echo "wrong command line, or the operator declined" >&2 ;;
        3) echo "the file could not be read" >&2 ;;
    esac
}
```

## Mensajes y diagnóstico

Los mensajes salen por stderr con el prefijo `pss_lic:`. Un rechazo del sistema de protección se imprime siempre de la misma forma: qué ha fallado, una descripción textual de la causa y el número de estado; para las causas frecuentes se añade una línea de sugerencia:

```
pss_lic: reading the key state (C2V) failed: too many keys match the scope (status 37)
pss_lic:   hint: this host holds several keys; run 'pss_lic keys --ids' and pass --key-id
```

La opción `-q` elimina los mensajes de éxito —incluido el aviso sobre la escritura en el terminal—, pero no los errores ni las sugerencias. La opción `-v` añade un registro de las llamadas al sistema de protección: las peticiones, el número de bytes leídos y escritos, el nombre de la función invocada. Al dirigirse al soporte, adjunte precisamente la salida obtenida con `-v`.

El grupo de rechazos más frecuente es que la clave no sea visible o que el servicio del sistema de protección no responda (estados 7, 14, 33, 50 y 80). Compruebe si el servicio está en marcha (`systemctl status aksusbd`), si la clave USB está conectada y si las bibliotecas del proveedor están en el directorio `/var/hasplm`: las instala el paquete **pstreamer**. Los demás rechazos están en la tabla siguiente; en la primera columna, el número de estado de la línea de rechazo; en la segunda, su texto.

| Estado | Texto del rechazo | Causa y solución |
| --- | --- | --- |
| 37 | `too many keys match the scope` | El nodo ve varias claves. Obtener la lista con `keys --ids` e indicar `--key-id` |
| 42 | `License Manager version is too old` | La versión de **aksusbd** es inferior a 9.12; actualizar el paquete del sistema de protección |
| 47 | `secure storage contains garbage` | El almacenamiento de la licencia está dañado; se necesita un nuevo V2C del proveedor |
| 48 | `vendor library cannot be found` | En el directorio `/var/hasplm` no están las bibliotecas del proveedor; las instala el paquete **pstreamer** |
| 54 | `the update is older than the one already installed (stale or rolled-back V2C)` | Se está aplicando un V2C obsoleto; solicitar uno nuevo al proveedor |
| 55 | `another update must be installed first` | El archivo de actualización está por delante del estado de la clave: se ha omitido una actualización intermedia; exportar un C2V nuevo y aplicar el V2C emitido para él |
| 58 | `invalid XML recipient parameter` | El bloque recipient está dañado; volver a exportarlo en el nodo receptor |
| 60 | `the scope does not select a unique Product` | Comprobar `--product-id` y, en un nodo con varias claves, añadir `--key-id` |
| 61 | `invalid Product information` | Comprobar `--product-id`; en Perfect Streamer es `2` |
| 62 | `unknown recipient; this blob may only be applied on the recipient it was made for` | El archivo se ha emitido para otra máquina y solo es aplicable en ella |
| 63 | `invalid duration specified` | La duración de la transferencia supera lo que permite la licencia |
| 64 | `cloned secure storage detected` | El almacenamiento de la licencia se ha reconocido como una copia, consecuencia de la clonación de un disco o de una máquina virtual; solicitar al proveedor la reemisión de la licencia para esta máquina |
| 66 | `the specified key is inactive` | La clave está inactiva |
| 67 | `no detachable Feature exists` | La transferencia temporal no está permitida por las condiciones de la licencia |
| 68 | `the scope does not select a unique host` | El nodo ve varios servicios del sistema de protección; `fingerprint` y `recipient` se refieren al servicio, no a la clave |
| 69 | `rehost is not allowed for this licence` | El traslado no está permitido por las condiciones de la licencia |
| 70 | `the licence was rehosted to another machine` | La clave ya se ha trasladado desde este nodo |
| 71 | `an old rehost licence is being applied` | Se está aplicando un archivo de traslado antiguo; la clave ya se ha trasladado desde este nodo |
| 77 | `the recipient of the requested operation is older than expected` | El nodo receptor ejecuta un servicio del sistema de protección obsoleto; actualizarlo |
| 78 | `secure storage ID mismatch` | El almacenamiento de la licencia pertenece a otra máquina; se necesita un nuevo V2C del proveedor |
| 79 | `duplicate host name while the key uses host name fingerprinting` | En la red hay un segundo nodo con el mismo nombre; renombrar el nodo o volver a emitir la licencia |
| 94 | `the key and the update are out of sync (update counters diverged)` | Los contadores de actualizaciones de la clave y del archivo han divergido; exportar un C2V nuevo y aplicar el V2C emitido para él |

Para cada estado conocido la utilidad imprime una descripción textual; un estado no reconocido se imprime como `unrecognised status` junto con su número.

Un caso aparte es el comando `keys`: si el sistema de protección no ha aceptado el formato detallado del listado, la utilidad imprime la línea de rechazo y repite la petición en formato breve. El listado se produce igualmente y el código de salida sigue siendo cero, por lo que esa línea de rechazo delante de un resultado normal no debe leerse como un fallo.

El comando `version` funciona incluso con el sistema de protección averiado, y eso es lo que lo hace útil como primer paso del diagnóstico. Imprime el banner de la utilidad y la versión de la API del sistema de protección; si el servicio del sistema de protección no está disponible, en lugar de la versión se imprime `unavailable` con un número de estado, y el código de salida sigue siendo cero.

## Migración desde la versión 1.2

En la versión 2.0 la sintaxis posicional se ha sustituido por comandos y opciones largas; las formas anteriores no se admiten. Al introducirlas, la utilidad imprime el reemplazo y termina con el código `2`.

| En 1.2 | En 2.0 |
| --- | --- |
| `pss_lic u <archivo>` | `pss_lic apply --in <archivo>` |
| `pss_lic i [clave] [archivo]` | `pss_lic c2v [--key-id <clave>] [--out <archivo>]` |
| `pss_lic d <producto> [archivo]` | `pss_lic detach --product-id <producto> [--out <archivo>]` |
| `pss_lic r <clave> [archivo]` | `pss_lic rehost --key-id <clave> [--out <archivo>]` |
| `pss_lic f [archivo]` | `pss_lic fingerprint [--out <archivo>]` |

También ha cambiado el comportamiento de la salida: en la 2.0 solo los datos van a stdout y los mensajes a stderr. Los scripts que analizaban la salida mixta de la versión 1.2 hay que corregirlos.
