Fixed
- One stuck device no longer stops the whole upgrade queue. If a device stopped responding part-way through an upgrade, the queue waited on it forever: the progress bar froze, the devices behind it never ran, and no new queue could be started until the container was restarted. Every command in an upgrade now has a time limit, so a device that goes quiet is marked failed and the queue carries on with the next one.
- An upgrade that times out is now reported as failed rather than assumed to have worked. Previously a silent device was treated the same as one that had rebooted into the new version.
- A queue that stalls anyway is released automatically instead of blocking every later queue.