使用 Junos PyEZ 执行文件系统操作
总结 使用 Junos PyEZ 管理文件和目录、计算校验和以及查看和清理 Junos 设备上的系统存储。
Junos PyEZ 应用程序可以使用该 jnpr.junos.utils.fs 实用程序在 Junos 设备上执行文件系统操作,包括:
-
管理文件
-
管理目录
-
管理磁盘空间
本主题讨论如何使用该实用程序执行一些常见的文件系统操作。
执行文件操作
可以使用 jnpr.junos.utils.fs 实用程序执行常见的文件和目录操作。例如,您可以:
-
查看文件和目录信息
-
创建和删除目录
-
查看、删除以及移动或复制文件
-
计算文件的校验和
本节讨论一些常见操作。有关支持操作的完整列表,请参阅 jnpr.junos.utils.fs 文档。
查看文件列表
可以使用该方法 ls() 查看给定路径上的文件和目录列表。例如:
from jnpr.junos import Device
from jnpr.junos.utils.fs import FS
from pprint import pprint
with Device(host='router1.example.net') as dev:
fs = FS(dev)
pprint (fs.ls(path='/var/db/scripts/commit'))
user@server:~$ python3 junos-pyez-file-ls.py
{'file_count': 3,
'files': {'filter_type_check.py': {'owner': 'root',
'path': 'filter_type_check.py',
'permissions': 771,
'permissions_text': '-rwxrwx--x',
'size': 30070,
'ts_date': 'Oct 25 03:24',
'ts_epoc': '1698229487',
'type': 'file'},
'services': {'owner': 'root',
'path': 'services',
'permissions': 771,
'permissions_text': 'drwxrwx--x',
'size': 4096,
'ts_date': 'Oct 25 03:25',
'ts_epoc': '1698229535',
'type': 'dir'},
'services_evpn_commit_script.py': {'owner': 'root',
'path': 'services_evpn_commit_script.py',
'permissions': 771,
'permissions_text': '-rwxrwx--x',
'size': 698,
'ts_date': 'Oct 25 03:25',
'ts_epoc': '1698229535',
'type': 'file'}},
'path': '/var/db/scripts/commit',
'size': 34864,
'type': 'dir'}
管理文件
该 jnpr.junos.utils.fs 实用程序使您能够在目标设备上执行常见的文件操作。 表 1 概述了这些方法。方法名称与类 Unix 操作系统上的相应命令相同。
| 方法 |
描述 |
|---|---|
|
|
查看文件。 |
|
|
复制文件。 |
|
|
重命名文件。 |
|
|
删除文件。 |
以下 Junos PyEZ 应用程序连接到 Junos 设备,并使用 cat() 该方法查看文件的内容。如果该文件不存在,应用程序将 None打印 。
from jnpr.junos import Device
from jnpr.junos.utils.fs import FS
with Device(host='router1.example.net') as dev:
fs = FS(dev)
filepath = '/var/db/scripts/commit/filter_type_check.py'
print(fs.cat(path=filepath))
以下应用程序连接到 Junos 设备,并将文件从 /var/tmp 目录复制到 /var/db/scripts/op 目录。如果操作成功或False出现错误,应用程序将True打印。
from jnpr.junos import Device
from jnpr.junos.utils.fs import FS
src='/var/tmp/bgp-neighbors.slax'
dest='/var/db/scripts/op'
with Device(host='router1.example.net') as dev:
fs = FS(dev)
print(fs.cp(from_path=src, to_path=dest))
从 Junos PyEZ 2.6.8 版开始,您可以为文件复制操作指定路由实例。 routing_instance 包括参数,并指定实例的名称。例如:
fs.cp(from_path=src, to_path=dest, routing_instance='mgmt_junos')
计算校验和
可以使用该方法 checksum() 计算文件的校验和。默认情况下, checksum() 计算 MD5 校验和。若要显式指定算法,请包含 calc 参数并指定以下值之一:
-
MD5
-
SHA256
-
SHA1
以下 Junos PyEZ 应用程序连接到 Junos 设备,使用该方法验证 cat() 文件是否存在,如果文件存在,则计算 SHA256 校验和:
from jnpr.junos import Device
from jnpr.junos.utils.fs import FS
with Device(host='router1.example.net') as dev:
fs = FS(dev)
# if file exists, calculate checksum
filepath = '/var/db/scripts/commit/filter_type_check.py'
if fs.cat(path=filepath) is not None:
print(fs.checksum(path=filepath, calc='sha256'))
else:
print('File not found.')
user@server:~$ python3 junos-pyez-file-checksum.py d5e28ddde10a38b247d491b524b59c022297b01a9d3a00b83b11be5eb7b81be3
管理文件系统存储
您可以使用 jnpr.junos.utils.fs 实用程序来管理文件系统存储,如以下各节所述。
查看文件系统磁盘空间使用情况
您可以使用该方法 storage_usage() 返回有关文件系统的已用空间和可用空间的信息。该方法返回命令的 show system storage 输出。该信息类似于 Unix df 命令输出。
以下 Junos PyEZ 应用程序检索并打印所连接设备的磁盘空间使用情况:
from jnpr.junos import Device
from jnpr.junos.utils.fs import FS
from pprint import pprint
with Device(host='router1.example.net') as dev:
fs = FS(dev)
pprint(fs.storage_usage())
user@server:~$ python3 junos-pyez-storage-usage.py
{'/dev/ada1p2': {'avail': '406M',
'avail_block': 831176,
'mount': '/.mount/var/log',
'total': '475M',
'total_blocks': 973368,
'used': '31M',
'used_blocks': 64328,
'used_pct': '7'},
'/dev/ada1p3': {'avail': '833M',
'avail_block': 1705144,
'mount': '/.mount/var/tmp',
'total': '2.7G',
'total_blocks': 5586168,
'used': '1.6G',
'used_blocks': 3434136,
'used_pct': '67'},
'/dev/gpt/junos': {'avail': '4.3G',
'avail_block': 8989740,
'mount': '/.mount',
'total': '6.0G',
'total_blocks': 12540924,
'used': '1.2G',
'used_blocks': 2547912,
'used_pct': '22'},
...
}
查看目录使用情况
可以使用该方法 directory_usage() 查看给定目录及其子目录的磁盘空间使用情况(可选)。此方法在设备上执行 show system directory-usage path 命令并返回信息。如果未指定深度,Junos PyEZ 将使用默认深度零。该信息类似于 Unix du 命令返回的统计信息。
以下 Junos PyEZ 应用程序打印目录的 /var/tmp 磁盘空间使用情况。
from jnpr.junos import Device
from jnpr.junos.utils.fs import FS
with Device(host='router1.example.net') as dev:
fs = FS(dev)
print(fs.directory_usage(path='/var/tmp/'))
user@server:~$ python3 junos-pyez-directory-usage.py
{'/var/tmp/': {'size': '16K', 'blocks': 32, 'bytes': 16384}}
清理系统存储
您可以使用该方法 storage_cleanup() 释放 Junos 设备上的磁盘空间。该方法执行该 request system storage cleanup 命令,该命令将轮换日志文件并删除临时文件。
若要仅查看将在清理操作中删除的文件列表,请改用 storage_cleanup_check() 该方法。此方法在设备上执行 request system storage cleanup dry-run 命令,并返回候选文件列表而不删除它们。
以下 Junos PyEZ 应用程序首先执行该 storage_cleanup_check 操作并打印建议删除的文件列表。然后,应用程序查询用户是否要继续存储清理并删除文件。如果用户确认清理操作,应用程序将 storage_cleanup() 执行删除文件的操作,然后打印已删除文件的列表。
from jnpr.junos.utils.fs import FS
from pprint import pprint
with Device(host='router1.example.net') as dev:
fs = FS(dev)
print('\n*** Cleanup Check - files to delete ***\n')
pprint(fs.storage_cleanup_check())
cleanup = input('\nProceed with storage cleanup '
'and delete these files [yes,no] (no) ? ').lower()
if cleanup in ['yes', 'y']:
print('Cleaning up storage.')
files = fs.storage_cleanup()
pprint(files)
elif cleanup in ['no', 'n', '']:
print('Cleanup operation canceled.')
else:
print('Please enter a valid response.')
user@server:~$ python3 junos-pyez-storage-cleanup.py
*** Cleanup Check - files to delete ***
{'/var/log/ifstraced.0.gz': {'size': 8474516, 'ts_date': 'Feb 7 09:12'},
'/var/log/ifstraced.1.gz': {'size': 8464409, 'ts_date': 'Feb 6 19:17'},
'/var/log/ifstraced.2.gz': {'size': 8476558, 'ts_date': 'Feb 6 05:19'},
'/var/log/ifstraced.3.gz': {'size': 8477741, 'ts_date': 'Feb 5 15:20'},
'/var/log/license.0.gz': {'size': 27591, 'ts_date': 'Feb 7 17:03'},
'/var/log/license.1.gz': {'size': 27802, 'ts_date': 'Feb 7 15:11'},
'/var/log/messages.0.gz': {'size': 189, 'ts_date': 'Feb 7 17:53'},
'/var/log/messages.1.gz': {'size': 173, 'ts_date': 'Feb 7 17:52'},
'/var/log/messages.2.gz': {'size': 128, 'ts_date': 'Feb 7 17:52'},
'/var/log/messages.3.gz': {'size': 190, 'ts_date': 'Feb 7 17:52'},
'/var/log/messages.4.gz': {'size': 173, 'ts_date': 'Feb 7 17:48'},
'/var/log/security.0.gz': {'size': 499, 'ts_date': 'Feb 7 17:53'},
'/var/log/security.1.gz': {'size': 358, 'ts_date': 'Feb 7 17:52'},
'/var/log/security.2.gz': {'size': 305, 'ts_date': 'Feb 7 17:52'},
'/var/log/security.3.gz': {'size': 536, 'ts_date': 'Feb 7 17:52'},
'/var/log/wtmp.0.gz': {'size': 27, 'ts_date': 'Feb 7 17:52'},
'/var/log/wtmp.1.gz': {'size': 27, 'ts_date': 'Feb 7 17:52'},
'/var/tmp/LOCK_FILE': {'size': 0, 'ts_date': 'Jan 2 11:08'},
'/var/tmp/appidd_cust_app_trace': {'size': 0, 'ts_date': 'Jan 2 11:08'},
'/var/tmp/appidd_trace_debug': {'size': 198, 'ts_date': 'Jan 2 11:08'},
'/var/tmp/krt_rpf_filter.txt': {'size': 57, 'ts_date': 'Jan 2 11:08'},
'/var/tmp/netproxy': {'size': 0, 'ts_date': 'Jan 2 11:11'},
'/var/tmp/pfe_debug_commands': {'size': 111, 'ts_date': 'Jan 2 11:08'},
'/var/tmp/planeDb.log': {'size': 524, 'ts_date': 'Jan 2 11:08'},
'/var/tmp/rtsdb/if-rtsdb': {'size': 0, 'ts_date': 'Jan 2 11:08'}}
Proceed with storage cleanup and delete these files [yes,no] (no) ? yes
Cleaning up storage.
{'/var/log/ifstraced.0.gz': {'size': 8474516, 'ts_date': 'Feb 7 09:12'},
'/var/log/ifstraced.1.gz': {'size': 8464409, 'ts_date': 'Feb 6 19:17'},
'/var/log/ifstraced.2.gz': {'size': 8476558, 'ts_date': 'Feb 6 05:19'},
'/var/log/ifstraced.3.gz': {'size': 8477741, 'ts_date': 'Feb 5 15:20'},
'/var/log/license.0.gz': {'size': 27591, 'ts_date': 'Feb 7 17:03'},
'/var/log/license.1.gz': {'size': 27802, 'ts_date': 'Feb 7 15:11'},
'/var/log/messages.0.gz': {'size': 130, 'ts_date': 'Feb 7 17:54'},
'/var/log/messages.1.gz': {'size': 189, 'ts_date': 'Feb 7 17:53'},
'/var/log/messages.2.gz': {'size': 173, 'ts_date': 'Feb 7 17:52'},
'/var/log/messages.3.gz': {'size': 128, 'ts_date': 'Feb 7 17:52'},
'/var/log/messages.4.gz': {'size': 190, 'ts_date': 'Feb 7 17:52'},
'/var/log/security.1.gz': {'size': 499, 'ts_date': 'Feb 7 17:53'},
'/var/log/security.2.gz': {'size': 358, 'ts_date': 'Feb 7 17:52'},
'/var/log/security.3.gz': {'size': 305, 'ts_date': 'Feb 7 17:52'},
'/var/log/wtmp.0.gz': {'size': 27, 'ts_date': 'Feb 7 17:53'},
'/var/log/wtmp.1.gz': {'size': 27, 'ts_date': 'Feb 7 17:52'},
'/var/tmp/LOCK_FILE': {'size': 0, 'ts_date': 'Jan 2 11:08'},
'/var/tmp/appidd_cust_app_trace': {'size': 0, 'ts_date': 'Jan 2 11:08'},
'/var/tmp/appidd_trace_debug': {'size': 198, 'ts_date': 'Jan 2 11:08'},
'/var/tmp/krt_rpf_filter.txt': {'size': 57, 'ts_date': 'Jan 2 11:08'},
'/var/tmp/netproxy': {'size': 0, 'ts_date': 'Jan 2 11:11'},
'/var/tmp/pfe_debug_commands': {'size': 111, 'ts_date': 'Jan 2 11:08'},
'/var/tmp/planeDb.log': {'size': 524, 'ts_date': 'Jan 2 11:08'},
'/var/tmp/rtsdb/if-rtsdb': {'size': 0, 'ts_date': 'Jan 2 11:08'}}