Создание дополнительных модулей защиты от мошенничества

Материал из ISPWiki

Перейти к: навигация, поиск

Архитектура BILLmanager позволяет добавлять к системе собственные модули-обработчики. Структура модуля защиты от мошенничества состоит из двух файлов:

  1. XML файл описания интерфейса настройки параметров соединения на стороне провайдера с именем billmgr_mod_xxx.xml, где xxx любая уникальная разрешенная последовательность символов. Файл должен располагаться в папке {путь к папке установки}/etc/ и обязательно должен быть в кодировке UTF-8.
  2. Бинарный или текстовый (в зависимости от языка реализации) файл модуля обработчика. Файл должен располагаться в каталоге /usr/local/ispmgr/sbin/, имя файла должно начинаться с fp.

Содержание

Структура файла XML

Документ XML состоит из двух частей:

  • Описание полей формы параметров
  • Локализованные подписи к полям формы
<?xml version="1.0" encoding="UTF-8"?>
<mgrdata>
	<metadata name="fraudparam_xxx" type="form"><!--Параметры формы настройки защиты от мошенничества-->
		<form>
			<field name="field_1">
				<input type="text" name="field_1" empty="no"/>
			</field>
			<!--...-->
			<field name="field_n">
				<input type="text" name="field_n" empty="no"/>
			</field>
		</form>
	</metadata>
	<metadata name="smsgateparam_xxx" type="form"><!--Параметры формы настройки в качестве СМС шлюза-->
		<form>
			<field name="field_1">
				<input type="text" name="field_1" empty="no"/>
			</field>
			<!--...-->
			<field name="field_n">
				<input type="text" name="field_n" empty="no"/>
			</field>
		</form>
	</metadata>
	<lang name="en">
		<messages name="fraudconf"><!--Локализация наименования в списке выбора модулей защиты от мошенничества для английского языка-->
			<msg name="xxx">XXX</msg>
		</messages>
		<messages name="supportgate.stepsms.selectgate"><!--Локализация наименования в списке выбора модулей СМС шлюзов для английского языка-->
			<msg name="xxx">XXX</msg>
		</messages>
		<messages name="fraudparam_xxx"><!--Локализация подписей к параметрам настройки защиты от мошенничества для английского языка-->
			<msg name="title">Phone check from XXX/msg>
			<msg name="field_1">Field 1</msg>
			<msg name="hint_field_1">Hint for Field 1</msg>
			<!--...-->
			<msg name="field_n">Field n</msg>
			<msg name="hint_field_n">Hint for Field n</msg>
			<!--Общие сообщения. Используются во всех модулях-->
			<msg name="phonereg">Phone number filter</msg>
			<msg name="hint_phonereg">Provide the phone numbers that will be allowed for use. Leaving the field blank will not set the filter.</msg>
			<msg name="template">Message template (en)</msg>
			<msg name="hint_template">Provide a message template. The code is specified in the %CODE% parameter or at the end of the message if the parameter is omitted.</msg>
			<msg name="msg_error_phonereg_regex">Invalid regular expression</msg>
		</messages>
		<messages name="smsgateparam_xxx"><!--Локализация подписей к параметрам настройки СМС шлюза для английского языка-->
			<msg name="title">SMS gate from Text Magic</msg>
			<msg name="field_1">Field 1</msg>
			<msg name="hint_field_1">Hint for Field 1</msg>
			<!--...-->
			<msg name="field_n">Field n</msg>
			<msg name="hint_field_n">Hint for Field n</msg>
			<!--Общие сообщения. Используются во всех модулях-->
			<msg name="phonereg">Phone filter</msg>
			<msg name="hint_phonereg">Enter a filter for phone numbers that can be used or leave the field blank</msg>
			<msg name="send_from">Time</msg>
			<msg name="hint_send_from">Provide a default time in the format: HH:MM:SS</msg>
			<msg name="send_to">To</msg>
			<msg name="hint_send_to">Provide a default time in the format: HH:MM:SS</msg>
		</messages>
	</lang>
	<lang name="ru">
		<messages name="fraudconf"><!--Локализация наименования в списке выбора модулей защиты от мошенничества для русского языка-->
			<msg name="xxx">XXX</msg>
		</messages>
		<messages name="supportgate.stepsms.selectgate"><!--Локализация наименования в списке выбора модулей СМС шлюзов для русского языка-->
			<msg name="xxx">XXX</msg>
		</messages>
		<messages name="fraudparam_xxx"><!--Локализация подписей к параметрам настройки защиты от мошенничества для русского языка-->
			<msg name="title">Проверка телефона от XXX</msg>
			<msg name="field_1">Field 1</msg>
			<msg name="hint_field_1">Hint for Field 1</msg>
			<!--...-->
			<msg name="field_n">Field n</msg>
			<msg name="hint_field_n">Hint for Field n</msg>
			<!--Общие сообщения. Используются во всех модулях-->
			<msg name="phonereg">Фильтр номеров</msg>
			<msg name="hint_phonereg">Укажите фильтр разрешенных номеров телефонов. Поле можно оставить пустым</msg>
			<msg name="template">Шаблон сообщения (en)</msg>
			<msg name="hint_template">Укажите шаблон отправляемого сообщения. Поле можно оставить пустым. Код передается в параметр %CODE% или в конце сообщения если параметр опущен.</msg>
			<msg name="msg_error_phonereg_regex">Указано неверное регулярное выражение</msg>
		</messages>
		<messages name="smsgateparam_xxx"><!--Локализация подписей к параметрам настройки СМС шлюза для русского языка-->
			<msg name="title">СМС шлюз от Text Magic</msg>
			<msg name="field_1">Field 1</msg>
			<msg name="hint_field_1">Hint for Field 1</msg>
			<!--...-->
			<msg name="field_n">Field n</msg>
			<msg name="hint_field_n">Hint for Field n</msg>
			<!--Общие сообщения. Используются во всех модулях-->
			<msg name="phonereg">Фильтр номеров</msg>
			<msg name="hint_phonereg">Укажите фильтр разрешенных номеров телефонов. Поле можно оставить пустым</msg>
			<msg name="send_from">Время отправки с</msg>
			<msg name="hint_send_from">Укажите время отправки по умолчанию. Формат времени ЧЧ:ММ:СС</msg>
			<msg name="send_to">Время отправки по</msg>
			<msg name="hint_send_to">Укажите время отправки по умолчанию. Формат времени ЧЧ:ММ:СС</msg>
		</messages>
	</lang>
</mgrdata>

Здесь xxx - наименование файла обработчика без fp. Все параметры указанные на формах настройки модуля будут сохранены в файл (для защиты от мошенничества) или базу данных (для СМС шлюза).

Структура модуля

При работе BILLmanager обращается к файлу модуля передавая ему необходимые данные через параметры командной строки. Реализация модуля обработчика должна предусматривать обязательную обработку параметров командной строки и реализовывать соответствующую логику реакции на передаваемые команды.

До версии 4.0.61

Параметры конфигурации модуля для сохраняются в файл {путь к папке установки}/etc/fpxxx.conf (sgxxx{ID партнера}.conf - для настроек СМС шлюза), где xxx - имя модуля, в формате: <имя параметра> <значение>. Каждый параметр записан с новой строки.

Начиная с версии 4.0.61

Параметры конфигурации модуля, при настройке в качестве СМС шлюза, сохраняются в базе данных, таблица support_gate, поле xmldata, в формате XML. Каждый параметр представлен нодой XML документа.

Начиная с версии 4.0.67

Параметры конфигурации модуля, сохраняются в базе данных, таблица support_gate для СМС шлюзов и fraud_gate для защиты от мошенничества, поле xmldata (data), в формате XML. Каждый параметр представлен нодой XML документа.

Принимаемые команды и параметры

  • type - необходимо передать в стандартный поток вывода тип модуля: 'sms', если будет производится отправка SMS сообщения, или 'call', если будет производится звонок.
  • features - в стандартный поток необходимо передать список поддерживаемых функций: fraud и/или gate, например: "fraud gate".
  • senderparamname - если шлюз поддерживает указание имени отправителя при отправке сообщения, в ответ на данную команду необходимо вывести наименование параметра, который будет сохранен в конфигурации шлюза. В xml для данного параметра необходимо добавить описание поля.
  • senderbyproject - если шлюз поддерживает использование различных имен отправителя, в ответ на данный параметр можно вернуть 'yes'. Тогда на форме настроек шлюза будет присутствовать несколько полей для указания имени отправителя.
  • validate - необходимо проверить данные и передать 'ok' в стандартный поток вывода или ошибку, если необходимо.
  • tune - при необходимости в ответ на эту команду можно передать в стандартный поток вывода XML документ описания интерфейса.
  • sendsms - команда отправки СМС сообщения, принимает параметры: partnerid phone и текст сообщения через стандартный поток ввода. Здесь partnerid - идентификатор учетной записи партнера, если отправка СМС производится клиенту партнера, phone - номер телефона, на который производится отправка сообщения. По окончанию отправки в стандартный поток вывода нужно передать "OK", если отправка произведена успешно, и "ERROR", если отправка завершилась с ошибкой.'
  • call - вызов обработчика отправки SMS или совершения звонка, полная версия вызова выглядит как fpxxx call ccode phone code lang project gate_id, где call - управляющая команда, ccode - код страны в номере телефона, phone - номер телефона, code - проверочный код, lang - код основного языка пользователя, project - проект, нужен, если используются разные сообщения для разных проектов, gate_id - код шлюза, через который производится отправка или звонок.
  • sendcode - вызов обработчика отправки SMS с кодом для восстановления пароля, полная версия вызова выглядит как fpxxx sendcode phone username msg project, где sendcode - управляющая команда, phone - номере телефона, phone - номер телефона, username - имя пользователя, для которого производится восстановление пароля, msg - сообщение с кодом восстановления пароля, project - код проекта, к которому прикреплен клиент.

По выполнению команды call и sendcode модуль должен сообщить BILLmanager о своем завершении:

  • В случае успешного завершения необходимо вызвать команду '{путь к папке установки}/sbin/mgrctl -m billmgr -o xml longtask.finish elid=(PID файл запуска) status=ok'
  • В ином случае необходимо вызвать команду '{путь к папке установки}/sbin/mgrctl -m billmgr -o xml longtask.finish elid=(PID файл запуска) status=err errmsg=(текст сообщения об ошибке)'

Подробнее об этом в статье про LongTask

Пример модуля

Рассмотрим создание скрипта модуля на примере подключения к API TextMagic (приведенный ниже текст XML и скрипта обработчика является лишь примером, и не может быть использован в рабочей среде без переработки).

XML документ

Пример XML документа:

<?xml version="1.0" encoding="UTF-8"?>
<mgrdata>
	<metadata name="fraudparam_textmagic.php" type="form">
		<form>
			<field name="username">
				<input type="text" name="username" empty="no"/>
			</field>
			<field name="password">
				<input type="text" name="password" empty="no"/>
			</field>
		</form>
	</metadata>
	<metadata name="smsgateparam_textmagic.php" type="form">
		<form>
			<field name="username">
				<input type="text" name="username" empty="no"/>
			</field>
			<field name="password">
				<input type="text" name="password" empty="no"/>
			</field>
		</form>
	</metadata>
	<lang name="en">
		<messages name="fraudgate">
			<msg name="textmagic.php">Text Magic</msg>
			<msg name="module_textmagic.php">Text Magic</msg>
		</messages>
		<messages name="fraudconf">
			<msg name="textmagic.php">Text Magic</msg>
			<msg name="module_textmagic.php">Text Magic</msg>
		</messages>
		<messages name="supportgate.stepsms.selectgate">
			<msg name="textmagic.php">Text Magic</msg>
		</messages>
		<messages name="fraudparam_textmagic.php">
			<msg name="title">Phone check from Text Magic</msg>
			<msg name="username">User name</msg>
			<msg name="hint_username">Specify a user name</msg>
			<msg name="password">Password</msg>
			<msg name="hint_password">Specify a password</msg>
			<msg name="hint_phonereg">Provide the phone numbers that will be allowed for use. Leaving the field blank will not set the filter. </msg>
			<msg name="hint_template">Provide a message template. The code is specified in the %CODE% parameter or at the end of the message if the parameter is omitted.  </msg>
			<msg name="msg_error_phonereg_regex">Invalid regular expression </msg>
			<msg name="phonereg">Phone number filter </msg>
			<msg name="template">Message template (en) </msg>
			<msg name="priority">Priority</msg>
			<msg name="originator">Originator</msg>
		</messages>
		<messages name="smsgateparam_textmagic.php">
			<msg name="title">SMS gate from Text Magic</msg>
			<msg name="username">User name</msg>
			<msg name="hint_username">Specify a user name</msg>
			<msg name="password">Password</msg>
			<msg name="hint_password">Specify a password</msg>
			<msg name="hint_phonereg">Enter a filter for phone numbers that can be used or leave the field blank </msg>
			<msg name="hint_send_from">Provide a default time in the format: HH:MM:SS</msg>
			<msg name="hint_send_to">Provide a default time in the format: HH:MM:SS</msg>
			<msg name="phonereg">Phone filter </msg>
			<msg name="send_from">Time</msg>
			<msg name="send_to">To</msg>
			<msg name="priority">Priority</msg>
			<msg name="originator">Originator</msg>
		</messages>
	</lang>
	<lang name="ru">
		<messages name="fraudgate">
			<msg name="textmagic.php">Text Magic</msg>
			<msg name="module_textmagic.php">Text Magic</msg>
		</messages>
		<messages name="fraudconf">
			<msg name="textmagic.php">Text Magic</msg>
			<msg name="module_textmagic.php">Text Magic</msg>
		</messages>
		<messages name="fraudparam_textmagic.php">
			<msg name="title">Проверка телефона от Text Magic</msg>
			<msg name="username">Имя пользователя</msg>
			<msg name="hint_username">Укажите имя пользователя</msg>
			<msg name="password">Пароль</msg>
			<msg name="hint_password">Укажите пароль</msg>
			<msg name="phonereg">Фильтр номеров</msg>
			<msg name="hint_phonereg">Укажите фильтр разрешенных номеров телефонов. Поле можно оставить пустым</msg>
			<msg name="msg_error_phonereg_regex">Указано неверное регулярное выражение</msg>
			<msg name="template">Шаблон сообщения (en)</msg>
			<msg name="priority">Приоритет</msg>
			<msg name="originator">Отправитель</msg>
			<msg name="hint_template">Укажите шаблон отправляемого сообщения. Поле можно оставить пустым. Код передается в параметр %CODE% или в конце сообщения если параметр опущен.</msg>
		</messages>
		<messages name="smsgateparam_textmagic.php">
			<msg name="title">СМС шлюз от Text Magic</msg>
			<msg name="username">Имя пользователя</msg>
			<msg name="hint_username">Укажите имя пользователя</msg>
			<msg name="password">Пароль</msg>
			<msg name="hint_password">Укажите пароль</msg>
			<msg name="phonereg">Фильтр номеров</msg>
			<msg name="hint_phonereg">Укажите фильтр разрешенных номеров телефонов. Поле можно оставить пустым</msg>
			<msg name="send_from">Время отправки с</msg>
			<msg name="hint_send_from">Укажите время отправки по умолчанию. Формат времени ЧЧ:ММ:СС</msg>
			<msg name="send_to">Время отправки по</msg>
			<msg name="priority">Приоритет</msg>
			<msg name="originator">Отправитель</msg>
			<msg name="hint_send_to">Укажите время отправки по умолчанию. Формат времени ЧЧ:ММ:СС</msg>
		</messages>
	</lang>
</mgrdata>

Скрипт обработчик

Пример скрипта обработчика на PHP

#!/usr/bin/php
<?php

Установка обработчика исключений, открытие лог файла и запись в него полученных параметров командной строки

	set_error_handler("tmErrorHandler");
	$log_file = fopen("/usr/local/ispmgr/var/fptextmagic.log", "a");
	fwrite($log_file, "=======".date("M j H:i:s") . "[] " ."=======\n");
	foreach($argv as $line_num => $line) {
		fwrite($log_file, date("M j H:i:s") . "[] " . $line_num.":".$line."\n");
	}

Если получено мало параметров, вывод информацию об использовании

	if ($argc<2) {
		usage();
	} else {
		switch($argv[1]) {

Вывод списка возможностей список возможностей

			case "features":
				echo "fraud gate";
				break;

Проверка параметров

			case "validate":
				echo "ok";
				break;

Настройка формы

			case "tune":
				break;

Параметр задающий имя отправителя сообщений

			case "senderparamname":
				echo "originator";
				break;

Признак настройки разных отправителей для разных проектов

			case "senderbyproject":
				echo "yes";
				break;

Возврат типа шлюза

			case "type":
				echo "sms";
				break;

Обработка отправки СМС для защиты от мошенничества

			case "call":
				if ($argc<5 || $argc>6) {
					fwrite($log_file, date("M j H:i:s") . "[] " . "Invalid params number." . "\n");

					usage();
				} else {
					fwrite($log_file, date("M j H:i:s") . "[] " . "Start call API." . "\n");

					if ($argc == 4) {
						callfraud($argv[2] . $argv[3], $argv[4]);
					} else {
						callfraud($argv[2] . $argv[3], $argv[4], $argv[5]);
					}
				}
				break;

Обработка отправки СМС

			case "sendsms":
				if ($argc > 4 || $argc < 3) {
					fwrite($log_file, date("M j H:i:s") . "[] " . "Invalid params number." . "\n");

					usage();
				} else {
					fwrite($log_file, date("M j H:i:s") . "[] " . "Start call API." . "\n");
					$msg = "";
					$f = fopen('php://stdin', 'r');
					while ($line = fgets($f))
						$msg .= $line;
					callgate($argv[2], $argv[3], $msg);
				}
				break;

Обработка отправки кода восстановления пароля

			case "sendcode":
				if ($argc < 6) {
					fwrite($log_file, date("M j H:i:s") . "[] " . "Invalid params number." . "\n");

					usage();
				} else {
					fwrite($log_file, date("M j H:i:s") . "[] " . "Start call API." . "\n");
					$msg = $argv[4];
					callgate($argv[5], $argv[1], $msg);
					exec("/usr/local/ispmgr/sbin/mgrctl -m billmgr -o xml longtask.finish elid=". getenv("MGR_LT_PID") ." status=ok");
				}
				break;
			default:
				usage();
		}	
	}

	fwrite($log_file, "=======".date("M j H:i:s") . "[] " ."=======\n");
	fclose($log_file);

Функция вывода информации об использовании

function usage() {
		print("ISPsystem BILLmanager plugin v1.0
Text Magic integration plugin.
Usage:
	features - print 'fraud gate';
	validate - print 'ok';
	tune - no return value;
	type - return 'sms' as type of plugin;
	sendsms 'partnerid' 'phone_number' <msg> - send sms to phone number;
 	call 'country_code' 'phone_number' 'verification_code' 'lang' - execute plugin function.\n");
}

Функция отправки сообщения для защиты от мошеичества

function callfraud($phone, $code, $lang = "en") {
		global $log_file;

		fwrite($log_file, date("M j H:i:s") . "[] " . "Phone: " . $phone . " Code: " . $code . "\n");

		$msg = "Your verification code is ".$code;

Получаем настройки из конфигурационного файла

		$lines = file("/usr/local/ispmgr/etc/fptextmagic.php.conf", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

		$params = array();

		foreach ($lines as $line_num => $line) {
			$arr_key = "";
			$arr_val = "";
			list($arr_key, $arr_val) = explode(" ", $line, 2);
			$params += array($arr_key => $arr_val);
		}

		$curl_client = curl_init("https://www.textmagic.com/app/api");

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");
		$data = array("username" => $params["username"], "password" => $params["password"], "cmd" => "send",
			      "text" => $msg, "phone" => $phone, "unicode" => "0");

		curl_setopt($curl_client, CURLOPT_SSL_VERIFYPEER, 0);

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

		curl_setopt($curl_client, CURLOPT_POST, 1);

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

		curl_setopt($curl_client, CURLOPT_POSTFIELDS, $data);

		fwrite($log_file, date("M j H:i:s") . "[] " . print_r($data, true) . "\n");

		curl_setopt($curl_client, CURLOPT_RETURNTRANSFER, true);

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

		$output = curl_exec($curl_client);

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

		fwrite($log_file, date("M j H:i:s") . "[] " . $output . "\n");
		
		fwrite($log_file, date("M j H:i:s") . "[] Finish task with PID file " . getenv("MGR_LT_PID") . "\n");

		exec("/usr/local/ispmgr/sbin/mgrctl -m billmgr -o xml longtask.finish elid=". getenv("MGR_LT_PID") ." status=ok");

		curl_close($curl_client);
	}

Функция отправки сообщения в качестве СМС шлюза (так же для отправки кода восстановления пароля)

	function callgate($partnerid, $phone, $msg) {
		global $log_file;

		fwrite($log_file, date("M j H:i:s") . "[] " . "PartnerID: " . $partnerid . " Phone: " . $phone . "\n");

Получаем настройки из базы данных

		$params = array();

		$param_array = file("/usr/local/ispmgr/etc/billmgr.conf", FILE_SKIP_EMPTY_LINES	);
						
		$params["DBHost"] = "localhost";
		$params["DBName"] = "billmgr";
		$params["DBUser"] = "root";
		$params["DBPassword"] = "";
			
		foreach ($param_array as $param_line_num => $param_line) {
			$param_array = preg_split("/\s+/", $param_line);
			$params[$param_array[0]] = count($param_array) > 1 ? $param_array[1] : "";
		}
			
		$conn = mysql_connect($params["DBHost"], $params["DBUser"], $params["DBPassword"]);
		$res = mysql_select_db($params["DBName"], $conn);
		if (!$res)
			throw Exception("Database connection problem!");

		if ($partnerid == 0)
			$partnerid = 1;

		$query = "select xmldata from support_gate sg left join project p on p.id = sg.project where p.account = $partnerid and gatetype = 1 and xmldata like '%textmagic.php%'";

		$result = mysql_query($query, $conn);
		if (!$result)
			throw new Exception("MySql error: ".mysql_error($conn));
		$row = mysql_fetch_row($result);

		$xmldata = new SimpleXMLElement($row[0]);
		$params["username"] = $xmldata->username;
		$params["password"] = $xmldata->password;

		$curl_client = curl_init("https://www.textmagic.com/app/api");

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

		$data = array("username" => $params["username"], "password" => $params["password"], "cmd" => "send",
			      "text" => $msg, "phone" => $phone, "unicode" => "0");

		curl_setopt($curl_client, CURLOPT_SSL_VERIFYPEER, 0);

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

		curl_setopt($curl_client, CURLOPT_POST, 1);

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

		curl_setopt($curl_client, CURLOPT_POSTFIELDS, $data);

		fwrite($log_file, date("M j H:i:s") . "[] " . print_r($data, true) . "\n");

		curl_setopt($curl_client, CURLOPT_RETURNTRANSFER, true);

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

		$output = curl_exec($curl_client);

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

		fwrite($log_file, date("M j H:i:s") . "[] " . $output . "\n");

		curl_close($curl_client);

		echo "OK";
	}

Обработчик ошибок

	function tmErrorHandler($errno, $errstr, $errfile, $errline) {
		global $log_file;
		fwrite($log_file, date("M j H:i:s") . "[] " . "Error [" . $errno . "] ErrMsg: " . $errstr . ". In file: " . $errfile . ". In line: " . $errline . "\n");
	    return true;
	}
?>

Возможные проблемы

Скрипт не запускается из BILLmanager или запускается с ошибкой, тогда как из консоли все работает.

Самая распространенная причина такого поведения то, что в некоторых версиях BILLmanager не сбрасывает переменную окружения LD_LIBRARY_PATH перед запуском модуля.

Для решения этой проблемы можно создать промежуточный исполняемый файл, который будет сбрасывать данную переменную окружения и запускать необходимый модуль. Для этого необходимо:

  1. Переименовать файл модуля убрав из начала сочетание 'fp'.
  2. Создать sh скрипт и дать ему имя 'fpxxx', где xxx имя модуля.
  3. В sh скрипт поместить код сброса переменной окружения и запуска модуля.

Пример:

#!/bin/sh
unset LD_LIBRARY_PATH
exec /usr/local/ispmgr/sbin/textmagic $*
Была ли эта информация полезной? Да | Нет
Личные инструменты