2 var emitter = require(
'events' ).EventEmitter;
3 var fs = require(
'fs' );
4 var ac =
new emitter( );
5 var path = require(
'path' );
6 var xml = require(
'xml2js' );
7 var parser =
new xml.Parser( { explicitArray:
false } );
8 var util = require(
'util' );
10 function generateDefaultConfig() {
12 output.expertMode =
false;
13 output.configName =
"Default";
14 output.artdaqDir =
"/path/to/artdaq-demo-base";
15 output.setupScript =
"setupARTDAQDEMO";
16 output.needsRestart =
false;
17 output.dataDir =
"/tmp";
18 output.logDir =
"/tmp";
19 output.dataLogger = {};
20 output.dataLogger.enabled =
true;
21 output.dataLogger.fileValue = 0;
22 output.dataLogger.fileMode =
"Events";
23 output.dataLogger.runValue = -1;
24 output.dataLogger.runMode =
"Events";
25 output.dataLogger.hostname =
"localhost";
26 output.dataLogger.name =
"DataLogger";
27 output.onlineMonitor = {};
28 output.onlineMonitor.enabled =
false;
29 output.onlineMonitor.viewerEnabled =
false;
30 output.onlineMonitor.hostname =
"localhost";
31 output.onlineMonitor.name =
"OnlineMonitor";
32 output.eventBuilders = {};
33 output.eventBuilders.basename =
"EVB";
34 output.eventBuilders.count = 2;
35 output.eventBuilders.compress =
false;
36 output.eventBuilders.hostnames = [
"localhost",
"localhost"];
41 function traverse( obj, parent ) {
45 for ( var key in obj ) {
47 if ( key.length == 1 && parseInt( key ) >= 0 ) {
48 keyPrint = parent.slice( 0,parent.length - 1 );
50 if ( obj.hasOwnProperty( key ) ) {
52 output +=
"<" + keyPrint +
">";
53 if ( obj[key] !== null && typeof ( obj[key] ) ===
"object" ) {
56 output +=
"\n" + traverse( obj[key], key );
62 output +=
"</" + keyPrint +
">\n";
69 function serializeXML( config,who,fileName ) {
70 console.log(
"Saving Configuration to " + fileName );
71 var xmlData =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
73 var configurationXML =
"<author>" + who +
"</author>\n";
74 configurationXML += traverse( config,
"" );
76 console.log(
"Putting Generated configuration into artdaq-configuration block");
77 xmlData +=
"<artdaq-configuration>\n" + configurationXML +
"</artdaq-configuration>";
79 console.log(
"Writing out file" );
80 fs.writeFileSync( fileName,xmlData );
81 console.log(
"Done Writing Configuration" );
85 function checkBools(
object ) {
86 for ( var key in
object ) {
87 if (
object.hasOwnProperty( key ) ) {
88 if (
object[key] ===
"true" ) {
90 }
else if (
object[key] ===
"false" ) {
92 }
else if (
object !== null && typeof (
object ) ===
"object" ) {
93 object[key] = checkBools(
object[key] );
100 function deserializeXML( fileName ) {
101 console.log(
"Reading " + fileName +
":" );
102 var xmlData = fs.readFileSync( fileName );
104 parser.parseString( xmlData,
function ( err,result ) { xmlObj = result; } );
107 output.artdaqDir = xmlObj[
'artdaq-configuration'].artdaqDir;
108 output.expertMode = xmlObj[
'artdaq-configuration'].expertMode;
109 output.configName = xmlObj[
'artdaq-configuration'].configName;
110 output.dataDir = xmlObj[
'artdaq-configuration'].dataDir;
111 output.logDir = xmlObj[
'artdaq-configuration'].logDir;
112 output.setupScript = xmlObj[
'artdaq-configuration'].setupScript;
113 output.dataLogger = xmlObj[
'artdaq-configuration'].dataLogger;
114 output.onlineMonitor = xmlObj[
'artdaq-configuration'].onlineMonitor;
115 output.eventBuilders = xmlObj[
'artdaq-configuration'].eventBuilders;
116 output.eventBuilders.hostnames = xmlObj[
'artdaq-configuration'].eventBuilders.hostnames.hostname;
117 output.boardReaders = xmlObj[
'artdaq-configuration'].boardReaders.boardReader;
119 return checkBools( output );
122 ac.MasterInitFunction =
function ( workerData ) {
123 workerData[
"artdaq-configuration"] =
"ac";
125 ac.WorkerInitFunction =
function () {
return null; };
127 function getFiles( mask,dir ) {
128 dir = typeof ( dir ) !==
'undefined' ? dir : __dirname;
130 console.log(
"Directory is " + dir +
", and mask is " + mask );
132 var files = fs.readdirSync( dir );
133 var f, l = files.length;
134 for ( var i = 0; i < l; i++ ) {
135 f = files[i].toString( );
136 if ( f.search( mask ) > 0 ) {
137 var cfgName = f.substring( 0,f.indexOf( mask ) );
138 console.log(
"Found file satisfying mask " + mask +
": " + f +
" (" + cfgName +
")" );
139 output.push(
"<option value=\"" + cfgName +mask+
"\">" + cfgName +
"</option>" );
145 ac.GET_Default =
function () {
149 ac.GET_GeneratorTypes =
function () {
151 types.push(
"<option value=\"Default\">No Generator Selected</option>" );
152 types.push(
"<optgroup label=\"Simulators\">" );
153 types = types.concat( getFiles(
"_simulator.html" ,__dirname +
"/../client" ));
154 types.push(
"</optgroup>" );
155 types.push(
"<optgroup label=\"Recievers\">" );
156 types = types.concat( getFiles(
"_receiver.html" ,__dirname +
"/../client" ));
157 types.push(
"</optgroup>" );
158 types.push(
"<optgroup label=\"Readers\">" );
159 types = types.concat( getFiles(
"_reader.html" ,__dirname +
"/../client" ));
160 types.push(
"</optgroup>" );
165 ac.GET_NamedConfigs =
function () {
166 var configs = getFiles(
".xml" );
168 configs.push(
"<option value=\"Default\">Default Configuration</option>");
169 if ( configs.length < 2 ) {
170 console.log(
"I found no named configs!" );
176 ac.RW_saveConfig =
function ( POST ) {
178 console.log(
"Request to save configuration recieved. Configuration data:" );
179 var config = JSON.parse( POST.config );
180 if ( config.configName.search(
"\\.\\.") >= 0 ) {
181 console.log(
"Possible break-in attempt! NOT Proceeding!");
182 return { Success:
false };
184 console.log( util.inspect( config,
false,null ) );
186 success = serializeXML( config,POST.who,path.join( __dirname,config.configName +
".xml" ) );
187 return { Success: success };
190 ac.RO_LoadNamedConfig =
function ( POST ) {
191 console.log(
"Request for configuration with file name \"" + POST.configFile +
"\" received." );
192 if ( POST.configFile ===
"Default" ) {
193 return generateDefaultConfig( );
194 }
else if ( POST.configFile.search(
"\\.\\.") >= 0 ) {
195 console.log(
"Possible break-in attempt! NOT Proceeding!");
198 var output = deserializeXML( path.join( __dirname,POST.configFile ) );
199 console.log(
"Deserialized XML:" );
200 console.log( output );
204 module.exports =
function ( module_holder ) {
205 module_holder[
"artdaq-configuration"] = ac;