Некоторые задачи невозможно или очень сложно решить только средствами языка ABAP (работа с архивами, криптографией и т.п.), в таких случаях мы можем воспользоваться внешними программами либо через их вызов на сервере представления, либо на сервере приложений.
Взаимодействие с сервером представления уже было ранее описано в блоге. В данной статье рассмотрим возможности вызова команд на стороне сервера приложений.
Существует как минимум три возможности вызова команд на сервере приложений:
- Использование дополнения FILTER в OPEN DATASET
- Использование команды CALL ‘SYSTEM’
- Вызов команд через SXPG фреймворк
Первые два способа официально не рекомендуется использовать, по следующим причинам:
- Нет централизованной проверки полномочий
- Платформенная зависимость должна быть обработана на уровне ABAP кода
- Отсутствие возможности обработки исключительных ситуаций
- Возможны вредоносные внедрения системных команд
Рассмотрим третий вариант.
SXPG Framework по своей сути представляет доступ к заранее определённым и разрешённым командам и их вызовам через функциональные модули с префиксом SXPG_*. Список разрешённых команд определяется в транзакции SM69 (SM49).
SAP заранее уже определил ряд команд, которые можно переиспользовать для своих нужд, вместо заведения их аналогов. Команды ведутся в разрезе платформ, на которых они могут быть запущены — UNIX, WINDOWS и т.п. Соответственно при запуске команд сначала определяется в рамках какой ОС работает сервер приложений и уже потом происходит вызов команды относительно типа платформы.
Пользователь, под которым выполняются команды обычно имеет имя <sid>adm.
Создание и тестирование
Команды определяемые клиентом должны начинаться с Z* или Y*.
Создадим новую команду:
Определим её следующим образом:
Команда ls в UNIX системах позволяет вывести содержимое каталога.
Параметры команды могут быть заданы статически в определении команды или динамически передаваться через интерфейс SXPG. Чтобы иметь возможность задавать параметры команды динамически, необходимо включить галочку Additional parameters allowed.
Если требуется перед выполнением выполнить какую-либо валидацию команды (например доп. проверку полномочий), реализовать это можно указав в поле Check Module собственный ФМ, интерфейс которого будет аналогичен стандартному ФМ-у: SXPG_DUMMY_COMMAND_CHECK.
Протестировать команду можно там же в SM69 по F8. Зададим дополнительный параметр -a для вывода всех файлов:
При выполнении в Execution Target можно определить на каком сервере приложений её необходимо вызывать.
Результат выполнения команды:
Статус выполнения команды можно оценить по полям EXIT Code и EXIT Status. Статус О говорит об успешном выполнении команды, статус Е об ошибке при выполнении. Более подробное описание для UNIX систем описано в ноте: 1128667 — SXPG_COMMAND_EXECUTE: Parameters STATUS and EXITCODE.
Выполнение внешних команд
Перед выполнением любой команды происходит проверка полномочий по стандартному объекту полномочий — S_LOG_COM, его параметры:
- COMMAND — определяет имя команды
- OPSYSTEM — ОС
- HOST — имя сервера приложений
Вызов команд из ABAP кода происходит через вызов ФМ:
- SXPG_CALL_SYSTEM для выполнения на текущем сервере приложений
- SXPG_COMMAND_EXECUTE для выполнения на заданном сервере приложений
- SXPG_COMMAND_EXECUTE_LONG, аналогичен предыдущему, с возможностью передачи более длинного списка параметров для выполнения команды.
Данные ФМ-ы можно вызывать через RFC интерфейс.
Внешние команды могут быть частью фонового задания, как один из его шагов (определение команды в транзакции SM36):
Пример вызова в ABAP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
DATA: lv_parameters TYPE sxpgcolist-parameters VALUE '-a', lt_result TYPE TABLE OF btcxpm WITH EMPTY KEY. CALL FUNCTION 'SXPG_CALL_SYSTEM' EXPORTING commandname = 'ZLS' additional_parameters = lv_parameters TABLES exec_protocol = lt_result EXCEPTIONS no_permission = 1 command_not_found = 2 security_risk = 3 OTHERS = 4. IF sy-subrc = 0. cl_demo_output=>display( lt_result ). ELSE. cl_demo_output=>display( |Error, return code { sy-subrc }| ). ENDIF. |
Результат: