forked from mongo-express/mongo-express
-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
executable file
·141 lines (116 loc) · 4.27 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/usr/bin/env node
'use strict';
const clc = require('cli-color');
const csrf = require('csurf');
const commander = require('commander');
const express = require('express');
const fs = require('fs');
const https = require('https');
const middleware = require('./lib/middleware');
const utils = require('./lib/utils');
const updateNotifier = require('update-notifier');
const pkg = require('./package.json');
let app = express();
let notifier = updateNotifier({ pkg });
let config;
let defaultPort = 80;
let server = app;
let sslOptions;
// Notify of any updates
notifier.notify();
try {
// eslint-disable-next-line import/no-unresolved
config = utils.deepmerge(require('./config.default'), require('./config'));
} catch (e) {
if (e.code === 'MODULE_NOT_FOUND') {
console.log('No custom config.js found, loading config.default.js');
} else {
console.error(clc.red('Unable to load config.js!'));
console.error(clc.red('Error is:'));
console.log(clc.red(e));
process.exit(1);
}
config = require('./config.default');
}
if (config.options.console) {
console.log('Welcome to mongo-express');
console.log('------------------------');
console.log('\n');
}
commander
.version(require('./package').version)
.option('-U, --url <url>', 'connection string url')
.option('-H, --host <host>', 'hostname or adress')
.option('-P, --dbport <host>', 'port of the db')
.option('-u, --username <username>', 'username for authentication')
.option('-p, --password <password>', 'password for authentication')
.option('-a, --admin', 'enable authentication as admin')
.option('-d, --database <database>', 'authenticate to database')
.option('--port <port>', 'listen on specified port')
.parse(process.argv);
if (commander.username && commander.password) {
config.mongodb.admin = !!commander.admin;
if (commander.admin) {
config.mongodb.adminUsername = commander.username;
config.mongodb.adminPassword = commander.password;
} else {
let user = {
database: commander.database,
username: commander.username,
password: commander.password,
};
for (let key in user) {
if (!user[key]) {
commander.help();
}
}
config.mongodb.auth[0] = user;
}
config.useBasicAuth = false;
}
if (commander.url) {
config.mongodb.connectionString = commander.url;
if (commander.admin) {
config.mongodb.admin = true;
}
}
config.mongodb.server = commander.host || config.mongodb.server;
config.mongodb.port = commander.dbport || config.mongodb.port;
config.site.port = commander.port || config.site.port;
if (!config.site.baseUrl) {
console.error('Please specify a baseUrl in your config. Using "/" for now.');
config.site.baseUrl = '/';
}
app.use(config.site.baseUrl, middleware(config));
app.use(config.site.baseUrl, csrf());
if (config.site.sslEnabled) {
defaultPort = 443;
sslOptions = {
key: fs.readFileSync(config.site.sslKey),
cert: fs.readFileSync(config.site.sslCert),
};
server = https.createServer(sslOptions, app);
}
let addressString = (config.site.sslEnabled ? 'https://' : 'http://') + (config.site.host || '0.0.0.0') + ':' + (config.site.port || defaultPort);
server.listen(config.site.port, config.site.host, function () {
if (config.options.console) {
console.log('Mongo Express server listening', 'at ' + addressString);
if (!config.site.host || config.site.host === '0.0.0.0') {
console.error(clc.red('Server is open to allow connections from anyone (0.0.0.0)'));
}
if (config.basicAuth.username === 'admin' && config.basicAuth.password === 'pass') {
console.error(clc.red('basicAuth credentials are "admin:pass", it is recommended you change this in your config.js!'));
}
}
})
.on('error', function (e) {
if (e.code === 'EADDRINUSE') {
console.log();
console.error(clc.red('Address ' + addressString + ' already in use! You need to pick a different host and/or port.'));
console.log('Maybe mongo-express is already running?');
}
console.log();
console.log('If you are still having trouble, try Googling for the key parts of the following error object before posting an issue');
console.log(JSON.stringify(e));
return process.exit(1);
});