diff --git a/CHANGELOG.md b/CHANGELOG.md index 15b1a51..da43715 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [1.8.4] - 28/07/2019 +Edited some docs. + +## [1.8.2] - 28/07/2019 +Added logger. + ## [1.8.1] - 28/07/2019 Cashed reading (in cluster mode) & fixed host issue in results (also in cluster mode). diff --git a/Dockerfile b/Dockerfile index 6b51f59..dc9ecb9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM node:12 RUN curl -L https://get.docker.com | sh - -RUN npm i -g docker-server@1.8.1 +RUN npm i -g docker-server@1.8.4 CMD ["docker-server"] \ No newline at end of file diff --git a/README.md b/README.md index 3dec613..cabeedf 100644 --- a/README.md +++ b/README.md @@ -230,15 +230,30 @@ Also, you can start DockerServerwith these parameters: false - --folder + --folder [path] Shared folder between all docker-servers. (Used only in cluster mode) /tmp/docker-server - --cache_interval + --cache_interval [num] Milliseconds between reads (of all the machines) 3000 + + --log_lovel [option] + Log level [trace|debug|info|warn|error|fatal] + info + + + --log_expiry [num] + Time for a log to live in days. + 14 + + + --log_max_size [num] + Max log size in MB + 25 + --help Show he @@ -361,6 +376,10 @@ And/or ## Changelog +1.8.4 - Edited some docs. + +1.8.2 - Added logger. + 1.8.1 - Cashed reading (in cluster mode) & fixed host issue in results (also in cluster mode). 1.8.0 - **Stable Cluster mode!** diff --git a/index.js b/index.js index 12f69e1..f0d87c1 100644 --- a/index.js +++ b/index.js @@ -12,11 +12,16 @@ var args = yargs .option('cluster', {describe: 'Flag to turn on the Cluster mode.', type: 'boolean', default: false}) .option('folder', {describe: 'Shared folder between all docker-servers.', type: 'string', default: '/tmp/docker-server'}) .option('cache_interval', {describe: 'Milliseconds between reads (of all the machines).', type: 'number', default: 3000}) + .option('log_level', {describe: 'Log level [trace|debug|info|warn|error|fatal]', type: 'string', default: 'info'}) + .option('log_expiry', {describe: 'Time for a log to live in days.', type: 'number', default: 14}) + .option('log_max_size', {describe: 'Max log size in MB.', type: 'number', default: 25}) .help('help', 'Show help.\nFor more documentation see https://github.com/freaker2k7/dockerserver') .argv; -const docker = require('./lib/docker.js'); -const network = require('./lib/network.js')(args); +var log = require('./lib/logger.js')(args); + +const docker = require('./lib/docker.js')(log); +const network = require('./lib/network.js')(log, args); var app = express(); @@ -52,7 +57,7 @@ app.delete('/:id', mid_burst, docker.rm); // Main listener var server = network.protocol(app, args.https); server.listen(args.port); -console.info('Serving on ' + network.get_protocol() + '0.0.0.0:' + args.port); +log.info('Serving on ' + network.get_protocol() + '0.0.0.0:' + args.port); module.exports = Object.assign(docker, network, {'_app': app, '_server': server}); \ No newline at end of file diff --git a/lib/docker.js b/lib/docker.js index 09efaa0..b41b50d 100644 --- a/lib/docker.js +++ b/lib/docker.js @@ -2,6 +2,7 @@ const dockerCLI = require('docker-cli-js'); const uuid = require('uuid/v4'); var docker = new dockerCLI.Docker(); +var log = null; var handle_error = function(req, res) { return function(err) { @@ -10,86 +11,90 @@ var handle_error = function(req, res) { }; -module.exports = { - 'ps': function(req, res) { - return docker.command('ps -a').then(function(data) { - // console.debug('GET:', data); - res.json(data.containerList || []); - }).catch(handle_error(req, res)); - }, - 'logs': function(req, res) { - return docker.command('logs ' + req.params.id).then(function(data) { - // console.debug('GET:', req.params.id, '::', data); - res.json(data); - }).catch(handle_error(req, res)); - }, - 'run': function(req, res) { - // console.debug('PUT Request:', req.body); - if (!req.body || !req.body.image) { - return res.sendStatus(400); - } - - var ports = ''; - var volumes = ''; - var data = ''; - var detach = ''; - var remove = ''; - - if (req.body.ports) { - for (var k in req.body.ports) { - ports += ' -p ' + k + ':' + req.body.ports[k]; +module.exports = function(main_log) { + log = main_log; + + return { + 'ps': function(req, res) { + return docker.command('ps -a').then(function(data) { + log.debug('GET:', data); + res.json(data.containerList || []); + }).catch(handle_error(req, res)); + }, + 'logs': function(req, res) { + return docker.command('logs ' + req.params.id).then(function(data) { + log.debug('GET:', req.params.id, '::', data); + res.json(data); + }).catch(handle_error(req, res)); + }, + 'run': function(req, res) { + log.debug('PUT Request:', req.body); + if (!req.body || !req.body.image) { + return res.sendStatus(400); } - } - if (req.body.volumes) { - for (var k in req.body.volumes) { - volumes += ' -v ' + k.replace(/^\.$/, context) + ':' + req.body.volumes[k]; + + var ports = ''; + var volumes = ''; + var data = ''; + var detach = ''; + var remove = ''; + + if (req.body.ports) { + for (var k in req.body.ports) { + ports += ' -p ' + k + ':' + req.body.ports[k]; + } } + if (req.body.volumes) { + for (var k in req.body.volumes) { + volumes += ' -v ' + k.replace(/^\.$/, context) + ':' + req.body.volumes[k]; + } + } + if (req.body.detach) { + detach = ' --detach'; + } + if (req.body.remove) { + remove = ' --rm'; + } + if (req.body.data) { + data = ' ' + req.body.data; + } + + return docker.command('run --name ' + (req.body.name || uuid()) + ports + volumes + remove + detach + ' ' + req.body.image + data).then(function(data) { + log.debug('PUT:', data); + res.json(data); + }).catch(handle_error(req, res)); + }, + 'exec': function(req, res) { + log.debug('POST Request:', req.body); + + var data = ''; + var interactive = ''; + var tty = ''; + + if (req.body.interactive) { + interactive = ' -i'; + } + if (req.body.tty) { + tty = ' -t'; + } + if (req.body.data) { + data = ' ' + req.body.data; + } + + return docker.command('exec' + tty + interactive + ' ' + req.params.id + ' ' + data).then(function(data) { + log.debug('POST:', req.params.id, '::', data); + res.json(data); + }).catch(handle_error(req, res)); + }, + 'rm': function(req, res) { + if (!req.params.id) { + return res.sendStatus(400); + } + + return docker.command('rm -f ' + req.params.id).then(function(data) { + log.debug('DELETE (RM):', req.params.id, '::', data); + res.json(data); + }).catch(handle_error(req, res)); } - if (req.body.detach) { - detach = ' --detach'; - } - if (req.body.remove) { - remove = ' --rm'; - } - if (req.body.data) { - data = ' ' + req.body.data; - } - - return docker.command('run --name ' + (req.body.name || uuid()) + ports + volumes + remove + detach + ' ' + req.body.image + data).then(function(data) { - // console.debug('PUT:', data); - res.json(data); - }).catch(handle_error(req, res)); - }, - 'exec': function(req, res) { - console.debug('POST Request:', req.body); - - var data = ''; - var interactive = ''; - var tty = ''; - - if (req.body.interactive) { - interactive = ' -i'; - } - if (req.body.tty) { - tty = ' -t'; - } - if (req.body.data) { - data = ' ' + req.body.data; - } - - return docker.command('exec' + tty + interactive + ' ' + req.params.id + ' ' + data).then(function(data) { - console.debug('POST:', req.params.id, '::', data); - res.json(data); - }).catch(handle_error(req, res)); - }, - 'rm': function(req, res) { - if (!req.params.id) { - return res.sendStatus(400); - } - - return docker.command('rm -f ' + req.params.id).then(function(data) { - // console.debug('DELETE (RM):', req.params.id, '::', data); - res.json(data); - }).catch(handle_error(req, res)); - } + }; }; \ No newline at end of file diff --git a/lib/logger.js b/lib/logger.js new file mode 100644 index 0000000..c39230e --- /dev/null +++ b/lib/logger.js @@ -0,0 +1,28 @@ +const winston = require('winston'); +require('winston-daily-rotate-file'); + +module.exports = function(args) { + args.log_level = args.log_level.toLowerCase().replace(/trace/, 'silly'); + + var transport = null; + + if (~['debug', 'silly'].indexOf(args.log_level)) { + transport = new winston.transports.Console({ + level: args.log_level + }); + } else { + transport = new (winston.transports.DailyRotateFile)({ + filename: '/tmp/docker-server-%DATE%.log', + datePattern: 'YYYY-MM-DD-HH', + zippedArchive: true, + maxSize: args.log_max_size + 'm', + maxFiles: args.log_expiry + 'd', + level: args.log_level + }); + } + + return winston.createLogger({ + name: 'ds-logger', + transports: [transport] + }); +} \ No newline at end of file diff --git a/lib/machine.js b/lib/machine.js index 8cf33f4..2d481de 100644 --- a/lib/machine.js +++ b/lib/machine.js @@ -3,6 +3,7 @@ const ping = require('ping'); const si = require('systeminformation'); var args = null; +var log = null; var last_read = null; var cached_machines = []; @@ -32,7 +33,7 @@ var get_all = function(IP) { return fs.readdir(args.folder, function(err, files) { if (err) { - console.error(err); + log.error(err); return resolve({}); } @@ -71,7 +72,7 @@ var get_valid_host = function(ips, IP) { try { fs.unlinkSync(args.folder + ip.host); } catch(e) { - console.error('Probably someone else just removed it:', e); + log.error('Probably someone else just removed it:', e); } return get_valid_host(ips, IP).then(resolve); @@ -80,7 +81,8 @@ var get_valid_host = function(ips, IP) { }; -module.exports = function(cli_args) { +module.exports = function(main_log, cli_args) { + log = main_log; args = cli_args; // Add a trailing slash to the folder path. diff --git a/lib/network.js b/lib/network.js index eaf2e3f..8fa75c6 100644 --- a/lib/network.js +++ b/lib/network.js @@ -1,5 +1,6 @@ var IP = null; var args = null; +var log = null; var machine = null; var request = null; @@ -15,9 +16,9 @@ var get_req = function(req, host) { body: req.body && JSON.stringify(req.body) || undefined, method: req.method }, function (err, res, body) { - // console.debug('request:', host, err, typeof body, body); + log.debug('request:', host, err, typeof body, body); if (err) { - console.error('err:', host, err); + log.error('err:', host, err); return resolve({'body': [err], 'host': host}); } @@ -27,7 +28,7 @@ var get_req = function(req, host) { if (body.startsWith('error')) { body = {'error': body}; } else { - console.error('Error in get_req on', host, ':', e, typeof body, body); + log.error('Error in get_req on', host, ':', e, typeof body, body); } return resolve({'body': [body], 'host': host}); @@ -85,7 +86,8 @@ var handle_cluster = function(req, res, next) { }; -module.exports = function(cli_args) { +module.exports = function(main_log, cli_args) { + log = main_log; args = cli_args; return { @@ -111,7 +113,7 @@ module.exports = function(cli_args) { ca: fs.existsSync('/certs/chain.pem') && fs.readFileSync('/certs/chain.pem', 'utf8') || undefined }, app); } catch (e) { - console.error('Could not start secure server:', e); + log.error('Could not start secure server:', e); return require('http').createServer(app); } } @@ -122,7 +124,7 @@ module.exports = function(cli_args) { 'balance': function(port) { if (args.cluster) { IP = get_protocol() + require('ip').address() + ':' + port; - machine = require('./machine.js')(args); + machine = require('./machine.js')(log, args); request = require('request'); machine.cpu(IP); diff --git a/package-lock.json b/package-lock.json index 7ea2d86..3d75080 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "docker-server", - "version": "1.8.1", + "version": "1.8.4", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -82,6 +82,21 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -163,6 +178,15 @@ "wrap-ansi": "^5.1.0" } }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -176,6 +200,34 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colornames": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", + "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" + }, + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" + }, + "colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -212,6 +264,11 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -248,6 +305,16 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "diagnostics": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", + "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", + "requires": { + "colorspace": "1.1.x", + "enabled": "1.0.x", + "kuler": "1.0.x" + } + }, "docker-cli-js": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/docker-cli-js/-/docker-cli-js-2.5.2.tgz", @@ -293,11 +360,24 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, + "enabled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "requires": { + "env-variable": "0.0.x" + } + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "env-variable": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", + "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==" + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -370,6 +450,24 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "fast-safe-stringify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", + "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" + }, + "fecha": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", + "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" + }, + "file-stream-rotator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.4.1.tgz", + "integrity": "sha512-W3aa3QJEc8BS2MmdVpQiYLKHj3ijpto1gMDlsgCRSKfIUe6MwkcpODGPQ3vZfb0XvCeCqlu9CBQTN7oQri2TZQ==", + "requires": { + "moment": "^2.11.2" + } + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -489,16 +587,31 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -535,6 +648,14 @@ "verror": "1.10.0" } }, + "kuler": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", + "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "requires": { + "colornames": "^1.1.1" + } + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -544,6 +665,25 @@ "path-exists": "^3.0.0" } }, + "logform": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", + "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -577,6 +717,11 @@ "mime-db": "1.40.0" } }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -597,6 +742,11 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -605,6 +755,11 @@ "ee-first": "1.1.1" } }, + "one-time": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", + "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" + }, "p-limit": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", @@ -655,6 +810,11 @@ "underscore": "^1.8.3" } }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -700,6 +860,16 @@ "unpipe": "1.0.0" } }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -754,6 +924,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", @@ -802,6 +977,14 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -818,6 +1001,11 @@ "tweetnacl": "~0.14.0" } }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -833,6 +1021,14 @@ "strip-ansi": "^5.1.0" } }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -846,6 +1042,11 @@ "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.14.4.tgz", "integrity": "sha512-ib2dodksiiaGOW4rcKvFr5naHkODI9GwQPugLb6FLKppkIsE7rj2dfY2UdMBr7oX0/iZP981hoxmbk2e6zl99Q==" }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -867,6 +1068,11 @@ } } }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -907,6 +1113,11 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -937,6 +1148,97 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "winston": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", + "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", + "requires": { + "async": "^2.6.1", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^2.1.1", + "one-time": "0.0.4", + "readable-stream": "^3.1.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.3.0" + } + }, + "winston-compat": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/winston-compat/-/winston-compat-0.1.4.tgz", + "integrity": "sha512-mMEfFsSm6GmkFF+f4/0UJtG4N1vSaczGmXLVJYmS/+u2zUaIPcw2ZRuwUg2TvVBjswgiraN+vNnAG8z4fRUZ4w==", + "requires": { + "cycle": "~1.0.3", + "logform": "^1.6.0", + "triple-beam": "^1.2.0" + }, + "dependencies": { + "logform": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-1.10.0.tgz", + "integrity": "sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.2.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "winston-daily-rotate-file": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-3.10.0.tgz", + "integrity": "sha512-KO8CfbI2CvdR3PaFApEH02GPXiwJ+vbkF1mCkTlvRIoXFI8EFlf1ACcuaahXTEiDEKCii6cNe95gsL4ZkbnphA==", + "requires": { + "file-stream-rotator": "^0.4.1", + "object-hash": "^1.3.0", + "semver": "^6.2.0", + "triple-beam": "^1.3.0", + "winston-compat": "^0.1.4", + "winston-transport": "^4.2.0" + } + }, + "winston-transport": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", + "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", + "requires": { + "readable-stream": "^2.3.6", + "triple-beam": "^1.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", diff --git a/package.json b/package.json index 033da77..d79bdc1 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "docker-server", "author": "Evgeny Kolyakov ", "description": "DockerServer - Super lightweight & simple RESTFul stateless server for running docker containers on a remote machine(s) in a secure way", - "version": "1.8.1", + "version": "1.8.4", "homepage": "https://dockerserver.io", "repository": "freaker2k7/dockerserver", "license": "Apache-2.0", @@ -23,7 +23,7 @@ "scripts": { "start": "node ./index.js", "test": "node ./test/basic.js", - "prepublish": "node ./scripts/dockerfile-version-verify.js" + "prepublishOnly": "node ./scripts/dockerfile-version-verify.js" }, "dependencies": { "docker-cli-js": "2.5.2", @@ -34,6 +34,8 @@ "request": "^2.88.0", "systeminformation": "^4.14.4", "uuid": "^3.3.2", + "winston": "^3.2.1", + "winston-daily-rotate-file": "^3.10.0", "yargs": "^13.3.0" }, "engines": { @@ -47,4 +49,4 @@ "pm2.config.js", "lib/" ] -} \ No newline at end of file +}