7 var emitter = require(
'events').EventEmitter;
8 var udpd =
new emitter();
10 var fs = require(
'fs');
11 var path = require(
'path');
12 var spawn = require(
'child_process').spawn;
13 var dgram = require(
'dgram');
16 function startJSONListener() {
17 var server = dgram.createSocket(
'udp4');
19 console.log(
"Setting up JSON listener for UDPDump module");
20 server.on(
"error",
function (err) {
21 console.log(
"udpdump listen server error:\n" + err.stack);
25 server.on(
"message",
function (msg, rinfo) {
27 var thisEvent = JSON.parse(msg);
28 console.log(
"Dispatcher received event:" + thisEvent.event);
29 udpd.emit(
"message", { name:
"udpdump", target:
"events", method:
"push", data: thisEvent });
32 server.on(
"listening",
function () {
33 var address = server.address();
34 console.log(
"server listening " +
35 address.address +
":" + address.port);
38 console.log(
"Binding Server to port " + 45555);
43 function readConfigurations(data) {
44 var confDir = __dirname +
"/../../artdaq-configuration/server/";
45 var confFiles = fs.readdirSync(confDir);
49 for (var file in confFiles) {
50 if (confFiles[file].search(
".xml") < 0) {
continue; }
51 var fileName = confDir + confFiles[file];
53 var config =
"" + fs.readFileSync(fileName);
55 if (!fs.existsSync(data.artdaqDir)) {
56 var matches = config.match(/<artdaqDir>(.*?)<\/artdaqDir>/i);
57 if (matches.length > 1 && fs.existsSync(matches[1])) {
58 data.artdaqDir = matches[1];
59 udpd.emit(
"message", { name:
"udpdump", target:
"artdaqDir", data: data.artdaqDir });
63 if (!fs.existsSync(data.artdaqDir +
'/' + data.setupScript)) {
64 matches = config.match(/<setupScript>(.*?)<\/setupScript>/i);
65 if (matches.length > 1 && fs.existsSync(data.artdaqDir +
'/' + matches[1])) {
66 data.setupScript = matches[1];
67 udpd.emit(
'message', { name:
"udpdump", target:
"setupScript", data: data.setupScript });
71 matches = config.match(/<dataDir>(.*?)<\/dataDir>/i);
72 if (matches.length > 1) {
73 var dataDirFiles = fs.readdirSync(matches[1]);
74 for (var fileIdx in dataDirFiles) {
75 if (dataDirFiles[fileIdx].search(
".root") > 0) {
76 dataFiles.push(matches[1] +
'/' + dataDirFiles[fileIdx]);
85 udpd.MasterInitFunction =
function (workerData) {
91 data.artRunning =
false;
92 data.artdaqDir =
"/opt/otsdaqpoc/artdaq";
93 data.setupScript =
"setupARTDAQOTS";
94 data.logTime =
new Date();
95 data.logTime.setTime(0);
97 workerData[
"udpdump"] = data;
101 udpd.WorkerInitFunction =
function (workerData) {
106 udpd.RW_Start =
function (POST, data) {
107 var fileIndex = POST.fileIndex;
108 var fileNames = readConfigurations(data);
109 var fileName = fileNames[fileIndex];
111 udpd.emit(
'message', { data: data.events, name:
"udpdump", target:
"events" });
113 var commandArray = [data.artdaqDir, data.setupScript, fileName];
115 var out = fs.openSync(__dirname +
"/../client/UDPDump.out.log",
'w');
116 var err = fs.openSync(__dirname +
"/../client/UDPDump.err.log",
'w');
117 var system = spawn(__dirname +
"/runART.sh", commandArray, { detached:
true, stdio: [
'ignore', out, err] });
118 data.artPID = system.pid;
120 data.artRunning =
true;
121 console.log(
"Command Spawned");
122 udpd.emit(
'message', { data: data.artPID, target:
"artPID", name:
"udpdump" });
123 udpd.emit(
'message', { data: data.artRunning, target:
"artRunning", name:
"udpdump" });
124 return { out:
"", err:
"", running:
true };
127 function checkArt(data) {
128 if (data.artPID !== null) {
130 process.kill(data.artPID, 0);
131 data.artRunning =
true;
133 data.artRunning =
false;
137 data.artRunning =
false;
139 udpd.emit(
'message', { data: data.artRunning, name:
"udpdump", target:
"artRunning" });
140 udpd.emit(
'message', { data: data.artPID, name:
"udpdump", target:
"artPID" });
143 udpd.RW_Kill =
function (POST, data) {
145 if (data.artPID !== null) {
146 process.kill(data.artPID, 15);
147 setTimeout(
function () { process.kill(data.artPID, 9); }, 1000);
151 udpd.RO_GetEvent =
function (POST, data) {
152 var events = data.events;
154 console.log(
"First event in buffer: " + events[0].event +
", last event in buffer: " + events[events.length - 1].event +
", Requested event: " + POST.event +
", Event Count: " + events.length);
156 if (POST.event == 0 || POST.event < events[0].event) {
157 var evtdata = events[0];
158 console.log(
"Sending client event " + events[0].event);
159 evtdata.lastEvent = events[events.length - 1].event;
160 return JSON.stringify(evtdata);
162 if (events.length > events[events.length - 1].event - events[0].event + 1) {
163 events.sort(
function (a, b) {
return a.event - b.event; });
166 for (var event in events) {
167 if (events[event].event == POST.event) {
168 console.log(
"Sending client event " + events[event].event);
169 var evtdata = events[event];
170 evtdata.lastEvent = events[events.length - 1].event;
171 return JSON.stringify(evtdata);
174 if (POST.event < events[events.length - 1 ].event) {
175 console.log(
"Returning ENOEVT");
184 udpd.GET_FileNames =
function (data) {
185 var filePaths = readConfigurations(data);
187 console.log(filePaths);
188 for (var fpath in filePaths) {
189 var name = path.basename(filePaths[fpath]);
190 fileNames.push(
"<option value=\"" + name +
"\">" + name +
"</option>");
197 udpd.GET_Log =
function (data) {
200 if (
new Date(data.logTime).getTime() + 800 <
new Date().getTime()) {
201 data.logTime =
new Date();
202 if (fs.existsSync(__dirname +
"/../client/UDPDump.out.log")) {
203 data.out =
"" + fs.readFileSync(__dirname +
"/../client/UDPDump.out.log", { encoding:
'utf8' });
205 if (fs.existsSync(__dirname +
"/../client/UDPDump.err.log")) {
206 data.err =
"" + fs.readFileSync(__dirname +
"/../client/UDPDump.err.log", { encoding:
'utf8' });
208 udpd.emit(
"message", { name:
"udpdump", data: data.out, target:
"out" });
209 udpd.emit(
"message", { name:
"udpdump", data: data.err, target:
"err" });
211 return { out: data.out, err: data.err, running: data.artRunning };
214 module.exports =
function (module_holder) {
215 module_holder[
"udpdump"] = udpd;