4 * StatusNet - the distributed open-source microblogging tool
5 * Copyright (C) 2009, StatusNet, Inc.
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 // Abort if called from a web server
23 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
25 $helptext = <<<ENDOFHELP
26 console.php - provide an interactive PHP interpreter for testing
30 require_once INSTALLDIR.'/scripts/commandline.inc';
32 // Assume we're on a terminal if on Windows, otherwise posix_isatty tells us.
33 define('CONSOLE_INTERACTIVE', !function_exists('posix_isatty') || posix_isatty(0));
34 define('CONSOLE_READLINE', CONSOLE_INTERACTIVE && function_exists('readline'));
36 if (CONSOLE_READLINE && CONSOLE_INTERACTIVE) {
37 define('CONSOLE_HISTORY', getenv("HOME") . "/.statusnet_console_history");
38 if (file_exists(CONSOLE_HISTORY)) {
39 readline_read_history(CONSOLE_HISTORY);
43 function read_input_line($prompt)
45 if (CONSOLE_INTERACTIVE) {
46 if (CONSOLE_READLINE) {
47 $line = readline($prompt);
48 if (trim($line) != '') {
49 readline_add_history($line);
50 if (defined('CONSOLE_HISTORY')) {
51 // Save often; it's easy to hit fatal errors.
52 readline_write_history(CONSOLE_HISTORY);
57 return readline_emulation($prompt);
65 * On Unix-like systems where PHP readline extension isn't present,
66 * -cough- Mac OS X -cough- we can shell out to bash to do it for us.
67 * This lets us at least handle things like arrow keys, but we don't
68 * get any entry history. :(
70 * Shamelessly ripped from when I wrote the same code for MediaWiki. :)
71 * @author Brion Vibber <brion@status.net>
73 * @param string $prompt
74 * @return mixed string on success, false on fail or EOF
76 function readline_emulation($prompt)
78 if(CONSOLE_INTERACTIVE && file_exists(trim(shell_exec('which bash')))) {
79 $encPrompt = escapeshellarg($prompt);
80 $command = "read -er -p $encPrompt && echo \"\$REPLY\"";
81 $encCommand = escapeshellarg($command);
82 $metaCommand = "bash -c $encCommand";
84 // passthru passes our STDIN and TTY to the child...
85 // We can pull the returned string via output buffering.
88 passthru($metaCommand, $retval);
89 $line = ob_get_contents();
94 } elseif ($retval == 127) {
95 // Couldn't execute bash even though we thought we saw it.
96 // Shell probably spit out an error message, sorry :(
97 // Fall through to fgets()...
104 // Fallback... we'll have no editing controls, EWWW
108 if (CONSOLE_INTERACTIVE) {
114 function console_help()
116 print "Welcome to StatusNet's interactive PHP console!\n";
117 print "Type some PHP code and it'll execute...\n";
119 print "Hint: return a value of any type to output it via var_export():\n";
120 print " \$profile = new Profile();\n";
121 print " \$profile->find();\n";
122 print " \$profile->fetch();\n";
123 print " return \$profile;\n";
125 print "Note that PHP is cranky and you can easily kill your session by mistyping.\n";
127 print "Type ctrl+D or enter 'exit' to exit.\n";
130 if (CONSOLE_INTERACTIVE) {
131 print "StatusNet interactive PHP console... type ctrl+D or enter 'exit' to exit.\n";
132 $prompt = common_config('site', 'name') . '> ';
136 while (!feof(STDIN)) {
137 $line = read_input_line($prompt);
138 if ($line === false) {
139 if (CONSOLE_INTERACTIVE) {
143 } elseif ($line !== '') {
145 if (trim($line) == 'exit') {
147 } elseif (trim($line) == 'help') {
153 $result = eval($line);
154 if ($result === false) {
156 } elseif ($result === null) {
159 // return value from eval'd code
162 } catch(Exception $e) {
163 print get_class($e) . ": " . $e->getMessage() . "\n";
166 if (CONSOLE_INTERACTIVE) {