このページの内容
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リリース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}}
サブディレクトリを含めるには、適切な深さを指定します。
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/', depth=1))
システムストレージのクリーンアップ
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 import Device
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'}}