fluffy – Diff between revs 1 and 2

Subversion Repositories:
Rev:
Only display areas with differencesIgnore whitespace
Rev 1 Rev 2
1 #!/usr/bin/env node 1 #!/usr/bin/env node
2   2  
3 /*************************************************************************/ 3 /*************************************************************************/
4 /* Copyright (C) 2017 Wizardry and Steamworks - License: GNU GPLv3 */ 4 /* Copyright (C) 2017 Wizardry and Steamworks - License: GNU GPLv3 */
5 /*************************************************************************/ 5 /*************************************************************************/
6   6  
7 // Import packages. 7 // Import packages.
8 const https = require('https'); 8 const https = require('https');
9 const http = require('http'); 9 const http = require('http');
10 const path = require('path'); 10 const path = require('path');
11 const fs = require('fs'); 11 const fs = require('fs');
12 const url = require('url'); 12 const url = require('url');
13 const moment = require('moment'); 13 const moment = require('moment');
14 const winston = require('winston'); 14 const winston = require('winston');
15 const yargs = require('yargs'); 15 const yargs = require('yargs');
16 const dns = require('dns'); 16 const dns = require('dns');
17 const HttpCache = require("http-cache"); 17 const HttpCache = require("http-cache");
18   18  
19 // Local imports. 19 // Local imports.
20 const Handler = require( 20 const Handler = require(
21 path 21 path
22 .resolve( 22 .resolve(
23 path.dirname(require.main.filename), 23 path.dirname(require.main.filename),
24 'src', 24 'src',
25 'handler' 25 'handler'
26 ) 26 )
27 ); 27 );
28 const certs = require( 28 const certs = require(
29 path 29 path
30 .resolve( 30 .resolve(
31 path.dirname(require.main.filename), 31 path.dirname(require.main.filename),
32 'src', 32 'src',
33 'certs' 33 'certs'
34 ) 34 )
35 ); 35 );
36   36  
37 // Load configuration file. 37 // Load configuration file.
38 const config = require( 38 const config = require(
39 path 39 path
40 .resolve( 40 .resolve(
41 path.dirname(require.main.filename), 41 path.dirname(require.main.filename),
42 'config' 42 'config'
43 ) 43 )
44 ); 44 );
45   45  
46 // Get command-line arguments. 46 // Get command-line arguments.
47 const argv = yargs 47 const argv = yargs
48 .version() 48 .version()
49 .option('root', { 49 .option('root', {
50 alias: 'd', 50 alias: 'd',
51 describe: 'Path to the document root', 51 describe: 'Path to the document root',
52 demandOption: true 52 demandOption: true
53 }) 53 })
54 .help() 54 .help()
55 .argv 55 .argv
56   56  
57 // Create various logging mechanisms. 57 // Create various logging mechanisms.
58 // RFC5424 - { emerg: 0, alert: 1, crit: 2, error: 3, warning: 4, notice: 5, info: 6, debug: 7 } 58 // RFC5424 - { emerg: 0, alert: 1, crit: 2, error: 3, warning: 4, notice: 5, info: 6, debug: 7 }
59 winston.setLevels(winston.config.syslog.levels); 59 winston.setLevels(winston.config.syslog.levels);
60 const log = new winston.Logger({ 60 const log = new winston.Logger({
61 transports: [ 61 transports: [
62 new winston.transports.File({ 62 new winston.transports.File({
63 level: 'info', 63 level: 'info',
64 filename: path.resolve( 64 filename: path.resolve(
65 path.dirname(require.main.filename), 65 path.dirname(require.main.filename),
66 config.log.file 66 config.log.file
67 ), 67 ),
68 handleExceptions: true, 68 handleExceptions: true,
69 json: false, 69 json: false,
70 maxsize: 1048576, // 1MiB. 70 maxsize: 1048576, // 1MiB.
71 maxFiles: 10, // Ten rotations. 71 maxFiles: 10, // Ten rotations.
72 colorize: false, 72 colorize: false,
73 timestamp: () => moment() 73 timestamp: () => moment()
74 .format('YYYYMMDDTHHmmss') 74 .format('YYYYMMDDTHHmmss')
75 }), 75 }),
76 new winston.transports.Console({ 76 new winston.transports.Console({
77 level: 'info', 77 level: 'info',
78 handleExceptions: true, 78 handleExceptions: true,
79 json: false, 79 json: false,
80 colorize: true, 80 colorize: true,
81 timestamp: () => moment() 81 timestamp: () => moment()
82 .format('YYYYMMDDTHHmmss') 82 .format('YYYYMMDDTHHmmss')
83 }) 83 })
84 ], 84 ],
85 exitOnError: false 85 exitOnError: false
86 }); 86 });
87   87  
88 fs.realpath(argv.root, (error, root) => { 88 fs.realpath(argv.root, (error, root) => {
89 if (error) { 89 if (error) {
90 log.error('Could not find document root: ' + argv.root); 90 log.error('Could not find document root: ' + argv.root);
91 process.exit(1); 91 process.exit(1);
92 } 92 }
93   93  
94 // Create server-side cache. 94 // Create server-side cache.
95 const httpcache = new HttpCache(); 95 const httpcache = new HttpCache();
96   96  
97 // Start HTTP server. 97 // Start HTTP server.
98 http.createServer( 98 http.createServer(
99 // authentication, 99 // authentication,
100 (request, response) => { 100 (request, response) => {
101 // Configuration path requested, so send the server configuration if allowed. 101 // Configuration path requested, so send the server configuration if allowed.
102 if(config.configuration.enable === true && 102 if(config.configuration.enable === true &&
103 url.parse(request.url, true).path === 103 url.parse(request.url, true).path ===
104 config.configuration.path) { 104 config.configuration.path) {
105 const address = request.socket.address(); 105 const address = request.socket.address();
106 log.info('HTTP Server configuration requested by: ' + 106 log.info('HTTP Server configuration requested by: ' +
107 address.address + ':' + 107 address.address + ':' +
108 address.port 108 address.port
109 ); 109 );
110 response.setHeader('Content-Type', 'application/json'); 110 response.setHeader('Content-Type', 'application/json');
111 response.end(JSON.stringify(config)); 111 response.end(JSON.stringify(config));
112 return; 112 return;
113 } 113 }
114 114
115 // Process and cache the resource. 115 // Process and cache the resource.
116 httpcache(request, response, () => { 116 httpcache(request, response, () => {
117 new Handler().process(config, request, response, root) 117 new Handler().process(config, request, response, root)
118 .on('log', (data) => { 118 .on('log', (data) => {
119 log.log(data.severity, data.message); 119 log.log(data.severity, data.message);
120 }) 120 })
121 .on('data', (result) => { 121 .on('data', (result) => {
122 response.setHeader('Content-Type', result.type); 122 response.setHeader('Content-Type', result.type);
123 response.writeHead(result.status); 123 response.writeHead(result.status);
124 result.data 124 result.data
125 .on('readable', () => result.data.pipe(response)) 125 .on('readable', () => result.data.pipe(response))
126 .on('end', () => response.end()); 126 .on('end', () => response.end());
127 }); 127 });
128 }); 128 });
129 } 129 }
130 ).listen(config.net.port, config.net.address, () => { 130 ).listen(config.net.port, config.net.address, () => {
131 log.info('HTTP Server accessible at: http://' + 131 log.info('HTTP Server accessible at: http://' +
132 config.net.address + 132 config.net.address +
133 ':' + 133 ':' +
134 config.net.port + 134 config.net.port +
135 ' and serving files from directory: ' + 135 ' and serving files from directory: ' +
136 root 136 root
137 ); 137 );
138 }); 138 });
139   139  
140 // Start HTTPs server if enabled. 140 // Start HTTPs server if enabled.
141 if (config.ssl.enable) { 141 if (config.ssl.enable) {
142 // Generate certificates for HTTPs. 142 // Generate certificates for HTTPs.
143 certs.generate( 143 certs.generate(
144 config.site.name, 144 config.site.name,
145 config.net.address, 145 config.net.address,
146 config.ssl.privateKeySize, 146 config.ssl.privateKeySize,
147 (certificates) => { 147 (certificates) => {
148 https.createServer( 148 https.createServer(
149 // authentication, 149 // authentication,
150 { 150 {
151 key: certificates.privateKey, 151 key: certificates.privateKey,
152 cert: certificates.certificate, 152 cert: certificates.certificate,
153 }, 153 },
154 (request, response) => { 154 (request, response) => {
155 -  
156 // Configuration path requested, so send the server configuration if allowed. 155 // Configuration path requested, so send the server configuration if allowed.
157 if(config.configuration.enable === true && 156 if(config.configuration.enable === true &&
158 url.parse(request.url, true).path === 157 url.parse(request.url, true).path ===
159 config.configuration.path) { 158 config.configuration.path) {
160 const address = request.socket.address(); 159 const address = request.socket.address();
161 log.info('HTTP Server configuration requested by: ' + 160 log.info('HTTP Server configuration requested by: ' +
162 address.address + ':' + 161 address.address + ':' +
163 address.port 162 address.port
164 ); 163 );
165 response.setHeader('Content-Type', 'application/json'); 164 response.setHeader('Content-Type', 'application/json');
166 response.end(JSON.stringify(config)); 165 response.end(JSON.stringify(config));
167 return; 166 return;
168 } 167 }
-   168
169 169 // Process and cache the resource.
170 httpcache(request, response, () => { 170 httpcache(request, response, () => {
171 new Handler().process(config, request, response, root) 171 new Handler().process(config, request, response, root)
172 .on('log', (data) => { 172 .on('log', (data) => {
173 log.log(data.severity, data.message); 173 log.log(data.severity, data.message);
174 }) 174 })
175 .on('data', (result) => { 175 .on('data', (result) => {
176 response.setHeader('Content-Type', result.type); 176 response.setHeader('Content-Type', result.type);
177 response.writeHead(result.status); 177 response.writeHead(result.status);
178 result.data 178 result.data
179 .on('readable', () => result.data.pipe(response)) 179 .on('readable', () => result.data.pipe(response))
180 .on('end', () => response.end()); 180 .on('end', () => response.end());
181 }); 181 });
182 }); 182 });
183 } 183 }
184 ).listen(config.ssl.port, config.ssl.address, () => { 184 ).listen(config.ssl.port, config.ssl.address, () => {
185 log.info('HTTPs Server accessible at: https://' + 185 log.info('HTTPs Server accessible at: https://' +
186 config.ssl.address + 186 config.ssl.address +
187 ':' + 187 ':' +
188 config.ssl.port + 188 config.ssl.port +
189 ' and serving files from directory: ' + 189 ' and serving files from directory: ' +
190 root 190 root
191 ); 191 );
192 }) 192 })
193 } 193 }
194 ); 194 );
195 } 195 }
196 }); 196 });
197   197