Skip to content

Commit 4e091d1

Browse files
committed
Skip installing modules already present
1 parent 34792ef commit 4e091d1

4 files changed

Lines changed: 66 additions & 35 deletions

File tree

OpenFlowNodeRED/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@openiap/nodered",
3-
"version": "1.1.165",
3+
"version": "1.1.166",
44
"description": "Simple wrapper around NodeRed, RabbitMQ and MongoDB to support a more scaleable NodeRed implementation.\r Also the \"backend\" for [OpenRPA](https://github.com/skadefro/OpenRPA)",
55
"main": "index.js",
66
"scripts": {
@@ -35,6 +35,7 @@
3535
"envfile": "^6.14.0",
3636
"express": "^4.17.1",
3737
"express-prom-bundle": "^6.3.1",
38+
"global-npm": "^0.4.1",
3839
"google-auth-library": "^6.1.3",
3940
"jsonwebtoken": "^8.5.1",
4041
"morgan": "^1.10.0",

OpenFlowNodeRED/src/node-red-contrib-openflow-storage.ts

Lines changed: 62 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,45 @@ export class noderedcontribopenflowstorage {
9494
}
9595
return text;
9696
}
97+
98+
99+
100+
101+
scanDirForNodesModules(dir) {
102+
let files = fs.readdirSync(dir, { encoding: 'utf8', withFileTypes: true });
103+
let results = [];
104+
files.sort();
105+
files.forEach((fn) => {
106+
var stats = fs.statSync(path.join(dir, fn.name));
107+
if (stats.isFile()) {
108+
} else if (stats.isDirectory()) {
109+
if (fn.name == "node_modules") {
110+
results = results.concat(this.scanDirForNodesModules(path.join(dir, fn.name)));
111+
} else {
112+
const pkgfn = path.join(dir, fn.name, "package.json");
113+
if (fs.existsSync(pkgfn)) {
114+
var pkg = require(pkgfn);
115+
// var moduleDir = path.join(dir, fn);
116+
// results.push({ dir: moduleDir, package: pkg });
117+
results.push(pkg);
118+
}
119+
}
120+
}
121+
});
122+
return results;
123+
}
124+
getGlobalModulesDir() {
125+
return new Promise<string>((resolve, reject) => {
126+
var npm = require("global-npm")
127+
var myConfigObject = {}
128+
npm.load(myConfigObject, function (err) {
129+
if (err) return reject(err)
130+
// const test = npm.get('prefix');
131+
// console.log(test);
132+
resolve(npm.globalPrefix);
133+
})
134+
});
135+
}
97136
DiffObjects(o1, o2) {
98137
// choose a map() impl.
99138
// you may use $.map from jQuery if you wish
@@ -521,44 +560,35 @@ export class noderedcontribopenflowstorage {
521560
if (this._settings == null) {
522561
this._settings = settings;
523562
try {
524-
525-
//if (this.firstrun) {
526563
const child_process = require("child_process");
564+
const globaldir = await this.getGlobalModulesDir();
565+
let currentmodules = this.scanDirForNodesModules(path.resolve('.'));
566+
currentmodules = currentmodules.concat(this.scanDirForNodesModules(globaldir));
567+
// currentmodules.forEach(pck => {
568+
// console.log(pck.name + "@" + pck.version);
569+
// });
527570
const keys = Object.keys(settings.nodes);
528-
let modules = "";
571+
// let modules = "";
529572
for (let i = 0; i < keys.length; i++) {
530573
const key = keys[i];
574+
if (key == "node-red" || key == "node-red-node-rbe" || key == "node-red-node-tail") continue;
531575
const val = settings.nodes[key];
532-
if (["node-red"].indexOf(key) === -1) {
533-
// if (["node-red", "node-red-node-email", "node-red-node-feedparser", "node-red-node-rbe",
534-
// "node-red-node-sentiment", "node-red-node-tail", "node-red-node-twitter"].indexOf(key) === -1) {
535-
let pname: string = val.name + "@" + val.version;
536-
if (val.pending_version) {
537-
pname = val.name + "@" + val.pending_version;
576+
const version = (val.pending_version ? val.pending_version : val.version)
577+
const pcks = currentmodules.filter(x => x.name == key && x.version == version);
578+
if (pcks.length != 1) {
579+
try {
580+
this._logger.info("Installing " + key + "@" + version);
581+
child_process.execSync("npm install " + key + "@" + version, { stdio: [0, 1, 2], cwd: this.settings.userDir });
582+
} catch (error) {
583+
this._logger.error("npm install error");
584+
if (error.status) this._logger.error("npm install status: " + error.status);
585+
if (error.message) this._logger.error("npm install message: " + error.message);
586+
if (error.stderr) this._logger.error("npm install stderr: " + error.stderr);
587+
if (error.stdout) this._logger.error("npm install stdout: " + error.stdout);
538588
}
539-
// this._logger.info("Installing " + pname);
540-
// child_process.execSync("npm install " + pname, { stdio: [0, 1, 2], cwd: this.settings.userDir });
541-
modules += (" " + pname);
542-
}
543-
}
544-
this._logger.info("Installing " + modules);
545-
let errorcounter = 0;
546-
while (errorcounter < 5) {
547-
try {
548-
child_process.execSync("npm install " + modules, { stdio: [0, 1, 2], cwd: this.settings.userDir });
549-
errorcounter = 10;
550-
} catch (error) {
551-
errorcounter++;
552-
this._logger.error("npm install error");
553-
if (error.status) this._logger.error("npm install status: " + error.status);
554-
if (error.message) this._logger.error("npm install message: " + error.message);
555-
if (error.stderr) this._logger.error("npm install stderr: " + error.stderr);
556-
if (error.stdout) this._logger.error("npm install stdout: " + error.stdout);
589+
557590
}
558591
}
559-
this.last_reload = new Date();
560-
this._logger.silly("noderedcontribopenflowstorage::_getSettings: return result");
561-
this._logger.info("Installation of NPM packages complete");
562592
} catch (error) {
563593
this._logger.error(error);
564594
settings = {};
@@ -582,7 +612,9 @@ export class noderedcontribopenflowstorage {
582612
this.firstrun = false;
583613
if (WebSocketClient.instance.supports_watch) {
584614
try {
615+
this.last_reload = new Date();
585616
await this.CheckUpdates();
617+
this.last_reload = new Date();
586618
} catch (error) {
587619
this._logger.error(error);
588620
}
@@ -659,9 +691,7 @@ export class noderedcontribopenflowstorage {
659691
update = true;
660692
}
661693
} else if (entity._type == "setting") {
662-
console.log("SETTINGs!!! 1");
663694
this._logger.info("noderedcontribopenflowstorage::onupdate setting init " + new Date().toLocaleTimeString());
664-
console.log("SETTINGs!!! 2");
665695
let oldsettings: any = null;
666696
let exitprocess: boolean = false;
667697
if (this._settings != null) {

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.1.165
1+
1.1.166

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@openiap/openflow",
3-
"version": "1.1.165",
3+
"version": "1.1.166",
44
"description": "Simple wrapper around NodeRed, RabbitMQ and MongoDB to support a more scaleable NodeRed implementation.\r Also the \"backend\" for [OpenRPA](https://github.com/skadefro/OpenRPA)",
55
"main": "index.js",
66
"scripts": {

0 commit comments

Comments
 (0)