Instalación manual del agente de seguridad de carga de trabajo y del recopilador
De forma predeterminada, cuando hay disponible una nueva versión de un agente o recopilador de seguridad de carga de trabajo, se envía una notificación previa a la actualización y los agentes y recopiladores se actualizan automáticamente en el inquilino. Sin embargo, en un entorno controlado y seguro, es posible que no se deseen actualizaciones automáticas. En tales casos, Workload Security se puede configurar para la instalación/actualización manual de agentes y colectores, lo que proporciona más control sobre el software instalado en sus sistemas.
Antes de empezar
-
Verifique en Swagger que las categorías API denominadas «cloudsecure_installers.agent» y «cloudsecure_installers.collector» están disponibles. Si no es así, el soporte para la instalación manual del agente no está activado. Póngase en contacto con el servicio de soporte de NetApp para que la función esté habilitada.
-
Ejecute todos los comandos mencionados en este documento como usuario 'root', o, si se ejecuta con un usuario diferente, ejecute los comandos con 'sudo'.
Instalación de un agente nuevo
-
Cree un nuevo token de acceso a la API de seguridad de carga de trabajo.
-
Vaya a Admin > API Access. Seleccione la pestaña “Workload Security Tokens” y haga clic en “+ API Access Token”.
-
Establezca un nombre y una descripción que sean fáciles de identificar.
-
En el menú desplegable “¿Qué tipo de API se utilizará este token para llamar?”, seleccione Collector Management y Agent & Collector Installation.
-
Seleccione la duración de caducidad deseada.
-
-
Haga clic en Save.
-
-
Copie el token de acceso a API generado. Tenga en cuenta que una vez cerrada la ventana, el token ya no se puede recuperar. En ese caso, deberá generar un nuevo token.
-
Navegue hasta Admin > API Access > API Documentation (en la parte superior derecha de la página) y seleccione el icono Workload Security. Esto abre la documentación de Swagger para las API de seguridad de cargas de trabajo.
-
Autorizar para acceder a las API Workload Security.
-
-
Haga clic en el botón Autorizar en la parte superior derecha de la página.
-
En el campo de texto Customer ApiKey (apiKey), pegue el token API copiado previamente de Paso 1c.
-
Haga clic en Autorizar y cierre la ventana.
-
Descargue el instalador del agente.
-
-
En Swagger, seleccione cloudsecure_installers.agent > /v1/cloudsecure/agents/installers/{platform}/latest (GET) API. Haga clic en Pruébelo.
-
En el campo platform, introduzca linux. Haga clic en Execute.
-
Haga clic en “Descargar archivo” para descargar el instalador.
-
Si el archivo de instalación se descarga externamente en un equipo distinto del sistema en el que se va a instalar el agente, copie el archivo de instalación en ese sistema.
-
Alternativamente, puede copiar el comando curl y ejecutarlo directamente en el sistema donde se debe instalar el agente.
-
Agregue el argumento “-o {{file_name}}” al comando cURL para guardar el archivo de instalación con el nombre deseado. El nombre real del archivo de instalación se puede encontrar en la sección Cabeceras de respuesta de Swagger. Ese nombre también se puede utilizar.
-
Aunque el archivo se puede descargar en cualquier ubicación, se recomienda descargarlo en una carpeta vacía en la que se puede extraer el archivo .zip del instalador.
-
Cree una carpeta nueva (recomendado), copie el archivo de instalación en esta carpeta y descomprima:
[root@demo-agent /]# mkdir agent_installers [root@demo-agent /]# cd agent_installers/ [root@demo-agent agent_installers]# pwd /agent_installers [root@demo-agent agent_installers]# ll total 0 [root@demo-agent agent_installers]# curl -X GET "https://netapp-demo.dev.cloudsecure.netapp.com/rest/v1/cloudsecure/agents/installers/linux/latest" -H "accept: application/octet-stream" -H "X-CloudInsights-ApiKey: <<API Access Token>>" -o cloudsecure-linux-agent-installer-1.617.0.zip [root@demo-agent agent_installers]# ll total 76012 -rw------- 1 root root 77834705 Apr 26 14:34 cloudsecure-linux-agent-installer-1.617.0.zip
[root@demo-agent agent_installers]# unzip cloudsecure-linux-agent-installer-1.617.0.zip Archive: cloudsecure-linux-agent-installer-1.617.0.zip inflating: cloudsecure-agent-image.zip inflating: cloudsecure-agent-install.sh inflating: cloudsecure-agent-upgrade.sh
-
Establezca el permiso execute para el archivo «cloudsecure-agent-install.sh».
[root@demo-agent agent_installers]# chmod +x cloudsecure-agent-install.sh [root@demo-agent agent_installers]# ll total 153344 -rw------- 1 root root 79154250 Apr 26 06:37 cloudsecure-agent-image.zip -rwx------ 1 root root 16574 Apr 26 06:25 cloudsecure-agent-install.sh -rw------- 1 root root 8586 Apr 26 06:25 cloudsecure-agent-upgrade.sh -rw------- 1 root root 77834705 Apr 26 14:34 cloudsecure-linux-agent-installer-1.617.0.zip
-
Generar un token de una sola vez para la instalación de un nuevo agente.
Nota: El token único generado en este paso es diferente del token de acceso de API generado en Paso 1c .
-
-
-
En Swagger, ejecute la API cloudsecure_installers.agent > /v1/cloudsecure/agent/oneTimeToken y copie el token de la respuesta.
-
Exporte el token de una sola vez como variable de entorno.
[root@demo-agent ~]# export TOKEN=<<one time token generated in step 7>>
-
Si se utiliza un servidor proxy, exporte https_proxy como variable de entorno en el formato que se menciona a continuación.
[root@demo-agent ~]# export HTTPS_PROXY='USER:PASSWORD@PROXY_SERVER:PORT'
-
Opcional: Por defecto, el agente y los colectores se instalarán en la ruta “/opt/NetApp”. Para instalar en una ruta diferente, defina la siguiente variable de entorno.
[root@demo-agent ~]# export AGENT_INSTALL_PATH=/test_user/apps
Nota: Si se instala en una ruta personalizada, los recopiladores de datos y todos los demás artefactos, como los registros del agente, se crearán solo dentro de la ruta personalizada. Los registros de instalación seguirán presentes en - /var/log/NetApp/cloudsecure/install.
-
Vuelva al directorio donde se descargó el instalador del agente y ejecute “cloudsecure-agent-install.sh”
[root@demo-agent agent_installers]# ./ cloudsecure-agent-install.sh
Nota: Si el usuario no se está ejecutando en un shell “bash”, es posible que el comando de exportación no funcione. En ese caso, los pasos 8 a 11 se pueden combinar y ejecutar como se indica a continuación. HTTPS_PROXY y AGENT_INSTALL_PATH son opcionales y se pueden ignorar si no es necesario.
sudo /bin/bash -c "TOKEN=<<one time token generated in step 7>> HTTPS_PROXY=<<proxy details in the format mentioned in step 9>> AGENT_INSTALL_PATH=<<custom_path_to_install_agent>> ./cloudsecure-agent-install.sh"
+
En este punto, el agente debe instalarse correctamente.-
Comprobación de estado para la instalación del agente:
-
-
Ejecute “systemctl status cloudsecure-agent.service” y verifique que el servicio del agente está en estado running.
[root@demo-agent ~]# systemctl status cloudsecure-agent.service cloudsecure-agent.service - Cloud Secure Agent Daemon Service Loaded: loaded (/usr/lib/systemd/system/cloudsecure-agent.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2024-04-26 02:50:37 EDT; 12h ago Main PID: 15887 (java) Tasks: 72 CGroup: /system.slice/cloudsecure-agent.service ├─15887 java -Dconfig.file=/test_user/apps/cloudsecure/agent/conf/application.conf -Dagent.proxy.host= -Dagent.proxy.port= -Dagent.proxy.user= -Dagent.proxy.password= -Dagent.env=prod -Dagent.base.path=/test_user/apps/cloudsecure/agent -...
-
El agente debe ser visible en la página “Agentes” y debe estar en estado “Conectado”.
-
Limpieza posterior a la instalación.
-
-
Si la instalación del agente se realiza correctamente, se pueden eliminar los archivos descargados del instalador del agente.
Instalación de un nuevo recopilador de datos.
Nota: Este documento contiene instrucciones para la instalación de «Recopilador de datos de SVM de ONTAP». Los mismos pasos se aplican al «recopilador de datos de Cloud Volumes ONTAP» y al «recopilador de datos de Amazon FSx para NetApp ONTAP».
-
Vaya al sistema en el que se debe instalar el recopilador y cree un directorio llamado ./tmp/collectors en el directorio agent install path.
Nota: si el agente está instalado en /opt/netapp, navegue a /opt/netapp/cloudsecure.
[root@demo-agent ~]# cd {agent-install-path}/cloudsecure [root@demo-agent ~]# mkdir -p ./tmp/collectors
-
Cambie recursivamente la propiedad del directorio tmp a cssys:cssys (el usuario y el grupo cssys se crearán durante la instalación del agente).
[root@demo-agent /]# chown -R cssys:cssys tmp/ [root@demo-agent /]# cd ./tmp [root@demo-agent tmp]# ll | grep collectors drwx------ 2 cssys cssys 4096 Apr 26 15:56 collectors
-
Ahora necesitamos recuperar la versión del recopilador y el UUID del recopilador. Navegue a la API «cloudsecure_config.collector-types».
-
Vaya a Swagger, «cloudsecure_config.collector-types > /v1/cloudsecure/collector-types» (GET). En el menú desplegable “collectorCategory”, selecciona el tipo de recopilador como “DATA”. Seleccione “ALL” para obtener todos los detalles del tipo de recopilador.
-
Copie el UUID del tipo de recopilador necesario.
-
Descargar el instalador del recopilador.
-
Navegue hasta «cloudsecure_installers.collector > /v1/cloudsecure/collector-types/installers/{collectorTypeUUID}» (GET) API. Introduzca el UUID copiado del paso anterior y descargue el archivo del instalador.
-
Si el archivo de instalación se descarga externamente en una máquina diferente, copie el archivo de instalación al sistema donde se ejecuta el agente y colóquelo en el directorio /{agent-install-path}/cloudsecure/tmp/collectors.
-
También puede copiar el comando cURL desde la misma API y ejecutarlo directamente en el sistema donde se va a instalar el recopilador.
Tenga en cuenta que el nombre del archivo debe ser el mismo que el presente en las cabeceras de respuesta de la API del recopilador de descargas. Consulte la captura de pantalla a continuación.
Nota: si el agente está instalado en /opt/netapp, navegue a /opt/netapp/cloudsecure/tmp/collectors.
[root@demo-agent collectors]# cd {agent-install-path}/cloudsecure/tmp/collectors [root@demo-agent collectors]# pwd /opt/netapp/cloudsecure/tmp/collectors [root@demo-agent collectors]# curl -X GET "https://netapp-demo.dev.cloudsecure.netapp.com/rest/v1/cloudsecure/collector-types/installers/1829df8a-c16d-45b1-b72a-ed5707129870" -H "accept: application/octet-stream" -H "X-CloudInsights-ApiKey: <<API Access Token>>" -o cs-ontap-dsc_1.286.0.zip
-
-
Cambiar la propiedad del archivo zip del instalador del recopilador a cssys:cssys.
-rw------- 1 root root 50906252 Apr 26 16:11 cs-ontap-dsc_1.286.0.zip [root@demo-agent collectors]# chown cssys:cssys cs-ontap-dsc_1.286.0.zip [root@demo-agent collectors]# ll total 49716 -rw------- 1 cssys cssys 50906252 Apr 26 16:11 cs-ontap-dsc_1.286.0.zip
-
Navegue hasta Workload Security > Collectors y seleccione +Collector. Seleccione el recopilador ONTAP SVM.
-
Configure los detalles del recopilador y Save el recopilador.
-
Al hacer clic en Guardar, el proceso del agente ubicará el instalador del recopilador en el directorio /{agent-install-path}/cloudsecure/tmp/collectors/ e instalará el recopilador.
-
Como opción alternativa, en lugar de agregar el recopilador a través de la interfaz de usuario, también se puede agregar a través de la API.
-
Desplácese hasta «cloudsecure_config.collector» > «/v1/cloudsecure/collector» (PUBLICACIÓN) API.
-
En el menú desplegable de ejemplo, selecciona «ONTAP SVM data collector json sample», update collector config details y Execute.
-
-
El recopilador debería ser ahora visible en la sección “Recopiladores de datos”.
-
Limpieza posterior a la instalación.
-
Si la instalación del recopilador es exitosa, se podrán eliminar todos los archivos en el directorio /{agent-install-path}/cloudsecure/tmp/collectors.
-
Instalación de un nuevo recopilador de directorios de usuario
Nota: En este documento hemos mencionado los pasos para instalar un recopilador LDAP. Los mismos pasos se aplican para instalar un recopilador de AD.
-
1. Vaya al sistema en el que se debe instalar el recopilador y cree un directorio llamado ./tmp/collectors en el directorio agent install path.
Nota: si el agente está instalado en /opt/netapp, navegue a /opt/netapp/cloudsecure.
[root@demo-agent ~]# cd {agent-install-path}/cloudsecure [root@demo-agent ~]# mkdir -p ./tmp/collectors
-
Cambie la propiedad del directorio collectors a cssys:cssys
[root@demo-agent /]# chown -R cssys:cssys tmp/ [root@demo-agent /]# cd ./tmp [root@demo-agent tmp]# ll | grep collectors drwx------ 2 cssys cssys 4096 Apr 26 15:56 collectors
-
-
Ahora necesitamos recuperar la versión y UUID del recopilador. Navegue a la API «cloudsecure_config.collector-types». En la lista desplegable collectorCategory, selecciona el tipo de recopilador como “USUARIO”. Seleccione “TODOS” para obtener todos los detalles del tipo de recopilador en una sola solicitud.
-
Copie el UUID del recopilador LDAP.
-
Descargue el instalador del recopilador.
-
Desplácese hasta «cloudsecure_installers.collector» > «/v1/cloudsecure/collector-types/installers/{collectorTypeUUID}» (GET) API. Introduzca el UUID copiado del paso anterior y descargue el archivo del instalador.
-
Si el archivo de instalación se descarga externamente en una máquina diferente, copie el archivo de instalación al sistema donde se ejecuta el agente y en el directorio /{agent-installation-path}/cloudsecure/tmp/collectors.
-
También puede copiar el comando cURL desde la misma API y ejecutarlo directamente en el sistema donde se debe instalar el recopilador.
Tenga en cuenta que el nombre del archivo debe ser el mismo que el presente en las cabeceras de respuesta de la API del recopilador de descargas. Consulte la captura de pantalla a continuación.
Tenga en cuenta también que si el agente está instalado en /opt/netapp, navegue a /opt/netapp/cloudsecure/tmp/collectors.
[root@demo-agent collectors]# cd {agent-install-path}/cloudsecure/tmp/collectors [root@demo-agent collectors]# pwd /opt/netapp/cloudsecure/tmp/collectors [root@demo-agent collectors]# curl -X GET "https://netapp-demo.dev.cloudsecure.netapp.com/rest/v1/cloudsecure/collector-types/installers/37fb37bd-6078-4c75-a64f-2b14cb1a1eb1" -H "accept: application/octet-stream" -H "X-CloudInsights-ApiKey: <<API Access Token>>" -o cs-ldap-dsc_1.322.0.zip
-
-
Cambie la propiedad del archivo zip del instalador del recopilador a cssys:cssys.
[root@demo-agent collectors]# ll total 37156 -rw------- 1 root root 38045966 Apr 29 10:02 cs-ldap-dsc_1.322.0.zip [root@demo-agent collectors]# chown cssys:cssys cs-ldap-dsc_1.322.0.zip [root@demo-agent collectors]# ll total 37156 -rw------- 1 cssys cssys 38045966 Apr 29 10:02 cs-ldap-dsc_1.322.0.zip
-
Navega a la página 'User Directory Collectors' y haz clic en '+ User Directory Collector'.
-
Selecciona 'LDAP Directory Server'.
-
Ingrese los detalles del servidor de directorios LDAP y haga clic en “Guardar”
-
Al hacer clic en Guardar, el servicio del agente ubicará el instalador del recopilador en el directorio /{agent-install-path}/cloudsecure/tmp/collectors/ e instalará el recopilador.
-
Como opción alternativa, en lugar de agregar recopilador a través de la interfaz de usuario, también se puede agregar a través de la API.
-
Desplácese hasta «cloudsecure_config.collector» > «/v1/cloudsecure/collector» (PUBLICACIÓN) API.
-
En el ejemplo desplegable, seleccione “LDAP Directory Server user collector json sample”, actualice los detalles de configuración del recopilador y haga clic en “Execute”.
-
-
El recopilador debe ser ahora visible en la sección “Colectores de directorios de usuarios”.
-
Limpieza posterior a la instalación.
-
Si la instalación del recopilador es exitosa, se podrán eliminar todos los archivos en el directorio /{agent-install-path}/cloudsecure/tmp/collectors.
-
Actualización de un agente
Se enviará una notificación por correo electrónico cuando haya disponible una nueva versión del agente/recopilador.
-
Descargue el instalador del agente más reciente.
-
Los pasos para descargar el instalador más reciente son similares a los de “Instalar un nuevo agente”. En Swagger, seleccione «cloudsecure_installers.agent» > «/v1/cloudsecure/agents/installers/{platform}/latest» API, introduzca la plataforma como «linux» y descargue el archivo zip del instalador. Alternativamente, también se puede utilizar un comando cURL. Descomprima el archivo del instalador.
-
-
Establezca el permiso de ejecución para el archivo «cloudsecure-agent-upgrade.sh».
[root@demo-agent agent_installers]# unzip cloudsecure-linux-agent-installer-1.618.0.zip Archive: cloudsecure-linux-agent-installer-1.618.0.zip inflating: cloudsecure-agent-image.zip inflating: cloudsecure-agent-install.sh inflating: cloudsecure-agent-upgrade.sh [root@demo-agent agent_installers]# ll total 153344 -rw------- 1 root root 79154230 Apr 26 2024 cloudsecure-agent-image.zip -rw------- 1 root root 16574 Apr 26 2024 cloudsecure-agent-install.sh -rw------- 1 root root 8586 Apr 26 2024 cloudsecure-agent-upgrade.sh -rw------- 1 root root 77834660 Apr 26 17:35 cloudsecure-linux-agent-installer-1.618.0.zip [root@demo-agent agent_installers]# chmod +x cloudsecure-agent-upgrade.sh [root@demo-agent agent_installers]# ll total 153344 -rw------- 1 root root 79154230 Apr 26 2024 cloudsecure-agent-image.zip -rw------- 1 root root 16574 Apr 26 2024 cloudsecure-agent-install.sh -rwx------ 1 root root 8586 Apr 26 2024 cloudsecure-agent-upgrade.sh -rw------- 1 root root 77834660 Apr 26 17:35 cloudsecure-linux-agent-installer-1.618.0.zip
-
Ejecute el script «cloudsecure-agent-upgrade.sh». Si el script se ha ejecutado correctamente, imprimirá el mensaje “Cloudsecure agent has updated successfully.” en la salida.
-
Ejecute el siguiente comando 'systemctl daemon-reload'
[root@demo-agent ~]# systemctl daemon-reload
-
Reinicie el servicio de agente.
[root@demo-agent ~]# systemctl restart cloudsecure-agent.service
En este punto, el agente debe actualizarse correctamente.
-
Comprobación de estado tras actualización de agente.
-
Navegue hasta la ruta en la que está instalado el agente (por ejemplo, “/opt/NetApp/cloudsecure/”). El “agente” symlink debe apuntar a una nueva versión del agente.
[root@demo-agent cloudsecure]# pwd /opt/netapp/cloudsecure [root@demo-agent cloudsecure]# ll total 40 lrwxrwxrwx 1 cssys cssys 114 Apr 26 17:38 agent -> /test_user/apps/cloudsecure/cloudsecure-agent-1.618.0 drwxr-xr-x 4 cssys cssys 4096 Apr 25 10:45 agent-certs drwx------ 2 cssys cssys 4096 Apr 25 16:18 agent-logs drwx------ 11 cssys cssys 4096 Apr 26 02:50 cloudsecure-agent-1.617.0 drwx------ 11 cssys cssys 4096 Apr 26 17:42 cloudsecure-agent-1.618.0 drwxr-xr-x 3 cssys cssys 4096 Apr 26 02:45 collector-image drwx------ 2 cssys cssys 4096 Apr 25 10:45 conf drwx------ 3 cssys cssys 4096 Apr 26 16:39 data-collectors -rw-r--r-- 1 root root 66 Apr 25 10:45 sysctl.conf.bkp drwx------ 2 root root 4096 Apr 26 17:38 tmp
-
El agente debe estar visible en la página “Agentes” y debe estar en estado “conectado”.
-
-
Limpieza posterior a la instalación.
-
Si la instalación del agente se realiza correctamente, se pueden eliminar los archivos descargados del instalador del agente.
-
Actualizando recopiladores
Nota: Los pasos de actualización son los mismos para todos los tipos de recopiladores. En este documento mostraremos la actualización del recopilador «SVM de ONTAP».
-
Vaya al sistema en el que se deben actualizar los recolectores y cree el directorio ./tmp/collectors en el directorio agent install path, si aún no está presente.
Nota: si el agente está instalado en /opt/netapp, navegue al directorio /opt/netapp/cloudsecure.
[root@demo-agent ~]# cd {agent-install-path}/cloudsecure [root@demo-agent ~]# mkdir -p ./tmp/collectors
-
Asegúrese de que el directorio “recopiladores” es propiedad de cssys:cssys.
[root@demo-agent /]# chown -R cssys:cssys tmp/ [root@demo-agent /]# cd ./tmp [root@demo-agent tmp]# ll | grep collectors drwx------ 2 cssys cssys 4096 Apr 26 15:56 collectors
-
En Swagger, desplácese hasta «cloudsecure_config.collector-types» GET API. En el menú desplegable “collectorCategory”, seleccione “DATA” (seleccione “USER” para el recopilador de directorios de usuario o “ALL”).
Copiar UUID y versión del cuerpo de la respuesta.
-
Descargue el archivo del instalador del recopilador más reciente.
-
Vaya a cloudsecure_installers.collector > /v1/cloudsecure/collector-types/installers/{collectorTypeUUID} API. Introduzca el collectorTypeUUID copiado del paso anterior. Descargue el instalador en el directorio /{agent-install-path}/cloudsecure/tmp/collectors.
-
Alternativamente, también se puede usar el comando cURL de la misma API.
Nota: El nombre del archivo debe ser el mismo que el presente en las cabeceras de respuesta de la API del recopilador de descargas.
-
-
Cambie la propiedad del archivo zip del instalador del recopilador a cssys:cssys.
[root@demo-agent collectors]# ll total 55024 -rw------- 1 root root 56343750 Apr 26 19:00 cs-ontap-dsc_1.287.0.zip [root@demo-agent collectors]# chown cssys:cssys cs-ontap-dsc_1.287.0.zip [root@demo-agent collectors]# ll total 55024 -rw------- 1 cssys cssys 56343750 Apr 26 19:00 cs-ontap-dsc_1.287.0.zip
-
Active la API del recopilador de actualizaciones.
-
En Swagger, navega hasta «cloudsecure_installers.collector» > «/v1/cloudsecure/collector-types/upgrade» (PUT).
-
En el menú desplegable «Ejemplos», seleccione «ONTAP SVM data collector upgrade json sample» para rellenar la carga útil de la muestra.
-
Reemplace la versión con la versión copiada Paso 3y haga clic en 'Ejecutar'.
Espere unos segundos. Los coleccionistas se actualizarán automáticamente.
-
-
Comprobación de estado.
Los recopiladores deben estar en estado de ejecución en la interfaz de usuario.
-
Limpieza posterior a la actualización:
-
Si la actualización del recopilador es exitosa, se podrán eliminar todos los archivos en el directorio /{agent-install-path}/cloudsecure/tmp/collectors.
-
Repita los pasos anteriores para actualizar otros tipos de colectores también.
Problemas y correcciones de Commons.
-
AGENT014 Error
Este error aparecerá si el archivo de instalación del recopilador no se encuentra en el directorio /{agent-install-path}/cloudsecure/tmp/collectors o no es accesible. Asegúrese de que el archivo de instalación esté descargado y que la estructura completa de directorios de collectors y el archivo zip del instalador sean propiedad de cssys:cssys. Luego, reinicie el servicio del agente: systemctl restart cloudsecure-agent.service.
-
Error no autorizado
{ "errorMessage": "Requested public API is not allowed to be accessed by input API access token.", "errorCode": "NOT_AUTHORIZED" }
Este error se mostrará si se genera el token de acceso API sin seleccionar todas las categorías de API necesarias. Genere un nuevo token de acceso de API seleccionando todas las categorías de API necesarias.