Example #1
0
 public function afterSave()
 {
     if ($this->server_id) {
         McBridge::get()->serverCmd($this->server_id, 'load command ' . $this->id);
     }
     return true;
 }
Example #2
0
    <?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">&nbsp;</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();
 }
Example #4
0
 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)));
 }
Example #6
0
 *
 *   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;
 }
Example #10
0
 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;
 }
Example #11
0
 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;
 }
Example #12
0
 public function afterSave()
 {
     McBridge::get()->serverCmd($this->server_id, 'load player ' . $this->id);
     return true;
 }