diff --git a/package-lock.json b/package-lock.json index 36e4b41..f00c80e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -79,7 +79,6 @@ "version": "3.0.4", "resolved": "https://verdaccio.lossless.one/@pushrocks%2flik/-/lik-3.0.4.tgz", "integrity": "sha512-abyDxBqZgUCvXxl7DNVnZ6gDv3jjH9XxqMW6VE4FvDnXJw7iShKpi/ImFEqR2ZEtACdad5/XORdP8Yw0EyrEog==", - "dev": true, "requires": { "@pushrocks/smartdelay": "^2.0.2", "@pushrocks/smartpromise": "^2.0.5", @@ -109,7 +108,6 @@ "version": "2.0.2", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartdelay/-/smartdelay-2.0.2.tgz", "integrity": "sha512-4xf6tMKwZcxBynKgXrM4SQKgeASfRvx43LUmR5DkStp26ZHAsarCXUdKJS6y8QIPygEOTOCP8we97JAcCzBuMg==", - "dev": true, "requires": { "@pushrocks/smartpromise": "^2.0.5" } @@ -118,7 +116,6 @@ "version": "2.0.3", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartevent/-/smartevent-2.0.3.tgz", "integrity": "sha512-x4B1mzzE6LrMATXsRLNuZpMTlB2JodL44MA4bF4FucU3SBBiWhFv3CFJRlO9B23SKZ1fwdJQrk2lT7YTUHXXJQ==", - "dev": true, "requires": { "@pushrocks/smartpromise": "^2.0.5" } @@ -202,7 +199,6 @@ "version": "2.0.3", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartrx/-/smartrx-2.0.3.tgz", "integrity": "sha512-OWxagu+CBdPaq76AIg91hJyrNhDTlEpesj01ooWCeVIaLY3G7yvFkqHsEKNOwPUG1LzCWmjq1l1dHQx9p2vJ9A==", - "dev": true, "requires": { "@pushrocks/lik": "^3.0.2", "@pushrocks/smartevent": "^2.0.3", @@ -236,7 +232,6 @@ "version": "3.0.5", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmarttime/-/smarttime-3.0.5.tgz", "integrity": "sha512-nHjJ8xRZ87OE8tBBIAOgjHJmJrc3MaPZtEZ5JDY2U9gjaED6JdRcdQ+vhSaLJT+U2u8YzXOuA6LfNN+X4jZm6A==", - "dev": true, "requires": { "@pushrocks/smartpromise": "^2.0.5", "@types/luxon": "^1.4.1", @@ -305,14 +300,12 @@ "@types/luxon": { "version": "1.4.1", "resolved": "https://verdaccio.lossless.one/@types%2fluxon/-/luxon-1.4.1.tgz", - "integrity": "sha512-mYv/gbkOJ40CDgR8st5sosfFNrJncdlkpdzQSNRdU86UQg3oWWmll4AO/7B8F5FlBC6YrIXqXDSnkoCBqo+uMA==", - "dev": true + "integrity": "sha512-mYv/gbkOJ40CDgR8st5sosfFNrJncdlkpdzQSNRdU86UQg3oWWmll4AO/7B8F5FlBC6YrIXqXDSnkoCBqo+uMA==" }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://verdaccio.lossless.one/@types%2fminimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { "version": "10.5.7", @@ -329,7 +322,7 @@ }, "@types/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.1.tgz", + "resolved": "https://verdaccio.lossless.one/@types%2fwhich/-/which-1.3.1.tgz", "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==" }, "@types/yargs": { @@ -350,6 +343,12 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://verdaccio.lossless.one/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -375,6 +374,47 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://verdaccio.lossless.one/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://verdaccio.lossless.one/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://verdaccio.lossless.one/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://verdaccio.lossless.one/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -401,6 +441,12 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://verdaccio.lossless.one/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, "camelcase": { "version": "5.0.0", "resolved": "https://verdaccio.lossless.one/camelcase/-/camelcase-5.0.0.tgz", @@ -436,6 +482,37 @@ "integrity": "sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw==", "dev": true }, + "chalk": { + "version": "2.4.2", + "resolved": "https://verdaccio.lossless.one/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://verdaccio.lossless.one/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://verdaccio.lossless.one/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "check-error": { "version": "1.0.2", "resolved": "https://verdaccio.lossless.one/check-error/-/check-error-1.0.2.tgz", @@ -484,6 +561,21 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://verdaccio.lossless.one/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://verdaccio.lossless.one/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "combined-stream": { "version": "1.0.7", "resolved": "https://verdaccio.lossless.one/combined-stream/-/combined-stream-1.0.7.tgz", @@ -492,6 +584,12 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "2.19.0", + "resolved": "https://verdaccio.lossless.one/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -606,6 +704,12 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, + "esutils": { + "version": "2.0.2", + "resolved": "https://verdaccio.lossless.one/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, "execa": { "version": "1.0.0", "resolved": "https://verdaccio.lossless.one/execa/-/execa-1.0.0.tgz", @@ -733,6 +837,29 @@ "function-bind": "^1.1.1" } }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://verdaccio.lossless.one/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://verdaccio.lossless.one/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://verdaccio.lossless.one/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "home": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/home/-/home-1.0.1.tgz", @@ -832,6 +959,12 @@ "resolved": "https://verdaccio.lossless.one/js-base64/-/js-base64-2.5.0.tgz", "integrity": "sha512-wlEBIZ5LP8usDylWbDNhKPEFVFdI5hCHpnVoT/Ysvoi/PRhJENm/Rlh9TvjYB38HFfKZN7OzEbRjmjvLkFw11g==" }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://verdaccio.lossless.one/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, "js-yaml": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", @@ -901,8 +1034,7 @@ "luxon": { "version": "1.9.0", "resolved": "https://verdaccio.lossless.one/luxon/-/luxon-1.9.0.tgz", - "integrity": "sha512-N1kSwtIEhM/gIRGASXPgi1CwfQZX5VTjndYFjOsZdEEtWij2uSoRrgDGWwViZCUNY9Rwh4UVG/TLcUinHM20cA==", - "dev": true + "integrity": "sha512-N1kSwtIEhM/gIRGASXPgi1CwfQZX5VTjndYFjOsZdEEtWij2uSoRrgDGWwViZCUNY9Rwh4UVG/TLcUinHM20cA==" }, "make-error": { "version": "1.3.5", @@ -1117,6 +1249,12 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://verdaccio.lossless.one/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, "pathval": { "version": "1.1.0", "resolved": "https://verdaccio.lossless.one/pathval/-/pathval-1.1.0.tgz", @@ -1212,11 +1350,19 @@ "integrity": "sha1-KadZGEbK+RtuijzamRaD+V+NfUI=", "dev": true }, + "resolve": { + "version": "1.9.0", + "resolved": "https://verdaccio.lossless.one/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, "rxjs": { "version": "6.3.3", "resolved": "https://verdaccio.lossless.one/rxjs/-/rxjs-6.3.3.tgz", "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", - "dev": true, "requires": { "tslib": "^1.9.0" } @@ -1425,11 +1571,16 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://verdaccio.lossless.one/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, "symbol-tree": { "version": "3.2.2", "resolved": "https://verdaccio.lossless.one/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", - "dev": true + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" }, "ts-node": { "version": "7.0.1", @@ -1450,9 +1601,43 @@ "tslib": { "version": "1.9.3", "resolved": "https://verdaccio.lossless.one/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "tslint": { + "version": "5.12.0", + "resolved": "https://verdaccio.lossless.one/tslint/-/tslint-5.12.0.tgz", + "integrity": "sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ==", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.27.2" + } + }, + "tslint-config-prettier": { + "version": "1.17.0", + "resolved": "https://verdaccio.lossless.one/tslint-config-prettier/-/tslint-config-prettier-1.17.0.tgz", + "integrity": "sha512-NKWNkThwqE4Snn4Cm6SZB7lV5RMDDFsBwz6fWUkTxOKGjMx8ycOHnjIbhn7dZd5XmssW3CwqUjlANR6EhP9YQw==", "dev": true }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://verdaccio.lossless.one/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://verdaccio.lossless.one/type-detect/-/type-detect-4.0.8.tgz", diff --git a/package.json b/package.json index a68aa76..a5dcf26 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ }, "homepage": "https://gitlab.com/pushrocks/smartnginx#README", "dependencies": { + "@pushrocks/lik": "^3.0.4", "@pushrocks/smartfile": "^6.0.11", "@pushrocks/smartlog": "^2.0.9", "@pushrocks/smartpromise": "^2.0.5", @@ -35,6 +36,8 @@ "@gitzone/tsrun": "^1.1.17", "@gitzone/tstest": "^1.0.18", "@pushrocks/tapbundle": "^3.0.7", - "qenv": "^1.1.7" + "qenv": "^1.1.7", + "tslint": "^5.12.0", + "tslint-config-prettier": "^1.17.0" } } diff --git a/test/test.ts b/test/test.ts index e7a850c..e54c1e9 100644 --- a/test/test.ts +++ b/test/test.ts @@ -4,7 +4,6 @@ import path = require('path'); import { Qenv } from 'qenv'; let testQenv = new Qenv(process.cwd(), path.join(process.cwd(), '.nogit')); - import * as smartnginx from '../ts'; let testSmartNginx: smartnginx.SmartNginx; @@ -12,26 +11,30 @@ let testNginxZone01: smartnginx.NginxHost; let testNginxZone02: smartnginx.NginxHost; tap.test('should create a valid instance of SmartNginx', async () => { - testSmartNginx = new smartnginx.SmartNginx(); + testSmartNginx = new smartnginx.SmartNginx({}); expect(testSmartNginx).to.be.instanceof(smartnginx.SmartNginx); }); tap.test(`should produce an instance of NginxConfig`, async () => { testNginxZone01 = new smartnginx.NginxHost(testSmartNginx, { hostName: 'test100.bleu.de', - destination: '192.192.192.191' + destination: '192.192.192.191', + privateKey: 'some private', + publicKey: 'some public' }); testNginxZone02 = new smartnginx.NginxHost(testSmartNginx, { hostName: 'test102.bleu.de', - destination: '192.192.192.192' + destination: '192.192.192.192', + privateKey: 'some private', + publicKey: 'some public' }); expect(testNginxZone01).to.be.instanceof(smartnginx.NginxHost); console.log(testNginxZone01.configString); }); tap.test('.addZone() should add a zone to NginxConfig Object', async () => { - testSmartNginx.addHost('test200.bleu.de', '192.192.192.191'); - testSmartNginx.addHost('test201.blue.de', '192.192.192.191'); + testSmartNginx.addHost(testNginxZone01); + testSmartNginx.addHost(testNginxZone02); }); tap.test('.deploy() should deploy a config from an instance', async () => { diff --git a/ts/interfaces/hostconfig.ts b/ts/interfaces/hostconfig.ts new file mode 100644 index 0000000..21f53e9 --- /dev/null +++ b/ts/interfaces/hostconfig.ts @@ -0,0 +1,6 @@ +export interface IHostConfig { + hostName: string; + destination: string; + privateKey: string; + publicKey: string; +} diff --git a/ts/interfaces/index.ts b/ts/interfaces/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/ts/smartnginx.classes.certhandler.ts b/ts/smartnginx.classes.certhandler.ts deleted file mode 100644 index 60d7e0f..0000000 --- a/ts/smartnginx.classes.certhandler.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as plugins from './smartnginx.plugins'; - -export class CertHandler { - private _readyDeferred = plugins.smartpromise.defer(); - certHandlerReady = this._readyDeferred.promise; - constructor() {} // nothing to do here for now - - /** - * ensure a cert is at the right location - * @param hostName - */ - async ensureCertForHost(hostName) { - - } -} \ No newline at end of file diff --git a/ts/smartnginx.classes.nginxhost.ts b/ts/smartnginx.classes.nginxhost.ts index 38ea755..5b267d6 100644 --- a/ts/smartnginx.classes.nginxhost.ts +++ b/ts/smartnginx.classes.nginxhost.ts @@ -4,13 +4,7 @@ import * as snippets from './smartnginx.snippets'; import { SmartNginx } from './smartnginx.classes.smartnginx'; -/** - * the host config data that NginxHost needs to create a valid instance - */ -export interface IHostConfigData { - hostName: string; - destination: string; -} +import { IHostConfig } from './interfaces/hostconfig'; export enum hostTypes { reverseProxy @@ -19,16 +13,19 @@ export enum hostTypes { /** * manages a single nginx host */ -export class NginxHost { - /** +export class NginxHost implements IHostConfig { + /** * smartnginxInstance this NginHost belongs to */ - smartnginxInstance: SmartNginx + smartnginxInstance: SmartNginx; hostName: string; // the host name e.g. domain name destination: string; configString: string; // the actual host config file as string - constructor(smartnginxInstanceArg: SmartNginx, optionsArg: IHostConfigData) { + privateKey: string; + publicKey: string; + + constructor(smartnginxInstanceArg: SmartNginx, optionsArg: IHostConfig) { this.smartnginxInstance = smartnginxInstanceArg; this.hostName = optionsArg.hostName; this.destination = optionsArg.destination; @@ -39,8 +36,8 @@ export class NginxHost { * * @param certInstanceArg */ - async deploy() { - let filePath = plugins.path.join(paths.nginxHostFileBase, this.hostName + '.conf'); + public async deploy() { + const filePath = plugins.path.join(paths.nginxHostDirPath, `${this.hostName}.conf`); // writeConfig plugins.smartfile.memory.toFsSync(this.configString, filePath); } diff --git a/ts/smartnginx.classes.nginxprocess.ts b/ts/smartnginx.classes.nginxprocess.ts index efcf765..104be8a 100644 --- a/ts/smartnginx.classes.nginxprocess.ts +++ b/ts/smartnginx.classes.nginxprocess.ts @@ -5,78 +5,65 @@ import { NginxHost } from './smartnginx.classes.nginxhost'; import { Smartshell } from '@pushrocks/smartshell'; +import { ChildProcess } from 'child_process'; + /** * manages a nginxprocess for an NginxConfig */ export class NginxProcess { - started: boolean = false; - nginxConfig: SmartNginx; - nginxChildProcess: plugins.childProcess.ChildProcess; - smartshellInstance = new Smartshell({ + public started: boolean = false; + public smartNginxRef: SmartNginx; + private nginxChildProcess: ChildProcess; + private smartshellInstance = new Smartshell({ executor: 'bash' }); - constructor(nginxConfigArg) { - this.nginxConfig = nginxConfigArg; + + constructor(nginxRefArg: SmartNginx) { + this.smartNginxRef = nginxRefArg; } /** * start nginx */ - start() { - let done = plugins.smartpromise.defer(); - if (typeof this.nginxChildProcess == 'undefined') { - this.nginxChildProcess = plugins.childProcess.exec( - `nginx -c ${paths.nginxConfFile}`, - function(error, stdout, stderr) { - console.log(`stdout: ${stdout}`); - console.log(`stderr: ${stderr}`); - if (error !== null) { - console.log(`exec error: ${error}`); - } - } - ); + public async start() { + if (!this.nginxChildProcess) { + this.nginxChildProcess = (await this.smartshellInstance.execStreaming( + `nginx -c ${paths.nginxConfFile}` + )).childProcess; } this.started = true; plugins.smartlog.defaultLogger.log('info', 'started Nginx!'); - done.resolve(); - return done.promise; } /** * reload config */ - reloadConfig() { - let done = plugins.smartpromise.defer(); - if (this.started == false) { + public async reloadConfig() { + if (!this.started) { this.start(); } else { - this.smartshellInstance.exec('nginx -s reload'); + await this.smartshellInstance.exec('nginx -s reload'); } - plugins.smartlog.defaultLogger.log('info', 'NginxProcess has loaded the new config!'); - done.resolve(); - return done.promise; + this.smartNginxRef.logger.log('info', 'NginxProcess has loaded the new config!'); } /** * stop the nginx instance */ - stop() { - let done = plugins.smartpromise.defer(); - if (typeof this.nginxChildProcess != 'undefined') { + public async stop() { + if (this.nginxChildProcess) { this.smartshellInstance.exec('nginx -s quit'); this.started = false; - plugins.smartlog.defaultLogger.log('info', 'stopped Nginx!'); + this.smartNginxRef.logger.log('info', 'stopped Nginx!'); } else { - plugins.smartlog.defaultLogger.log('info', 'nginx already stopped!'); + this.smartNginxRef.logger.log('info', 'nginx already stopped!'); } - done.resolve(); - return done.promise; } /** * checks if nginx is in path */ - check(): boolean { + public check(): boolean { return; } } diff --git a/ts/smartnginx.classes.smartnginx.ts b/ts/smartnginx.classes.smartnginx.ts index 8fa1b33..1888448 100644 --- a/ts/smartnginx.classes.smartnginx.ts +++ b/ts/smartnginx.classes.smartnginx.ts @@ -3,20 +3,20 @@ import * as paths from './smartnginx.paths'; import * as snippets from './smartnginx.snippets'; import { NginxHost } from './smartnginx.classes.nginxhost'; import { NginxProcess } from './smartnginx.classes.nginxprocess'; -import { CertHandler } from './smartnginx.classes.certhandler'; -let allConfigs: SmartNginx[] = []; +import { IHostConfig } from './interfaces/hostconfig'; /** * main class that manages a NginxInstance */ export class SmartNginx { - certHandler = new CertHandler(); - hosts: NginxHost[] = []; - nginxProcess: NginxProcess = new NginxProcess(this); - isDeployed: boolean = false; - constructor() { - - }; + public logger: plugins.smartlog.Smartlog; + private hosts = new plugins.lik.Objectmap(); + public nginxProcess: NginxProcess = new NginxProcess(this); + constructor(optionsArg: { logger?: plugins.smartlog.Smartlog }) { + optionsArg.logger + ? (this.logger = optionsArg.logger) + : (this.logger = plugins.smartlog.defaultLogger); + } // =================== // interact with Hosts @@ -26,61 +26,57 @@ export class SmartNginx { * add a host * @param nginxHostArg */ - addHost(hostNameArg: string, destinationIp: string): NginxHost { - const nginxHost = new NginxHost(this, { - hostName: hostNameArg, - destination: destinationIp - }) - this.hosts.push(nginxHost); + public addHost(optionsArg: IHostConfig): NginxHost { + const nginxHost = new NginxHost(this, optionsArg); + this.hosts.add(nginxHost); return nginxHost; } - getNginxHostByHostName(hostNameArg: string): NginxHost { + /** + * Gets a NginxHost by hostname + * @param hostNameArg + */ + public getNginxHostByHostName(hostNameArg: string): NginxHost { return this.hosts.find(nginxHost => { return nginxHost.hostName === hostNameArg; - }) + }); } - - /** * listHosts */ - listHosts(): NginxHost[] { - return this.hosts; + public listHosts(): NginxHost[] { + return this.hosts.getArray(); } /** * remove a Host * @param nginxHostArg */ - removeHost(nginxHostArg: NginxHost) {} - + public removeHost(nginxHostArg: NginxHost) { + this.hosts.remove(nginxHostArg); + } + /** * clean all hosts */ - clean() { - this.hosts = []; + public wipeHosts() { + this.hosts.wipe(); } /** * deploy the current stack and restart nginx */ - async deploy() { - plugins.smartfile.fs.ensureDirSync(paths.nginxConfigBase); - plugins.smartfile.fs.ensureDirSync(paths.nginxHostFileBase); - plugins.smartfile.fs.ensureDirSync(paths.nginxCertBase); - for (let config of allConfigs) { - config.isDeployed = false; - } - this.isDeployed = true; + public async deploy() { // write base config + plugins.smartfile.fs.ensureDirSync(paths.nginxConfigDirPath); plugins.smartfile.memory.toFsSync(snippets.getBaseConfigString(), paths.nginxConfFile); + // deploy hosts - let promiseArray = []; - for (let host of this.hosts) { + plugins.smartfile.fs.ensureEmptyDirSync(paths.nginxHostDirPath); + for (const host of this.hosts.getArray()) { await host.deploy(); - plugins.smartlog.defaultLogger.log('info', `Host ${host.hostName} deployed!`); - this.nginxProcess.reloadConfig(); - }; + this.logger.log('info', `Host ${host.hostName} deployed!`); + } + this.nginxProcess.reloadConfig(); } } diff --git a/ts/smartnginx.paths.ts b/ts/smartnginx.paths.ts index dfe238d..d52e733 100644 --- a/ts/smartnginx.paths.ts +++ b/ts/smartnginx.paths.ts @@ -1,11 +1,9 @@ import * as plugins from './smartnginx.plugins'; // directories -export let packageBase = plugins.path.join(__dirname, '../'); -export let nginxConfigBase = plugins.path.join(packageBase, 'nginxconfig'); - -export let nginxHostFileBase = plugins.path.join(nginxConfigBase, 'hosts'); -export let nginxCertBase = plugins.path.join(nginxConfigBase, 'cert'); +export const packageBase = plugins.path.join(__dirname, '../'); +export const nginxConfigDirPath = plugins.path.join(packageBase, 'nginxconfig'); +export const nginxHostDirPath = plugins.path.join(nginxConfigDirPath, 'hosts'); // files -export let nginxConfFile = plugins.path.join(nginxConfigBase, 'nginx.conf'); +export const nginxConfFile = plugins.path.join(nginxConfigDirPath, 'nginx.conf'); \ No newline at end of file diff --git a/ts/smartnginx.plugins.ts b/ts/smartnginx.plugins.ts index add5bcf..182f326 100644 --- a/ts/smartnginx.plugins.ts +++ b/ts/smartnginx.plugins.ts @@ -1,17 +1,14 @@ -import * as smartlog from '@pushrocks/smartlog'; -import * as childProcess from 'child_process'; +// native import * as path from 'path'; + +export { path }; + +// @pushrocks scope +import * as lik from '@pushrocks/lik'; +import * as smartlog from '@pushrocks/smartlog'; import * as smartpromise from '@pushrocks/smartpromise'; import * as smartshell from '@pushrocks/smartshell'; import * as smartfile from '@pushrocks/smartfile'; import * as smartstring from '@pushrocks/smartstring'; -export { - smartlog, - childProcess, - path, - smartpromise, - smartshell, - smartfile, - smartstring -} \ No newline at end of file +export { lik, smartlog, smartpromise, smartshell, smartfile, smartstring }; diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..d4ea2e9 --- /dev/null +++ b/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": ["tslint:latest", "tslint-config-prettier"], + "rules": { + "semicolon": [true, "always"], + "no-console": false, + "ordered-imports": false, + "object-literal-sort-keys": false, + "member-ordering": { + "options":{ + "order": [ + "static-method" + ] + } + } + }, + "defaultSeverity": "warning" +}