| 141 | return True |
| 142 | |
| 143 | class SoftwareUpdater(threading.Thread): |
| 144 | updatePhaseProgressInfo = { |
| 145 | "download": (0.0, 0.25, "Downloading package..."), |
| 146 | "sources_update": (0.26, 0.4, "Updating dependency list..."), |
| 147 | "deps_download": (0.41, 0.6, "Downloading dependencies..."), |
| 148 | "deps_install": (0.61, 0.75, "Installing dependencies..."), |
| 149 | "release_install": (0.76, 0.85, "Upgrading package..."), |
| 150 | "release_configure": (0.86, 0.96, "Configuring Package..."), |
| 151 | "release_finalize": (0.96, 1.0, "Finalizing package...") |
| 152 | } |
| 153 | |
| 154 | def __init__(self, manager, versionData, progressCb, completionCb): |
| 155 | super(SoftwareUpdater, self).__init__() |
| 156 | self.vData = versionData |
| 157 | self._manager = manager |
| 158 | self._progressCb = progressCb |
| 159 | self._completionCb = completionCb |
| 160 | self._logger = logging.getLogger(__name__) |
| 161 | self._currentPackage = 0 |
| 162 | self._pkgCount = len(versionData) |
| 163 | self._pkgPrgSpread = 1.0 / self._pkgCount |
| 164 | self._lastPkgPrgEnd = 0 |
| 165 | self._cache = None |
| 166 | self._stop = False |
| 167 | |
| 168 | def stop(self): |
| 169 | self._stop = True |
| 170 | |
| 171 | def run(self): |
| 172 | #We need to give the UI a chance to update before starting so that the message can be sent... |
| 173 | self._progressCb("download", 0.0, "Starting...") |
| 174 | #disconnect from the cloud during software upgrade. The reboot will take care of reconnect |
| 175 | boxrouterManager().boxrouter_disconnect() |
| 176 | |
| 177 | time.sleep(2) |
| 178 | self._installNextPackage() |
| 179 | |
| 180 | def _installNextPackage(self): |
| 181 | if not self._stop: |
| 182 | self._installPackage(self.vData[self._currentPackage]) |
| 183 | |
| 184 | def _installPackage(self, relData): |
| 185 | r = requests.get(relData['download_url'], stream=True, headers = self._manager._requestHeaders) |
| 186 | |
| 187 | if r.status_code == 200: |
| 188 | releaseHandle, releasePath = mkstemp() |
| 189 | |
| 190 | content_length = float(r.headers['Content-Length']) |
| 191 | downloaded_size = 0.0 |
| 192 | |
| 193 | self._logger.info('Downloading release.') |
| 194 | with os.fdopen(releaseHandle, "wb") as fd: |
| 195 | for chunk in r.iter_content(150000): |
| 196 | downloaded_size += len(chunk) |
| 197 | fd.write(chunk) |
| 198 | self._onProgress("download", round((downloaded_size / content_length), 2)) |
| 199 | |
| 200 | self._logger.info('Release downloaded.') |