例:Junos XML プロトコル Perl クライアント アプリケーションを使用した設定の変更
Junos XML プロトコル Perl ディストリビューションには、Junos OS を実行するデバイスでさまざまな機能を実行するいくつかのサンプル Perl スクリプトが含まれています。 load_configuration.pl スクリプトは、デバイス上の設定をロック、変更、アップロード、コミットします。 Perl クライアント アプリケーションの Junos XML プロトコル サーバーへの要求の送信 で説明された要求の送信に基本的な構造を使用しますが、エラーを処理するサブルーチンも定義します graceful_shutdown 。以下のセクションでは、スクリプトが実行するさまざまな機能について説明します。
エラー状態の処理
load_configuration.plスクリプトのサブルーチンはgraceful_shutdown、Junos XMLプロトコルセッションで発生したエラーを処理します。次の追加定数を使用します。
use constant REPORT_SUCCESS => 1; use constant REPORT_FAILURE => 0; use constant STATE_CONNECTED => 1; use constant STATE_LOCKED => 2; use constant STATE_CONFIG_LOADED => 3;
サブルーチンの最初の2つのifステートメントは、 および STATE_LOCKED 条件をSTATE_CONFIG_LOADED参照しています。これは、load_configuration.plスクリプト内の設定の読み込みに特に適用されます。ステートメントをeval使用すると、同封の関数呼び出しの実行中に発生するエラーがトラップされ、関数呼び出しの失敗によってスクリプトが終了することはありません。
sub graceful_shutdown
{
my ($jnx, $req, $state, $success) = @_;
if ($state >= STATE_CONFIG_LOADED) {
print "Rolling back configuration ...\n";
eval {
$jnx->load_configuration(rollback => 0);
};
}
if ($state >= STATE_LOCKED) {
print "Unlocking configuration database ...\n";
eval {
$jnx->unlock_configuration();
};
}
if ($state >= STATE_CONNECTED) {
print "Disconnecting from the device ...\n";
eval {
$jnx->request_end_session()
$jnx->disconnect();
};
}
if ($success) {
die "REQUEST $req SUCCEEDED\n";
} else {
die "REQUEST $req FAILED\n";
};
}
設定のロック
load_configuration.pl スクリプトのメイン セクションは、Junos XML プロトコル サーバーへの接続を確立することから始まります。次に、メソッドをlock_configuration呼び出して、構成データベースをロックします。エラーが発生した場合、スクリプトはエラー状態の処理で説明されているサブルーチンをgraceful_shutdown呼び出します。
print "Locking configuration database ...\n";
my $res = $jnx->lock_configuration();
my $err = $res->getFirstError();
if ($err) {
print "ERROR: $deviceinfo{hostname}: failed to lock configuration. Reason: $err->{message}.\n";
graceful_shutdown($jnx, $xmlfile, STATE_CONNECTED, REPORT_FAILURE);
}
コンフィギュレーション・データの読み取りと解析
次のコード サンプルでは、 load_configuration.pl スクリプトは、Junos XML 構成要素または ASCII 形式のステートメントを含むファイルを読み取り、解析します。機能サブセクションの詳細については、完全なコード サンプルに従います。
# Load the configuration from the given XML file
print "Loading configuration from $xmlfile ...\n";
if (! -f $xmlfile) {
print "ERROR: Cannot load configuration in $xmlfile\n";
graceful_shutdown($jnx, $xmlfile, STATE_LOCKED, REPORT_FAILURE);
}
my $parser = new XML::DOM::Parser;
...
my $doc;
if ($opt{t}) {
my $xmlstring = get_escaped_text($xmlfile);
$doc = $parser->parsestring($xmlstring) if $xmlstring;
} else {
$doc = $parser->parsefile($xmlfile);
}
unless ( ref $doc ) {
print "ERROR: Cannot parse $xmlfile, check to make sure the XML data is well-formed\n";
graceful_shutdown($jnx, $xmlfile, STATE_LOCKED, REPORT_FAILURE);
}
前述のコードサンプルの最初のサブセクションでは、設定データを含むファイルの存在を検証します。ファイルの名前は、以前はコマンドラインから取得し、 変数に $xmlfile 割り当てられました。ファイルが存在しない場合、スクリプトはサブルーチンを graceful_shutdown 呼び出します。
print "Loading configuration from $xmlfile ...\n";
if (! -f $xmlfile) {
print "ERROR: Cannot load configuration in $xmlfile\n";
graceful_shutdown($jnx, $xmlfile, STATE_LOCKED, REPORT_FAILURE);
}
-t load_configuration.plスクリプトが呼び出されたときにコマンドラインオプションが含まれている場合、変数が$xmlfile参照するファイルには、CLI設定モードshowコマンドで返されるようなフォーマットされたASCII設定ステートメントが含まれている必要があります。このスクリプトは、Junos XML プロトコル Perl クライアント アプリケーションでの許可されていない文字の変換に記載されたサブルーチンを呼び出get_escaped_textし、その結果を変数に$xmlstring割り当てます。このスクリプトは、ファイル内のparsestringデータを構成階層に読み込むのに適した形式に変換する関数を呼び出し、その結果を$doc変数に割り当てます。関数はparsestringモジュールでXML::DOM::Parser定義され、次のサンプル コードの 1 行目はモジュールをオブジェクトとしてインスタンス化し、それを参照するように変数を設定$parserします。
my $parser = new XML::DOM::Parser;
...
my $doc;
if ($opt{t}) {
my $xmlstring = get_escaped_text($xmlfile);
$doc = $parser->parsestring($xmlstring) if $xmlstring;
-t load_configuration.pl スクリプトの呼び出し時にコマンド行オプションが含まれている場合、変数が$xmlfile参照するファイルには、代わりに Junos XML 構成要素が含まれます。この場合、スクリプトはファイルのparsefile関数(モジュールでも定義)をXML::DOM::Parser呼び出します。
} else {
$doc = $parser->parsefile($xmlfile);
}
パーサーがファイルを変換できない場合、スクリプトはエラー状態の処理で説明されているサブルーチンをgraceful_shutdown呼び出します。
unless ( ref $doc ) {
print "ERROR: Cannot parse $xmlfile, check to make sure the XML data is well-formed\n";
graceful_shutdown($jnx, $xmlfile, STATE_LOCKED, REPORT_FAILURE);
}
設定データの読み込み
このスクリプトは、設定変更をload_configurationデバイスに読み込むメソッドを呼び出します。Junos XMLプロトコルサーバーからの応答にエラーがgraceful_shutdown発生した場合にサブルーチンが呼び出されることを確認するために、ブロック内evalに ステートメントを配置します。
eval {
$res = $jnx->load_configuration(
format => $config_format,
action => $load_action,
configuration => $doc);
};
if ($@) {
print "ERROR: Failed to load the configuration from $xmlfile. Reason: $@\n";
graceful_shutdown($jnx, $xmlfile, STATE_CONFIG_LOADED, REPORT_FAILURE);
exit(1);
}
メソッドの 3 つの引数の定義に使用される変数は、アプリケーション ファイルの前のポイントで設定されました。
スクリプトを呼び出すときにコマンドラインオプションが含まれていない限り、
-t変数は$config_format「xml」に設定されます。my $config_format = "xml"; $config_format = "text" if $opt{t};スクリプトを呼び出すときにコマンドラインオプションが含まれていない限り、
-a変数は$load_action「マージ」に設定されます。最後の 2 行は、指定された値が有効であることを確認します。my $load_action = "merge"; $load_action = $opt{a} if $opt{a}; use constant VALID_ACTIONS => "merge|replace|override"; output_usage() unless ( $load_action =~ /VALID_ACTIONS/);変数には
$doc、 またはparsefile関数(モジュールで定義)からのparsestring出力がXML::DOM::Parser含まれます。
このスクリプトでは、エラーのチェックを 2 回実行し、いずれの場合もサブルーチンを graceful_shutdown 呼び出します。
unless ( ref $res ) {
print "ERROR: Failed to load the configuration from $xmlfile\n";
graceful_shutdown($jnx, $xmlfile, STATE_LOCKED, REPORT_FAILURE);
}
$err = $res->getFirstError();
if ($err) {
print "ERROR: Failed to load the configuration. Reason: $err->{message}\n";
graceful_shutdown($jnx, $xmlfile, STATE_CONFIG_LOADED, REPORT_FAILURE);
}
設定のコミット
この時点までのエラーがない場合、スクリプトはデバイス上の設定をコミットしてアクティブな設定にするため、メソッド(Junos XML プロトコル Perl ディストリビューションのファイル lib/JUNOS/Methods.pm で定義)を呼び出しますcommit_configuration。
print "Committing configuration from $xmlfile ...\n";
$res = $jnx->commit_configuration();
$err = $res->getFirstError();
if ($err) {
print "ERROR: Failed to commit configuration. Reason: $err->{message}.\n";
graceful_shutdown($jnx, $xmlfile, STATE_CONFIG_LOADED, REPORT_FAILURE);
}