00001
00002
00003
00004
00005
00006
00007 var emitter = require('events').EventEmitter;
00008 var udpd = new emitter();
00009
00010 var fs = require('fs');
00011 var path = require('path');
00012 var spawn = require('child_process').spawn;
00013 var dgram = require('dgram');
00014
00015
00016 function startJSONListener() {
00017 var server = dgram.createSocket('udp4');
00018
00019 console.log("Setting up JSON listener for UDPDump module");
00020 server.on("error", function (err) {
00021 console.log("udpdump listen server error:\n" + err.stack);
00022 server.close();
00023 });
00024
00025 server.on("message", function (msg, rinfo) {
00026 ;
00027 var thisEvent = JSON.parse(msg);
00028 console.log("Dispatcher received event:" + thisEvent.event);
00029 udpd.emit("message", { name: "udpdump", target: "events", method: "push", data: thisEvent });
00030 });
00031
00032 server.on("listening", function () {
00033 var address = server.address();
00034 console.log("server listening " +
00035 address.address + ":" + address.port);
00036 });
00037
00038 console.log("Binding Server to port " + 45555);
00039 server.bind(45555);
00040 return server;
00041 }
00042
00043 function readConfigurations(data) {
00044 var confDir = __dirname + "/../../artdaq-configuration/server/";
00045 var confFiles = fs.readdirSync(confDir);
00046
00047 var dataFiles = [];
00048
00049 for (var file in confFiles) {
00050 if (confFiles[file].search(".xml") < 0) { continue; }
00051 var fileName = confDir + confFiles[file];
00052 var res = true;
00053 var config = "" + fs.readFileSync(fileName);
00054
00055 if (!fs.existsSync(data.artdaqDir)) {
00056 var matches = config.match(/<artdaqDir>(.*?)<\/artdaqDir>/i);
00057 if (matches.length > 1 && fs.existsSync(matches[1])) {
00058 data.artdaqDir = matches[1];
00059 udpd.emit("message", { name: "udpdump", target: "artdaqDir", data: data.artdaqDir });
00060 }
00061 }
00062
00063 if (!fs.existsSync(data.artdaqDir + '/' + data.setupScript)) {
00064 matches = config.match(/<setupScript>(.*?)<\/setupScript>/i);
00065 if (matches.length > 1 && fs.existsSync(data.artdaqDir + '/' + matches[1])) {
00066 data.setupScript = matches[1];
00067 udpd.emit('message', { name: "udpdump", target: "setupScript", data: data.setupScript });
00068 }
00069 }
00070
00071 matches = config.match(/<dataDir>(.*?)<\/dataDir>/i);
00072 if (matches.length > 1) {
00073 var dataDirFiles = fs.readdirSync(matches[1]);
00074 for (var fileIdx in dataDirFiles) {
00075 if (dataDirFiles[fileIdx].search(".root") > 0) {
00076 dataFiles.push(matches[1] + '/' + dataDirFiles[fileIdx]);
00077 }
00078 }
00079 }
00080 }
00081
00082 return dataFiles;
00083 }
00084
00085 udpd.MasterInitFunction = function (workerData) {
00086 var data = {};
00087 data.events = [];
00088 data.out = "";
00089 data.err = "";
00090 data.artPID = null;
00091 data.artRunning = false;
00092 data.artdaqDir = "/opt/otsdaqpoc/artdaq";
00093 data.setupScript = "setupARTDAQOTS";
00094 data.logTime = new Date();
00095 data.logTime.setTime(0);
00096
00097 workerData["udpdump"] = data;
00098 return null;
00099 };
00100
00101 udpd.WorkerInitFunction = function (workerData) {
00102 startJSONListener();
00103 return null;
00104 }
00105
00106 udpd.RW_Start = function (POST, data) {
00107 var fileIndex = POST.fileIndex;
00108 var fileNames = readConfigurations(data);
00109 var fileName = fileNames[fileIndex];
00110 data.events = [];
00111 udpd.emit('message', { data: data.events, name: "udpdump", target: "events" });
00112
00113 var commandArray = [data.artdaqDir, data.setupScript, fileName];
00114
00115 var out = fs.openSync(__dirname + "/../client/UDPDump.out.log", 'w');
00116 var err = fs.openSync(__dirname + "/../client/UDPDump.err.log", 'w');
00117 var system = spawn(__dirname + "/runART.sh", commandArray, { detached: true, stdio: ['ignore', out, err] });
00118 data.artPID = system.pid;
00119 system.unref();
00120 data.artRunning = true;
00121 console.log("Command Spawned");
00122 udpd.emit('message', { data: data.artPID, target: "artPID", name: "udpdump" });
00123 udpd.emit('message', { data: data.artRunning, target: "artRunning", name: "udpdump" });
00124 return { out: "", err: "", running: true };
00125 }
00126
00127 function checkArt(data) {
00128 if (data.artPID !== null) {
00129 try {
00130 process.kill(data.artPID, 0);
00131 data.artRunning = true;
00132 } catch (err) {
00133 data.artRunning = false;
00134 data.artPID = null;
00135 }
00136 } else {
00137 data.artRunning = false;
00138 }
00139 udpd.emit('message', { data: data.artRunning, name: "udpdump", target: "artRunning" });
00140 udpd.emit('message', { data: data.artPID, name: "udpdump", target: "artPID" });
00141 }
00142
00143 udpd.RW_Kill = function (POST, data) {
00144 checkArt(data);
00145 if (data.artPID !== null) {
00146 process.kill(data.artPID, 15);
00147 setTimeout(function () { process.kill(data.artPID, 9); }, 1000);
00148 }
00149 }
00150
00151 udpd.RO_GetEvent = function (POST, data) {
00152 var events = data.events;
00153 if (events[0]) {
00154 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);
00155
00156 if (POST.event == 0 || POST.event < events[0].event) {
00157 var evtdata = events[0];
00158 console.log("Sending client event " + events[0].event);
00159 evtdata.lastEvent = events[events.length - 1].event;
00160 return JSON.stringify(evtdata);
00161 } else {
00162 if (events.length > events[events.length - 1].event - events[0].event + 1) {
00163 events.sort(function (a, b) { return a.event - b.event; });
00164 }
00165
00166 for (var event in events) {
00167 if (events[event].event == POST.event) {
00168 console.log("Sending client event " + events[event].event);
00169 var evtdata = events[event];
00170 evtdata.lastEvent = events[events.length - 1].event;
00171 return JSON.stringify(evtdata);
00172 }
00173 }
00174 if (POST.event < events[events.length - 1 ].event) {
00175 console.log("Returning ENOEVT");
00176 return "ENOEVT";
00177 }
00178 }
00179 }
00180
00181 return "";
00182 }
00183
00184 udpd.GET_FileNames = function (data) {
00185 var filePaths = readConfigurations(data);
00186 var fileNames = [];
00187 console.log(filePaths);
00188 for (var fpath in filePaths) {
00189 var name = path.basename(filePaths[fpath]);
00190 fileNames.push("<option value=\"" + name + "\">" + name + "</option>");
00191 }
00192 return fileNames;
00193 }
00194
00195
00196
00197 udpd.GET_Log = function (data) {
00198 checkArt(data);
00199
00200 if (new Date(data.logTime).getTime() + 800 < new Date().getTime()) {
00201 data.logTime = new Date();
00202 if (fs.existsSync(__dirname + "/../client/UDPDump.out.log")) {
00203 data.out = "" + fs.readFileSync(__dirname + "/../client/UDPDump.out.log", { encoding: 'utf8' });
00204 }
00205 if (fs.existsSync(__dirname + "/../client/UDPDump.err.log")) {
00206 data.err = "" + fs.readFileSync(__dirname + "/../client/UDPDump.err.log", { encoding: 'utf8' });
00207 }
00208 udpd.emit("message", { name: "udpdump", data: data.out, target: "out" });
00209 udpd.emit("message", { name: "udpdump", data: data.err, target: "err" });
00210 }
00211 return { out: data.out, err: data.err, running: data.artRunning };
00212 }
00213
00214 module.exports = function (module_holder) {
00215 module_holder["udpdump"] = udpd;
00216 };