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 ディレクトリにファイルをコピーします。アプリケーションは、操作が成功した場合は True を出力し、エラーが発生した場合は False を出力します。
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 Release 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はデフォルトの水深である0を使用します。この情報は、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'}}