mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Rework nr-cli
- better componentisation - add 'search' option to look for npm modules - add 'target' option to point at non-default installs
This commit is contained in:
parent
31255bd66b
commit
af0b740fbd
@ -1,179 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
;(function() {
|
|
||||||
/**
|
|
||||||
* Copyright 2014 IBM Corp.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
**/
|
|
||||||
|
|
||||||
|
|
||||||
var request = require("request");
|
|
||||||
var colors = require('colors');
|
|
||||||
|
|
||||||
|
|
||||||
function formatBoolean(v,c) {
|
|
||||||
if (v) {
|
|
||||||
return ("["+c+"]");
|
|
||||||
} else {
|
|
||||||
return ("[ ]");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function formatNodeInfo(n) {
|
|
||||||
var inError = n.hasOwnProperty("err");
|
|
||||||
|
|
||||||
var str = formatBoolean(n.enabled,"X")+formatBoolean(n.loaded,"L")+" ";
|
|
||||||
str += n.id;
|
|
||||||
if (n.enabled && n.loaded) {
|
|
||||||
str = str.green;
|
|
||||||
} else if (n.enabled && n.err) {
|
|
||||||
str = str.red;
|
|
||||||
} else {
|
|
||||||
str = str.yellow;
|
|
||||||
}
|
|
||||||
if (n.module) {
|
|
||||||
str += " ["+n.module+"]";
|
|
||||||
}
|
|
||||||
str += " "+n.types.join(", ");
|
|
||||||
if (n.err) {
|
|
||||||
str+=" "+n.err.red;
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
var options;
|
|
||||||
|
|
||||||
if (process.argv[2] == "nodes") {
|
|
||||||
|
|
||||||
options = {
|
|
||||||
url: 'http://localhost:1880/nodes',
|
|
||||||
headers: {
|
|
||||||
'Accept': 'application/json'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
request(options, function (error, response, body) {
|
|
||||||
if (!error && response.statusCode == 200) {
|
|
||||||
var info = JSON.parse(body);
|
|
||||||
for (var i=0;i<info.length;i++) {
|
|
||||||
var n = info[i];
|
|
||||||
console.log(formatNodeInfo(n))
|
|
||||||
}
|
|
||||||
} else if (error) {
|
|
||||||
console.log(error.toString().red);
|
|
||||||
} else {
|
|
||||||
console.log((response.statusCode+": "+body).red);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else if (process.argv[2] == "node" && process.argv[3]) {
|
|
||||||
options = {
|
|
||||||
url: 'http://localhost:1880/nodes/'+process.argv[3],
|
|
||||||
headers: {
|
|
||||||
'Accept': 'application/json'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
request(options, function (error, response, body) {
|
|
||||||
if (!error && response.statusCode == 200) {
|
|
||||||
var info = JSON.parse(body);
|
|
||||||
console.log(formatNodeInfo(info));
|
|
||||||
} else if (error) {
|
|
||||||
console.log(error.toString().red);
|
|
||||||
} else {
|
|
||||||
console.log((response.statusCode+": "+body).red);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else if (process.argv[2] == "enable-node" && process.argv[3]) {
|
|
||||||
options = {
|
|
||||||
method: "PUT",
|
|
||||||
url: 'http://localhost:1880/nodes/'+process.argv[3],
|
|
||||||
headers: {
|
|
||||||
'Accept': 'application/json',
|
|
||||||
'content-type':'application/json'
|
|
||||||
},
|
|
||||||
body: JSON.stringify({enabled:true})
|
|
||||||
};
|
|
||||||
request(options, function (error, response, body) {
|
|
||||||
if (!error && response.statusCode == 200) {
|
|
||||||
var info = JSON.parse(body);
|
|
||||||
console.log(formatNodeInfo(info));
|
|
||||||
} else if (error) {
|
|
||||||
console.log(error.toString().red);
|
|
||||||
} else {
|
|
||||||
console.log((response.statusCode+": "+body).red);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else if (process.argv[2] == "disable-node" && process.argv[3]) {
|
|
||||||
options = {
|
|
||||||
method: "PUT",
|
|
||||||
url: 'http://localhost:1880/nodes/'+process.argv[3],
|
|
||||||
headers: {
|
|
||||||
'Accept': 'application/json',
|
|
||||||
'content-type':'application/json'
|
|
||||||
},
|
|
||||||
body: JSON.stringify({enabled:false})
|
|
||||||
};
|
|
||||||
request(options, function (error, response, body) {
|
|
||||||
if (!error && response.statusCode == 200) {
|
|
||||||
var info = JSON.parse(body);
|
|
||||||
console.log(formatNodeInfo(info));
|
|
||||||
} else if (error) {
|
|
||||||
console.log(error.toString().red);
|
|
||||||
} else {
|
|
||||||
console.log((response.statusCode+": "+body).red);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else if (process.argv[2] == "install" && process.argv[3]) {
|
|
||||||
options = {
|
|
||||||
method: "POST",
|
|
||||||
url: 'http://localhost:1880/nodes',
|
|
||||||
headers: {
|
|
||||||
'Accept': 'application/json',
|
|
||||||
'content-type':'application/json'
|
|
||||||
},
|
|
||||||
body: JSON.stringify({module:process.argv[3]})
|
|
||||||
};
|
|
||||||
request(options, function (error, response, body) {
|
|
||||||
if (!error && response.statusCode == 200) {
|
|
||||||
var info = JSON.parse(body);
|
|
||||||
for (var i=0;i<info.length;i++) {
|
|
||||||
var n = info[i];
|
|
||||||
console.log(formatNodeInfo(n))
|
|
||||||
}
|
|
||||||
} else if (error) {
|
|
||||||
console.log(error.toString().red);
|
|
||||||
} else {
|
|
||||||
console.log((response.statusCode+": "+body).red);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else if (process.argv[2] == "remove" && process.argv[3]) {
|
|
||||||
options = {
|
|
||||||
method: "DELETE",
|
|
||||||
url: 'http://localhost:1880/nodes/'+process.argv[3],
|
|
||||||
headers: {
|
|
||||||
'Accept': 'application/json',
|
|
||||||
}
|
|
||||||
};
|
|
||||||
request(options, function (error, response, body) {
|
|
||||||
if (!error && response.statusCode == 200) {
|
|
||||||
var info = JSON.parse(body);
|
|
||||||
for (var i=0;i<info.length;i++) {
|
|
||||||
var n = info[i];
|
|
||||||
console.log(formatNodeInfo(n))
|
|
||||||
}
|
|
||||||
} else if (error) {
|
|
||||||
console.log(error.toString().red);
|
|
||||||
} else {
|
|
||||||
console.log((response.statusCode+": "+body).red);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
})();
|
|
49
red/cli/lib/config.js
Normal file
49
red/cli/lib/config.js
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2014 IBM Corp.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
**/
|
||||||
|
|
||||||
|
var path = require("path");
|
||||||
|
var fs = require("fs");
|
||||||
|
|
||||||
|
var userHome = process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE;
|
||||||
|
|
||||||
|
var configDir = path.join(userHome,".nodered");
|
||||||
|
var configFile = path.join(configDir,"config.json");
|
||||||
|
|
||||||
|
var config;
|
||||||
|
|
||||||
|
function load() {
|
||||||
|
if (config == null) {
|
||||||
|
try {
|
||||||
|
config = JSON.parse(fs.readFileSync(configFile));
|
||||||
|
} catch(err) {
|
||||||
|
config = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function save() {
|
||||||
|
try {
|
||||||
|
fs.mkdirSync(configDir);
|
||||||
|
} catch(err) {
|
||||||
|
if (err.code != "EEXIST") {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fs.writeFileSync(configFile,JSON.stringify(config,null,4));
|
||||||
|
}
|
||||||
|
module.exports = {};
|
||||||
|
module.exports.__defineGetter__('target',function() { load(); return config.target|| "http://localhost:1880" });
|
||||||
|
module.exports.__defineSetter__('target',function(v) { load(); config.target = v; save();});
|
40
red/cli/lib/request.js
Normal file
40
red/cli/lib/request.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2014 IBM Corp.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
**/
|
||||||
|
|
||||||
|
var when = require("when");
|
||||||
|
var request = require("request");
|
||||||
|
var config = require("./config");
|
||||||
|
|
||||||
|
module.exports = function(path, options) {
|
||||||
|
var basePath = config.target;
|
||||||
|
return when.promise(function(resolve,reject) {
|
||||||
|
options.headers = options.headers||{};
|
||||||
|
options.headers['Accept'] = 'application/json';
|
||||||
|
if (options.method == 'PUT' || options.method == "POST") {
|
||||||
|
options.headers['content-type'] = 'application/json';
|
||||||
|
}
|
||||||
|
options.url = basePath+path;
|
||||||
|
request(options, function(error,response,body) {
|
||||||
|
if (!error && response.statusCode == 200) {
|
||||||
|
resolve(JSON.parse(body));
|
||||||
|
} else if (error) {
|
||||||
|
reject(error.toString());
|
||||||
|
} else {
|
||||||
|
reject(response.statusCode+": "+body)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
151
red/cli/nr-cli.js
Executable file
151
red/cli/nr-cli.js
Executable file
@ -0,0 +1,151 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
;(function() {
|
||||||
|
/**
|
||||||
|
* Copyright 2014 IBM Corp.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
**/
|
||||||
|
|
||||||
|
var util = require("util");
|
||||||
|
var request = require("request");
|
||||||
|
var colors = require('colors');
|
||||||
|
var apiRequest = require("./lib/request");
|
||||||
|
var config = require("./lib/config");
|
||||||
|
|
||||||
|
var commands = {
|
||||||
|
"target": function() {
|
||||||
|
var target = process.argv[3];
|
||||||
|
if (target) {
|
||||||
|
if (!/^https?:\/\/.+/.test(target)) {
|
||||||
|
console.warn("Invalid target url");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (target.slice(-1) == "/") {
|
||||||
|
target = target.slice(0,target.length-1);
|
||||||
|
}
|
||||||
|
var oldTarget = config.target;
|
||||||
|
config.target = target;
|
||||||
|
} else {
|
||||||
|
console.log("Target: ".yellow+config.target);
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
"nodes": function() {
|
||||||
|
apiRequest('/nodes',{}).then(logNodeList).otherwise(logFailure);
|
||||||
|
},
|
||||||
|
"node": function() {
|
||||||
|
apiRequest('/nodes/'+process.argv[3],{}).then(logNodeList).otherwise(logFailure);
|
||||||
|
},
|
||||||
|
"enable-node": function() {
|
||||||
|
apiRequest('/nodes/'+process.argv[3],{
|
||||||
|
method: "PUT",
|
||||||
|
body: JSON.stringify({enabled:true})
|
||||||
|
}).then(logNodeList).otherwise(logFailure);
|
||||||
|
},
|
||||||
|
"disable-node": function() {
|
||||||
|
apiRequest('/nodes/'+process.argv[3],{
|
||||||
|
method: "PUT",
|
||||||
|
body: JSON.stringify({enabled:false})
|
||||||
|
}).then(logNodeList).otherwise(logFailure);
|
||||||
|
},
|
||||||
|
"install": function() {
|
||||||
|
apiRequest('/nodes',{
|
||||||
|
method: "POST",
|
||||||
|
body: JSON.stringify({module:process.argv[3]})
|
||||||
|
}).then(logNodeList).otherwise(logFailure);
|
||||||
|
},
|
||||||
|
"remove": function() {
|
||||||
|
apiRequest('/nodes/'+process.argv[3],{
|
||||||
|
method: "DELETE"
|
||||||
|
}).then(logNodeList).otherwise(logFailure);
|
||||||
|
},
|
||||||
|
"search": function() {
|
||||||
|
var options = {
|
||||||
|
method: "GET",
|
||||||
|
url: 'https://registry.npmjs.org/-/_view/byKeyword?startkey=["node-red"]&endkey=["node-red",{}]&group_level=3' ,
|
||||||
|
headers: {
|
||||||
|
'Accept': 'application/json',
|
||||||
|
}
|
||||||
|
};
|
||||||
|
request(options, function (error, response, body) {
|
||||||
|
if (!error && response.statusCode == 200) {
|
||||||
|
var info = (JSON.parse(body)).rows;
|
||||||
|
var filter = null;
|
||||||
|
if (process.argv[3]) {
|
||||||
|
filter = new RegExp(process.argv[3]);
|
||||||
|
}
|
||||||
|
for (var i=0;i<info.length;i++) {
|
||||||
|
var n = info[i];
|
||||||
|
if (!filter || filter.test(n.key[1]) || filter.test(n.key[2])) {
|
||||||
|
console.log(n.key[1] + (" - "+ n.key[2]).grey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (error) {
|
||||||
|
console.log(error.toString().red);
|
||||||
|
} else {
|
||||||
|
console.log((response.statusCode+": "+body).red);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function logNodeList(nodes) {
|
||||||
|
if (!util.isArray(nodes)) {
|
||||||
|
nodes = [nodes];
|
||||||
|
}
|
||||||
|
for (var i=0;i<nodes.length;i++) {
|
||||||
|
var n = nodes[i];
|
||||||
|
console.log(formatNodeInfo(n))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function logFailure(msg) {
|
||||||
|
console.log(msg.red);
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatBoolean(v,c) {
|
||||||
|
if (v) {
|
||||||
|
return ("["+c+"]");
|
||||||
|
} else {
|
||||||
|
return ("[ ]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatNodeInfo(n) {
|
||||||
|
var inError = n.hasOwnProperty("err");
|
||||||
|
|
||||||
|
var str = formatBoolean(n.enabled,"X")+formatBoolean(n.loaded,"L")+" ";
|
||||||
|
str += n.id;
|
||||||
|
if (n.enabled && n.loaded) {
|
||||||
|
str = str.green;
|
||||||
|
} else if (n.enabled && n.err) {
|
||||||
|
str = str.red;
|
||||||
|
} else {
|
||||||
|
str = str.yellow;
|
||||||
|
}
|
||||||
|
if (n.module) {
|
||||||
|
str += " ["+n.module+"]";
|
||||||
|
}
|
||||||
|
str += " "+n.types.join(", ");
|
||||||
|
if (n.err) {
|
||||||
|
str+=" "+n.err.red;
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (commands[process.argv[2]]) {
|
||||||
|
commands[process.argv[2]].call();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
})();
|
15
test/red/cli/lib/config_spec.js
Normal file
15
test/red/cli/lib/config_spec.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2014 IBM Corp.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
**/
|
15
test/red/cli/lib/request_spec.js
Normal file
15
test/red/cli/lib/request_spec.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2014 IBM Corp.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
**/
|
15
test/red/cli/nr-cli_spec.js
Normal file
15
test/red/cli/nr-cli_spec.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2014 IBM Corp.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
**/
|
Loading…
Reference in New Issue
Block a user