Desarrollar aplicaciones JET fuera del dispositivo
Visión general
Puede usar JET para desarrollar aplicaciones que se ejecutan fuera del dispositivo. Esto le permite aprovechar las ventajas de JET en todos los dispositivos de su red. Para facilitar el desarrollo, puede escribir aplicaciones JET fuera del dispositivo en el idioma de su elección. Para desarrollar una aplicación fuera del dispositivo:
Descargue y compile el archivo IDL.
Desarrolle la aplicación utilizando el idioma de su elección.
Empaquetar la aplicación.
Implemente el paquete de aplicación en un servidor externo o ejecute la aplicación directamente desde la MÁQUINA VIRTUAL JET.
La Figura 1 muestra el flujo de trabajo de desarrollo de aplicaciones fuera del dispositivo.
Desarrollar y empaquetar su aplicación
Antes de desvloping su aplicación, asegúrese de que ya ha seguido las instrucciones en Configurar la JET VM para configurar la JET VM y descargue el archivo IDL.
Ver también
Prepárese para implementar su aplicación
Ejecute la aplicación en un servidor externo o directamente desde la MÁQUINA VIRTUAL JET. Antes de implementar la aplicación en un servidor externo, debe configurar la interacción de JET con Junos OS.
Configurar la interacción de JET con Junos OS
Para ejecutar una aplicación fuera del dispositivo, debe habilitar la request-response
configuración en Junos OS o Junos OS Evolucionado. Cuando se utiliza el servicio de solicitud y respuesta, la aplicación cliente emite una solicitud y espera sincrónicamente la respuesta del servidor junos. Utilice esta sección para configurar el proceso de servicio JET (jsd) para que el servicio de solicitud y respuesta se ejecute en el modo de capa de sockets seguros (SSL). Esto proporciona una mayor seguridad y permite conexiones DE API basadas en SSL.
Actualmente, JET admite la seguridad de capa de transporte (TLS) versión 1.2 para el intercambio de certificados y admite varios algoritmos de cifrado, pero no admite la autenticación mutua. Esto significa que los clientes pueden autenticar el servidor, pero el servidor no puede autenticar clientes mediante certificados SSL/TLS. Para la autenticación de cliente, utilice el procedimiento LoginCheck() de la API del servicio de autenticación.
-
Habilite jsd para usar SSL agregando y configurando el nombre del certificado localmente. El certificado debe ser un certificado RSA. No se admiten certificados SSL ECDSA y DSA.
Este método es igual que otros servicios basados en SSL en Junos OS como xnm-ssl. Realice un seguimiento de la entrada del nombre del certificado que especifique durante la generación del certificado. Lo utilizará para la
HOST_OVERRIDE
opción en el ejemplo de aplicación Python en la siguiente sección. En este ejemplo, el nombre del certificado esrouter
.user@jet-vm:~ jet$ openssl genrsa -aes256 -out router.key.orig 2048 user@jet-vm:~ jet$ openssl req -new -key router.key.orig -out router.csr user@jet-vm:~ jet$ openssl rsa -in router.key.orig -out router.key user@jet-vm:~ jet$ openssl x509 -req -days 365 -in router.csr -signkey router.key -out router.crt user@jet-vm:~ jet$ cat router.crt router.key > router.pem
Nota:Si se actualiza un certificado con el mismo identificador, los cambios no se reflejarán para jsd. Debe configurar el certificado con un identificador nuevo en la jerarquía jsd o reiniciar jsd para reflejar los cambios realizados.
-
Copie el archivo .pem del certificado SSL al dispositivo Junos.
user@device% scp pem-file-name device-name:/var/tmp
Por ejemplo:
user@device% scp router.pem device:/var/tmp
-
Cargue el certificado en el llavero del dispositivo Junos. Por ejemplo, si el nombre local del certificado SSL es
sslcert
:[edit] user@device# set security certificates local sslcert load-key-file /var/tmp/router.pem
-
Habilite la compatibilidad con SSL para el certificado cargado.
[edit system services extension-service request-response grpc] user@device# set ssl local-certificate cert-name
Por ejemplo:
[edit system services extension-service request-response grpc] user@device# set ssl local-certificate sslcert
-
(Opcional) Especifique la dirección IP o puerto específico que utilizará SSL. SSL hace que esa dirección o puerto sea un canal seguro.
[edit system services extension-service request-response grpc] user@device# set ssl address address user@device# set ssl port port-number
Si establece la dirección en 0.0.0.0, el dispositivo utilizará SSL en todos los puertos. Por ejemplo, para habilitar la compatibilidad con SSL en el punto de conexión gRPC en todos los puertos y el puerto TCP predeterminado 51051:
[edit system services extension-service request-response grpc] user@device# set ssl address 0.0.0.0 user@device# set ssl port 51051
-
Especifique la cantidad máxima de conexiones simultáneas para la solicitud y la respuesta que se pueden adjuntar a jsd. Cuanto mayor sea el número, mayor será el impacto en el rendimiento del cliente.
[edit system services extension-service request-response grpc] user@device# set max-connections 8
Ha configurado jsd para el servicio de solicitud y respuesta para que se ejecute en modo SSL. Está listo para implementar su aplicación JET fuera del dispositivo.
-
Especifique los scripts que se usarán.
[edit] user@device# set system scripts language python3
Nota:A partir de Junos OS versión 21.1R1 y Junos OS Evolved versión 22.3R1, Python 2.7 ya no se admite y la
set system scripts language python
instrucción está en desuso. Utilice laset system scripts language python3
instrucción en su lugar.
Ejemplo: Aplicación Python JET
Utilice este ejemplo para desarrollar una aplicación JET fuera del dispositivo escrita en Python. Puede seguir las mismas instrucciones para otros idiomas compatibles con gRPC. Esta aplicación Python JET ejecuta el comando get-system-uptime-information
en formato XML.
En este ejemplo, la HOST_OVERRIDE
opción usa el nombre del certificado que especificó durante la generación del certificado. Consulte Prepárese para implementar la aplicación.
Juniper Networks admite los dos de los siguientes formularios para denotar etiquetas de apertura y cierre XML: <xml-tag/>
y <xml-tag></xml-tag>
.
Junos OS versión 18.4R1 y posteriores
Utilice el ejemplo de la aplicación Python que se muestra en esta sección como guía si está utilizando Junos OS versión 18.4R1 o posterior.
Si está escribiendo su aplicación con Python 3, incluya la palabra clave PASS en el bloque Excepción de la secuencia de comandos.
except Exception as tx: pass
#!/usr/bin/env python # A simple Python client to run XML OP command 'get-system-uptime-information' # Environment # Python 2.7.12 # grpcio (1.12.0) # grpcio-tools (1.12.0) # Following files should be available in current working directory # jnx_authentication_service_pb2_grpc.py # jnx_authentication_service_pb2.py # jnx_management_service_pb2_grpc.py # jnx_management_service_pb2.py import argparse import grpc import os import stat import jnx_authentication_service_pb2 import jnx_authentication_service_pb2_grpc import jnx_management_service_pb2 import jnx_management_service_pb2_grpc import jnx_common_base_types_pb2 _HOST_OVERRIDE = 'router' def Main(): try: parser = argparse.ArgumentParser() parser.add_argument('-d','--device', help='Input hostname', required=True) parser.add_argument('-t','--timeout', help='Input time_out value', required=True,type=int) parser.add_argument('-u', '--user', help='Input username', required=True) parser.add_argument('-pw', '--password', help='Input password', required=True) args = parser.parse_args() #Establish grpc channel to jet router creds = grpc.ssl_channel_credentials(open('/tmp/router.pem').read(), None, None) channel = grpc.secure_channel(args.device + ":32767", creds, options=(('grpc.ssl_target_name_override', _HOST_OVERRIDE,),)) #create stub for authentication services stub = jnx_authentication_service_pb2_grpc.AuthenticationStub(channel) #Authenticate login_request = jnx_authentication_service_pb2.LoginRequest( username=args.user, password=args.password, client_id="SampleApp") login_response = stub.Login(login_request, args.timeout) #Check if authentication is successful if login_response.status.code == jnx_common_base_types_pb2.SUCCESS: print "[INFO] Connected to gRPC Server" else: print "[ERROR] gRPC Server Connection failed:" print login_response.status.message #Create stub for management services stub = jnx_management_service_pb2_grpc.ManagementStub(channel) print "[INFO] Connected to management service" for i in range(1): #Provide API request details op_xml_command = "<get-system-uptime-information></get-system-uptime-information>" op = jnx_management_service_pb2.OpCommandGetRequest( xml_command=op_xml_command, out_format=2) # Invoke API op_response = stub.OpCommandGet(op, args.timeout) # Check API response like status and output for resp in op_response: if resp.status.code == jnx_common_base_types_pb2.SUCCESS: print "[INFO] Invoked OpCommandGetRequest succeeded" print "[INFO] Return output in CLI format = " print resp.data else: print "[ERROR] Invoked OpCommandGetRequest failed" print "[ERROR] " + resp.status.message except Exception as ex: print ex if __name__ == '__main__': Main()
user@jet-vm:~ jet$ python mgd_api_new_doc_example_ssl.py -d JUNOS_DEVICE -t TIMEOUT -u USER -pw PASSWORD [INFO] Connected to gRPC Server [INFO] Connected to management service [INFO] Invoked OpCommandGetRequest succeeded [INFO] Return output in CLI format = Current time: 2018-11-08 09:36:40 PST Time Source: NTP CLOCK System booted: 2018-10-09 17:02:56 PDT (4w1d 17:33 ago) Protocols started: 2018-10-09 17:05:09 PDT (4w1d 17:31 ago) Last configured: 2018-11-08 09:30:28 PST (00:06:12 ago) by root 9:36AM up 29 days, 17:34, 2 users, load averages: 1.05, 0.77, 0.57
Antes de la versión 18.4R1 de Junos OS
Utilice el ejemplo de la aplicación Python de esta sección como guía si utiliza versiones de Junos OS anteriores a 18.4R1.
#!/usr/bin/env python # A simple Python client to run XML OP command 'get-system-uptime-information' # Environment # Python 2.7.12 # grpcio (1.12.0) # grpcio-tools (1.12.0) # Following files should be available in current working directory # authentication_service_pb2_grpc.py # authentication_service_pb2.py # management_service_pb2_grpc.py # management_service_pb2.py import argparse import grpc import authentication_service_pb2 import authentication_service_pb2_grpc import management_service_pb2 import management_service_pb2_grpc _HOST_OVERRIDE = 'router' def Main(): try: parser = argparse.ArgumentParser() parser.add_argument('-d','-device', help='Input hostname', required=True) parser.add_argument('-t','-timeout', help='Input time_out value', required=True,type=int) parser.add_argument('-u', '-user', help='Input username', required=True) parser.add_argument('-pw', '-password', help='Input password', required=True) args = parser.parse_args() #Establish grpc channel to jet router creds = grpc.ssl_channel_credentials(open('/tmp/router.pem').read(), None, None) channel = grpc.secure_channel(args.device + ":51051", creds, options=(('grpc.ssl_target_name_override', _HOST_OVERRIDE,),)) #create stub for authentication services stub = authentication_service_pb2_grpc.LoginStub(channel) #Authenticate login_request = authentication_service_pb2.LoginRequest( user_name=args.user, password=args.password, client_id="SampleApp") login_response = stub.LoginCheck(login_request, args.timeout) #Check if authentication is successful if login_response.result == True: print "[INFO] Connected to gRPC Server:" print login_response.result else: print "[ERROR] gRPC Server Connection failed!!!" print login_response.result #Create stub for management services stub = management_service_pb2_grpc.ManagementRpcApiStub(channel) print "[INFO] Connected to JSD and created handle to mgd services" for i in range(1): #Provide API request details op_xml_command = "<get-system-uptime-information>" \ "</get-system-uptime-information>" op = management_service_pb2.ExecuteOpCommandRequest( xml_command=op_xml_command, out_format=2, request_id=1000) # Invoke API result = stub.ExecuteOpCommand(op, 100) # Check API response like status and output for i in result: print "[INFO] Invoked ExecuteOpCommand API return code = " print i.status print "[INFO] Return output in CLI format = " print i.data except Exception as ex: print ex if __name__ == '__main__': Main()
user@jet-vm:~ jet$ python mgd_api_doc_example_ssl.py -d JUNOS_DEVICE -t TIMEOUT_VAL -u USER -pw PASSWORD [INFO] Connected to gRPC Server: True [INFO] Connected to JSD and created handle to mgd services [INFO] Invoked ExecuteOpCommand API return code = 0 [INFO] Return output in CLI format = Current time: 2018-09-04 11:24:36 PDT Time Source: NTP CLOCK System booted: 2018-08-31 10:58:22 PDT (4d 00:26 ago) Protocols started: 2018-08-31 11:00:52 PDT (4d 00:23 ago) Last configured: 2018-08-31 14:21:32 PDT (3d 21:03 ago) by root 11:24AM up 4 days, 26 mins, 0 users, load averages: 1.20, 1.27, 1.10