NETCONF Perl クライアント アプリケーションで対話的にパラメータを収集する
NETCONF Perl クライアント アプリケーションでは、スクリプトはコマンドラインから NET::Netconf::Manager オブジェクトに必要なパラメーターを対話的に取得できます。
NETCONF Perl ディストリビューションには、Junos デバイスでさまざまな機能を実行するためのいくつかのサンプル Perl スクリプトが含まれています。各サンプル スクリプトは、スクリプトを呼び出すユーザーが提供するコマンド ライン オプションから、NET::Netconf::Manager オブジェクトに必要なパラメーターを取得します。スクリプトは、Getopt::Std Perl モジュールで定義された getopts 関数を使用して、コマンドラインからオプションを読み取り、%opt と呼ばれる Perl ハッシュにオプションを記録します。(本番環境で使用されるスクリプトは、おそらく対話的にパラメータを取得しないため、このセクションは主にサンプルスクリプトを理解するために重要です。
次の例は、https://github.com/Juniper/netconf-perl/tree/master/examples/get_chassis_inventory にあるNETCONF Perl GitHubリポジトリからのget_chassis_inventory.plサンプルスクリプトを参照しています。
getopts関数の最初のパラメータは、アプリケーションによって異なる許容可能なオプションを定義します。オプション文字の後のコロンは、引数を受け取ることを示します。
2 番目のパラメーター \%opt は、値が %opt ハッシュに記録されることを指定します。ユーザーが少なくとも 1 つのオプションを指定しない場合、無効なオプションを指定するか、または -h オプションを指定した場合、スクリプトは output_usage サブルーチンを呼び出し、使用メッセージを画面に出力します。
my %opt;
getopts('l:p:d:f:m:o:h', \%opt) || output_usage();
output_usage() if $opt{'h'};
以下のコードは、get_chassis_inventory.plサンプルスクリプトのoutput_usageサブルーチンを定義します。my $usage定義とWhereセクションとOptionsセクションの内容はスクリプト固有であり、アプリケーションごとに異なります。
sub output_usage
{
my $usage = "Usage: $0 [options] <target>
Where:
<target> The hostname of the target device.
Options:
-l <login> A login name accepted by the target device.
-p <password> The password for the login name.
-m <access> Access method. The only supported method is 'ssh'.
-f <xmlfile> The name of the XML file to print server response to.
Default: chassis_inventory.xml
-o <filename> output is written to this file instead of standard output.
-d <level> Debug level [1-6]\n\n";
croak $usage;
}
get_chassis_inventory.plスクリプトには、NET::Netconf::Managerオブジェクトに必要なパラメーターの値をコマンドラインから取得するための次のコードが含まれています。完全なコード サンプルの後には、さまざまな機能ユニットの詳細な説明が記載されています。
# Get the hostname
my $hostname = shift || output_usage();
# Get the access method, can be ssh only
my $access = $opt{'m'} || 'ssh';
use constant VALID_ACCESS_METHOD => 'ssh';
output_usage() unless (VALID_ACCESS_METHOD =~ /$access/);
# Check for login name. If not provided, prompt for it
my $login = "";
if ($opt{'l'}) {
$login = $opt{'l'};
} else {
print STDERR "login: ";
$login = ReadLine 0;
chomp $login;
}
# Check for password. If not provided, prompt for it
my $password = "";
if ($opt{'p'}) {
$password = $opt{'p'};
} else {
print STDERR "password: ";
ReadMode 'noecho';
$password = ReadLine 0;
chomp $password;
ReadMode 'normal';
print STDERR "\n";
}
前のコード サンプルの最初の行では、スクリプトは Perl shift 関数を使用して、コマンド ラインの末尾からホスト名を読み取ります。ホスト名が欠落している場合、スクリプトは output_usage サブルーチンを呼び出して、ホスト名が必要であることを指定する使用メッセージを出力します。
my $hostname = shift || output_usage();
次に、スクリプトは使用するアクセスプロトコルを決定し、 $access 変数を -m コマンドラインオプションの値に設定します。指定された値が VALID_ACCESSES 定数で定義された唯一の有効な値と一致しない場合、スクリプトは output_usage サブルーチンを呼び出して使用メッセージを出力します。
my $access = $opt{'m'} || 'ssh';
use constant VALID_ACCESS_METHOD => 'ssh';
output_usage() unless (VALID_ACCESS_METHOD =~ /$access/);
次に、スクリプトがユーザー名を決定し、 $login 変数を -l コマンドラインオプションの値に設定します。オプションが指定されていない場合、スクリプトはオプションを求め、 ReadLine 関数 (標準の Perl Term::ReadKey モジュール で定義されています) を使用してコマンドラインからそれを読み取ります。
my $login = "";
if ($opt{'l'}) {
$login = $opt{'l'};
} else {
print STDERR "login: ";
$login = ReadLine 0;
chomp $login;
}
スクリプトは最終的にユーザー名のパスワードを決定し、 $password 変数を -p コマンドラインオプションの値に設定します。オプションが指定されていない場合、スクリプトはそのオプションの入力を求めます。 ReadMode 関数 (標準の Perl Term::ReadKey モジュール で定義) を 2 回使用します: 最初はパスワードが画面上で目に見えてエコーするのを防ぎ、次にパスワードを読み取った後にシェルを通常の (エコー) モードに戻します。
my $password = "";
if ($opt{'p'}) {
$password = $opt{'p'};
} else {
print STDERR "password: ";
ReadMode 'noecho';
$password = ReadLine 0;
chomp $password;
ReadMode 'normal';
print STDERR "\n";
}