ネイティブ・コマンド・セット・スクリプト内の JavaScript

ネイティブ・コマンド・セットは、 JavaScript スクリプト機能をサポートします。これにより、作成者は、ネットワーク・リソースへのネイティブ・コマンドの送信に関する独自のロジック・フローを追加したり、外部コマンドからデータを実行または返すことができます。

構文

スクリプト・モードが有効になっていることをワークフロー・エンジンに示すには、ネイティブ・コマンド・セットの最初の行が //#javascript または //#js でなければなりません。

スクリプトには、 execute という名前の関数が含まれている必要があります。この関数は、3 つのパラメーターを受け入れ、作業単位 (UOW) が成功したか失敗したかを示す true または false を返します。
注: パラメーター名は固定されていません。
以下に、スクリプト構文の例を示します。
//#javascript
function execute(scriptAuditLogger, deviceInterface, systemInterface) {
    //enter javascript logic here
    return true;
}
これは、次のように書くこともできます。
//#javascript
function execute(logger, device, system) {
    //enter javascript logic here
    return true;
}

スクリプトの実行時に、ワークフロー・エンジンは関数パラメーターに対応する 3 つのクラスをスクリプトに渡します。 パラメーターに任意の名前を選択する場合は、その名前を関数の本体内で使用する必要があります。

制約事項: ネイティブ・コマンド・セット・スクリプト (正規表現など) 内で JavaScript を作成する場合は、 $ 文字を使用しないでください。 代わりに #single_dollar# を使用してください (ハッシュタグを含む)。 Netcool Configuration Manager は、 $ 文字を置換変数の先頭として解釈します。これにより、ネイティブ・コマンド・セットでパラメーターを使用できるようになります。 したがって、単一の $ 文字は置換の開始として解釈され、終了 $ 文字がない場合はエラーが発生します。

方法

各クラスで使用可能なメソッドを説明するために、「シンタックス」セクションの最初の例のパラメーター名が使用されます。

スクリプト関数に渡される scriptAuditLogger クラスは、作業ログの単位にメッセージを送信するための以下のメソッドをサポートしています
表 1. scriptAuditLogger クラスをサポートするメソッド

メソッド 説明
void info (ストリング・メッセージ) 監査ログ・メッセージを UOW ログに送信します。 scriptAuditLogger.log(“このメッセージは作業単位ログに表示されます”);
void エラー (ストリング・メッセージ、例外例外) 監査ログ・エラー・メッセージを UOW ログに送信します。 scriptAuditLogger.error(“この操作は失敗しました”, e);
スクリプト関数に渡される deviceInterface クラスは、ネイティブ・コマンドをネットワーク・リソースに送信する機能を提供します。 以下の表では、ネイティブ・コマンドをネットワーク・リソースに送信する方法について説明します。
表 2. deviceInterface クラスをサポートするメソッド

メソッド 説明
ストリング送信 (String コマンド) デバイスにコマンドを送信し、応答を返します。 var response = deviceInterface.send ("show ip interface brief");
文字列 send(文字列 command, 文字列 responseRegExp ) デバイスにコマンドを送信し、応答で正規表現を実行した結果を返します。 最初のグループ一致のみが返されます。 var response = deviceInterface.send ("show ip interface brief", "^ (¥ w +) ¥ s");
sendAndExpect(String コマンド、文字列 expectedResponse コマンドをデバイスに送信し、予期される応答を待機し、デバイスの応答を返します。 この方法は、対話式コマンドを送信する場合に使用します。 deviceInterface.sendAndExpect("copy run start"、"[startup-config]?"); deviceInterface.send("r");
文字列 sendAndExpect(String コマンド、文字列 expectedResponse, 文字列 responseRegExp ) デバイスにコマンドを送信し、予期される応答を待機し、応答で正規表現を実行した結果を返します。 最初のグループ一致のみが返されます。 この方法は、対話式コマンドを送信する場合に使用します。
スクリプト関数に渡される systemInterface クラスは、外部コマンドの実行、外部コマンドからのデータの取得、ファイルの作成、ファイルの更新と削除、および指定されたサーバーへのファイルの SFTP へのファイル操作の実行を行う機能を提供します。
表 3. systemInterface クラスをサポートするメソッド

メソッド 説明
public Path createFile(String filePathName, String content) throw Exception 絶対ファイル・パスとコンテンツをストリングとして指定して、ファイルを作成するメソッド。 このメソッドを使用するには、許可されたクラスとして sun.nio.fs.UnixPath をシステム・プロパティーに追加する必要があります。 var response = system.createFile(source,"initial content of file\n");
public Path updateFile(String filePathName, String content) throw Exception 絶対ファイル・パスと内容をストリングとして指定して、ファイルを更新するメソッド。 このメソッドを使用するには、許可されたクラスとして sun.nio.fs.UnixPath をシステム・プロパティーに追加する必要があります。 var response = system.updateFile(source,"appended update to file\n");
public void deleteFile(String filePathName ) throws Exception 絶対ファイル・パスを指定してファイルを削除するメソッド。 system.deleteFile(source);

public boolean sftpFile (String sourceFilePathName, String destinationFilePathName, Map<String,String> options) throws Exception

指定されたサーバーにファイルを SFTP で送信する方式。 このメソッドを使用するには、許可された Java パッケージとして「システム・プロパティー」内の java.util パッケージが必要です。
var source="/home/icosftp/testJSCreatedFile.xml";
   var response = system.createFile(source,"initial content of file\n");
   var destination="/home/timo/testJSCreatedFile.xml";
   var options=new java.util.HashMap();
   options.put("username","user1");
   options.put("password","pass1");
   options.put("remoteHost","10.168.1.1");
   system.sftpFile(source,destination,options);
文字列 executeSystemCommand(String shellName, 文字列 shellArgs, 文字列コマンド、文字列チェックサム)

システム・コマンドを実行し、システム・コマンドの出力を返します。

システム・コマンドは、シェル・スクリプトを含むファイルです。 ユーザーは、icosutil を使用してファイルのチェックサムを計算する必要があります。 その後、チェックサムをネイティブ・コマンド・セットに入力する必要があります。

var response = systemInterface.executeSystemCommand(“/bin/sh”, “-c”, “getNetStat.sh”, “&lt;generated checksum>”);

サーバー上の getNetStat.sh スクリプトのチェックサムを生成するには、次のコマンドを実行します。 <install_dir>;/bin/icosutil CalculateChecksum getNetStat.sh
重要: チェックサムの生成後に外部スクリプトが変更された場合は、新しいチェックサムを生成し、ネイティブ・コマンド・セット・スクリプトを更新する必要があります。
文字列 executeSystemCommand(String shellName, 文字列 shellArgs, 文字列コマンド、文字列 responseRegExp, 文字列チェックサム)

システム・コマンドを実行し、システム・コマンドの出力に対して正規表現を実行した結果を返します。 最初のグループ一致のみが返されます。

システム・コマンドは、シェル・スクリプトを含むファイルです。 ユーザーは、icosutil を使用してファイルのチェックサムを計算する必要があります。 その後、チェックサムをネイティブ・コマンド・セットに入力する必要があります。

var response = systemInterface.executeSystemCommand(“/bin/sh”, “-c”, “getExternalData.sh”, “^(w+)\s“, &lt;generated checksum>”);

サーバー上の getExternalData.sh スクリプトのチェックサムを生成するには、次のコマンドを実行します。 <install_dir>;/bin/icosutil CalculateChecksum getExternalData.sh
重要: チェックサムの生成後に外部スクリプトが変更された場合は、新しいチェックサムを生成し、ネイティブ・コマンド・セット・スクリプトを更新する必要があります。

制限付きコマンド

制約事項: 以下の注記は、構成変更ネイティブ・コマンド・セットには適用されません。
制限付きコマンドは、スクリプトを含まない問い合わせネイティブ・コマンド・セット内では許可されません。 例えば、ユーザーは、以下の問い合わせネイティブ・コマンド・セットを保存することを禁止されています。
reload
ただし、ユーザーは、以下の問い合わせネイティブ・コマンド・セットを保存することができます。
//#javascript
function execute(scriptAuditLogger, deviceInterface, systemInterface) {
    var command = “reload”;
    deviceInterface.send(command);
    return true;
}
注: この問い合わせネイティブ・コマンド・セットを保存することは許可されていますが、実行時には失敗します。これは、問い合わせネイティブ・コマンド・セット内の制限付きコマンドをデバイスに送信することが禁止されているためです。

スクリプトの無効化

管理ユーザー (つまり、「システムの表示」アクティビティーと「システムの管理」アクティビティーを持つユーザー) は、以下のシステム・プロパティーを false に設定することにより、スクリプト機能を無効にすることができます。
スクリプト-スクリプトの実行を有効にする
システムは実行時にこのプロパティーを検査し、「false」に設定すると、スクリプトの実行を許可しません。
デフォルト設定は「true」です。

外部システム・コマンドの無効化

管理ユーザー (つまり、「システムの表示」アクティビティーと「システムの管理」アクティビティーを持つユーザー) は、以下のシステム・プロパティーを false に設定することにより、外部システム・コマンドを無効にすることができます。
スクリプト-外部システム・コマンド実行の有効化
システムは実行時にこのプロパティーを検査し、「false」に設定すると、スクリプトの実行を許可しません。
デフォルト設定は「true」です。

スクリプトでのクラスおよびパッケージの許可

外部 Java クラスおよびパッケージをスクリプトで使用できるようにするには、以下のシステム・プロパティーを構成する必要があります。
注: システム・プロパティーを変更するには、「システムの表示」アクティビティーと「システムの管理」アクティビティーがユーザー・グループに割り当てられている必要があります。
スクリプト-スクリプトで許可されるクラス
このシステム・プロパティーは、許可される Java クラスのリストを保管します。 スクリプト内のクラスが許可されているかどうかを判別するために、実行時に検査されます。
デフォルト・リストは空です。これは、システム管理者がクラスをこのリストに追加するまで、クラスは許可されないことを意味します。
許可されるクラスのリストはコンマ区切りです。以下に例を示します。
java.lang.String
java.lang.String, java.lang.StringBuilder, java.util.ArrayList
スクリプト-スクリプトで許可されるパッケージ
このシステム・プロパティーは、許可される Java パッケージのリストを保管します。 スクリプト内のパッケージが許可されているかどうかを判別するために、実行時に検査されます。
デフォルトのリストは空です。これは、システム管理者がパッケージをこのリストに追加するまで、パッケージは許可されないことを意味します。
許可されるクラスのリストはコンマ区切りです。以下に例を示します。
java.util
java.util, java.util.regex, java.text

スクリプトのタイムアウトの設定

管理ユーザー (つまり、「システムの表示」アクティビティーと「システムの管理」アクティビティーを持つユーザー) は、該当するシステム・プロパティーを編集して、コマンド・セットまたはコンプライアンス定義内のスクリプトが、停止する前に完了せずに実行できる時間の長さを定義できます。
スクリプト-最大スクリプト実行時間
デフォルトのスクリプト実行制限は 10 分です。システム管理者は 1 分から 120 分までの時間制限を設定できます。
コマンド・セット内のスクリプトがタイムアウトになると、UOW は「失敗」とマークされます。

スクリプト・サンプル

以下のスクリプトは、Cisco ルーターのクロックが NTP サーバーと同期しているかどうかを判別します。 同期されていない場合は、非同期マスターの IP アドレスが取得され、ping コマンドが発行されます。
//#javascript
function execute(scriptAuditLogger, deviceInterface, systemInterface) {
    var response = deviceInterface.send("show ntp status", "(Clock is unsynchronized)");

    if (response == null) {
        scriptAuditLogger.info("Clock IS synchronized");
        return true;
    } else {
        scriptAuditLogger.info("Clock is NOT synchronized");
        response = deviceInterface.send("show ntp association", "(#\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})");
        if (response != null) {
            var ipAddress = response.substring(1);
            scriptAuditLogger.info("IP address of master = " + ipAddress);
            response = deviceInterface.send("ping " + ipAddress);
            scriptAuditLogger.info(response);
        } else {
            scriptAuditLogger.info("NTP master is NOT configured.");
        }
        return false;
    }
}
以下のスクリプトは、Cisco ルーターのインターフェースの IP アドレスを検索し、IP アドレスごとにネーミング・サービス・ルックアップを実行します。
//#javascript
importClass(java.util.regex.Pattern);
importClass(java.util.regex.Matcher);

function execute(logger, device, system) {
    var ipAddresses = device.send("show ip int brie | ex (Interface|unassigned|down)");
    logger.info(ipAddresses);

    var regexpression = "((?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]))";
    var pattern = Pattern.compile(regexpression, Pattern.MULTILINE);
    var matcher = pattern.matcher(ipAddresses);

    while (matcher.find()) {
        var ipAddress = matcher.group();
        logger.info("Found ip address [" + ipAddress + "]. Performing nslookup...");
        var response = system.executeSystemCommand("/bin/sh", "-c", "/home/icosuser/scripts/nslookup.sh " + ipAddress, "57b0b52e4a43da0591f90d4b7da6f6d189b985bbf4ec787a416104910f7610ac");
        logger.info(response);
    }

    return true;
}
注: この例で使用されているシェル・スクリプト nslookup.shは、 Netcool Configuration Manager サーバー上の /home/icosuser/scripts ディレクトリーに書き込まれ、保存されています。 台本は1行で構成されていた: nslookup $1
注: スクリプトのチェックサムは、icosutil ユーティリティーを使用して計算されました。