async def snapshot(self, request: Request) -> Any: custom_name = request.query.get("custom_name", None) retain_drive = BoolValidator.strToBool( request.query.get("retain_drive", False)) retain_ha = BoolValidator.strToBool( request.query.get("retain_ha", False)) options = CreateOptions(self._time.now(), custom_name, { SOURCE_GOOGLE_DRIVE: retain_drive, SOURCE_HA: retain_ha }) snapshot = await self._coord.startSnapshot(options) return web.json_response({"message": "Requested snapshot '{0}'".format(snapshot.name())})
async def deleteSnapshot(self, request: Request): drive = BoolValidator.strToBool(request.query.get("drive", False)) ha = BoolValidator.strToBool(request.query.get("ha", False)) slug = request.query.get("slug", "") self._coord.getSnapshot(slug) sources = [] messages = [] if drive: messages.append("Google Drive") sources.append(SOURCE_GOOGLE_DRIVE) if ha: messages.append("Home Assistant") sources.append(SOURCE_HA) await self._coord.delete(sources, slug) return web.json_response({"message": "Deleted from " + " and ".join(messages)})
async def exposeserver(self, request: Request): expose = BoolValidator.strToBool(request.query.get("expose", False)) if expose: update = {Setting.EXPOSE_EXTRA_SERVER: True} else: update = { Setting.EXPOSE_EXTRA_SERVER: False, Setting.USE_SSL: False, Setting.REQUIRE_LOGIN: False } validated = self.config.validateUpdate(update) await self._updateConfiguration(validated) File.touch(self.config.get(Setting.INGRESS_TOKEN_FILE_PATH)) await self._ha_source.init() redirect = "" try: if request.url.port != self.config.get(Setting.INGRESS_PORT): redirect = self._ha_source.getFullAddonUrl() except: # noqa: E722 # eat the error pass return web.json_response({ 'message': 'Configuration updated', 'redirect': redirect })
async def errorreports(self, request: Request): send = BoolValidator.strToBool(request.query.get("send", False)) update = {"send_error_reports": send} validated = self.config.validateUpdate(update) await self._updateConfiguration(validated) return web.json_response({'message': 'Configuration updated'})
async def log(self, request: Request) -> Any: format = request.query.get("format", "download") catchup = BoolValidator.strToBool(request.query.get( "catchup", "False")) if not catchup: self.last_log_index = 0 if format == "view": context = {} return aiohttp_jinja2.render_template("logs.jinja2", request, context) resp = web.StreamResponse() if format == "html": resp.content_type = 'text/html' else: resp.content_type = 'text/plain' resp.headers[ 'Content-Disposition'] = 'attachment; filename="home-assistant-google-drive-backup.log"' await resp.prepare(request) def content(): html = format == "colored" if format == "html": yield "<html><head><title>Home Assistant Google Drive Backup Log</title></head><body><pre>\n" for line in getHistory(self.last_log_index, html): self.last_log_index = line[0] if line: yield line[1].replace("\n", " \n") + "\n" if format == "html": yield "</pre></body>\n" for line in content(): await resp.write(line.encode()) await resp.write_eof()
async def resolvefolder(self, request: Request): use_existing = BoolValidator.strToBool( request.query.get("use_existing", False)) self.folder_finder.resolveExisting(use_existing) self._global_info.suppressError() self._global_info.setIngoreErrorsForNow(True) await self.sync() return web.json_response({'message': 'Done'})
async def callbackupsnapshot(self, request: Request): switch = BoolValidator.strToBool(request.query.get("switch", False)) if switch: validated = self.config.validateUpdate({Setting.CALL_BACKUP_SNAPSHOT: False}) await self._updateConfiguration(validated) self._data_cache.addFlag(UpgradeFlags.NOTIFIED_ABOUT_BACKUP_RENAME) self._data_cache.addFlag(UpgradeFlags.NOTIFIED_ABOUT_BACKUP_RENAME) self._data_cache.saveIfDirty() return web.json_response({'message': 'Configuration updated'})
async def confirmdelete(self, request: Request): always = BoolValidator.strToBool(request.query.get("always", False)) self._global_info.allowMultipleDeletes() self._global_info.setIngoreErrorsForNow(True) if always: validated = self.config.validateUpdate( {"confirm_multiple_deletes": False}) await self._updateConfiguration(validated) await self.sync() return web.json_response({'message': 'Configuration updated, I\'ll never ask again'}) else: await self.sync() return web.json_response({'message': 'Snapshots deleted this one time'})
async def retain(self, request: Request): drive = BoolValidator.strToBool(request.query.get("drive", False)) ha = BoolValidator.strToBool(request.query.get("ha", False)) slug = request.query.get("slug", "") snapshot: Snapshot = self._coord.getSnapshot(slug) # override create options for future uploads options = CreateOptions(self._time.now(), self.config.get(Setting.SNAPSHOT_NAME), { SOURCE_GOOGLE_DRIVE: BoolValidator.strToBool(drive), SOURCE_HA: BoolValidator.strToBool(ha) }) snapshot.setOptions(options) retention = {} if snapshot.getSource(SOURCE_GOOGLE_DRIVE) is not None: retention[SOURCE_GOOGLE_DRIVE] = BoolValidator.strToBool(drive) if snapshot.getSource(SOURCE_HA) is not None: retention[SOURCE_HA] = BoolValidator.strToBool(ha) await self._coord.retain(retention, slug) return web.json_response({'message': "Updated the snapshot's settings"})