webgme-gridlabd
Version:
Metamodel, visualization, and model generators for gridlab-d in WebGME. Allows graphical model-driven development and simulation of power grids and power generation / transmission / distribution / storage systems.
224 lines (206 loc) • 5.42 kB
JavaScript
define(['q'], function(Q) {
'use strict';
return {
chunkString: function(str, len) {
return String(str).match(new RegExp('(.|[\r\n ]){1,' + len + '}', 'g'));
},
sanitizePath: function(path) {
return path.replace(/ /g, '\\ ');
},
range: function(lowEnd,highEnd) {
var arr = [],
c = highEnd - lowEnd + 1;
while ( c-- ) {
arr[c] = highEnd--
}
return arr;
},
testPing: function(ip) {
var self = this;
var ping = require('ping');
return ping.promise.probe(ip)
.then(function (res) {
if (!res.alive)
throw new String(ip + ' is not reachable.');
return true;
});
},
testSSH: function(ip, username, key) {
var self = this;
return self.executeOnHost(['echo "hello"'], ip, username, key)
.then(function () {
return true;
})
.catch(function (err) {
throw new String(username + '@' + ip + ' not SSH-able: ' + err);
});
},
executeOnHost: function(cmds, ip, username, key, stderrCB) {
var self = this;
var Client = require('ssh2').Client;
var deferred = Q.defer();
var output = {
username: username,
key: key,
ip: ip,
returnCode: -1,
signal: undefined,
stdout: '',
stderr: ''
};
if ( stderrCB == undefined ) {
stderrCB = function(data) {
return true;
};
}
var remote_stdout = '';
var remote_stderr = '';
cmds.push('exit\n');
var cmdString = cmds.join('\n');
try {
var conn = new Client();
conn.on('error', (err) => {
deferred.reject('Couldnt connect to ' + ip + ': ' + err);
});
conn.on('ready', function() {
conn.exec(cmdString, function(err, stream) {
if (err) {
var msg = 'SSH2 Exec error: ' + err;
deferred.reject(msg);
}
stream.on('close', function(code, signal) {
conn.end();
output.returnCode = code;
output.signal = signal;
output.stdout = remote_stdout.replace(new RegExp(username + '@.+\$','gi'), '');
for (var c in cmds) {
output.stdout = output.stdout.replace(new RegExp(cmds[c], 'gi'), '');
}
output.stderr = remote_stderr;
deferred.resolve(output);
}).stdout.on('data', function(data) {
remote_stdout += data;
}).stderr.on('data', function(data) {
remote_stderr += data;
if (stderrCB(data)) {
conn.end();
deferred.reject(data);
}
});
})
}).connect({
host: ip,
port: 22,
username: username,
privateKey: require('fs').readFileSync(key)
});
}
catch (err) {
deferred.reject('Couldnt execute on ' + ip + ': '+ err);
}
return deferred.promise;
},
mkdirRemote: function(dir, ip, username, key) {
var self = this;
dir = self.sanitizePath(dir);
return self.executeOnHost(['mkdir -p ' + dir],
ip,
username,
key);
},
copyToHost: function(from, to, ip, username, key) {
var self = this;
var client = require('scp2');
//from = self.sanitizePath(from);
//to = self.sanitizePath(to);
var deferred = Q.defer();
try {
client.scp(from, {
host: ip,
username: username,
privateKey: require('fs').readFileSync(key),
path: to
}, function(err) {
if (err)
deferred.reject('copy to ' + ip + ' failed: '+ err);
else {
deferred.resolve();
}
});
}
catch (err) {
deferred.reject('copy to ' + ip + ' failed: '+ err);
}
return deferred.promise;
},
copyFromHost: function(from, to, ip, username, key) {
var self = this;
from = self.sanitizePath(from);
to = self.sanitizePath(to);
var url = require('url'),
path = require('path'),
fs = require('fs'),
unzip = require('unzip'),
fstream = require('fstream'),
child_process = require('child_process');
var local = to;
var remote = username + '@' + ip + ':' + from;
var scp = 'scp -o StrictHostKeyChecking=no -i ' + key + ' -r ' + remote + ' ' + local;
var deferred = Q.defer();
var child = child_process.exec(scp, function(err, stdout, stderr) {
if (err) {
deferred.reject('copy from ' + ip + ' failed: '+err);
}
else {
deferred.resolve('copied ' + remote + ' into ' + local);
}
});
return deferred.promise;
},
POST: function(host, port, path, jsonData) {
var http = require('http');
var options = {
hostname: host, //'demo-c2wt-master',
port: port, //8080,
path: path, //'/v2/apps',
method: 'POST',
headers: {
'Content-Type': 'application/json',
}
};
var deferred = Q.defer();
var req = http.request(options, function(res) {
//console.log('Status code: '+ res.statusCode);
res.setEncoding('utf8');
res.on('data', function (body) {
deferred.resolve(body);
});
});
req.on('error', function(e) {
deferred.reject(e);
});
// write data to request body
req.write(jsonData);
req.end();
return deferred.promise;
},
GET: function(host, port, path) {
var http = require('http');
var options = {
hostname: host,
port: port,
path: path
};
var deferred = Q.defer();
http.get(options, function(res) {
res.setEncoding('utf8');
res.on('data', function (body) {
deferred.resolve(body);
});
}).on('error', function(e) {
deferred.reject(e);
});
return deferred.promise;
}
}
});