_mongo->selectDB("admin");
//command line
try {
$query = $db->command(array("getCmdLineOpts" => 1));
if (isset($query["argv"])) {
$this->commandLine = implode(" ", $query["argv"]);
}
else {
$this->commandLine = "";
}
} catch (Exception $e) {
$this->commandLine = "";
}
//web server
$this->webServers = array();
if (isset($_SERVER["SERVER_SOFTWARE"])) {
list($webServer) = explode(" ", $_SERVER["SERVER_SOFTWARE"]);
$this->webServers["Web server"] = $webServer;
}
$this->webServers["PHP version"] = "PHP " . PHP_VERSION;
$this->webServers["PHP extension"] = "mongo/" . RMongo::getVersion();
$this->directives = ini_get_all("mongo");
//build info
$this->buildInfos = array();
try {
$ret = $db->command(array("buildinfo" => 1));
if ($ret["ok"]) {
unset($ret["ok"]);
$this->buildInfos = $ret;
}
} catch (Exception $e) {
}
//connection
$this->connections = array(
"Host" => $this->_server->mongoHost(),
"Port" => $this->_server->mongoPort(),
"Username" => "******",
"Password" => "******"
);
$this->display();
}
/** Server Status **/
public function doStatus() {
$this->status = array();
try {
//status
$db = $this->_mongo->selectDB("admin");
$ret = $db->command(array("serverStatus" => 1));
if ($ret["ok"]) {
unset($ret["ok"]);
$this->status = $ret;
foreach ($this->status as $index => $_status) {
$json = $this->_highlight($_status, "json");
if ($index == "uptime") {//we convert it to days
if ($_status >= 86400) {
$json .= "s (" . ceil($_status/86400) . "days)";
}
}
$this->status[$index] = $json;
}
}
} catch (Exception $e) {
}
$this->display();
}
/** show databases **/
public function doDatabases() {
$ret = $this->_server->listDbs();
$this->dbs = $ret["databases"];
foreach ($this->dbs as $index => $db) {
$mongodb = $this->_mongo->selectDB($db["name"]);
$ret = $mongodb->command(array("dbstats" => 1));
$ret["collections"] = count(MDb::listCollections($mongodb));
if (isset($db["sizeOnDisk"])) {
$ret["diskSize"] = r_human_bytes($db["sizeOnDisk"]);
$ret["dataSize"] = r_human_bytes($ret["dataSize"]);
}
else {
$ret["diskSize"] = "-";
$ret["dataSize"] = "-";
}
$ret["storageSize"] = r_human_bytes($ret["storageSize"]);
$ret["indexSize"] = r_human_bytes($ret["indexSize"]);
$this->dbs[$index] = array_merge($this->dbs[$index], $ret);
}
$this->dbs = rock_array_sort($this->dbs, "name");
$this->display();
}
/** execute command **/
public function doCommand() {
$ret = $this->_server->listDbs();
$this->dbs = $ret["databases"];
if (!$this->isPost()) {
x("command", json_format("{listCommands:1}"));
if (!x("db")) {
x("db", "admin");
}
}
if ($this->isPost()) {
$command = xn("command");
$format = x("format");
if ($format == "json") {
$command = $this->_decodeJson($command);
}
else {
$eval = new VarEval($command);
$command = $eval->execute();
}
if (!is_array($command)) {
$this->message = "You should send a valid command";
$this->display();
return;
}
$this->ret = $this->_highlight($this->_mongo->selectDB(xn("db"))->command($command), $format);
}
$this->display();
}
/** execute code **/
public function doExecute() {
$ret = $this->_server->listDbs();
$this->dbs = $ret["databases"];
if (!$this->isPost()) {
if (!x("db")) {
x("db", "admin");
}
x("code", 'function () {
var plus = 1 + 2;
return plus;
}');
}
if ($this->isPost()) {
$code = trim(xn("code"));
$arguments = xn("argument");
if (!is_array($arguments)) {
$arguments = array();
}
else {
$this->arguments = $arguments;
foreach ($arguments as $index => $argument) {
$argument = trim($argument);
$array = $this->_decodeJson($argument);
$arguments[$index] = $array;
}
}
$ret = $this->_mongo->selectDB(xn("db"))->execute($code, $arguments);
$this->ret = $this->_highlight($ret, "json");
}
$this->display();
}
/** processlist **/
public function doProcesslist() {
$this->progs = array();
try {
$query = $this->_mongo->selectDB("admin")->execute('function (){
return db.$cmd.sys.inprog.find({ $all:1 }).next();
}');
if ($query["ok"]) {
$this->progs = $query["retval"]["inprog"];
}
foreach ($this->progs as $index => $prog) {
foreach ($prog as $key=>$value) {
if (is_array($value)) {
$this->progs[$index][$key] = $this->_highlight($value, "json");
}
}
}
} catch (Exception $e) {
}
$this->display();
}
/** kill one operation in processlist **/
public function doKillOp() {
$opid = xi("opid");
$query = $this->_mongo->selectDB("admin")->execute('function (opid){
return db.killOp(opid);
}', array( $opid ));
if ($query["ok"]) {
$this->redirect("server.processlist");
}
$this->ret = $this->_highlight($query, "json");
$this->display();
}
/** create databse **/
public function doCreateDatabase() {
if ($this->isPost()) {
$name = trim(xn("name"));
if (empty($name)) {
$this->error = "Please input a valid database name.";
$this->display();
return;
}
$this->message = "New database created.";
$this->_mongo->selectDb($name)->execute("function(){}");
}
$this->display();
}
/** replication status **/
public function doReplication() {
$this->status = array();
try {
$ret = $this->_mongo->selectDB("local")->execute('function () { return db.getReplicationInfo(); }');
$status = isset($ret["retval"]) ? $ret["retval"] : array();
if (isset($ret["retval"]["errmsg"])) {
$this->status["errmsg"] = $ret["retval"]["errmsg"];
}
else {
foreach ($status as $param => $value) {
if ($param == "logSizeMB") {
$this->status["Configured oplog size"] = $value . "m";
}
else if ($param == "timeDiff") {
$this->status["Log length start to end"] = $value . "secs (" . $status["timeDiffHours"] . "hrs)";
}
else if ($param == "tFirst") {
$this->status["Oplog first event time"] = $value;
}
else if ($param == "tLast") {
$this->status["Oplog last event time"] = $value;
}
else if ($param == "now") {
$this->status["Now"] = $value;
}
}
}
} catch (Exception $e) {
}
//slaves
$this->slaves = array();
try {
$query = $this->_mongo->selectDB("local")->selectCollection("slaves")->find();
foreach ($query as $one) {
foreach ($one as $param=>$value) {
if ($param == "syncedTo") {
$one[$param] = date("Y-m-d H:i:s", $value->sec) . "." . $value->inc;
}
}
$this->slaves[] = $one;
}
} catch (Exception $e) {
}
//masters
$this->masters = array();
try {
$query = $this->_mongo->selectDB("local")->selectCollection("sources")->find();
foreach ($query as $one) {
foreach ($one as $param=>$value) {
if ($param == "syncedTo" || $param == "localLogTs") {
if ($value->inc > 0) {
$one[$param] = date("Y-m-d H:i:s", $value->sec) . "." . $value->inc;
}
}
}
$this->masters[] = $one;
}
} catch (Exception $e) {
}
//me
try {
$this->me = $this->_mongo->selectDB("local")->selectCollection("me")->findOne();
} catch (Exception $e) {
$this->me = array();
}
$this->display();
}
}
?>