Compare commits
28 Commits
Author | SHA1 | Date | |
---|---|---|---|
119f20915e | |||
ce1fa6640b | |||
8957e03445 | |||
3df86bee10 | |||
65326710ab | |||
2e174c9f55 | |||
9e42910456 | |||
ff85cee528 | |||
2a9fff0185 | |||
67689d79bd | |||
f8c851de97 | |||
09e9d8c190 | |||
80f5df3317 | |||
6cf3ff6e83 | |||
ceb30c7ac2 | |||
0df90eec5d | |||
261031a49c | |||
615cc6aa7c | |||
c9aa7fed48 | |||
44d30fc4d6 | |||
dd5e1a978d | |||
692602b463 | |||
382b694027 | |||
de831b086f | |||
01c7d2e482 | |||
49ebf991a2 | |||
513337355f | |||
5e5a679f99 |
270
package-lock.json
generated
270
package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@pushrocks/smartdaemon",
|
"name": "@pushrocks/smartdaemon",
|
||||||
"version": "1.0.4",
|
"version": "1.0.18",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -93,24 +93,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@pushrocks/lik": {
|
"@pushrocks/lik": {
|
||||||
"version": "3.0.5",
|
"version": "3.0.11",
|
||||||
"resolved": "https://verdaccio.lossless.one/@pushrocks%2flik/-/lik-3.0.5.tgz",
|
"resolved": "https://verdaccio.lossless.one/@pushrocks%2flik/-/lik-3.0.11.tgz",
|
||||||
"integrity": "sha512-pc5Nq0WUysS34qPpyiZXiX254kL3vyRVbt3D36Q5QU+eHhxAThHofSzgOdyVHUZU2WFoaMlKowIVsyUFzIkfdw==",
|
"integrity": "sha512-SDKRPj9+xBTqozlDPcA7O6BcccM1Tw/sXPVP+OnhNxCubDZ/L2kGNpPpqm43NJUoNxSSo5wdBw4N7MAFYCGdVg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@pushrocks/smartdelay": "^2.0.2",
|
"@pushrocks/smartdelay": "^2.0.3",
|
||||||
"@pushrocks/smartpromise": "^2.0.5",
|
"@pushrocks/smartpromise": "^3.0.2",
|
||||||
"@pushrocks/smartrx": "^2.0.3",
|
"@pushrocks/smartrx": "^2.0.3",
|
||||||
"@pushrocks/smarttime": "^3.0.5",
|
"@pushrocks/smarttime": "^3.0.12",
|
||||||
"@types/minimatch": "^3.0.3",
|
"@types/minimatch": "^3.0.3",
|
||||||
"minimatch": "^3.0.4",
|
"minimatch": "^3.0.4",
|
||||||
"symbol-tree": "^3.2.2"
|
"symbol-tree": "^3.2.4"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@pushrocks/smartpromise": {
|
|
||||||
"version": "2.0.5",
|
|
||||||
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartpromise/-/smartpromise-2.0.5.tgz",
|
|
||||||
"integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g=="
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@pushrocks/smartcli": {
|
"@pushrocks/smartcli": {
|
||||||
@ -144,6 +137,23 @@
|
|||||||
"@pushrocks/smartpromise": "^3.0.2"
|
"@pushrocks/smartpromise": "^3.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@pushrocks/smartenv": {
|
||||||
|
"version": "4.0.7",
|
||||||
|
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartenv/-/smartenv-4.0.7.tgz",
|
||||||
|
"integrity": "sha512-ThSJMEcUAF1VIa4vAvn1zGnziEuDY4h8T+EQ5JCiKy2qnUM/F6zqzFogyo495X6rg71gC/7RmktQVQaN06gjWA==",
|
||||||
|
"requires": {
|
||||||
|
"@pushrocks/smartparam": "^1.0.4",
|
||||||
|
"@pushrocks/smartpromise": "^3.0.2",
|
||||||
|
"@types/node": "^12.7.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@types/node": {
|
||||||
|
"version": "12.7.3",
|
||||||
|
"resolved": "https://verdaccio.lossless.one/@types%2fnode/-/node-12.7.3.tgz",
|
||||||
|
"integrity": "sha512-3SiLAIBkDWDg6vFo0+5YJyHPWU9uwu40Qe+v+0MH8wRKYBimHvvAOyk3EzMrD/TrIlLYfXrqDqrg913PynrMJQ=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"@pushrocks/smartevent": {
|
"@pushrocks/smartevent": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartevent/-/smartevent-2.0.3.tgz",
|
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartevent/-/smartevent-2.0.3.tgz",
|
||||||
@ -170,10 +180,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@pushrocks/smartfile": {
|
"@pushrocks/smartfile": {
|
||||||
"version": "7.0.2",
|
"version": "7.0.4",
|
||||||
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartfile/-/smartfile-7.0.2.tgz",
|
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartfile/-/smartfile-7.0.4.tgz",
|
||||||
"integrity": "sha512-38l9DRalp1McEBFG+qKzBqefVQZZLPNk+uo7Ff1guy8BDxA+tATlZ6O6FuXW7M3wjFDBi245VJs+KWVKcCxBRA==",
|
"integrity": "sha512-ym8eigWJAQhwgmuVLew3GLrk4WhV03ajapwuMWytxKSzfIW9ZqceJBX2QzOkmhFGA2bp+gc4Q2wOBy3Ffnlj+A==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"@pushrocks/smartpath": "^4.0.1",
|
"@pushrocks/smartpath": "^4.0.1",
|
||||||
"@pushrocks/smartpromise": "^3.0.2",
|
"@pushrocks/smartpromise": "^3.0.2",
|
||||||
@ -190,7 +199,6 @@
|
|||||||
"version": "5.1.0",
|
"version": "5.1.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/@types%2ffs-extra/-/fs-extra-5.1.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/@types%2ffs-extra/-/fs-extra-5.1.0.tgz",
|
||||||
"integrity": "sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==",
|
"integrity": "sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/node": "*"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
@ -199,7 +207,6 @@
|
|||||||
"version": "7.0.1",
|
"version": "7.0.1",
|
||||||
"resolved": "https://verdaccio.lossless.one/fs-extra/-/fs-extra-7.0.1.tgz",
|
"resolved": "https://verdaccio.lossless.one/fs-extra/-/fs-extra-7.0.1.tgz",
|
||||||
"integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
|
"integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"graceful-fs": "^4.1.2",
|
"graceful-fs": "^4.1.2",
|
||||||
"jsonfile": "^4.0.0",
|
"jsonfile": "^4.0.0",
|
||||||
@ -208,6 +215,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@pushrocks/smartfm": {
|
||||||
|
"version": "2.0.4",
|
||||||
|
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartfm/-/smartfm-2.0.4.tgz",
|
||||||
|
"integrity": "sha512-QYxmIGhRfnE57rTCjsDBilPTrO/3VmajDxQt5z14pxAm9CeZypyGc4N6+Ts3KT1VGbs68NzCsGOM5ZYJW0Wmfg==",
|
||||||
|
"requires": {
|
||||||
|
"gray-matter": "^4.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@pushrocks/smartlog": {
|
"@pushrocks/smartlog": {
|
||||||
"version": "2.0.19",
|
"version": "2.0.19",
|
||||||
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartlog/-/smartlog-2.0.19.tgz",
|
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartlog/-/smartlog-2.0.19.tgz",
|
||||||
@ -251,7 +266,6 @@
|
|||||||
"version": "1.0.4",
|
"version": "1.0.4",
|
||||||
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartparam/-/smartparam-1.0.4.tgz",
|
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartparam/-/smartparam-1.0.4.tgz",
|
||||||
"integrity": "sha512-UAqhnTQGBaJRptTK3qTd47Yt2ZTrAWByteow4auSNZD+k0xrpY9mTPPgKh0IwsURe0cZhj7zYNpGiekhKkL4rA==",
|
"integrity": "sha512-UAqhnTQGBaJRptTK3qTd47Yt2ZTrAWByteow4auSNZD+k0xrpY9mTPPgKh0IwsURe0cZhj7zYNpGiekhKkL4rA==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"@pushrocks/smartpromise": "^2.0.5",
|
"@pushrocks/smartpromise": "^2.0.5",
|
||||||
"is-promise": "^2.1.0",
|
"is-promise": "^2.1.0",
|
||||||
@ -261,16 +275,14 @@
|
|||||||
"@pushrocks/smartpromise": {
|
"@pushrocks/smartpromise": {
|
||||||
"version": "2.0.5",
|
"version": "2.0.5",
|
||||||
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartpromise/-/smartpromise-2.0.5.tgz",
|
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartpromise/-/smartpromise-2.0.5.tgz",
|
||||||
"integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==",
|
"integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g=="
|
||||||
"dev": true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@pushrocks/smartpath": {
|
"@pushrocks/smartpath": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartpath/-/smartpath-4.0.1.tgz",
|
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartpath/-/smartpath-4.0.1.tgz",
|
||||||
"integrity": "sha512-MaI0+uLQPCr2V3WGnbdgb0pWa9xkWyrP4qYcbsHIjeismGLbn9s3jmP/HIXU8LkgzRgaVb+BJxmZJHOwl32DyA==",
|
"integrity": "sha512-MaI0+uLQPCr2V3WGnbdgb0pWa9xkWyrP4qYcbsHIjeismGLbn9s3jmP/HIXU8LkgzRgaVb+BJxmZJHOwl32DyA=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"@pushrocks/smartpromise": {
|
"@pushrocks/smartpromise": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.2",
|
||||||
@ -278,10 +290,9 @@
|
|||||||
"integrity": "sha512-jmrJMUEmBCWChWK8CIcx4Vw3wv/8OgVNmkaxJrbs+WMaoRUfJtpWWJfrAwwHWt9ZXJbarJ+CwfwfYiiZXymndQ=="
|
"integrity": "sha512-jmrJMUEmBCWChWK8CIcx4Vw3wv/8OgVNmkaxJrbs+WMaoRUfJtpWWJfrAwwHWt9ZXJbarJ+CwfwfYiiZXymndQ=="
|
||||||
},
|
},
|
||||||
"@pushrocks/smartrequest": {
|
"@pushrocks/smartrequest": {
|
||||||
"version": "1.1.16",
|
"version": "1.1.23",
|
||||||
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartrequest/-/smartrequest-1.1.16.tgz",
|
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartrequest/-/smartrequest-1.1.23.tgz",
|
||||||
"integrity": "sha512-3LbtqoqnjfzWSQ10NryhJmgwPpvMlVoYyTzE676+yC4hM2rnGSzxozLZxMr6enV4VeZcloQ0CqHBivKoT/kdvA==",
|
"integrity": "sha512-Hws3YfzIE0b/E3aTkSugLskKWBq7e8HDXEN+RlRyTFONxW/XONKJFTw4mp3jk+puWpYGDoOTcP+Ua4jd19z9pA==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"@pushrocks/smartpromise": "^3.0.2",
|
"@pushrocks/smartpromise": "^3.0.2",
|
||||||
"@types/form-data": "^2.2.1",
|
"@types/form-data": "^2.2.1",
|
||||||
@ -318,6 +329,32 @@
|
|||||||
"which": "^1.3.1"
|
"which": "^1.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@pushrocks/smartsystem": {
|
||||||
|
"version": "2.0.8",
|
||||||
|
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartsystem/-/smartsystem-2.0.8.tgz",
|
||||||
|
"integrity": "sha512-lBruo1Ikai35oiDMy3Lx1NhddTMynCCd8MTx4dBU22a0HnNYZRKxTITuPAfIDD3VB94ZpEGbAvzblnZpuFFkMQ==",
|
||||||
|
"requires": {
|
||||||
|
"@pushrocks/lik": "^3.0.10",
|
||||||
|
"@pushrocks/smartenv": "^4.0.7",
|
||||||
|
"@pushrocks/smartpromise": "^3.0.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@pushrocks/lik": {
|
||||||
|
"version": "3.0.11",
|
||||||
|
"resolved": "https://verdaccio.lossless.one/@pushrocks%2flik/-/lik-3.0.11.tgz",
|
||||||
|
"integrity": "sha512-SDKRPj9+xBTqozlDPcA7O6BcccM1Tw/sXPVP+OnhNxCubDZ/L2kGNpPpqm43NJUoNxSSo5wdBw4N7MAFYCGdVg==",
|
||||||
|
"requires": {
|
||||||
|
"@pushrocks/smartdelay": "^2.0.3",
|
||||||
|
"@pushrocks/smartpromise": "^3.0.2",
|
||||||
|
"@pushrocks/smartrx": "^2.0.3",
|
||||||
|
"@pushrocks/smarttime": "^3.0.12",
|
||||||
|
"@types/minimatch": "^3.0.3",
|
||||||
|
"minimatch": "^3.0.4",
|
||||||
|
"symbol-tree": "^3.2.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"@pushrocks/smarttime": {
|
"@pushrocks/smarttime": {
|
||||||
"version": "3.0.12",
|
"version": "3.0.12",
|
||||||
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmarttime/-/smarttime-3.0.12.tgz",
|
"resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmarttime/-/smarttime-3.0.12.tgz",
|
||||||
@ -385,20 +422,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@types/form-data": {
|
"@types/form-data": {
|
||||||
"version": "2.2.1",
|
"version": "2.5.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/@types%2fform-data/-/form-data-2.2.1.tgz",
|
"resolved": "https://verdaccio.lossless.one/@types%2fform-data/-/form-data-2.5.0.tgz",
|
||||||
"integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==",
|
"integrity": "sha512-23/wYiuckYYtFpL+4RPWiWmRQH2BjFuqCUi2+N3amB1a1Drv+i/byTrGvlLwRVLFNAZbwpbQ7JvTK+VCAPMbcg==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/node": "*"
|
"form-data": "*"
|
||||||
}
|
|
||||||
},
|
|
||||||
"@types/fs-extra": {
|
|
||||||
"version": "8.0.0",
|
|
||||||
"resolved": "https://verdaccio.lossless.one/@types%2ffs-extra/-/fs-extra-8.0.0.tgz",
|
|
||||||
"integrity": "sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q==",
|
|
||||||
"requires": {
|
|
||||||
"@types/node": "*"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@types/luxon": {
|
"@types/luxon": {
|
||||||
@ -420,7 +448,6 @@
|
|||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"resolved": "https://verdaccio.lossless.one/@types%2fvinyl/-/vinyl-2.0.3.tgz",
|
"resolved": "https://verdaccio.lossless.one/@types%2fvinyl/-/vinyl-2.0.3.tgz",
|
||||||
"integrity": "sha512-hrT6xg16CWSmndZqOTJ6BGIn2abKyTw0B58bI+7ioUoj3Sma6u8ftZ1DTI2yCaJamOVGLOnQWiPH3a74+EaqTA==",
|
"integrity": "sha512-hrT6xg16CWSmndZqOTJ6BGIn2abKyTw0B58bI+7ioUoj3Sma6u8ftZ1DTI2yCaJamOVGLOnQWiPH3a74+EaqTA==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/node": "*"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
@ -465,7 +492,6 @@
|
|||||||
"version": "1.0.10",
|
"version": "1.0.10",
|
||||||
"resolved": "https://verdaccio.lossless.one/argparse/-/argparse-1.0.10.tgz",
|
"resolved": "https://verdaccio.lossless.one/argparse/-/argparse-1.0.10.tgz",
|
||||||
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
|
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"sprintf-js": "~1.0.2"
|
"sprintf-js": "~1.0.2"
|
||||||
}
|
}
|
||||||
@ -479,8 +505,7 @@
|
|||||||
"asynckit": {
|
"asynckit": {
|
||||||
"version": "0.4.0",
|
"version": "0.4.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/asynckit/-/asynckit-0.4.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/asynckit/-/asynckit-0.4.0.tgz",
|
||||||
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
|
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"balanced-match": {
|
"balanced-match": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
@ -586,26 +611,22 @@
|
|||||||
"clone": {
|
"clone": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://verdaccio.lossless.one/clone/-/clone-2.1.2.tgz",
|
"resolved": "https://verdaccio.lossless.one/clone/-/clone-2.1.2.tgz",
|
||||||
"integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
|
"integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"clone-buffer": {
|
"clone-buffer": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/clone-buffer/-/clone-buffer-1.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/clone-buffer/-/clone-buffer-1.0.0.tgz",
|
||||||
"integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
|
"integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"clone-stats": {
|
"clone-stats": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/clone-stats/-/clone-stats-1.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/clone-stats/-/clone-stats-1.0.0.tgz",
|
||||||
"integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
|
"integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"cloneable-readable": {
|
"cloneable-readable": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.3",
|
||||||
"resolved": "https://verdaccio.lossless.one/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
|
"resolved": "https://verdaccio.lossless.one/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
|
||||||
"integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
|
"integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"inherits": "^2.0.1",
|
"inherits": "^2.0.1",
|
||||||
"process-nextick-args": "^2.0.0",
|
"process-nextick-args": "^2.0.0",
|
||||||
@ -635,7 +656,6 @@
|
|||||||
"version": "1.0.8",
|
"version": "1.0.8",
|
||||||
"resolved": "https://verdaccio.lossless.one/combined-stream/-/combined-stream-1.0.8.tgz",
|
"resolved": "https://verdaccio.lossless.one/combined-stream/-/combined-stream-1.0.8.tgz",
|
||||||
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"delayed-stream": "~1.0.0"
|
"delayed-stream": "~1.0.0"
|
||||||
}
|
}
|
||||||
@ -654,8 +674,7 @@
|
|||||||
"core-util-is": {
|
"core-util-is": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://verdaccio.lossless.one/core-util-is/-/core-util-is-1.0.2.tgz",
|
"resolved": "https://verdaccio.lossless.one/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
|
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"cron": {
|
"cron": {
|
||||||
"version": "1.7.1",
|
"version": "1.7.1",
|
||||||
@ -711,8 +730,7 @@
|
|||||||
"delayed-stream": {
|
"delayed-stream": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||||
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
|
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"diff": {
|
"diff": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
@ -737,8 +755,7 @@
|
|||||||
"esprima": {
|
"esprima": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
"resolved": "https://verdaccio.lossless.one/esprima/-/esprima-4.0.1.tgz",
|
"resolved": "https://verdaccio.lossless.one/esprima/-/esprima-4.0.1.tgz",
|
||||||
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
|
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"esutils": {
|
"esutils": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
@ -761,6 +778,14 @@
|
|||||||
"strip-eof": "^1.0.0"
|
"strip-eof": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"extend-shallow": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://verdaccio.lossless.one/extend-shallow/-/extend-shallow-2.0.1.tgz",
|
||||||
|
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
|
||||||
|
"requires": {
|
||||||
|
"is-extendable": "^0.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"figures": {
|
"figures": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/figures/-/figures-3.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/figures/-/figures-3.0.0.tgz",
|
||||||
@ -783,44 +808,24 @@
|
|||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz",
|
||||||
"integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=",
|
"integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"readable-stream": "^2.0.2"
|
"readable-stream": "^2.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form-data": {
|
"form-data": {
|
||||||
"version": "2.4.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://verdaccio.lossless.one/form-data/-/form-data-2.4.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/form-data/-/form-data-2.5.1.tgz",
|
||||||
"integrity": "sha512-4FinE8RfqYnNim20xDwZZE0V2kOs/AuElIjFUbPuegQSaoZM+vUT5FnwSl10KPugH4voTg1bEQlcbCG9ka75TA==",
|
"integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"asynckit": "^0.4.0",
|
"asynckit": "^0.4.0",
|
||||||
"combined-stream": "^1.0.6",
|
"combined-stream": "^1.0.6",
|
||||||
"mime-types": "^2.1.12"
|
"mime-types": "^2.1.12"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"fs-extra": {
|
|
||||||
"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.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": {
|
"fs.realpath": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||||
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
|
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"get-caller-file": {
|
"get-caller-file": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
@ -847,7 +852,6 @@
|
|||||||
"version": "7.1.4",
|
"version": "7.1.4",
|
||||||
"resolved": "https://verdaccio.lossless.one/glob/-/glob-7.1.4.tgz",
|
"resolved": "https://verdaccio.lossless.one/glob/-/glob-7.1.4.tgz",
|
||||||
"integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
|
"integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"fs.realpath": "^1.0.0",
|
"fs.realpath": "^1.0.0",
|
||||||
"inflight": "^1.0.4",
|
"inflight": "^1.0.4",
|
||||||
@ -858,9 +862,20 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"graceful-fs": {
|
"graceful-fs": {
|
||||||
"version": "4.1.15",
|
"version": "4.2.2",
|
||||||
"resolved": "https://verdaccio.lossless.one/graceful-fs/-/graceful-fs-4.1.15.tgz",
|
"resolved": "https://verdaccio.lossless.one/graceful-fs/-/graceful-fs-4.2.2.tgz",
|
||||||
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
|
"integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q=="
|
||||||
|
},
|
||||||
|
"gray-matter": {
|
||||||
|
"version": "4.0.2",
|
||||||
|
"resolved": "https://verdaccio.lossless.one/gray-matter/-/gray-matter-4.0.2.tgz",
|
||||||
|
"integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==",
|
||||||
|
"requires": {
|
||||||
|
"js-yaml": "^3.11.0",
|
||||||
|
"kind-of": "^6.0.2",
|
||||||
|
"section-matter": "^1.0.0",
|
||||||
|
"strip-bom-string": "^1.0.0"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"has-flag": {
|
"has-flag": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
@ -871,7 +886,6 @@
|
|||||||
"version": "1.0.6",
|
"version": "1.0.6",
|
||||||
"resolved": "https://verdaccio.lossless.one/inflight/-/inflight-1.0.6.tgz",
|
"resolved": "https://verdaccio.lossless.one/inflight/-/inflight-1.0.6.tgz",
|
||||||
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
|
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"once": "^1.3.0",
|
"once": "^1.3.0",
|
||||||
"wrappy": "1"
|
"wrappy": "1"
|
||||||
@ -880,8 +894,7 @@
|
|||||||
"inherits": {
|
"inherits": {
|
||||||
"version": "2.0.4",
|
"version": "2.0.4",
|
||||||
"resolved": "https://verdaccio.lossless.one/inherits/-/inherits-2.0.4.tgz",
|
"resolved": "https://verdaccio.lossless.one/inherits/-/inherits-2.0.4.tgz",
|
||||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"invert-kv": {
|
"invert-kv": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
@ -889,6 +902,11 @@
|
|||||||
"integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
|
"integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"is-extendable": {
|
||||||
|
"version": "0.1.1",
|
||||||
|
"resolved": "https://verdaccio.lossless.one/is-extendable/-/is-extendable-0.1.1.tgz",
|
||||||
|
"integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
|
||||||
|
},
|
||||||
"is-fullwidth-code-point": {
|
"is-fullwidth-code-point": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
|
||||||
@ -898,8 +916,7 @@
|
|||||||
"is-promise": {
|
"is-promise": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/is-promise/-/is-promise-2.1.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/is-promise/-/is-promise-2.1.0.tgz",
|
||||||
"integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
|
"integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"is-stream": {
|
"is-stream": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
@ -910,14 +927,12 @@
|
|||||||
"is-utf8": {
|
"is-utf8": {
|
||||||
"version": "0.2.1",
|
"version": "0.2.1",
|
||||||
"resolved": "https://verdaccio.lossless.one/is-utf8/-/is-utf8-0.2.1.tgz",
|
"resolved": "https://verdaccio.lossless.one/is-utf8/-/is-utf8-0.2.1.tgz",
|
||||||
"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
|
"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"isarray": {
|
"isarray": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/isarray/-/isarray-1.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/isarray/-/isarray-1.0.0.tgz",
|
||||||
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
|
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"isexe": {
|
"isexe": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
@ -934,7 +949,6 @@
|
|||||||
"version": "3.13.1",
|
"version": "3.13.1",
|
||||||
"resolved": "https://verdaccio.lossless.one/js-yaml/-/js-yaml-3.13.1.tgz",
|
"resolved": "https://verdaccio.lossless.one/js-yaml/-/js-yaml-3.13.1.tgz",
|
||||||
"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
|
"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"argparse": "^1.0.7",
|
"argparse": "^1.0.7",
|
||||||
"esprima": "^4.0.0"
|
"esprima": "^4.0.0"
|
||||||
@ -948,6 +962,11 @@
|
|||||||
"graceful-fs": "^4.1.6"
|
"graceful-fs": "^4.1.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"kind-of": {
|
||||||
|
"version": "6.0.2",
|
||||||
|
"resolved": "https://verdaccio.lossless.one/kind-of/-/kind-of-6.0.2.tgz",
|
||||||
|
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
|
||||||
|
},
|
||||||
"lcid": {
|
"lcid": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/lcid/-/lcid-2.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/lcid/-/lcid-2.0.0.tgz",
|
||||||
@ -1009,14 +1028,12 @@
|
|||||||
"mime-db": {
|
"mime-db": {
|
||||||
"version": "1.40.0",
|
"version": "1.40.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/mime-db/-/mime-db-1.40.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/mime-db/-/mime-db-1.40.0.tgz",
|
||||||
"integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
|
"integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"mime-types": {
|
"mime-types": {
|
||||||
"version": "2.1.24",
|
"version": "2.1.24",
|
||||||
"resolved": "https://verdaccio.lossless.one/mime-types/-/mime-types-2.1.24.tgz",
|
"resolved": "https://verdaccio.lossless.one/mime-types/-/mime-types-2.1.24.tgz",
|
||||||
"integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
|
"integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"mime-db": "1.40.0"
|
"mime-db": "1.40.0"
|
||||||
}
|
}
|
||||||
@ -1090,7 +1107,6 @@
|
|||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/once/-/once-1.4.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/once/-/once-1.4.0.tgz",
|
||||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"wrappy": "1"
|
"wrappy": "1"
|
||||||
}
|
}
|
||||||
@ -1200,8 +1216,7 @@
|
|||||||
"path-is-absolute": {
|
"path-is-absolute": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://verdaccio.lossless.one/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
"resolved": "https://verdaccio.lossless.one/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
||||||
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
|
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"path-key": {
|
"path-key": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
@ -1224,14 +1239,12 @@
|
|||||||
"pify": {
|
"pify": {
|
||||||
"version": "2.3.0",
|
"version": "2.3.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/pify/-/pify-2.3.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/pify/-/pify-2.3.0.tgz",
|
||||||
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
|
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"process-nextick-args": {
|
"process-nextick-args": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://verdaccio.lossless.one/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
"resolved": "https://verdaccio.lossless.one/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
||||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
|
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"pump": {
|
"pump": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
@ -1247,7 +1260,6 @@
|
|||||||
"version": "2.3.6",
|
"version": "2.3.6",
|
||||||
"resolved": "https://verdaccio.lossless.one/readable-stream/-/readable-stream-2.3.6.tgz",
|
"resolved": "https://verdaccio.lossless.one/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||||
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"core-util-is": "~1.0.0",
|
"core-util-is": "~1.0.0",
|
||||||
"inherits": "~2.0.3",
|
"inherits": "~2.0.3",
|
||||||
@ -1261,14 +1273,12 @@
|
|||||||
"remove-trailing-separator": {
|
"remove-trailing-separator": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
|
||||||
"integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
|
"integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"replace-ext": {
|
"replace-ext": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/replace-ext/-/replace-ext-1.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/replace-ext/-/replace-ext-1.0.0.tgz",
|
||||||
"integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
|
"integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"require-directory": {
|
"require-directory": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
@ -1311,8 +1321,16 @@
|
|||||||
"safe-buffer": {
|
"safe-buffer": {
|
||||||
"version": "5.1.2",
|
"version": "5.1.2",
|
||||||
"resolved": "https://verdaccio.lossless.one/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
"resolved": "https://verdaccio.lossless.one/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
|
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||||
"dev": true
|
},
|
||||||
|
"section-matter": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://verdaccio.lossless.one/section-matter/-/section-matter-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
|
||||||
|
"requires": {
|
||||||
|
"extend-shallow": "^2.0.1",
|
||||||
|
"kind-of": "^6.0.0"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"semver": {
|
"semver": {
|
||||||
"version": "5.7.0",
|
"version": "5.7.0",
|
||||||
@ -1379,8 +1397,7 @@
|
|||||||
"sprintf-js": {
|
"sprintf-js": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://verdaccio.lossless.one/sprintf-js/-/sprintf-js-1.0.3.tgz",
|
"resolved": "https://verdaccio.lossless.one/sprintf-js/-/sprintf-js-1.0.3.tgz",
|
||||||
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
|
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"string-width": {
|
"string-width": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
@ -1396,7 +1413,6 @@
|
|||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://verdaccio.lossless.one/string_decoder/-/string_decoder-1.1.1.tgz",
|
"resolved": "https://verdaccio.lossless.one/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"safe-buffer": "~5.1.0"
|
"safe-buffer": "~5.1.0"
|
||||||
}
|
}
|
||||||
@ -1414,7 +1430,6 @@
|
|||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/strip-bom/-/strip-bom-2.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/strip-bom/-/strip-bom-2.0.0.tgz",
|
||||||
"integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
|
"integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"is-utf8": "^0.2.0"
|
"is-utf8": "^0.2.0"
|
||||||
}
|
}
|
||||||
@ -1423,7 +1438,6 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz",
|
||||||
"integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=",
|
"integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"is-utf8": "^0.2.1"
|
"is-utf8": "^0.2.1"
|
||||||
}
|
}
|
||||||
@ -1432,12 +1446,16 @@
|
|||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz",
|
||||||
"integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=",
|
"integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"first-chunk-stream": "^2.0.0",
|
"first-chunk-stream": "^2.0.0",
|
||||||
"strip-bom": "^2.0.0"
|
"strip-bom": "^2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"strip-bom-string": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://verdaccio.lossless.one/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI="
|
||||||
|
},
|
||||||
"strip-eof": {
|
"strip-eof": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/strip-eof/-/strip-eof-1.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/strip-eof/-/strip-eof-1.0.0.tgz",
|
||||||
@ -1539,14 +1557,12 @@
|
|||||||
"util-deprecate": {
|
"util-deprecate": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://verdaccio.lossless.one/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
"resolved": "https://verdaccio.lossless.one/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
|
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"vinyl": {
|
"vinyl": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/vinyl/-/vinyl-2.2.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/vinyl/-/vinyl-2.2.0.tgz",
|
||||||
"integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
|
"integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"clone": "^2.1.1",
|
"clone": "^2.1.1",
|
||||||
"clone-buffer": "^1.0.0",
|
"clone-buffer": "^1.0.0",
|
||||||
@ -1560,7 +1576,6 @@
|
|||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://verdaccio.lossless.one/vinyl-file/-/vinyl-file-3.0.0.tgz",
|
"resolved": "https://verdaccio.lossless.one/vinyl-file/-/vinyl-file-3.0.0.tgz",
|
||||||
"integrity": "sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U=",
|
"integrity": "sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U=",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"graceful-fs": "^4.1.2",
|
"graceful-fs": "^4.1.2",
|
||||||
"pify": "^2.3.0",
|
"pify": "^2.3.0",
|
||||||
@ -1641,8 +1656,7 @@
|
|||||||
"wrappy": {
|
"wrappy": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://verdaccio.lossless.one/wrappy/-/wrappy-1.0.2.tgz",
|
"resolved": "https://verdaccio.lossless.one/wrappy/-/wrappy-1.0.2.tgz",
|
||||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
|
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"y18n": {
|
"y18n": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@pushrocks/smartdaemon",
|
"name": "@pushrocks/smartdaemon",
|
||||||
"version": "1.0.4",
|
"version": "1.0.18",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "start scripts as long running daemons and manage them",
|
"description": "start scripts as long running daemons and manage them",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
@ -21,11 +21,13 @@
|
|||||||
"tslint-config-prettier": "^1.15.0"
|
"tslint-config-prettier": "^1.15.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@pushrocks/lik": "^3.0.11",
|
||||||
|
"@pushrocks/smartfile": "^7.0.4",
|
||||||
|
"@pushrocks/smartfm": "^2.0.4",
|
||||||
"@pushrocks/smartlog": "^2.0.19",
|
"@pushrocks/smartlog": "^2.0.19",
|
||||||
"@pushrocks/smartlog-destination-local": "^8.0.2",
|
"@pushrocks/smartlog-destination-local": "^8.0.2",
|
||||||
"@pushrocks/smartshell": "^2.0.25",
|
"@pushrocks/smartshell": "^2.0.25",
|
||||||
"@types/fs-extra": "^8.0.0",
|
"@pushrocks/smartsystem": "^2.0.8"
|
||||||
"fs-extra": "^8.1.0"
|
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"ts/*",
|
"ts/*",
|
||||||
|
17
test/test.ts
17
test/test.ts
@ -1,8 +1,21 @@
|
|||||||
import { expect, tap } from '@pushrocks/tapbundle';
|
import { expect, tap } from '@pushrocks/tapbundle';
|
||||||
import * as smartdaemon from '../ts/index';
|
import * as smartdaemon from '../ts/index';
|
||||||
|
|
||||||
tap.test('first test', async () => {
|
let testSmartdaemon: smartdaemon.SmartDaemon;
|
||||||
console.log(smartdaemon.standardExport);
|
|
||||||
|
tap.test('should create an instance of smartdaemon', async () => {
|
||||||
|
testSmartdaemon = new smartdaemon.SmartDaemon();
|
||||||
|
expect(testSmartdaemon).to.be.instanceOf(smartdaemon.SmartDaemon);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('should create a service', async () => {
|
||||||
|
testSmartdaemon.addService({
|
||||||
|
name: 'npmversion',
|
||||||
|
version: 'x.x.x',
|
||||||
|
command: 'npm -v',
|
||||||
|
description: 'displays the npm version',
|
||||||
|
workingDir: __dirname
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.start();
|
tap.start();
|
||||||
|
@ -1,3 +1 @@
|
|||||||
import * as plugins from './smartdaemon.plugins';
|
export * from './smartdaemon.classes.smartdaemon';
|
||||||
|
|
||||||
export let standardExport = 'Hi there! :) This is an exported string';
|
|
||||||
|
84
ts/smartdaemon.classes.service.ts
Normal file
84
ts/smartdaemon.classes.service.ts
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
import * as plugins from './smartdaemon.plugins';
|
||||||
|
import * as paths from './smartdaemon.paths';
|
||||||
|
import { SmartDaemon } from './smartdaemon.classes.smartdaemon';
|
||||||
|
|
||||||
|
export interface ISmartDaemonServiceConstructorOptions {
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
command: string;
|
||||||
|
workingDir: string;
|
||||||
|
version: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* represents a service that is being spawned by SmartDaemon
|
||||||
|
*/
|
||||||
|
export class SmartDaemonService implements ISmartDaemonServiceConstructorOptions {
|
||||||
|
public static async createFromOptions(smartdaemonRef: SmartDaemon, optionsArg: ISmartDaemonServiceConstructorOptions) {
|
||||||
|
const service = new SmartDaemonService(smartdaemonRef);
|
||||||
|
for (const key of Object.keys(optionsArg)) {
|
||||||
|
service[key] = optionsArg[key];
|
||||||
|
}
|
||||||
|
return service;
|
||||||
|
}
|
||||||
|
|
||||||
|
public options: ISmartDaemonServiceConstructorOptions;
|
||||||
|
public alreadyExists = false;
|
||||||
|
|
||||||
|
public name: string;
|
||||||
|
public version: string;
|
||||||
|
public command: string;
|
||||||
|
public workingDir: string;
|
||||||
|
public description: string;
|
||||||
|
|
||||||
|
public smartdaemonRef: SmartDaemon;
|
||||||
|
|
||||||
|
constructor(smartdaemonRegfArg: SmartDaemon) {
|
||||||
|
this.smartdaemonRef = smartdaemonRegfArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enables the service
|
||||||
|
*/
|
||||||
|
public async enable() {
|
||||||
|
await this.smartdaemonRef.systemdManager.enableService(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* disables the service
|
||||||
|
*/
|
||||||
|
public async disable() {
|
||||||
|
await this.smartdaemonRef.systemdManager.disableService(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* starts a service
|
||||||
|
*/
|
||||||
|
public async start() {
|
||||||
|
await this.smartdaemonRef.systemdManager.startService(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* stops a service
|
||||||
|
*/
|
||||||
|
public async stop() {
|
||||||
|
await this.smartdaemonRef.systemdManager.stopService(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Save and Delete
|
||||||
|
public async save() {
|
||||||
|
await this.smartdaemonRef.systemdManager.saveService(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* deletes the service
|
||||||
|
*/
|
||||||
|
public async delete() {
|
||||||
|
await this.smartdaemonRef.systemdManager.deleteService(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async reload() {
|
||||||
|
await this.smartdaemonRef.systemdManager.reload();
|
||||||
|
}
|
||||||
|
}
|
38
ts/smartdaemon.classes.smartdaemon.ts
Normal file
38
ts/smartdaemon.classes.smartdaemon.ts
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import * as plugins from './smartdaemon.plugins';
|
||||||
|
import { SmartDaemonTemplateManager } from './smartdaemon.classes.templatemanager';
|
||||||
|
import { SmartDaemonService, ISmartDaemonServiceConstructorOptions } from './smartdaemon.classes.service';
|
||||||
|
import { SmartDaemonSystemdManager } from './smartdaemon.classes.systemdmanager';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export class SmartDaemon {
|
||||||
|
public templateManager: SmartDaemonTemplateManager;
|
||||||
|
public systemdManager: SmartDaemonSystemdManager;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.templateManager = new SmartDaemonTemplateManager(this);
|
||||||
|
this.systemdManager = new SmartDaemonSystemdManager(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* adds a service
|
||||||
|
* @param nameArg
|
||||||
|
* @param commandArg
|
||||||
|
* @param workingDirectoryArg
|
||||||
|
*/
|
||||||
|
public async addService(optionsArg: ISmartDaemonServiceConstructorOptions): Promise<SmartDaemonService> {
|
||||||
|
let serviceToAdd: SmartDaemonService;
|
||||||
|
const existingServices = await this.systemdManager.getServices();
|
||||||
|
const existingService = existingServices.find(serviceArg => {
|
||||||
|
return serviceArg.name === optionsArg.name;
|
||||||
|
});
|
||||||
|
if (!existingService) {
|
||||||
|
serviceToAdd = await SmartDaemonService.createFromOptions(this, optionsArg);
|
||||||
|
} else {
|
||||||
|
serviceToAdd = existingService;
|
||||||
|
Object.assign(serviceToAdd, optionsArg);
|
||||||
|
}
|
||||||
|
await serviceToAdd.save();
|
||||||
|
return serviceToAdd;
|
||||||
|
}
|
||||||
|
}
|
138
ts/smartdaemon.classes.systemdmanager.ts
Normal file
138
ts/smartdaemon.classes.systemdmanager.ts
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
import * as plugins from './smartdaemon.plugins';
|
||||||
|
import * as paths from './smartdaemon.paths';
|
||||||
|
import { SmartDaemon } from './smartdaemon.classes.smartdaemon';
|
||||||
|
import { ISmartDaemonServiceConstructorOptions, SmartDaemonService } from './smartdaemon.classes.service';
|
||||||
|
|
||||||
|
export class SmartDaemonSystemdManager {
|
||||||
|
// STATIC
|
||||||
|
private static smartDaemonNamespace = 'smartdaemon';
|
||||||
|
|
||||||
|
public static createServiceNameFromServiceName (serviceNameArg: string) {
|
||||||
|
return `${SmartDaemonSystemdManager.smartDaemonNamespace}_${serviceNameArg}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static createFileNameFromServiceName (serviceNameArg: string) {
|
||||||
|
return `${SmartDaemonSystemdManager.createServiceNameFromServiceName(serviceNameArg)}.service`;
|
||||||
|
};
|
||||||
|
|
||||||
|
public static createFilePathFromServiceName (serviceNameArg: string) {
|
||||||
|
return plugins.path.join(
|
||||||
|
paths.systemdDir,
|
||||||
|
SmartDaemonSystemdManager.createFileNameFromServiceName(serviceNameArg)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// INSTANCE
|
||||||
|
public smartdaemonRef: SmartDaemon;
|
||||||
|
public smartshellInstance: plugins.smartshell.Smartshell;
|
||||||
|
public smartsystem: plugins.smartsystem.Smartsystem;
|
||||||
|
|
||||||
|
public shouldExecute: boolean = false;
|
||||||
|
|
||||||
|
constructor(smartdaemonRefArg: SmartDaemon) {
|
||||||
|
this.smartdaemonRef = smartdaemonRefArg;
|
||||||
|
this.smartshellInstance = new plugins.smartshell.Smartshell({
|
||||||
|
executor: 'bash'
|
||||||
|
});
|
||||||
|
this.smartsystem = new plugins.smartsystem.Smartsystem();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async checkElegibility() {
|
||||||
|
if (await this.smartsystem.env.isLinuxAsync()) {
|
||||||
|
this.shouldExecute = true;
|
||||||
|
} else {
|
||||||
|
console.log('Smartdaemon can only be used on Linux systems! Refusing to set up a service.');
|
||||||
|
this.shouldExecute = false;
|
||||||
|
}
|
||||||
|
return this.shouldExecute;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async execute(commandArg: string) {
|
||||||
|
if (await this.checkElegibility()) {
|
||||||
|
await this.smartshellInstance.exec(commandArg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets all services that are already present
|
||||||
|
*/
|
||||||
|
public async getServices() {
|
||||||
|
const existingServices: SmartDaemonService[] = [];
|
||||||
|
if (await this.checkElegibility()) {
|
||||||
|
const smartfmInstance = new plugins.smartfm.Smartfm({
|
||||||
|
fmType: 'yaml'
|
||||||
|
});
|
||||||
|
const availableServices = await plugins.smartfile.fs.fileTreeToObject(
|
||||||
|
paths.systemdDir,
|
||||||
|
'smartdaemon_*.service'
|
||||||
|
);
|
||||||
|
for (const serviceFile of availableServices) {
|
||||||
|
const data = smartfmInstance.parseFromComments('# ', serviceFile.contentBuffer.toString())
|
||||||
|
.data as ISmartDaemonServiceConstructorOptions;
|
||||||
|
const service = await SmartDaemonService.createFromOptions(this.smartdaemonRef, data);
|
||||||
|
service.alreadyExists = true;
|
||||||
|
existingServices.push(service);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return existingServices;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async startService(serviceArg: SmartDaemonService) {
|
||||||
|
if (await this.checkElegibility()) {
|
||||||
|
await this.execute(
|
||||||
|
`systemctl start ${SmartDaemonSystemdManager.createServiceNameFromServiceName(serviceArg.name)}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public async stopService(serviceArg: SmartDaemonService) {
|
||||||
|
if (await this.checkElegibility()) {
|
||||||
|
await this.execute(
|
||||||
|
`systemctl stop ${SmartDaemonSystemdManager.createServiceNameFromServiceName(serviceArg.name)}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async saveService(serviceArg: SmartDaemonService) {
|
||||||
|
if (await this.checkElegibility()) {
|
||||||
|
await plugins.smartfile.memory.toFs(
|
||||||
|
this.smartdaemonRef.templateManager.generateUnitFileForService(serviceArg),
|
||||||
|
SmartDaemonSystemdManager.createFilePathFromServiceName(serviceArg.name)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async deleteService(serviceArg: SmartDaemonService) {
|
||||||
|
if (await this.checkElegibility()) {
|
||||||
|
await plugins.smartfile.fs.remove(
|
||||||
|
SmartDaemonSystemdManager.createServiceNameFromServiceName(serviceArg.name)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async enableService(serviceArg: SmartDaemonService) {
|
||||||
|
if (await this.checkElegibility()) {
|
||||||
|
await this.saveService(serviceArg);
|
||||||
|
if (serviceArg.alreadyExists) {
|
||||||
|
await this.execute(`systemctl daemon-reload`);
|
||||||
|
}
|
||||||
|
await this.execute(
|
||||||
|
`systemctl enable ${SmartDaemonSystemdManager.createServiceNameFromServiceName(serviceArg.name)}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public async disableService(serviceArg: SmartDaemonService) {
|
||||||
|
if (await this.checkElegibility()) {
|
||||||
|
await this.execute(
|
||||||
|
`systemctl disable ${SmartDaemonSystemdManager.createServiceNameFromServiceName(serviceArg.name)}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async reload() {
|
||||||
|
if (await this.checkElegibility()) {
|
||||||
|
await this.execute(
|
||||||
|
`systemctl daemon-reload`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
40
ts/smartdaemon.classes.templatemanager.ts
Normal file
40
ts/smartdaemon.classes.templatemanager.ts
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import * as plugins from './smartdaemon.plugins';
|
||||||
|
import { SmartDaemon } from './smartdaemon.classes.smartdaemon';
|
||||||
|
import { SmartDaemonService } from './smartdaemon.classes.service';
|
||||||
|
|
||||||
|
export class SmartDaemonTemplateManager {
|
||||||
|
public smartdaemonRef: SmartDaemon;
|
||||||
|
|
||||||
|
constructor(smartdaemonRefArg: SmartDaemon) {
|
||||||
|
this.smartdaemonRef = smartdaemonRefArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public generateUnitFileForService = (serviceArg: SmartDaemonService) => {
|
||||||
|
return `# ---
|
||||||
|
# name: ${serviceArg.name}
|
||||||
|
# version: ${serviceArg.version}
|
||||||
|
# description: ${serviceArg.description}
|
||||||
|
# command: ${serviceArg.command}
|
||||||
|
# workingDir: ${serviceArg.workingDir}
|
||||||
|
# ---
|
||||||
|
[Unit]
|
||||||
|
Description=${serviceArg.description}
|
||||||
|
Requires=network.target
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/bin/bash -c "cd ${serviceArg.workingDir} && ${serviceArg.command}"
|
||||||
|
WorkingDirectory=${serviceArg.workingDir}
|
||||||
|
Restart=on-failure
|
||||||
|
LimitNOFILE=infinity
|
||||||
|
LimitCORE=infinity
|
||||||
|
StandardInput=null
|
||||||
|
StandardOutput=syslog
|
||||||
|
StandardError=syslog
|
||||||
|
Restart=always
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
}
|
4
ts/smartdaemon.paths.ts
Normal file
4
ts/smartdaemon.paths.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import * as plugins from './smartdaemon.plugins';
|
||||||
|
|
||||||
|
export const packageDir = plugins.path.join(__dirname, '../');
|
||||||
|
export const systemdDir = plugins.path.join('/lib/systemd/system/');
|
@ -7,20 +7,22 @@ export {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// @pushrocks scope
|
// @pushrocks scope
|
||||||
import * as smartshell from '@pushrocks/smartshell';
|
import * as lik from '@pushrocks/lik';
|
||||||
|
import * as smartfile from '@pushrocks/smartfile';
|
||||||
|
import * as smartfm from '@pushrocks/smartfm';
|
||||||
import * as smartlog from '@pushrocks/smartlog';
|
import * as smartlog from '@pushrocks/smartlog';
|
||||||
import * as smartlogDestinationLocal from '@pushrocks/smartlog-destination-local';
|
import * as smartlogDestinationLocal from '@pushrocks/smartlog-destination-local';
|
||||||
|
import * as smartshell from '@pushrocks/smartshell';
|
||||||
|
import * as smartsystem from '@pushrocks/smartsystem';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
smartshell,
|
lik,
|
||||||
|
smartfile,
|
||||||
|
smartfm,
|
||||||
smartlog,
|
smartlog,
|
||||||
smartlogDestinationLocal
|
smartlogDestinationLocal,
|
||||||
|
smartshell,
|
||||||
|
smartsystem
|
||||||
};
|
};
|
||||||
|
|
||||||
// third party
|
// third party
|
||||||
|
|
||||||
import * as fs from 'fs-extra';
|
|
||||||
|
|
||||||
export {
|
|
||||||
fs
|
|
||||||
};
|
|
@ -1,174 +0,0 @@
|
|||||||
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'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
@ -1,259 +0,0 @@
|
|||||||
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');
|
|
||||||
};
|
|
@ -1,75 +0,0 @@
|
|||||||
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}'
|
|
||||||
};
|
|
Reference in New Issue
Block a user