例: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); }