이 페이지의 내용
gNOI 파일 서비스
요약 gNOI File
서비스를 사용하여 네트워크 장치의 파일을 관리합니다.
서비스 RPC를 File
사용하여 파일을 전송 및 삭제하거나 파일에 대한 정보를 검색할 수 있습니다. proto 정의 파일은 https://github.com/openconfig/gnoi/blob/master/file/file.proto 에 있습니다.
지원되는 RPC
릴리스에 도입된 | RPC | 설명 |
---|---|---|
Get() |
대상에서 파일의 내용을 읽고 스트리밍합니다. 파일은 순차적 메시지에 의해 스트리밍되며, 각 메시지에는 최대 64KB의 데이터가 포함됩니다. 전송된 데이터의 해시가 포함된 스트림을 닫기 전에 최종 메시지가 전송됩니다. 파일이 없거나 파일을 읽는 동안 오류가 발생한 경우 작업에서 오류를 반환합니다. |
진화한 Junos OS 22.2R1 |
Put() |
대상의 파일로 데이터를 스트리밍합니다. 파일은 순차적 메시지로 전송되며 각 메시지에는 최대 64KB의 데이터가 포함됩니다. 데이터의 해시를 포함하는 최종 메시지를 보내야 합니다. 위치가 없거나 데이터를 쓰는 동안 오류가 발생한 경우 작업에서 오류를 반환합니다. 체크섬이 수신되지 않으면 대상은 부분적으로 전송된 파일을 제거합니다. 오류가 발생해도 동일한 이름의 기존 파일은 변경되지 않습니다. |
진화한 Junos OS 22.2R1 |
Remove() |
대상에서 지정된 파일을 제거합니다. 파일이 없거나, 파일 경로가 디렉터리로 확인되거나, 제거 작업에서 오류가 발생하면 작업이 오류를 반환합니다. |
진화한 Junos OS 22.2R1 |
Stat() |
대상 장치의 파일에 대한 메타데이터를 반환합니다. 파일이 없거나 메타데이터에 액세스하는 동안 오류가 발생한 경우 작업에서 오류를 반환합니다. |
진화한 Junos OS 22.2R1 |
네트워크 디바이스 구성
시작하기 전에:
- gRPC 서비스 구성에 설명된 대로 네트워크 디바이스에서 gRPC 서비스를 구성합니다.
- gNOI 서비스 구성에 설명된 대로 gNOI 작업을 지원하도록 네트워크 관리 시스템을 구성합니다.
예: 파일 가져오기
이 예제에서는 대상 디바이스에서 로컬 네트워크 관리 시스템으로 파일을 다운로드할 수 있는 간단한 Python 애플리케이션 gnoi_file_get.py
을 제공합니다.
응용 프로그램은 채널을 설정하기 위해 모듈을 가져옵니다 grpc_channel
. 이 grpc_channel
모듈은 gNOI 서비스 구성에 설명되어 있습니다. 응용 프로그램의 인수는 파일에 저장됩니다 args_file_get.txt
. 응용 프로그램 및 인수 파일이 여기에 표시됩니다.
gnoi_file_get.py 파일
"""gNOI Get File utility.""" from __future__ import print_function import argparse import hashlib import logging from getpass import getpass import file_pb2 import file_pb2_grpc from grpc_channel import grpc_authenticate_channel_mutual def get_args(parser): parser.add_argument('--server', dest='server', type=str, default='localhost', help='Server IP or name. Default is localhost') parser.add_argument('--port', dest='port', nargs='?', type=int, default=50051, help='The server port. Default is 50051') parser.add_argument('--client_key', dest='client_key', type=str, default='', help='Full path of the client private key. Default ""') parser.add_argument('--client_cert', dest='client_cert', type=str, default='', help='Full path of the client certificate. Default ""') parser.add_argument('--root_ca_cert', dest='root_ca_cert', required=True, type=str, help='Full path of the Root CA certificate.') parser.add_argument('--user_id', dest='user_id', required=True, type=str, help='User ID for RPC call credentials.') parser.add_argument('--dest_file', dest='dest_file', type=str, default='', help='Full path for destination file. Default ""') parser.add_argument('--source_file', dest='source_file', type=str, default='', help='Full path of source file to retrieve. Default ""') args = parser.parse_args() return args def send_rpc(channel, metadata, args): stub = file_pb2_grpc.FileStub(channel) print("Executing GNOI::File::Get") # Prepare hash generator gen_hash = hashlib.sha256() # Get File req = file_pb2.GetRequest() req.remote_file = args.source_file hashvalue = None hm = None count = 1 with open(args.dest_file, "wb") as file: # Read data in 64 KB chunks and calculate checksum and data messages print("Retrieving file") try: for msg in stub.Get(req, metadata=metadata, timeout=120): if msg.WhichOneof('response') == "contents": count = count + 1 file.write(msg.contents) gen_hash.update(msg.contents) else: hashvalue = msg.hash.hash hm = msg.hash.method print("File transfer complete: ", args.dest_file) except Exception as e: logging.error("Get() operation error. %s", e) print(e) else: file.close() ehashvalue = gen_hash.hexdigest().encode() if (ehashvalue != hashvalue): raise ValueError( 'Hash value mismatch. Expected "%s", got "%s"' % (ehashvalue, hashvalue)) if (hm != 1): raise ValueError( 'Hash method mismatch. Expected "1", got "%s"' % (hm)) logging.info("Downloaded file: %s", args.dest_file) def main(): parser = argparse.ArgumentParser(fromfile_prefix_chars='@') args = get_args(parser) grpc_server_password = getpass("gRPC server password for executing RPCs: ") metadata = [('username', args.user_id), ('password', grpc_server_password)] try: # Establish grpc channel to network device channel = grpc_authenticate_channel_mutual( args.server, args.port, args.root_ca_cert, args.client_key, args.client_cert) send_rpc(channel, metadata, args) except Exception as e: logging.error('Received error: %s', e) print(e) if __name__ == '__main__': logging.basicConfig(filename='gnoi-testing.log', format='%(asctime)s %(levelname)-8s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') main()
args_file_get.txt
--server=10.53.52.169 --port=50051 --root_ca_cert=/etc/pki/certs/serverRootCA.crt --client_key=/home/lab/certs/client.key --client_cert=/home/lab/certs/client.crt --user_id=gnoi-user --source_file=/var/log/messages --dest_file=downloads/10.53.52.169-messages
응용 프로그램 실행
클라이언트는 응용 프로그램을 실행할 때 지정된 파일을 대상 장치에서 로컬 장치로 전송합니다.
lab@gnoi-client:~/src/gnoi/proto$ python3 gnoi_file_get.py @args_file_get.txt gRPC server password for executing RPCs: Creating channel Executing GNOI::File::Get Retrieving file File transfer complete: downloads/10.53.52.169-messages
예: 파일 넣기
이 예제에서는 로컬 네트워크 관리 시스템에서 대상 디바이스로 파일을 업로드하기 위한 간단한 Python 애플리케이션 gnoi_file_put.py
을 제공합니다.
응용 프로그램은 채널을 설정하기 위해 모듈을 가져옵니다 grpc_channel
. 이 grpc_channel
모듈은 gNOI 서비스 구성에 설명되어 있습니다. 응용 프로그램의 인수는 파일에 저장됩니다 args_file_put.txt
. 응용 프로그램 및 인수 파일이 여기에 표시됩니다.
gnoi_file_put.py 파일
"""gNOI Put File utility.""" from __future__ import print_function import argparse import hashlib import logging import sys from functools import partial from getpass import getpass import file_pb2 import file_pb2_grpc from grpc_channel import grpc_authenticate_channel_mutual MAX_BYTES = 65536 def get_args(parser): parser.add_argument('--server', dest='server', type=str, default='localhost', help='Server IP or name. Default is localhost') parser.add_argument('--port', dest='port', nargs='?', type=int, default=50051, help='The server port. Default is 50051') parser.add_argument('--client_key', dest='client_key', type=str, default='', help='Full path of the client private key. Default ""') parser.add_argument('--client_cert', dest='client_cert', type=str, default='', help='Full path of the client certificate. Default ""') parser.add_argument('--root_ca_cert', dest='root_ca_cert', required=True, type=str, help='Full path of the Root CA certificate.') parser.add_argument('--user_id', dest='user_id', required=True, type=str, help='User ID for RPC call credentials.') parser.add_argument('--dest_file', dest='dest_file', type=str, default='', help='Full path for destination file. Default ""') parser.add_argument('--dest_file_mode', dest='dest_file_mode', type=int, default=600, help='Destination file mode (file permissions in octal). Default 600') parser.add_argument('--hash_method', dest='hash_method', type=str, default='unspecified', help='Hash method. Valid values are md5, sha256, sha512, or unspecified. Default: unspecified') parser.add_argument('--source_file', dest='source_file', type=str, default='', help='Full path of source file to transfer. Default ""') args = parser.parse_args() return args def send_rpc(channel, metadata, args): stub = file_pb2_grpc.FileStub(channel) print("Executing GNOI::File::Put") # Prepare hash generator if args.hash_method == "sha256": gen_hash = hashlib.sha256() hm = 1 elif args.hash_method == "sha512": gen_hash = hashlib.sha512() hm = 2 elif args.hash_method == "md5": gen_hash = hashlib.md5() hm = 3 else: print("Unsupported hash method:", args.hash_method) sys.exit(1) # Put File req = file_pb2.PutRequest() req.open.remote_file = args.dest_file req.open.permissions = args.dest_file_mode it = [] it.append(req) # Read source file and add to request with open(args.source_file, "rb") as file: # Read data in 64 KB chunks and calculate checksum and data messages for data in iter(partial(file.read, MAX_BYTES), b''): req = file_pb2.PutRequest() req.contents = data it.append(req) gen_hash.update(data) # Checksum message req = file_pb2.PutRequest() req.hash.hash = gen_hash.hexdigest().encode() req.hash.method = hm it.append(req) # Send PutRequest try: print("Sending file.") response = stub.Put(iter(it), metadata=metadata, timeout=120) except Exception as e: logging.error("Error uploading source file %s to %s. Error: %s", args.source_file, args.dest_file, e) print(e) else: print("File transfer complete: ", args.dest_file) logging.info("Uploaded file: %s", args.dest_file) def main(): parser = argparse.ArgumentParser(fromfile_prefix_chars='@') args = get_args(parser) grpc_server_password = getpass("gRPC server password for executing RPCs: ") metadata = [('username', args.user_id), ('password', grpc_server_password)] try: # Establish grpc channel to network device channel = grpc_authenticate_channel_mutual( args.server, args.port, args.root_ca_cert, args.client_key, args.client_cert) send_rpc(channel, metadata, args) except Exception as e: logging.error('Received error: %s', e) print(e) if __name__ == '__main__': logging.basicConfig(filename='gnoi-testing.log', format='%(asctime)s %(levelname)-8s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') main()
args_file_put.txt 파일
--server=10.53.52.169 --port=50051 --root_ca_cert=/etc/pki/certs/serverRootCA.crt --client_key=/home/lab/certs/client.key --client_cert=/home/lab/certs/client.crt --user_id=gnoi-user --source_file=scripts/op/ospf-summary.slax --dest_file=/var/db/scripts/op/ospf-summary.slax --dest_file_mode=644 --hash_method=sha256
응용 프로그램 실행
클라이언트는 응용 프로그램을 실행할 때 지정된 파일을 로컬 장치에서 대상 장치로 전송하고 값에 따라 dest_file_mode
파일 권한을 설정합니다.
lab@gnoi-client:~/src/gnoi/proto$ python3 gnoi_file_put.py @args_file_put.txt gRPC server password for executing RPCs: Creating channel Executing GNOI::File::Put Sending file. File transfer complete: /var/db/scripts/op/ospf-summary.slax