2016-06-20 2 views
0

Я написал код сценария оболочки, который успешно добавляет новый IP-адрес подключения к ОС в системе/экземпляре Imperva.CURL - NodeJS Rest API call 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, а не для создания нового сеанса каждый раз для любой операции), успешно удалив JSESSIONID (т.е. выйти из сеанса Imperva, чтобы я не попал в лимит) и успешно искать IP-адрес в системе Imperva, если он был ранее добавлен.

Используя приведенную выше логику сценария оболочки, я написал следующий код NodeJS, чтобы добавить новый IP-адрес подключения к ОС в Imperva с помощью Rest/API, но я получаю сообщение об ошибке.

//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. Как передать параметры CURL -d {...} в коде NodeJS выше, как я использовал его в сценарии оболочки.

PS: Изменение POST получить (метод), гарантирует, что код является штраф синтаксиса мудр, как он успешно показывает IP (с операцией GET) с вышеуказанным кодом NodeJS.

Таким образом, это неудачу только тогда, когда я использую POST (то есть, когда я пытаюсь создать IP) GET-vs (который я использую, чтобы найти IP-адрес существует или нет). Я проверил в соответствии с документом Imperva API, ответ приходит в формате JSON. Не уверен, что из-за отсутствия проблемы с пулей №2, я получаю эту ошибку синтаксиса с помощью POST.

ответ

0

OK.

Решения как пуля № 1 и № 2 было установить CURL «-d значение опций» в NodeJS, как показано ниже (я устанавливал его пустыми ранее):

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

Теперь оба варианты и данные будут отправлены в httpHelp (параметры, данные), и он будет работать.

Вышеуказанное значение является только фиктивным значением. Обычно я передавал действительное имя хоста в объекте JSON.

Никогда не думал, что не задание переменной данных приведет к этой синтаксической ошибке.

Другое дело, мне не хватало. Время BIG было значением для переменной Content-Type внутри заголовка.Именно по этой причине, сообщение об ошибке было наличие «<» кронштейна в нем (как по умолчанию он ищет <body>...</body> раздела, содержащего некоторый формат XML, но в нашем случае, содержал ответ HTML или получал возвращено в формате JSON {...} формат способ для раздела тела. Вот почему он показывает ошибку для неожиданной лексемы <.

в соответствии с API документ, он должен быть типа «JSON», таким образом, изменения в эту строку до

'Content-Type': 'application/json', 
Смежные вопросы