mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00: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:
		| @@ -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. | ||||
|  **/ | ||||
		Reference in New Issue
	
	Block a user