Здесь я покажу, как вы можете создать собственный аддон C ++ для Node.js на z / OS.

Требуется немного усилий, но это возможно!

IBM перенесла Node.js в z / OS, чтобы вы могли запускать серверные приложения Node.js на z / OS. Вы можете скачать его с сайта IBM: IBM SDK для Node.js - z / OS - Обзор.

Мы увидим, как установить его вместе с предоставленным компилятором C / C ++, чтобы вы могли создавать собственные расширения с помощью node-gyp. Мы начнем с создания собственного дополнения Hello World на Mac, а затем создадим такое же расширение на z / OS.

Последняя перенесенная версия Node.js на z / OS - 6.17.0. Мы будем использовать последнюю версию на macOS. Собственный код аддона одинаков на обеих платформах.

Почему вас должен заинтересовать Node.js? Некоторые из причин указаны в https://www.monterail.com/blog/nodejs-development-enterprises. Зачем вам запускать его на z / OS? z / OS предоставляет безопасную, масштабируемую и доступную инфраструктуру для локальной среды. Если большая часть ваших данных находится в z / OS, от этого повысится производительность ваших приложений Node.js.

Когда вам нужно написать собственное дополнение для Node.js на z / OS? Есть две основные причины. Во-первых, это оптимизация кода, чувствительного к производительности, такого как вычисления с интенсивным использованием ЦП. Во-вторых, это взаимодействие с собственным приложением для мэйнфрейма, которое у вас есть на z / OS.

Сборка собственного надстройки Node.js на macOS

Начнем с платформы, которую используют многие разработчики. Вы можете пропустить этот раздел, если вы уже знакомы с этим процессом в macOS, Linux или Windows.

Мы создадим пример аддона из https://github.com/nodejs/node-addon-examples/tree/master/1_hello_world/nan.

В этом примере используется nan - основанная на C ++ абстракция между Node и прямыми API V8. Это очень просто и печатает только:

world

Сначала нам нужно получить исходный код:

git clone https://github.com/nodejs/node-addon-examples.git

Затем смените каталог на пример:

cd node-addon-examples/1_hello_world/nan/

Если у вас еще не установлен Node.js, вы можете использовать Homebrew для его установки:

brew install node

В вашей системе должен быть компилятор C ++. Вам необходимо установить Инструменты командной строки через Xcode:

xcode-select --install

Следующим шагом будет компиляция собственного аддона:

npm install

Вы должны получить аналогичный результат:

> [email protected] install /Users/petrplavjanik/workspace/node-addon-examples/1_hello_world/nan
> node-gyp rebuild
CXX(target) Release/obj.target/hello/hello.o
  SOLINK_MODULE(target) Release/hello.node
audited 2 packages in 3.677s
found 0 vulnerabilities

Вы готовы выдать node hello.js и получить world.

Прежде чем мы сможем сделать то же самое в z / OS, нам нужно установить Node.js в z / OS со всеми необходимыми условиями.

Установка Node.js на z / OS

У вас должны быть все предварительные условия, перечисленные на странице https://www.ibm.com/support/knowledgecenter/en/SSTRRS_6.0.0/com.ibm.nodejs.zos.v6.doc/install.htm:

  • z / OS V2R2 с PTF UI46658, z / OS V2R3 или выше
  • В системах, где запущен SDK для Node.js, должен быть включен Integrated Cryptographic Services Facility (ICSF).
  • Python 2.7.13 или выше, предоставляемый Rocket Software. Обратите внимание, что Python 3.x несовместим с node-gyp, который используется для создания собственных надстроек.
  • GNU Make 4.1 или выше, предоставляемый Rocket Software
  • Bash 4.3 или выше, который предоставляется Rocket Software и требуется для установки Python 2.7.
  • Gzip 1.9 или выше, предоставляемый Rocket Software и необходимый для распаковки другого программного обеспечения, предоставляемого Rocket Software.

Загрузки с открытым исходным кодом Rocket Software доступны по адресу https://my.rocketsoftware.com/RocketCommunity#/downloads.

Если вы используете пробную версию Node.js для z / OS с https://developer.ibm.com/node/sdk/ztp/ вместо установленной версии SMP / E, тогда вам понадобится Perl 5.24.0 или выше. который также предоставляется Rocket Software.

Поскольку нужно сделать много шагов, и они описаны в нескольких руководствах в разных местах, мы рассмотрим их все здесь.

Мы будем использовать Zowe CLI, чтобы упростить взаимодействие с z / OS. Вы можете установить Zowe CLI, следуя инструкциям на странице https://zowe.github.io/docs-site/latest/user-guide/cli-installcli.html#installing-zowe-cli-from-an-online-registry. Включая настройку профиля z / OSMF. Если у вас нет Zowe CLI или z / OSMF, вы можете выполнить все шаги вручную.

Загрузка программного обеспечения Rocket Software с открытым исходным кодом

Мы скачаем все архивы перед их установкой. Загрузите их все в один каталог.

  1. Перейдите на https://my.rocketsoftware.com/RocketCommunity#/downloads
  2. Войдите или зарегистрируйтесь в сообществе Rocket
  3. Найдите make и загрузите make-4.1_b0002.160426.tar.gz
  4. Найдите python и загрузите python-2017–04–12-py27.tar.gz
  5. Найдите perl и загрузите perl-5.24.0_b007.180202.tar.gz
  6. Найдите bash и загрузите bash-4.3_b018.170518.tar.gz
  7. Найдите gzip и загрузите gzip-1.9-edc_b002.180703.tar

Создание файловой системы zFS для программного обеспечения Rocket Software с открытым исходным кодом и Node.js

Вам понадобится около 4 ГБ места. Рекомендуется выделить для него новую файловую систему zFS. Вы можете использовать следующий шаблон задания и заменить переменные ${jobcard} и ${prefix} своей карточкой задания и префиксом для наборов данных с файловой системой zFS.

Вы можете легко отправить этот JCL с помощью Zowe CLI:

curl -O https://gist.githubusercontent.com/plavjanik/fbf4fbf4318a1b7a44ac0381a1a39717/raw/19cc8feabd757549e719bb6c1e49b1dc9f6d9986/create_zfs.jcl

Отредактируйте файл в своем любимом текстовом редакторе и замените переменные. Затем вы можете отправить его:

zowe zos-jobs submit local-file create_zfs.jcl

Попробуйте Zowe CLI! Он позволяет вам взаимодействовать с заданиями z / OS, наборами данных, файлами z / OS UNIX и многим другим с вашей рабочей станции:



После завершения работы вам необходимо смонтировать файловую систему. Войдите в свою систему z / OS через ssh или Putty. Выполните следующую команду (необходимо заменить переменные ${rocket_home} и ${prefix}):

export ROCKET_HOME=${rocket_home}
mkdir ${ROCKET_HOME}
/usr/sbin/mount -f ${prefix}.ZFS ${ROCKET_HOME}
cd ${ROCKET_HOME}
mkdir download

Теперь вам нужно вернуться к терминалу вашей рабочей станции и скопировать пакеты в zFS:

zowe zos-files upload file-to-uss --binary gzip-1.9-edc_b002.180703.tar ${ROCKET_HOME}/download/gzip-1.9-edc_b002.180703.tar
zowe zos-files upload file-to-uss --binary perl-5.24.0_b007.180202.tar.gz ${ROCKET_HOME}/download/perl-5.24.0_b007.180202.tar.gz
zowe zos-files upload file-to-uss --binary python-2017-04-12-py27.tar.gz ${ROCKET_HOME}/download/python-2017-04-12-py27.tar.gz
zowe zos-files upload file-to-uss --binary make-4.1_b0002.160426.tar.gz ${ROCKET_HOME}/download/make-4.1_b0002.160426.tar.gz

Вернитесь в сеанс оболочки z / OS и распакуйте эти пакеты:

tar -C ${ROCKET_HOME} -xovf ${ROCKET_HOME}/download/gzip-1.9-edc_b002.180703.tar
${ROCKET_HOME}/bin/gunzip --stdout {ROCKET_HOME}/download/perl-5.24.0_b007.180202.tar.gz | tar xoUXf -
${ROCKET_HOME}/bin/gunzip --stdout ${ROCKET_HOME}/download/python-2017-04-12-py27.tar.gz | tar xoUXf -
${ROCKET_HOME}/bin/gunzip --stdout ${ROCKET_HOME}/download/bash-4.3_b018.170518.tar.gz | tar xoUXf -
${ROCKET_HOME}/bin/gunzip --stdout ${ROCKET_HOME}/download/make-4.1_b0002.160426.tar.gz | tar xoUXf -
${ROCKET_HOME}/bin/gunzip --stdout ${ROCKET_HOME}/download/python-2017-04-12-py27.tar.gz | tar xoUXf -

Пришло время назначить правильные права доступа:

chmod -R 755 ${ROCKET_HOME}/bin/*
find ${ROCKET_HOME}/lib -type f -exec chmod 644 {} \\;
find ${ROCKET_HOME}/lib -type f -name '*.so' -exec chmod 755 {} \\;

Нам нужно установить переменные среды, прежде чем эти инструменты будут доступны для чтения. Для них требуется автоматическое преобразование.

Вот рекомендуемые настройки:

Вам нужно поместить их в каталог в zFS:

curl -O https://gist.githubusercontent.com/plavjanik/94d859826f5064691266406c1d431037/raw/249265ad8b71a4aef1e3140322ec613789024ea4/rocket_activate.sh
# edit rocket_activate.sh and replace ${rocket_home}
zowe zos-files upload file-to-uss rocket_activate.sh ${rocket_home}/rocket_activate.sh

Затем вы можете сделать его активным в оболочке z / OS:

. ${ROCKET_HOME}/rocket_activate.sh

Вы можете поместить эту строку в свой ~/.profile, если хотите, чтобы она активировалась для каждого сеанса.

Последний шаг - завершить установку Python:

export BASH_PREFIX=${ROCKET_HOME}/bin
export PERL_PREFIX=${ROCKET_HOME}/bin
export RELEASE_NAME=python-2017-04-12
export RELEASE_TYPE=py27
export RELEASE_DIR=${ROCKET_HOME}/${RELEASE_NAME}-${RELEASE_TYPE}
export PKGS_BASE=${RELEASE_DIR}/pkgs
cd ${PY_RELEASE_DIR}/python27; bin/install_all_packages

Если все в порядке, удалите пакеты:

rm -Rf download

Загрузите и установите Node.js для z / OS

Теперь мы готовы установить Node.js для z / OS. Загрузите файл PAX с https://developer.ibm.com/node/sdk/ztp/.

Загрузите файл PAX ibm-6.17.0.0-trial-node-v6.17.0-os390-s390x.pax.Z в zFS.

zowe zos-files upload file-to-uss --binary ibm-6.17.0.0-trial-node-v6.17.0-os390-s390x.pax.Z ${rocket_home}/ibm-6.17.0.0-trial-node-v6.17.0-os390-s390x.pax.Z

В оболочке z / OS:

cd ${ROCKET_HOME}
pax -rf ibm-6.17.0.0-trial-node-v6.17.0-os390-s390x.pax.Z -x pax

Node.js установлен для запуска приложений, но нам нужно заставить работать компилятор Node.js SDK C / C ++. Это можно сделать с помощью unpack.pl сценария, но для правильной работы этот сценарий требует обновлений вручную.

Вы можете скачать его по следующей ссылке: https://pastebin.com/MJDDeF1u

curl https://pastebin.com/raw/MJDDeF1u > unpack2.pl
zowe zos-files upload file-to-uss unpack2.pl ${rocket_home}/node-v6.17.0-os390-s390x/unpack2.pl

On z/OS:

cd ${ROCKET_HOME}/node-v6.17.0-os390-s390x
ln -s bin/njsc++ bin/g++
chmod a+x *.pl
COMPILER_INSTALL_ACCOUNT_NUMBER=${account_number} COMPILER_INSTALL_MSGCLASS=X COMPILER_INSTALL_HLQ=${rocket_hlq}.CC COMPILER_INSTALL_VOLSER=${volser} perl ./unpack2.pl

Например:

COMPILER_INSTALL_ACCOUNT_NUMBER=129300000 COMPILER_INSTALL_MSGCLASS=X COMPILER_INSTALL_HLQ=MFAAS.NODE.CC COMPILER_INSTALL_VOLSER=TSU001 perl ./unpack2.pl

Это займет некоторое время, и в конце вы должны увидеть следующее сообщение:

Hello C++ World!
<INFO> installation complete!

Если вы не видите это сообщение, проверьте два задания, которые были отправлены этим сценарием.

Среда C / C ++ поставляется предварительно настроенной при использовании npm для создания собственных надстроек. Однако, если вы вызываете node-gyp напрямую для сборки собственного кода, необходимо установить следующие переменные среды компилятора C / C ++:

export CC=eb2as.sh
export CXX=eb2as.sh
export LINK=eb2as.sh
export _C89_CCMODE=1
export _CC_CCMODE=1
export _CXX_CCMODE=1

Вы должны добавить следующие строки в сценарий оболочки активации rocket_activate.sh:

# Node.js:
NODE_VERSION="v6.17.0"
export NODE_HOME=${ROCKET_HOME}/node-${NODE_VERSION}-os390-s390x
export PATH=${NODE_HOME}/bin:$PATH
export LIBPATH=${NODE_HOME}/lib:${LIBPATH}
export MANPATH=${NODE_HOME}/man/:${MANPATH}
export CC=eb2as.sh
export CXX=eb2as.sh
export LINK=eb2as.sh
export _C89_CCMODE=1
export _CC_CCMODE=1
export _CXX_CCMODE=1

И активируйте его:

. ${ROCKET_HOME}/rocket_activate.sh
mkdir -p 1_hello_world/nan

Убедитесь, что работает, выполнив node --version , который должен вернуть v6.17.0.

Сборка собственного дополнения на z / OS

Перейдите в каталог с образцом надстройки на вашей рабочей станции:

cd node-addon-examples/1_hello_world/nan/

Скопируйте исходные файлы в z / OS:

zowe zos-files upload file-to-uss binding.gyp ${rocket_home}/1_hello_world/nan/binding.gyp
zowe zos-files upload file-to-uss hello.cc ${rocket_home}/1_hello_world/nan/hello.cc
zowe zos-files upload file-to-uss hello.js ${rocket_home}/1_hello_world/nan/hello.js
zowe zos-files upload file-to-uss package.json ${rocket_home}/1_hello_world/nan/package.json

Мы готовы построить его на z / OS:

cd ${ROCKET_HOME}/1_hello_world/nan
npm install --nodedir=${NODE_HOME}

Параметр --nodedir=${NODE_HOME} важен, потому что он заставляет node-gyp использовать заголовки C ++ из Node.js в z / OS вместо загрузки версии not-z / OS из Интернета.

Тогда можете выдать node hello.js.

Результат должен быть world!

В будущем мы будем работать с наборами данных VSAM из приложения Node.js и создадим простую службу API на z / OS, которая считывает и хранит данные в наборах данных VSAM vsam.js и Express. Мой напарник Дэн Келоски покажет вам, как использовать NestJS с TypeScript на z / OS.

Вы готовы воспользоваться преимуществами экосистемы Node.js и npm: https://www.monkeyuser.com/2017/npm-delivery/ 😊

Ссылки