Esempio n. 1
0
 async def _handle_item_request(self,
                                web_request: WebRequest) -> Dict[str, Any]:
     action = web_request.get_action()
     namespace = web_request.get_str("namespace")
     if namespace in self.forbidden_namespaces:
         raise self.server.error(
             f"Read/Write access to namespace '{namespace}'"
             " is forbidden", 403)
     key: Any
     valid_types: Tuple[type, ...]
     if action != "GET":
         if namespace in self.protected_namespaces:
             raise self.server.error(
                 f"Write access to namespace '{namespace}'"
                 " is forbidden", 403)
         key = web_request.get("key")
         valid_types = (list, str)
     else:
         key = web_request.get("key", None)
         valid_types = (list, str, type(None))
     if not isinstance(key, valid_types):
         raise self.server.error(
             "Value for argument 'key' is an invalid type: "
             f"{type(key).__name__}")
     if action == "GET":
         val = await self.get_item(namespace, key)
     elif action == "POST":
         val = web_request.get("value")
         await self.insert_item(namespace, key, val)
     elif action == "DELETE":
         val = await self.delete_item(namespace, key, drop_empty_db=True)
     return {'namespace': namespace, 'key': key, 'value': val}
Esempio n. 2
0
    async def _handle_job_request(self,
                                  web_request: WebRequest
                                  ) -> Dict[str, Any]:
        action = web_request.get_action()
        if action == "GET":
            job_id = web_request.get_str("uid")
            if job_id not in self.cached_job_ids:
                raise self.server.error(f"Invalid job uid: {job_id}", 404)
            job = self.history_ns[job_id]
            return {"job": self._prep_requested_job(job, job_id)}
        if action == "DELETE":
            all = web_request.get_boolean("all", False)
            if all:
                deljobs = self.cached_job_ids
                self.history_ns.clear()
                self.cached_job_ids = []
                self.next_job_id = 0
                return {'deleted_jobs': deljobs}

            job_id = web_request.get_str("uid")
            if job_id not in self.cached_job_ids:
                raise self.server.error(f"Invalid job uid: {job_id}", 404)

            self.delete_job(job_id)
            return {'deleted_jobs': [job_id]}
        raise self.server.error("Invalid Request Method")
Esempio n. 3
0
 async def _handle_apikey_request(self, web_request: WebRequest) -> str:
     action = web_request.get_action()
     if action.upper() == 'POST':
         self.api_key = uuid.uuid4().hex
         self.users[API_USER]['api_key'] = self.api_key
         self._sync_user(API_USER)
     return self.api_key
Esempio n. 4
0
 async def _handle_job_request(self,
                               web_request: WebRequest) -> Dict[str, Any]:
     action = web_request.get_action()
     if action == "POST":
         files: Union[List[str], str] = web_request.get('filenames')
         if isinstance(files, str):
             files = [f.strip() for f in files.split(',') if f.strip()]
         # Validate that all files exist before queueing
         await self.queue_job(files)
     elif action == "DELETE":
         if web_request.get_boolean("all", False):
             await self.delete_job([], all=True)
         else:
             job_ids: Union[List[str], str] = web_request.get('job_ids')
             if isinstance(job_ids, str):
                 job_ids = [
                     f.strip() for f in job_ids.split(',') if f.strip()
                 ]
             await self.delete_job(job_ids)
     else:
         raise self.server.error(f"Invalid action: {action}")
     return {
         'queued_jobs': self._job_map_to_list(),
         'queue_state': self.queue_state
     }
Esempio n. 5
0
 async def _handle_webcam_request(
         self, web_request: WebRequest) -> Dict[str, Any]:
     action = web_request.get_action()
     name = web_request.get_str("name")
     webcam_data: Dict[str, Any] = {}
     if action == "GET":
         if name not in self.webcams:
             raise self.server.error(f"Webcam {name} not found", 404)
         webcam_data = self.webcams[name].as_dict()
     elif action == "POST":
         if (name in self.webcams
                 and self.webcams[name].source == "config"):
             raise self.server.error(
                 f"Cannot overwrite webcam '{name}' sourced from "
                 "Moonraker configuration")
         webcam = WebCam.from_web_request(self.server, web_request)
         self.webcams[name] = webcam
         webcam_data = webcam.as_dict()
         await self._save_cam(webcam)
     elif action == "DELETE":
         if name not in self.webcams:
             raise self.server.error(f"Webcam {name} not found", 404)
         elif self.webcams[name].source == "config":
             raise self.server.error(
                 f"Cannot delete webcam '{name}' sourced from "
                 "Moonraker configuration")
         webcam = self.webcams.pop(name)
         webcam_data = webcam.as_dict()
         await self._delete_cam(webcam)
     if action != "GET":
         self.server.send_event("webcam:webcams_changed",
                                {"webcams": self._list_webcams()})
     return {"webcam": webcam_data}
Esempio n. 6
0
 async def _handle_single_power_request(
         self, web_request: WebRequest) -> Dict[str, Any]:
     dev_name: str = web_request.get_str('device')
     req_action = web_request.get_action()
     if dev_name not in self.devices:
         raise self.server.error(f"No valid device named {dev_name}")
     dev = self.devices[dev_name]
     if req_action == 'GET':
         action = "status"
     elif req_action == "POST":
         action = web_request.get_str('action').lower()
         if action not in ["on", "off", "toggle"]:
             raise self.server.error(f"Invalid requested action '{action}'")
     result = await self._process_request(dev, action)
     return {dev_name: result}
Esempio n. 7
0
 async def _handle_feed_request(
     self, web_request: WebRequest
 ) -> Dict[str, Any]:
     action = web_request.get_action()
     name: str = web_request.get("name")
     name = name.lower()
     changed: bool = False
     db: MoonrakerDatabase = self.server.lookup_component("database")
     result = "skipped"
     if action == "POST":
         if name not in self.subscriptions:
             feed = RssFeed(name, self.entry_mgr, self.dev_mode)
             self.subscriptions[name] = feed
             await feed.initialize()
             changed = await feed.update_entries()
             self.stored_feeds.append(name)
             db.insert_item(
                 "moonraker", "announcements.stored_feeds", self.stored_feeds
             )
             result = "added"
     elif action == "DELETE":
         if name not in self.stored_feeds:
             raise self.server.error(f"Feed '{name}' not stored")
         if name in self.configured_feeds:
             raise self.server.error(
                 f"Feed '{name}' exists in the configuration, cannot remove"
             )
         self.stored_feeds.remove(name)
         db.insert_item(
             "moonraker", "announcements.stored_feeds", self.stored_feeds
         )
         if name in self.subscriptions:
             del self.subscriptions[name]
             changed = await self.entry_mgr.prune_by_feed(name)
             logging.info(f"Removed Announcement Feed: {name}")
             result = "removed"
         else:
             raise self.server.error(f"Feed does not exist: {name}")
     if changed:
         entries = await self.entry_mgr.list_entries()
         self.eventloop.delay_callback(
             .05, self.server.send_event, "announcements:entries_updated",
             {"entries": entries}
         )
     return {
         "feed": name,
         "action": result
     }
Esempio n. 8
0
    async def _handle_single_wled_request(
            self: WLED, web_request: WebRequest) -> Dict[str, Any]:
        strip_name: str = web_request.get_str('strip')
        preset: int = web_request.get_int('preset', -1)

        req_action = web_request.get_action()
        if strip_name not in self.strips:
            raise self.server.error(f"No valid strip named {strip_name}")
        strip = self.strips[strip_name]
        if req_action == 'GET':
            return {strip_name: strip.get_strip_info()}
        elif req_action == "POST":
            action = web_request.get_str('action').lower()
            if action not in ["on", "off", "toggle"]:
                raise self.server.error(f"Invalid requested action '{action}'")
            result = await self._process_request(strip, action, preset)
        return {strip_name: result}
Esempio n. 9
0
 async def _handle_user_request(self,
                                web_request: WebRequest) -> Dict[str, Any]:
     action = web_request.get_action()
     if action == "GET":
         user = web_request.get_current_user()
         if user is None:
             return {
                 'username': None,
                 'created_on': None,
             }
         else:
             return {
                 'username': user['username'],
                 'created_on': user.get('created_on')
             }
     elif action == "POST":
         # Create User
         return self._login_jwt_user(web_request, create=True)
     elif action == "DELETE":
         # Delete User
         return self._delete_jwt_user(web_request)
     raise self.server.error("Invalid Request Method")