mirror of
https://github.com/balena-os/balena-supervisor.git
synced 2024-12-22 06:57:49 +00:00
Auto-merge for PR #513 via VersionBot
If a device is already provisioned but the key exchange fails, retry …
This commit is contained in:
commit
15b9943f6d
@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file
|
|||||||
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
|
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
|
||||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
## v6.3.8 - 2017-10-30
|
||||||
|
|
||||||
|
* If a device is already provisioned but the key exchange fails, retry it until it succeeds #513 [Pablo Carranza Velez]
|
||||||
|
|
||||||
## v6.3.7 - 2017-10-25
|
## v6.3.7 - 2017-10-25
|
||||||
|
|
||||||
* Change the update retry to back off to the standard update check interval #515 [Pagan Gazzard]
|
* Change the update retry to back off to the standard update check interval #515 [Pagan Gazzard]
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "resin-supervisor",
|
"name": "resin-supervisor",
|
||||||
"description": "This is resin.io's Supervisor, a program that runs on IoT devices and has the task of running user Apps (which are Docker containers), and updating them as Resin's API informs it to.",
|
"description": "This is resin.io's Supervisor, a program that runs on IoT devices and has the task of running user Apps (which are Docker containers), and updating them as Resin's API informs it to.",
|
||||||
"version": "6.3.7",
|
"version": "6.3.8",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@ -179,6 +179,42 @@ hasDeviceApiKeySupport = (osVersion) ->
|
|||||||
console.error('Unable to determine if device has deviceApiKey support', err, err.stack)
|
console.error('Unable to determine if device has deviceApiKey support', err, err.stack)
|
||||||
false
|
false
|
||||||
|
|
||||||
|
exchangeKeyAndUpdateConfig = ->
|
||||||
|
# Only do a key exchange and delete the provisioning key if we're on a Resin OS version
|
||||||
|
# that supports using the deviceApiKey (2.0.2 and above)
|
||||||
|
# or if we're in a non-Resin OS (which is assumed to be updated enough).
|
||||||
|
# Otherwise VPN and other host services that use an API key will break.
|
||||||
|
#
|
||||||
|
# In other cases, we make the apiKey equal the deviceApiKey instead.
|
||||||
|
osRelease.getOSVersion(config.hostOSVersionPath)
|
||||||
|
.then (osVersion) ->
|
||||||
|
hasSupport = hasDeviceApiKeySupport(osVersion)
|
||||||
|
if hasSupport or userConfig.apiKey != userConfig.deviceApiKey
|
||||||
|
console.log('Attempting key exchange')
|
||||||
|
exchangeKey()
|
||||||
|
.then ->
|
||||||
|
console.log('Key exchange succeeded, starting to use deviceApiKey')
|
||||||
|
if hasSupport
|
||||||
|
delete userConfig.apiKey
|
||||||
|
else
|
||||||
|
userConfig.apiKey = userConfig.deviceApiKey
|
||||||
|
utils.setConfig('deviceApiKey', userConfig.deviceApiKey)
|
||||||
|
.then ->
|
||||||
|
utils.setConfig('apiKey', userConfig.deviceApiKey)
|
||||||
|
.then ->
|
||||||
|
writeAndSyncFile(configPath, JSON.stringify(userConfig))
|
||||||
|
|
||||||
|
exchangeKeyOrRetry = do ->
|
||||||
|
_failedExchanges = 0
|
||||||
|
return ->
|
||||||
|
exchangeKeyAndUpdateConfig()
|
||||||
|
.catch (err) ->
|
||||||
|
console.error('Error exchanging API key, will retry', err, err.stack)
|
||||||
|
delay = Math.min((2 ** _failedExchanges) * config.bootstrapRetryDelay, 24 * 60 * 60 * 1000)
|
||||||
|
_failedExchanges += 1
|
||||||
|
setTimeout(exchangeKeyOrRetry, delay)
|
||||||
|
return
|
||||||
|
|
||||||
bootstrapper.done = new Promise (resolve) ->
|
bootstrapper.done = new Promise (resolve) ->
|
||||||
bootstrapper.doneBootstrapping = ->
|
bootstrapper.doneBootstrapping = ->
|
||||||
bootstrapper.bootstrapped = true
|
bootstrapper.bootstrapped = true
|
||||||
@ -186,31 +222,8 @@ bootstrapper.done = new Promise (resolve) ->
|
|||||||
# If we're still using an old api key we can try to exchange it for a valid device key
|
# If we're still using an old api key we can try to exchange it for a valid device key
|
||||||
# This will only be the case when the supervisor/OS has been updated.
|
# This will only be the case when the supervisor/OS has been updated.
|
||||||
if userConfig.apiKey?
|
if userConfig.apiKey?
|
||||||
# Only do a key exchange and delete the provisioning key if we're on a Resin OS version
|
exchangeKeyOrRetry()
|
||||||
# that supports using the deviceApiKey (2.0.2 and above)
|
return
|
||||||
# or if we're in a non-Resin OS (which is assumed to be updated enough).
|
|
||||||
# Otherwise VPN and other host services that use an API key will break.
|
|
||||||
#
|
|
||||||
# In other cases, we make the apiKey equal the deviceApiKey instead.
|
|
||||||
osRelease.getOSVersion(config.hostOSVersionPath)
|
|
||||||
.then (osVersion) ->
|
|
||||||
hasSupport = hasDeviceApiKeySupport(osVersion)
|
|
||||||
if hasSupport or userConfig.apiKey != userConfig.deviceApiKey
|
|
||||||
console.log('Attempting key exchange')
|
|
||||||
exchangeKey()
|
|
||||||
.then ->
|
|
||||||
console.log('Key exchange succeeded, starting to use deviceApiKey')
|
|
||||||
if hasSupport
|
|
||||||
delete userConfig.apiKey
|
|
||||||
else
|
|
||||||
userConfig.apiKey = userConfig.deviceApiKey
|
|
||||||
utils.setConfig('deviceApiKey', userConfig.deviceApiKey)
|
|
||||||
.then ->
|
|
||||||
utils.setConfig('apiKey', userConfig.deviceApiKey)
|
|
||||||
.then ->
|
|
||||||
writeAndSyncFile(configPath, JSON.stringify(userConfig))
|
|
||||||
# We return immediately, and eventually the API key will be exchanged and replaced.
|
|
||||||
return
|
|
||||||
|
|
||||||
bootstrapper.bootstrapped = false
|
bootstrapper.bootstrapped = false
|
||||||
bootstrapper.startBootstrapping = ->
|
bootstrapper.startBootstrapping = ->
|
||||||
|
Loading…
Reference in New Issue
Block a user