Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
TemKa_SD

IPS и запуск бинарников

Recommended Posts

Здравствуйте. Я делаю приложение для игрового бота, он создает игры на сервере. Все конфиги находятся в бд и будут редактироваться в 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, и оно будет работать, может что-то другое посоветуете?

Edited by TemKa_SD

Share this post


Link to post
Share on other sites
Я знаю о php_ssh2

Я честно говоря о таком не знаю.

Выполнять команды в php можно и через exec или system. Более сложными функциями мне не доводилось работать.

Share this post


Link to post
Share on other sites

Хоть убейте, но я не понимаю как тут цитировать ))))

 

--------------------

 

Дмитрий, спасибо, потестирую завтра.

 

siv1987, я имел ввиду libssh2 - в году так 2014 или даже раньше скорей всего, использовал radio icecast через эту cms'ку : radiocms, там включение, остановка радио была с помощью этой либы, но может там через exec нельзя было, не знаю.

 

Буду пробовать, спасибо.

 

Скажите сразу, где лучше держать всё это, исходник, папки с ботами, конфигами, в source?

Share this post


Link to post
Share on other sites

Ну да, вроде работает, только пришлось эти функции включать в 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;
}

Share this post


Link to post
Share on other sites

Здравствуйте. Реализовал функции запуска и остановки, что скажите? Может что-то посоветуете? Вроде всё работает )

 

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, '' );
	}

}
}

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...