mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Change default data dir
Changes the default location for user data to $HOME/.node-red.
This commit is contained in:
@@ -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<files.length;i++) {
|
||||
var fn = files[i];
|
||||
if (!registry.getNodeModuleInfo(fn)) {
|
||||
if (!moduleName || fn == moduleName) {
|
||||
var pkgfn = path.join(dir,fn,"package.json");
|
||||
try {
|
||||
var pkg = require(pkgfn);
|
||||
if (pkg['node-red']) {
|
||||
var moduleDir = path.join(dir,fn);
|
||||
results.push({dir:moduleDir,package:pkg});
|
||||
}
|
||||
} catch(err) {
|
||||
if (err.code != "MODULE_NOT_FOUND") {
|
||||
// TODO: handle unexpected error
|
||||
}
|
||||
}
|
||||
if (fn == moduleName) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch(err) {
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scans the node_modules path for nodes
|
||||
* @param moduleName the name of the module to be found
|
||||
@@ -512,36 +543,19 @@ function getNodeFiles(dir) {
|
||||
function scanTreeForNodesModules(moduleName) {
|
||||
var dir = __dirname+"/../../nodes";
|
||||
var results = [];
|
||||
var userDir;
|
||||
|
||||
if (settings.userDir) {
|
||||
userDir = path.join(settings.userDir,"node_modules");
|
||||
results = results.concat(scanDirForNodesModules(userDir,moduleName));
|
||||
}
|
||||
|
||||
var up = path.resolve(path.join(dir,".."));
|
||||
while (up !== dir) {
|
||||
var pm = path.join(dir,"node_modules");
|
||||
try {
|
||||
var files = fs.readdirSync(pm);
|
||||
for (var i=0;i<files.length;i++) {
|
||||
var fn = files[i];
|
||||
if (!registry.getNodeModuleInfo(fn)) {
|
||||
if (!moduleName || fn == moduleName) {
|
||||
var pkgfn = path.join(pm,fn,"package.json");
|
||||
try {
|
||||
var pkg = require(pkgfn);
|
||||
if (pkg['node-red']) {
|
||||
var moduleDir = path.join(pm,fn);
|
||||
results.push({dir:moduleDir,package:pkg});
|
||||
}
|
||||
} catch(err) {
|
||||
if (err.code != "MODULE_NOT_FOUND") {
|
||||
// TODO: handle unexpected error
|
||||
}
|
||||
}
|
||||
if (fn == moduleName) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch(err) {
|
||||
if (pm != userDir) {
|
||||
results = results.concat(scanDirForNodesModules(pm,moduleName));
|
||||
}
|
||||
|
||||
dir = up;
|
||||
up = path.resolve(path.join(dir,".."));
|
||||
}
|
||||
@@ -661,14 +675,19 @@ function load(defaultNodesDir,disableNodePathScan) {
|
||||
return when.promise(function(resolve,reject) {
|
||||
// Find all of the nodes to load
|
||||
var nodeFiles;
|
||||
var dir;
|
||||
if(defaultNodesDir) {
|
||||
nodeFiles = getNodeFiles(path.resolve(defaultNodesDir));
|
||||
} else {
|
||||
nodeFiles = getNodeFiles(__dirname+"/../../nodes");
|
||||
}
|
||||
|
||||
if (settings.userDir) {
|
||||
dir = path.join(settings.userDir,"nodes");
|
||||
nodeFiles = nodeFiles.concat(getNodeFiles(dir));
|
||||
}
|
||||
if (settings.nodesDir) {
|
||||
var dir = settings.nodesDir;
|
||||
dir = settings.nodesDir;
|
||||
if (typeof settings.nodesDir == "string") {
|
||||
dir = [dir];
|
||||
}
|
||||
|
@@ -17,6 +17,8 @@
|
||||
var express = require('express');
|
||||
var when = require('when');
|
||||
var child_process = require('child_process');
|
||||
var path = require("path");
|
||||
var fs = require("fs");
|
||||
|
||||
var redNodes = require("./nodes");
|
||||
var comms = require("./comms");
|
||||
@@ -129,7 +131,7 @@ function reportAddedModules(info) {
|
||||
(info[i].module?info[i].module+":":"")+
|
||||
info[i].types[j]+
|
||||
(info[i].err?" : "+info[i].err:"")
|
||||
);
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -141,7 +143,7 @@ function reportRemovedModules(removedNodes) {
|
||||
log.info("Removed node types:");
|
||||
for (var j=0;j<removedNodes.length;j++) {
|
||||
for (var i=0;i<removedNodes[j].types.length;i++) {
|
||||
log.info(" - "+(removedNodes[i].module?removedNodes[i].module+":":"")+removedNodes[j].types[i]);
|
||||
log.info(" - "+(removedNodes[j].module?removedNodes[j].module+":":"")+removedNodes[j].types[i]);
|
||||
}
|
||||
}
|
||||
return removedNodes;
|
||||
@@ -155,26 +157,32 @@ function installModule(module) {
|
||||
return;
|
||||
}
|
||||
log.info("Installing module: "+module);
|
||||
var child = child_process.exec('npm install --production '+module, function(err, stdin, stdout) {
|
||||
if (err) {
|
||||
var lookFor404 = new RegExp(" 404 .*"+module+"$","m");
|
||||
if (lookFor404.test(stdout)) {
|
||||
log.warn("Installation of module "+module+" failed: module not found");
|
||||
var e = new Error();
|
||||
e.code = 404;
|
||||
reject(e);
|
||||
var installDir = settings.userDir || process.env.NODE_RED_HOME || ".";
|
||||
var child = child_process.exec('npm install --production '+module,
|
||||
{
|
||||
cwd: installDir
|
||||
},
|
||||
function(err, stdin, stdout) {
|
||||
if (err) {
|
||||
var lookFor404 = new RegExp(" 404 .*"+module+"$","m");
|
||||
if (lookFor404.test(stdout)) {
|
||||
log.warn("Installation of module "+module+" failed: module not found");
|
||||
var e = new Error();
|
||||
e.code = 404;
|
||||
reject(e);
|
||||
} else {
|
||||
log.warn("Installation of module "+module+" failed:");
|
||||
log.warn("------------------------------------------");
|
||||
log.warn(err.toString());
|
||||
log.warn("------------------------------------------");
|
||||
reject(new Error("Install failed"));
|
||||
}
|
||||
} else {
|
||||
log.warn("Installation of module "+module+" failed:");
|
||||
log.warn("------------------------------------------");
|
||||
log.warn(err.toString());
|
||||
log.warn("------------------------------------------");
|
||||
reject(new Error("Install failed"));
|
||||
log.info("Installed module: "+module);
|
||||
resolve(redNodes.addModule(module).then(reportAddedModules));
|
||||
}
|
||||
} else {
|
||||
log.info("Installed module: "+module);
|
||||
resolve(redNodes.addModule(module).then(reportAddedModules));
|
||||
}
|
||||
});
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -184,40 +192,51 @@ function uninstallModule(module) {
|
||||
reject(new Error("Invalid module name"));
|
||||
return;
|
||||
}
|
||||
var installDir = settings.userDir || process.env.NODE_RED_HOME || ".";
|
||||
var moduleDir = path.join(installDir,"node_modules",module);
|
||||
if (!fs.existsSync(moduleDir)) {
|
||||
return reject(new Error("Unabled to uninstall "+module+"."));
|
||||
}
|
||||
|
||||
var list = redNodes.removeModule(module);
|
||||
log.info("Removing module: "+module);
|
||||
var child = child_process.exec('npm remove '+module, function(err, stdin, stdout) {
|
||||
if (err) {
|
||||
log.warn("Removal of module "+module+" failed:");
|
||||
log.warn("------------------------------------------");
|
||||
log.warn(err.toString());
|
||||
log.warn("------------------------------------------");
|
||||
reject(new Error("Removal failed"));
|
||||
} else {
|
||||
log.info("Removed module: "+module);
|
||||
reportRemovedModules(list);
|
||||
resolve(list);
|
||||
var child = child_process.exec('npm remove '+module,
|
||||
{
|
||||
cwd: installDir
|
||||
},
|
||||
function(err, stdin, stdout) {
|
||||
if (err) {
|
||||
log.warn("Removal of module "+module+" failed:");
|
||||
log.warn("------------------------------------------");
|
||||
log.warn(err.toString());
|
||||
log.warn("------------------------------------------");
|
||||
reject(new Error("Removal failed"));
|
||||
} else {
|
||||
log.info("Removed module: "+module);
|
||||
reportRemovedModules(list);
|
||||
resolve(list);
|
||||
}
|
||||
}
|
||||
});
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function reportMetrics() {
|
||||
var memUsage = process.memoryUsage();
|
||||
|
||||
|
||||
// only need to init these once per report
|
||||
var metrics = {};
|
||||
metrics.level = log.METRIC;
|
||||
|
||||
|
||||
//report it
|
||||
metrics.event = "runtime.memory.rss"
|
||||
metrics.value = memUsage.rss;
|
||||
log.log(metrics);
|
||||
|
||||
|
||||
metrics.event = "runtime.memory.heapTotal"
|
||||
metrics.value = memUsage.heapTotal;
|
||||
log.log(metrics);
|
||||
|
||||
|
||||
metrics.event = "runtime.memory.heapUsed"
|
||||
metrics.value = memUsage.heapUsed;
|
||||
log.log(metrics);
|
||||
|
@@ -25,13 +25,12 @@ var storage = null;
|
||||
var persistentSettings = {
|
||||
init: function(settings) {
|
||||
userSettings = settings;
|
||||
|
||||
for (var i in settings) {
|
||||
if (settings.hasOwnProperty(i)) {
|
||||
(function() {
|
||||
var j = i;
|
||||
persistentSettings.__defineGetter__(j,function() { return userSettings[j]; });
|
||||
persistentSettings.__defineSetter__(j,function() { throw new Error("Property '"+i+"' is read-only"); });
|
||||
persistentSettings.__defineSetter__(j,function() { throw new Error("Property '"+j+"' is read-only"); });
|
||||
})();
|
||||
}
|
||||
}
|
||||
|
@@ -32,7 +32,6 @@ var flowsFileBackup;
|
||||
var credentialsFile;
|
||||
var credentialsFileBackup;
|
||||
var oldCredentialsFile;
|
||||
var userDir;
|
||||
var libDir;
|
||||
var libFlowsDir;
|
||||
var globalSettingsFile;
|
||||
@@ -145,38 +144,50 @@ function writeFile(path,content) {
|
||||
var localfilesystem = {
|
||||
init: function(_settings) {
|
||||
settings = _settings;
|
||||
userDir = settings.userDir || process.env.NODE_RED_HOME;
|
||||
|
||||
|
||||
var promises = [];
|
||||
|
||||
if (!settings.userDir) {
|
||||
if (fs.existsSync(fspath.join(process.env.NODE_RED_HOME,".config.json"))) {
|
||||
settings.userDir = process.env.NODE_RED_HOME;
|
||||
} else {
|
||||
settings.userDir = fspath.join(process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE,".node-red");
|
||||
promises.push(promiseDir(settings.userDir));
|
||||
}
|
||||
}
|
||||
|
||||
if (settings.flowFile) {
|
||||
flowsFile = settings.flowFile;
|
||||
flowsFullPath = flowsFile;
|
||||
} else {
|
||||
flowsFile = 'flows_'+require('os').hostname()+'.json';
|
||||
flowsFullPath = fspath.join(userDir,flowsFile);
|
||||
flowsFullPath = fspath.join(settings.userDir,flowsFile);
|
||||
}
|
||||
var ffExt = fspath.extname(flowsFullPath);
|
||||
var ffName = fspath.basename(flowsFullPath);
|
||||
var ffBase = fspath.basename(flowsFullPath,ffExt);
|
||||
var ffDir = fspath.dirname(flowsFullPath);
|
||||
|
||||
credentialsFile = fspath.join(userDir,ffBase+"_cred"+ffExt);
|
||||
credentialsFileBackup = fspath.join(userDir,"."+ffBase+"_cred"+ffExt+".backup");
|
||||
credentialsFile = fspath.join(settings.userDir,ffBase+"_cred"+ffExt);
|
||||
credentialsFileBackup = fspath.join(settings.userDir,"."+ffBase+"_cred"+ffExt+".backup");
|
||||
|
||||
oldCredentialsFile = fspath.join(userDir,"credentials.json");
|
||||
oldCredentialsFile = fspath.join(settings.userDir,"credentials.json");
|
||||
|
||||
flowsFileBackup = fspath.join(ffDir,"."+ffName+".backup");
|
||||
|
||||
libDir = fspath.join(userDir,"lib");
|
||||
libDir = fspath.join(settings.userDir,"lib");
|
||||
libFlowsDir = fspath.join(libDir,"flows");
|
||||
|
||||
|
||||
globalSettingsFile = fspath.join(userDir,".config.json");
|
||||
globalSettingsFile = fspath.join(settings.userDir,".config.json");
|
||||
|
||||
return promiseDir(libFlowsDir);
|
||||
promises.push(promiseDir(libFlowsDir));
|
||||
|
||||
return when.all(promises);
|
||||
},
|
||||
|
||||
getFlows: function() {
|
||||
var defer = when.defer();
|
||||
log.info("User Directory : "+settings.userDir);
|
||||
fs.exists(flowsFullPath, function(exists) {
|
||||
if (exists) {
|
||||
log.info("Loading flows : "+flowsFile);
|
||||
@@ -184,7 +195,7 @@ var localfilesystem = {
|
||||
return JSON.parse(data);
|
||||
}));
|
||||
} else {
|
||||
log.info("Flows file not found : "+flowsFile );
|
||||
log.info("Creating new flows file : "+flowsFile );
|
||||
defer.resolve([]);
|
||||
}
|
||||
});
|
||||
|
Reference in New Issue
Block a user