예제 #1
0
 def acquire_lock(cls, mode, user=None):
     with cls._lock.acquire(mode):
         yield
         # execute hook
         hook = cls.configuration.get("storage", "hook")
         if mode == "w" and hook:
             folder = os.path.expanduser(
                 cls.configuration.get("storage", "filesystem_folder"))
             logger.debug("Running hook")
             debug = logger.isEnabledFor(logging.DEBUG)
             p = subprocess.Popen(
                 hook % {"user": shlex.quote(user or "Anonymous")},
                 stdin=subprocess.DEVNULL,
                 stdout=subprocess.PIPE if debug else subprocess.DEVNULL,
                 stderr=subprocess.PIPE if debug else subprocess.DEVNULL,
                 shell=True,
                 universal_newlines=True,
                 cwd=folder)
             stdout_data, stderr_data = p.communicate()
             if stdout_data:
                 logger.debug("Captured stdout hook:\n%s", stdout_data)
             if stderr_data:
                 logger.debug("Captured stderr hook:\n%s", stderr_data)
             if p.returncode != 0:
                 raise subprocess.CalledProcessError(p.returncode, p.args)
예제 #2
0
 def write_xml_content(self, xml_content):
     if logger.isEnabledFor(logging.DEBUG):
         logger.debug("Response content:\n%s",
                      xmlutils.pretty_xml(xml_content))
     f = io.BytesIO()
     ET.ElementTree(xml_content).write(f, encoding=self.encoding,
                                       xml_declaration=True)
     return f.getvalue()
예제 #3
0
파일: __init__.py 프로젝트: Kozea/Radicale
 def write_xml_content(self, xml_content):
     if logger.isEnabledFor(logging.DEBUG):
         logger.debug("Response content:\n%s",
                      xmlutils.pretty_xml(xml_content))
     f = io.BytesIO()
     ET.ElementTree(xml_content).write(f, encoding=self.encoding,
                                       xml_declaration=True)
     return f.getvalue()
예제 #4
0
파일: lock.py 프로젝트: forksnd/Radicale
 def acquire_lock(self, mode, user=None):
     with self._lock.acquire(mode) as lock_file:
         yield
         # execute hook
         hook = self.configuration.get("storage", "hook")
         if mode == "w" and hook:
             folder = self.configuration.get("storage", "filesystem_folder")
             debug = logger.isEnabledFor(logging.DEBUG)
             popen_kwargs = dict(
                 stdin=subprocess.DEVNULL,
                 stdout=subprocess.PIPE if debug else subprocess.DEVNULL,
                 stderr=subprocess.PIPE if debug else subprocess.DEVNULL,
                 shell=True,
                 universal_newlines=True,
                 cwd=folder)
             if os.name == "posix":
                 # Pass the lock_file to the subprocess to ensure the lock
                 # doesn't get released if this process is killed but the
                 # child process lives on
                 popen_kwargs["pass_fds"] = [lock_file.fileno()]
             # Use new process group for child to prevent terminals
             # from sending SIGINT etc. to it.
             if os.name == "posix":
                 # Process group is also used to identify child processes
                 popen_kwargs["preexec_fn"] = os.setpgrp
             elif os.name == "nt":
                 popen_kwargs["creationflags"] = (
                     subprocess.CREATE_NEW_PROCESS_GROUP)
             command = hook % {"user": shlex.quote(user or "Anonymous")}
             logger.debug("Running hook")
             p = subprocess.Popen(command, **popen_kwargs)
             try:
                 stdout_data, stderr_data = p.communicate()
             except BaseException:
                 # Terminate the process on error (e.g. KeyboardInterrupt)
                 p.terminate()
                 p.wait()
                 raise
             finally:
                 if os.name == "posix":
                     # Try to kill remaning children of process, identified
                     # by process group
                     try:
                         os.killpg(p.pid, signal.SIGKILL)
                     except ProcessLookupError:
                         pass  # No remaning processes found
                     else:
                         logger.warning(
                             "Killed remaining child processes of hook")
             if stdout_data:
                 logger.debug("Captured stdout hook:\n%s", stdout_data)
             if stderr_data:
                 logger.debug("Captured stderr hook:\n%s", stderr_data)
             if p.returncode != 0:
                 raise subprocess.CalledProcessError(p.returncode, p.args)
예제 #5
0
 def read_xml_content(self, environ):
     content = self.decode(self.read_raw_content(environ), environ)
     if not content:
         return None
     try:
         xml_content = ET.fromstring(content)
     except ET.ParseError as e:
         logger.debug("Request content (Invalid XML):\n%s", content)
         raise RuntimeError("Failed to parse XML: %s" % e) from e
     if logger.isEnabledFor(logging.DEBUG):
         logger.debug("Request content:\n%s",
                      xmlutils.pretty_xml(xml_content))
     return xml_content
예제 #6
0
파일: __init__.py 프로젝트: Kozea/Radicale
 def read_xml_content(self, environ):
     content = self.decode(self.read_raw_content(environ), environ)
     if not content:
         return None
     try:
         xml_content = ET.fromstring(content)
     except ET.ParseError as e:
         logger.debug("Request content (Invalid XML):\n%s", content)
         raise RuntimeError("Failed to parse XML: %s" % e) from e
     if logger.isEnabledFor(logging.DEBUG):
         logger.debug("Request content:\n%s",
                      xmlutils.pretty_xml(xml_content))
     return xml_content
예제 #7
0
 def _read_xml_request_body(self, environ):
     content = httputils.decode_request(
         self.configuration, environ,
         httputils.read_raw_request_body(self.configuration, environ))
     if not content:
         return None
     try:
         xml_content = DefusedET.fromstring(content)
     except ET.ParseError as e:
         logger.debug("Request content (Invalid XML):\n%s", content)
         raise RuntimeError("Failed to parse XML: %s" % e) from e
     if logger.isEnabledFor(logging.DEBUG):
         logger.debug("Request content:\n%s",
                      xmlutils.pretty_xml(xml_content))
     return xml_content
예제 #8
0
 def acquire_lock(self, mode, user=None):
     with self._lock.acquire(mode):
         yield
         # execute hook
         hook = self.configuration.get("storage", "hook")
         if mode == "w" and hook:
             folder = self.configuration.get("storage", "filesystem_folder")
             debug = logger.isEnabledFor(logging.DEBUG)
             popen_kwargs = dict(
                 stdin=subprocess.DEVNULL,
                 stdout=subprocess.PIPE if debug else subprocess.DEVNULL,
                 stderr=subprocess.PIPE if debug else subprocess.DEVNULL,
                 shell=True,
                 universal_newlines=True,
                 cwd=folder)
             # Use new process group for child to prevent terminals
             # from sending SIGINT etc.
             if os.name == "posix":
                 # Process group is also used to identify child processes
                 popen_kwargs["preexec_fn"] = os.setpgrp
             elif os.name == "nt":
                 popen_kwargs["creationflags"] = (
                     subprocess.CREATE_NEW_PROCESS_GROUP)
             command = hook % {"user": shlex.quote(user or "Anonymous")}
             logger.debug("Running storage hook")
             p = subprocess.Popen(command, **popen_kwargs)
             try:
                 stdout_data, stderr_data = p.communicate()
             except BaseException:  # e.g. KeyboardInterrupt or SystemExit
                 p.kill()
                 p.wait()
                 raise
             finally:
                 if os.name == "posix":
                     # Kill remaining children identified by process group
                     with contextlib.suppress(OSError):
                         os.killpg(p.pid, signal.SIGKILL)
             if stdout_data:
                 logger.debug("Captured stdout from hook:\n%s", stdout_data)
             if stderr_data:
                 logger.debug("Captured stderr from hook:\n%s", stderr_data)
             if p.returncode != 0:
                 raise subprocess.CalledProcessError(p.returncode, p.args)
예제 #9
0
파일: lock.py 프로젝트: Kozea/Radicale
 def acquire_lock(cls, mode, user=None):
     with cls._lock.acquire(mode):
         yield
         # execute hook
         hook = cls.configuration.get("storage", "hook")
         if mode == "w" and hook:
             folder = os.path.expanduser(cls.configuration.get(
                 "storage", "filesystem_folder"))
             logger.debug("Running hook")
             debug = logger.isEnabledFor(logging.DEBUG)
             p = subprocess.Popen(
                 hook % {"user": shlex.quote(user or "Anonymous")},
                 stdin=subprocess.DEVNULL,
                 stdout=subprocess.PIPE if debug else subprocess.DEVNULL,
                 stderr=subprocess.PIPE if debug else subprocess.DEVNULL,
                 shell=True, universal_newlines=True, cwd=folder)
             stdout_data, stderr_data = p.communicate()
             if stdout_data:
                 logger.debug("Captured stdout hook:\n%s", stdout_data)
             if stderr_data:
                 logger.debug("Captured stderr hook:\n%s", stderr_data)
             if p.returncode != 0:
                 raise subprocess.CalledProcessError(p.returncode, p.args)