artdaq_node_server  v1_00_12
artdaq-configuration_module.js
1 
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' );
9 
10 function generateDefaultConfig() {
11  var output = {};
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"];
37 
38  return output;
39 }
40 
41 function traverse( obj, parent ) {
42  var output = "";
43  //console.log( "Traversing: " )
44  //console.log( obj );
45  for ( var key in obj ) {
46  var keyPrint = key;
47  if ( key.length == 1 && parseInt( key ) >= 0 ) {
48  keyPrint = parent.slice( 0,parent.length - 1 );
49  }
50  if ( obj.hasOwnProperty( key ) ) {
51  //console.log( "Key is " + keyPrint );
52  output += "<" + keyPrint + ">";
53  if ( obj[key] !== null && typeof ( obj[key] ) === "object" ) {
54  //console.log( "Going to traverse " + key + " with data:" );
55  //console.log( obj[key] );
56  output += "\n" + traverse( obj[key], key );
57  } else {
58  //console.log( "Filling in key value " + obj[key] );
59  output += obj[key];
60  }
61  //console.log( "Ending key " + keyPrint );
62  output += "</" + keyPrint + ">\n";
63  }
64  }
65  //console.log( "Returning " + output );
66  return output;
67 }
68 
69 function serializeXML( config,who,fileName ) {
70  console.log( "Saving Configuration to " + fileName );
71  var xmlData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
72 
73  var configurationXML = "<author>" + who + "</author>\n";
74  configurationXML += traverse( config, "" );
75 
76  console.log("Putting Generated configuration into artdaq-configuration block");
77  xmlData += "<artdaq-configuration>\n" + configurationXML + "</artdaq-configuration>";
78 
79  console.log( "Writing out file" );
80  fs.writeFileSync( fileName,xmlData );
81  console.log( "Done Writing Configuration" );
82  return true;
83 }
84 
85 function checkBools( object ) {
86  for ( var key in object ) {
87  if ( object.hasOwnProperty( key ) ) {
88  if ( object[key] === "true" ) {
89  object[key] = true;
90  } else if ( object[key] === "false" ) {
91  object[key] = false;
92  } else if ( object !== null && typeof ( object ) === "object" ) {
93  object[key] = checkBools( object[key] );
94  }
95  }
96  }
97  return object;
98 }
99 
100 function deserializeXML( fileName ) {
101  console.log( "Reading " + fileName + ":" );
102  var xmlData = fs.readFileSync( fileName );
103  var xmlObj;
104  parser.parseString( xmlData,function ( err,result ) { xmlObj = result; } );
105  //console.log( util.inspect( xmlObj,false,null ) );
106  output = {};
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;
118 
119  return checkBools( output );
120 }
121 
122 ac.MasterInitFunction = function ( workerData ) {
123  workerData["artdaq-configuration"] = "ac";
124 };
125 ac.WorkerInitFunction = function () { return null; };
126 
127 function getFiles( mask,dir ) {
128  dir = typeof ( dir ) !== 'undefined' ? dir : __dirname;
129 
130  console.log( "Directory is " + dir + ", and mask is " + mask );
131  var output = [];
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>" );
140  }
141  }
142  return output;
143 }
144 
145 ac.GET_Default = function () {
146  return "";
147 }
148 
149 ac.GET_GeneratorTypes = function () {
150  var types = [];
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>" );
161 
162  return types;
163 }
164 
165 ac.GET_NamedConfigs = function () {
166  var configs = getFiles( ".xml" );
167 
168  configs.push("<option value=\"Default\">Default Configuration</option>");
169  if ( configs.length < 2 ) {
170  console.log( "I found no named configs!" );
171 
172  }
173  return configs;
174 };
175 
176 ac.RW_saveConfig = function ( POST ) {
177  var success = false;
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 };
183  }
184  console.log( util.inspect( config,false,null ) );
185 
186  success = serializeXML( config,POST.who,path.join( __dirname,config.configName + ".xml" ) );
187  return { Success: success };
188 }
189 
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!");
196  return "";
197  }
198  var output = deserializeXML( path.join( __dirname,POST.configFile ) );
199  console.log( "Deserialized XML:" );
200  console.log( output );
201  return output;
202 };
203 
204 module.exports = function ( module_holder ) {
205  module_holder["artdaq-configuration"] = ac;
206 };