Skip to content

Commit ee12f09

Browse files
committed
add cli support
1 parent 141a094 commit ee12f09

17 files changed

Lines changed: 397 additions & 166 deletions

File tree

OpenFlow/src/LoginProvider.ts

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export class samlauthstrategyoptions {
7171
public verify: any;
7272
}
7373
export class LoginProvider {
74-
private static _logger: winston.Logger;
74+
public static _logger: winston.Logger;
7575
public static _providers: any = {};
7676
public static login_providers: Provider[] = [];
7777

@@ -132,7 +132,7 @@ export class LoginProvider {
132132
return result;
133133
}
134134
static async configure(logger: winston.Logger, app: express.Express, baseurl: string): Promise<void> {
135-
this._logger = logger;
135+
LoginProvider._logger = logger;
136136
app.use(cookieSession({
137137
name: "session",
138138
keys: ["key1", "key2"]
@@ -467,7 +467,7 @@ export class LoginProvider {
467467
strategy = new GoogleStrategy.Strategy(options, options.verify);
468468
passport.use(key, strategy);
469469
strategy.name = key;
470-
this._logger.info(options.callbackURL);
470+
LoginProvider._logger.info(options.callbackURL);
471471
app.use("/" + key,
472472
bodyParser.urlencoded({ extended: false }),
473473
passport.authenticate(key, { failureRedirect: "/" + key, failureFlash: true }),
@@ -497,7 +497,7 @@ export class LoginProvider {
497497
strategy = new SAMLStrategy.Strategy(options, options.verify);
498498
passport.use(key, strategy);
499499
strategy.name = key;
500-
this._logger.info(options.callbackUrl);
500+
LoginProvider._logger.info(options.callbackUrl);
501501

502502
// app.get("/" + key + "/FederationMetadata/2007-06/FederationMetadata.xml",
503503
// wsfed.metadata({
@@ -639,23 +639,44 @@ export class LoginProvider {
639639
app.use("/local",
640640
bodyParser.urlencoded({ extended: false }),
641641
function (req: any, res: any, next: any): void {
642+
LoginProvider._logger.debug("passport.authenticate local");
642643
passport.authenticate("local", function (err, user, info) {
643644
var originalUrl: any = req.cookies.originalUrl;
645+
LoginProvider._logger.debug("originalUrl: " + originalUrl);
646+
if (err) {
647+
LoginProvider._logger.error(err);
648+
}
644649
if (!err && user) {
650+
LoginProvider._logger.info(user);
645651
req.logIn(user, function (err: any) {
646-
if (err) { }
652+
if (err) {
653+
LoginProvider._logger.info("req.logIn failed");
654+
LoginProvider._logger.error(err);
655+
return next(err);
656+
}
657+
LoginProvider._logger.info("req.logIn success");
647658
// if (err) { return next(err); }
648659
if (!Util.IsNullEmpty(originalUrl)) {
649660
try {
650661
res.cookie("originalUrl", "", { expires: new Date(0) });
651662
LoginProvider.redirect(res, originalUrl);
663+
LoginProvider._logger.debug("redirect: " + originalUrl);
664+
return;
652665
} catch (error) {
653666
console.error(error);
654667
}
655668
} else {
669+
LoginProvider._logger.debug("redirect: to /");
656670
res.redirect("/");
671+
return next();
672+
// var url = Config.protocol + "://" + Config.domain + ":" + Config.port;
673+
// LoginProvider._logger.debug("redirect.url: " + url);
674+
// LoginProvider.redirect(res, url);
675+
// return;
676+
657677
}
658678
});
679+
return;
659680
}
660681
if (!Util.IsNullEmpty(originalUrl)) {
661682
if (originalUrl.indexOf("?") == -1) {
@@ -664,14 +685,18 @@ export class LoginProvider {
664685
originalUrl = originalUrl + "&error=1"
665686
}
666687
try {
688+
LoginProvider._logger.debug("remove originalUrl");
667689
res.cookie("originalUrl", "", { expires: new Date(0) });
690+
LoginProvider._logger.debug("redirect: " + originalUrl);
668691
LoginProvider.redirect(res, originalUrl);
669692
} catch (error) {
670693
console.error(error);
671694
}
672695
} else {
673696
try {
697+
LoginProvider._logger.debug("redirect: to /");
674698
res.redirect("/");
699+
return next();
675700
} catch (error) {
676701
console.error(error);
677702
}
@@ -685,7 +710,7 @@ export class LoginProvider {
685710
static async samlverify(profile: any, done: IVerifyFunction): Promise<void> {
686711
var username: string = (profile.nameID || profile.username);
687712
if (username !== null && username != undefined) { username = username.toLowerCase(); }
688-
this._logger.debug("verify: " + username);
713+
LoginProvider._logger.debug("verify: " + username);
689714
var _user: User = await User.FindByUsernameOrFederationid(username);
690715

691716
if (Util.IsNullUndefinded(_user)) {
@@ -749,7 +774,7 @@ export class LoginProvider {
749774
}
750775
var username: string = (profile.username || profile.id);
751776
if (username !== null && username != undefined) { username = username.toLowerCase(); }
752-
this._logger.debug("verify: " + username);
777+
LoginProvider._logger.debug("verify: " + username);
753778
var _user: User = await User.FindByUsernameOrFederationid(username);
754779
if (Util.IsNullUndefinded(_user)) {
755780
var createUser: boolean = Config.auto_create_users;

OpenFlow/src/cli.ts

Lines changed: 50 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,23 @@ import * as fs from "fs";
55
import { WebSocketClient } from "./nodeclient/WebSocketClient";
66
import { SigninMessage, Message } from "./nodeclient/Message";
77
import { Config } from "./Config";
8-
import { logger, StopService, StartService, loadenv, copyenv, envfilename, servicename, isOpenFlow } from "./nodeclient/cliutil";
8+
import { logger, StopService, StartService, RemoveService, InstallService, RunService, loadenv, envfilename, envfilepathname, servicename, isOpenFlow } from "./nodeclient/cliutil";
99

1010
const optionDefinitions = [
1111
{ name: 'verbose', alias: 'v', type: Boolean },
12-
{ name: 'config', alias: 'c', type: Boolean },
12+
{ name: 'authenticate', alias: 'a', type: Boolean },
13+
{ name: 'init', type: Boolean },
1314
{ name: 'install', alias: 'i', type: Boolean },
1415
{ name: 'uninstall', alias: 'u', type: Boolean },
1516
{ name: 'start', type: Boolean },
1617
{ name: 'stop', type: Boolean },
1718
{ name: 'run', type: Boolean },
18-
{ name: 'name', type: String, defaultOption: true }
19+
{ name: 'name', type: String, defaultOption: true },
20+
{ name: 'config', type: String },
21+
{ name: 'inspect', type: String }
1922
]
2023
const commandLineArgs = require('command-line-args');
21-
const service = require("os-service");
24+
2225
const path = require('path');
2326
const readlineSync = require('readline-sync');
2427
const envfile = require('envfile')
@@ -28,9 +31,14 @@ const envfile = require('envfile')
2831
var options = null;
2932
try {
3033
options = commandLineArgs(optionDefinitions);
31-
if (options.name == null || options.name == "") throw new Error("Name is mandatory");
32-
(servicename as any) = options.name;
33-
(envfilename as any) = options.name + ".env";
34+
if (!options.init) {
35+
if (options.name == null || options.name == "") throw new Error("Name is mandatory");
36+
if (options.name.endsWith(".env")) options.name = options.name.substring(0, options.name.length - 4);
37+
(servicename as any) = options.name;
38+
(envfilename as any) = options.name + ".env";
39+
(envfilepathname as any) = path.join(process.cwd(), envfilename);
40+
if (options.config != null && options.config != "") (envfilepathname as any) = options.config;
41+
}
3442
} catch (error) {
3543
logger.info(error.message);
3644
printusage();
@@ -71,46 +79,50 @@ function getToken(): Promise<string> {
7179

7280

7381
async function doit() {
74-
if (options.config == true) {
75-
StopService(servicename);
76-
service.remove(servicename, function (error) {
77-
});
82+
if (options.init) {
83+
var files = fs.readdirSync(path.join(__dirname, ".."))
84+
for (var i = 0; i < files.length; i++) {
85+
var filename = files[i];
86+
if (path.extname(filename) == '.env') {
87+
var target = path.join(process.cwd(), filename);
88+
if (!fs.existsSync(target)) {
89+
console.log("Creating " + filename);
90+
filename = path.join(__dirname, "..", filename);
91+
fs.copyFileSync(filename, target);
92+
93+
let parsedFile = envfile.parse(fs.readFileSync(target));
94+
parsedFile.logpath = process.cwd();
95+
fs.writeFileSync(target, envfile.stringify(parsedFile));
7896

97+
} else {
98+
console.log("Skipping " + filename + " already exists.");
99+
}
100+
}
101+
}
102+
} else if (options.authenticate == true) {
103+
StopService(servicename);
104+
RemoveService(servicename);
79105
try {
80-
var dir = __dirname.toLowerCase();
81-
logger.error(__dirname);
82-
// Request a token, to add into the config
83106
logger.info("isOpenFlow: " + isOpenFlow());
84107
if (!isOpenFlow()) {
85-
copyenv();
108+
loadenv();
86109
let jwt = await getToken();
87-
logger.info("Received token, update " + envfilename + " file");
88-
let localenv = path.join(process.cwd(), envfilename);
89-
let parsedFile = envfile.parse(fs.readFileSync(localenv));
110+
let parsedFile = envfile.parse(fs.readFileSync(envfilepathname));
90111
parsedFile.jwt = jwt;
91-
fs.writeFileSync(localenv, envfile.stringify(parsedFile));
112+
fs.writeFileSync(envfilepathname, envfile.stringify(parsedFile));
92113
}
93-
copyenv();
94-
logger.info("Install service " + servicename);
95-
service.add(servicename, { programArgs: ["--run", options.name] }, function (error) {
96-
if (error) logger.info(error.message);
97-
StartService(servicename);
98-
});
114+
loadenv();
115+
InstallService(servicename, envfilepathname);
99116
logger.info("Quit");
100117
} catch (error) {
101118
logger.error(error);
102119
}
103120
} else if (options.install == true) {
104121
loadenv();
105-
service.add(servicename, { programArgs: ["--run", options.name] }, function (error) {
106-
if (error) logger.info(error.message);
107-
StartService(servicename);
108-
});
122+
InstallService(servicename, envfilepathname);
109123
} else if (options.uninstall == true) {
110124
StopService(servicename);
111-
service.remove(servicename, function (error) {
112-
if (error) logger.info(error.message);
113-
});
125+
RemoveService(servicename);
114126
} else if (options.start == true) {
115127
loadenv();
116128
StartService(servicename);
@@ -119,16 +131,12 @@ async function doit() {
119131
} else if (options.run == true) {
120132
loadenv();
121133
logger.info("Starting as service " + servicename);
122-
service.run(function () {
123-
logger.info("Service" + servicename + " stopping");
124-
service.stop(0);
125-
});
126-
logger.info("Run " + servicename);
134+
RunService(null);
127135
var index = index = path.join(__dirname, "/index.js");
128136
if (!fs.existsSync(index)) {
129137
index = path.join(__dirname, "dist", "/index.js");
130138
}
131-
logger.info("run: " + index)
139+
logger.info("run: " + index);
132140
require(index);
133141
} else {
134142
printusage();
@@ -139,7 +147,8 @@ async function doit() {
139147

140148
function printusage() {
141149
if (!isOpenFlow()) {
142-
console.log("openflow-nodered-cli [--install][--uninstall][--config][--start][--stop] name");
150+
console.log("openflow-nodered-cli [--init][--install][--uninstall][--config][--start][--stop] name");
151+
console.log(" --init - Create sample environment files for running nodered");
143152
console.log(" --install - Install openflow as an service that runs at boot");
144153
console.log(" --uninstall - Uninstalls service, if openflow has been installed as an service");
145154
console.log(" --config - Prompt for credentials and create config");
@@ -150,7 +159,8 @@ function printusage() {
150159
console.log("source directory");
151160
return;
152161
}
153-
console.log("openflow-cli [--install][--uninstall][--start][--stop] name");
162+
console.log("openflow-cli [--init][--install][--uninstall][--start][--stop] name");
163+
console.log(" --init - Create a sample environment file for running openflow");
154164
console.log(" --install - Install openflow as an service that runs at boot");
155165
console.log(" --uninstall - Uninstalls service, if openflow has been installed as an service");
156166
console.log(" --start - Will start the service with the given name");

OpenFlow/src/nodeclient/cliutil.ts

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ const cp = require('child_process');
66
const path = require('path');
77
const envfile = require('envfile')
88
export var envfilename = ".env";
9+
export var envfilepathname = "";
910
export var servicename = "openflow-nodered";
11+
const service = require("os-service");
1012

1113
export function isWin() {
1214
return process.platform === "win32";
@@ -48,6 +50,29 @@ export function StopService(servicename: string) {
4850
logger.info(error.message);
4951
}
5052
}
53+
export function RemoveService(servicename: string) {
54+
StopService(servicename);
55+
logger.info("Uninstalling service" + servicename);
56+
service.remove(servicename, function (error) {
57+
if (error) { logger.info(error.message); return }
58+
logger.info("Service" + servicename + " uninstalled");
59+
});
60+
}
61+
export function InstallService(servicename: string, configfile: string) {
62+
logger.info("Installing service" + servicename);
63+
service.add(servicename, { programArgs: [servicename, "--run", "--config", configfile] }, function (error) {
64+
if (error) { logger.info(error.message); return }
65+
logger.info("Service" + servicename + " installed");
66+
StartService(servicename);
67+
});
68+
}
69+
export function RunService(callback: any) {
70+
service.run(function () {
71+
logger.info("Service" + servicename + " stopping");
72+
if (callback != null) callback();
73+
service.stop(0);
74+
});
75+
}
5176
// use and copy current env file, unless we have a /config folder in root
5277
export function getlocaldir(): string {
5378
var local = __dirname;
@@ -83,30 +108,27 @@ export function hassourceenv(): boolean {
83108
return fs.existsSync(sourceenv);
84109
}
85110

86-
export function copyenv() {
87-
var source = getsourcedir();
88-
var local = getlocaldir();
111+
// export function copyenv() {
112+
// var source = getsourcedir();
113+
// var local = getlocaldir();
89114

90115

91-
var localenv = path.join(local, envfilename);
92-
var sourceenv = path.join(source, envfilename);
93-
if (localenv != sourceenv && fs.existsSync(localenv)) {
94-
logger.info("localenv : " + localenv);
95-
logger.info("sourceenv: " + sourceenv);
96-
logger.info("copy local " + envfilename + " file to " + source);
97-
fs.copyFileSync(localenv, sourceenv);
98-
}
99-
loadenv();
100-
}
116+
// var localenv = path.join(local, envfilename);
117+
// var sourceenv = path.join(source, envfilename);
118+
// if (localenv != sourceenv && fs.existsSync(localenv)) {
119+
// logger.info("localenv : " + localenv);
120+
// logger.info("sourceenv: " + sourceenv);
121+
// logger.info("copy local " + envfilename + " file to " + source);
122+
// fs.copyFileSync(localenv, sourceenv);
123+
// }
124+
// loadenv();
125+
// }
101126
export function loadenv() {
102-
var source = getsourcedir();
103-
var sourceenv = path.join(source, envfilename);
104-
let parsedFile = envfile.parse(fs.readFileSync(sourceenv));
105-
logger.info("Loading config " + sourceenv);
127+
logger.info("NodeJS version " + process.version + " Config " + envfilepathname);
128+
let parsedFile = envfile.parse(fs.readFileSync(envfilepathname));
106129
for (const k in parsedFile) {
107130
process.env[k] = parsedFile[k];
108131
// logger.verbose(k + " = " + parsedFile[k]);
109132
}
110-
logger.info("version: " + process.version);
111133
Config.reload();
112134
}

0 commit comments

Comments
 (0)