mirror of
https://github.com/Ylianst/MeshCentral.git
synced 2024-12-25 06:35:54 -05:00
Fixed module installation code.
This commit is contained in:
parent
d4115c7aa6
commit
a9b485e3c7
@ -66,15 +66,15 @@ function CreateMeshCentralServer(config, args) {
|
|||||||
|
|
||||||
// Setup the default configuration and files paths
|
// Setup the default configuration and files paths
|
||||||
if ((__dirname.endsWith('/node_modules/meshcentral')) || (__dirname.endsWith('\\node_modules\\meshcentral')) || (__dirname.endsWith('/node_modules/meshcentral/')) || (__dirname.endsWith('\\node_modules\\meshcentral\\'))) {
|
if ((__dirname.endsWith('/node_modules/meshcentral')) || (__dirname.endsWith('\\node_modules\\meshcentral')) || (__dirname.endsWith('/node_modules/meshcentral/')) || (__dirname.endsWith('\\node_modules\\meshcentral\\'))) {
|
||||||
|
obj.parentpath = obj.path.join(__dirname, '../..');
|
||||||
obj.datapath = obj.path.join(__dirname, '../../meshcentral-data');
|
obj.datapath = obj.path.join(__dirname, '../../meshcentral-data');
|
||||||
obj.filespath = obj.path.join(__dirname, '../../meshcentral-files');
|
obj.filespath = obj.path.join(__dirname, '../../meshcentral-files');
|
||||||
obj.parentpath = obj.path.join(__dirname, '../..');
|
|
||||||
if (obj.fs.existsSync(obj.path.join(__dirname, '../../meshcentral-web/views'))) { obj.webViewsPath = obj.path.join(__dirname, '../../meshcentral-web/views'); } else { obj.webViewsPath = obj.path.join(__dirname, 'views'); }
|
if (obj.fs.existsSync(obj.path.join(__dirname, '../../meshcentral-web/views'))) { obj.webViewsPath = obj.path.join(__dirname, '../../meshcentral-web/views'); } else { obj.webViewsPath = obj.path.join(__dirname, 'views'); }
|
||||||
if (obj.fs.existsSync(obj.path.join(__dirname, '../../meshcentral-web/public'))) { obj.webPublicPath = obj.path.join(__dirname, '../../meshcentral-web/public'); } else { obj.webPublicPath = obj.path.join(__dirname, 'public'); }
|
if (obj.fs.existsSync(obj.path.join(__dirname, '../../meshcentral-web/public'))) { obj.webPublicPath = obj.path.join(__dirname, '../../meshcentral-web/public'); } else { obj.webPublicPath = obj.path.join(__dirname, 'public'); }
|
||||||
} else {
|
} else {
|
||||||
|
obj.parentpath = __dirname;
|
||||||
obj.datapath = obj.path.join(__dirname, '../meshcentral-data');
|
obj.datapath = obj.path.join(__dirname, '../meshcentral-data');
|
||||||
obj.filespath = obj.path.join(__dirname, '../meshcentral-files');
|
obj.filespath = obj.path.join(__dirname, '../meshcentral-files');
|
||||||
obj.parentpath = obj.path.join(__dirname, '..');
|
|
||||||
if (obj.fs.existsSync(obj.path.join(__dirname, '../meshcentral-web/views'))) { obj.webViewsPath = obj.path.join(__dirname, '../meshcentral-web/views'); } else { obj.webViewsPath = obj.path.join(__dirname, 'views'); }
|
if (obj.fs.existsSync(obj.path.join(__dirname, '../meshcentral-web/views'))) { obj.webViewsPath = obj.path.join(__dirname, '../meshcentral-web/views'); } else { obj.webViewsPath = obj.path.join(__dirname, 'views'); }
|
||||||
if (obj.fs.existsSync(obj.path.join(__dirname, '../meshcentral-web/public'))) { obj.webPublicPath = obj.path.join(__dirname, '../meshcentral-web/public'); } else { obj.webPublicPath = obj.path.join(__dirname, 'public'); }
|
if (obj.fs.existsSync(obj.path.join(__dirname, '../meshcentral-web/public'))) { obj.webPublicPath = obj.path.join(__dirname, '../meshcentral-web/public'); } else { obj.webPublicPath = obj.path.join(__dirname, 'public'); }
|
||||||
}
|
}
|
||||||
@ -1646,9 +1646,13 @@ var InstallModuleChildProcess = null;
|
|||||||
function InstallModule(modulename, func, tag1, tag2) {
|
function InstallModule(modulename, func, tag1, tag2) {
|
||||||
console.log('Installing ' + modulename + '...');
|
console.log('Installing ' + modulename + '...');
|
||||||
var child_process = require('child_process');
|
var child_process = require('child_process');
|
||||||
|
var parentpath = __dirname;
|
||||||
|
|
||||||
|
// Get the working directory
|
||||||
|
if ((__dirname.endsWith('/node_modules/meshcentral')) || (__dirname.endsWith('\\node_modules\\meshcentral')) || (__dirname.endsWith('/node_modules/meshcentral/')) || (__dirname.endsWith('\\node_modules\\meshcentral\\'))) { parentpath = require('path').join(__dirname, '../..'); }
|
||||||
|
|
||||||
// Looks like we need to keep a global reference to the child process object for this to work correctly.
|
// Looks like we need to keep a global reference to the child process object for this to work correctly.
|
||||||
InstallModuleChildProcess = child_process.exec('npm install --no-optional --save ' + modulename, { maxBuffer: 512000, timeout: 10000, cwd: obj.parentpath }, function (error, stdout, stderr) {
|
InstallModuleChildProcess = child_process.exec('npm install --no-optional --save ' + modulename, { maxBuffer: 512000, timeout: 10000, cwd: parentpath }, function (error, stdout, stderr) {
|
||||||
InstallModuleChildProcess = null;
|
InstallModuleChildProcess = null;
|
||||||
if (error != null) {
|
if (error != null) {
|
||||||
console.log('ERROR: Unable to install required module "' + modulename + '". MeshCentral may not have access to npm, or npm may not have suffisent rights to load the new module. Try "npm install ' + modulename + '" to manualy install this module.\r\n');
|
console.log('ERROR: Unable to install required module "' + modulename + '". MeshCentral may not have access to npm, or npm may not have suffisent rights to load the new module. Try "npm install ' + modulename + '" to manualy install this module.\r\n');
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "meshcentral",
|
"name": "meshcentral",
|
||||||
"version": "0.3.1-u",
|
"version": "0.3.1-w",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"Remote Management",
|
"Remote Management",
|
||||||
"Intel AMT",
|
"Intel AMT",
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
* @version v0.0.2c
|
* @version v0.0.2c
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
|
||||||
|
|
||||||
// Construct a MeshServer object
|
// Construct a MeshServer object
|
||||||
var CreateAmtRemoteTerminal = function (divid) {
|
var CreateAmtRemoteTerminal = function (divid) {
|
||||||
var obj = {};
|
var obj = {};
|
||||||
@ -32,10 +34,14 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
var _termstate = 0;
|
var _termstate = 0;
|
||||||
var _escNumber = [];
|
var _escNumber = [];
|
||||||
var _escNumberPtr = 0;
|
var _escNumberPtr = 0;
|
||||||
|
var _escNumberMode = 0;
|
||||||
var _scratt = [];
|
var _scratt = [];
|
||||||
var _tscreen = [];
|
var _tscreen = [];
|
||||||
var _VTUNDERLINE = 1;
|
var _VTUNDERLINE = 1;
|
||||||
var _VTREVERSE = 2;
|
var _VTREVERSE = 2;
|
||||||
|
var _backSpaceErase = false;
|
||||||
|
var _cursorVisible = true;
|
||||||
|
var _scrollRegion = [0, 25];
|
||||||
|
|
||||||
obj.Start = function () { }
|
obj.Start = function () { }
|
||||||
|
|
||||||
@ -72,6 +78,9 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
switch (c) {
|
switch (c) {
|
||||||
case 27: // ESC
|
case 27: // ESC
|
||||||
_termstate = 1;
|
_termstate = 1;
|
||||||
|
_escNumber = [];
|
||||||
|
_escNumberPtr = 0;
|
||||||
|
_escNumberMode = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// Process a single char
|
// Process a single char
|
||||||
@ -82,8 +91,6 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
case 1:
|
case 1:
|
||||||
switch (b) {
|
switch (b) {
|
||||||
case '[':
|
case '[':
|
||||||
_escNumberPtr = 0;
|
|
||||||
_escNumber = [];
|
|
||||||
_termstate = 2;
|
_termstate = 2;
|
||||||
break;
|
break;
|
||||||
case '(':
|
case '(':
|
||||||
@ -92,6 +99,14 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
case ')':
|
case ')':
|
||||||
_termstate = 5;
|
_termstate = 5;
|
||||||
break;
|
break;
|
||||||
|
case '=':
|
||||||
|
// Set alternate keypad mode
|
||||||
|
_termstate = 0;
|
||||||
|
break;
|
||||||
|
case '>':
|
||||||
|
// Set numeric keypad mode
|
||||||
|
_termstate = 0;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
_termstate = 0;
|
_termstate = 0;
|
||||||
break;
|
break;
|
||||||
@ -107,16 +122,17 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
_escNumber[_escNumberPtr] = ((_escNumber[_escNumberPtr] * 10) + (b - '0'));
|
_escNumber[_escNumberPtr] = ((_escNumber[_escNumberPtr] * 10) + (b - '0'));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
} else if (b == ';') {
|
||||||
else if (b == ';') {
|
|
||||||
// New number
|
// New number
|
||||||
_escNumberPtr++;
|
_escNumberPtr++;
|
||||||
break;
|
break;
|
||||||
}
|
} else if (b == '?') {
|
||||||
else {
|
_escNumberMode = 1;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
// Process Escape Sequence
|
// Process Escape Sequence
|
||||||
if (!_escNumber[0]) _escNumber[0] = 0;
|
if (!_escNumber[0]) _escNumber[0] = 0;
|
||||||
_ProcessEscapeHandler(b, _escNumber, _escNumberPtr + 1);
|
_ProcessEscapeHandler(b, _escNumber, _escNumberPtr + 1, _escNumberMode);
|
||||||
_termstate = 0;
|
_termstate = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -129,151 +145,195 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function _ProcessEscapeHandler(code, args, argslen) {
|
function _ProcessEscapeHandler(code, args, argslen, mode) {
|
||||||
var i;
|
//console.log('process', code, args, mode);
|
||||||
switch (code) {
|
if (mode == 1) {
|
||||||
case 'c': // ResetDevice
|
switch (code) {
|
||||||
// Reset
|
case 'l': // Hide the cursor
|
||||||
obj.TermResetScreen();
|
if (args[0] == 25) { _cursorVisible = false; }
|
||||||
break;
|
break;
|
||||||
case 'A': // Move cursor up n lines
|
case 'h': // Show the cursor
|
||||||
if (argslen == 1) {
|
if (args[0] == 25) { _cursorVisible = true; }
|
||||||
_termy -= args[0];
|
break;
|
||||||
if (_termy < 0) _termy = 0;
|
}
|
||||||
}
|
} else if (mode == 0) {
|
||||||
break;
|
var i;
|
||||||
case 'B': // Move cursor down n lines
|
switch (code) {
|
||||||
if (argslen == 1) {
|
case 'c': // ResetDevice
|
||||||
_termy += args[0];
|
// Reset
|
||||||
if (_termy > obj.height) _termy = obj.height;
|
obj.TermResetScreen();
|
||||||
}
|
break;
|
||||||
break;
|
case 'A': // Move cursor up n lines
|
||||||
case 'C': // Move cursor right n lines
|
if (argslen == 1) {
|
||||||
if (argslen == 1) {
|
if (args[0] == 0) { _termy--; } else { _termy -= args[0]; }
|
||||||
_termx += args[0];
|
if (_termy < 0) _termy = 0;
|
||||||
if (_termx > obj.width) _termx = obj.width;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'D': // Move cursor left n lines
|
|
||||||
if (argslen == 1) {
|
|
||||||
_termx -= args[0];
|
|
||||||
if (_termx < 0) _termx = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'd': // Set cursor to line n
|
|
||||||
if (argslen == 1) {
|
|
||||||
_termy = args[0] - 1;
|
|
||||||
if (_termy > obj.height) _termy = obj.height;
|
|
||||||
if (_termy < 0) _termy = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'G': // Set cursor to col n
|
|
||||||
if (argslen == 1) {
|
|
||||||
_termx = args[0] - 1;
|
|
||||||
if (_termx < 0) _termx = 0;
|
|
||||||
if (_termx > 79) _termx = 79;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'J': // ClearScreen:
|
|
||||||
if (argslen == 1 && args[0] == 2) {
|
|
||||||
obj.TermClear((_TermCurrentBColor << 12) + (_TermCurrentFColor << 6)); // Erase entire screen
|
|
||||||
_termx = 0;
|
|
||||||
_termy = 0;
|
|
||||||
}
|
|
||||||
else if (argslen == 0 || argslen == 1 && args[0] == 0) // Erase cursor down
|
|
||||||
{
|
|
||||||
_EraseCursorToEol();
|
|
||||||
for (i = _termy + 1; i < obj.height; i++) _EraseLine(i);
|
|
||||||
}
|
|
||||||
else if (argslen == 1 && args[0] == 1) // Erase cursor up
|
|
||||||
{
|
|
||||||
_EraseCursorToEol();
|
|
||||||
for (i = 0; i < _termy - 1; i++) _EraseLine(i);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'H': // MoveCursor:
|
|
||||||
if (argslen == 2) {
|
|
||||||
if (args[0] < 1) args[0] = 1;
|
|
||||||
if (args[1] < 1) args[1] = 1;
|
|
||||||
if (args[0] > obj.height) args[0] = obj.height;
|
|
||||||
if (args[1] > obj.width) args[1] = obj.width;
|
|
||||||
_termy = args[0] - 1;
|
|
||||||
_termx = args[1] - 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
_termy = 0;
|
|
||||||
_termx = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'm': // ScreenAttribs:
|
|
||||||
// Change attributes
|
|
||||||
for (i = 0; i < argslen; i++) {
|
|
||||||
if (!args[i] || args[i] == 0) {
|
|
||||||
// Reset Attributes
|
|
||||||
_TermCurrentBColor = 0;
|
|
||||||
_TermCurrentFColor = 7;
|
|
||||||
_TermCurrentReverse = 0;
|
|
||||||
}
|
}
|
||||||
else if (args[i] == 1) {
|
break;
|
||||||
// Bright
|
case 'B': // Move cursor down n lines
|
||||||
if (_TermCurrentFColor < 8) _TermCurrentFColor += 8;
|
if (argslen == 1) {
|
||||||
|
if (args[0] == 0) { _termy++; } else { _termy += args[0]; }
|
||||||
|
if (_termy > obj.height) _termy = obj.height;
|
||||||
}
|
}
|
||||||
else if (args[i] == 2 || args[i] == 22) {
|
break;
|
||||||
// Dim
|
case 'C': // Move cursor right n lines
|
||||||
if (_TermCurrentFColor >= 8) _TermCurrentFColor -= 8;
|
if (argslen == 1) {
|
||||||
|
if (args[0] == 0) { _termx++; } else { _termx += args[0]; }
|
||||||
|
if (_termx > obj.width) _termx = obj.width;
|
||||||
}
|
}
|
||||||
else if (args[i] == 7) {
|
break;
|
||||||
// Set Reverse attribute true
|
case 'D': // Move cursor left n lines
|
||||||
_TermCurrentReverse = 2;
|
if (argslen == 1) {
|
||||||
|
if (args[0] == 0) { _termx--; } else { _termx -= args[0]; }
|
||||||
|
if (_termx < 0) _termx = 0;
|
||||||
}
|
}
|
||||||
else if (args[i] == 27) {
|
break;
|
||||||
// Set Reverse attribute false
|
case 'd': // Set cursor to line n
|
||||||
_TermCurrentReverse = 0;
|
if (argslen == 1) {
|
||||||
|
_termy = args[0] - 1;
|
||||||
|
if (_termy > obj.height) _termy = obj.height;
|
||||||
|
if (_termy < 0) _termy = 0;
|
||||||
}
|
}
|
||||||
else if (args[i] >= 30 && args[i] <= 37) {
|
break;
|
||||||
// Set Foreground Color
|
case 'G': // Set cursor to col n
|
||||||
var bright = (_TermCurrentFColor >= 8);
|
if (argslen == 1) {
|
||||||
_TermCurrentFColor = (args[i] - 30);
|
_termx = args[0] - 1;
|
||||||
if (bright && _TermCurrentFColor <= 8) _TermCurrentFColor += 8;
|
if (_termx < 0) _termx = 0;
|
||||||
|
if (_termx > 79) _termx = 79;
|
||||||
}
|
}
|
||||||
else if (args[i] >= 40 && args[i] <= 47) {
|
break;
|
||||||
// Set Background Color
|
case 'P': // Move the rest of the line left, this is a guess as there is no documentation about this code (???)
|
||||||
_TermCurrentBColor = (args[i] - 40);
|
if (argslen == 1) {
|
||||||
|
for (i = _termx; i < (obj.width - args[0]) ; i++) {
|
||||||
|
_tscreen[_termy][i] = _tscreen[_termy][i + args[0]]
|
||||||
|
_scratt[_termy][i] = _scratt[_termy][i + args[0]];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (args[i] >= 90 && args[i] <= 99) {
|
break;
|
||||||
// Set Bright Foreground Color
|
case 'J': // ClearScreen:
|
||||||
_TermCurrentFColor = (args[i] - 82);
|
if (argslen == 1 && args[0] == 2) {
|
||||||
|
obj.TermClear((_TermCurrentBColor << 12) + (_TermCurrentFColor << 6)); // Erase entire screen
|
||||||
|
_termx = 0;
|
||||||
|
_termy = 0;
|
||||||
}
|
}
|
||||||
else if (args[i] >= 100 && args[i] <= 109) {
|
else if (argslen == 0 || argslen == 1 && args[0] == 0) // Erase cursor down
|
||||||
// Set Bright Background Color
|
|
||||||
_TermCurrentBColor = (args[i] - 92);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'K': // EraseLine:
|
|
||||||
if (argslen == 0 || (argslen == 1 && (!args[0] || args[0] == 0))) {
|
|
||||||
_EraseCursorToEol(); // Erase from the cursor to the end of the line
|
|
||||||
}
|
|
||||||
else if (argslen == 1) {
|
|
||||||
if (args[0] == 1) // Erase from the beginning of the line to the cursor
|
|
||||||
{
|
{
|
||||||
_EraseBolToCursor();
|
_EraseCursorToEol();
|
||||||
|
for (i = _termy + 1; i < obj.height; i++) _EraseLine(i);
|
||||||
}
|
}
|
||||||
else if (args[0] == 2) // Erase the line with the cursor
|
else if (argslen == 1 && args[0] == 1) // Erase cursor up
|
||||||
{
|
{
|
||||||
_EraseLine(_termy);
|
_EraseCursorToEol();
|
||||||
|
for (i = 0; i < _termy - 1; i++) _EraseLine(i);
|
||||||
}
|
}
|
||||||
}
|
break;
|
||||||
break;
|
case 'H': // MoveCursor:
|
||||||
case 'h': // EnableLineWrap:
|
if (argslen == 2) {
|
||||||
_TermLineWrap = true;
|
if (args[0] < 1) args[0] = 1;
|
||||||
break;
|
if (args[1] < 1) args[1] = 1;
|
||||||
case 'l': // DisableLineWrap:
|
if (args[0] > obj.height) args[0] = obj.height;
|
||||||
_TermLineWrap = false;
|
if (args[1] > obj.width) args[1] = obj.width;
|
||||||
break;
|
_termy = args[0] - 1;
|
||||||
default:
|
_termx = args[1] - 1;
|
||||||
//if (code != '@') alert(code);
|
}
|
||||||
break;
|
else {
|
||||||
|
_termy = 0;
|
||||||
|
_termx = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'm': // ScreenAttribs:
|
||||||
|
// Change attributes
|
||||||
|
for (i = 0; i < argslen; i++) {
|
||||||
|
if (!args[i] || args[i] == 0) {
|
||||||
|
// Reset Attributes
|
||||||
|
_TermCurrentBColor = 0;
|
||||||
|
_TermCurrentFColor = 7;
|
||||||
|
_TermCurrentReverse = 0;
|
||||||
|
}
|
||||||
|
else if (args[i] == 1) {
|
||||||
|
// Bright
|
||||||
|
if (_TermCurrentFColor < 8) _TermCurrentFColor += 8;
|
||||||
|
}
|
||||||
|
else if (args[i] == 2 || args[i] == 22) {
|
||||||
|
// Dim
|
||||||
|
if (_TermCurrentFColor >= 8) _TermCurrentFColor -= 8;
|
||||||
|
}
|
||||||
|
else if (args[i] == 7) {
|
||||||
|
// Set Reverse attribute true
|
||||||
|
_TermCurrentReverse = 2;
|
||||||
|
}
|
||||||
|
else if (args[i] == 27) {
|
||||||
|
// Set Reverse attribute false
|
||||||
|
_TermCurrentReverse = 0;
|
||||||
|
}
|
||||||
|
else if (args[i] >= 30 && args[i] <= 37) {
|
||||||
|
// Set Foreground Color
|
||||||
|
var bright = (_TermCurrentFColor >= 8);
|
||||||
|
_TermCurrentFColor = (args[i] - 30);
|
||||||
|
if (bright && _TermCurrentFColor <= 8) _TermCurrentFColor += 8;
|
||||||
|
}
|
||||||
|
else if (args[i] >= 40 && args[i] <= 47) {
|
||||||
|
// Set Background Color
|
||||||
|
_TermCurrentBColor = (args[i] - 40);
|
||||||
|
}
|
||||||
|
else if (args[i] >= 90 && args[i] <= 99) {
|
||||||
|
// Set Bright Foreground Color
|
||||||
|
_TermCurrentFColor = (args[i] - 82);
|
||||||
|
}
|
||||||
|
else if (args[i] >= 100 && args[i] <= 109) {
|
||||||
|
// Set Bright Background Color
|
||||||
|
_TermCurrentBColor = (args[i] - 92);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'K': // EraseLine:
|
||||||
|
if (argslen == 0 || (argslen == 1 && (!args[0] || args[0] == 0))) {
|
||||||
|
_EraseCursorToEol(); // Erase from the cursor to the end of the line
|
||||||
|
}
|
||||||
|
else if (argslen == 1) {
|
||||||
|
if (args[0] == 1) // Erase from the beginning of the line to the cursor
|
||||||
|
{
|
||||||
|
_EraseBolToCursor();
|
||||||
|
}
|
||||||
|
else if (args[0] == 2) // Erase the line with the cursor
|
||||||
|
{
|
||||||
|
_EraseLine(_termy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'h': // EnableLineWrap:
|
||||||
|
_TermLineWrap = true;
|
||||||
|
break;
|
||||||
|
case 'l': // DisableLineWrap:
|
||||||
|
_TermLineWrap = false;
|
||||||
|
break;
|
||||||
|
case 'r': // Set the scroll region
|
||||||
|
if (argslen == 2) { _scrollRegion = [args[0] - 1, args[1] - 1]; }
|
||||||
|
break;
|
||||||
|
case 'S': // Scroll up the scroll region X lines, default 1
|
||||||
|
var x = 1;
|
||||||
|
if (argslen == 1) { x = args[0] }
|
||||||
|
for (var y = _scrollRegion[0]; y <= _scrollRegion[1] - x; y++) {
|
||||||
|
for (var z = 0; z < obj.width; z++) { _tscreen[y][z] = _tscreen[y + x][z]; _scratt[y][z] = _scratt[y + x][z]; }
|
||||||
|
}
|
||||||
|
for (var y = _scrollRegion[1] - x + 1; y < _scrollRegion[1]; y++) {
|
||||||
|
for (var z = 0; z < obj.width; z++) { _tscreen[y][z] = ' '; _scratt[y][z] = (7 << 6); }
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'T': // Scroll down the scroll region X lines, default 1
|
||||||
|
var x = 1;
|
||||||
|
if (argslen == 1) { x = args[0] }
|
||||||
|
for (var y = _scrollRegion[1]; y > _scrollRegion[0] + x; y--) {
|
||||||
|
for (var z = 0; z < obj.width; z++) { _tscreen[y][z] = _tscreen[y - x][z]; _scratt[y][z] = _scratt[y - x][z]; }
|
||||||
|
}
|
||||||
|
for (var y = _scrollRegion[0] + x; y > _scrollRegion[0]; y--) {
|
||||||
|
for (var z = 0; z < obj.width; z++) { _tscreen[y][z] = ' '; _scratt[y][z] = (7 << 6); }
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
//if (code != '@') alert(code);
|
||||||
|
//console.log('unknown process', code, args, mode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,6 +426,7 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
function _ProcessVt100Char(c) {
|
function _ProcessVt100Char(c) {
|
||||||
if (c == '\0' || c.charCodeAt() == 7) return; // Ignore null & bell
|
if (c == '\0' || c.charCodeAt() == 7) return; // Ignore null & bell
|
||||||
var ch = c.charCodeAt();
|
var ch = c.charCodeAt();
|
||||||
|
//console.log('_ProcessVt100Char', ch, c);
|
||||||
|
|
||||||
// ###BEGIN###{Terminal-Enumation-All}
|
// ###BEGIN###{Terminal-Enumation-All}
|
||||||
// UTF8 Terminal
|
// UTF8 Terminal
|
||||||
@ -401,8 +462,8 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
switch (c) {
|
switch (c) {
|
||||||
case '\b': // Backspace
|
case '\b': // Backspace
|
||||||
if (_termx > 0) {
|
if (_termx > 0) {
|
||||||
_termx = _termx - 1;
|
_termx--;
|
||||||
_TermDrawChar(' ');
|
if (_backSpaceErase) { _TermDrawChar(' '); }
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '\t': // tab
|
case '\t': // tab
|
||||||
@ -411,7 +472,7 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
break;
|
break;
|
||||||
case '\n': // Linefeed
|
case '\n': // Linefeed
|
||||||
_termy++;
|
_termy++;
|
||||||
if (_termy > (obj.height - 1)) {
|
if (_termy > (_scrollRegion[1] - 1)) {
|
||||||
// Move everything up one line
|
// Move everything up one line
|
||||||
_TermMoveUp(1);
|
_TermMoveUp(1);
|
||||||
_termy = (obj.height - 1);
|
_termy = (obj.height - 1);
|
||||||
@ -459,7 +520,7 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function _EraseCursorToEol() {
|
function _EraseCursorToEol() {
|
||||||
var t = (_TermCurrentBColor << 12);
|
var t = (_TermCurrentFColor << 6) + (_TermCurrentBColor << 12) + _TermCurrentReverse;
|
||||||
for (var x = _termx; x < obj.width; x++) {
|
for (var x = _termx; x < obj.width; x++) {
|
||||||
_tscreen[_termy][x] = ' ';
|
_tscreen[_termy][x] = ' ';
|
||||||
_scratt[_termy][x] = t;
|
_scratt[_termy][x] = t;
|
||||||
@ -467,7 +528,7 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function _EraseBolToCursor() {
|
function _EraseBolToCursor() {
|
||||||
var t = (_TermCurrentBColor << 12);
|
var t = (_TermCurrentFColor << 6) + (_TermCurrentBColor << 12) + _TermCurrentReverse;
|
||||||
for (var x = 0; x < _termx; x++) {
|
for (var x = 0; x < _termx; x++) {
|
||||||
_tscreen[_termy][x] = ' ';
|
_tscreen[_termy][x] = ' ';
|
||||||
_scratt[_termy][x] = t;
|
_scratt[_termy][x] = t;
|
||||||
@ -475,7 +536,7 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function _EraseLine(line) {
|
function _EraseLine(line) {
|
||||||
var t = (_TermCurrentBColor << 12);
|
var t = (_TermCurrentFColor << 6) + (_TermCurrentBColor << 12) + _TermCurrentReverse;
|
||||||
for (var x = 0; x < obj.width; x++) {
|
for (var x = 0; x < obj.width; x++) {
|
||||||
_tscreen[line][x] = ' ';
|
_tscreen[line][x] = ' ';
|
||||||
_scratt[line][x] = t;
|
_scratt[line][x] = t;
|
||||||
@ -487,11 +548,11 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
|
|
||||||
function _TermMoveUp(linecount) {
|
function _TermMoveUp(linecount) {
|
||||||
var x, y;
|
var x, y;
|
||||||
for (y = 0; y < obj.height - linecount; y++) {
|
for (y = _scrollRegion[0]; y <= _scrollRegion[1] - linecount; y++) {
|
||||||
_tscreen[y] = _tscreen[y + linecount];
|
_tscreen[y] = _tscreen[y + linecount];
|
||||||
_scratt[y] = _scratt[y + linecount];
|
_scratt[y] = _scratt[y + linecount];
|
||||||
}
|
}
|
||||||
for (y = obj.height - linecount; y < obj.height; y++) {
|
for (y = _scrollRegion[1] - linecount + 1; y <= _scrollRegion[1]; y++) {
|
||||||
_tscreen[y] = [];
|
_tscreen[y] = [];
|
||||||
_scratt[y] = [];
|
_scratt[y] = [];
|
||||||
for (x = 0; x < obj.width; x++) {
|
for (x = 0; x < obj.width; x++) {
|
||||||
@ -569,7 +630,7 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
for (var y = 0; y < obj.height; ++y) {
|
for (var y = 0; y < obj.height; ++y) {
|
||||||
for (var x = 0; x < obj.width; ++x) {
|
for (var x = 0; x < obj.width; ++x) {
|
||||||
newat = _scratt[y][x];
|
newat = _scratt[y][x];
|
||||||
if (_termx == x && _termy == y) { newat |= _VTREVERSE; } // If this is the cursor location, reverse the color.
|
if (_termx == x && _termy == y && _cursorVisible) { newat |= _VTREVERSE; } // If this is the cursor location, reverse the color.
|
||||||
if (newat != oldat) {
|
if (newat != oldat) {
|
||||||
buf += closetag;
|
buf += closetag;
|
||||||
closetag = '';
|
closetag = '';
|
||||||
@ -584,17 +645,11 @@ var CreateAmtRemoteTerminal = function (divid) {
|
|||||||
|
|
||||||
c = _tscreen[y][x];
|
c = _tscreen[y][x];
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '&':
|
case '&': buf += '&'; break;
|
||||||
buf += '&'; break;
|
case '<': buf += '<'; break;
|
||||||
case '<':
|
case '>': buf += '>'; break;
|
||||||
buf += '<'; break;
|
case ' ': buf += ' '; break;
|
||||||
case '>':
|
default: buf += c; break;
|
||||||
buf += '>'; break;
|
|
||||||
case ' ':
|
|
||||||
buf += ' '; break;
|
|
||||||
default:
|
|
||||||
buf += c;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (y != (obj.height - 1)) buf += '<br>';
|
if (y != (obj.height - 1)) buf += '<br>';
|
||||||
|
Loading…
Reference in New Issue
Block a user