이 페이지의 내용
gNOI 파일 서비스
gNOI File 서비스를 사용하여 네트워크 디바이스의 파일을 관리합니다.
서비스 RPC를 사용하여 File 파일을 전송 및 삭제하거나 파일에 대한 정보를 검색합니다. 프로토 정의 파일은 https://github.com/openconfig/gnoi/blob/master/file/file.proto 에 있습니다.
지원되는 RPC
| RPC | 설명 | 릴리스에 도입된 내용 |
|---|---|---|
Get() |
대상에서 파일의 내용을 읽고 스트리밍합니다. 파일은 순차적 메시지로 스트리밍되며 각 메시지에는 최대 64KB의 데이터가 포함됩니다. 전송된 데이터의 해시가 포함된 스트림을 닫기 전에 마지막 메시지가 전송됩니다. 파일이 없거나 파일을 읽는 동안 오류가 있는 경우 이 작업은 오류를 반환합니다. |
Junos OS Evolved 22.2R1 |
Put() |
대상의 파일로 데이터를 스트리밍합니다. 파일은 순차적 메시지로 전송되며 각 메시지에는 최대 64KB의 데이터가 포함됩니다. 데이터 해시를 포함하는 최종 메시지를 보내야 합니다. 위치가 없거나 데이터를 쓰는 동안 오류가 있는 경우 이 작업은 오류를 반환합니다. 체크섬이 수신되지 않으면 대상은 부분적으로 전송된 파일을 제거합니다. 실패해도 같은 이름의 기존 파일은 변경되지 않습니다. |
Junos OS Evolved 22.2R1 |
Remove() |
대상에서 지정된 파일을 제거합니다. 파일이 없거나, 파일 경로가 디렉터리로 확인되거나, 제거 작업에서 오류가 발생하는 경우 이 작업은 오류를 반환합니다. |
Junos OS Evolved 22.2R1 |
Stat() |
대상 디바이스의 파일에 대한 메타데이터를 반환합니다. 파일이 없거나 메타데이터에 액세스하는 동안 오류가 있는 경우 이 작업은 오류를 반환합니다. |
Junos OS Evolved 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=32767,
help='The server port. Default is 32767')
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=32767 --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=32767,
help='The server port. Default is 32767')
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=32767 --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