public function afterSave() { if ($this->server_id) { McBridge::get()->serverCmd($this->server_id, 'load command ' . $this->id); } return true; }
<?php echo Yii::app()->user->getFlash('files-error'); ?> </div> <?php } echo CHtml::beginForm(); ?> <table class="stdtable" style="width: 100%"> <tr class="titlerow"> <td width="170"><?php echo Yii::t('admin', 'Daemon'); ?> </td> <td colspan="3"><?php echo CHtml::dropDownList('daemon_id', $daemon_id, array('' => Yii::t('admin', 'All Daemons')) + McBridge::get()->conStrings()); ?> </td> </tr> <tr> <td colspan="4"> </td> </tr> <tr class="titlerow"> <td width="170"><?php echo Yii::t('admin', 'Add Files'); ?> </td> <td width="60"></td> <td></td> <td width="80"></td> </tr>
public function actionGetConnectionStatus($id) { $this->check(); $ret = McBridge::get()->cmd((int) $id, 'version'); if (!$ret['success']) { $this->end($ret['error']); } foreach ($ret['data'][0] as $k => $v) { $this->addData($k, $v); } $this->success(); }
array_pop($defaultRoles); //remove admin //possible values for permission roles $allRoles = array_combine(User::$roles, User::getRoleLabels()); //possible values for ip authentication $ipRoles = $allRoles; array_pop($ipRoles); //remove owner array_pop($ipRoles); //remove admin $form = $this->beginWidget('CActiveForm', array('id' => 'server-form', 'enableAjaxValidation' => false)); $conIds = McBridge::get()->getDaemonIds(); $conCount = count($conIds); if (($conCount > 1 || $conCount == 1 && $model->daemon_id != $conIds[0]) && Yii::app()->user->isSuperuser()) { $opt = array(); $attribs[] = array('label' => $form->labelEx($model, 'daemon_id'), 'type' => 'raw', 'value' => $form->dropDownList($model, 'daemon_id', McBridge::get()->conStrings(), $opt) . ' ' . $form->error($model, 'daemon_id'), 'hint' => Yii::t('mc', 'Changing this will shut the server down if running')); echo CHtml::hiddenField('move_files', ''); } else { if ($model->isNewRecord && $conCount == 1) { $model->daemon_id = $conIds[0]; echo $form->hiddenField($model, 'daemon_id'); } } if (Yii::app()->user->isSuperuser() || $settings->user_name) { $attribs[] = array('label' => $form->labelEx($model, 'name'), 'type' => 'raw', 'value' => $form->textField($model, 'name') . ' ' . $form->error($model, 'name')); } else { $attribs[] = 'name'; } if (Yii::app()->user->isSuperuser() || $settings->user_players) { $attribs[] = array('label' => $form->labelEx($model, 'players'), 'type' => 'raw', 'value' => $form->textField($model, 'players') . ' ' . $form->error($model, 'players')); } else {
public function actionRestore($id, $restore = false, $file = false) { Yii::app()->user->can($id, 'start backup', true); $model = $this->loadModel($id); if ($restore) { if (!preg_match('/^[^\\/\\\\?%\\*:"\'<>\\0]+\\.zip/i', $file)) { Yii::app()->user->setFlash('server', Yii::t('mc', 'Filename contains invalid characters')); } else { if (!McBridge::get()->serverCmd($id, 'backup restore ' . $file, $none)) { $err = McBridge::get()->lastError(); if ($err == 'inprogress') { Yii::app()->user->setFlash('server', Yii::t('mc', 'Failed to unpack archive because another unpack operation is currently in progress')); } else { if ($err == 'invalid') { Yii::app()->user->setFlash('server', Yii::t('mc', 'Failed to unpack archive because it contains invalid files (absolute paths or paths outside of the unpack directory). See the log for details.')); } else { if ($err == 'forbidden') { Yii::app()->user->setFlash('server', Yii::t('mc', 'Failed to unpack archive because it contains restricted file types. See the log for details.')); } else { Yii::app()->user->setFlash('server', CHtml::encode($err)); } } } } } $this->redirect(array('restore', 'id' => $id)); Yii::app()->end(); } $list = array(); $error = ''; $data = array(); if (!McBridge::get()->serverCmd($id, 'backup list', $data)) { Yii::app()->user->setFlash('server', CHtml::encode(McBridge::get()->lastError())); } else { $files = array(); foreach ($data as $d) { $files[$d['file']] = $d['time']; } ksort($files); foreach ($files as $f => $t) { $list[] = array('id' => $f, 'time' => @date("d.m.Y H:i", $t)); } } $this->render('restore', array('dataProvider' => new CArrayDataProvider($list, array('pagination' => array('pageSize' => 10))), 'model' => $this->loadModel($id))); }
* * Copyright © 2010-2012 by xhost.ch GmbH * * All rights reserved. * **/ $this->breadcrumbs = array(Yii::t('mc', 'Servers') => array('index'), $model->name => array('view', 'id' => $model->id), Yii::t('mc', 'Delete')); Yii::app()->getClientScript()->registerCoreScript('jquery'); $this->menu = array(array('label' => Yii::t('mc', 'Back'), 'url' => array('server/view', 'id' => $model->id), 'icon' => 'back')); ?> <?php $form = $this->beginWidget('CActiveForm', array('id' => 'server-form', 'enableAjaxValidation' => false)); echo CHtml::hiddenField('delete', 'true'); $owner = User::model()->findByPk((int) $model->owner); $cons = McBridge::get()->conStrings(); $attribs = array('name', 'owner' => array('name' => 'owner', 'label' => Yii::t('mc', 'Owner'), 'value' => $owner ? $owner->name : '-'), 'ip', 'port', 'daemon_id' => array('name' => 'daemon_id', 'value' => isset($cons[$model->daemon_id]) ? $cons[$model->daemon_id] : Yii::t('mc', 'local host')), 'dir'); if ($canDel) { $value = Yii::t('mc', 'Type <b>yes</b> here to delete <b>all</b> files in this servers base directory (including all worlds).') . ($info ? Yii::t('mc', 'The associated database will also be deleted.') : '') . '<br/>' . CHtml::textField('del_files', Yii::t('mc', 'no')) . '<span class="hint"></span>'; } else { $value = Yii::t('mc', 'Server files won\'t be deleted:') . '<br/>'; if ($status == 'error') { $value .= Yii::t('mc', 'There is an error with the daemon connection for this Server') . '<br/>'; } else { if ($status != 'stopped') { $value .= Yii::t('mc', 'The server is still running, please stop the server first.') . '<br/>'; } } $value .= '<br/>'; if (count($shared) > 1) { $value .= Yii::t('mc', 'Base directory shared with the following servers:') . '<br/>';
public function actionView($id) { $model = $this->loadModel($id); Yii::app()->user->canSelf($model, 'view player', true); if (isset($_POST['ajax'])) { switch ($_POST['ajax']) { case 'give': if (!Yii::app()->user->canSelf($model, 'give', true)) { die(Yii::t('mc', 'Error: Permission denied.')); } require 'itemlist.php'; $amount = (int) $_POST['amount']; $item = (int) $_POST['item']; if ($item < 0 || $item >= count($itemlist)) { die("Invalid item selected!"); } else { if ($amount < 0 || $amount > 64) { die("Invalid amount!"); } else { $itemcode = $itemlist[$item]['item']; if (!McBridge::get()->serverCmd($model->server_id, 'mc:give ' . $model->name . ' ' . $itemcode . ' ' . $amount)) { die(Yii::t('mc', 'Error sending command:') . ' ' . CHtml::encode(McBridge::get()->lastError())); } } } break; case 'tp': Yii::app()->user->canSelf($model, 'tp', true); $player = (int) $_POST['player']; $player = Player::model()->findByPk($player); if (!$player) { die(Yii::t('mc', 'Invalid target player...')); } if (!McBridge::get()->serverCmd($model->server_id, 'mc:tp ' . $model->name . ' ' . $player->name)) { die(Yii::t('mc', 'Error sending command:') . ' ' . CHtml::encode(McBridge::get()->lastError())); } break; case 'summon': Yii::app()->user->can($model->server_id, 'summon', true); $player = (int) $_POST['player']; $player = Player::model()->findByPk($player); if (!$player) { die(Yii::t('mc', 'Invalid target player...')); } if (!McBridge::get()->serverCmd($model->server_id, 'mc:tp ' . $player->name . ' ' . $model->name)) { die(Yii::t('mc', 'Error sending command:') . ' ' . CHtml::encode(McBridge::get()->lastError())); } break; case 'assign': $user = (int) $_POST['user']; $user = User::model()->findByPk($user); if (!$user) { die(Yii::t('mc', 'Invalid user selected.')); } if (!($model->user = $user)) { die(Yii::t('mc', 'Failed to assign user!')); } break; case 'refresh': echo CJSON::encode($this->ajaxRefresh($model, $_POST['type'])); } Yii::app()->end(); } $playerRoles = $this->possiblePlayerRoles($model); if (isset($_POST['Player']) && Yii::app()->user->can($model->server_id, 'manage players')) { if (Yii::app()->user->isSuperuser()) { $model->scenario = 'superuser'; } $lvl = $model->level; $model->attributes = $_POST['Player']; if ($playerRoles) { if (array_search($model->level, array_keys($playerRoles)) === false) { $model->level = $lvl; } //preserve level if user has no permission to change it $user = (int) @$_POST['user-assign']; $userModel = User::model()->findByPk($user); if ($userModel && $model->user != $user && array_search($userModel->getLevel($model->server_id), array_keys($playerRoles)) !== false) { Yii::log('Assigning user ' . $user . ' to player ' . $model->id); $model->setUser($user, false); } else { if (!$user && $model->user && isset($_POST['user-assign'])) { Yii::log('Removing user assignment from player ' . $model->id); $model->setUser(0, false); } } } if ($model->save()) { Yii::log('Updated player ' . $model->id); Yii::app()->user->setFlash('player', Yii::t('mc', 'Player saved.')); $this->redirect(array('view', 'id' => $model->id)); } } $users = User::model()->findAll($this->getUserCondition($model->id)); require 'itemlist.php'; $edit = @count($playerRoles) && Yii::app()->user->can($model->server_id, 'manage players'); $this->render('view', array('model' => $model, 'itemlist' => $itemlist, 'viewDetails' => Yii::app()->user->can($model->server_id, 'player details'), 'summon' => Yii::app()->user->canSelf($model, 'summon'), 'give' => Yii::app()->user->canSelf($model, 'give'), 'tp' => Yii::app()->user->canSelf($model, 'tp'), 'edit' => $edit, 'sv' => $model->server_id, 'data' => $this->ajaxRefresh($model, 'all'), 'playerRoles' => $playerRoles, 'users' => $users)); }
public function getJarStatus($daemon) { $ret = McBridge::get()->cmd($daemon, 'updatejar status :1'); $content = ''; $time = ''; $class = 'flash-success'; $fails = 0; if (!$ret['success']) { $content = CHtml::encode($ret['error']); $class = 'flash-error'; } else { $data = $ret['data']; if (!is_array($data) || !count($data)) { $data = array('time' => time()); } foreach ($data as $d) { if ($content) { $content .= '<br/>'; } $time = @$d['time'] ? '[' . @date('m/d H:i', $d['time']) . '] ' : ''; if (isset($d['target'])) { $content .= '<b>' . $d['target'] . '</b>: '; } switch (@$d['status']) { case 'done': $content .= Yii::t('admin', 'Update successful'); break; case 'uptodate': $content .= Yii::t('admin', 'No update necessary'); break; case 'ready': $content .= Yii::t('admin', 'The update is ready to be installed'); break; case 'running': $content .= Yii::t('admin', 'Downloading, please wait {percent}', array('{percent}' => $d['percent'] ? ' ' . (int) ((double) $d['percent'] * 100) . '%' : '')); break; default: if (@$d['message']) { $fails++; $content .= htmlspecialchars($d['message']); } else { $content .= Yii::t('admin', 'No update in progress.'); } } } if ($fails == count($data)) { $class = 'flash-error'; } else { if ($fails) { $class = 'flash-notice'; } } } $status = array(); $status['class'] = $class; $status['time'] = $time; $status['content'] = $content; return $status; }
public function command($cmd, &$data) { $r = array(); $dis = Yii::t('mc', 'Function disabled in demo mode!'); $fail = false; $cmd = preg_replace('/^server [\\w\\d]+:/', '', $cmd); if ($cmd == 'get status') { $r[] = 'status :running :players :5 :maxPlayers :16'; } else { if ($cmd == 'get players') { $r[] = 'id :1 :name :Player1 :ip :10.0.0.2'; $r[] = 'id :2 :name :Player2 :ip :10.0.0.3'; $r[] = 'id :3 :name :Player3 :ip :10.0.0.4'; $r[] = 'id :4 :name :Player4 :ip :10.0.0.5'; $r[] = 'id :5 :name :Player5 :ip :10.0.0.6'; } else { if ($cmd == 'get chat') { $r[] = 'time :0 :name :Player1 :text :Hi All'; $r[] = 'time :2 :name :Player2 :text :Hey!'; } else { if ($cmd == 'get log') { $r[] = 'line :14.12 16:25:31 [SERVER] INFO Loading properties'; $r[] = 'line :14.12 16:25:31 [SERVER] INFO Starting Minecraft server on 0.0.0.0:25565'; $r[] = 'line :14.12 16:25:32 [STARTUP] Done! For help, type "help" or "?"'; } else { if ($cmd == 'refresh' || $cmd == 'reload player' || $cmd == 'reload command') { $r[] = ''; } else { if (preg_match('/updatejar/', $cmd)) { if (preg_match('/updatejar list/', $cmd)) { $r[] = 'name :Default Minecraft Server :jar :minecraft_server.jar'; $r[] = 'name :Mod: Craftbukkit :jar :craftbukkit.jar'; $r[] = 'name :Mod: Craftbukkit Beta :jar :craftbukkit_beta.jar'; $r[] = 'name :Optimized Minecraft Server :jar :minecraft_optimized.jar'; } else { $r[] = 'status :done :message :' . $dis; $fail = true; } } else { if (preg_match('/(deletejar|downloadjar)/', $cmd)) { $r[] = 'status :done :message :' . $dis; $fail = true; } else { if ($cmd == 'version') { $r[] = 'version :' . Yii::app()->controller->version . ' :remote :' . Yii::app()->controller->version . ' :time :' . time(); } else { if (preg_match('/backup/', $cmd)) { $fail = true; } else { if (preg_match('/server all:/', $cmd)) { $fail = true; } else { if (preg_match('/cfgfile check/', $cmd)) { $m = array(); if (preg_match('/cfgfile check:([-_.\\w\\d]+)/', $cmd, $m)) { $r[] = 'valid :True :ro :False :file :' . $m[1] . ' :dir :'; } } else { if ($m = preg_match('/cfgfile get/', $cmd)) { $m = preg_match('/cfgfile get:([-_.\\w\\d]+)/', $cmd); if (preg_match('/server.properties/', $cmd)) { $r[] = 'option :spawn-monsters :value :'; } else { $r[] = 'line :Player1'; } } else { if (preg_match('/cfgfile set/', $cmd)) { $r[] = 'accepted :False :message :' . $dis; $fail = true; } else { if (preg_match('/run_s:.*/', $cmd)) { $fail = true; } else { if (preg_match('/get resources/', $cmd)) { $r[] = 'pid :123 :cpu :15 :memory :45'; } else { if (preg_match('/plugin has/', $cmd)) { $r[] = 'has :1'; } else { if (preg_match('/plugin (add|remove)/', $cmd)) { $fail = true; } else { if (preg_match('/plugin list/', $cmd)) { $r[] = 'file :permissions.jar :desc :Permissions Plugin :status :installed'; $r[] = 'file :worldedit.jar :desc :WorldEdit Plugin :status :installed'; $r[] = 'file :lockedchests.jar :desc :Locked Chests Plugin :status :installed'; $r[] = 'file :lowgravity.jar :desc :Low Gravity Plugin :status :outdated'; $r[] = 'file :jail.jar :desc :Jail Plugin :status :none'; } else { if (in_array($cmd, array('start', 'stop', 'restart')) || preg_match('/mc:/', $cmd)) { $fail = true; } else { if (preg_match('/^(load|delinstance) /', $cmd)) { $r[] = ''; } else { die($dis . " |{$cmd}|"); } } } } } } } } } } } } } } } } } } } } if ($fail) { if (!count($r)) { $r[] = 'message :' . $dis; } $this->addError($dis); return false; } $data = McBridge::parse($r); return true; }
function command($cmd, &$data) { $cmd = str_replace("\n", " ", $cmd); if (!$this->send($cmd)) { return false; } $r = $this->recv(); if (!$r['ack']) { return false; } $data = McBridge::parse($r['data']); return true; }
public function getOnlinePlayers() { if ($this->playersCached !== false) { return $this->playersCached; } if (!Yii::app()->user->can($this->id, 'get status') || !McBridge::get()->serverCmd($this->id, 'get status', $status)) { return $this->playersCached = -2; } if (@$status[0]['status'] == 'running') { return $this->playersCached = $status[0]['players']; } return $this->playersCached = -1; }
public function afterSave() { McBridge::get()->serverCmd($this->server_id, 'load player ' . $this->id); return true; }