Я написал код сценария оболочки, который успешно добавляет новый 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.