2016-06-20 16 views
0

Impervaシステム/インスタンスに新しいOS接続IPを追加するシェルスクリプトコードを記述しました。CURL - NodeJS Rest API呼び出しImperva - [SyntaxError:予期しないトークン<]

## Create a new IP OS connection in a given site, server group. 
create_ip() 
{ 
JSESSIONID="${1}" 
addThisIP="${2}" 
siteName="${3}" 
serverGroupName="${4}" 
echo -e "\n- Trying to create a new OS connection IP now.\n"; 

##Make sure while initiating a REST API call, any parameter which has ' ' (space) in Imperva should be substituted with '%20'. 
##JSESSIONID will be generated first and will be available to this function 
create_new_ip_output="$(curl -ik -X POST -H "Cookie: JSESSIONID=$JSESSIONID" -H "Content-Type: application/json" -H "Accept: application/json" "https://${MX}:8083/SecureSphere/api/v1/conf/serverGroups/${siteName// /%20}/${serverGroupName// /%20}/servers/${addThisIP}" -d '{"connection-mode":"SSH","host-name":"thisLinuxServer.fdqn","OS-type":"linux","user-name":"enter_your_userID"}')"; 
return_code="$?"; 
if [[ "${return_code}" == "0" && ! `echo "${create_new_ip_output}" | grep "do not have permission"` ]]; then 
    echo -e "\n\n- OS connection IP (${addThisIP}) created successfully in site: ${siteName}, servergroup: ${serverGroupName} and stdout:\n${create_new_ip_output}\n"; 
    return 0; 
else 
    echo -e "\n\n- Failed to create a new OS connection IP (${addThisIP}) in site: ${siteName} and servergroup: ${serverGroupName}\n- using session ID: ${JSESSIONID}, error log:\n${create_new_ip_output}\n"; 
    return 1; 
fi 
} 

OKは、上記のコードは、私はIPが正常に追加または何失敗のメッセージだっしまったかどうかを示す有効な出力が表示され、正常に動作して一度実行します。

今、私はNodeJSに同じ機能を実装しようとしています。

これを行うには、JSESSIONIDを生成する関数を正常に作成しました(つまり、操作ごとに新しいセッションを作成するのではなく、複数のREST/API呼び出し操作を実行するために使用できます) Impervaセッションからログオフ/アウトして限界に達することはありません)、以前に追加されたImpervaシステムのIPを正常に検索できます。

上記のシェルスクリプトロジックを使用して、Rest/APIを使用して新しいOS接続IPをImpervaに追加するために、次のNodeJSコードを記述しましたが、エラーが発生しています。

//Imperva create IP 
//qData is a hash array that has valid index/value pair values. 
var impervaCreateIP = function(qData){ 
    var deferred = Q.defer(); 
    var data = '' 
    var options = { 
    hostname: 'myImpervaServerInstance.mycompanydomain.com', 
    port: 8083, 
    method: 'POST', 
    path: '/SecureSphere/api/v1/conf/serverGroups/'+ qData['siteName'] + '/' + qData['serverGroupName'] + '/servers/' + qData['ip'], 
    headers: { 
     'Content-Type': 'application/xml', 
     'X-Requested-With': 'Nodejs', 
     'Cookie': 'JSESSIONID='+qData['sid'] 
    } 
    } 
    //svtLog() is a logger that I'm using to log messages to a file. Out of scope of this post. 
    svtLog('info','Imperva','Inside impervaCreateIP function') 
    svtLog('info','Imperva',qData['ip']) 
    svtLog('info','Imperva',qData['siteName']) 
    svtLog('info','Imperva',qData['serverGroupName']) 
    svtLog('info','Imperva','') 
    console.log('Inside impervaCreateIP') 
    console.log(options); 
    httpHelp(options, data) 
    .then(function(fullResponse){ 
    var result = JSON.parse(fullResponse[1]) 
    console.log("11 -----") 
    console.log(result) 
    console.log("22 -----") 
    deferred.resolve(qData['sid']) 
    console.log(result) 
    }) 
    .fail(function(e){ 
    svtLog('error','Imperva','Failed to add IP in Imperva') 
    svtLog('info','Imperva',qData['ip']) 
    svtLog('error','Imperva',e) 
    svtLog('info','Imperva','') 
    deferred.reject(e) 
    }) 
    return deferred.promise; 
} 

エラーメッセージ:

Inside impervaCreateIP 
{ hostname: 'myImpervaServerInstance.mycompanydomain.com', 
    port: 8083, 
    method: 'POST', 
    path: '/SecureSphere/api/v1/conf/serverGroups/some%20Site%20NameInImperva/someServerGroupNameInImperva_01/servers/10.20.30.40', 
    headers: 
    { 'Content-Type': 'application/xml', 
    'X-Requested-With': 'Nodejs', 
    Cookie: 'JSESSIONID=7B3C378D365B673F6C749847DEDC7D8F } } 
[SyntaxError: Unexpected token <] 

私は2つのことを探しています:
1(上図のように)エラーを解決する方法。
2.上記のNodeJSコードのCURLの-dオプション{...}ボディパラメータを、シェルスクリプトで使用したように渡すにはどうすればいいですか?

PS:(メソッド)を取得するためにPOSTを変更し、それが成功した上記NodeJSコードで(GET操作で)IPを示してコードが細かい構文賢明であることを保証します。

だから、それは私がPOST(私はIPを作成しようとしている、すなわち時)-vs- GETを(私は存在しないかではないIPを見つけるために使用する)を使用する場合にのみを失敗です。私はImperva APIのdocに従ってチェックしました。応答はJSON形式です。 2番目の質問が見つからないため、POSTでこの構文エラーが発生しています。

答えて

0

OK。弾丸#1と#2の両方に

ソリューションは、(私が以前に空白を設定した)、以下に示すようなNodeJSにCURL「-dオプション値」を設定しました:

var data = '{"connection-mode":"SSH","host-name":"thisLinuxServer.fdqn","OS-type":"linux","user-name":"enter_your_userID"}' 

、両方のオプションとデータがhttpHelp(options、data)に送信され、それが動作します。

上記は単なるダミーデータ値です。通常は、JSONオブジェクトに有効なホスト名を渡します。

データ変数を設定しないとこの構文エラーが発生するとは決して考えられませんでした。

他のもの、私は見逃していましたヘッダー変数の中に 'Content-Type'の値がありました。すなわち、それは、いくつかのXML形式を含む<body>...</body>セクションを探しますが、我々の場合には、HTML応答が含まれているか、JSON で返さなっていた、デフォルトでと、エラーメッセージが(それで「<」ブラケットを持っていた、その理由でした本体部のための{...}形式の道。それは予期しないトークン<のエラーを示していた理由です。

APIドキュメントごとに、その行を変えので、「JSON」タイプされているはずのよう〜

'Content-Type': 'application/json', 
関連する問題