[TIC-Web] fixed logger format
[archive/20170607/tools/tic.git] / app.js
1 /* middleware */
2 var http = require('http');
3 var path = require('path');
4 var socketio = require('socket.io');
5 var fs = require('fs');
6 var express = require('express');
7 var bodyParser = require('body-parser');
8 var winston = require('winston');
9 var moment = require('moment');
10 var JL = require('jsnlog').JL;
11 var jsnlog_nodejs = require('jsnlog-nodejs').jsnlog_nodejs;
12
13 var logger = JL('app.js');
14 var app = express();
15 var server = http.createServer(app);
16 var io = socketio.listen(server);
17
18 /* app lib */
19 var Config = require('./config.json');
20 var FileSystem = require('./server/fs/filesystem');
21 var Mic = require('./server/fs/mic');
22 var Router = require('./server/routes/router');
23 var SocketEvent = require('./server/fs/socketEvent');
24
25 /* app config */
26 app.set('port', process.env.PORT || Config.TIC_WEB.PORT);
27 app.use(bodyParser.json());
28 app.use(bodyParser.urlencoded({extended: true}));
29 app.use(express.static(path.join(__dirname, '/public/src'))); //module directory
30 app.use('/api', Router);
31
32 server.listen(app.get('port'), process.env.IP || "0.0.0.0", function () {
33     var addr = server.address();
34
35     // init logger(winston and jsnlog)
36     function _timestamp() {
37         return moment().format("YYYY-MM-DD HH:mm:ss.SSS");
38     }
39     function _customFormatter(options) {
40         return options.timestamp() +
41                 ' ['+ options.level.toUpperCase() + ']' +
42                 '['+ options.meta.loggerName + '] ' +
43                 (!options.meta.clientMessage ? options.message : options.meta.clientMessage);
44     }
45     var consoleAppender = new winston.transports.Console({
46         timestamp: _timestamp,
47         formatter: _customFormatter
48     });
49     var fileAppender = new winston.transports.File({
50         timestamp: _timestamp,
51         formatter: _customFormatter,
52         json: false,
53         filename: Config.TIC_WEB.LOG_FILE
54     });
55     JL().setOptions({ appenders: [ consoleAppender, fileAppender ] });
56
57     logger.info('Server listening at' + addr.address + ':' + addr.port);
58
59     FileSystem.init();
60 });
61 server.on('error', function(err) {
62     if (err.errno === 'EADDRINUSE') {
63         logger.error('The specified port(' + app.get('port') + ') is already in use. Please check that port is available.');
64     } else {
65         logger.error(err.message);
66     }
67 });
68
69
70 /**
71  * jsnlog.js on the client by default sends log messages to /jsnlog.logger, using POST.
72  * @URI /*.logger
73  * @TYPE POST
74  */
75 app.post('*.logger', function (req, res) {
76     // Pass the log messages to the server side jsnlog.js
77     jsnlog_nodejs(JL, req.body);
78
79     // Send empty response. This is ok, because client side jsnlog does not use response from server.
80     res.send('');
81 });
82
83 /**
84  * Get package data from tic-core via RESTful API
85  * @URI /analysis
86  * @TYPE POST
87  */
88 app.post('/analysis', function(req, res) {
89     var postData = JSON.stringify(req.body);
90     var addr = server.address();
91
92     var options = {
93         host: addr.address,
94         port: Config.TIC_CORE.PORT || addr.port + 1,
95         method: 'POST',
96         path: '/analysis',
97         headers: {
98             'Content-Type': 'application/json',
99             'Content-Length': Buffer.byteLength(postData)
100         }
101     };
102
103     var data = '';
104     var ticCoreReq = http.request(options, function (ticCoreRes) {
105         ticCoreRes.setEncoding('utf8');
106         ticCoreRes.on('data', function (chunk) {
107             data += chunk;
108         });
109         ticCoreRes.on('end', function () {
110             res.send(data);
111         });
112     });
113
114     ticCoreReq.write(postData);
115     ticCoreReq.end();
116 });
117
118 /**
119  * Get ks file path from tic-core via RESTful API
120  * @URI /exports
121  * @TYPE POST
122  */
123 app.post('/exports', function(req, res) {
124     var postData = JSON.stringify(req.body);
125     var addr = server.address();
126
127     var options = {
128         host: addr.address,
129         port: Config.TIC_CORE.PORT || addr.port + 1,
130         method: 'POST',
131         path: '/exports',
132         headers: {
133             'Content-Type': 'application/json',
134             'Content-Length': Buffer.byteLength(postData)
135         }
136     };
137
138     var data = '';
139     var ticCoreReq = http.request(options, function (ticCoreRes) {
140         ticCoreRes.setEncoding('utf8');
141         ticCoreRes.on('data', function (chunk) {
142             data += chunk;
143         });
144         ticCoreRes.on('end', function () {
145             res.send(data);
146         });
147     });
148
149     ticCoreReq.write(postData);
150     ticCoreReq.end();
151 });
152
153
154 /**
155  * FileSystem controller (read/create)
156  * Connection with MIC
157  */
158 io.on('connection', function (socket) {
159     logger.info('socket connection');
160
161     /**
162      * SocketEvent.FS_IMAGE_LIST_FROM = 'ws/fs/image/list/from'
163      */
164     socket.on(SocketEvent.FS_IMAGE_LIST_FROM, function (data) {
165         var msgData, fileList, targetDirectory;
166
167         msgData = {};
168         fileList = [];
169         targetDirectory = data.path;
170
171         // get the list of file
172         fileList = FileSystem.list(targetDirectory);
173
174         // set the list
175         msgData.list = fileList;
176
177         // send
178         socket.emit(SocketEvent.FS_IMAGE_LIST_TO, msgData);
179     });
180
181     /**
182      * SocketEvent.FS_IMAGE_ADD_FROM = 'ws/fs/image/add/from'
183      */
184     socket.on(SocketEvent.FS_IMAGE_ADD_FROM, function (data) {
185         Mic.create(data, io);
186
187         io.sockets.emit(SocketEvent.MIC_AVAILABLE_TO, Mic.isAvailable());
188     });
189
190     /**
191      * SocketEvent.FS_IMAGE_ADD_KILL = 'ws/fs/image/add/kill'
192      */
193     socket.on(SocketEvent.FS_IMAGE_ADD_KILL, function () {
194         Mic.kill();
195
196         io.sockets.emit(SocketEvent.MIC_AVAILABLE_TO, Mic.isAvailable());
197     });
198
199     /**
200      * SocketEvent.MIC_AVAILABLE_FROM = 'ws/mic/available/from'
201      */
202     socket.on(SocketEvent.MIC_AVAILABLE_FROM, function () {
203         logger.info('mic available: ' + Mic.isAvailable());
204         io.sockets.emit(SocketEvent.MIC_AVAILABLE_TO, Mic.isAvailable());
205     });
206
207     /**
208      * SocketEvent.APP_CONFIG_FROM = 'ws/app/config/from'
209      */
210     socket.on(SocketEvent.APP_CONFIG_FROM, function () {
211         socket.emit(SocketEvent.APP_CONFIG_TO, Config);
212     });
213
214     socket.on('disconnect', function () {
215         logger.info('socket disconnect');
216     });
217
218 });