211 lines
9.1 KiB
HTML
211 lines
9.1 KiB
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
|
<title>JAVM</title>
|
|
<link rel="stylesheet" href="styles.css">
|
|
<script src="respond.js"></script>
|
|
<!--[if lt IE 9]>
|
|
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
<![endif]-->
|
|
<!--[if lt IE 8]>
|
|
<link rel="stylesheet" href="ie.css">
|
|
<![endif]-->
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
|
<link rel="stylesheet" href="jquery-ui.css">
|
|
<script src="jquery.js"></script>
|
|
<script src="jquery-ui.js"></script>
|
|
<script src="underscore-min.js"></script>
|
|
<script>Josh = {Debug: false };</script>
|
|
<script src="killring.js"></script>
|
|
<script src="history.js"></script>
|
|
<script src="readline.js"></script>
|
|
<script src="shell.js"></script>
|
|
<script src="pathhandler.js"></script>
|
|
<style type="text/css">
|
|
#shell-panel {
|
|
height: 300px;
|
|
width: 100%;
|
|
background-color: #002f05;
|
|
color: #00fe00;
|
|
padding: 20px 20px 20px 20px;
|
|
font-family: 'Source Code Pro', Bitstream Vera Sans Mono, Lucida Console, Terminal, Courier;
|
|
font-size: 10pt;
|
|
overflow: scroll;
|
|
overflow-x: hidden;
|
|
overflow-y: scroll;
|
|
border: 1px dashed #E6EBE0;
|
|
}
|
|
|
|
#shell-cli .prompt {
|
|
font-weight: bold;
|
|
}
|
|
</style>
|
|
<script>
|
|
var handleFileLoadCallback=function(){};
|
|
var Shell = {
|
|
shell:undefined,
|
|
stdout:undefined,
|
|
args:[],
|
|
env:undefined,
|
|
connect: function(uri) {
|
|
var bport,buri;
|
|
var args=uri.split(':');
|
|
if (args && args.length==2) {
|
|
Shell.args = ['browser', 'bash', '-bip', args[0], '-bport', args[1]];
|
|
loadjs('bash.min.js');
|
|
} else stdout('Can\'t connect to broker with URI '+uri+' (invalid)');
|
|
},
|
|
interpreter:function(){},
|
|
prompt:function () {return ' >';},
|
|
set:function (xname,xvalue) {
|
|
document.getElementById(xname).value=xvalue;
|
|
},
|
|
status: function (xname,set) {
|
|
if (set) document.getElementById(xname).style.backgroundColor = 'green';
|
|
else document.getElementById(xname).style.backgroundColor = 'red';
|
|
},
|
|
update: function(xname,xvalue) {
|
|
stdout(xname+':'+xvalue);
|
|
},
|
|
download: function(filename,size,data) {
|
|
var element = document.createElement('a');
|
|
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + escape(data));
|
|
element.setAttribute('download', filename);
|
|
element.style.display = 'none';
|
|
document.body.appendChild(element);
|
|
element.click();
|
|
document.body.removeChild(element);
|
|
},
|
|
upload: function (callback) {
|
|
handleFileLoadCallback=callback;
|
|
document.getElementById('loadfile').click();
|
|
}
|
|
};
|
|
function format(str) {
|
|
// Replace all spaces with ?
|
|
var strht=$('<div>').text(str).html();
|
|
var strsp=strht.replace(/ /g,' ');
|
|
var strnl=strsp.replace(/\n/g,'<br>');
|
|
return strnl;
|
|
}
|
|
function stdout(str) {
|
|
Shell.shell.renderOutput(format(str));
|
|
}
|
|
|
|
function handleFileLoad(evt) {
|
|
var files = evt.target.files; // FileList object
|
|
// Loop through the FileList and render image files as thumbnails.
|
|
for (var i = 0, f; f = files[i]; i++) {
|
|
var reader = new FileReader();
|
|
var file=f;
|
|
// Closure to capture the file information.
|
|
reader.onload = (function(theFile) {
|
|
return function(e) {
|
|
var contents = e.target.result;
|
|
handleFileLoadCallback(file.name,file.size,contents);
|
|
};
|
|
})(f);
|
|
|
|
// Read in the image file as a data URL.
|
|
reader.readAsBinaryString(f);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Shell.stdout=stdout;
|
|
|
|
function loadjs(filename) {
|
|
var fileref = document.createElement('script');
|
|
fileref.setAttribute("type", "text/javascript");
|
|
fileref.setAttribute("src", filename);
|
|
if (typeof fileref != "undefined")
|
|
document.getElementsByTagName("head")[0].appendChild(fileref)
|
|
}
|
|
|
|
$(document).ready(function() {
|
|
var history = new Josh.History({ key: 'josh.helloworld'});
|
|
var shell = Josh.Shell({history: history});
|
|
var $consolePanel = $('#shell-panel');
|
|
document.getElementById('loadfile').addEventListener('change', handleFileLoad, false);
|
|
|
|
shell.onNewPrompt(function(callback) {
|
|
callback(Shell.prompt());
|
|
});
|
|
shell.setCommandHandler('*', {
|
|
exec: function(cmd, args, callback) {
|
|
var arg = args[0] || '';
|
|
Shell.interpreter(cmd,args,function (str) { callback(format(str)) });
|
|
},
|
|
completion: function(cmd, arg, line, callback) {
|
|
if (Shell.env!=undefined) callback(shell.bestMatch(arg, Shell.env.workrows));
|
|
else callback(shell.bestMatch(arg, ['dir', 'cd', 'mkdir']));
|
|
}
|
|
});
|
|
$consolePanel.resizable({ handles: "w, e, s"});
|
|
shell.activate();
|
|
Shell.shell=shell;
|
|
Shell.set('afscap','');
|
|
// Test
|
|
|
|
});
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<div><br></div>
|
|
|
|
<div class="wrapper">
|
|
Drag right or bottom side of shell to change size.
|
|
<div onfocus="Shell.shell.activate();" id="shell-panel" tabindex="0">
|
|
<div style="font-weight: bold">JAM Virtual Machine Shell</div>
|
|
<div>Type <code>help</code> or hit <code>TAB</code> for a list of commands.
|
|
</div>
|
|
<div id="shell-view"></div>
|
|
</div>
|
|
<br>
|
|
<form>
|
|
<table>
|
|
<tr style="height:50px">
|
|
<td>Broker Server URI:</td>
|
|
<td><input onfocus="Shell.shell.deactivate();" size="50" type="text" id="brokeruri" value="localhost:3001"></td>
|
|
<td><button class="indicator" id="brokerstatus"></button></td>
|
|
<td><a onmouseover="" style="cursor: pointer;" title="Connect" onclick="Shell.connect(document.getElementById('brokeruri').value);"><img style="width:24px" src="connect.png"></a></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr style="height:50px">
|
|
<td>Host Port:</td>
|
|
<td><input onfocus="Shell.shell.deactivate();" size="50" type="text" id="hostport"></td>
|
|
<td><button class="indicator" id="hoststatus"></button></td>
|
|
<td><a onmouseover="" style="cursor: pointer;" title="Update Home" onclick="Shell.update('hostport',document.getElementById('hostport').value);"><img style="width:24px" src="home.png"></a></td>
|
|
<td><a onmouseover="" style="cursor: pointer;" title="Add" onclick="Shell.update('hostport+',document.getElementById('hostport').value);"><img style="width:24px" src="add.png"></a></td>
|
|
</td>
|
|
</tr>
|
|
<tr style="height:50px">
|
|
<td>DNS Root Capability:</td>
|
|
<td><input onfocus="Shell.shell.deactivate();" size="50" type="text" id="rootcap"></td>
|
|
<td><button class="indicator" id="rootstatus"></button></td>
|
|
<td><a onmouseover="" style="cursor: pointer;" title="Update Home" onclick="Shell.update('rootcap',document.getElementById('rootcap').value);"><img style="width:24px" src="home.png"></a></td>
|
|
<td><a onmouseover="" style="cursor: pointer;" title="Add" onclick="Shell.update('rootcap+',document.getElementById('rootcap').value);"><img style="width:24px" src="add.png"></a></td>
|
|
</tr>
|
|
<tr style="height:50px">
|
|
<td>AFS DEF Capability:</td>
|
|
<td><input onfocus="Shell.shell.deactivate();" size="50" type="text" id="afscap"></td>
|
|
<td><button class="indicator" id="afsstatus"></button></td>
|
|
<td><a onmouseover="" style="cursor: pointer;" title="Update Home" onclick="Shell.update('afscap',document.getElementById('afscap').value);"><img style="width:24px" src="home.png"></a></td>
|
|
<td><a onmouseover="" style="cursor: pointer;" title="Add" onclick="Shell.update('afscap+',document.getElementById('afscap').value);"><img style="width:24px" src="add.png"></a></td>
|
|
</tr>
|
|
</table>
|
|
|
|
</form>
|
|
<script>
|
|
var form = document.querySelector("form");
|
|
form.addEventListener("submit", function(event) {
|
|
event.preventDefault();
|
|
});
|
|
</script>
|
|
<input type="file" id="loadfile" name="files[]" multiple style="display:none">
|
|
</div>
|
|
</body>
|