TemKa_SD 9 04/25/19 12:28 (изменено) Здравствуйте. Я делаю приложение для игрового бота, он создает игры на сервере. Все конфиги находятся в бд и будут редактироваться в IPS. Сейчас мне пора думать о том, как делать создавать/запускать/останавливать/компилить бот по средствам IPS. И так, есть папка с исходниками source, в которой, находятся .cpp и .h файлы, все они собираются командой make в один файл ghost++, это бинарный файл который запускается на сервере и стартует бот. Для инициализации конфига из БД, он должен прочитать следующие параметры: mysql_server, mysql_user, mysql_password,mysql_database, mysql_botid. По этим значениям выбираются поля конфигурации самого бота, сейчас эти значения находятся в исходниках, но я думаю сделать чтение файла и вписать в него, либо через командую строку их указывать, но лучше в файле наверно. Есть еще файлы, допустим папка config, но здесь общая папка, до нее просто путь указать в настройках и всё, тут проблем нет. Здесь я просто описал механизм работы, чтобы было немного понятно. Примерная работа: создаем бот через формы в IPS, она создает каталог bot1 в котором файл ghost++. Общую папку с конфигами мы уже имеем, где лучше держать всё это, в source или data? ---------------------------------- В данный момент пока один вопрос, как из php запускать бинарные файлы? Может есть встроенные библиотеки? Я знаю о php_ssh2, и оно будет работать, может что-то другое посоветуете? Изменено 25 апреля 2019 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение
Dmitriy427 198 04/25/19 12:39 https://www.php.net/manual/ru/ref.exec.php Поделиться сообщением Ссылка на сообщение
siv1987 2627 04/25/19 12:44 Я знаю о php_ssh2Я честно говоря о таком не знаю. Выполнять команды в php можно и через exec или system. Более сложными функциями мне не доводилось работать. Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 04/25/19 12:48 Хоть убейте, но я не понимаю как тут цитировать )))) -------------------- Дмитрий, спасибо, потестирую завтра. siv1987, я имел ввиду libssh2 - в году так 2014 или даже раньше скорей всего, использовал radio icecast через эту cms'ку : radiocms, там включение, остановка радио была с помощью этой либы, но может там через exec нельзя было, не знаю. Буду пробовать, спасибо. Скажите сразу, где лучше держать всё это, исходник, папки с ботами, конфигами, в source? Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 04/25/19 13:21 Ну да, вроде работает, только пришлось эти функции включать в php. Других нет? Безопасных ))) public function run() { \exec('cd ~/ghost/source/wc3ghost/ && screen -U -dmS dev ./ghost++'); } /** * Get Root Buttons * * @return array */ public function _getRootButtons() { $buttons = array(); \IPS\Output::i()->sidebar['actions']['run'] = array( 'icon' => 'run', 'title' => 'Запустить бот', 'link' => \IPS\Http\Url::internal( 'app=wc3&module=bots&controller=mapcfgs&do=run' ), 'data' => array( 'ipsDialog' => '', 'ipsDialog-title' => 'Запустить бот' ) ); return $buttons; } Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 04/28/19 07:15 (изменено) Здравствуйте. Реализовал функции запуска и остановки, что скажите? Может что-то посоветуете? Вроде всё работает ) public function runBot() { $bot_id = \IPS\Request::i()->bot_id; if ( isset( $bot_id ) ) { $bot = static::load( $bot_id ); $path = static::$botPath; $pid = $bot->bot_pid; if($pid !== false && $pid != 0) { \IPS\Output::i()->error( \IPS\Member::loggedIn()->language()->addToStack('wc3_bot_run_error_1', FALSE, array( 'sprintf' => array($pid))), $pid, 500, '' ); } $start = \exec(" sh -c " . \escapeshellarg("cd {$path}{$bot_id}; nohup ./{$bot_id}++ > /dev/null 2>&1 & echo $!"), $output, $status); $bot->bot_pid = $start; $bot->save(); \IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=wc3&module=bots&controller=bots' ), 'wc3_bot_run_started' ); } } public function stopBot() { if ( isset( \IPS\Request::i()->bot_id ) ) { $bot = static::load( \IPS\Request::i()->bot_id ); $pid = $bot->_data['bot_pid']; $restart = FALSE; if($pid === false || $pid == 0) { if($restart) { return true; } else { \IPS\Output::i()->error( 'wc3_bot_stop_error_1', $pid, 500, '' ); } } \exec("kill {$pid} > /dev/null 2", $output, $status); if($status === 1){ $bot->bot_pid = 0; $bot->save(); \IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=wc3&module=bots&controller=bots' ), 'wc3_bot_stop_stoped' ); } else { \IPS\Output::i()->error( 'wc3_bot_stop_error_2', $status, 500, '' ); } } } Изменено 28 апреля 2019 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение