src/RunTracy/Templates/ConsolePanel.phtml
<style type="text/css">
#tracy-debug-panel-RunTracy-Helpers-ConsolePanel { width: 700px !important; }
.terminal, textarea, .cmd, .terminal .terminal-output div div, .terminal .prompt {
background: #000000 !important; color: #cccccc !important;
font-family: monospace, fixed !important; font-size: 15px; line-height: 18px;
}
.terminal { min-height: 200px; max-height: 550px; overflow-y:scroll; }
.spaced { margin: 15px 0; }
.spaced-top { margin: 15px 0 0 0; }
.spaced-bottom { margin: 0 0 15px 0; }
.configure { margin: 20px; }
.configure .variable { color: #d33682; }
.configure p, .configure ul { margin: 5px 0 0 0; }
#tipscontainer { width:100%; }
#tipsleft { display:inline-block; width: 400px; }
#tipsright { display:inline-block; }
#containerHeader h1,
#containerHeader p {display: inline; vertical-align: middle; }
.error{color:red !important}
</style>
<link rel="stylesheet" href="<?php echo $this->terminalCss ?>">
<div id="containerHeader">
<h1><?php echo $this->icon; ?> PTY Console </h1>
<p><span class="warn warn_blink"> 'ConsoleNoLogin' => true </span></p>
</div>
<div>
<div id="term"></div>
<p><strong>Attention:</strong> Do not kill your server! Exposing to the public as is would introduce security risks for the host.</p>
</div>
<script type="text/javascript">
$.getScript( "<?php echo $this->terminalJs; ?>" )
.done(function () {
var settings = {'url': '/console', 'prompt_path_length': 32,
'domain': document.domain || window.location.host
};
var environment = {'user': '', 'hostname': '', 'path': ''};
var no_login = <?php echo $this->noLogin; ?>;
var silent_mode = false;
var banner_main = "Welcome to PTY Console. Run 'tricks' to see example commands";
function show_output(output) {
if (output) {
if (typeof output === 'string') terminal.echo(output);
else if (output instanceof Array) terminal.echo($.map(output, function(object) {
return $.json_stringify(object);
}).join(' '));
else if (typeof output === 'object') terminal.echo($.json_stringify(output));
else terminal.echo(output);
}
}
function make_prompt() {
var path = environment.path;
if (path && path.length > settings.prompt_path_length)
path = '...' + path.slice(path.length - settings.prompt_path_length + 3);
return '[[b;#d33682;]' + (environment.user || 'user') + ']' +
'@[[b;#6c71c4;]' + (environment.hostname || settings.domain || 'console') + '] ' +
(path || '~') + '$ ';
}
function update_prompt(terminal) {
terminal.set_prompt(make_prompt());
}
function update_environment(terminal, data) {
if (data) {
$.extend(environment, data);
update_prompt(terminal);
}
}
function service(terminal, method, parameters, success, error, options) {
options = $.extend({'pause': true}, options);
if (options.pause) terminal.pause();
$.jrpc(settings.url, method, parameters,
function(json) {
if (options.pause) terminal.resume();
if (!json.error) {
if (success) success(json.result);
}
else if (error) error();
else {
var message = $.trim(json.error.message || '');
var data = $.trim(json.error.data || '');
if (!message && data) {
message = data;
data = '';
}
terminal.error('[ERROR] RPC: ' + (message || 'Unknown error') +
(data ? (" (" + data + ")") : ''));
}
},
function(xhr, status, error_data) {
if (options.pause) terminal.resume();
if (error) error();
else {
if (status !== 'abort') {
var response = $.trim(xhr.responseText || '');
terminal.error('[ERROR] AJAX: ' + (status || 'Unknown error') +
(response ? ("\nServer reponse:\n" + response) : ''));
}
}
});
}
function service_authenticated(terminal, method, parameters, success, error, options) {
var token = terminal.token();
if (token || no_login) {
var service_parameters = [token, environment];
if (parameters && parameters.length)
service_parameters.push.apply(service_parameters, parameters);
service(terminal, method, service_parameters, success, error, options);
} else { // Should never happen
terminal.error('[ERROR] Access denied (no authentication token found)');
}
}
function interpreter(command, terminal) {
command = $.trim(command || '');
if (!command) return;
if (command === 'tricks') {
terminal.echo("[[;green;;]" +
"\twget -q https://getcomposer.org/composer.phar\n" +
"\tvendor/bin/phpunit php -r 'echo sha1("dev");'\n" +
"\tls -l php -h\n" +
"\thostnamectl free -m\n" +
"\tchmod u+x /path/to/file ulimit -a\n" +
"\ttail contributors.txt whoami\n" +
"\tid bin/cli\n" +
"\tkeyboard shortcuts:] http://terminal.jcubic.pl/api_reference.php#shortcuts\n" +
"");
return;
}
var command_parsed = $.terminal.splitCommand(command), method = null, parameters = [];
if (command_parsed.name.toLowerCase() === 'cd') {
method = 'cd';
parameters = [command_parsed.args.length ? command_parsed.args[0] : ''];
} else {
method = 'run';
parameters = [command];
}
if (method) {
service_authenticated(terminal, method, parameters, function(result) {
update_environment(terminal, result.environment);
show_output(result.output);
});
}
}
function login(user, password, callback) {
user = $.trim(user || '');
password = $.trim(password || '');
if (user && password) {
service(terminal, 'login', [user, password], function(result) {
if (result && result.token) {
environment.user = user;
update_environment(terminal, result.environment);
show_output(result.output);
callback(result.token);
}
else callback(null);
},
function() { callback(null); });
}
else callback(null);
}
function completion(terminal, pattern, callback) {
var view = terminal.export_view();
var command = view.command.substring(0, view.position);
service_authenticated(terminal, 'completion', [pattern, command], function(result) {
show_output(result.output);
if (result.completion && result.completion.length) {
result.completion.reverse();
callback(result.completion);
}
}, null, {pause: false});
}
function logout() {
silent_mode = true;
try {
terminal.clear();
terminal.logout();
}
catch (error) {}
silent_mode = false;
}
// Terminal
var terminal = $('#term').terminal(interpreter, {
login: !no_login ? login : false,
prompt: make_prompt(),
greetings: !no_login ? "" : "\t[[b;Red;]be careful!]: [[b;;]ConsoleNoLogin'] is [[b;Red;]true]\n",
tabcompletion: true,
completion: completion,
onBlur: function() { return false; },
exceptionHandler: function(exception) {if (!silent_mode) terminal.exception(exception);}
});
$('#term').on('unload', function(){ logout(); });
// Banner
if (banner_main) terminal.echo(banner_main);
});
</script>