Compare commits
49 Commits
fix-ips-ba
...
throw-when
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6bf2399495 | ||
|
|
76fb2a159d | ||
|
|
f8a7249e32 | ||
|
|
4c2dd689e4 | ||
|
|
456e55d54a | ||
|
|
862e382c12 | ||
|
|
203a5c681e | ||
|
|
033d784c52 | ||
|
|
62c3fa13ca | ||
|
|
ce338cb6ca | ||
|
|
8782151c5d | ||
|
|
b22c74c5a8 | ||
|
|
a3e4253005 | ||
|
|
2388593b8a | ||
|
|
cdced63c1b | ||
|
|
45e1d1ecef | ||
|
|
f44447ce71 | ||
|
|
238e9cd8cc | ||
|
|
e171d8ed0e | ||
|
|
bd3399e04b | ||
|
|
2b4443f333 | ||
|
|
ab6548122f | ||
|
|
f81573d999 | ||
|
|
84ccebb858 | ||
|
|
530bc50e7c | ||
|
|
57e490fc23 | ||
|
|
61e902c094 | ||
|
|
8378ba77d6 | ||
|
|
c9e30b74e2 | ||
|
|
af944fd2e3 | ||
|
|
bcc0e76f1d | ||
|
|
95078d250a | ||
|
|
4b16a2c0c5 | ||
|
|
b8524732ce | ||
|
|
d641d35d5c | ||
|
|
7464d95b57 | ||
|
|
3d6aa667fe | ||
|
|
147c3d2e7b | ||
|
|
ac298c3be3 | ||
|
|
e88848c44a | ||
|
|
cd518e3e4c | ||
|
|
24d4fad394 | ||
|
|
6d8785e689 | ||
|
|
508cbf0a82 | ||
|
|
c83f56166d | ||
|
|
7199e1a214 | ||
|
|
cc2c71c076 | ||
|
|
9ca273b2c4 | ||
|
|
b85c2f35b6 |
@@ -35,6 +35,9 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
rules: {
|
rules: {
|
||||||
|
// disabled because XAPI objects are using camel case
|
||||||
|
camelcase: ['off'],
|
||||||
|
|
||||||
'no-console': ['error', { allow: ['warn', 'error'] }],
|
'no-console': ['error', { allow: ['warn', 'error'] }],
|
||||||
'no-var': 'error',
|
'no-var': 'error',
|
||||||
'node/no-extraneous-import': 'error',
|
'node/no-extraneous-import': 'error',
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"golike-defer": "^0.4.1",
|
"golike-defer": "^0.4.1",
|
||||||
"xen-api": "^0.25.1"
|
"xen-api": "^0.25.2"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"postversion": "npm publish"
|
"postversion": "npm publish"
|
||||||
|
|||||||
41
CHANGELOG.md
41
CHANGELOG.md
@@ -1,25 +1,60 @@
|
|||||||
# ChangeLog
|
# ChangeLog
|
||||||
|
|
||||||
## **next** (2019-05-14)
|
## **next**
|
||||||
|
|
||||||
### Enhancements
|
### Enhancements
|
||||||
|
|
||||||
|
- [VM/Advanced] Ability to use UEFI instead of BIOS [#4264](https://github.com/vatesfr/xen-orchestra/issues/4264) (PR [#4268](https://github.com/vatesfr/xen-orchestra/pull/4268))
|
||||||
|
|
||||||
|
### Bug fixes
|
||||||
|
|
||||||
|
- [XOA] Don't require editing the _email_ field in case of re-registration (PR [#4259](https://github.com/vatesfr/xen-orchestra/pull/4259))
|
||||||
|
|
||||||
|
### Released packages
|
||||||
|
|
||||||
|
- xen-api v0.25.2
|
||||||
|
- xo-server v5.43.0
|
||||||
|
- xo-web v5.43.0
|
||||||
|
|
||||||
|
## **5.35.0** (2019-05-29)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
- [VM/general] Display 'Started... ago' instead of 'Halted... ago' for paused state [#3750](https://github.com/vatesfr/xen-orchestra/issues/3750) (PR [#4170](https://github.com/vatesfr/xen-orchestra/pull/4170))
|
||||||
|
- [Metadata backup] Ability to define when the backup report will be sent (PR [#4149](https://github.com/vatesfr/xen-orchestra/pull/4149))
|
||||||
|
- [XOA/Update] Ability to select release channel [#4200](https://github.com/vatesfr/xen-orchestra/issues/4200) (PR [#4202](https://github.com/vatesfr/xen-orchestra/pull/4202))
|
||||||
|
- [User] Forget connection tokens on password change or on demand [#4214](https://github.com/vatesfr/xen-orchestra/issues/4214) (PR [#4224](https://github.com/vatesfr/xen-orchestra/pull/4224))
|
||||||
|
- [Settings/Logs] LICENCE_RESTRICTION errors: suggest XCP-ng as an Open Source alternative [#3876](https://github.com/vatesfr/xen-orchestra/issues/3876) (PR [#4238](https://github.com/vatesfr/xen-orchestra/pull/4238))
|
||||||
|
- [VM/Migrate] Display VDI size on migrate modal [#2534](https://github.com/vatesfr/xen-orchestra/issues/2534) (PR [#4250](https://github.com/vatesfr/xen-orchestra/pull/4250))
|
||||||
|
- [Host] Display hyperthreading status on advanced tab [#4262](https://github.com/vatesfr/xen-orchestra/issues/4262) (PR [#4263](https://github.com/vatesfr/xen-orchestra/pull/4263))
|
||||||
|
|
||||||
### Bug fixes
|
### Bug fixes
|
||||||
|
|
||||||
- [Pool/Patches] Fix "an error has occurred" in "Applied patches" [#4192](https://github.com/vatesfr/xen-orchestra/issues/4192) (PR [#4193](https://github.com/vatesfr/xen-orchestra/pull/4193))
|
- [Pool/Patches] Fix "an error has occurred" in "Applied patches" [#4192](https://github.com/vatesfr/xen-orchestra/issues/4192) (PR [#4193](https://github.com/vatesfr/xen-orchestra/pull/4193))
|
||||||
- [Backup NG] Fix report sent even though "Never" is selected [#4092](https://github.com/vatesfr/xen-orchestra/issues/4092) (PR [#4178](https://github.com/vatesfr/xen-orchestra/pull/4178))
|
- [Backup NG] Fix report sent even though "Never" is selected [#4092](https://github.com/vatesfr/xen-orchestra/issues/4092) (PR [#4178](https://github.com/vatesfr/xen-orchestra/pull/4178))
|
||||||
- [Remotes] Fix issues after a config import (PR [#4197](https://github.com/vatesfr/xen-orchestra/pull/4197))
|
- [Remotes] Fix issues after a config import (PR [#4197](https://github.com/vatesfr/xen-orchestra/pull/4197))
|
||||||
|
- [Charts] Fixed the chart lines sometimes changing order/color (PR [#4221](https://github.com/vatesfr/xen-orchestra/pull/4221))
|
||||||
|
- Prevent non-admin users to access admin pages with URL (PR [#4220](https://github.com/vatesfr/xen-orchestra/pull/4220))
|
||||||
|
- [Upgrade] Fix alert before upgrade while running backup jobs [#4164](https://github.com/vatesfr/xen-orchestra/issues/4164) (PR [#4235](https://github.com/vatesfr/xen-orchestra/pull/4235))
|
||||||
|
- [Import] Fix import OVA files (PR [#4232](https://github.com/vatesfr/xen-orchestra/pull/4232))
|
||||||
|
- [VM/network] Fix duplicate IPv4 (PR [#4239](https://github.com/vatesfr/xen-orchestra/pull/4239))
|
||||||
|
- [Remotes] Fix disconnected remotes which may appear to work
|
||||||
|
- [Host] Fix incorrect hypervisor name [#4246](https://github.com/vatesfr/xen-orchestra/issues/4246) (PR [#4248](https://github.com/vatesfr/xen-orchestra/pull/4248))
|
||||||
|
|
||||||
### Released packages
|
### Released packages
|
||||||
|
|
||||||
- xo-server-backup-reports v0.16.1
|
- xo-server-backup-reports v0.16.1
|
||||||
- @xen-orchestra/fs v0.9.0
|
- @xen-orchestra/fs v0.9.0
|
||||||
- vhd-lib v0.7.0
|
- vhd-lib v0.7.0
|
||||||
- xo-server v5.41.0
|
- xo-server v5.42.1
|
||||||
- xo-web v5.41.0
|
- xo-web v5.42.1
|
||||||
|
|
||||||
## **5.34.0** (2019-04-30)
|
## **5.34.0** (2019-04-30)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### Highlights
|
### Highlights
|
||||||
|
|
||||||
- [Self/New VM] Add network config box to custom cloud-init [#3872](https://github.com/vatesfr/xen-orchestra/issues/3872) (PR [#4150](https://github.com/vatesfr/xen-orchestra/pull/4150))
|
- [Self/New VM] Add network config box to custom cloud-init [#3872](https://github.com/vatesfr/xen-orchestra/issues/3872) (PR [#4150](https://github.com/vatesfr/xen-orchestra/pull/4150))
|
||||||
|
|||||||
@@ -2,24 +2,27 @@
|
|||||||
|
|
||||||
### Enhancements
|
### Enhancements
|
||||||
|
|
||||||
- [VM/general] Display 'Started... ago' instead of 'Halted... ago' for paused state [#3750](https://github.com/vatesfr/xen-orchestra/issues/3750) (PR [#4170](https://github.com/vatesfr/xen-orchestra/pull/4170))
|
- [Backup-ng/restore] Display size for full VM backup [#4009](https://github.com/vatesfr/xen-orchestra/issues/4009) (PR [#4245](https://github.com/vatesfr/xen-orchestra/pull/4245))
|
||||||
- [Metadata backup] Ability to define when the backup report will be sent (PR [#4149](https://github.com/vatesfr/xen-orchestra/pull/4149))
|
- [Sr/new] Ability to select NFS version when creating NFS storage [#3951](https://github.com/vatesfr/xen-orchestra/issues/3951) (PR [#4277](https://github.com/vatesfr/xen-orchestra/pull/4277))
|
||||||
- [XOA/Update] Ability to select release channel [#4200](https://github.com/vatesfr/xen-orchestra/issues/4200) (PR [#4202](https://github.com/vatesfr/xen-orchestra/pull/4202))
|
- [auth-saml] Improve compatibility with Microsoft Azure Active Directory (PR [#4294](https://github.com/vatesfr/xen-orchestra/pull/4294))
|
||||||
- [User] Forget connection tokens on password change or on demand [#4214](https://github.com/vatesfr/xen-orchestra/issues/4214) (PR [#4224](https://github.com/vatesfr/xen-orchestra/pull/4224))
|
- [Host] Display warning when "Citrix Hypervisor" license has restrictions [#4251](https://github.com/vatesfr/xen-orchestra/issues/4164) (PR [#4235](https://github.com/vatesfr/xen-orchestra/pull/4279))
|
||||||
- [Settings/Logs] LICENCE_RESTRICTION errors: suggest XCP-ng as an Open Source alternative [#3876](https://github.com/vatesfr/xen-orchestra/issues/3876) (PR [#4238](https://github.com/vatesfr/xen-orchestra/pull/4238))
|
- [VM/Backup] Create backup bulk action [#2573](https://github.com/vatesfr/xen-orchestra/issues/2573) (PR [#4257](https://github.com/vatesfr/xen-orchestra/pull/4257))
|
||||||
- [VM/Migrate] Display VDI size on migrate modal [#2534](https://github.com/vatesfr/xen-orchestra/issues/2534) (PR [#4250](https://github.com/vatesfr/xen-orchestra/pull/4250))
|
- [Sr/new] Ability to select NFS version when creating NFS storage [#3951](https://github.com/vatesfr/xen-orchestra/issues/#3951) (PR [#4277](https://github.com/vatesfr/xen-orchestra/pull/4277))
|
||||||
|
- [SR/new] Create ZFS storage [#4260](https://github.com/vatesfr/xen-orchestra/issues/4260) (PR [#4266](https://github.com/vatesfr/xen-orchestra/pull/4266))
|
||||||
|
- [Host] Display warning when host's time differs too much from XOA's time [#4113](https://github.com/vatesfr/xen-orchestra/issues/4113) (PR [#4173](https://github.com/vatesfr/xen-orchestra/pull/4173))
|
||||||
|
- [Host/storages, SR/hosts] Display PBD details [#4264](https://github.com/vatesfr/xen-orchestra/issues/4161) (PR [#4268](https://github.com/vatesfr/xen-orchestra/pull/4284))
|
||||||
|
- [VM/network] Display and set bandwidth rate-limit of a VIF [#4215](https://github.com/vatesfr/xen-orchestra/issues/4215) (PR [#4293](https://github.com/vatesfr/xen-orchestra/pull/4293))
|
||||||
|
- [Settings/servers] Display servers connection issues [#4300](https://github.com/vatesfr/xen-orchestra/issues/4300) (PR [#4310](https://github.com/vatesfr/xen-orchestra/pull/4310))
|
||||||
|
|
||||||
### Bug fixes
|
### Bug fixes
|
||||||
|
|
||||||
- [Charts] Fixed the chart lines sometimes changing order/color (PR [#4221](https://github.com/vatesfr/xen-orchestra/pull/4221))
|
- [Metadata backup] Missing XAPIs should trigger a failure job [#4281](https://github.com/vatesfr/xen-orchestra/issues/4281) (PR [#4283](https://github.com/vatesfr/xen-orchestra/pull/4283))
|
||||||
- Prevent non-admin users to access admin pages with URL
|
- [Host/advanced] Fix host CPU hyperthreading detection [#4262](https://github.com/vatesfr/xen-orchestra/issues/4262) (PR [#4285](https://github.com/vatesfr/xen-orchestra/pull/4285))
|
||||||
- [Upgrade] Fix alert before upgrade while running backup jobs (PR [#4235](https://github.com/vatesfr/xen-orchestra/pull/4235))
|
|
||||||
- [Import] Fix import OVA files (PR [#4232](https://github.com/vatesfr/xen-orchestra/pull/4232))
|
|
||||||
- [VM/network] Fix duplicate IPv4 (PR [#4239](https://github.com/vatesfr/xen-orchestra/pull/4239))
|
|
||||||
- [Remotes] Fix disconnected remotes which may appear to work
|
|
||||||
- [Host] Fix incorrect hypervisor name [#4246](https://github.com/vatesfr/xen-orchestra/issues/4246) (PR [#4248](https://github.com/vatesfr/xen-orchestra/pull/4248))
|
|
||||||
|
|
||||||
### Released packages
|
### Released packages
|
||||||
|
|
||||||
- xo-server v5.42.0
|
- xen-api v0.26.0
|
||||||
- xo-web v5.42.0
|
- xo-server-auth-saml v0.6.0
|
||||||
|
- xo-server-backup-reports v0.16.2
|
||||||
|
- xo-server v5.44.0
|
||||||
|
- xo-web v5.44.0
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
"eslint-plugin-react": "^7.6.1",
|
"eslint-plugin-react": "^7.6.1",
|
||||||
"eslint-plugin-standard": "^4.0.0",
|
"eslint-plugin-standard": "^4.0.0",
|
||||||
"exec-promise": "^0.7.0",
|
"exec-promise": "^0.7.0",
|
||||||
"flow-bin": "^0.98.0",
|
"flow-bin": "^0.100.0",
|
||||||
"globby": "^9.0.0",
|
"globby": "^9.0.0",
|
||||||
"husky": "^2.2.0",
|
"husky": "^2.2.0",
|
||||||
"jest": "^24.1.0",
|
"jest": "^24.1.0",
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
"cross-env": "^5.1.3",
|
"cross-env": "^5.1.3",
|
||||||
"execa": "^1.0.0",
|
"execa": "^1.0.0",
|
||||||
"fs-promise": "^2.0.0",
|
"fs-promise": "^2.0.0",
|
||||||
"get-stream": "^4.0.0",
|
"get-stream": "^5.1.0",
|
||||||
"index-modules": "^0.3.0",
|
"index-modules": "^0.3.0",
|
||||||
"readable-stream": "^3.0.6",
|
"readable-stream": "^3.0.6",
|
||||||
"rimraf": "^2.6.2",
|
"rimraf": "^2.6.2",
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
"human-format": "^0.10.0",
|
"human-format": "^0.10.0",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
"pw": "^0.0.4",
|
"pw": "^0.0.4",
|
||||||
"xen-api": "^0.25.1"
|
"xen-api": "^0.25.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/cli": "^7.1.5",
|
"@babel/cli": "^7.1.5",
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ console.log(xapi.pool.$master.$resident_VMs[0].name_label)
|
|||||||
A CLI is provided to help exploration and discovery of the XAPI.
|
A CLI is provided to help exploration and discovery of the XAPI.
|
||||||
|
|
||||||
```
|
```
|
||||||
> xen-api https://xen1.company.net root
|
> xen-api xen1.company.net root
|
||||||
Password: ******
|
Password: ******
|
||||||
root@xen1.company.net> xapi.status
|
root@xen1.company.net> xapi.status
|
||||||
'connected'
|
'connected'
|
||||||
@@ -92,6 +92,14 @@ root@xen1.company.net> xapi.pool.$master.name_label
|
|||||||
'xen1'
|
'xen1'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can optionally prefix the address by a protocol: `https://` (default) or `http://`.
|
||||||
|
|
||||||
|
In case of error due to invalid or self-signed certificates you can use the `--allow-unauthorized` flag (or `--au`):
|
||||||
|
|
||||||
|
```
|
||||||
|
> xen-api --au xen1.company.net root
|
||||||
|
```
|
||||||
|
|
||||||
To ease searches, `find()` and `findAll()` functions are available:
|
To ease searches, `find()` and `findAll()` functions are available:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "xen-api",
|
"name": "xen-api",
|
||||||
"version": "0.25.1",
|
"version": "0.25.2",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"description": "Connector to the Xen API",
|
"description": "Connector to the Xen API",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
|
|||||||
@@ -99,6 +99,9 @@ export class Xapi extends EventEmitter {
|
|||||||
this._sessionId = undefined
|
this._sessionId = undefined
|
||||||
this._status = DISCONNECTED
|
this._status = DISCONNECTED
|
||||||
|
|
||||||
|
this._lastCatchedEventError = null
|
||||||
|
this._lastSuccessfulFetchTime = undefined
|
||||||
|
|
||||||
this._debounce = opts.debounce ?? 200
|
this._debounce = opts.debounce ?? 200
|
||||||
this._objects = new Collection()
|
this._objects = new Collection()
|
||||||
this._objectsByRef = { __proto__: null }
|
this._objectsByRef = { __proto__: null }
|
||||||
@@ -585,6 +588,14 @@ export class Xapi extends EventEmitter {
|
|||||||
throw new Error('no object with UUID: ' + uuid)
|
throw new Error('no object with UUID: ' + uuid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get lastCatchedEventError() {
|
||||||
|
return this._lastCatchedEventError
|
||||||
|
}
|
||||||
|
|
||||||
|
get lastSuccessfulFetchTime() {
|
||||||
|
return this._lastSuccessfulFetchTime
|
||||||
|
}
|
||||||
|
|
||||||
// manually run events watching if set to `false` in constructor
|
// manually run events watching if set to `false` in constructor
|
||||||
watchEvents() {
|
watchEvents() {
|
||||||
ignoreErrors.call(this._watchEvents())
|
ignoreErrors.call(this._watchEvents())
|
||||||
@@ -945,12 +956,14 @@ export class Xapi extends EventEmitter {
|
|||||||
],
|
],
|
||||||
EVENT_TIMEOUT * 1e3 * 1.1
|
EVENT_TIMEOUT * 1e3 * 1.1
|
||||||
)
|
)
|
||||||
|
this._lastSuccessfulFetchTime = Date.now()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (error?.code === 'EVENTS_LOST') {
|
if (error?.code === 'EVENTS_LOST') {
|
||||||
// eslint-disable-next-line no-labels
|
// eslint-disable-next-line no-labels
|
||||||
continue mainLoop
|
continue mainLoop
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._lastCatchedEventError = error
|
||||||
console.warn('_watchEvents', error)
|
console.warn('_watchEvents', error)
|
||||||
await pDelay(this._eventPollDelay)
|
await pDelay(this._eventPollDelay)
|
||||||
continue
|
continue
|
||||||
@@ -1059,9 +1072,14 @@ export class Xapi extends EventEmitter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
props[`add_to_${field}`] = function(...values) {
|
props[`add_${field}`] = function(value) {
|
||||||
return xapi
|
return xapi
|
||||||
.call(`${type}.add_${field}`, this.$ref, values)
|
.call(`${type}.add_${field}`, this.$ref, value)
|
||||||
|
.then(noop)
|
||||||
|
}
|
||||||
|
props[`remove_${field}`] = function(value) {
|
||||||
|
return xapi
|
||||||
|
.call(`${type}.remove_${field}`, this.$ref, value)
|
||||||
.then(noop)
|
.then(noop)
|
||||||
}
|
}
|
||||||
} else if (value !== null && typeof value === 'object') {
|
} else if (value !== null && typeof value === 'object') {
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"passport-saml": "^1.0.0"
|
"passport-saml": "^1.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/cli": "^7.0.0",
|
"@babel/cli": "^7.0.0",
|
||||||
|
|||||||
@@ -24,7 +24,10 @@ export const configurationSchema = {
|
|||||||
},
|
},
|
||||||
usernameField: {
|
usernameField: {
|
||||||
title: 'Username field',
|
title: 'Username field',
|
||||||
description: 'Field to use as the XO username',
|
description: `Field to use as the XO username
|
||||||
|
|
||||||
|
You should try \`http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress\` if you are using Microsoft Azure Active Directory.
|
||||||
|
`,
|
||||||
type: 'string',
|
type: 'string',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -142,12 +142,14 @@ const getErrorMarkdown = task => {
|
|||||||
|
|
||||||
const MARKDOWN_BY_TYPE = {
|
const MARKDOWN_BY_TYPE = {
|
||||||
pool(task, { formatDate }) {
|
pool(task, { formatDate }) {
|
||||||
const { pool, poolMaster = {} } = task.data
|
const { id, pool = {}, poolMaster = {} } = task.data
|
||||||
const name = pool.name_label || poolMaster.name_label || UNKNOWN_ITEM
|
const name = pool.name_label || poolMaster.name_label || UNKNOWN_ITEM
|
||||||
|
|
||||||
return {
|
return {
|
||||||
body: [
|
body: [
|
||||||
`- **UUID**: ${pool.uuid}`,
|
pool.uuid !== undefined
|
||||||
|
? `- **UUID**: ${pool.uuid}`
|
||||||
|
: `- **ID**: ${id}`,
|
||||||
...getTemporalDataMarkdown(task.end, task.start, formatDate),
|
...getTemporalDataMarkdown(task.end, task.start, formatDate),
|
||||||
getErrorMarkdown(task),
|
getErrorMarkdown(task),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -49,6 +49,11 @@ maxTokenValidity = '0.5 year'
|
|||||||
# Delay for which backups listing on a remote is cached
|
# Delay for which backups listing on a remote is cached
|
||||||
listingDebounce = '1 min'
|
listingDebounce = '1 min'
|
||||||
|
|
||||||
|
# Duration for which we can wait for the backup size before returning
|
||||||
|
#
|
||||||
|
# It should be short to avoid blocking the display of the available backups.
|
||||||
|
vmBackupSizeTimeout = '2 seconds'
|
||||||
|
|
||||||
# Helmet handles HTTP security via headers
|
# Helmet handles HTTP security via headers
|
||||||
#
|
#
|
||||||
# https://helmetjs.github.io/docs/
|
# https://helmetjs.github.io/docs/
|
||||||
@@ -82,5 +87,8 @@ mountsDir = '/run/xo-server/mounts'
|
|||||||
# timeout in milliseconds (set to 0 to disable)
|
# timeout in milliseconds (set to 0 to disable)
|
||||||
timeout = 600e3
|
timeout = 600e3
|
||||||
|
|
||||||
|
# timeout before reporting server issue
|
||||||
|
noEventsTimeout = '5 minutes'
|
||||||
|
|
||||||
# see https:#github.com/vatesfr/xen-orchestra/issues/3419
|
# see https:#github.com/vatesfr/xen-orchestra/issues/3419
|
||||||
# useSudo = false
|
# useSudo = false
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"name": "xo-server",
|
"name": "xo-server",
|
||||||
"version": "5.42.0",
|
"version": "5.43.0",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"description": "Server part of Xen-Orchestra",
|
"description": "Server part of Xen-Orchestra",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
@@ -123,7 +123,7 @@
|
|||||||
"value-matcher": "^0.2.0",
|
"value-matcher": "^0.2.0",
|
||||||
"vhd-lib": "^0.7.0",
|
"vhd-lib": "^0.7.0",
|
||||||
"ws": "^6.0.0",
|
"ws": "^6.0.0",
|
||||||
"xen-api": "^0.25.1",
|
"xen-api": "^0.25.2",
|
||||||
"xml2js": "^0.4.19",
|
"xml2js": "^0.4.19",
|
||||||
"xo-acl-resolver": "^0.4.1",
|
"xo-acl-resolver": "^0.4.1",
|
||||||
"xo-collection": "^0.4.1",
|
"xo-collection": "^0.4.1",
|
||||||
|
|||||||
@@ -183,6 +183,7 @@ getLogs.params = {
|
|||||||
after: { type: ['number', 'string'], optional: true },
|
after: { type: ['number', 'string'], optional: true },
|
||||||
before: { type: ['number', 'string'], optional: true },
|
before: { type: ['number', 'string'], optional: true },
|
||||||
limit: { type: 'number', optional: true },
|
limit: { type: 'number', optional: true },
|
||||||
|
'*': { type: 'any' },
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -4,23 +4,19 @@ import { format, JsonRpcError } from 'json-rpc-peer'
|
|||||||
|
|
||||||
export async function set({
|
export async function set({
|
||||||
host,
|
host,
|
||||||
multipathing,
|
|
||||||
|
|
||||||
// TODO: use camel case.
|
multipathing,
|
||||||
name_label: nameLabel,
|
name_label: nameLabel,
|
||||||
name_description: nameDescription,
|
name_description: nameDescription,
|
||||||
}) {
|
}) {
|
||||||
const xapi = this.getXapi(host)
|
host = this.getXapiObject(host)
|
||||||
const hostId = host._xapiId
|
|
||||||
|
|
||||||
if (multipathing !== undefined) {
|
await Promise.all([
|
||||||
await xapi.setHostMultipathing(hostId, multipathing)
|
nameDescription !== undefined && host.set_name_description(nameDescription),
|
||||||
}
|
nameLabel !== undefined && host.set_name_label(nameLabel),
|
||||||
|
multipathing !== undefined &&
|
||||||
return xapi.setHostProperties(hostId, {
|
host.$xapi.setHostMultipathing(host.$id, multipathing),
|
||||||
nameLabel,
|
])
|
||||||
nameDescription,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set.description = 'changes the properties of an host'
|
set.description = 'changes the properties of an host'
|
||||||
@@ -215,6 +211,25 @@ emergencyShutdownHost.resolve = {
|
|||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function isHostServerTimeConsistent({ host }) {
|
||||||
|
try {
|
||||||
|
await this.getXapi(host).assertConsistentHostServerTime(host._xapiRef)
|
||||||
|
return true
|
||||||
|
} catch (e) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isHostServerTimeConsistent.params = {
|
||||||
|
host: { type: 'string' },
|
||||||
|
}
|
||||||
|
|
||||||
|
isHostServerTimeConsistent.resolve = {
|
||||||
|
host: ['host', 'host', 'administrate'],
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
|
||||||
export function stats({ host, granularity }) {
|
export function stats({ host, granularity }) {
|
||||||
return this.getXapiHostStats(host._xapiId, granularity)
|
return this.getXapiHostStats(host._xapiId, granularity)
|
||||||
}
|
}
|
||||||
@@ -269,3 +284,19 @@ installSupplementalPack.params = {
|
|||||||
installSupplementalPack.resolve = {
|
installSupplementalPack.resolve = {
|
||||||
host: ['host', 'host', 'admin'],
|
host: ['host', 'host', 'admin'],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
|
||||||
|
export function isHyperThreadingEnabled({ host }) {
|
||||||
|
return this.getXapi(host).isHyperThreadingEnabled(host._xapiId)
|
||||||
|
}
|
||||||
|
|
||||||
|
isHyperThreadingEnabled.description = 'get hyper-threading information'
|
||||||
|
|
||||||
|
isHyperThreadingEnabled.params = {
|
||||||
|
id: { type: 'string' },
|
||||||
|
}
|
||||||
|
|
||||||
|
isHyperThreadingEnabled.resolve = {
|
||||||
|
host: ['id', 'host', 'administrate'],
|
||||||
|
}
|
||||||
|
|||||||
@@ -85,18 +85,26 @@ createBonded.description =
|
|||||||
// ===================================================================
|
// ===================================================================
|
||||||
|
|
||||||
export async function set({
|
export async function set({
|
||||||
|
network,
|
||||||
|
|
||||||
automatic,
|
automatic,
|
||||||
defaultIsLocked,
|
defaultIsLocked,
|
||||||
name_description: nameDescription,
|
name_description: nameDescription,
|
||||||
name_label: nameLabel,
|
name_label: nameLabel,
|
||||||
network,
|
|
||||||
}) {
|
}) {
|
||||||
await this.getXapi(network).setNetworkProperties(network._xapiId, {
|
network = this.getXapiObject(network)
|
||||||
automatic,
|
|
||||||
defaultIsLocked,
|
await Promise.all([
|
||||||
nameDescription,
|
automatic !== undefined &&
|
||||||
nameLabel,
|
network.update_other_config('automatic', automatic ? 'true' : null),
|
||||||
})
|
defaultIsLocked !== undefined &&
|
||||||
|
network.set_default_locking_mode(
|
||||||
|
defaultIsLocked ? 'disabled' : 'unlocked'
|
||||||
|
),
|
||||||
|
nameDescription !== undefined &&
|
||||||
|
network.set_name_description(nameDescription),
|
||||||
|
nameLabel !== undefined && network.set_name_label(nameLabel),
|
||||||
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
set.params = {
|
set.params = {
|
||||||
|
|||||||
@@ -5,14 +5,15 @@ import { format, JsonRPcError } from 'json-rpc-peer'
|
|||||||
export async function set({
|
export async function set({
|
||||||
pool,
|
pool,
|
||||||
|
|
||||||
// TODO: use camel case.
|
|
||||||
name_description: nameDescription,
|
name_description: nameDescription,
|
||||||
name_label: nameLabel,
|
name_label: nameLabel,
|
||||||
}) {
|
}) {
|
||||||
await this.getXapi(pool).setPoolProperties({
|
pool = this.getXapiObject(pool)
|
||||||
nameDescription,
|
|
||||||
nameLabel,
|
await Promise.all([
|
||||||
})
|
nameDescription !== undefined && pool.set_name_description(nameDescription),
|
||||||
|
nameLabel !== undefined && pool.set_name_label(nameLabel),
|
||||||
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
set.params = {
|
set.params = {
|
||||||
|
|||||||
@@ -10,14 +10,15 @@ import { forEach, parseXml } from '../utils'
|
|||||||
export async function set({
|
export async function set({
|
||||||
sr,
|
sr,
|
||||||
|
|
||||||
// TODO: use camel case.
|
|
||||||
name_description: nameDescription,
|
name_description: nameDescription,
|
||||||
name_label: nameLabel,
|
name_label: nameLabel,
|
||||||
}) {
|
}) {
|
||||||
await this.getXapi(sr).setSrProperties(sr._xapiId, {
|
sr = this.getXapiObject(sr)
|
||||||
nameDescription,
|
|
||||||
nameLabel,
|
await Promise.all([
|
||||||
})
|
nameDescription !== undefined && sr.set_name_description(nameDescription),
|
||||||
|
nameLabel !== undefined && sr.set_name_label(nameLabel),
|
||||||
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
set.params = {
|
set.params = {
|
||||||
@@ -179,6 +180,35 @@ createIso.resolve = {
|
|||||||
host: ['host', 'host', 'administrate'],
|
host: ['host', 'host', 'administrate'],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
|
||||||
|
export async function createFile({
|
||||||
|
host,
|
||||||
|
nameLabel,
|
||||||
|
nameDescription,
|
||||||
|
location,
|
||||||
|
}) {
|
||||||
|
const xapi = this.getXapi(host)
|
||||||
|
return xapi.createSr({
|
||||||
|
hostRef: host._xapiRef,
|
||||||
|
name_label: nameLabel,
|
||||||
|
name_description: nameDescription,
|
||||||
|
type: 'file',
|
||||||
|
device_config: { location },
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
createFile.params = {
|
||||||
|
host: { type: 'string' },
|
||||||
|
nameLabel: { type: 'string' },
|
||||||
|
nameDescription: { type: 'string' },
|
||||||
|
location: { type: 'string' },
|
||||||
|
}
|
||||||
|
|
||||||
|
createFile.resolve = {
|
||||||
|
host: ['host', 'host', 'administrate'],
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// NFS SR
|
// NFS SR
|
||||||
|
|
||||||
@@ -361,6 +391,58 @@ createExt.resolve = {
|
|||||||
host: ['host', 'host', 'administrate'],
|
host: ['host', 'host', 'administrate'],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// This function helps to detect all ZFS pools
|
||||||
|
// Return a dict of pools with their parameters { <poolname>: {<paramdict>}}
|
||||||
|
// example output (the parameter mountpoint is of interest):
|
||||||
|
// {"tank":
|
||||||
|
// {
|
||||||
|
// "setuid": "on", "relatime": "off", "referenced": "24K", "written": "24K", "zoned": "off", "primarycache": "all",
|
||||||
|
// "logbias": "latency", "creation": "Mon May 27 17:24 2019", "sync": "standard", "snapdev": "hidden",
|
||||||
|
// "dedup": "off", "sharenfs": "off", "usedbyrefreservation": "0B", "sharesmb": "off", "createtxg": "1",
|
||||||
|
// "canmount": "on", "mountpoint": "/tank", "casesensitivity": "sensitive", "utf8only": "off", "xattr": "on",
|
||||||
|
// "dnodesize": "legacy", "mlslabel": "none", "objsetid": "54", "defcontext": "none", "rootcontext": "none",
|
||||||
|
// "mounted": "yes", "compression": "off", "overlay": "off", "logicalused": "47K", "usedbysnapshots": "0B",
|
||||||
|
// "filesystem_count": "none", "copies": "1", "snapshot_limit": "none", "aclinherit": "restricted",
|
||||||
|
// "compressratio": "1.00x", "readonly": "off", "version": "5", "normalization": "none", "filesystem_limit": "none",
|
||||||
|
// "type": "filesystem", "secondarycache": "all", "refreservation": "none", "available": "17.4G", "used": "129K",
|
||||||
|
// "exec": "on", "refquota": "none", "refcompressratio": "1.00x", "quota": "none", "keylocation": "none",
|
||||||
|
// "snapshot_count": "none", "fscontext": "none", "vscan": "off", "reservation": "none", "atime": "on",
|
||||||
|
// "recordsize": "128K", "usedbychildren": "105K", "usedbydataset": "24K", "guid": "656061077639704004",
|
||||||
|
// "pbkdf2iters": "0", "checksum": "on", "special_small_blocks": "0", "redundant_metadata": "all",
|
||||||
|
// "volmode": "default", "devices": "on", "keyformat": "none", "logicalreferenced": "12K", "acltype": "off",
|
||||||
|
// "nbmand": "off", "context": "none", "encryption": "off", "snapdir": "hidden"}}
|
||||||
|
export async function probeZfs({ host }) {
|
||||||
|
const xapi = this.getXapi(host)
|
||||||
|
try {
|
||||||
|
const result = await xapi.call(
|
||||||
|
'host.call_plugin',
|
||||||
|
host._xapiRef,
|
||||||
|
'zfs.py',
|
||||||
|
'list_zfs_pools',
|
||||||
|
{}
|
||||||
|
)
|
||||||
|
return JSON.parse(result)
|
||||||
|
} catch (error) {
|
||||||
|
if (
|
||||||
|
error.code === 'XENAPI_MISSING_PLUGIN' ||
|
||||||
|
error.code === 'UNKNOWN_XENAPI_PLUGIN_FUNCTION'
|
||||||
|
) {
|
||||||
|
return {}
|
||||||
|
} else {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
probeZfs.params = {
|
||||||
|
host: { type: 'string' },
|
||||||
|
}
|
||||||
|
|
||||||
|
probeZfs.resolve = {
|
||||||
|
host: ['host', 'host', 'administrate'],
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// This function helps to detect all NFS shares (exports) on a NFS server
|
// This function helps to detect all NFS shares (exports) on a NFS server
|
||||||
// Return a table of exports with their paths and ACLs
|
// Return a table of exports with their paths and ACLs
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
export async function add({ tag, object }) {
|
export async function add({ tag, object }) {
|
||||||
await this.getXapi(object).addTag(object._xapiId, tag)
|
await this.getXapiObject(object).add_tags(tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
add.description = 'add a new tag to an object'
|
add.description = 'add a new tag to an object'
|
||||||
@@ -16,7 +16,7 @@ add.params = {
|
|||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
|
|
||||||
export async function remove({ tag, object }) {
|
export async function remove({ tag, object }) {
|
||||||
await this.getXapi(object).removeTag(object._xapiId, tag)
|
await this.getXapiObject(object).remove_tags(tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
remove.description = 'remove an existing tag from an object'
|
remove.description = 'remove an existing tag from an object'
|
||||||
|
|||||||
@@ -320,6 +320,11 @@ create.params = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
hvmBootFirmware: { type: 'string', optional: true },
|
||||||
|
|
||||||
|
// other params are passed to `editVm`
|
||||||
|
'*': { type: 'any' },
|
||||||
}
|
}
|
||||||
|
|
||||||
create.resolve = {
|
create.resolve = {
|
||||||
@@ -560,6 +565,8 @@ set.params = {
|
|||||||
// Identifier of the VM to update.
|
// Identifier of the VM to update.
|
||||||
id: { type: 'string' },
|
id: { type: 'string' },
|
||||||
|
|
||||||
|
auto_poweron: { type: 'boolean', optional: true },
|
||||||
|
|
||||||
name_label: { type: 'string', optional: true },
|
name_label: { type: 'string', optional: true },
|
||||||
|
|
||||||
name_description: { type: 'string', optional: true },
|
name_description: { type: 'string', optional: true },
|
||||||
@@ -621,6 +628,9 @@ set.params = {
|
|||||||
|
|
||||||
// set the VM network interface controller
|
// set the VM network interface controller
|
||||||
nicType: { type: ['string', 'null'], optional: true },
|
nicType: { type: ['string', 'null'], optional: true },
|
||||||
|
|
||||||
|
// set the VM boot firmware mode
|
||||||
|
hvmBootFirmware: { type: ['string', 'null'], optional: true },
|
||||||
}
|
}
|
||||||
|
|
||||||
set.resolve = {
|
set.resolve = {
|
||||||
@@ -1360,9 +1370,7 @@ createInterface.resolve = {
|
|||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
|
|
||||||
export async function attachPci({ vm, pciId }) {
|
export async function attachPci({ vm, pciId }) {
|
||||||
const xapi = this.getXapi(vm)
|
await this.getXapiObject(vm).update_other_config('pci', pciId)
|
||||||
|
|
||||||
await xapi.call('VM.add_to_other_config', vm._xapiRef, 'pci', pciId)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
attachPci.params = {
|
attachPci.params = {
|
||||||
@@ -1377,9 +1385,7 @@ attachPci.resolve = {
|
|||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
|
|
||||||
export async function detachPci({ vm }) {
|
export async function detachPci({ vm }) {
|
||||||
const xapi = this.getXapi(vm)
|
await this.getXapiObject(vm).update_other_config('pci', null)
|
||||||
|
|
||||||
await xapi.call('VM.remove_from_other_config', vm._xapiRef, 'pci')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
detachPci.params = {
|
detachPci.params = {
|
||||||
@@ -1416,7 +1422,7 @@ export async function setBootOrder({ vm, order }) {
|
|||||||
throw invalidParameters('You can only set the boot order on a HVM guest')
|
throw invalidParameters('You can only set the boot order on a HVM guest')
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.getXapiObject(vm).set_HVM_boot_params({ order })
|
await this.getXapiObject(vm).update_HVM_boot_params('order', order)
|
||||||
}
|
}
|
||||||
|
|
||||||
setBootOrder.params = {
|
setBootOrder.params = {
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ getAllObjects.description = 'Returns all XO objects'
|
|||||||
getAllObjects.params = {
|
getAllObjects.params = {
|
||||||
filter: { type: 'object', optional: true },
|
filter: { type: 'object', optional: true },
|
||||||
limit: { type: 'number', optional: true },
|
limit: { type: 'number', optional: true },
|
||||||
|
ndjson: { type: 'boolean', optional: true },
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
|
|||||||
@@ -887,10 +887,10 @@ async function createVDIOnLVMWithoutSizeLimit(xapi, lvmSr, diskSize) {
|
|||||||
await xapi.callAsync('SR.scan', xapi.getObject(lvmSr).$ref)
|
await xapi.callAsync('SR.scan', xapi.getObject(lvmSr).$ref)
|
||||||
const vdi = find(xapi.getObject(lvmSr).$VDIs, vdi => vdi.uuid === uuid)
|
const vdi = find(xapi.getObject(lvmSr).$VDIs, vdi => vdi.uuid === uuid)
|
||||||
if (vdi != null) {
|
if (vdi != null) {
|
||||||
await xapi.setSrProperties(vdi.$ref, {
|
await Promise.all([
|
||||||
nameLabel: 'xosan_data',
|
vdi.set_name_description('Created by XO'),
|
||||||
nameDescription: 'Created by XO',
|
vdi.set_name_label('xosan_data'),
|
||||||
})
|
])
|
||||||
return vdi
|
return vdi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1124,7 +1124,7 @@ async function _prepareGlusterVm(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await xapi.addTag(newVM.$id, 'XOSAN')
|
await newVM.add_tags('XOSAN')
|
||||||
await xapi.editVm(newVM, {
|
await xapi.editVm(newVM, {
|
||||||
name_label: `XOSAN - ${lvmSr.name_label} - ${
|
name_label: `XOSAN - ${lvmSr.name_label} - ${
|
||||||
host.name_label
|
host.name_label
|
||||||
|
|||||||
@@ -247,69 +247,6 @@ export default class Xapi extends XapiBase {
|
|||||||
)::ignoreErrors()
|
)::ignoreErrors()
|
||||||
}
|
}
|
||||||
|
|
||||||
async setHostProperties(id, { nameLabel, nameDescription }) {
|
|
||||||
const host = this.getObject(id)
|
|
||||||
await Promise.all([
|
|
||||||
nameDescription !== undefined &&
|
|
||||||
host.set_name_description(nameDescription),
|
|
||||||
nameLabel !== undefined && host.set_name_label(nameLabel),
|
|
||||||
])
|
|
||||||
}
|
|
||||||
|
|
||||||
async setPoolProperties({ autoPoweron, nameLabel, nameDescription }) {
|
|
||||||
const { pool } = this
|
|
||||||
|
|
||||||
await Promise.all([
|
|
||||||
nameDescription !== undefined &&
|
|
||||||
pool.set_name_description(nameDescription),
|
|
||||||
nameLabel !== undefined && pool.set_name_label(nameLabel),
|
|
||||||
autoPoweron != null &&
|
|
||||||
pool.update_other_config('autoPoweron', autoPoweron ? 'true' : null),
|
|
||||||
])
|
|
||||||
}
|
|
||||||
|
|
||||||
async setSrProperties(id, { nameLabel, nameDescription }) {
|
|
||||||
const sr = this.getObject(id)
|
|
||||||
await Promise.all([
|
|
||||||
nameDescription !== undefined && sr.set_name_description(nameDescription),
|
|
||||||
nameLabel !== undefined && sr.set_name_label(nameLabel),
|
|
||||||
])
|
|
||||||
}
|
|
||||||
|
|
||||||
async setNetworkProperties(
|
|
||||||
id,
|
|
||||||
{ automatic, defaultIsLocked, nameDescription, nameLabel }
|
|
||||||
) {
|
|
||||||
let defaultLockingMode
|
|
||||||
if (defaultIsLocked != null) {
|
|
||||||
defaultLockingMode = defaultIsLocked ? 'disabled' : 'unlocked'
|
|
||||||
}
|
|
||||||
const network = this.getObject(id)
|
|
||||||
await Promise.all([
|
|
||||||
defaultLockingMode !== undefined &&
|
|
||||||
network.set_default_locking_mode(defaultLockingMode),
|
|
||||||
nameDescription !== undefined &&
|
|
||||||
network.set_name_description(nameDescription),
|
|
||||||
nameLabel !== undefined && network.set_name_label(nameLabel),
|
|
||||||
automatic !== undefined &&
|
|
||||||
network.update_other_config('automatic', automatic ? 'true' : null),
|
|
||||||
])
|
|
||||||
}
|
|
||||||
|
|
||||||
// =================================================================
|
|
||||||
|
|
||||||
async addTag(id, tag) {
|
|
||||||
const { $ref: ref, $type: type } = this.getObject(id)
|
|
||||||
|
|
||||||
await this.call(`${type}.add_tags`, ref, tag)
|
|
||||||
}
|
|
||||||
|
|
||||||
async removeTag(id, tag) {
|
|
||||||
const { $ref: ref, $type: type } = this.getObject(id)
|
|
||||||
|
|
||||||
await this.call(`${type}.remove_tags`, ref, tag)
|
|
||||||
}
|
|
||||||
|
|
||||||
// =================================================================
|
// =================================================================
|
||||||
|
|
||||||
setDefaultSr(srId) {
|
setDefaultSr(srId) {
|
||||||
@@ -1019,17 +956,21 @@ export default class Xapi extends XapiBase {
|
|||||||
await this._createVmRecord({
|
await this._createVmRecord({
|
||||||
...delta.vm,
|
...delta.vm,
|
||||||
affinity: null,
|
affinity: null,
|
||||||
|
blocked_operations: {
|
||||||
|
...delta.vm.blocked_operations,
|
||||||
|
start: 'Importing…',
|
||||||
|
},
|
||||||
|
ha_always_run: false,
|
||||||
is_a_template: false,
|
is_a_template: false,
|
||||||
|
name_label: `[Importing…] ${name_label}`,
|
||||||
|
other_config: {
|
||||||
|
...delta.vm.other_config,
|
||||||
|
[TAG_COPY_SRC]: delta.vm.uuid,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
$defer.onFailure(() => this._deleteVm(vm))
|
$defer.onFailure(() => this._deleteVm(vm))
|
||||||
|
|
||||||
await Promise.all([
|
|
||||||
vm.set_name_label(`[Importing…] ${name_label}`),
|
|
||||||
vm.update_blocked_operations('start', 'Importing…'),
|
|
||||||
vm.update_other_config(TAG_COPY_SRC, delta.vm.uuid),
|
|
||||||
])
|
|
||||||
|
|
||||||
// 2. Delete all VBDs which may have been created by the import.
|
// 2. Delete all VBDs which may have been created by the import.
|
||||||
await asyncMap(vm.$VBDs, vbd => this._deleteVbd(vbd))::ignoreErrors()
|
await asyncMap(vm.$VBDs, vbd => this._deleteVbd(vbd))::ignoreErrors()
|
||||||
|
|
||||||
@@ -1146,6 +1087,7 @@ export default class Xapi extends XapiBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
|
delta.vm.ha_always_run && vm.set_ha_always_run(true),
|
||||||
vm.set_name_label(name_label),
|
vm.set_name_label(name_label),
|
||||||
// FIXME: move
|
// FIXME: move
|
||||||
vm.update_blocked_operations(
|
vm.update_blocked_operations(
|
||||||
@@ -1376,11 +1318,7 @@ export default class Xapi extends XapiBase {
|
|||||||
$defer.onFailure(() => this._deleteVm(vm))
|
$defer.onFailure(() => this._deleteVm(vm))
|
||||||
// Disable start and change the VM name label during import.
|
// Disable start and change the VM name label during import.
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
this.addForbiddenOperationToVm(
|
vm.update_blocked_operations('start', 'OVA import in progress...'),
|
||||||
vm.$id,
|
|
||||||
'start',
|
|
||||||
'OVA import in progress...'
|
|
||||||
),
|
|
||||||
vm.set_name_label(`[Importing...] ${nameLabel}`),
|
vm.set_name_label(`[Importing...] ${nameLabel}`),
|
||||||
])
|
])
|
||||||
|
|
||||||
@@ -1441,7 +1379,7 @@ export default class Xapi extends XapiBase {
|
|||||||
|
|
||||||
// Enable start and restore the VM name label after import.
|
// Enable start and restore the VM name label after import.
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
this.removeForbiddenOperationFromVm(vm.$id, 'start'),
|
vm.update_blocked_operations('start', null),
|
||||||
vm.set_name_label(nameLabel),
|
vm.set_name_label(nameLabel),
|
||||||
])
|
])
|
||||||
return vm
|
return vm
|
||||||
@@ -1671,24 +1609,6 @@ export default class Xapi extends XapiBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// vm_operations: http://xapi-project.github.io/xen-api/classes/vm.html
|
|
||||||
async addForbiddenOperationToVm(vmId, operation, reason) {
|
|
||||||
await this.call(
|
|
||||||
'VM.add_to_blocked_operations',
|
|
||||||
this.getObject(vmId).$ref,
|
|
||||||
operation,
|
|
||||||
`[XO] ${reason}`
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
async removeForbiddenOperationFromVm(vmId, operation) {
|
|
||||||
await this.call(
|
|
||||||
'VM.remove_from_blocked_operations',
|
|
||||||
this.getObject(vmId).$ref,
|
|
||||||
operation
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// =================================================================
|
// =================================================================
|
||||||
|
|
||||||
async createVbd({
|
async createVbd({
|
||||||
@@ -2416,7 +2336,7 @@ export default class Xapi extends XapiBase {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
async _assertConsistentHostServerTime(hostRef) {
|
async assertConsistentHostServerTime(hostRef) {
|
||||||
const delta =
|
const delta =
|
||||||
parseDateTime(await this.call('host.get_servertime', hostRef)).getTime() -
|
parseDateTime(await this.call('host.get_servertime', hostRef)).getTime() -
|
||||||
Date.now()
|
Date.now()
|
||||||
@@ -2428,4 +2348,27 @@ export default class Xapi extends XapiBase {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async isHyperThreadingEnabled(hostId) {
|
||||||
|
try {
|
||||||
|
return (
|
||||||
|
(await this.call(
|
||||||
|
'host.call_plugin',
|
||||||
|
this.getObject(hostId).$ref,
|
||||||
|
'hyperthreading.py',
|
||||||
|
'get_hyperthreading',
|
||||||
|
{}
|
||||||
|
)) !== 'false'
|
||||||
|
)
|
||||||
|
} catch (error) {
|
||||||
|
if (
|
||||||
|
error.code === 'XENAPI_MISSING_PLUGIN' ||
|
||||||
|
error.code === 'UNKNOWN_XENAPI_PLUGIN_FUNCTION'
|
||||||
|
) {
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,6 @@ declare export class Xapi {
|
|||||||
): Promise<void>;
|
): Promise<void>;
|
||||||
_snapshotVm(cancelToken: mixed, vm: Vm, nameLabel?: string): Promise<Vm>;
|
_snapshotVm(cancelToken: mixed, vm: Vm, nameLabel?: string): Promise<Vm>;
|
||||||
|
|
||||||
addTag(object: Id, tag: string): Promise<void>;
|
|
||||||
barrier(): Promise<void>;
|
barrier(): Promise<void>;
|
||||||
barrier(ref: string): Promise<XapiObject>;
|
barrier(ref: string): Promise<XapiObject>;
|
||||||
deleteVm(vm: Id): Promise<void>;
|
deleteVm(vm: Id): Promise<void>;
|
||||||
|
|||||||
@@ -84,4 +84,32 @@ export default {
|
|||||||
})
|
})
|
||||||
return unhealthyVdis
|
return unhealthyVdis
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async createSr({
|
||||||
|
hostRef,
|
||||||
|
|
||||||
|
content_type = 'user', // recommended by Citrix
|
||||||
|
device_config = {},
|
||||||
|
name_description = '',
|
||||||
|
name_label,
|
||||||
|
shared = false,
|
||||||
|
physical_size = 0,
|
||||||
|
sm_config = {},
|
||||||
|
type,
|
||||||
|
}) {
|
||||||
|
const srRef = await this.call(
|
||||||
|
'SR.create',
|
||||||
|
hostRef,
|
||||||
|
device_config,
|
||||||
|
physical_size,
|
||||||
|
name_label,
|
||||||
|
name_description,
|
||||||
|
type,
|
||||||
|
content_type,
|
||||||
|
shared,
|
||||||
|
sm_config
|
||||||
|
)
|
||||||
|
|
||||||
|
return (await this.barrier(srRef)).uuid
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,15 +107,12 @@ export default {
|
|||||||
|
|
||||||
if (isHvm) {
|
if (isHvm) {
|
||||||
if (!isEmpty(vdis) || installMethod === 'network') {
|
if (!isEmpty(vdis) || installMethod === 'network') {
|
||||||
const { HVM_boot_params: bootParams } = vm
|
const { order } = vm.HVM_boot_params
|
||||||
let order = bootParams.order
|
|
||||||
if (order) {
|
|
||||||
order = 'n' + order.replace('n', '')
|
|
||||||
} else {
|
|
||||||
order = 'ncd'
|
|
||||||
}
|
|
||||||
|
|
||||||
vm.set_HVM_boot_params({ ...bootParams, order })
|
vm.update_HVM_boot_params(
|
||||||
|
'order',
|
||||||
|
order ? 'n' + order.replace('n', '') : 'ncd'
|
||||||
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// PV
|
// PV
|
||||||
@@ -268,11 +265,8 @@ export default {
|
|||||||
autoPoweron: {
|
autoPoweron: {
|
||||||
set(value, vm) {
|
set(value, vm) {
|
||||||
return Promise.all([
|
return Promise.all([
|
||||||
vm.update_other_config('autoPoweron', value ? 'true' : null),
|
vm.update_other_config('auto_poweron', value ? 'true' : null),
|
||||||
value &&
|
value && vm.$pool.update_other_config('auto_poweron', 'true'),
|
||||||
this.setPoolProperties({
|
|
||||||
autoPoweron: true,
|
|
||||||
}),
|
|
||||||
])
|
])
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -455,6 +449,10 @@ export default {
|
|||||||
get: vm => +vm.start_delay,
|
get: vm => +vm.start_delay,
|
||||||
set: (startDelay, vm) => vm.set_start_delay(startDelay),
|
set: (startDelay, vm) => vm.set_start_delay(startDelay),
|
||||||
},
|
},
|
||||||
|
|
||||||
|
hvmBootFirmware: {
|
||||||
|
set: (firmware, vm) => vm.update_HVM_boot_params('firmware', firmware),
|
||||||
|
},
|
||||||
}),
|
}),
|
||||||
|
|
||||||
async editVm(id, props, checkLimits) {
|
async editVm(id, props, checkLimits) {
|
||||||
|
|||||||
@@ -60,8 +60,9 @@ function checkParams(method, params) {
|
|||||||
|
|
||||||
const result = schemaInspector.validate(
|
const result = schemaInspector.validate(
|
||||||
{
|
{
|
||||||
type: 'object',
|
|
||||||
properties: schema,
|
properties: schema,
|
||||||
|
strict: true,
|
||||||
|
type: 'object',
|
||||||
},
|
},
|
||||||
params
|
params
|
||||||
)
|
)
|
||||||
@@ -261,11 +262,15 @@ export default class Api {
|
|||||||
//
|
//
|
||||||
// The goal here is to standardize the calls by always providing
|
// The goal here is to standardize the calls by always providing
|
||||||
// an id parameter when possible to simplify calls to the API.
|
// an id parameter when possible to simplify calls to the API.
|
||||||
if (params != null && params.id === undefined) {
|
if (params?.id === undefined) {
|
||||||
const namespace = name.slice(0, name.indexOf('.'))
|
const namespace = name.slice(0, name.indexOf('.'))
|
||||||
const id = params[namespace]
|
const spec = method.params
|
||||||
if (typeof id === 'string') {
|
if (spec !== undefined && 'id' in spec && !(namespace in spec)) {
|
||||||
params.id = id
|
const id = params[namespace]
|
||||||
|
if (typeof id === 'string') {
|
||||||
|
delete params[namespace]
|
||||||
|
params.id = id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
import ms from 'ms'
|
import ms from 'ms'
|
||||||
import { forEach, isEmpty, iteratee, sortedIndexBy } from 'lodash'
|
import { forEach, isEmpty, iteratee, sortedIndexBy } from 'lodash'
|
||||||
import { noSuchObject } from 'xo-common/api-errors'
|
|
||||||
|
|
||||||
const isSkippedError = error =>
|
const isSkippedError = error =>
|
||||||
error.message === 'no disks found' ||
|
error.message === 'no disks found' ||
|
||||||
noSuchObject.is(error) ||
|
|
||||||
error.message === 'no VMs match this pattern' ||
|
error.message === 'no VMs match this pattern' ||
|
||||||
error.message === 'unhealthy VDI chain'
|
error.message === 'unhealthy VDI chain'
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import {
|
|||||||
ignoreErrors,
|
ignoreErrors,
|
||||||
pFinally,
|
pFinally,
|
||||||
pFromEvent,
|
pFromEvent,
|
||||||
|
timeout,
|
||||||
} from 'promise-toolbox'
|
} from 'promise-toolbox'
|
||||||
import Vhd, {
|
import Vhd, {
|
||||||
chainVhd,
|
chainVhd,
|
||||||
@@ -41,6 +42,7 @@ import { type CallJob, type Executor, type Job } from '../jobs'
|
|||||||
import { type Schedule } from '../scheduling'
|
import { type Schedule } from '../scheduling'
|
||||||
|
|
||||||
import createSizeStream from '../../size-stream'
|
import createSizeStream from '../../size-stream'
|
||||||
|
import parseDuration from '../../_parseDuration'
|
||||||
import {
|
import {
|
||||||
type DeltaVmExport,
|
type DeltaVmExport,
|
||||||
type DeltaVmImport,
|
type DeltaVmImport,
|
||||||
@@ -286,7 +288,7 @@ const importers: $Dict<
|
|||||||
xapi.importVm(xva, { srId: sr.$id })
|
xapi.importVm(xva, { srId: sr.$id })
|
||||||
)
|
)
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
xapi.addTag(vm.$id, 'restored from backup'),
|
vm.add_tags('restored from backup'),
|
||||||
xapi.editVm(vm.$id, {
|
xapi.editVm(vm.$id, {
|
||||||
name_label: `${metadata.vm.name_label} (${safeDateFormat(
|
name_label: `${metadata.vm.name_label} (${safeDateFormat(
|
||||||
metadata.timestamp
|
metadata.timestamp
|
||||||
@@ -450,7 +452,7 @@ const disableVmHighAvailability = async (xapi: Xapi, vm: Vm) => {
|
|||||||
|
|
||||||
return Promise.all([
|
return Promise.all([
|
||||||
vm.set_ha_restart_priority(''),
|
vm.set_ha_restart_priority(''),
|
||||||
xapi.addTag(vm.$ref, 'HA disabled'),
|
vm.add_tags('HA disabled'),
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -507,9 +509,17 @@ const disableVmHighAvailability = async (xapi: Xapi, vm: Vm) => {
|
|||||||
// │ │ ├─ task.start(message: 'transfer')
|
// │ │ ├─ task.start(message: 'transfer')
|
||||||
// │ │ │ ├─ task.warning(message: string)
|
// │ │ │ ├─ task.warning(message: string)
|
||||||
// │ │ │ └─ task.end(result: { size: number })
|
// │ │ │ └─ task.end(result: { size: number })
|
||||||
|
// │ │ │
|
||||||
|
// │ │ │ // in case of full backup, DR and CR
|
||||||
|
// │ │ ├─ task.start(message: 'clean')
|
||||||
|
// │ │ │ ├─ task.warning(message: string)
|
||||||
|
// │ │ │ └─ task.end
|
||||||
|
// │ │ │
|
||||||
|
// │ │ │ // in case of delta backup
|
||||||
// │ │ ├─ task.start(message: 'merge')
|
// │ │ ├─ task.start(message: 'merge')
|
||||||
// │ │ │ ├─ task.warning(message: string)
|
// │ │ │ ├─ task.warning(message: string)
|
||||||
// │ │ │ └─ task.end(result: { size: number })
|
// │ │ │ └─ task.end(result: { size: number })
|
||||||
|
// │ │ │
|
||||||
// │ │ └─ task.end
|
// │ │ └─ task.end
|
||||||
// │ └─ task.end
|
// │ └─ task.end
|
||||||
// └─ job.end
|
// └─ job.end
|
||||||
@@ -536,10 +546,11 @@ export default class BackupNg {
|
|||||||
return this._runningRestores
|
return this._runningRestores
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(app: any) {
|
constructor(app: any, { backup }) {
|
||||||
this._app = app
|
this._app = app
|
||||||
this._logger = undefined
|
this._logger = undefined
|
||||||
this._runningRestores = new Set()
|
this._runningRestores = new Set()
|
||||||
|
this._backupOptions = backup
|
||||||
|
|
||||||
app.on('start', async () => {
|
app.on('start', async () => {
|
||||||
this._logger = await app.getLogger('restore')
|
this._logger = await app.getLogger('restore')
|
||||||
@@ -1191,11 +1202,20 @@ export default class BackupNg {
|
|||||||
)
|
)
|
||||||
): any)
|
): any)
|
||||||
|
|
||||||
|
const deleteOldBackups = () =>
|
||||||
|
wrapTask(
|
||||||
|
{
|
||||||
|
logger,
|
||||||
|
message: 'clean',
|
||||||
|
parentId: taskId,
|
||||||
|
},
|
||||||
|
this._deleteFullVmBackups(handler, oldBackups)
|
||||||
|
)
|
||||||
const deleteFirst = getSetting(settings, 'deleteFirst', [
|
const deleteFirst = getSetting(settings, 'deleteFirst', [
|
||||||
remoteId,
|
remoteId,
|
||||||
])
|
])
|
||||||
if (deleteFirst) {
|
if (deleteFirst) {
|
||||||
await this._deleteFullVmBackups(handler, oldBackups)
|
await deleteOldBackups()
|
||||||
}
|
}
|
||||||
|
|
||||||
await wrapTask(
|
await wrapTask(
|
||||||
@@ -1211,7 +1231,7 @@ export default class BackupNg {
|
|||||||
await handler.outputFile(metadataFilename, jsonMetadata)
|
await handler.outputFile(metadataFilename, jsonMetadata)
|
||||||
|
|
||||||
if (!deleteFirst) {
|
if (!deleteFirst) {
|
||||||
await this._deleteFullVmBackups(handler, oldBackups)
|
await deleteOldBackups()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -1242,9 +1262,18 @@ export default class BackupNg {
|
|||||||
listReplicatedVms(xapi, scheduleId, srId, vmUuid)
|
listReplicatedVms(xapi, scheduleId, srId, vmUuid)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const deleteOldBackups = () =>
|
||||||
|
wrapTask(
|
||||||
|
{
|
||||||
|
logger,
|
||||||
|
message: 'clean',
|
||||||
|
parentId: taskId,
|
||||||
|
},
|
||||||
|
this._deleteVms(xapi, oldVms)
|
||||||
|
)
|
||||||
const deleteFirst = getSetting(settings, 'deleteFirst', [srId])
|
const deleteFirst = getSetting(settings, 'deleteFirst', [srId])
|
||||||
if (deleteFirst) {
|
if (deleteFirst) {
|
||||||
await this._deleteVms(xapi, oldVms)
|
await deleteOldBackups()
|
||||||
}
|
}
|
||||||
|
|
||||||
const vm = await xapi.barrier(
|
const vm = await xapi.barrier(
|
||||||
@@ -1266,7 +1295,7 @@ export default class BackupNg {
|
|||||||
)
|
)
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
xapi.addTag(vm.$ref, 'Disaster Recovery'),
|
vm.add_tags('Disaster Recovery'),
|
||||||
disableVmHighAvailability(xapi, vm),
|
disableVmHighAvailability(xapi, vm),
|
||||||
vm.update_blocked_operations(
|
vm.update_blocked_operations(
|
||||||
'start',
|
'start',
|
||||||
@@ -1276,7 +1305,7 @@ export default class BackupNg {
|
|||||||
])
|
])
|
||||||
|
|
||||||
if (!deleteFirst) {
|
if (!deleteFirst) {
|
||||||
await this._deleteVms(xapi, oldVms)
|
await deleteOldBackups()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -1602,9 +1631,19 @@ export default class BackupNg {
|
|||||||
listReplicatedVms(xapi, scheduleId, srId, vmUuid)
|
listReplicatedVms(xapi, scheduleId, srId, vmUuid)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const deleteOldBackups = () =>
|
||||||
|
wrapTask(
|
||||||
|
{
|
||||||
|
logger,
|
||||||
|
message: 'clean',
|
||||||
|
parentId: taskId,
|
||||||
|
},
|
||||||
|
this._deleteVms(xapi, oldVms)
|
||||||
|
)
|
||||||
|
|
||||||
const deleteFirst = getSetting(settings, 'deleteFirst', [srId])
|
const deleteFirst = getSetting(settings, 'deleteFirst', [srId])
|
||||||
if (deleteFirst) {
|
if (deleteFirst) {
|
||||||
await this._deleteVms(xapi, oldVms)
|
await deleteOldBackups()
|
||||||
}
|
}
|
||||||
|
|
||||||
const { vm } = await wrapTask(
|
const { vm } = await wrapTask(
|
||||||
@@ -1624,7 +1663,7 @@ export default class BackupNg {
|
|||||||
)
|
)
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
xapi.addTag(vm.$ref, 'Continuous Replication'),
|
vm.add_tags('Continuous Replication'),
|
||||||
disableVmHighAvailability(xapi, vm),
|
disableVmHighAvailability(xapi, vm),
|
||||||
vm.update_blocked_operations(
|
vm.update_blocked_operations(
|
||||||
'start',
|
'start',
|
||||||
@@ -1634,7 +1673,7 @@ export default class BackupNg {
|
|||||||
])
|
])
|
||||||
|
|
||||||
if (!deleteFirst) {
|
if (!deleteFirst) {
|
||||||
await this._deleteVms(xapi, oldVms)
|
await deleteOldBackups()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -1761,6 +1800,16 @@ export default class BackupNg {
|
|||||||
const path = `${dir}/${file}`
|
const path = `${dir}/${file}`
|
||||||
try {
|
try {
|
||||||
const metadata = JSON.parse(String(await handler.readFile(path)))
|
const metadata = JSON.parse(String(await handler.readFile(path)))
|
||||||
|
if (metadata.mode === 'full') {
|
||||||
|
metadata.size = await timeout
|
||||||
|
.call(
|
||||||
|
handler.getSize(resolveRelativeFromFile(path, metadata.xva)),
|
||||||
|
parseDuration(this._backupOptions.vmBackupSizeTimeout)
|
||||||
|
)
|
||||||
|
.catch(err => {
|
||||||
|
log.warn(`_listVmBackups, getSize`, { err })
|
||||||
|
})
|
||||||
|
}
|
||||||
if (predicate === undefined || predicate(metadata)) {
|
if (predicate === undefined || predicate(metadata)) {
|
||||||
Object.defineProperty(metadata, '_filename', {
|
Object.defineProperty(metadata, '_filename', {
|
||||||
value: path,
|
value: path,
|
||||||
|
|||||||
@@ -372,7 +372,7 @@ export default class {
|
|||||||
|
|
||||||
const { datetime } = parseVmBackupPath(file)
|
const { datetime } = parseVmBackupPath(file)
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
xapi.addTag(vm.$id, 'restored from backup'),
|
vm.add_tags('restored from backup'),
|
||||||
xapi.editVm(vm.$id, {
|
xapi.editVm(vm.$id, {
|
||||||
name_label: `${vm.name_label} (${shortDate(datetime * 1e3)})`,
|
name_label: `${vm.name_label} (${shortDate(datetime * 1e3)})`,
|
||||||
}),
|
}),
|
||||||
@@ -972,12 +972,13 @@ export default class {
|
|||||||
nameLabel: copyName,
|
nameLabel: copyName,
|
||||||
})
|
})
|
||||||
|
|
||||||
data.vm.update_blocked_operations(
|
await Promise.all([
|
||||||
'start',
|
data.vm.add_tags('Disaster Recovery'),
|
||||||
'Start operation for this vm is blocked, clone it if you want to use it.'
|
data.vm.update_blocked_operations(
|
||||||
)
|
'start',
|
||||||
|
'Start operation for this vm is blocked, clone it if you want to use it.'
|
||||||
await targetXapi.addTag(data.vm.$id, 'Disaster Recovery')
|
),
|
||||||
|
])
|
||||||
|
|
||||||
if (!deleteOldBackupsFirst) {
|
if (!deleteOldBackupsFirst) {
|
||||||
await this._removeVms(targetXapi, vmsToRemove)
|
await this._removeVms(targetXapi, vmsToRemove)
|
||||||
|
|||||||
@@ -43,6 +43,20 @@ type MetadataBackupJob = {
|
|||||||
xoMetadata?: boolean,
|
xoMetadata?: boolean,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const logInstantFailureTask = (logger, { data, error, message, parentId }) => {
|
||||||
|
const taskId = logger.notice(message, {
|
||||||
|
data,
|
||||||
|
event: 'task.start',
|
||||||
|
parentId,
|
||||||
|
})
|
||||||
|
logger.error(message, {
|
||||||
|
event: 'task.end',
|
||||||
|
result: serializeError(error),
|
||||||
|
status: 'failure',
|
||||||
|
taskId,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const createSafeReaddir = (handler, methodName) => (path, options) =>
|
const createSafeReaddir = (handler, methodName) => (path, options) =>
|
||||||
handler.list(path, options).catch(error => {
|
handler.list(path, options).catch(error => {
|
||||||
if (error?.code !== 'ENOENT') {
|
if (error?.code !== 'ENOENT') {
|
||||||
@@ -97,7 +111,7 @@ const deleteOldBackups = (handler, dir, retention, handleError) =>
|
|||||||
// Task logs emitted in a metadata backup execution:
|
// Task logs emitted in a metadata backup execution:
|
||||||
//
|
//
|
||||||
// job.start(data: { reportWhen: ReportWhen })
|
// job.start(data: { reportWhen: ReportWhen })
|
||||||
// ├─ task.start(data: { type: 'pool', id: string, pool: <Pool />, poolMaster: <Host /> })
|
// ├─ task.start(data: { type: 'pool', id: string, pool?: <Pool />, poolMaster?: <Host /> })
|
||||||
// │ ├─ task.start(data: { type: 'remote', id: string })
|
// │ ├─ task.start(data: { type: 'remote', id: string })
|
||||||
// │ │ └─ task.end
|
// │ │ └─ task.end
|
||||||
// │ └─ task.end
|
// │ └─ task.end
|
||||||
@@ -527,16 +541,15 @@ export default class metadataBackup {
|
|||||||
try {
|
try {
|
||||||
xapi = this._app.getXapi(id)
|
xapi = this._app.getXapi(id)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.warning(
|
logInstantFailureTask(logger, {
|
||||||
`unable to get the xapi associated to the pool (${id})`,
|
data: {
|
||||||
{
|
type: 'pool',
|
||||||
event: 'task.warning',
|
id,
|
||||||
taskId: runJobId,
|
},
|
||||||
data: {
|
error,
|
||||||
error,
|
message: `unable to get the xapi associated to the pool (${id})`,
|
||||||
},
|
parentId: runJobId,
|
||||||
}
|
})
|
||||||
)
|
|
||||||
}
|
}
|
||||||
if (xapi !== undefined) {
|
if (xapi !== undefined) {
|
||||||
promises.push(
|
promises.push(
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { noSuchObject } from 'xo-common/api-errors'
|
|||||||
import { pDelay, ignoreErrors } from 'promise-toolbox'
|
import { pDelay, ignoreErrors } from 'promise-toolbox'
|
||||||
|
|
||||||
import * as XenStore from '../_XenStore'
|
import * as XenStore from '../_XenStore'
|
||||||
|
import parseDuration from '../_parseDuration'
|
||||||
import Xapi from '../xapi'
|
import Xapi from '../xapi'
|
||||||
import xapiObjectToXo from '../xapi-object-to-xo'
|
import xapiObjectToXo from '../xapi-object-to-xo'
|
||||||
import XapiStats from '../xapi-stats'
|
import XapiStats from '../xapi-stats'
|
||||||
@@ -41,7 +42,7 @@ const log = createLogger('xo:xo-mixins:xen-servers')
|
|||||||
// - _xapis[server.id] id defined
|
// - _xapis[server.id] id defined
|
||||||
// - _serverIdsByPool[xapi.pool.$id] is server.id
|
// - _serverIdsByPool[xapi.pool.$id] is server.id
|
||||||
export default class {
|
export default class {
|
||||||
constructor(xo, { guessVhdSizeOnImport, xapiOptions }) {
|
constructor(xo, { guessVhdSizeOnImport, noEventsTimeout, xapiOptions }) {
|
||||||
this._objectConflicts = { __proto__: null } // TODO: clean when a server is disconnected.
|
this._objectConflicts = { __proto__: null } // TODO: clean when a server is disconnected.
|
||||||
const serversDb = (this._servers = new Servers({
|
const serversDb = (this._servers = new Servers({
|
||||||
connection: xo._redis,
|
connection: xo._redis,
|
||||||
@@ -56,6 +57,7 @@ export default class {
|
|||||||
}
|
}
|
||||||
this._xapis = { __proto__: null }
|
this._xapis = { __proto__: null }
|
||||||
this._xo = xo
|
this._xo = xo
|
||||||
|
this._noEventsTimeout = parseDuration(noEventsTimeout)
|
||||||
|
|
||||||
xo.on('clean', () => serversDb.rebuildIndexes())
|
xo.on('clean', () => serversDb.rebuildIndexes())
|
||||||
xo.on('start', async () => {
|
xo.on('start', async () => {
|
||||||
@@ -473,6 +475,11 @@ export default class {
|
|||||||
const servers = await this._servers.get()
|
const servers = await this._servers.get()
|
||||||
const xapis = this._xapis
|
const xapis = this._xapis
|
||||||
forEach(servers, server => {
|
forEach(servers, server => {
|
||||||
|
const lastSuccessfulFetchTime = xapis[server.id]?.lastSuccessfulFetchTime
|
||||||
|
const currentTime = new Date().getTime()
|
||||||
|
if (currentTime > lastSuccessfulFetchTime + this._noEventsTimeout) {
|
||||||
|
server.error = xapis[server.id].lastCatchedEventError
|
||||||
|
}
|
||||||
server.status = this._getXenServerStatus(server.id)
|
server.status = this._getXenServerStatus(server.id)
|
||||||
if (server.status === 'connected') {
|
if (server.status === 'connected') {
|
||||||
server.poolId = xapis[server.id].pool.uuid
|
server.poolId = xapis[server.id].pool.uuid
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
"event-to-promise": "^0.8.0",
|
"event-to-promise": "^0.8.0",
|
||||||
"execa": "^1.0.0",
|
"execa": "^1.0.0",
|
||||||
"fs-extra": "^8.0.1",
|
"fs-extra": "^8.0.1",
|
||||||
"get-stream": "^4.0.0",
|
"get-stream": "^5.1.0",
|
||||||
"index-modules": "^0.3.0",
|
"index-modules": "^0.3.0",
|
||||||
"rimraf": "^2.6.2"
|
"rimraf": "^2.6.2"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"name": "xo-web",
|
"name": "xo-web",
|
||||||
"version": "5.42.0",
|
"version": "5.43.0",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"description": "Web interface client for Xen-Orchestra",
|
"description": "Web interface client for Xen-Orchestra",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
|
|||||||
30
packages/xo-web/src/common/inconsistent-host-time-warning.js
Normal file
30
packages/xo-web/src/common/inconsistent-host-time-warning.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import _ from 'intl'
|
||||||
|
import decorate from 'apply-decorators'
|
||||||
|
import Icon from 'icon'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React from 'react'
|
||||||
|
import Tooltip from 'tooltip'
|
||||||
|
import { injectState, provideState } from 'reaclette'
|
||||||
|
import { isHostTimeConsistentWithXoaTime } from 'xo'
|
||||||
|
|
||||||
|
const InconsistentHostTimeWarning = decorate([
|
||||||
|
provideState({
|
||||||
|
computed: {
|
||||||
|
isHostTimeConsistentWithXoaTime: (_, { hostId }) =>
|
||||||
|
isHostTimeConsistentWithXoaTime(hostId),
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
injectState,
|
||||||
|
({ state: { isHostTimeConsistentWithXoaTime = true } }) =>
|
||||||
|
isHostTimeConsistentWithXoaTime ? null : (
|
||||||
|
<Tooltip content={_('warningHostTimeTooltip')}>
|
||||||
|
<Icon color='text-danger' icon='alarm' />
|
||||||
|
</Tooltip>
|
||||||
|
),
|
||||||
|
])
|
||||||
|
|
||||||
|
InconsistentHostTimeWarning.propTypes = {
|
||||||
|
hostId: PropTypes.string.isRequired,
|
||||||
|
}
|
||||||
|
|
||||||
|
export { InconsistentHostTimeWarning as default }
|
||||||
@@ -218,6 +218,8 @@ const messages = {
|
|||||||
homeResourceSet: 'Resource set: {resourceSet}',
|
homeResourceSet: 'Resource set: {resourceSet}',
|
||||||
highAvailability: 'High Availability',
|
highAvailability: 'High Availability',
|
||||||
srSharedType: 'Shared {type}',
|
srSharedType: 'Shared {type}',
|
||||||
|
warningHostTimeTooltip:
|
||||||
|
'Host time and XOA time are not consistent with each other',
|
||||||
|
|
||||||
// ----- Home snapshots -----
|
// ----- Home snapshots -----
|
||||||
snapshotVmsName: 'Name',
|
snapshotVmsName: 'Name',
|
||||||
@@ -571,9 +573,12 @@ const messages = {
|
|||||||
newSrPasswordPlaceHolder: 'Password',
|
newSrPasswordPlaceHolder: 'Password',
|
||||||
newSrLvmDevicePlaceHolder: 'Device, e.g /dev/sda…',
|
newSrLvmDevicePlaceHolder: 'Device, e.g /dev/sda…',
|
||||||
newSrLocalPathPlaceHolder: '/path/to/directory',
|
newSrLocalPathPlaceHolder: '/path/to/directory',
|
||||||
newSrUseNfs4: 'Use NFSv4',
|
newSrNfsDefaultVersion: 'Default NFS version',
|
||||||
newSrNfsOptions: 'Comma delimited NFS options',
|
newSrNfsOptions: 'Comma delimited NFS options',
|
||||||
|
newSrNfs: 'NFS version',
|
||||||
|
noSharedZfsAvailable: 'No shared ZFS available',
|
||||||
reattachNewSrTooltip: 'Reattach SR',
|
reattachNewSrTooltip: 'Reattach SR',
|
||||||
|
srLocation: 'Storage location',
|
||||||
|
|
||||||
// ------ New Network -----
|
// ------ New Network -----
|
||||||
createNewNetworkNoPermission:
|
createNewNetworkNoPermission:
|
||||||
@@ -675,6 +680,7 @@ const messages = {
|
|||||||
cloneVmLabel: 'Clone',
|
cloneVmLabel: 'Clone',
|
||||||
fastCloneVmLabel: 'Fast clone',
|
fastCloneVmLabel: 'Fast clone',
|
||||||
vmConsoleLabel: 'Console',
|
vmConsoleLabel: 'Console',
|
||||||
|
backupLabel: 'Backup',
|
||||||
|
|
||||||
// ----- SR advanced tab -----
|
// ----- SR advanced tab -----
|
||||||
|
|
||||||
@@ -790,6 +796,9 @@ const messages = {
|
|||||||
memoryHostState:
|
memoryHostState:
|
||||||
'RAM: {memoryUsed} used on {memoryTotal} ({memoryFree} free)',
|
'RAM: {memoryUsed} used on {memoryTotal} ({memoryFree} free)',
|
||||||
hardwareHostSettingsLabel: 'Hardware',
|
hardwareHostSettingsLabel: 'Hardware',
|
||||||
|
hyperThreading: 'Hyper-threading (SMT)',
|
||||||
|
hyperThreadingNotAvailable:
|
||||||
|
'HT detection is only available on XCP-ng 7.6 and higher',
|
||||||
hostAddress: 'Address',
|
hostAddress: 'Address',
|
||||||
hostStatus: 'Status',
|
hostStatus: 'Status',
|
||||||
hostBuildNumber: 'Build number',
|
hostBuildNumber: 'Build number',
|
||||||
@@ -853,6 +862,7 @@ const messages = {
|
|||||||
// ----- Host storage tabs -----
|
// ----- Host storage tabs -----
|
||||||
addSrDeviceButton: 'Add a storage',
|
addSrDeviceButton: 'Add a storage',
|
||||||
srType: 'Type',
|
srType: 'Type',
|
||||||
|
pbdDetails: 'PBD details',
|
||||||
pbdStatus: 'Status',
|
pbdStatus: 'Status',
|
||||||
pbdStatusConnected: 'Connected',
|
pbdStatusConnected: 'Connected',
|
||||||
pbdStatusDisconnected: 'Disconnected',
|
pbdStatusDisconnected: 'Disconnected',
|
||||||
@@ -1025,6 +1035,7 @@ const messages = {
|
|||||||
vifMacLabel: 'MAC address',
|
vifMacLabel: 'MAC address',
|
||||||
vifMtuLabel: 'MTU',
|
vifMtuLabel: 'MTU',
|
||||||
vifNetworkLabel: 'Network',
|
vifNetworkLabel: 'Network',
|
||||||
|
vifRateLimitLabel: 'Rate limit (kB/s)',
|
||||||
vifStatusLabel: 'Status',
|
vifStatusLabel: 'Status',
|
||||||
vifStatusConnected: 'Connected',
|
vifStatusConnected: 'Connected',
|
||||||
vifStatusDisconnected: 'Disconnected',
|
vifStatusDisconnected: 'Disconnected',
|
||||||
@@ -1130,6 +1141,10 @@ const messages = {
|
|||||||
addAclsErrorMessage: 'User(s)/group(s) and role are required.',
|
addAclsErrorMessage: 'User(s)/group(s) and role are required.',
|
||||||
removeAcl: 'Delete',
|
removeAcl: 'Delete',
|
||||||
moreAcls: '{nAcls, number} more…',
|
moreAcls: '{nAcls, number} more…',
|
||||||
|
vmBootFirmware: 'Boot firmware',
|
||||||
|
vmDefaultBootFirmwareLabel: 'default (bios)',
|
||||||
|
vmBootFirmwareWarningMessage:
|
||||||
|
"You're about to change your boot firmware. This is still experimental in CH/XCP-ng 8.0. Are you sure you want to continue?",
|
||||||
|
|
||||||
// ----- VM placeholders -----
|
// ----- VM placeholders -----
|
||||||
|
|
||||||
@@ -1661,6 +1676,9 @@ const messages = {
|
|||||||
serverSelfSignedCertError: 'Invalid self-signed certificate',
|
serverSelfSignedCertError: 'Invalid self-signed certificate',
|
||||||
serverSelfSignedCertQuestion:
|
serverSelfSignedCertQuestion:
|
||||||
'Do you want to accept self-signed certificate for this server even though it would decrease security?',
|
'Do you want to accept self-signed certificate for this server even though it would decrease security?',
|
||||||
|
serverEnabled: 'Enabled',
|
||||||
|
serverDisabled: 'Disabled',
|
||||||
|
serverDisable: 'Disable server',
|
||||||
|
|
||||||
// ----- Copy VM -----
|
// ----- Copy VM -----
|
||||||
copyVm: 'Copy VM',
|
copyVm: 'Copy VM',
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
import forEach from 'lodash/forEach'
|
|
||||||
import forEachRight from 'lodash/forEachRight'
|
import forEachRight from 'lodash/forEachRight'
|
||||||
import head from 'lodash/head'
|
import forEach from 'lodash/forEach'
|
||||||
import isArray from 'lodash/isArray'
|
import isArray from 'lodash/isArray'
|
||||||
import isIp from 'is-ip'
|
import isIp from 'is-ip'
|
||||||
import last from 'lodash/last'
|
|
||||||
import some from 'lodash/some'
|
import some from 'lodash/some'
|
||||||
|
|
||||||
export { isIp }
|
export { isIp }
|
||||||
@@ -84,9 +82,6 @@ export const formatIps = ips => {
|
|||||||
if (ips.length === 0) {
|
if (ips.length === 0) {
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
if (ips.length === 1) {
|
|
||||||
return ips
|
|
||||||
}
|
|
||||||
const sortedIps = ips.sort((ip1, ip2) => {
|
const sortedIps = ips.sort((ip1, ip2) => {
|
||||||
const splitIp1 = ip1.split('.')
|
const splitIp1 = ip1.split('.')
|
||||||
const splitIp2 = ip2.split('.')
|
const splitIp2 = ip2.split('.')
|
||||||
@@ -104,8 +99,24 @@ export const formatIps = ips => {
|
|||||||
(splitIp1[0] - splitIp2[0]) * 256 * 256 * 256
|
(splitIp1[0] - splitIp2[0]) * 256 * 256 * 256
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
const range = { first: '', last: '' }
|
||||||
|
const formattedIps = []
|
||||||
|
let index = 0
|
||||||
|
forEach(sortedIps, ip => {
|
||||||
|
if (ip !== getNextIpV4(range.last)) {
|
||||||
|
if (range.first) {
|
||||||
|
formattedIps[index] =
|
||||||
|
range.first === range.last ? range.first : { ...range }
|
||||||
|
index++
|
||||||
|
}
|
||||||
|
range.first = range.last = ip
|
||||||
|
} else {
|
||||||
|
range.last = ip
|
||||||
|
}
|
||||||
|
})
|
||||||
|
formattedIps[index] = range.first === range.last ? range.first : range
|
||||||
|
|
||||||
return [{ first: head(sortedIps), last: last(sortedIps) }]
|
return formattedIps
|
||||||
}
|
}
|
||||||
|
|
||||||
export const parseIpPattern = pattern => {
|
export const parseIpPattern = pattern => {
|
||||||
|
|||||||
@@ -504,6 +504,9 @@ const xoItemToRender = {
|
|||||||
{backup.mode}
|
{backup.mode}
|
||||||
</span>{' '}
|
</span>{' '}
|
||||||
<span className='tag tag-warning'>{backup.remote.name}</span>{' '}
|
<span className='tag tag-warning'>{backup.remote.name}</span>{' '}
|
||||||
|
{backup.size !== undefined && (
|
||||||
|
<span className='tag tag-info'>{formatSize(backup.size)}</span>
|
||||||
|
)}{' '}
|
||||||
<FormattedDate
|
<FormattedDate
|
||||||
value={new Date(backup.timestamp)}
|
value={new Date(backup.timestamp)}
|
||||||
month='long'
|
month='long'
|
||||||
|
|||||||
53
packages/xo-web/src/common/select-boot-firmware.js
Normal file
53
packages/xo-web/src/common/select-boot-firmware.js
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
import _ from 'intl'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import React from 'react'
|
||||||
|
import { confirm } from 'modal'
|
||||||
|
import { injectState, provideState } from 'reaclette'
|
||||||
|
import { noop } from 'utils'
|
||||||
|
|
||||||
|
// https://docs.citrix.com/en-us/citrix-hypervisor/whats-new/experimental.html
|
||||||
|
// XAPI values should be lowercased
|
||||||
|
const VM_BOOT_FIRMWARES = ['bios', 'uefi']
|
||||||
|
|
||||||
|
const withState = provideState({
|
||||||
|
effects: {
|
||||||
|
handleBootFirmwareChange(
|
||||||
|
__,
|
||||||
|
{
|
||||||
|
target: { value },
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
if (value !== '') {
|
||||||
|
// TODO: Confirm should be removed once the feature is stabilized
|
||||||
|
confirm({
|
||||||
|
title: _('vmBootFirmware'),
|
||||||
|
body: _('vmBootFirmwareWarningMessage'),
|
||||||
|
}).then(() => this.props.onChange(value), noop)
|
||||||
|
} else {
|
||||||
|
this.props.onChange(value)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const SelectBootFirmware = ({ effects, value }) => (
|
||||||
|
<select
|
||||||
|
className='form-control'
|
||||||
|
onChange={effects.handleBootFirmwareChange}
|
||||||
|
value={value}
|
||||||
|
>
|
||||||
|
<option value=''>{_('vmDefaultBootFirmwareLabel')}</option>
|
||||||
|
{VM_BOOT_FIRMWARES.map(val => (
|
||||||
|
<option key={val} value={val}>
|
||||||
|
{val}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
|
)
|
||||||
|
|
||||||
|
SelectBootFirmware.propTypes = {
|
||||||
|
onChange: PropTypes.func.isRequired,
|
||||||
|
value: PropTypes.string.isRequired,
|
||||||
|
}
|
||||||
|
|
||||||
|
export default withState(injectState(SelectBootFirmware))
|
||||||
@@ -53,3 +53,7 @@ export const setXoaConfiguration = createAction(
|
|||||||
'XOA_CONFIGURATION',
|
'XOA_CONFIGURATION',
|
||||||
configuration => configuration
|
configuration => configuration
|
||||||
)
|
)
|
||||||
|
export const setHomeVmIdsSelection = createAction(
|
||||||
|
'SET_HOME_VM_IDS_SELECTION',
|
||||||
|
homeVmIdsSelection => homeVmIdsSelection
|
||||||
|
)
|
||||||
|
|||||||
@@ -86,6 +86,12 @@ export default {
|
|||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
|
||||||
|
// These IDs are used temporarily to be preselected in backup-ng/new/vms
|
||||||
|
homeVmIdsSelection: combineActionHandlers([], {
|
||||||
|
[actions.setHomeVmIdsSelection]: (_, homeVmIdsSelection) =>
|
||||||
|
homeVmIdsSelection,
|
||||||
|
}),
|
||||||
|
|
||||||
objects: combineActionHandlers(
|
objects: combineActionHandlers(
|
||||||
{
|
{
|
||||||
all: {}, // Mutable for performance!
|
all: {}, // Mutable for performance!
|
||||||
|
|||||||
@@ -646,10 +646,14 @@ export const createCompare = criterias => (...items) => {
|
|||||||
|
|
||||||
// ===================================================================
|
// ===================================================================
|
||||||
|
|
||||||
export const hasLicenseRestrictions = host =>
|
export const hasLicenseRestrictions = host => {
|
||||||
host.productBrand !== 'XCP-ng' &&
|
const licenseType = host.license_params.sku_type
|
||||||
versionSatisfies(host.version, '>=7.3.0') &&
|
return (
|
||||||
host.license_params.sku_type === 'free'
|
host.productBrand !== 'XCP-ng' &&
|
||||||
|
versionSatisfies(host.version, '>=7.3.0') &&
|
||||||
|
(licenseType === 'free' || licenseType === 'express')
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// ===================================================================
|
// ===================================================================
|
||||||
|
|
||||||
|
|||||||
@@ -777,6 +777,14 @@ export const emergencyShutdownHosts = hosts => {
|
|||||||
}).then(() => map(hosts, host => emergencyShutdownHost(host)), noop)
|
}).then(() => map(hosts, host => emergencyShutdownHost(host)), noop)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const isHostTimeConsistentWithXoaTime = host =>
|
||||||
|
_call('host.isHostServerTimeConsistent', { host: resolveId(host) })
|
||||||
|
|
||||||
|
export const isHyperThreadingEnabledHost = host =>
|
||||||
|
_call('host.isHyperThreadingEnabled', {
|
||||||
|
id: resolveId(host),
|
||||||
|
})
|
||||||
|
|
||||||
// for XCP-ng now
|
// for XCP-ng now
|
||||||
export const installAllPatchesOnHost = ({ host }) =>
|
export const installAllPatchesOnHost = ({ host }) =>
|
||||||
confirm({
|
confirm({
|
||||||
@@ -1620,14 +1628,15 @@ export const deleteVifs = vifs =>
|
|||||||
|
|
||||||
export const setVif = (
|
export const setVif = (
|
||||||
vif,
|
vif,
|
||||||
{ network, mac, allowedIpv4Addresses, allowedIpv6Addresses }
|
{ allowedIpv4Addresses, allowedIpv6Addresses, mac, network, rateLimit }
|
||||||
) =>
|
) =>
|
||||||
_call('vif.set', {
|
_call('vif.set', {
|
||||||
id: resolveId(vif),
|
|
||||||
network: resolveId(network),
|
|
||||||
mac,
|
|
||||||
allowedIpv4Addresses,
|
allowedIpv4Addresses,
|
||||||
allowedIpv6Addresses,
|
allowedIpv6Addresses,
|
||||||
|
id: resolveId(vif),
|
||||||
|
mac,
|
||||||
|
network: resolveId(network),
|
||||||
|
rateLimit,
|
||||||
})
|
})
|
||||||
|
|
||||||
// Network -----------------------------------------------------------
|
// Network -----------------------------------------------------------
|
||||||
@@ -2283,6 +2292,8 @@ export const probeSrHba = host => _call('sr.probeHba', { host })
|
|||||||
export const probeSrHbaExists = (host, scsiId) =>
|
export const probeSrHbaExists = (host, scsiId) =>
|
||||||
_call('sr.probeHbaExists', { host, scsiId })
|
_call('sr.probeHbaExists', { host, scsiId })
|
||||||
|
|
||||||
|
export const probeZfs = host => _call('sr.probeZfs', { host: resolveId(host) })
|
||||||
|
|
||||||
export const reattachSr = (host, uuid, nameLabel, nameDescription, type) =>
|
export const reattachSr = (host, uuid, nameLabel, nameDescription, type) =>
|
||||||
_call('sr.reattach', { host, uuid, nameLabel, nameDescription, type })
|
_call('sr.reattach', { host, uuid, nameLabel, nameDescription, type })
|
||||||
|
|
||||||
@@ -2346,6 +2357,14 @@ export const createSrLvm = (host, nameLabel, nameDescription, device) =>
|
|||||||
export const createSrExt = (host, nameLabel, nameDescription, device) =>
|
export const createSrExt = (host, nameLabel, nameDescription, device) =>
|
||||||
_call('sr.createExt', { host, nameLabel, nameDescription, device })
|
_call('sr.createExt', { host, nameLabel, nameDescription, device })
|
||||||
|
|
||||||
|
export const createSrZfs = (host, nameLabel, nameDescription, location) =>
|
||||||
|
_call('sr.createFile', {
|
||||||
|
host: resolveId(host),
|
||||||
|
nameDescription,
|
||||||
|
nameLabel,
|
||||||
|
location,
|
||||||
|
})
|
||||||
|
|
||||||
// Job logs ----------------------------------------------------------
|
// Job logs ----------------------------------------------------------
|
||||||
|
|
||||||
export const deleteJobsLogs = async ids => {
|
export const deleteJobsLogs = async ids => {
|
||||||
|
|||||||
@@ -120,28 +120,31 @@ const createDoesRetentionExist = name => {
|
|||||||
return ({ propSettings, settings = propSettings }) => settings.some(predicate)
|
return ({ propSettings, settings = propSettings }) => settings.some(predicate)
|
||||||
}
|
}
|
||||||
|
|
||||||
const getInitialState = () => ({
|
const getInitialState = ({ preSelectedVmIds, setHomeVmIdsSelection }) => {
|
||||||
_displayAdvancedSettings: undefined,
|
setHomeVmIdsSelection([]) // Clear preselected vmIds
|
||||||
_vmsPattern: undefined,
|
return {
|
||||||
backupMode: false,
|
_displayAdvancedSettings: undefined,
|
||||||
compression: undefined,
|
_vmsPattern: undefined,
|
||||||
crMode: false,
|
backupMode: false,
|
||||||
deltaMode: false,
|
compression: undefined,
|
||||||
drMode: false,
|
crMode: false,
|
||||||
name: '',
|
deltaMode: false,
|
||||||
paramsUpdated: false,
|
drMode: false,
|
||||||
remotes: [],
|
name: '',
|
||||||
schedules: {},
|
paramsUpdated: false,
|
||||||
settings: undefined,
|
remotes: [],
|
||||||
showErrors: false,
|
schedules: {},
|
||||||
smartMode: false,
|
settings: undefined,
|
||||||
snapshotMode: false,
|
showErrors: false,
|
||||||
srs: [],
|
smartMode: false,
|
||||||
tags: {
|
snapshotMode: false,
|
||||||
notValues: ['Continuous Replication', 'Disaster Recovery', 'XOSAN'],
|
srs: [],
|
||||||
},
|
tags: {
|
||||||
vms: [],
|
notValues: ['Continuous Replication', 'Disaster Recovery', 'XOSAN'],
|
||||||
})
|
},
|
||||||
|
vms: preSelectedVmIds,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const DeleteOldBackupsFirst = ({ handler, handlerParam, value }) => (
|
const DeleteOldBackupsFirst = ({ handler, handlerParam, value }) => (
|
||||||
<ActionButton
|
<ActionButton
|
||||||
@@ -169,6 +172,7 @@ export default decorate([
|
|||||||
hostsById: createGetObjectsOfType('host'),
|
hostsById: createGetObjectsOfType('host'),
|
||||||
poolsById: createGetObjectsOfType('pool'),
|
poolsById: createGetObjectsOfType('pool'),
|
||||||
srsById: createGetObjectsOfType('SR'),
|
srsById: createGetObjectsOfType('SR'),
|
||||||
|
preSelectedVmIds: state => state.homeVmIdsSelection,
|
||||||
})),
|
})),
|
||||||
injectIntl,
|
injectIntl,
|
||||||
provideState({
|
provideState({
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import Icon from 'icon'
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import SortedTable from 'sorted-table'
|
import SortedTable from 'sorted-table'
|
||||||
import Upgrade from 'xoa-upgrade'
|
import Upgrade from 'xoa-upgrade'
|
||||||
import { addSubscriptions, noop } from 'utils'
|
import { addSubscriptions, formatSize, noop } from 'utils'
|
||||||
import { confirm } from 'modal'
|
import { confirm } from 'modal'
|
||||||
import { error } from 'notification'
|
import { error } from 'notification'
|
||||||
import { FormattedDate } from 'react-intl'
|
import { FormattedDate } from 'react-intl'
|
||||||
@@ -87,6 +87,12 @@ const BACKUPS_COLUMNS = [
|
|||||||
default: true,
|
default: true,
|
||||||
sortOrder: 'desc',
|
sortOrder: 'desc',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: _('labelSize'),
|
||||||
|
itemRenderer: ({ size }) =>
|
||||||
|
size !== undefined && size !== 0 && formatSize(size),
|
||||||
|
sortCriteria: 'size',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: _('availableBackupsColumn'),
|
name: _('availableBackupsColumn'),
|
||||||
itemRenderer: ({ count }) =>
|
itemRenderer: ({ count }) =>
|
||||||
@@ -149,6 +155,7 @@ export default class Restore extends Component {
|
|||||||
})
|
})
|
||||||
// TODO: perf
|
// TODO: perf
|
||||||
let first, last
|
let first, last
|
||||||
|
let size = 0
|
||||||
forEach(backupDataByVm, (data, vmId) => {
|
forEach(backupDataByVm, (data, vmId) => {
|
||||||
first = { timestamp: Infinity }
|
first = { timestamp: Infinity }
|
||||||
last = { timestamp: 0 }
|
last = { timestamp: 0 }
|
||||||
@@ -161,9 +168,13 @@ export default class Restore extends Component {
|
|||||||
first = backup
|
first = backup
|
||||||
}
|
}
|
||||||
count[backup.mode] = (count[backup.mode] || 0) + 1
|
count[backup.mode] = (count[backup.mode] || 0) + 1
|
||||||
|
|
||||||
|
if (backup.size !== undefined) {
|
||||||
|
size += backup.size
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
assign(data, { first, last, count, id: vmId })
|
assign(data, { first, last, count, id: vmId, size })
|
||||||
})
|
})
|
||||||
|
|
||||||
forEach(backupDataByVm, ({ backups }, vmId) => {
|
forEach(backupDataByVm, ({ backups }, vmId) => {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import _ from 'intl'
|
import _ from 'intl'
|
||||||
import Component from 'base-component'
|
import Component from 'base-component'
|
||||||
|
import InconsistentHostTimeWarning from 'inconsistent-host-time-warning'
|
||||||
import Ellipsis, { EllipsisContainer } from 'ellipsis'
|
import Ellipsis, { EllipsisContainer } from 'ellipsis'
|
||||||
import Icon from 'icon'
|
import Icon from 'icon'
|
||||||
import isEmpty from 'lodash/isEmpty'
|
import isEmpty from 'lodash/isEmpty'
|
||||||
@@ -128,6 +129,8 @@ export default class HostItem extends Component {
|
|||||||
</Tooltip>
|
</Tooltip>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
<InconsistentHostTimeWarning hostId={host.id} />
|
||||||
|
|
||||||
{hasLicenseRestrictions(host) && <LicenseWarning />}
|
{hasLicenseRestrictions(host) && <LicenseWarning />}
|
||||||
</EllipsisContainer>
|
</EllipsisContainer>
|
||||||
</Col>
|
</Col>
|
||||||
|
|||||||
@@ -178,6 +178,14 @@ const OPTIONS = {
|
|||||||
icon: 'vm-snapshot',
|
icon: 'vm-snapshot',
|
||||||
labelId: 'snapshotVmLabel',
|
labelId: 'snapshotVmLabel',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
handler: (vmIds, _, { setHomeVmIdsSelection }, { router }) => {
|
||||||
|
setHomeVmIdsSelection(vmIds)
|
||||||
|
router.push('backup-ng/new/vms')
|
||||||
|
},
|
||||||
|
icon: 'backup',
|
||||||
|
labelId: 'backupLabel',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
handler: deleteVms,
|
handler: deleteVms,
|
||||||
icon: 'vm-delete',
|
icon: 'vm-delete',
|
||||||
@@ -1010,7 +1018,9 @@ export default class Home extends Component {
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
action.handler(
|
action.handler(
|
||||||
this._getSelectedItemsIds(),
|
this._getSelectedItemsIds(),
|
||||||
action.params
|
action.params,
|
||||||
|
this.props,
|
||||||
|
this.context
|
||||||
)
|
)
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import _ from 'intl'
|
import _ from 'intl'
|
||||||
|
import InconsistentHostTimeWarning from 'inconsistent-host-time-warning'
|
||||||
import Copiable from 'copiable'
|
import Copiable from 'copiable'
|
||||||
import HostActionBar from './action-bar'
|
import HostActionBar from './action-bar'
|
||||||
import Icon from 'icon'
|
import Icon from 'icon'
|
||||||
@@ -254,6 +255,8 @@ export default class Host extends Component {
|
|||||||
</Link>
|
</Link>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
<InconsistentHostTimeWarning hostId={host.id} />
|
||||||
</h2>
|
</h2>
|
||||||
<Copiable tagName='pre' className='text-muted mb-0'>
|
<Copiable tagName='pre' className='text-muted mb-0'>
|
||||||
{host.uuid}
|
{host.uuid}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import {
|
|||||||
disableHost,
|
disableHost,
|
||||||
enableHost,
|
enableHost,
|
||||||
forgetHost,
|
forgetHost,
|
||||||
|
isHyperThreadingEnabledHost,
|
||||||
installSupplementalPack,
|
installSupplementalPack,
|
||||||
restartHost,
|
restartHost,
|
||||||
setHostsMultipathing,
|
setHostsMultipathing,
|
||||||
@@ -95,6 +96,12 @@ MultipathableSrs.propTypes = {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
export default class extends Component {
|
export default class extends Component {
|
||||||
|
async componentDidMount() {
|
||||||
|
this.setState({
|
||||||
|
isHtEnabled: await isHyperThreadingEnabledHost(this.props.host),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
_getPacks = createSelector(
|
_getPacks = createSelector(
|
||||||
() => this.props.host.supplementalPacks,
|
() => this.props.host.supplementalPacks,
|
||||||
packs => {
|
packs => {
|
||||||
@@ -112,10 +119,12 @@ export default class extends Component {
|
|||||||
return uniqPacks
|
return uniqPacks
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
_setRemoteSyslogHost = value => setRemoteSyslogHost(this.props.host, value)
|
_setRemoteSyslogHost = value => setRemoteSyslogHost(this.props.host, value)
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { host, pcis, pgpus } = this.props
|
const { host, pcis, pgpus } = this.props
|
||||||
|
const { isHtEnabled } = this.state
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container>
|
||||||
<Row>
|
<Row>
|
||||||
@@ -272,6 +281,16 @@ export default class extends Component {
|
|||||||
{host.cpus.cores} ({host.cpus.sockets})
|
{host.cpus.cores} ({host.cpus.sockets})
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>{_('hyperThreading')}</th>
|
||||||
|
<td>
|
||||||
|
{isHtEnabled === null
|
||||||
|
? _('hyperThreadingNotAvailable')
|
||||||
|
: isHtEnabled
|
||||||
|
? _('stateEnabled')
|
||||||
|
: _('stateDisabled')}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{_('hostManufacturerinfo')}</th>
|
<th>{_('hostManufacturerinfo')}</th>
|
||||||
<Copiable tagName='td'>
|
<Copiable tagName='td'>
|
||||||
|
|||||||
@@ -87,6 +87,19 @@ const SR_COLUMNS = [
|
|||||||
storage.shared ? _('srShared') : _('srNotShared'),
|
storage.shared ? _('srShared') : _('srNotShared'),
|
||||||
sortCriteria: 'shared',
|
sortCriteria: 'shared',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: _('pbdDetails'),
|
||||||
|
itemRenderer: ({ pbdDeviceConfig }) => {
|
||||||
|
const keys = Object.keys(pbdDeviceConfig)
|
||||||
|
return (
|
||||||
|
<ul className='list-unstyled'>
|
||||||
|
{keys.map(key => (
|
||||||
|
<li key={key}>{_.keyValue(key, pbdDeviceConfig[key])}</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: _('pbdStatus'),
|
name: _('pbdStatus'),
|
||||||
itemRenderer: storage => (
|
itemRenderer: storage => (
|
||||||
@@ -137,6 +150,7 @@ export default connectStore(() => {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
attached: pbd.attached,
|
attached: pbd.attached,
|
||||||
|
pbdDeviceConfig: pbd.device_config,
|
||||||
format: sr.SR_type,
|
format: sr.SR_type,
|
||||||
free: size > 0 ? size - usage : 0,
|
free: size > 0 ? size - usage : 0,
|
||||||
id: sr.id,
|
id: sr.id,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import Link from 'link'
|
|||||||
import Page from '../page'
|
import Page from '../page'
|
||||||
import PropTypes from 'prop-types'
|
import PropTypes from 'prop-types'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
import SelectBootFirmware from 'select-boot-firmware'
|
||||||
import store from 'store'
|
import store from 'store'
|
||||||
import Tags from 'tags'
|
import Tags from 'tags'
|
||||||
import Tooltip from 'tooltip'
|
import Tooltip from 'tooltip'
|
||||||
@@ -334,6 +335,7 @@ export default class NewVm extends BaseComponent {
|
|||||||
cpuWeight: '',
|
cpuWeight: '',
|
||||||
existingDisks: {},
|
existingDisks: {},
|
||||||
fastClone: true,
|
fastClone: true,
|
||||||
|
hvmBootFirmware: '',
|
||||||
installMethod: 'noConfigDrive',
|
installMethod: 'noConfigDrive',
|
||||||
multipleVms: false,
|
multipleVms: false,
|
||||||
name_label: '',
|
name_label: '',
|
||||||
@@ -501,6 +503,8 @@ export default class NewVm extends BaseComponent {
|
|||||||
tags: state.tags,
|
tags: state.tags,
|
||||||
vgpuType: get(() => state.vgpuType.id),
|
vgpuType: get(() => state.vgpuType.id),
|
||||||
gpuGroup: get(() => state.vgpuType.gpuGroup),
|
gpuGroup: get(() => state.vgpuType.gpuGroup),
|
||||||
|
hvmBootFirmware:
|
||||||
|
state.hvmBootFirmware === '' ? undefined : state.hvmBootFirmware,
|
||||||
}
|
}
|
||||||
|
|
||||||
return state.multipleVms
|
return state.multipleVms
|
||||||
@@ -576,6 +580,7 @@ export default class NewVm extends BaseComponent {
|
|||||||
CPUs: template.CPUs.number,
|
CPUs: template.CPUs.number,
|
||||||
cpuCap: '',
|
cpuCap: '',
|
||||||
cpuWeight: '',
|
cpuWeight: '',
|
||||||
|
hvmBootFirmware: defined(() => template.boot.firmware, ''),
|
||||||
memoryDynamicMax: template.memory.dynamic[1],
|
memoryDynamicMax: template.memory.dynamic[1],
|
||||||
// installation
|
// installation
|
||||||
installMethod:
|
installMethod:
|
||||||
@@ -752,6 +757,11 @@ export default class NewVm extends BaseComponent {
|
|||||||
template => template && template.name_label === 'CoreOS'
|
template => template && template.name_label === 'CoreOS'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
_isHvm = createSelector(
|
||||||
|
() => this.state.template,
|
||||||
|
template => template && template.virtualizationMode === 'hvm'
|
||||||
|
)
|
||||||
|
|
||||||
// On change -------------------------------------------------------------------
|
// On change -------------------------------------------------------------------
|
||||||
|
|
||||||
_onChangeSshKeys = keys =>
|
_onChangeSshKeys = keys =>
|
||||||
@@ -900,6 +910,8 @@ export default class NewVm extends BaseComponent {
|
|||||||
_getRedirectionUrl = id =>
|
_getRedirectionUrl = id =>
|
||||||
this.state.state.multipleVms ? '/home' : `/vms/${id}`
|
this.state.state.multipleVms ? '/home' : `/vms/${id}`
|
||||||
|
|
||||||
|
_handleBootFirmware = value => this._setState({ hvmBootFirmware: value })
|
||||||
|
|
||||||
// MAIN ------------------------------------------------------------------------
|
// MAIN ------------------------------------------------------------------------
|
||||||
|
|
||||||
_renderHeader = () => {
|
_renderHeader = () => {
|
||||||
@@ -1630,6 +1642,7 @@ export default class NewVm extends BaseComponent {
|
|||||||
bootAfterCreate,
|
bootAfterCreate,
|
||||||
cpuCap,
|
cpuCap,
|
||||||
cpuWeight,
|
cpuWeight,
|
||||||
|
hvmBootFirmware,
|
||||||
memoryDynamicMin,
|
memoryDynamicMin,
|
||||||
memoryDynamicMax,
|
memoryDynamicMax,
|
||||||
memoryStaticMax,
|
memoryStaticMax,
|
||||||
@@ -1641,10 +1654,11 @@ export default class NewVm extends BaseComponent {
|
|||||||
share,
|
share,
|
||||||
showAdvanced,
|
showAdvanced,
|
||||||
tags,
|
tags,
|
||||||
template,
|
|
||||||
} = this.state.state
|
} = this.state.state
|
||||||
const { isAdmin } = this.props
|
const { isAdmin } = this.props
|
||||||
const { formatMessage } = this.props.intl
|
const { formatMessage } = this.props.intl
|
||||||
|
const isHvm = this._isHvm()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Section
|
<Section
|
||||||
icon='new-vm-advanced'
|
icon='new-vm-advanced'
|
||||||
@@ -1827,7 +1841,7 @@ export default class NewVm extends BaseComponent {
|
|||||||
</Item>
|
</Item>
|
||||||
</SectionContent>
|
</SectionContent>
|
||||||
),
|
),
|
||||||
template && template.virtualizationMode === 'hvm' && (
|
isHvm && (
|
||||||
<SectionContent>
|
<SectionContent>
|
||||||
<Item label={_('vmVgpu')}>
|
<Item label={_('vmVgpu')}>
|
||||||
<SelectVgpuType
|
<SelectVgpuType
|
||||||
@@ -1837,6 +1851,16 @@ export default class NewVm extends BaseComponent {
|
|||||||
</Item>
|
</Item>
|
||||||
</SectionContent>
|
</SectionContent>
|
||||||
),
|
),
|
||||||
|
isHvm && (
|
||||||
|
<SectionContent>
|
||||||
|
<Item label={_('vmBootFirmware')}>
|
||||||
|
<SelectBootFirmware
|
||||||
|
onChange={this._handleBootFirmware}
|
||||||
|
value={hvmBootFirmware}
|
||||||
|
/>
|
||||||
|
</Item>
|
||||||
|
</SectionContent>
|
||||||
|
),
|
||||||
]}
|
]}
|
||||||
</Section>
|
</Section>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import { confirm } from 'modal'
|
|||||||
import { adminOnly, connectStore, formatSize } from 'utils'
|
import { adminOnly, connectStore, formatSize } from 'utils'
|
||||||
import { Container, Row, Col } from 'grid'
|
import { Container, Row, Col } from 'grid'
|
||||||
import { injectIntl } from 'react-intl'
|
import { injectIntl } from 'react-intl'
|
||||||
import { Password, Select, Toggle } from 'form'
|
import { Password, Select } from 'form'
|
||||||
import { SelectHost } from 'select-objects'
|
import { SelectHost } from 'select-objects'
|
||||||
import {
|
import {
|
||||||
createFilter,
|
createFilter,
|
||||||
@@ -33,6 +33,7 @@ import {
|
|||||||
createSrLvm,
|
createSrLvm,
|
||||||
createSrNfs,
|
createSrNfs,
|
||||||
createSrHba,
|
createSrHba,
|
||||||
|
createSrZfs,
|
||||||
probeSrIscsiExists,
|
probeSrIscsiExists,
|
||||||
probeSrIscsiIqns,
|
probeSrIscsiIqns,
|
||||||
probeSrIscsiLuns,
|
probeSrIscsiLuns,
|
||||||
@@ -40,12 +41,17 @@ import {
|
|||||||
probeSrNfsExists,
|
probeSrNfsExists,
|
||||||
probeSrHba,
|
probeSrHba,
|
||||||
probeSrHbaExists,
|
probeSrHbaExists,
|
||||||
|
probeZfs,
|
||||||
reattachSrIso,
|
reattachSrIso,
|
||||||
reattachSr,
|
reattachSr,
|
||||||
} from 'xo'
|
} from 'xo'
|
||||||
|
|
||||||
// ===================================================================
|
// ===================================================================
|
||||||
|
|
||||||
|
const NFS_VERSIONS = ['4', '4.1']
|
||||||
|
|
||||||
|
// ===================================================================
|
||||||
|
|
||||||
class SelectScsiId extends Component {
|
class SelectScsiId extends Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
onChange: PropTypes.func.isRequired,
|
onChange: PropTypes.func.isRequired,
|
||||||
@@ -192,14 +198,15 @@ class SelectLun extends Component {
|
|||||||
// ===================================================================
|
// ===================================================================
|
||||||
|
|
||||||
const SR_TYPE_TO_LABEL = {
|
const SR_TYPE_TO_LABEL = {
|
||||||
ext: 'Local Ext',
|
ext: 'ext (local)',
|
||||||
hba: 'HBA',
|
hba: 'HBA',
|
||||||
iscsi: 'iSCSI',
|
iscsi: 'iSCSI',
|
||||||
local: 'Local',
|
local: 'Local',
|
||||||
lvm: 'Local LVM',
|
lvm: 'LVM (local)',
|
||||||
nfs: 'NFS',
|
nfs: 'NFS',
|
||||||
nfsiso: 'NFS ISO',
|
nfsiso: 'NFS ISO',
|
||||||
smb: 'SMB',
|
smb: 'SMB',
|
||||||
|
zfs: 'ZFS (local)',
|
||||||
}
|
}
|
||||||
|
|
||||||
const SR_GROUP_TO_LABEL = {
|
const SR_GROUP_TO_LABEL = {
|
||||||
@@ -208,7 +215,7 @@ const SR_GROUP_TO_LABEL = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const typeGroups = {
|
const typeGroups = {
|
||||||
vdisr: ['ext', 'hba', 'iscsi', 'lvm', 'nfs'],
|
vdisr: ['ext', 'hba', 'iscsi', 'lvm', 'nfs', 'zfs'],
|
||||||
isosr: ['local', 'nfsiso', 'smb'],
|
isosr: ['local', 'nfsiso', 'smb'],
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,6 +244,7 @@ export default class New extends Component {
|
|||||||
lockCreation: undefined,
|
lockCreation: undefined,
|
||||||
lun: undefined,
|
lun: undefined,
|
||||||
luns: undefined,
|
luns: undefined,
|
||||||
|
nfsVersion: '',
|
||||||
hbaDevices: undefined,
|
hbaDevices: undefined,
|
||||||
name: undefined,
|
name: undefined,
|
||||||
path: undefined,
|
path: undefined,
|
||||||
@@ -245,6 +253,7 @@ export default class New extends Component {
|
|||||||
unused: undefined,
|
unused: undefined,
|
||||||
usage: undefined,
|
usage: undefined,
|
||||||
used: undefined,
|
used: undefined,
|
||||||
|
zfsPools: undefined,
|
||||||
}
|
}
|
||||||
this.getHostSrs = createFilter(
|
this.getHostSrs = createFilter(
|
||||||
() => this.props.srs,
|
() => this.props.srs,
|
||||||
@@ -266,8 +275,18 @@ export default class New extends Component {
|
|||||||
port,
|
port,
|
||||||
server,
|
server,
|
||||||
username,
|
username,
|
||||||
|
zfsLocation,
|
||||||
} = this.refs
|
} = this.refs
|
||||||
const { host, iqn, lun, path, type, scsiId, nfs4, nfsOptions } = this.state
|
const {
|
||||||
|
host,
|
||||||
|
iqn,
|
||||||
|
lun,
|
||||||
|
nfsOptions,
|
||||||
|
nfsVersion,
|
||||||
|
path,
|
||||||
|
scsiId,
|
||||||
|
type,
|
||||||
|
} = this.state
|
||||||
|
|
||||||
const createMethodFactories = {
|
const createMethodFactories = {
|
||||||
nfs: () =>
|
nfs: () =>
|
||||||
@@ -277,7 +296,7 @@ export default class New extends Component {
|
|||||||
description.value,
|
description.value,
|
||||||
server.value,
|
server.value,
|
||||||
path,
|
path,
|
||||||
nfs4 ? '4' : undefined,
|
nfsVersion !== '' ? nfsVersion : undefined,
|
||||||
nfsOptions
|
nfsOptions
|
||||||
),
|
),
|
||||||
hba: async () => {
|
hba: async () => {
|
||||||
@@ -330,6 +349,8 @@ export default class New extends Component {
|
|||||||
createSrLvm(host.id, name.value, description.value, device.value),
|
createSrLvm(host.id, name.value, description.value, device.value),
|
||||||
ext: () =>
|
ext: () =>
|
||||||
createSrExt(host.id, name.value, description.value, device.value),
|
createSrExt(host.id, name.value, description.value, device.value),
|
||||||
|
zfs: () =>
|
||||||
|
createSrZfs(host.id, name.value, description.value, zfsLocation.value),
|
||||||
local: () =>
|
local: () =>
|
||||||
createSrIso(
|
createSrIso(
|
||||||
host.id,
|
host.id,
|
||||||
@@ -367,7 +388,10 @@ export default class New extends Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_handleSrHostSelection = host => this.setState({ host })
|
_handleSrHostSelection = async host => {
|
||||||
|
this.setState({ host })
|
||||||
|
await this._probe(host, this.state.type)
|
||||||
|
}
|
||||||
_handleNameChange = event => this.setState({ name: event.target.value })
|
_handleNameChange = event => this.setState({ name: event.target.value })
|
||||||
_handleDescriptionChange = event =>
|
_handleDescriptionChange = event =>
|
||||||
this.setState({ description: event.target.value })
|
this.setState({ description: event.target.value })
|
||||||
@@ -378,20 +402,13 @@ export default class New extends Component {
|
|||||||
hbaDevices: undefined,
|
hbaDevices: undefined,
|
||||||
iqns: undefined,
|
iqns: undefined,
|
||||||
paths: undefined,
|
paths: undefined,
|
||||||
summary: includes(['ext', 'lvm', 'local', 'smb', 'hba'], type),
|
summary: includes(['ext', 'lvm', 'local', 'smb', 'hba', 'zfs'], type),
|
||||||
type,
|
type,
|
||||||
unused: undefined,
|
unused: undefined,
|
||||||
usage: undefined,
|
usage: undefined,
|
||||||
used: undefined,
|
used: undefined,
|
||||||
})
|
})
|
||||||
if (type === 'hba' && this.state.host !== undefined) {
|
await this._probe(this.state.host, type)
|
||||||
this.setState(({ loading }) => ({ loading: loading + 1 }))
|
|
||||||
const hbaDevices = await probeSrHba(this.state.host.id)::ignoreErrors()
|
|
||||||
this.setState(({ loading }) => ({
|
|
||||||
hbaDevices,
|
|
||||||
loading: loading - 1,
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_handleSrHbaSelection = async scsiId => {
|
_handleSrHbaSelection = async scsiId => {
|
||||||
@@ -522,6 +539,31 @@ export default class New extends Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_handleNfsVersion = ({ target: { value } }) => {
|
||||||
|
this.setState({
|
||||||
|
nfsVersion: value,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
_probe = async (host, type) => {
|
||||||
|
const probeMethodFactories = {
|
||||||
|
hba: async hostId => ({
|
||||||
|
hbaDevices: await probeSrHba(hostId)::ignoreErrors(),
|
||||||
|
}),
|
||||||
|
zfs: async hostId => ({
|
||||||
|
zfsPools: await probeZfs(hostId)::ignoreErrors(),
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
if (probeMethodFactories[type] !== undefined && host != null) {
|
||||||
|
this.setState(({ loading }) => ({ loading: loading + 1 }))
|
||||||
|
const probeResult = await probeMethodFactories[type](host.id)
|
||||||
|
this.setState(({ loading }) => ({
|
||||||
|
loading: loading - 1,
|
||||||
|
...probeResult,
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_reattach = async uuid => {
|
_reattach = async uuid => {
|
||||||
const { host, type } = this.state
|
const { host, type } = this.state
|
||||||
|
|
||||||
@@ -566,6 +608,7 @@ export default class New extends Component {
|
|||||||
lockCreation,
|
lockCreation,
|
||||||
lun,
|
lun,
|
||||||
luns,
|
luns,
|
||||||
|
nfsVersion,
|
||||||
path,
|
path,
|
||||||
paths,
|
paths,
|
||||||
summary,
|
summary,
|
||||||
@@ -573,6 +616,7 @@ export default class New extends Component {
|
|||||||
unused,
|
unused,
|
||||||
usage,
|
usage,
|
||||||
used,
|
used,
|
||||||
|
zfsPools,
|
||||||
} = this.state
|
} = this.state
|
||||||
const { formatMessage } = this.props.intl
|
const { formatMessage } = this.props.intl
|
||||||
|
|
||||||
@@ -657,10 +701,22 @@ export default class New extends Component {
|
|||||||
</div>
|
</div>
|
||||||
</fieldset>,
|
</fieldset>,
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<label>{_('newSrUseNfs4')}</label>
|
<label htmlFor='selectNfsVersion'>{_('newSrNfs')}</label>
|
||||||
<div>
|
<select
|
||||||
<Toggle onChange={this.toggleState('nfs4')} />
|
className='form-control'
|
||||||
</div>
|
id='selectNfsVersion'
|
||||||
|
onChange={this._handleNfsVersion}
|
||||||
|
value={nfsVersion}
|
||||||
|
>
|
||||||
|
<option value=''>
|
||||||
|
{formatMessage(messages.newSrNfsDefaultVersion)}
|
||||||
|
</option>
|
||||||
|
{map(NFS_VERSIONS, option => (
|
||||||
|
<option key={option} value={option}>
|
||||||
|
{option}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
</fieldset>,
|
</fieldset>,
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<label>{_('newSrNfsOptions')}</label>
|
<label>{_('newSrNfsOptions')}</label>
|
||||||
@@ -859,6 +915,31 @@ export default class New extends Component {
|
|||||||
/>
|
/>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
)}
|
)}
|
||||||
|
{type === 'zfs' && (
|
||||||
|
<fieldset>
|
||||||
|
<label htmlFor='selectSrLocation'>
|
||||||
|
{_('srLocation')}
|
||||||
|
</label>
|
||||||
|
<select
|
||||||
|
className='form-control'
|
||||||
|
defaultValue=''
|
||||||
|
id='selectSrLocation'
|
||||||
|
ref='zfsLocation'
|
||||||
|
required
|
||||||
|
>
|
||||||
|
<option value=''>
|
||||||
|
{isEmpty(zfsPools)
|
||||||
|
? formatMessage(messages.noSharedZfsAvailable)
|
||||||
|
: formatMessage(messages.noSelectedValue)}
|
||||||
|
</option>
|
||||||
|
{map(zfsPools, (pool, poolName) => (
|
||||||
|
<option key={poolName} value={pool.mountpoint}>
|
||||||
|
{poolName} - {pool.mountpoint}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
|
</fieldset>
|
||||||
|
)}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
)}
|
)}
|
||||||
{loading !== 0 && <Icon icon='loading' />}
|
{loading !== 0 && <Icon icon='loading' />}
|
||||||
|
|||||||
@@ -100,17 +100,17 @@ const COLUMNS = [
|
|||||||
itemRenderer: server => (
|
itemRenderer: server => (
|
||||||
<div>
|
<div>
|
||||||
<StateButton
|
<StateButton
|
||||||
disabledLabel={_('serverDisconnected')}
|
disabledLabel={_('serverDisabled')}
|
||||||
disabledHandler={connectServer}
|
disabledHandler={connectServer}
|
||||||
disabledTooltip={_('serverConnect')}
|
disabledTooltip={_('serverDisabled')}
|
||||||
enabledLabel={_('serverConnected')}
|
enabledLabel={_('serverEnabled')}
|
||||||
enabledHandler={disconnectServer}
|
enabledHandler={disconnectServer}
|
||||||
enabledTooltip={_('serverDisconnect')}
|
enabledTooltip={_('serverDisable')}
|
||||||
handlerParam={server}
|
handlerParam={server}
|
||||||
pending={server.status === 'connecting'}
|
pending={server.status === 'connecting'}
|
||||||
state={server.status === 'connected'}
|
state={server.status === 'connected'}
|
||||||
/>{' '}
|
/>{' '}
|
||||||
{server.error && (
|
{server.status === 'connected' && server.error && (
|
||||||
<Tooltip content={_('serverConnectionFailed')}>
|
<Tooltip content={_('serverConnectionFailed')}>
|
||||||
<a
|
<a
|
||||||
className='text-danger btn btn-link btn-sm'
|
className='text-danger btn btn-link btn-sm'
|
||||||
|
|||||||
@@ -55,6 +55,19 @@ const HOST_COLUMNS = [
|
|||||||
},
|
},
|
||||||
sortCriteria: (pbd, hosts) => hosts[pbd.host].name_description,
|
sortCriteria: (pbd, hosts) => hosts[pbd.host].name_description,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: _('pbdDetails'),
|
||||||
|
itemRenderer: ({ device_config: deviceConfig }) => {
|
||||||
|
const keys = Object.keys(deviceConfig)
|
||||||
|
return (
|
||||||
|
<ul className='list-unstyled'>
|
||||||
|
{keys.map(key => (
|
||||||
|
<li key={key}>{_.keyValue(key, deviceConfig[key])}</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: _('pbdStatus'),
|
name: _('pbdStatus'),
|
||||||
itemRenderer: pbd => (
|
itemRenderer: pbd => (
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import Icon from 'icon'
|
|||||||
import Link from 'link'
|
import Link from 'link'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import renderXoItem from 'render-xo-item'
|
import renderXoItem from 'render-xo-item'
|
||||||
|
import SelectBootFirmware from 'select-boot-firmware'
|
||||||
import TabButton from 'tab-button'
|
import TabButton from 'tab-button'
|
||||||
import Tooltip from 'tooltip'
|
import Tooltip from 'tooltip'
|
||||||
import { error } from 'notification'
|
import { error } from 'notification'
|
||||||
@@ -510,6 +511,11 @@ export default class TabAdvanced extends Component {
|
|||||||
_onChangeCpuMask = cpuMask =>
|
_onChangeCpuMask = cpuMask =>
|
||||||
editVm(this.props.vm, { cpuMask: map(cpuMask, 'value') })
|
editVm(this.props.vm, { cpuMask: map(cpuMask, 'value') })
|
||||||
|
|
||||||
|
_handleBootFirmware = value =>
|
||||||
|
editVm(this.props.vm, {
|
||||||
|
hvmBootFirmware: value !== '' ? value : null,
|
||||||
|
})
|
||||||
|
|
||||||
_onNicTypeChange = value =>
|
_onNicTypeChange = value =>
|
||||||
editVm(this.props.vm, { nicType: value === '' ? null : value })
|
editVm(this.props.vm, { nicType: value === '' ? null : value })
|
||||||
|
|
||||||
@@ -833,6 +839,17 @@ export default class TabAdvanced extends Component {
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
)}
|
)}
|
||||||
|
{vm.virtualizationMode === 'hvm' && (
|
||||||
|
<tr>
|
||||||
|
<th>{_('vmBootFirmware')}</th>
|
||||||
|
<td>
|
||||||
|
<SelectBootFirmware
|
||||||
|
onChange={this._handleBootFirmware}
|
||||||
|
value={defined(() => vm.boot.firmware, '')}
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
)}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<br />
|
<br />
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import Tooltip from 'tooltip'
|
|||||||
import { isIp, isIpV4 } from 'ip-utils'
|
import { isIp, isIpV4 } from 'ip-utils'
|
||||||
import { Container, Row, Col } from 'grid'
|
import { Container, Row, Col } from 'grid'
|
||||||
import { injectIntl } from 'react-intl'
|
import { injectIntl } from 'react-intl'
|
||||||
import { XoSelect, Text } from 'editable'
|
import { Number, Text, XoSelect } from 'editable'
|
||||||
import {
|
import {
|
||||||
addSubscriptions,
|
addSubscriptions,
|
||||||
connectStore,
|
connectStore,
|
||||||
@@ -331,6 +331,17 @@ const COLUMNS = [
|
|||||||
name: _('vifNetworkLabel'),
|
name: _('vifNetworkLabel'),
|
||||||
sortCriteria: (vif, userData) => userData.networks[vif.$network].name_label,
|
sortCriteria: (vif, userData) => userData.networks[vif.$network].name_label,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
itemRenderer: ({ id, rateLimit }) => (
|
||||||
|
<Number
|
||||||
|
nullable
|
||||||
|
onChange={rateLimit => setVif(id, { rateLimit })}
|
||||||
|
value={rateLimit === undefined ? '' : rateLimit}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
name: _('vifRateLimitLabel'),
|
||||||
|
sortCriteria: 'rateLimit',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
component: VifAllowedIps,
|
component: VifAllowedIps,
|
||||||
name: _('vifAllowedIps'),
|
name: _('vifAllowedIps'),
|
||||||
|
|||||||
@@ -120,7 +120,10 @@ const Updates = decorate([
|
|||||||
linkState,
|
linkState,
|
||||||
onChannelChange: (_, channel) => ({ channel }),
|
onChannelChange: (_, channel) => ({ channel }),
|
||||||
async register() {
|
async register() {
|
||||||
const { state } = this
|
const {
|
||||||
|
props: { xoaRegisterState },
|
||||||
|
state,
|
||||||
|
} = this
|
||||||
|
|
||||||
const { isRegistered } = state
|
const { isRegistered } = state
|
||||||
if (isRegistered) {
|
if (isRegistered) {
|
||||||
@@ -130,7 +133,7 @@ const Updates = decorate([
|
|||||||
body: (
|
body: (
|
||||||
<p>
|
<p>
|
||||||
{_('alreadyRegisteredModalText', {
|
{_('alreadyRegisteredModalText', {
|
||||||
email: this.props.xoaRegisterState.email,
|
email: xoaRegisterState.email,
|
||||||
})}
|
})}
|
||||||
</p>
|
</p>
|
||||||
),
|
),
|
||||||
@@ -144,7 +147,7 @@ const Updates = decorate([
|
|||||||
}
|
}
|
||||||
|
|
||||||
state.askRegisterAgain = false
|
state.askRegisterAgain = false
|
||||||
const { email, password } = state
|
const { email = xoaRegisterState.email, password } = state
|
||||||
await xoaUpdater.register(email, password, isRegistered)
|
await xoaUpdater.register(email, password, isRegistered)
|
||||||
|
|
||||||
return initialRegistrationState()
|
return initialRegistrationState()
|
||||||
@@ -471,7 +474,7 @@ const Updates = decorate([
|
|||||||
</div>{' '}
|
</div>{' '}
|
||||||
<div className='form-group'>
|
<div className='form-group'>
|
||||||
<Password
|
<Password
|
||||||
disabled={state.email === undefined}
|
disabled={helper(state, xoaRegisterState, 'email') === ''}
|
||||||
name='password'
|
name='password'
|
||||||
onChange={effects.linkState}
|
onChange={effects.linkState}
|
||||||
placeholder={formatMessage(
|
placeholder={formatMessage(
|
||||||
|
|||||||
426
yarn.lock
426
yarn.lock
@@ -27,16 +27,16 @@
|
|||||||
"@babel/highlight" "^7.0.0"
|
"@babel/highlight" "^7.0.0"
|
||||||
|
|
||||||
"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.1.5":
|
"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.1.5":
|
||||||
version "7.4.4"
|
version "7.4.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.4.tgz#84055750b05fcd50f9915a826b44fa347a825250"
|
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a"
|
||||||
integrity sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ==
|
integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/code-frame" "^7.0.0"
|
"@babel/code-frame" "^7.0.0"
|
||||||
"@babel/generator" "^7.4.4"
|
"@babel/generator" "^7.4.4"
|
||||||
"@babel/helpers" "^7.4.4"
|
"@babel/helpers" "^7.4.4"
|
||||||
"@babel/parser" "^7.4.4"
|
"@babel/parser" "^7.4.5"
|
||||||
"@babel/template" "^7.4.4"
|
"@babel/template" "^7.4.4"
|
||||||
"@babel/traverse" "^7.4.4"
|
"@babel/traverse" "^7.4.5"
|
||||||
"@babel/types" "^7.4.4"
|
"@babel/types" "^7.4.4"
|
||||||
convert-source-map "^1.1.0"
|
convert-source-map "^1.1.0"
|
||||||
debug "^4.1.0"
|
debug "^4.1.0"
|
||||||
@@ -242,10 +242,10 @@
|
|||||||
esutils "^2.0.2"
|
esutils "^2.0.2"
|
||||||
js-tokens "^4.0.0"
|
js-tokens "^4.0.0"
|
||||||
|
|
||||||
"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4":
|
"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4", "@babel/parser@^7.4.5":
|
||||||
version "7.4.4"
|
version "7.4.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6"
|
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872"
|
||||||
integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==
|
integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==
|
||||||
|
|
||||||
"@babel/plugin-proposal-async-generator-functions@^7.2.0":
|
"@babel/plugin-proposal-async-generator-functions@^7.2.0":
|
||||||
version "7.2.0"
|
version "7.2.0"
|
||||||
@@ -606,12 +606,12 @@
|
|||||||
"@babel/helper-module-transforms" "^7.1.0"
|
"@babel/helper-module-transforms" "^7.1.0"
|
||||||
"@babel/helper-plugin-utils" "^7.0.0"
|
"@babel/helper-plugin-utils" "^7.0.0"
|
||||||
|
|
||||||
"@babel/plugin-transform-named-capturing-groups-regex@^7.4.4":
|
"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5":
|
||||||
version "7.4.4"
|
version "7.4.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.4.tgz#5611d96d987dfc4a3a81c4383bb173361037d68d"
|
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106"
|
||||||
integrity sha512-Ki+Y9nXBlKfhD+LXaRS7v95TtTGYRAf9Y1rTDiE75zf8YQz4GDaWRXosMfJBXxnk88mGFjWdCRIeqDbon7spYA==
|
integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==
|
||||||
dependencies:
|
dependencies:
|
||||||
regexp-tree "^0.1.0"
|
regexp-tree "^0.1.6"
|
||||||
|
|
||||||
"@babel/plugin-transform-new-target@^7.4.4":
|
"@babel/plugin-transform-new-target@^7.4.4":
|
||||||
version "7.4.4"
|
version "7.4.4"
|
||||||
@@ -644,12 +644,12 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-plugin-utils" "^7.0.0"
|
"@babel/helper-plugin-utils" "^7.0.0"
|
||||||
|
|
||||||
"@babel/plugin-transform-regenerator@^7.4.4":
|
"@babel/plugin-transform-regenerator@^7.4.5":
|
||||||
version "7.4.4"
|
version "7.4.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.4.tgz#5b4da4df79391895fca9e28f99e87e22cfc02072"
|
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f"
|
||||||
integrity sha512-Zz3w+pX1SI0KMIiqshFZkwnVGUhDZzpX2vtPzfJBKQQq8WsP/Xy9DNdELWivxcKOCX/Pywge4SiEaPaLtoDT4g==
|
integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==
|
||||||
dependencies:
|
dependencies:
|
||||||
regenerator-transform "^0.13.4"
|
regenerator-transform "^0.14.0"
|
||||||
|
|
||||||
"@babel/plugin-transform-reserved-words@^7.2.0":
|
"@babel/plugin-transform-reserved-words@^7.2.0":
|
||||||
version "7.2.0"
|
version "7.2.0"
|
||||||
@@ -713,9 +713,9 @@
|
|||||||
regenerator-runtime "^0.13.2"
|
regenerator-runtime "^0.13.2"
|
||||||
|
|
||||||
"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.1.5":
|
"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.1.5":
|
||||||
version "7.4.4"
|
version "7.4.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.4.tgz#b6f6825bfb27b3e1394ca3de4f926482722c1d6f"
|
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58"
|
||||||
integrity sha512-FU1H+ACWqZZqfw1x2G1tgtSSYSfxJLkpaUQL37CenULFARDo+h4xJoVHzRoHbK+85ViLciuI7ME4WTIhFRBBlw==
|
integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-module-imports" "^7.0.0"
|
"@babel/helper-module-imports" "^7.0.0"
|
||||||
"@babel/helper-plugin-utils" "^7.0.0"
|
"@babel/helper-plugin-utils" "^7.0.0"
|
||||||
@@ -746,12 +746,12 @@
|
|||||||
"@babel/plugin-transform-modules-commonjs" "^7.4.4"
|
"@babel/plugin-transform-modules-commonjs" "^7.4.4"
|
||||||
"@babel/plugin-transform-modules-systemjs" "^7.4.4"
|
"@babel/plugin-transform-modules-systemjs" "^7.4.4"
|
||||||
"@babel/plugin-transform-modules-umd" "^7.2.0"
|
"@babel/plugin-transform-modules-umd" "^7.2.0"
|
||||||
"@babel/plugin-transform-named-capturing-groups-regex" "^7.4.4"
|
"@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5"
|
||||||
"@babel/plugin-transform-new-target" "^7.4.4"
|
"@babel/plugin-transform-new-target" "^7.4.4"
|
||||||
"@babel/plugin-transform-object-super" "^7.2.0"
|
"@babel/plugin-transform-object-super" "^7.2.0"
|
||||||
"@babel/plugin-transform-parameters" "^7.4.4"
|
"@babel/plugin-transform-parameters" "^7.4.4"
|
||||||
"@babel/plugin-transform-property-literals" "^7.2.0"
|
"@babel/plugin-transform-property-literals" "^7.2.0"
|
||||||
"@babel/plugin-transform-regenerator" "^7.4.4"
|
"@babel/plugin-transform-regenerator" "^7.4.5"
|
||||||
"@babel/plugin-transform-reserved-words" "^7.2.0"
|
"@babel/plugin-transform-reserved-words" "^7.2.0"
|
||||||
"@babel/plugin-transform-shorthand-properties" "^7.2.0"
|
"@babel/plugin-transform-shorthand-properties" "^7.2.0"
|
||||||
"@babel/plugin-transform-spread" "^7.2.0"
|
"@babel/plugin-transform-spread" "^7.2.0"
|
||||||
@@ -760,8 +760,8 @@
|
|||||||
"@babel/plugin-transform-typeof-symbol" "^7.2.0"
|
"@babel/plugin-transform-typeof-symbol" "^7.2.0"
|
||||||
"@babel/plugin-transform-unicode-regex" "^7.4.4"
|
"@babel/plugin-transform-unicode-regex" "^7.4.4"
|
||||||
"@babel/types" "^7.4.4"
|
"@babel/types" "^7.4.4"
|
||||||
browserslist "^4.5.2"
|
browserslist "^4.6.0"
|
||||||
core-js-compat "^3.0.0"
|
core-js-compat "^3.1.1"
|
||||||
invariant "^2.2.2"
|
invariant "^2.2.2"
|
||||||
js-levenshtein "^1.1.3"
|
js-levenshtein "^1.1.3"
|
||||||
semver "^5.5.0"
|
semver "^5.5.0"
|
||||||
@@ -794,9 +794,9 @@
|
|||||||
regenerator-runtime "^0.12.0"
|
regenerator-runtime "^0.12.0"
|
||||||
|
|
||||||
"@babel/runtime@^7.1.2":
|
"@babel/runtime@^7.1.2":
|
||||||
version "7.4.4"
|
version "7.4.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.4.tgz#dc2e34982eb236803aa27a07fea6857af1b9171d"
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12"
|
||||||
integrity sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==
|
integrity sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
regenerator-runtime "^0.13.2"
|
regenerator-runtime "^0.13.2"
|
||||||
|
|
||||||
@@ -809,16 +809,16 @@
|
|||||||
"@babel/parser" "^7.4.4"
|
"@babel/parser" "^7.4.4"
|
||||||
"@babel/types" "^7.4.4"
|
"@babel/types" "^7.4.4"
|
||||||
|
|
||||||
"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4":
|
"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5":
|
||||||
version "7.4.4"
|
version "7.4.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.4.tgz#0776f038f6d78361860b6823887d4f3937133fe8"
|
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216"
|
||||||
integrity sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==
|
integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/code-frame" "^7.0.0"
|
"@babel/code-frame" "^7.0.0"
|
||||||
"@babel/generator" "^7.4.4"
|
"@babel/generator" "^7.4.4"
|
||||||
"@babel/helper-function-name" "^7.1.0"
|
"@babel/helper-function-name" "^7.1.0"
|
||||||
"@babel/helper-split-export-declaration" "^7.4.4"
|
"@babel/helper-split-export-declaration" "^7.4.4"
|
||||||
"@babel/parser" "^7.4.4"
|
"@babel/parser" "^7.4.5"
|
||||||
"@babel/types" "^7.4.4"
|
"@babel/types" "^7.4.4"
|
||||||
debug "^4.1.0"
|
debug "^4.1.0"
|
||||||
globals "^11.1.0"
|
globals "^11.1.0"
|
||||||
@@ -1138,14 +1138,14 @@
|
|||||||
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
|
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
|
||||||
|
|
||||||
"@types/node@*", "@types/node@^12.0.2":
|
"@types/node@*", "@types/node@^12.0.2":
|
||||||
version "12.0.2"
|
version "12.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.2.tgz#3452a24edf9fea138b48fad4a0a028a683da1e40"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32"
|
||||||
integrity sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA==
|
integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw==
|
||||||
|
|
||||||
"@types/node@^8.0.7":
|
"@types/node@^8.0.7":
|
||||||
version "8.10.48"
|
version "8.10.49"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.48.tgz#e385073561643a9ba6199a1985ffc03530f90781"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.49.tgz#f331afc5efed0796798e5591d6e0ece636969b7b"
|
||||||
integrity sha512-c35YEBTkL4rzXY2ucpSKy+UYHjUBIIkuJbWYbsGIrKLEWU5dgJMmLkkIb3qeC3O3Tpb1ZQCwecscvJTDjDjkRw==
|
integrity sha512-YX30JVx0PvSmJ3Eqr74fYLGeBxD+C7vIL20ek+GGGLJeUbVYRUW3EzyAXpIRA0K8c8o0UWqR/GwEFYiFoz1T8w==
|
||||||
|
|
||||||
"@types/normalize-package-data@^2.4.0":
|
"@types/normalize-package-data@^2.4.0":
|
||||||
version "2.4.0"
|
version "2.4.0"
|
||||||
@@ -1276,16 +1276,16 @@ acorn-jsx@^5.0.0:
|
|||||||
integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==
|
integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==
|
||||||
|
|
||||||
acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1:
|
acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1:
|
||||||
version "1.6.2"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.6.2.tgz#b7d7ceca6f22e6417af933a62cad4de01048d5d2"
|
resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.7.0.tgz#aac6a559d27af6176b076ab6fb13c5974c213e3b"
|
||||||
integrity sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==
|
integrity sha512-XhahLSsCB6X6CJbe+uNu3Mn9sJBNFxtBN9NLgAOQovfS6Kh0lDUtmlclhjn9CvEK7A7YyRU13PXlNcpSiLI9Yw==
|
||||||
dependencies:
|
dependencies:
|
||||||
acorn "^6.0.2"
|
acorn "^6.1.1"
|
||||||
acorn-dynamic-import "^4.0.0"
|
acorn-dynamic-import "^4.0.0"
|
||||||
acorn-walk "^6.1.0"
|
acorn-walk "^6.1.1"
|
||||||
xtend "^4.0.1"
|
xtend "^4.0.1"
|
||||||
|
|
||||||
acorn-walk@^6.0.1, acorn-walk@^6.1.0:
|
acorn-walk@^6.0.1, acorn-walk@^6.1.1:
|
||||||
version "6.1.1"
|
version "6.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
|
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
|
||||||
integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==
|
integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==
|
||||||
@@ -1305,7 +1305,7 @@ acorn@^4.0.4, acorn@~4.0.2:
|
|||||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
|
||||||
integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=
|
integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=
|
||||||
|
|
||||||
acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7:
|
acorn@^6.0.1, acorn@^6.0.7, acorn@^6.1.1:
|
||||||
version "6.1.1"
|
version "6.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f"
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f"
|
||||||
integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==
|
integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==
|
||||||
@@ -1702,12 +1702,12 @@ array-unique@^0.3.2:
|
|||||||
integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
|
integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
|
||||||
|
|
||||||
array.prototype.find@^2.0.4:
|
array.prototype.find@^2.0.4:
|
||||||
version "2.0.4"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90"
|
resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.0.tgz#630f2eaf70a39e608ac3573e45cf8ccd0ede9ad7"
|
||||||
integrity sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=
|
integrity sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==
|
||||||
dependencies:
|
dependencies:
|
||||||
define-properties "^1.1.2"
|
define-properties "^1.1.3"
|
||||||
es-abstract "^1.7.0"
|
es-abstract "^1.13.0"
|
||||||
|
|
||||||
array.prototype.flat@^1.2.1:
|
array.prototype.flat@^1.2.1:
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
@@ -2907,9 +2907,9 @@ blocked@^1.2.1:
|
|||||||
integrity sha1-4i7+dnhjxlq4GX9iUpKRBOHsnOI=
|
integrity sha1-4i7+dnhjxlq4GX9iUpKRBOHsnOI=
|
||||||
|
|
||||||
bluebird@^3.5.1:
|
bluebird@^3.5.1:
|
||||||
version "3.5.4"
|
version "3.5.5"
|
||||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714"
|
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
|
||||||
integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==
|
integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
|
||||||
|
|
||||||
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
|
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
|
||||||
version "4.11.8"
|
version "4.11.8"
|
||||||
@@ -3169,14 +3169,14 @@ browserslist@^3.2.6:
|
|||||||
caniuse-lite "^1.0.30000844"
|
caniuse-lite "^1.0.30000844"
|
||||||
electron-to-chromium "^1.3.47"
|
electron-to-chromium "^1.3.47"
|
||||||
|
|
||||||
browserslist@^4.5.2, browserslist@^4.5.4:
|
browserslist@^4.5.4, browserslist@^4.6.0:
|
||||||
version "4.6.0"
|
version "4.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.0.tgz#5274028c26f4d933d5b1323307c1d1da5084c9ff"
|
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.1.tgz#ee5059b1aec18cbec9d055d6cb5e24ae50343a9b"
|
||||||
integrity sha512-Jk0YFwXBuMOOol8n6FhgkDzn3mY9PYLYGk29zybF05SbRTsMgPqmTNeQQhOghCxq5oFqAXE3u4sYddr4C0uRhg==
|
integrity sha512-1MC18ooMPRG2UuVFJTHFIAkk6mpByJfxCrnUyvSlu/hyQSFHMrlhM02SzNuCV+quTP4CKmqtOMAIjrifrpBJXQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
caniuse-lite "^1.0.30000967"
|
caniuse-lite "^1.0.30000971"
|
||||||
electron-to-chromium "^1.3.133"
|
electron-to-chromium "^1.3.137"
|
||||||
node-releases "^1.1.19"
|
node-releases "^1.1.21"
|
||||||
|
|
||||||
bser@^2.0.0:
|
bser@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
@@ -3318,7 +3318,7 @@ cache-base@^1.0.1:
|
|||||||
union-value "^1.0.0"
|
union-value "^1.0.0"
|
||||||
unset-value "^1.0.0"
|
unset-value "^1.0.0"
|
||||||
|
|
||||||
cached-path-relative@^1.0.0:
|
cached-path-relative@^1.0.0, cached-path-relative@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db"
|
resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db"
|
||||||
integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==
|
integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==
|
||||||
@@ -3405,10 +3405,10 @@ can-promise@0.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
window-or-global "^1.0.1"
|
window-or-global "^1.0.1"
|
||||||
|
|
||||||
caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000957, caniuse-lite@^1.0.30000967:
|
caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000957, caniuse-lite@^1.0.30000971:
|
||||||
version "1.0.30000969"
|
version "1.0.30000971"
|
||||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000969.tgz#7664f571f2072657bde70b00a1fc1ba41f1942a9"
|
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000971.tgz#d1000e4546486a6977756547352bc96a4cfd2b13"
|
||||||
integrity sha512-Kus0yxkoAJgVc0bax7S4gLSlFifCa7MnSZL9p9VuS/HIKEL4seaqh28KIQAAO50cD/rJ5CiJkJFapkdDAlhFxQ==
|
integrity sha512-TQFYFhRS0O5rdsmSbF1Wn+16latXYsQJat66f7S7lizXW1PVpWJeZw9wqqVLIjuxDRz7s7xRUj13QCfd8hKn6g==
|
||||||
|
|
||||||
capture-exit@^2.0.0:
|
capture-exit@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
@@ -3648,9 +3648,9 @@ clone@^2.1.1:
|
|||||||
integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
|
integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
|
||||||
|
|
||||||
cloneable-readable@^1.0.0:
|
cloneable-readable@^1.0.0:
|
||||||
version "1.1.2"
|
version "1.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65"
|
resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec"
|
||||||
integrity sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==
|
integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
inherits "^2.0.1"
|
inherits "^2.0.1"
|
||||||
process-nextick-args "^2.0.0"
|
process-nextick-args "^2.0.0"
|
||||||
@@ -3921,25 +3921,19 @@ copy-to-clipboard@^3, copy-to-clipboard@^3.0.8:
|
|||||||
dependencies:
|
dependencies:
|
||||||
toggle-selection "^1.0.6"
|
toggle-selection "^1.0.6"
|
||||||
|
|
||||||
core-js-compat@^3.0.0:
|
core-js-compat@^3.1.1:
|
||||||
version "3.0.1"
|
version "3.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.1.tgz#bff73ba31ca8687431b9c88f78d3362646fb76f0"
|
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.3.tgz#0cc3ba4c7f62928c2837e1cffbe8dc78b4f1ae14"
|
||||||
integrity sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g==
|
integrity sha512-EP018pVhgwsKHz3YoN1hTq49aRe+h017Kjz0NQz3nXV0cCRMvH3fLQl+vEPGr4r4J5sk4sU3tUC7U1aqTCeJeA==
|
||||||
dependencies:
|
dependencies:
|
||||||
browserslist "^4.5.4"
|
browserslist "^4.6.0"
|
||||||
core-js "3.0.1"
|
core-js-pure "3.1.3"
|
||||||
core-js-pure "3.0.1"
|
semver "^6.1.0"
|
||||||
semver "^6.0.0"
|
|
||||||
|
|
||||||
core-js-pure@3.0.1:
|
core-js-pure@3.1.3:
|
||||||
version "3.0.1"
|
version "3.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.1.tgz#37358fb0d024e6b86d443d794f4e37e949098cbe"
|
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.3.tgz#4c90752d5b9471f641514f3728f51c1e0783d0b5"
|
||||||
integrity sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g==
|
integrity sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA==
|
||||||
|
|
||||||
core-js@3.0.1, core-js@^3.0.0:
|
|
||||||
version "3.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.1.tgz#1343182634298f7f38622f95e73f54e48ddf4738"
|
|
||||||
integrity sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==
|
|
||||||
|
|
||||||
core-js@^1.0.0:
|
core-js@^1.0.0:
|
||||||
version "1.2.7"
|
version "1.2.7"
|
||||||
@@ -3947,9 +3941,14 @@ core-js@^1.0.0:
|
|||||||
integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
|
integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
|
||||||
|
|
||||||
core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5:
|
core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5:
|
||||||
version "2.6.5"
|
version "2.6.9"
|
||||||
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895"
|
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
|
||||||
integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==
|
integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==
|
||||||
|
|
||||||
|
core-js@^3.0.0:
|
||||||
|
version "3.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.1.3.tgz#95700bca5f248f5f78c0ec63e784eca663ec4138"
|
||||||
|
integrity sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==
|
||||||
|
|
||||||
core-util-is@1.0.2, core-util-is@~1.0.0:
|
core-util-is@1.0.2, core-util-is@~1.0.0:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
@@ -4963,10 +4962,10 @@ ejs@^2.5.6:
|
|||||||
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
|
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
|
||||||
integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==
|
integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==
|
||||||
|
|
||||||
electron-to-chromium@^1.3.133, electron-to-chromium@^1.3.47:
|
electron-to-chromium@^1.3.137, electron-to-chromium@^1.3.47:
|
||||||
version "1.3.135"
|
version "1.3.143"
|
||||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.135.tgz#f5799b95f2bcd8de17cde47d63392d83a4477041"
|
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.143.tgz#8b2a631ab75157aa53d0c2933275643b99ef580b"
|
||||||
integrity sha512-xXLNstRdVsisPF3pL3H9TVZo2XkMILfqtD6RiWIUmDK2sFX1Bjwqmd8LBp0Kuo2FgKO63JXPoEVGm8WyYdwP0Q==
|
integrity sha512-J9jOpxIljQZlV6GIP2fwAWq0T69syawU0sH3EW3O2Bgxquiy+veeIT5mBDRz+i3oHUSL1tvVgRKH3/4QiQh9Pg==
|
||||||
|
|
||||||
elliptic@^6.0.0:
|
elliptic@^6.0.0:
|
||||||
version "6.4.1"
|
version "6.4.1"
|
||||||
@@ -5092,7 +5091,7 @@ error-ex@^1.2.0, error-ex@^1.3.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-arrayish "^0.2.1"
|
is-arrayish "^0.2.1"
|
||||||
|
|
||||||
es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.7.0:
|
es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.7.0:
|
||||||
version "1.13.0"
|
version "1.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
|
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
|
||||||
integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
|
integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
|
||||||
@@ -5233,9 +5232,9 @@ eslint-plugin-eslint-comments@^3.1.1:
|
|||||||
ignore "^5.0.5"
|
ignore "^5.0.5"
|
||||||
|
|
||||||
eslint-plugin-import@^2.8.0:
|
eslint-plugin-import@^2.8.0:
|
||||||
version "2.17.2"
|
version "2.17.3"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz#d227d5c6dc67eca71eb590d2bb62fb38d86e9fcb"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.17.3.tgz#00548b4434c18faebaba04b24ae6198f280de189"
|
||||||
integrity sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g==
|
integrity sha512-qeVf/UwXFJbeyLbxuY8RgqDyEKCkqV7YC+E5S5uOjAp4tOc8zj01JP3ucoBM8JcEqd1qRasJSg6LLlisirfy0Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
array-includes "^3.0.3"
|
array-includes "^3.0.3"
|
||||||
contains-path "^0.1.0"
|
contains-path "^0.1.0"
|
||||||
@@ -5247,19 +5246,19 @@ eslint-plugin-import@^2.8.0:
|
|||||||
lodash "^4.17.11"
|
lodash "^4.17.11"
|
||||||
minimatch "^3.0.4"
|
minimatch "^3.0.4"
|
||||||
read-pkg-up "^2.0.0"
|
read-pkg-up "^2.0.0"
|
||||||
resolve "^1.10.0"
|
resolve "^1.11.0"
|
||||||
|
|
||||||
eslint-plugin-node@^9.0.1:
|
eslint-plugin-node@^9.0.1:
|
||||||
version "9.0.1"
|
version "9.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.0.1.tgz#93e44626fa62bcb6efea528cee9687663dc03b62"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.1.0.tgz#f2fd88509a31ec69db6e9606d76dabc5adc1b91a"
|
||||||
integrity sha512-fljT5Uyy3lkJzuqhxrYanLSsvaILs9I7CmQ31atTtZ0DoIzRbbvInBh4cQ1CrthFHInHYBQxfPmPt6KLHXNXdw==
|
integrity sha512-ZwQYGm6EoV2cfLpE1wxJWsfnKUIXfM/KM09/TlorkukgCAwmkgajEJnPCmyzoFPQQkmvo5DrW/nyKutNIw36Mw==
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint-plugin-es "^1.4.0"
|
eslint-plugin-es "^1.4.0"
|
||||||
eslint-utils "^1.3.1"
|
eslint-utils "^1.3.1"
|
||||||
ignore "^5.1.1"
|
ignore "^5.1.1"
|
||||||
minimatch "^3.0.4"
|
minimatch "^3.0.4"
|
||||||
resolve "^1.10.1"
|
resolve "^1.10.1"
|
||||||
semver "^6.0.0"
|
semver "^6.1.0"
|
||||||
|
|
||||||
eslint-plugin-promise@^4.0.0:
|
eslint-plugin-promise@^4.0.0:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
@@ -5607,9 +5606,9 @@ express-session@^1.15.6:
|
|||||||
uid-safe "~2.1.5"
|
uid-safe "~2.1.5"
|
||||||
|
|
||||||
express@^4.16.2:
|
express@^4.16.2:
|
||||||
version "4.17.0"
|
version "4.17.1"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.17.0.tgz#288af62228a73f4c8ea2990ba3b791bb87cd4438"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
|
||||||
integrity sha512-1Z7/t3Z5ZnBG252gKUPyItc4xdeaA0X934ca2ewckAsVsw9EG71i++ZHZPYnus8g/s5Bty8IMpSVEuRkmwwPRQ==
|
integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
|
||||||
dependencies:
|
dependencies:
|
||||||
accepts "~1.3.7"
|
accepts "~1.3.7"
|
||||||
array-flatten "1.1.1"
|
array-flatten "1.1.1"
|
||||||
@@ -5754,9 +5753,9 @@ fast-future@~1.0.2:
|
|||||||
integrity sha1-hDWpqqAteSSNF9cE52JZMB2ZKAo=
|
integrity sha1-hDWpqqAteSSNF9cE52JZMB2ZKAo=
|
||||||
|
|
||||||
fast-glob@^2.2.6:
|
fast-glob@^2.2.6:
|
||||||
version "2.2.6"
|
version "2.2.7"
|
||||||
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295"
|
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
|
||||||
integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==
|
integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@mrmlnc/readdir-enhanced" "^2.2.1"
|
"@mrmlnc/readdir-enhanced" "^2.2.1"
|
||||||
"@nodelib/fs.stat" "^1.1.2"
|
"@nodelib/fs.stat" "^1.1.2"
|
||||||
@@ -5910,6 +5909,13 @@ find-up@^3.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
locate-path "^3.0.0"
|
locate-path "^3.0.0"
|
||||||
|
|
||||||
|
find-up@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.0.0.tgz#c367f8024de92efb75f2d4906536d24682065c3a"
|
||||||
|
integrity sha512-zoH7ZWPkRdgwYCDVoQTzqjG8JSPANhtvLhh4KVUHyKnaUJJrNeFmWIkTcNuJmR3GLMEmGYEf2S2bjgx26JTF+Q==
|
||||||
|
dependencies:
|
||||||
|
locate-path "^5.0.0"
|
||||||
|
|
||||||
findup-sync@^2.0.0:
|
findup-sync@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
|
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
|
||||||
@@ -5967,10 +5973,10 @@ flatted@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916"
|
resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916"
|
||||||
integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==
|
integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==
|
||||||
|
|
||||||
flow-bin@^0.98.0:
|
flow-bin@^0.100.0:
|
||||||
version "0.98.1"
|
version "0.100.0"
|
||||||
resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.98.1.tgz#a8d781621c91703df69928acc83c9777e2fcbb49"
|
resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.100.0.tgz#729902726658cfa0a81425d6401f9625cf9f5534"
|
||||||
integrity sha512-y1YzQgbFUX4EG6h2EO8PhyJeS0VxNgER8XsTwU8IXw4KozfneSmGVgw8y3TwAOza7rVhTlHEoli1xNuNW1rhPw==
|
integrity sha512-jcethhgrslBJukH7Z7883ohFFpzLrdsOEwHxvn5NwuTWbNaE71GAl55/PEBRJwYpDvYkRlqgcNkANTv0x5XjqA==
|
||||||
|
|
||||||
flush-write-stream@^1.0.2:
|
flush-write-stream@^1.0.2:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
@@ -6252,6 +6258,13 @@ get-stream@^4.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
pump "^3.0.0"
|
pump "^3.0.0"
|
||||||
|
|
||||||
|
get-stream@^5.1.0:
|
||||||
|
version "5.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9"
|
||||||
|
integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==
|
||||||
|
dependencies:
|
||||||
|
pump "^3.0.0"
|
||||||
|
|
||||||
get-uri@^2.0.0:
|
get-uri@^2.0.0:
|
||||||
version "2.0.3"
|
version "2.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.3.tgz#fa13352269781d75162c6fc813c9e905323fbab5"
|
resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.3.tgz#fa13352269781d75162c6fc813c9e905323fbab5"
|
||||||
@@ -7067,9 +7080,9 @@ ignore@^4.0.3, ignore@^4.0.6:
|
|||||||
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
|
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
|
||||||
|
|
||||||
ignore@^5.0.5, ignore@^5.1.1:
|
ignore@^5.0.5, ignore@^5.1.1:
|
||||||
version "5.1.1"
|
version "5.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.1.tgz#2fc6b8f518aff48fef65a7f348ed85632448e4a5"
|
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.2.tgz#e28e584d43ad7e92f96995019cc43b9e1ac49558"
|
||||||
integrity sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA==
|
integrity sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ==
|
||||||
|
|
||||||
immutable@^4.0.0-rc.9:
|
immutable@^4.0.0-rc.9:
|
||||||
version "4.0.0-rc.12"
|
version "4.0.0-rc.12"
|
||||||
@@ -7208,9 +7221,9 @@ interpret@^1.1.0:
|
|||||||
integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
|
integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
|
||||||
|
|
||||||
intl-format-cache@^2.0.5:
|
intl-format-cache@^2.0.5:
|
||||||
version "2.1.0"
|
version "2.2.9"
|
||||||
resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-2.1.0.tgz#04a369fecbfad6da6005bae1f14333332dcf9316"
|
resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-2.2.9.tgz#fb560de20c549cda20b569cf1ffb6dc62b5b93b4"
|
||||||
integrity sha1-BKNp/sv61tpgBbrh8UMzMy3PkxY=
|
integrity sha512-Zv/u8wRpekckv0cLkwpVdABYST4hZNTDaX7reFetrYTJwxExR2VyTqQm+l0WmL0Qo8Mjb9Tf33qnfj0T7pjxdQ==
|
||||||
|
|
||||||
intl-messageformat-parser@1.4.0:
|
intl-messageformat-parser@1.4.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
@@ -7225,9 +7238,9 @@ intl-messageformat@^2.0.0, intl-messageformat@^2.1.0:
|
|||||||
intl-messageformat-parser "1.4.0"
|
intl-messageformat-parser "1.4.0"
|
||||||
|
|
||||||
intl-relativeformat@^2.1.0:
|
intl-relativeformat@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/intl-relativeformat/-/intl-relativeformat-2.1.0.tgz#010f1105802251f40ac47d0e3e1a201348a255df"
|
resolved "https://registry.yarnpkg.com/intl-relativeformat/-/intl-relativeformat-2.2.0.tgz#6aca95d019ec8d30b6c5653b6629f9983ea5b6c5"
|
||||||
integrity sha1-AQ8RBYAiUfQKxH0OPhogE0iiVd8=
|
integrity sha512-4bV/7kSKaPEmu6ArxXf9xjv1ny74Zkwuey8Pm01NH4zggPP7JHwg2STk8Y3JdspCKRDriwIyLRfEXnj2ZLr4Bw==
|
||||||
dependencies:
|
dependencies:
|
||||||
intl-messageformat "^2.0.0"
|
intl-messageformat "^2.0.0"
|
||||||
|
|
||||||
@@ -7604,7 +7617,7 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
||||||
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
|
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
|
||||||
|
|
||||||
isarray@^2.0.1, isarray@^2.0.4:
|
isarray@^2.0.1:
|
||||||
version "2.0.4"
|
version "2.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7"
|
resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7"
|
||||||
integrity sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==
|
integrity sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==
|
||||||
@@ -8373,12 +8386,11 @@ l33teral@^3.0.3:
|
|||||||
integrity sha1-mh3FJvvf9cSw80in41+6Zvdd6gc=
|
integrity sha1-mh3FJvvf9cSw80in41+6Zvdd6gc=
|
||||||
|
|
||||||
labeled-stream-splicer@^2.0.0:
|
labeled-stream-splicer@^2.0.0:
|
||||||
version "2.0.1"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz#9cffa32fd99e1612fd1d86a8db962416d5292926"
|
resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21"
|
||||||
integrity sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==
|
integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==
|
||||||
dependencies:
|
dependencies:
|
||||||
inherits "^2.0.1"
|
inherits "^2.0.1"
|
||||||
isarray "^2.0.4"
|
|
||||||
stream-splicer "^2.0.0"
|
stream-splicer "^2.0.0"
|
||||||
|
|
||||||
last-run@^1.1.0:
|
last-run@^1.1.0:
|
||||||
@@ -8720,6 +8732,13 @@ locate-path@^3.0.0:
|
|||||||
p-locate "^3.0.0"
|
p-locate "^3.0.0"
|
||||||
path-exists "^3.0.0"
|
path-exists "^3.0.0"
|
||||||
|
|
||||||
|
locate-path@^5.0.0:
|
||||||
|
version "5.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
|
||||||
|
integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
|
||||||
|
dependencies:
|
||||||
|
p-locate "^4.1.0"
|
||||||
|
|
||||||
lodash-compat@^3.10.1:
|
lodash-compat@^3.10.1:
|
||||||
version "3.10.2"
|
version "3.10.2"
|
||||||
resolved "https://registry.yarnpkg.com/lodash-compat/-/lodash-compat-3.10.2.tgz#c6940128a9d30f8e902cd2cf99fd0cba4ecfc183"
|
resolved "https://registry.yarnpkg.com/lodash-compat/-/lodash-compat-3.10.2.tgz#c6940128a9d30f8e902cd2cf99fd0cba4ecfc183"
|
||||||
@@ -9303,7 +9322,7 @@ minimist@~0.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
|
||||||
integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=
|
integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=
|
||||||
|
|
||||||
minipass@^2.2.1, minipass@^2.3.4:
|
minipass@^2.2.1, minipass@^2.3.5:
|
||||||
version "2.3.5"
|
version "2.3.5"
|
||||||
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
|
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
|
||||||
integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==
|
integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==
|
||||||
@@ -9311,7 +9330,7 @@ minipass@^2.2.1, minipass@^2.3.4:
|
|||||||
safe-buffer "^5.1.2"
|
safe-buffer "^5.1.2"
|
||||||
yallist "^3.0.0"
|
yallist "^3.0.0"
|
||||||
|
|
||||||
minizlib@^1.1.1:
|
minizlib@^1.2.1:
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614"
|
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614"
|
||||||
integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==
|
integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==
|
||||||
@@ -9367,13 +9386,13 @@ modular-cssify@^12:
|
|||||||
through2 "^2.0.3"
|
through2 "^2.0.3"
|
||||||
|
|
||||||
module-deps@^6.0.0:
|
module-deps@^6.0.0:
|
||||||
version "6.2.0"
|
version "6.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.0.tgz#d41a2e790245ce319171e4e7c4d8c73993ba3cd5"
|
resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.1.tgz#cfe558784060e926824f474b4e647287837cda50"
|
||||||
integrity sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==
|
integrity sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==
|
||||||
dependencies:
|
dependencies:
|
||||||
JSONStream "^1.0.3"
|
JSONStream "^1.0.3"
|
||||||
browser-resolve "^1.7.0"
|
browser-resolve "^1.7.0"
|
||||||
cached-path-relative "^1.0.0"
|
cached-path-relative "^1.0.2"
|
||||||
concat-stream "~1.6.0"
|
concat-stream "~1.6.0"
|
||||||
defined "^1.0.0"
|
defined "^1.0.0"
|
||||||
detective "^5.0.2"
|
detective "^5.0.2"
|
||||||
@@ -9695,10 +9714,10 @@ node-pre-gyp@^0.12.0:
|
|||||||
semver "^5.3.0"
|
semver "^5.3.0"
|
||||||
tar "^4"
|
tar "^4"
|
||||||
|
|
||||||
node-releases@^1.1.19:
|
node-releases@^1.1.21:
|
||||||
version "1.1.19"
|
version "1.1.22"
|
||||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.19.tgz#c492d1e381fea0350b338b646c27867e88e91b3d"
|
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.22.tgz#d90cd5adc59ab9b0f377d4f532b09656399c88bf"
|
||||||
integrity sha512-SH/B4WwovHbulIALsQllAVwqZZD1kPmKCqrhGfR29dXjLAVZMHvBjD3S6nL9D/J9QkmZ1R92/0wCMDKXUUvyyA==
|
integrity sha512-O6XpteBuntW1j86mw6LlovBIwTe+sO2+7vi9avQffNeIW4upgnaCVm6xrBWH+KATz7mNNRNNeEpuWB7dT6Cr3w==
|
||||||
dependencies:
|
dependencies:
|
||||||
semver "^5.3.0"
|
semver "^5.3.0"
|
||||||
|
|
||||||
@@ -9770,9 +9789,9 @@ nodemailer-markdown@^1.0.1:
|
|||||||
marked "^0.6.2"
|
marked "^0.6.2"
|
||||||
|
|
||||||
nodemailer@^6.1.0:
|
nodemailer@^6.1.0:
|
||||||
version "6.1.1"
|
version "6.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.1.1.tgz#09e88ef4b3646f01089c5d84d007b872141fb575"
|
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.2.1.tgz#20d773925eb8f7a06166a0b62c751dc8290429f3"
|
||||||
integrity sha512-/x5MRIh56VyuuhLfcz+DL2SlBARpZpgQIf2A4Ao4hMb69MHSgDIMPwYmFwesGT1lkRDZ0eBSoym5+JoIZ3N+cQ==
|
integrity sha512-TagB7iuIi9uyNgHExo8lUDq3VK5/B0BpbkcjIgNvxbtVrjNqq0DwAOTuzALPVkK76kMhTSzIgHqg8X1uklVs6g==
|
||||||
|
|
||||||
noop-logger@^0.1.1:
|
noop-logger@^0.1.1:
|
||||||
version "0.1.1"
|
version "0.1.1"
|
||||||
@@ -10159,9 +10178,9 @@ osenv@0, osenv@^0.1.4:
|
|||||||
os-tmpdir "^1.0.0"
|
os-tmpdir "^1.0.0"
|
||||||
|
|
||||||
otplib@^11.0.0:
|
otplib@^11.0.0:
|
||||||
version "11.0.0"
|
version "11.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/otplib/-/otplib-11.0.0.tgz#1b8b8691184e6022dac0b569ebd104c1e5451498"
|
resolved "https://registry.yarnpkg.com/otplib/-/otplib-11.0.1.tgz#7d64aa87029f07c99c7f96819fb10cdb67dea886"
|
||||||
integrity sha512-B9qxrYj0FU22nF39XOcKiK+yHdeg4uoensQQsRRlVnGJ26jugZNmJS2Wc9VinR+SjTfVpjDhzxZzpcXzlRkk5Q==
|
integrity sha512-oi57teljNyWTC/JqJztHOtSGeFNDiDh5C1myd+faocUtFAX27Sm1mbx69kpEJ8/JqrblI3kAm4Pqd6tZJoOIBQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
thirty-two "1.0.2"
|
thirty-two "1.0.2"
|
||||||
|
|
||||||
@@ -10215,7 +10234,7 @@ p-limit@^1.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
p-try "^1.0.0"
|
p-try "^1.0.0"
|
||||||
|
|
||||||
p-limit@^2.0.0:
|
p-limit@^2.0.0, p-limit@^2.2.0:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2"
|
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2"
|
||||||
integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==
|
integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==
|
||||||
@@ -10236,6 +10255,13 @@ p-locate@^3.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
p-limit "^2.0.0"
|
p-limit "^2.0.0"
|
||||||
|
|
||||||
|
p-locate@^4.1.0:
|
||||||
|
version "4.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
|
||||||
|
integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
|
||||||
|
dependencies:
|
||||||
|
p-limit "^2.2.0"
|
||||||
|
|
||||||
p-reduce@^1.0.0:
|
p-reduce@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
|
resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
|
||||||
@@ -10430,7 +10456,7 @@ passport-oauth2@1.x.x:
|
|||||||
uid2 "0.0.x"
|
uid2 "0.0.x"
|
||||||
utils-merge "1.x.x"
|
utils-merge "1.x.x"
|
||||||
|
|
||||||
passport-saml@^1.0.0:
|
passport-saml@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/passport-saml/-/passport-saml-1.1.0.tgz#0fdd639b905b8f5db172bc07f2e73819a043c321"
|
resolved "https://registry.yarnpkg.com/passport-saml/-/passport-saml-1.1.0.tgz#0fdd639b905b8f5db172bc07f2e73819a043c321"
|
||||||
integrity sha512-T2dKp++HQDg9dyJvb+5dyhIVVdIb5FX6DKMex0RALU16D65fiIbZ01vKZ2qtD+nW5nSOkbkfKJUolr9U689EdQ==
|
integrity sha512-T2dKp++HQDg9dyJvb+5dyhIVVdIb5FX6DKMex0RALU16D65fiIbZ01vKZ2qtD+nW5nSOkbkfKJUolr9U689EdQ==
|
||||||
@@ -10633,11 +10659,11 @@ pkg-dir@^3.0.0:
|
|||||||
find-up "^3.0.0"
|
find-up "^3.0.0"
|
||||||
|
|
||||||
pkg-dir@^4.1.0:
|
pkg-dir@^4.1.0:
|
||||||
version "4.1.0"
|
version "4.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.1.0.tgz#aaeb91c0d3b9c4f74a44ad849f4de34781ae01de"
|
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
|
||||||
integrity sha512-55k9QN4saZ8q518lE6EFgYiu95u3BWkSajCifhdQjvLvmr8IpnRbhI+UGpWJQfa0KzDguHeeWT1ccO1PmkOi3A==
|
integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
find-up "^3.0.0"
|
find-up "^4.0.0"
|
||||||
|
|
||||||
platform@1.3.5, platform@^1.3.0, platform@^1.3.3:
|
platform@1.3.5, platform@^1.3.0, platform@^1.3.3:
|
||||||
version "1.3.5"
|
version "1.3.5"
|
||||||
@@ -10882,9 +10908,9 @@ promise@^7.0.1, promise@^7.1.1:
|
|||||||
asap "~2.0.3"
|
asap "~2.0.3"
|
||||||
|
|
||||||
prompts@^2.0.1:
|
prompts@^2.0.1:
|
||||||
version "2.0.4"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.4.tgz#179f9d4db3128b9933aa35f93a800d8fce76a682"
|
resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.1.0.tgz#bf90bc71f6065d255ea2bdc0fe6520485c1b45db"
|
||||||
integrity sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA==
|
integrity sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==
|
||||||
dependencies:
|
dependencies:
|
||||||
kleur "^3.0.2"
|
kleur "^3.0.2"
|
||||||
sisteransi "^1.0.0"
|
sisteransi "^1.0.0"
|
||||||
@@ -10966,9 +10992,9 @@ pseudomap@^1.0.2:
|
|||||||
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
|
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
|
||||||
|
|
||||||
psl@^1.1.24, psl@^1.1.28:
|
psl@^1.1.24, psl@^1.1.28:
|
||||||
version "1.1.31"
|
version "1.1.32"
|
||||||
resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184"
|
resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.32.tgz#3f132717cf2f9c169724b2b6caf373cf694198db"
|
||||||
integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==
|
integrity sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==
|
||||||
|
|
||||||
public-encrypt@^4.0.0:
|
public-encrypt@^4.0.0:
|
||||||
version "4.0.3"
|
version "4.0.3"
|
||||||
@@ -11124,9 +11150,9 @@ pull-pushable@^2.0.0:
|
|||||||
integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE=
|
integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE=
|
||||||
|
|
||||||
pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8:
|
pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8:
|
||||||
version "3.6.11"
|
version "3.6.12"
|
||||||
resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.11.tgz#601956610952a76defdcb18e4435e2478659cead"
|
resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.12.tgz#11231c8dd77afe4ae30d1cd543873179e3b30a32"
|
||||||
integrity sha512-43brwtqO0OSltctKbW1mgzzKH4TNE8egkW+Y4BFzlDWiG2Ayl7VKr4SeuoKacfgPfUWcSwcPlHsf40BEqNR32A==
|
integrity sha512-+LO1XIVyTMmeoH26UHznpgrgX2npTVYccTkMpgk/EyiQjFt1FmoNm+w+/zMLuz9U3bpvT5sSUicMKEe/2JjgEA==
|
||||||
|
|
||||||
pull-window@^2.1.4:
|
pull-window@^2.1.4:
|
||||||
version "2.1.4"
|
version "2.1.4"
|
||||||
@@ -11701,9 +11727,9 @@ readable-stream@1.1.x, "readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@^1
|
|||||||
string_decoder "~0.10.x"
|
string_decoder "~0.10.x"
|
||||||
|
|
||||||
"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.1, readable-stream@^3.0.2, readable-stream@^3.0.5, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.2.0:
|
"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.1, readable-stream@^3.0.2, readable-stream@^3.0.5, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.2.0:
|
||||||
version "3.3.0"
|
version "3.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9"
|
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc"
|
||||||
integrity sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==
|
integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
inherits "^2.0.3"
|
inherits "^2.0.3"
|
||||||
string_decoder "^1.1.1"
|
string_decoder "^1.1.1"
|
||||||
@@ -11857,10 +11883,10 @@ regenerator-transform@^0.10.0:
|
|||||||
babel-types "^6.19.0"
|
babel-types "^6.19.0"
|
||||||
private "^0.1.6"
|
private "^0.1.6"
|
||||||
|
|
||||||
regenerator-transform@^0.13.4:
|
regenerator-transform@^0.14.0:
|
||||||
version "0.13.4"
|
version "0.14.0"
|
||||||
resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb"
|
resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf"
|
||||||
integrity sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==
|
integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w==
|
||||||
dependencies:
|
dependencies:
|
||||||
private "^0.1.6"
|
private "^0.1.6"
|
||||||
|
|
||||||
@@ -11879,10 +11905,10 @@ regex-not@^1.0.0, regex-not@^1.0.2:
|
|||||||
extend-shallow "^3.0.2"
|
extend-shallow "^3.0.2"
|
||||||
safe-regex "^1.1.0"
|
safe-regex "^1.1.0"
|
||||||
|
|
||||||
regexp-tree@^0.1.0:
|
regexp-tree@^0.1.6:
|
||||||
version "0.1.6"
|
version "0.1.10"
|
||||||
resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.6.tgz#84900fa12fdf428a2ac25f04300382a7c0148479"
|
resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc"
|
||||||
integrity sha512-LFrA98Dw/heXqDojz7qKFdygZmFoiVlvE1Zp7Cq2cvF+ZA+03Gmhy0k0PQlsC1jvHPiTUSs+pDHEuSWv6+6D7w==
|
integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ==
|
||||||
|
|
||||||
regexpp@^2.0.1:
|
regexpp@^2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
@@ -12121,7 +12147,7 @@ resolve@1.1.7:
|
|||||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
|
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
|
||||||
integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
|
integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
|
||||||
|
|
||||||
resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0:
|
resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0:
|
||||||
version "1.11.0"
|
version "1.11.0"
|
||||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232"
|
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232"
|
||||||
integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==
|
integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==
|
||||||
@@ -12291,10 +12317,10 @@ semver-greatest-satisfied-range@^1.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
|
||||||
integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==
|
integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==
|
||||||
|
|
||||||
semver@^6.0.0:
|
semver@^6.0.0, semver@^6.1.0:
|
||||||
version "6.0.0"
|
version "6.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b"
|
||||||
integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==
|
integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==
|
||||||
|
|
||||||
semver@~5.1.0:
|
semver@~5.1.0:
|
||||||
version "5.1.1"
|
version "5.1.1"
|
||||||
@@ -12782,9 +12808,9 @@ stream-shift@^1.0.0:
|
|||||||
integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=
|
integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=
|
||||||
|
|
||||||
stream-splicer@^2.0.0:
|
stream-splicer@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83"
|
resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd"
|
||||||
integrity sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=
|
integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==
|
||||||
dependencies:
|
dependencies:
|
||||||
inherits "^2.0.1"
|
inherits "^2.0.1"
|
||||||
readable-stream "^2.0.2"
|
readable-stream "^2.0.2"
|
||||||
@@ -13033,9 +13059,9 @@ syntax-error@^1.1.1:
|
|||||||
acorn-node "^1.2.0"
|
acorn-node "^1.2.0"
|
||||||
|
|
||||||
table@^5.2.3:
|
table@^5.2.3:
|
||||||
version "5.3.3"
|
version "5.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/table/-/table-5.3.3.tgz#eae560c90437331b74200e011487a33442bd28b4"
|
resolved "https://registry.yarnpkg.com/table/-/table-5.4.0.tgz#d772a3216e68829920a41a32c18eda286c95d780"
|
||||||
integrity sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw==
|
integrity sha512-nHFDrxmbrkU7JAFKqKbDJXfzrX2UBsWmrieXFTGxiI5e4ncg3VqsZeI4EzNmX0ncp4XNGVeoxIWJXfCIXwrsvw==
|
||||||
dependencies:
|
dependencies:
|
||||||
ajv "^6.9.1"
|
ajv "^6.9.1"
|
||||||
lodash "^4.17.11"
|
lodash "^4.17.11"
|
||||||
@@ -13086,17 +13112,17 @@ tar@^2.0.0:
|
|||||||
inherits "2"
|
inherits "2"
|
||||||
|
|
||||||
tar@^4:
|
tar@^4:
|
||||||
version "4.4.8"
|
version "4.4.9"
|
||||||
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d"
|
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.9.tgz#058fbb152f6fc45733e84585a40c39e59302e1b3"
|
||||||
integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==
|
integrity sha512-xisFa7Q2i3HOgfn+nmnWLGHD6Tm23hxjkx6wwGmgxkJFr6wxwXnJOdJYcZjL453PSdF0+bemO03+flAzkIdLBQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
chownr "^1.1.1"
|
chownr "^1.1.1"
|
||||||
fs-minipass "^1.2.5"
|
fs-minipass "^1.2.5"
|
||||||
minipass "^2.3.4"
|
minipass "^2.3.5"
|
||||||
minizlib "^1.1.1"
|
minizlib "^1.2.1"
|
||||||
mkdirp "^0.5.0"
|
mkdirp "^0.5.0"
|
||||||
safe-buffer "^5.1.2"
|
safe-buffer "^5.1.2"
|
||||||
yallist "^3.0.2"
|
yallist "^3.0.3"
|
||||||
|
|
||||||
test-exclude@^5.2.3:
|
test-exclude@^5.2.3:
|
||||||
version "5.2.3"
|
version "5.2.3"
|
||||||
@@ -13377,9 +13403,9 @@ tslint-eslint-rules@^5.3.1:
|
|||||||
tsutils "^3.0.0"
|
tsutils "^3.0.0"
|
||||||
|
|
||||||
tslint@^5.9.1:
|
tslint@^5.9.1:
|
||||||
version "5.16.0"
|
version "5.17.0"
|
||||||
resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.16.0.tgz#ae61f9c5a98d295b9a4f4553b1b1e831c1984d67"
|
resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.17.0.tgz#f9f0ce2011d8e90debaa6e9b4975f24cd16852b8"
|
||||||
integrity sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==
|
integrity sha512-pflx87WfVoYepTet3xLfDOLDm9Jqi61UXIKePOuca0qoAZyrGWonDG9VTbji58Fy+8gciUn8Bt7y69+KEVjc/w==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/code-frame" "^7.0.0"
|
"@babel/code-frame" "^7.0.0"
|
||||||
builtin-modules "^1.1.1"
|
builtin-modules "^1.1.1"
|
||||||
@@ -13387,7 +13413,7 @@ tslint@^5.9.1:
|
|||||||
commander "^2.12.1"
|
commander "^2.12.1"
|
||||||
diff "^3.2.0"
|
diff "^3.2.0"
|
||||||
glob "^7.1.1"
|
glob "^7.1.1"
|
||||||
js-yaml "^3.13.0"
|
js-yaml "^3.13.1"
|
||||||
minimatch "^3.0.4"
|
minimatch "^3.0.4"
|
||||||
mkdirp "^0.5.1"
|
mkdirp "^0.5.1"
|
||||||
resolve "^1.3.2"
|
resolve "^1.3.2"
|
||||||
@@ -13403,9 +13429,9 @@ tsutils@^2.29.0:
|
|||||||
tslib "^1.8.1"
|
tslib "^1.8.1"
|
||||||
|
|
||||||
tsutils@^3.0.0:
|
tsutils@^3.0.0:
|
||||||
version "3.10.0"
|
version "3.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.10.0.tgz#6f1c95c94606e098592b0dff06590cf9659227d6"
|
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.13.0.tgz#904ae58d0d81a1d5c16112da7bca059f9283b0e2"
|
||||||
integrity sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q==
|
integrity sha512-wRtEjVU8Su72sDIDoqno5Scwt8x4eaF0teKO3m4hu8K1QFPnIZMM88CLafs2tapUeWnY9SwwO3bWeOt2uauBcg==
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib "^1.8.1"
|
tslib "^1.8.1"
|
||||||
|
|
||||||
@@ -13457,9 +13483,9 @@ typedarray@^0.0.6:
|
|||||||
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
|
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
|
||||||
|
|
||||||
typescript@^3.1.6:
|
typescript@^3.1.6:
|
||||||
version "3.4.5"
|
version "3.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.5.tgz#2d2618d10bb566572b8d7aad5180d84257d70a99"
|
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.1.tgz#ba72a6a600b2158139c5dd8850f700e231464202"
|
||||||
integrity sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==
|
integrity sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw==
|
||||||
|
|
||||||
typewise-core@^1.2, typewise-core@^1.2.0:
|
typewise-core@^1.2, typewise-core@^1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
@@ -13502,9 +13528,9 @@ uglify-js@^2.6.1:
|
|||||||
uglify-to-browserify "~1.0.0"
|
uglify-to-browserify "~1.0.0"
|
||||||
|
|
||||||
uglify-js@^3.0.5, uglify-js@^3.1.4, uglify-js@^3.5.1:
|
uglify-js@^3.0.5, uglify-js@^3.1.4, uglify-js@^3.5.1:
|
||||||
version "3.5.13"
|
version "3.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.13.tgz#d2d8857b598d77f8764ae3bfcf90bb1df134d2bd"
|
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5"
|
||||||
integrity sha512-Lho+IJlquX6sdJgyKSJx/M9y4XbDd3ekPjD8S6HYmT5yVSwDtlSuca2w5hV4g2dIsp0Y/4orbfWxKexodmFv7w==
|
integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==
|
||||||
dependencies:
|
dependencies:
|
||||||
commander "~2.20.0"
|
commander "~2.20.0"
|
||||||
source-map "~0.6.1"
|
source-map "~0.6.1"
|
||||||
@@ -14228,7 +14254,7 @@ yallist@^2.1.2:
|
|||||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
|
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
|
||||||
integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
|
integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
|
||||||
|
|
||||||
yallist@^3.0.0, yallist@^3.0.2:
|
yallist@^3.0.0, yallist@^3.0.3:
|
||||||
version "3.0.3"
|
version "3.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
|
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
|
||||||
integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
|
integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
|
||||||
|
|||||||
Reference in New Issue
Block a user