diff --git a/license b/license index 4664895..a253b1a 100644 --- a/license +++ b/license @@ -1,4 +1,5 @@ Copyright (c) 2019 Lossless GmbH (hello@lossless.com) +Copyright (c) 2017-2019, braces lab Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/package-lock.json b/package-lock.json index ffeb813..001d544 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70,7 +70,6 @@ "version": "2.0.1", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fconsolecolor/-/consolecolor-2.0.1.tgz", "integrity": "sha512-iOFCHVeFZ2OywbdwSxVI4/wokkcLrXVdHLgvMmkNhJ220eeLgjNZWx3EJo3vNW3zq5ybCSCUIq0878djBxrWpw==", - "dev": true, "requires": { "ansi-256-colors": "^1.1.0" } @@ -97,7 +96,6 @@ "version": "3.0.5", "resolved": "https://verdaccio.lossless.one/@pushrocks%2flik/-/lik-3.0.5.tgz", "integrity": "sha512-pc5Nq0WUysS34qPpyiZXiX254kL3vyRVbt3D36Q5QU+eHhxAThHofSzgOdyVHUZU2WFoaMlKowIVsyUFzIkfdw==", - "dev": true, "requires": { "@pushrocks/smartdelay": "^2.0.2", "@pushrocks/smartpromise": "^2.0.5", @@ -111,8 +109,7 @@ "@pushrocks/smartpromise": { "version": "2.0.5", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartpromise/-/smartpromise-2.0.5.tgz", - "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==", - "dev": true + "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==" } } }, @@ -143,7 +140,6 @@ "version": "2.0.3", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartdelay/-/smartdelay-2.0.3.tgz", "integrity": "sha512-TXKDDqsc7sBTLl+oiYNaF6IdNk1n70i8ur8QfwcUU6tegTnrEkvMWy9h5Zdty/fq1ioCNpKLvuXoA+fgYVwKGQ==", - "dev": true, "requires": { "@pushrocks/smartpromise": "^3.0.2" } @@ -152,7 +148,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" }, @@ -160,8 +155,7 @@ "@pushrocks/smartpromise": { "version": "2.0.5", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartpromise/-/smartpromise-2.0.5.tgz", - "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==", - "dev": true + "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==" } } }, @@ -169,7 +163,6 @@ "version": "1.0.15", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartexit/-/smartexit-1.0.15.tgz", "integrity": "sha512-pvJBmF13spcDN+O8rSpYlKBOObyfW+omZKQr3hhSMT1VHMEYV8e/njsA19Cg4C2DfLPv+cRFFgPn27zJpleRsQ==", - "dev": true, "requires": { "@pushrocks/lik": "^3.0.5", "@pushrocks/smartdelay": "^2.0.3", @@ -191,28 +184,64 @@ "glob": "^7.1.3", "js-yaml": "^3.13.1", "vinyl-file": "^3.0.0" + }, + "dependencies": { + "@types/fs-extra": { + "version": "5.1.0", + "resolved": "https://verdaccio.lossless.one/@types%2ffs-extra/-/fs-extra-5.1.0.tgz", + "integrity": "sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://verdaccio.lossless.one/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@pushrocks/smartlog": { "version": "2.0.19", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartlog/-/smartlog-2.0.19.tgz", "integrity": "sha512-I2mDx7WcUlADYWxu5nNP3NSJv95YrCZoG/rarbEqovK7pJQ9a0aINmIcCHkQeL1VSWvxgvhXwHyV/yNEJ4zh3Q==", - "dev": true, "requires": { "@pushrocks/smartlog-interfaces": "^2.0.5" } }, + "@pushrocks/smartlog-destination-local": { + "version": "8.0.2", + "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartlog-destination-local/-/smartlog-destination-local-8.0.2.tgz", + "integrity": "sha512-+Ed7WxvBF6yNtsT8cZuxkm+NaeCtCUyjt+UVJD/5zetLGMHJ7r0d9texFP771ss4Yu9as18kTs3ompCrxQw+GQ==", + "requires": { + "@pushrocks/consolecolor": "^2.0.1", + "@pushrocks/smartlog-interfaces": "^2.0.2", + "@pushrocks/smartpromise": "^2.0.5" + }, + "dependencies": { + "@pushrocks/smartpromise": { + "version": "2.0.5", + "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartpromise/-/smartpromise-2.0.5.tgz", + "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==" + } + } + }, "@pushrocks/smartlog-interfaces": { "version": "2.0.5", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartlog-interfaces/-/smartlog-interfaces-2.0.5.tgz", - "integrity": "sha512-eLNlRpDwy3E+6v/B6fo/NiAo+UxBO3SxKgIIsgUGbWfVpsyUi0PG2xfVCdhJlhL1AsRRvKglfHSOB8qKE+XCLw==", - "dev": true + "integrity": "sha512-eLNlRpDwy3E+6v/B6fo/NiAo+UxBO3SxKgIIsgUGbWfVpsyUi0PG2xfVCdhJlhL1AsRRvKglfHSOB8qKE+XCLw==" }, "@pushrocks/smartlog-source-ora": { "version": "1.0.8", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartlog-source-ora/-/smartlog-source-ora-1.0.8.tgz", "integrity": "sha512-yPFACo/1gHx2o43qYLJ6LB5AUvSFB42abYynySpaIZfQKzdz09eJB/LMbVdOKPObwk7bcma5owyK5lPHicG9Ig==", - "dev": true, "requires": { "@pushrocks/smartlog-interfaces": "^2.0.5", "ora": "^3.4.0" @@ -246,8 +275,7 @@ "@pushrocks/smartpromise": { "version": "3.0.2", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartpromise/-/smartpromise-3.0.2.tgz", - "integrity": "sha512-jmrJMUEmBCWChWK8CIcx4Vw3wv/8OgVNmkaxJrbs+WMaoRUfJtpWWJfrAwwHWt9ZXJbarJ+CwfwfYiiZXymndQ==", - "dev": true + "integrity": "sha512-jmrJMUEmBCWChWK8CIcx4Vw3wv/8OgVNmkaxJrbs+WMaoRUfJtpWWJfrAwwHWt9ZXJbarJ+CwfwfYiiZXymndQ==" }, "@pushrocks/smartrequest": { "version": "1.1.16", @@ -264,7 +292,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", @@ -275,16 +302,14 @@ "@pushrocks/smartpromise": { "version": "2.0.5", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartpromise/-/smartpromise-2.0.5.tgz", - "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==", - "dev": true + "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==" } } }, "@pushrocks/smartshell": { - "version": "2.0.23", - "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartshell/-/smartshell-2.0.23.tgz", - "integrity": "sha512-+YXacX/sp4f+iBYm4vAoxrq/c8WCHnFhMaW66l3R08stl0eezW3SytoSlnr6R+JT1xqnBzIItDfCyyRC3uEVnw==", - "dev": true, + "version": "2.0.25", + "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartshell/-/smartshell-2.0.25.tgz", + "integrity": "sha512-sYVHOhBRdr+CkjS+o1SDtB5058ZYxTPAYuexx2ydl2g+57KNdEcSRWN/2mOv5+NFH+tvvgtnUjC3AclC9CwJ4A==", "requires": { "@pushrocks/smartdelay": "^2.0.3", "@pushrocks/smartexit": "^1.0.15", @@ -297,7 +322,6 @@ "version": "3.0.12", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmarttime/-/smarttime-3.0.12.tgz", "integrity": "sha512-NoMt1NUhNqcF5y7fCTHoC3d/+MobzgNUg6yHbSGxFRaentQzCrMPNahQIVLbrAStf03LUUBePUjSRdPYucP1gw==", - "dev": true, "requires": { "@pushrocks/smartpromise": "^3.0.2", "@types/cron": "^1.7.1", @@ -346,7 +370,6 @@ "version": "1.7.1", "resolved": "https://verdaccio.lossless.one/@types%2fcron/-/cron-1.7.1.tgz", "integrity": "sha512-48brwgU18DqA0mQX1As5OcJEo1yNjaXMM6Mk4r8K1dOzLJRQ37FE/kCivKx7ClKEHfhX2FdcxKzJ1B744a+V3A==", - "dev": true, "requires": { "@types/node": "*", "moment": ">=2.14.0" @@ -371,10 +394,9 @@ } }, "@types/fs-extra": { - "version": "5.1.0", - "resolved": "https://verdaccio.lossless.one/@types%2ffs-extra/-/fs-extra-5.1.0.tgz", - "integrity": "sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==", - "dev": true, + "version": "8.0.0", + "resolved": "https://verdaccio.lossless.one/@types%2ffs-extra/-/fs-extra-8.0.0.tgz", + "integrity": "sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q==", "requires": { "@types/node": "*" } @@ -382,20 +404,17 @@ "@types/luxon": { "version": "1.15.1", "resolved": "https://verdaccio.lossless.one/@types%2fluxon/-/luxon-1.15.1.tgz", - "integrity": "sha512-SOGSpxsAoR+pHLev7oFGbQ4mZCmfcmYY2xsv2+/UeEG2rcJA30k5NVux3cW9rgTe2EVtrqFG+KtMs6ERZsTGKA==", - "dev": true + "integrity": "sha512-SOGSpxsAoR+pHLev7oFGbQ4mZCmfcmYY2xsv2+/UeEG2rcJA30k5NVux3cW9rgTe2EVtrqFG+KtMs6ERZsTGKA==" }, "@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.14.9", "resolved": "https://verdaccio.lossless.one/@types%2fnode/-/node-10.14.9.tgz", - "integrity": "sha512-NelG/dSahlXYtSoVPErrp06tYFrvzj8XLWmKA+X8x0W//4MqbUyZu++giUG/v0bjAT6/Qxa8IjodrfdACyb0Fg==", - "dev": true + "integrity": "sha512-NelG/dSahlXYtSoVPErrp06tYFrvzj8XLWmKA+X8x0W//4MqbUyZu++giUG/v0bjAT6/Qxa8IjodrfdACyb0Fg==" }, "@types/vinyl": { "version": "2.0.3", @@ -409,8 +428,7 @@ "@types/which": { "version": "1.3.1", "resolved": "https://verdaccio.lossless.one/@types%2fwhich/-/which-1.3.1.tgz", - "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==", - "dev": true + "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==" }, "@types/yargs": { "version": "12.0.12", @@ -421,8 +439,7 @@ "ansi-256-colors": { "version": "1.1.0", "resolved": "https://verdaccio.lossless.one/ansi-256-colors/-/ansi-256-colors-1.1.0.tgz", - "integrity": "sha1-kQ3lDvzHwJ49gvL4er1rcAwYgYo=", - "dev": true + "integrity": "sha1-kQ3lDvzHwJ49gvL4er1rcAwYgYo=" }, "ansi-regex": { "version": "3.0.0", @@ -434,7 +451,6 @@ "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" } @@ -469,14 +485,12 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://verdaccio.lossless.one/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "brace-expansion": { "version": "1.1.11", "resolved": "https://verdaccio.lossless.one/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -533,7 +547,6 @@ "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", @@ -550,16 +563,14 @@ "version": "2.1.0", "resolved": "https://verdaccio.lossless.one/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, "requires": { "restore-cursor": "^2.0.0" } }, "cli-spinners": { - "version": "2.1.0", - "resolved": "https://verdaccio.lossless.one/cli-spinners/-/cli-spinners-2.1.0.tgz", - "integrity": "sha512-8B00fJOEh1HPrx4fo5eW16XmE1PcL1tGpGrxy63CXGP9nHdPBN63X75hA1zhvQuhVztJWLqV58Roj2qlNM7cAA==", - "dev": true + "version": "2.2.0", + "resolved": "https://verdaccio.lossless.one/cli-spinners/-/cli-spinners-2.2.0.tgz", + "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==" }, "cliui": { "version": "4.1.0", @@ -611,7 +622,6 @@ "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" } @@ -619,8 +629,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://verdaccio.lossless.one/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "combined-stream": { "version": "1.0.8", @@ -640,8 +649,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://verdaccio.lossless.one/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "core-util-is": { "version": "1.0.2", @@ -653,7 +661,6 @@ "version": "1.7.1", "resolved": "https://verdaccio.lossless.one/cron/-/cron-1.7.1.tgz", "integrity": "sha512-gmMB/pJcqUVs/NklR1sCGlNYM7TizEw+1gebz20BMc/8bTm/r7QUp3ZPSPlG8Z5XRlvb7qhjEjq/+bdIfUCL2A==", - "dev": true, "requires": { "moment-timezone": "^0.5.x" } @@ -690,7 +697,6 @@ "version": "1.0.3", "resolved": "https://verdaccio.lossless.one/defaults/-/defaults-1.0.3.tgz", "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, "requires": { "clone": "^1.0.2" }, @@ -698,8 +704,7 @@ "clone": { "version": "1.0.4", "resolved": "https://verdaccio.lossless.one/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" } } }, @@ -727,8 +732,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://verdaccio.lossless.one/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "esprima": { "version": "4.0.1", @@ -796,14 +800,20 @@ } }, "fs-extra": { - "version": "7.0.1", - "resolved": "https://verdaccio.lossless.one/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, + "version": "8.1.0", + "resolved": "https://verdaccio.lossless.one/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "requires": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://verdaccio.lossless.one/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" + } } }, "fs.realpath": { @@ -850,14 +860,12 @@ "graceful-fs": { "version": "4.1.15", "resolved": "https://verdaccio.lossless.one/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "has-flag": { "version": "3.0.0", "resolved": "https://verdaccio.lossless.one/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "inflight": { "version": "1.0.6", @@ -914,8 +922,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://verdaccio.lossless.one/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "js-tokens": { "version": "4.0.0", @@ -937,7 +944,6 @@ "version": "4.0.0", "resolved": "https://verdaccio.lossless.one/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -965,7 +971,6 @@ "version": "2.2.0", "resolved": "https://verdaccio.lossless.one/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, "requires": { "chalk": "^2.0.1" } @@ -973,8 +978,7 @@ "luxon": { "version": "1.16.0", "resolved": "https://verdaccio.lossless.one/luxon/-/luxon-1.16.0.tgz", - "integrity": "sha512-qaqB+JwpGwtl7UbIXng3A/l4W/ySBr8drQvwtMLZBMiLD2V+0fEnPWMrs+UjnIy9PsktazQaKvwDUCLzoWz0Hw==", - "dev": true + "integrity": "sha512-qaqB+JwpGwtl7UbIXng3A/l4W/ySBr8drQvwtMLZBMiLD2V+0fEnPWMrs+UjnIy9PsktazQaKvwDUCLzoWz0Hw==" }, "make-error": { "version": "1.3.5", @@ -1027,7 +1031,6 @@ "version": "3.0.4", "resolved": "https://verdaccio.lossless.one/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1052,14 +1055,12 @@ "moment": { "version": "2.24.0", "resolved": "https://verdaccio.lossless.one/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", - "dev": true + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "moment-timezone": { "version": "0.5.25", "resolved": "https://verdaccio.lossless.one/moment-timezone/-/moment-timezone-0.5.25.tgz", "integrity": "sha512-DgEaTyN/z0HFaVcVbSyVCUU6HeFdnNC3vE4c9cgu2dgMTvjBUBdBzWfasTBmAW45u5OIMeCJtU8yNjM22DHucw==", - "dev": true, "requires": { "moment": ">= 2.9.0" } @@ -1098,7 +1099,6 @@ "version": "2.0.1", "resolved": "https://verdaccio.lossless.one/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, "requires": { "mimic-fn": "^1.0.0" }, @@ -1106,8 +1106,7 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://verdaccio.lossless.one/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" } } }, @@ -1115,7 +1114,6 @@ "version": "3.4.0", "resolved": "https://verdaccio.lossless.one/ora/-/ora-3.4.0.tgz", "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", - "dev": true, "requires": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -1128,14 +1126,12 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://verdaccio.lossless.one/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "strip-ansi": { "version": "5.2.0", "resolved": "https://verdaccio.lossless.one/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, "requires": { "ansi-regex": "^4.1.0" } @@ -1299,7 +1295,6 @@ "version": "2.0.0", "resolved": "https://verdaccio.lossless.one/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -1309,7 +1304,6 @@ "version": "6.5.2", "resolved": "https://verdaccio.lossless.one/rxjs/-/rxjs-6.5.2.tgz", "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", - "dev": true, "requires": { "tslib": "^1.9.0" } @@ -1350,8 +1344,7 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://verdaccio.lossless.one/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "smartchai": { "version": "2.0.1", @@ -1455,7 +1448,6 @@ "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" } @@ -1463,8 +1455,7 @@ "symbol-tree": { "version": "3.2.4", "resolved": "https://verdaccio.lossless.one/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "ts-node": { "version": "8.3.0", @@ -1482,8 +1473,7 @@ "tslib": { "version": "1.10.0", "resolved": "https://verdaccio.lossless.one/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, "tslint": { "version": "5.17.0", @@ -1544,8 +1534,7 @@ "universalify": { "version": "0.1.2", "resolved": "https://verdaccio.lossless.one/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "util-deprecate": { "version": "1.0.2", @@ -1584,7 +1573,6 @@ "version": "1.0.1", "resolved": "https://verdaccio.lossless.one/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, "requires": { "defaults": "^1.0.3" } @@ -1593,7 +1581,6 @@ "version": "1.3.1", "resolved": "https://verdaccio.lossless.one/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/package.json b/package.json index fb47e74..f31fa65 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,13 @@ "tslint": "^5.11.0", "tslint-config-prettier": "^1.15.0" }, - "dependencies": {}, + "dependencies": { + "@pushrocks/smartlog": "^2.0.19", + "@pushrocks/smartlog-destination-local": "^8.0.2", + "@pushrocks/smartshell": "^2.0.25", + "@types/fs-extra": "^8.0.0", + "fs-extra": "^8.1.0" + }, "files": [ "ts/*", "ts_web/*", diff --git a/ts/smartdaemon.plugins.ts b/ts/smartdaemon.plugins.ts index 29aa9da..1ec89ec 100644 --- a/ts/smartdaemon.plugins.ts +++ b/ts/smartdaemon.plugins.ts @@ -1,2 +1,26 @@ -const removeme = {}; -export { removeme }; +// node native scope +import * as path from 'path'; + + +export { + path +}; + +// @pushrocks scope +import * as smartshell from '@pushrocks/smartshell'; +import * as smartlog from '@pushrocks/smartlog'; +import * as smartlogDestinationLocal from '@pushrocks/smartlog-destination-local'; + +export { + smartshell, + smartlog, + smartlogDestinationLocal +}; + +// third party + +import * as fs from 'fs-extra'; + +export { + fs +}; \ No newline at end of file diff --git a/ts/smartdaemon.settings.ts b/ts/smartdaemon.settings.ts new file mode 100644 index 0000000..b83b13a --- /dev/null +++ b/ts/smartdaemon.settings.ts @@ -0,0 +1,174 @@ +export const settingsReference = { + name: { + cli: { + short: 'n', + long: 'service', + value: '[name]', + description: 'Service name' + }, + mandatory: true + }, + description: { + cli: { + short: 'd', + long: 'description', + value: '[description]', + description: 'Service description' + }, + default: '{name} service' + }, + author: { + cli: { + short: 'k', + long: 'author', + value: '[author]', + description: 'Service author' + } + }, + user: { + cli: { + short: 'u', + long: 'user', + value: '[user]', + description: 'User to run service as' + } + }, + group: { + cli: { + short: 'g', + long: 'group', + value: '[group]', + description: 'Group to run service as' + } + }, + app: { + cli: { + short: 'A', + long: 'app', + value: '[app]', + description: 'Application main file' + }, + default: 'main.js' + + }, + cwd: { + cli: { + short: 'c', + long: 'cwd', + value: '[path]', + description: 'Application cwd' + }, + mandatory: true, + fs: true + }, + 'app.args': { + cli: { + short: 'p', + long: 'app.args', + value: '[args]', + description: 'Application arguments' + } + }, + env: { + cli: { + short: 'e', + long: 'env', + value: '[NAME=VALUE]', + description: 'Environment variables to set in systemd job', + function: (v, vars) => { + const _v = v.split('=') + vars[_v[0]] = _v[1]; return vars + }, + store: [] + } + }, + pid: { + cli: { + short: 'P', + long: 'pid', + value: '[file]', + description: 'Service pid file' + }, + default: '/var/run/{name}.pid' + }, + log: { + cli: { + short: 'L', + long: 'log', + value: '[log]', + description: 'Service log file' + }, + default: '/var/log/{name}/log' + }, + error: { + cli: { + short: 'E', + long: 'error', + value: '[error]', + description: 'Service error file' + }, + default: '/var/log/{name}/error' + }, + engine: { + cli: { + short: 'X', + long: 'engine', + value: '[node|forever|pm2]', + description: 'Service engine (node|forever|pm2)' + }, + default: 'node', + mandatory: true + }, + 'engine.bin': { + cli: { + short: 'b', + long: 'engine.bin', + value: '[bin]', + description: 'Service engine bin' + }, + default: '/usr/bin/{engine}', + fs: true + }, + 'engine.args': { + cli: { + short: 't', + long: 'engine.args', + value: '[eargs]', + description: 'Service engine args' + } + }, + logrotate: { + cli: { + short: 'l', + long: 'logrotate', + description: 'Add logrotate config' + } + // default false + }, + 'logrotate.rotate': { + cli: { + short: 'R', + long: 'logrotate.rotate', + value: '[rotate]', + description: 'Logrotate rotations' + }, + default: 10 + + }, + 'logrotate.frequency': { + cli: { + short: 'F', + long: 'logrotate.frequency', + value: '[frequency]', + description: 'Logrotate frequency' + }, + default: 'daily' + }, + noroot: { + cli: { + short: 'w', + long: 'noroot', + description: 'Skip check for root permission' + } + } +}; diff --git a/ts/smartdaemon.setup.ts b/ts/smartdaemon.setup.ts new file mode 100644 index 0000000..6e003c3 --- /dev/null +++ b/ts/smartdaemon.setup.ts @@ -0,0 +1,259 @@ +import * as plugins from './smartdaemon.plugins'; + +import { logger } from './smartdamon.logging'; +import { settingsReference } from './smartdaemon.settings'; +import { templateReference } from './smartdaemon.templates'; + +const smartshellInstance = new plugins.smartshell.Smartshell({ + executor: 'bash' +}); + +/** + * print success message + * @method setup.success + * @param {string} message + */ +export const setupSuccess = (message: string) => { + logger.log('success', `service-systemd: ${message}`); +}; + +/** + * print error message + * @method setup.fail + * @param {string} message + */ +export const setupFail = (message) => { + logger.log('error', `service-systemd ${message}`); +}; + +/** + * install the service + * can also be used to update the service + * @method setup.add + * @param {object} settings + * @return {string} + */ +export const setupAdd = async (settings) => { + setupCheckSettings(settings); + const contents = setupParse(settings); + await setupCheckPaths(settings); + await setupAddLog(settings); + await setupAddScripts(settings, contents); + await setupAddLogrotate(settings, contents); + return `service ${settings.name} installed`; +}; + +/** + * remove the service + * @method setup.remove + * @param {string} service service name + * @return {string} + */ +export const setupRemove = async (service) => { + if (!service) { + throw new Error('Missing argument: service name'); + } + + const cmd = `systemctl disable ${service}.service`; + logger.log('info', `service-systemd > ${cmd}`); + await smartshellInstance.exec(cmd); + + let file = plugins.path.join('/etc/systemd/system', `${service}.service`); + logger.log('info', `service-systemd remove ${file}`); + await plugins.fs.unlink(file); + + file = plugins.path.join('/usr/local/bin', `systemd-${service}-start`); + logger.log('info', `service-systemd remove ${file}`); + await plugins.fs.unlink(file); + + file = plugins.path.join('/etc/logrotate.d', service); + logger.log('info', `service-systemd remove ${file}`); + await plugins.fs.unlink(file); + return `service ${service} uninstalled`; +}; + +/** + * check mandatories params and paths + * @method setup.checkSettings + * @param {object} settings + */ +export const setupCheckSettings = (settings) => { + if (!settings.name) { + settings.name = settings.service; + } + + delete settings.service; + + const paths = []; + for (const optionArg of Object.keys(settingsReference)) { + const option = settingsReference[optionArg]; + if (option.mandatory && !settings[optionArg]) { + throw new Error(`Missing ${optionArg} in settings file or arguments`); + } + if (option.fs) { + settings[optionArg] = plugins.path.resolve(settings[optionArg]); + } + } +}; + +/** + * check mandatories params and paths + * @method setup.checkPaths + * @param {object} settings + */ +export const setupCheckPaths = async (settings) => { + const exists = []; + for (const optionArg of Object.keys(settingsReference)) { + const option = settingsReference[optionArg]; + if (option.fs) { + exists.push((async () => { + const exists2 = await plugins.fs.pathExists(settings[optionArg]); + if (!exists2) { + throw Error(`path ${settings[optionArg]} (${optionArg}) does not exists`); + } + })()); + } + } + + await Promise.all(exists); +}; + +/** + * merge settings with templates + * create scripts contents + * @method setup.parse + * @param {object} settings + */ +export const setupParse = (settings) => { + + if (settings.env) { + settings.envs = ''; + for (const key of Object.keys(settings.env)) { + settings.envs += 'Environment=' + key + '=' + settings.env[key] + '\n'; + } + } + settings.user = settings.user + ? `User=${settings.user}` + : ''; + settings.group = settings.group + ? `Group=${settings.group}` + : ''; + + settings.date = (new Date()).toString(); + + for (const key in settings) { + if (typeof settings[key] === 'string') { + settings[key] = plugins.string.template(settings[key], settings, true); + } + } + + const _service = plugins.string.template(templateReference.engines[settings.engine].service, settings, true); + const _start = plugins.string.template(templateReference.engines[settings.engine].start, settings, true); + const _stop = plugins.string.template(templateReference.engines[settings.engine].stop, settings, true); + const _logrotate = settings.logrotate ? plugins.string.template(templateReference.logrotate, settings, true) : ''; + + return { + service: _service, + start: _start, + stop: _stop, + logrotate: _logrotate + }; +}; + +/** + * write scripts and run commands to install the service + * @method setup.addScripts + * @param {object} settings + * @param {object} contents scripts contents + * @param {string} contents.start + * @param {string} contents.stop + * @param {string} contents.service + */ +export const setupAddScripts = async (settings, contents) => { + const service = plugins.path.join('/etc/systemd/system', `${settings.name}.service`); + const tasks = []; + + if (contents.start) { + tasks.push(() => { + const start = plugins.path.join('/usr/local/bin', `systemd-${settings.name}-start`); + logger.log('info', `service-systemd: write file ${start}`); + return plugins.fs.writeFile(start, contents.start, 'utf8'); + }); + } + + if (contents.stop) { + tasks.push(() => { + const stop = plugins.path.join('/usr/local/bin', `systemd-${settings.name}-stop`); + logger.log('info', `service-systemd: write file ${stop}`); + return plugins.fs.writeFile(stop, contents.stop, { + encoding: 'utf8' + }); + }); + } + + if (contents.start || contents.stop) { + tasks.push(() => { + const cmd = `chmod a+x /usr/local/bin/systemd-${settings.name}*`; + logger.log('info', `service-systemd > ${cmd}`); + return smartshellInstance.exec(cmd); + }); + } + + tasks.push(() => { + logger.log('info', `service-systemd write file ${service}`); + return plugins.fs.writeFile(service, contents.service, 'utf8'); + }); + + tasks.push(() => { + const cmd = `systemctl enable ${service};systemctl daemon-reload`; + logger.log('info', `service-systemd > ${cmd}`); + return smartshellInstance.exec(cmd); + }); + + for (const task of tasks) { + await task(); + } +}; + +/** + * ensure dirs for log files + * @method setup.addLog + * @param {object} settings + */ +export const setupAddLog = async (settings) => { + const tasks = []; + let dirLog; + let dirError; + + if (settings.log) { + dirLog = plugins.path.dirname(settings.log); + logger.log('info', `service-systemd: ensure dir ${dirLog}`); + tasks.push(plugins.fs.ensureDir(dirLog)); + } + if (settings.error) { + dirError = plugins.path.dirname(settings.error); + if (dirError !== dirLog) { + logger.log('info', `service-systemd ensure dir ${dirError}`); + tasks.push(plugins.fs.ensureDir(dirError)); + } + } + await Promise.all(tasks); +}; + +/** + * write logrotate conf script + * @method setup.addLogrotate + * @param {object} settings + * @param {object} contents scripts contents + * @param {string} contents.start + * @param {string} contents.stop + * @param {string} contents.service + */ +export const setupAddLogrotate = async (settings, contents) => { + if (!settings.logrotate) { + return; + } + const file = plugins.path.join('/etc/logrotate.d/', settings.name); + logger.log('info', `service-systemd: write logrotate file ${file}`); + await plugins.fs.writeFile(file, contents.logrotate, 'utf8'); +}; diff --git a/ts/smartdaemon.templates.ts b/ts/smartdaemon.templates.ts new file mode 100644 index 0000000..26fb1a3 --- /dev/null +++ b/ts/smartdaemon.templates.ts @@ -0,0 +1,75 @@ +export const templateReference = { + engines: { + node: { + service: + '# Generated by service-systemd on {{date}}\n' + + '[Unit]\n' + + 'Description={description}\n' + + 'Requires=network.target\n' + + 'After=network.target\n' + + '\n' + + '[Service]\n' + + 'Type=simple\n' + + 'ExecStart={engine.bin} {engine.args} {app} {app.args}\n' + + 'WorkingDirectory={cwd}\n' + + 'Restart=on-failure\n' + + '{envs}\n' + + 'LimitNOFILE=infinity\n' + + 'LimitCORE=infinity\n' + + 'StandardInput=null\n' + + 'StandardOutput=syslog\n' + + 'StandardError=syslog\n' + + 'Restart=always\n' + + 'SyslogIdentifier={name}\n' + + 'PIDFile={pid}\n' + + '{user}\n' + + '{group}\n' + + '[Install]\n' + + 'WantedBy=multi-user.target\n' + }, + forever: { + service: + '# Generated by service-systemd on {date}\n' + + '[Unit]\n' + + 'Description={description}\n' + + 'Requires=network.target\n' + + 'After=network.target\n' + + '\n' + + '[Service]\n' + + 'Type=forking\n' + + 'WorkingDirectory={cwd}\n' + + '{envs}\n' + + 'ExecStart=/usr/local/bin/systemd-{name}-start\n' + + 'ExecStop=/usr/local/bin/systemd-{name}-stop\n' + + 'PIDFile={pid}\n' + + '{user}\n' + + '{group}\n' + + '[Install]\n' + + 'WantedBy=multi-user.target\n', + start: + '#!/bin/bash\n' + + '{engine.bin} start ' + + '--pidFile {pid} ' + + '--uid {name} ' + + '--sourceDir {cwd} ' + + '-l {log} ' + + '-e {error} ' + + '--append --minUptime 5000 --spinSleepTime 2000 ' + + '{engine.args} ' + + '{app} {app.args}\n' + + 'exit 0', + stop: '#!/bin/bash\n' + '{engine.bin} stop {name}\n' + 'exit 0' + } + }, + logrotate: + '{log}\n{error} {\n' + + ' {logrotate.frequency}\n' + + ' rotate {logrotate.rotate}\n' + + ' create\n' + + ' missingok\n' + + ' notifempty\n' + + ' compress\n' + + ' sharedscripts\n' + + // ' postrotate\n{restart}\n' + + ' endscript\n}' +}; diff --git a/ts/smartdamon.logging.ts b/ts/smartdamon.logging.ts new file mode 100644 index 0000000..43d5885 --- /dev/null +++ b/ts/smartdamon.logging.ts @@ -0,0 +1,15 @@ +import * as plugins from './smartdaemon.plugins'; + +export const logger = new plugins.smartlog.Smartlog({ + logContext: { + company: 'Some Company', + companyunit: 'Some CompanyUnit', + containerName: 'Some Containername', + environment: 'local', + runtime: 'node', + zone: 'gitzone' + }, + minimumLogLevel: 'silly' +}); + +logger.addLogDestination(new plugins.smartlogDestinationLocal.DestinationLocal());