def __call__(self): if None in self.interface_mapping: brains = api.content.find(object_provides=['opengever.dossier.interfaces.IDossierJournalPdfMarker', 'opengever.dossier.interfaces.IDossierTasksPdfMarker']) if len(brains) > 0: error = "Trying to execute upgrade step AddAutomaticallyGeneratedDocumentInterface\n" error += "after 'opengever.dossier.interfaces.IDossierJournalPdfMarker' and\n" error += "'opengever.dossier.interfaces.IDossierTasksPdfMarker' have already\n" error += "been removed from code. There are {} objects\n".format(len(brains)) error += "left displaying one of these interfaces." log_msg_to_sentry(error) LOG.warning("Sent message to sentry:") LOG.warning(error) return for old_interface, new_interface in self.interface_mapping.items(): query = {'object_provides': [old_interface.__identifier__]} message = 'Map {} to {}'.format(old_interface.__identifier__, new_interface.__identifier__) for obj in self.objects(query, message): alsoProvides(obj, new_interface) noLongerProvides(obj, old_interface) obj.reindexObject(idxs=['object_provides'])
def acquire(self, commit=False): """Acquire a resolve lock for a dossier. Will overwrite a possibly existing expired lock. """ self.log("Acquiring resolve lock for %s..." % self.context) if self.txn_is_dirty(): # Acquiring and committing the lock should always be the first # thing that's being done when resolving the dossier, otherwise # we would be committing unrelated, unexpected changes. # # Detect if that happens, but still proceed and log to sentry. msg = 'Dirty transaction when comitting resolve lock' self.log(msg) self.log('Registered objects: %r' % self._registered_objects()) log_msg_to_sentry( msg, level='warning', extra={'registered_objects': repr(self._registered_objects())}) ann = IAnnotations(self.context) lockinfo = PersistentMapping({ 'timestamp': datetime.now(), 'userid': api.user.get_current().id, }) ann[RESOLVE_LOCK_KEY] = lockinfo self.invalidate_cache() if commit: transaction.commit() self.log("Resolve lock acquired.")
def __call__(self): if None in self.interface_mapping: brains = api.content.find(object_provides=[ 'opengever.dossier.interfaces.IDossierJournalPdfMarker', 'opengever.dossier.interfaces.IDossierTasksPdfMarker' ]) if len(brains) > 0: error = "Trying to execute upgrade step AddAutomaticallyGeneratedDocumentInterface\n" error += "after 'opengever.dossier.interfaces.IDossierJournalPdfMarker' and\n" error += "'opengever.dossier.interfaces.IDossierTasksPdfMarker' have already\n" error += "been removed from code. There are {} objects\n".format( len(brains)) error += "left displaying one of these interfaces." log_msg_to_sentry(error) LOG.warning("Sent message to sentry:") LOG.warning(error) return for old_interface, new_interface in self.interface_mapping.items(): query = {'object_provides': [old_interface.__identifier__]} message = 'Map {} to {}'.format(old_interface.__identifier__, new_interface.__identifier__) for obj in self.objects(query, message): alsoProvides(obj, new_interface) noLongerProvides(obj, old_interface) obj.reindexObject(idxs=['object_provides'])
def acquire(self, commit=False): """Acquire a resolve lock for a dossier. Will overwrite a possibly existing expired lock. """ self.log("Acquiring resolve lock for %s..." % self.context) if self.txn_is_dirty(): # Acquiring and committing the lock should always be the first # thing that's being done when resolving the dossier, otherwise # we would be committing unrelated, unexpected changes. # # Detect if that happens, but still proceed and log to sentry. msg = 'Dirty transaction when comitting resolve lock' self.log(msg) self.log('Registered objects: %r' % self._registered_objects()) log_msg_to_sentry(msg, level='warning', extra={ 'registered_objects': repr(self._registered_objects())} ) ann = IAnnotations(self.context) lockinfo = PersistentMapping({ 'timestamp': datetime.now(), 'userid': api.user.get_current().id, }) ann[RESOLVE_LOCK_KEY] = lockinfo self.invalidate_cache() if commit: transaction.commit() self.log("Resolve lock acquired.")
def _log_unexpected_conversion_to_sentry(converted, markup): request = getRequest() extra = {'converted_html': converted, 'source_html': markup} log_msg_to_sentry('Unexpected html during trix/sablon conversion', request=request, url=request.get('ACTUAL_URL', ''), extra=extra, string_max_length=SERVER_SIDE_STRING_MAX_LENGTH)
def _log_unexpected_conversion_to_sentry(converted, markup): request = getRequest() extra = { 'converted_html': converted, 'source_html': markup } log_msg_to_sentry( 'Unexpected html during trix/sablon conversion', request=request, url=request.get('ACTUAL_URL', ''), extra=extra, string_max_length=SERVER_SIDE_STRING_MAX_LENGTH)
def _update_docproperties(document, raise_on_error=False): try: DocPropertyWriter(document).update() except Exception as exc: if not raise_on_error: path = '/'.join(document.getPhysicalPath()) logger.warn('Failed to update DocProperties for %r' % path) logger.warn('\n%s' % format_exc(exc)) logger.warn('Updating of DocProperties has therefore been skipped') log_msg_to_sentry( 'DocProperties update skipped', level='warning', extra={'document_that_failed': repr(document)}) return raise
def _update_docproperties(document, raise_on_error=False): try: DocPropertyWriter(document).update() except Exception as exc: if not raise_on_error: path = '/'.join(document.getPhysicalPath()) logger.warn('Failed to update DocProperties for %r' % path) logger.warn('\n%s' % format_exc(exc)) logger.warn('Updating of DocProperties has therefore been skipped') log_msg_to_sentry('DocProperties update skipped', level='warning', extra={'document_that_failed': repr(document)}) return raise
def transform(self, value): # Create a temporary directory for 'msgconvert' to work in. It dumps # the resulting .eml file to its working directory, and doesn't take # an commandline option to actually specify the output path, so we # have it do its work in a tempdir and predict the output filename. tempdir = tempfile.mkdtemp() # Create a temporary msg file in the tempdir we just created msg_path = os.path.join(tempdir, 'mail.msg') with open(msg_path, 'wb') as msg_file: msg_file.write(value) msgconvert_path = spawn.find_executable("msgconvert") if msgconvert_path is None: error = 'msgconvert not found in $PATH' log_msg_to_sentry( error, request=getRequest()) raise EnvironmentError(error) process = subprocess.Popen( [msgconvert_path, msg_path], bufsize=0, cwd=tempdir, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) # Wait for subprocess to terminate. stdout, stderr = process.communicate() # The converted .eml file will be placed in the working directory eml_path = os.path.join(tempdir, 'mail.eml') with open(eml_path) as eml_file: eml_data = eml_file.read() # Remove temp directory shutil.rmtree(tempdir) # If program terminated correctly return converted message if process.returncode == 0: return eml_data # If program terminated with error, raise exception else: msg = 'Program terminated with error code %s\n%s' % ( process.returncode, stderr) raise IOError(msg)
def transform(self, value): # Create a temporary directory for 'msgconvert' to work in. It dumps # the resulting .eml file to its working directory, and doesn't take # an commandline option to actually specify the output path, so we # have it do its work in a tempdir and predict the output filename. tempdir = tempfile.mkdtemp() # Create a temporary msg file in the tempdir we just created msg_path = os.path.join(tempdir, 'mail.msg') with open(msg_path, 'wb') as msg_file: msg_file.write(value) msgconvert_path = spawn.find_executable("msgconvert") if msgconvert_path is None: error = 'msgconvert not found in $PATH' log_msg_to_sentry(error, request=getRequest()) raise EnvironmentError(error) process = subprocess.Popen([msgconvert_path, msg_path], bufsize=0, cwd=tempdir, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) # Wait for subprocess to terminate. stdout, stderr = process.communicate() # The converted .eml file will be placed in the working directory eml_path = os.path.join(tempdir, 'mail.eml') with open(eml_path) as eml_file: eml_data = eml_file.read() # Remove temp directory shutil.rmtree(tempdir) # If program terminated correctly return converted message if process.returncode == 0: return eml_data # If program terminated with error, raise exception else: msg = 'Program terminated with error code %s\n%s' % ( process.returncode, stderr) raise IOError(msg)
def _log_csrf_incident_to_sentry(self, env): logged = False try: extra = {'referrer': self.request.get('HTTP_REFERER', ''), '_registered_objects': env['registered_objects_summary']} except Exception as e: LOG.error('Error while preparing CSRF incident data for Sentry' ' (%r)' % e) return logged = log_msg_to_sentry( 'CSRF @@confirm-action triggered', request=self.request, url=env['url'], extra=extra, fingerprint=['{{ default }}', env['url']], ) if logged: LOG.warn('Logged CSRF incident to Sentry')
def _log_csrf_incident_to_sentry(self, env): logged = False try: extra = { 'referrer': self.request.get('HTTP_REFERER', ''), '_registered_objects': env['registered_objects_summary'] } except Exception as e: LOG.error('Error while preparing CSRF incident data for Sentry' ' (%r)' % e) return logged = log_msg_to_sentry( 'CSRF @@confirm-action triggered', request=self.request, url=env['url'], extra=extra, fingerprint=['{{ default }}', env['url']], ) if logged: LOG.warn('Logged CSRF incident to Sentry')
def log_to_sentry(self, message): log_msg_to_sentry(message, request=getRequest())