From ce1cd1ab9c0246d6c1da120ae1bf813be5635109 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 25 Feb 2015 14:23:59 +0000 Subject: [PATCH] Change default data dir Changes the default location for user data to $HOME/.node-red. --- red.js | 34 +++++++++++-- red/nodes/registry.js | 73 +++++++++++++++++----------- red/server.js | 89 +++++++++++++++++++++------------- red/settings.js | 3 +- red/storage/localfilesystem.js | 35 ++++++++----- test/red/server_spec.js | 15 +++--- 6 files changed, 161 insertions(+), 88 deletions(-) mode change 100644 => 100755 red.js diff --git a/red.js b/red.js old mode 100644 new mode 100755 index b974732bc..b4358022d --- a/red.js +++ b/red.js @@ -1,5 +1,6 @@ +#!/usr/bin/env node /** - * Copyright 2013 IBM Corp. + * Copyright 2013, 2015 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,21 +21,24 @@ var express = require("express"); var crypto = require("crypto"); var nopt = require("nopt"); var path = require("path"); +var fs = require("fs"); var RED = require("./red/red.js"); var server; var app = express(); -var settingsFile = "./settings"; +var settingsFile; var flowFile; var knownOpts = { "settings":[path], + "userDir":[path], "v": Boolean, "help": Boolean }; var shortHands = { "s":["--settings"], + "u":["--userDir"], "?":["--help"] }; nopt.invalidHandler = function(k,v,t) { @@ -45,10 +49,11 @@ var parsedArgs = nopt(knownOpts,shortHands,process.argv,2) if (parsedArgs.help) { console.log("Node-RED v"+RED.version()); - console.log("Usage: node red.js [-v] [-?] [--settings settings.js] [flows.json]"); + console.log("Usage: node red.js [-v] [-?] [--settings settings.js] [--userDir DIR] [flows.json]"); console.log(""); console.log("Options:"); console.log(" -s, --settings FILE use specified settings file"); + console.log(" -u, --userDir DIR use specified user directory"); console.log(" -v enable verbose output"); console.log(" -?, --help show usage"); console.log(""); @@ -60,13 +65,27 @@ if (parsedArgs.argv.remain.length > 0) { } if (parsedArgs.settings) { + // User-specified settings file settingsFile = parsedArgs.settings; +} else if (parsedArgs.userDir && fs.existsSync(path.join(parsedArgs.userDir,"settings.js"))) { + // User-specified userDir that contains a settings.js + settingsFile = path.join(parsedArgs.userDir,"settings.js"); +} else { + var userSettingsFile = path.join(process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE,".node-red","settings.js"); + if (fs.existsSync(userSettingsFile)) { + // $HOME/.node-red/settings.js exists + settingsFile = userSettingsFile; + } else { + // Use default settings.js + settingsFile = "./settings"; + } } + try { var settings = require(settingsFile); } catch(err) { if (err.code == 'MODULE_NOT_FOUND') { - console.log("Unable to load settings file "+settingsFile); + console.log("Unable to load settings file: "+settingsFile); } else { console.log(err); } @@ -117,7 +136,12 @@ if (settings.httpNodeRoot !== false) { settings.uiPort = settings.uiPort||1880; settings.uiHost = settings.uiHost||"0.0.0.0"; -settings.flowFile = flowFile || settings.flowFile; +if (flowFile) { + settings.flowFile = flowFile; +} +if (parsedArgs.userDir) { + settings.userDir = parsedArgs.userDir; +} RED.init(server,settings); diff --git a/red/nodes/registry.js b/red/nodes/registry.js index fb547f221..ed1ec64aa 100644 --- a/red/nodes/registry.js +++ b/red/nodes/registry.js @@ -504,6 +504,37 @@ function getNodeFiles(dir) { return result; } +function scanDirForNodesModules(dir,moduleName) { + var results = []; + try { + var files = fs.readdirSync(dir); + for (var i=0;i