Skip to content

Commit 886b4f1

Browse files
committed
Add nodered node, force deleting
1 parent 203859d commit 886b4f1

12 files changed

Lines changed: 196 additions & 9 deletions

File tree

OpenFlow/src/Messages/Message.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1142,7 +1142,7 @@ export class Message {
11421142
try {
11431143
if (billed != "true" && diffhours > 24) {
11441144
cli._logger.debug("[" + cli.user.username + "] Remove un billed nodered instance " + itemname + " that has been running for " + diffhours + " hours");
1145-
// await this._DeleteNoderedInstance(userid, cli.user._id, cli.user.username, rootjwt);
1145+
await this._DeleteNoderedInstance(userid, cli.user._id, cli.user.username, rootjwt);
11461146
}
11471147
// console.log(itemname + " " + diffminutes + " min / " + diffhours + " hours");
11481148
} catch (error) {

OpenFlowNodeRED/src/Message.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,24 @@ export class MapReduceMessage<T> {
291291
}
292292
}
293293

294+
295+
export class GetNoderedInstanceMessage {
296+
public error: string;
297+
public jwt: any;
298+
public name: string;
299+
public _id: string;
300+
public result: any;
301+
public results: any[];
302+
303+
static assign(o: any): GetNoderedInstanceMessage {
304+
if (typeof o === "string" || o instanceof String) {
305+
return Object.assign(new GetNoderedInstanceMessage(), JSON.parse(o.toString()));
306+
}
307+
return Object.assign(new GetNoderedInstanceMessage(), o);
308+
}
309+
}
310+
311+
294312
export class CreateWorkflowInstanceMessage {
295313
public error: string;
296314
public jwt: any;

OpenFlowNodeRED/src/nodered/nodes/NoderedUtil.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Red } from "node-red";
2-
import { QueryMessage, Message, InsertOneMessage, UpdateOneMessage, DeleteOneMessage, InsertOrUpdateOneMessage, SigninMessage, TokenUser, mapFunc, reduceFunc, finalizeFunc, MapReduceMessage, JSONfn, UpdateManyMessage, GetFileMessage, SaveFileMessage, AggregateMessage, CreateWorkflowInstanceMessage } from "../../Message";
2+
import { QueryMessage, Message, InsertOneMessage, UpdateOneMessage, DeleteOneMessage, InsertOrUpdateOneMessage, SigninMessage, TokenUser, mapFunc, reduceFunc, finalizeFunc, MapReduceMessage, JSONfn, UpdateManyMessage, GetFileMessage, SaveFileMessage, AggregateMessage, CreateWorkflowInstanceMessage, GetNoderedInstanceMessage } from "../../Message";
33
import { WebSocketClient } from "../../WebSocketClient";
44
import { Crypt } from "../../Crypt";
55
import { Config } from "../../Config";
@@ -201,6 +201,15 @@ export class NoderedUtil {
201201
return result;
202202
}
203203

204+
public static async GetNoderedInstance(_id: string, name: string, jwt: string): Promise<any[]> {
205+
var q: GetNoderedInstanceMessage = new GetNoderedInstanceMessage();
206+
q._id = _id; q.name = name; q.jwt = jwt;
207+
var _msg: Message = new Message();
208+
_msg.command = "getnoderedinstance"; _msg.data = JSON.stringify(q);
209+
var result: GetNoderedInstanceMessage = await WebSocketClient.instance.Send<GetNoderedInstanceMessage>(_msg);
210+
return result.results;
211+
}
212+
204213
public static async CreateWorkflowInstance(targetid: string, workflowid: string, correlationId: string, resultqueue: string, parentid: string, payload: any, initialrun: boolean, jwt: string): Promise<string> {
205214
var q: CreateWorkflowInstanceMessage = new CreateWorkflowInstanceMessage();
206215
q.targetid = targetid; q.workflowid = workflowid; q.resultqueue = resultqueue; q.initialrun = initialrun;

OpenFlowNodeRED/src/nodered/nodes/api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,6 @@ export = function (RED: Red) {
3030

3131
RED.httpAdmin.get("/api_roles", RED.auth.needsPermission('serial.read'), api.get_api_roles);
3232
RED.httpAdmin.get("/api_userroles", RED.auth.needsPermission('serial.read'), api.get_api_userroles);
33+
RED.httpAdmin.get("/api_users", RED.auth.needsPermission('serial.read'), api.get_api_users);
3334

3435
}

OpenFlowNodeRED/src/nodered/nodes/api_nodes.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,44 @@ export async function get_api_userroles(req, res) {
588588
}
589589
}
590590

591+
export async function get_api_users(req, res) {
592+
try {
593+
var rawAssertion = req.user.getAssertionXml();
594+
var token = await NoderedUtil.GetTokenFromSAML(rawAssertion);
595+
var q: any = { _type: "user" };
596+
var ors = [];
597+
if (!NoderedUtil.IsNullEmpty(req.query.name)) {
598+
ors.push({ name: { $regex: ".*" + req.query.name + ".*" } });
599+
} else { ors.push({}); }
600+
if (!NoderedUtil.IsNullEmpty(req.query.id)) {
601+
ors.push({ _id: req.query.id });
602+
}
603+
if (ors.length > 0) {
604+
q = {
605+
$and: [
606+
{ _type: "user" },
607+
{ $or: ors }
608+
]
609+
};
610+
}
611+
612+
var result: any[] = await NoderedUtil.Query('users', q, { name: 1 }, { name: -1 }, 100, 0, token.jwt);
613+
if (!NoderedUtil.IsNullEmpty(req.query.id)) {
614+
var exists = result.filter(x => x._id == req.query.id);
615+
if (exists.length == 0) {
616+
var result2: any[] = await NoderedUtil.Query('users', { _id: req.query.id }, { name: 1 }, { name: -1 }, 1, 0, token.jwt);
617+
if (result2.length == 1) {
618+
result.push(result2[0]);
619+
}
620+
}
621+
}
622+
623+
res.json(result);
624+
} catch (error) {
625+
res.status(500).json(error);
626+
}
627+
}
628+
591629

592630

593631

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<script type="text/x-red" data-template-name="nodered get pods">
2+
<div class="form-row">
3+
<label for="node-input-targetid-search"><i class="fa fa-tasks"></i> Search</label>
4+
<input type="text" id="node-input-targetid-search" placeholder="Search" >
5+
</div>
6+
<div class="form-row">
7+
<label for="node-input-targetid"><i class="fa fa-tasks"></i> Target</label>
8+
<select id="node-input-targetid-select">
9+
<option>Loading...</option>
10+
</select>
11+
<input id="node-input-targetid" type="hidden">
12+
</div>
13+
<div class="form-row">
14+
<label><i class="fa fa-tag"></i> Name</label>
15+
<input type="text" id="node-input-name" placeholder="Name">
16+
</div>
17+
</script>
18+
<script type="text/x-red" data-help-name="nodered get pods">
19+
<p>Grab all nodered pods for current user.</p>
20+
</script>
21+
<script type="text/javascript">
22+
RED.nodes.registerType('nodered get pods', {
23+
category: 'api',
24+
color: "#DEB887",
25+
paletteLabel: 'get',
26+
icon: "font-awesome/fa-database",
27+
defaults: {
28+
name: { value: "" },
29+
targetid: { value: "result._id" },
30+
},
31+
inputs: 1,
32+
outputs: 1,
33+
label: function () {
34+
return this.name || "get pods";
35+
},
36+
labelStyle: function () {
37+
return this.name ? "node_label_italic" : "";
38+
},
39+
oneditprepare: function () {
40+
var reloadUsers = function (firstrun) {
41+
$('#node-input-targetid-select').empty();
42+
$('#node-input-targetid-select').append($('<option>', {
43+
value: -1,
44+
text: "Loading..."
45+
}));
46+
$('#node-input-targetid-select').val(-1);
47+
$.getJSON('api_users', { name: $('#node-input-targetid-search').val() }, function (data) {
48+
$('#node-input-targetid-select').empty();
49+
$.each(data, function (i, ele) {
50+
$('#node-input-targetid-select').append($('<option>', {
51+
value: ele._id,
52+
text: ele.name
53+
}));
54+
});
55+
$('#node-input-targetid-select').val($('#node-input-targetid').val());
56+
}).error(function (jqXHR, textStatus, errorThrown) {
57+
console.log("error " + textStatus);
58+
console.log("incoming Text " + jqXHR.responseText);
59+
alert("error:" + jqXHR.responseText);
60+
});
61+
}
62+
$('#node-input-targetid-search').change(() => {
63+
reloadUsers(false);
64+
})
65+
reloadUsers(true);
66+
},
67+
oneditsave: function () {
68+
$('#node-input-targetid').val($('#node-input-targetid-select').val());
69+
}
70+
71+
});
72+
73+
</script>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Red } from "node-red";
2+
import * as nodered from "./nodered_nodes";
3+
4+
5+
// declare function fn(RED: Red): void;
6+
// export = fn;
7+
export = function (RED: Red) {
8+
RED.nodes.registerType("nodered get pods", nodered.get_pods);
9+
10+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import * as RED from "node-red";
2+
import { Red } from "node-red";
3+
import { NoderedUtil } from "./NoderedUtil";
4+
5+
6+
export interface Iget_pods {
7+
name: string;
8+
targetid: string;
9+
}
10+
export class get_pods {
11+
public node: Red = null;
12+
13+
constructor(public config: Iget_pods) {
14+
RED.nodes.createNode(this, config);
15+
this.node = this;
16+
this.node.status({});
17+
this.node.on("input", this.oninput);
18+
this.node.on("close", this.onclose);
19+
}
20+
async oninput(msg: any) {
21+
try {
22+
this.node.status({});
23+
var targetid = this.config.targetid;
24+
if (!NoderedUtil.IsNullUndefinded(msg.targetid)) { targetid = msg.targetid; }
25+
26+
this.node.status({ fill: "blue", shape: "dot", text: "Getting pods" });
27+
28+
var result = await NoderedUtil.GetNoderedInstance(msg.targetid, null, msg.jwt);
29+
msg.payload = result;
30+
this.node.send(msg);
31+
this.node.status({});
32+
} catch (error) {
33+
NoderedUtil.HandleError(this, error);
34+
}
35+
}
36+
onclose() {
37+
}
38+
}

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.0.571
1+
0.0.572

docker-compose-toolbox.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ services:
4545
- "traefik.http.routers.web.rule=Host(`toolbox.openrpa.dk`)"
4646
- "traefik.http.routers.web.entrypoints=web"
4747
- "traefik.frontend.passHostHeader=true"
48-
image: "cloudhack/openflow:0.0.568"
48+
image: "cloudhack/openflow:0.0.572"
4949
container_name: "web"
5050
environment:
5151
- update_acl_based_on_groups=true
@@ -82,7 +82,7 @@ services:
8282
- "traefik.http.routers.nodered.rule=Host(`nodered1.toolbox.openrpa.dk`)"
8383
- "traefik.http.routers.nodered.entrypoints=web"
8484
- "traefik.http.services.nodered.loadbalancer.server.port=1880"
85-
image: "cloudhack/openflownodered:0.0.568"
85+
image: "cloudhack/openflownodered:0.0.572"
8686
container_name: "nodered"
8787
environment:
8888
# - nodered_id=1

0 commit comments

Comments
 (0)