diff --git a/Script/CastorScript.py b/Script/CastorScript.py index 0919f385af7133ad3c00fbc50b7c73b6d69f3f1b..a08fb2091c77ba704ebbe34f1913e7401d7a2b4a 100644 --- a/Script/CastorScript.py +++ b/Script/CastorScript.py @@ -1,9 +1,5 @@ #!/bin/env tdaq_python -from __future__ import print_function -from future import standard_library -standard_library.install_aliases() -from builtins import str from queue import Queue from time import time import subprocess diff --git a/Script/cs/StorageBackends/castorstorage.py b/Script/cs/StorageBackends/castorstorage.py index f1882fc935c7151f6f6f126f6846b01c044c8859..e1d88a5ea2c7f737a52b5d8ca9a8a646b0a33d2d 100644 --- a/Script/cs/StorageBackends/castorstorage.py +++ b/Script/cs/StorageBackends/castorstorage.py @@ -1,4 +1,3 @@ - import subprocess import os diff --git a/Script/cs/StorageBackends/eosstorage.py b/Script/cs/StorageBackends/eosstorage.py index 88046271cd119b7bbbf9e69c0e725e15006dad2e..f33b803fe756d26cf87046162176901f9c61e2e1 100644 --- a/Script/cs/StorageBackends/eosstorage.py +++ b/Script/cs/StorageBackends/eosstorage.py @@ -2,7 +2,6 @@ Provides EOS backend functionalities. Tape migration is not supported by EOS. """ -from builtins import str import subprocess import os import sys diff --git a/Script/cs/StorageBackends/storagetester.py b/Script/cs/StorageBackends/storagetester.py index 83c12e911c52ddda58a3740378b709b13b9ff8d8..33c9bb2a9650e54f16e61840f44f9ff3df0cc229 100644 --- a/Script/cs/StorageBackends/storagetester.py +++ b/Script/cs/StorageBackends/storagetester.py @@ -3,9 +3,6 @@ Helper module to test storage backends """ -from __future__ import print_function - - import sys import logging import argparse diff --git a/Script/cs/Threads/CopyThread.py b/Script/cs/Threads/CopyThread.py index 28f7665167c21c947619be487f1b730d0bdccab3..71fe782514f7f4f516e83af565dffef1015ebff6 100644 --- a/Script/cs/Threads/CopyThread.py +++ b/Script/cs/Threads/CopyThread.py @@ -1,8 +1,4 @@ #!/bin/env python - -from future import standard_library -standard_library.install_aliases() -from builtins import str import threading, glob, os from time import time import signal diff --git a/Script/cs/Threads/DdmMonitoringThread.py b/Script/cs/Threads/DdmMonitoringThread.py index b6c246ef1c0780a03bf66a202ddf1f5321c5eae3..735051f5ae8fbcd70fb29ef244e2ac1f05557d86 100644 --- a/Script/cs/Threads/DdmMonitoringThread.py +++ b/Script/cs/Threads/DdmMonitoringThread.py @@ -1,7 +1,4 @@ #!/bin/env python -from future import standard_library -standard_library.install_aliases() -from builtins import str import threading import urllib.request, urllib.error, urllib.parse #pylint: disable=import-error import json diff --git a/Script/cs/Threads/DeleteThread.py b/Script/cs/Threads/DeleteThread.py index 4ab7a16a8ef7dde326e3045e6ca36b5c487b68d8..1aebc3f16f7b4a038c05042ce3fd7f206bec7a62 100644 --- a/Script/cs/Threads/DeleteThread.py +++ b/Script/cs/Threads/DeleteThread.py @@ -1,7 +1,4 @@ #!/bin/env python - -from builtins import str -from builtins import map import threading import os import glob diff --git a/Script/cs/Threads/InfoServiceThread.py b/Script/cs/Threads/InfoServiceThread.py index 5ae6455debac298b26c9858f7f9a1aa352e45470..0d48753c4b2dd0a9546941b9c395835cfea37e32 100644 --- a/Script/cs/Threads/InfoServiceThread.py +++ b/Script/cs/Threads/InfoServiceThread.py @@ -1,8 +1,4 @@ #!/usr/bin/env tdaq_python -from __future__ import division -from builtins import map -from builtins import str -from past.utils import old_div import threading import glob import os @@ -120,8 +116,8 @@ class InfoServiceThread(threading.Thread): self.logger.debug("creating ISObject: %s, type: %s", fs_data_identifier, fs_data_type) is_data = ispy.ISObject(self.ipc_partition, fs_data_identifier, fs_data_type) - is_data.total_MB = old_div((fs.f_blocks * fs.f_bsize), 1000000) - is_data.available_MB = old_div((fs.f_bavail * fs.f_bsize), 1000000) + is_data.total_MB = (fs.f_blocks * fs.f_bsize) // 1000000 + is_data.available_MB = (fs.f_bavail * fs.f_bsize) // 1000000 is_data.occupancy_percent = 100.*(1-float(fs.f_bavail)/float(fs.f_blocks)) self.logger.debug("checkin of is_data") diff --git a/Script/cs/Threads/ManagerThread.py b/Script/cs/Threads/ManagerThread.py index 38a4b73e0a163ef597cf97dd28c4b6ee5cfe323f..9729ddc851813ff484dea96271a1155f2e13dd84 100644 --- a/Script/cs/Threads/ManagerThread.py +++ b/Script/cs/Threads/ManagerThread.py @@ -1,11 +1,8 @@ #!/bin/env python - """ @package ManagerThread This module describe the Manager Thread. It is in charge of ls on SFO disk. """ - -from past.builtins import cmp import threading, os, glob from time import time import datetime @@ -254,6 +251,8 @@ class ManagerThread(threading.Thread): # Compare two (timestamp, filename, is express) def Compare(self,a, b): + def cmp(a, b): + return (a > b) - (a < b) if (a[2]!= b[2]): return cmp(-a[2],-b[2]) else: return cmp(a[0],b[0]) diff --git a/Script/cs/Threads/ProfiledThread.py b/Script/cs/Threads/ProfiledThread.py index 0ae3ccfa2e2d49892ec4d23741fbb1457035a376..11601e26d508b69165ed7ce4873f7d776642b5e3 100644 --- a/Script/cs/Threads/ProfiledThread.py +++ b/Script/cs/Threads/ProfiledThread.py @@ -1,23 +1,14 @@ """ @package ProfiledThread Simple class to instrument threads with a profiler """ -from __future__ import print_function - import threading import cProfile class ProfiledThread(threading.Thread): # Overrides threading.Thread.run() def run(self): - - profiler = cProfile.Profile() - #try: res = profiler.runcall(threading.Thread.run, self) profiler.dump_stats('/afs/cern.ch/user/v/vandelli/working/nightly/CastorScript/myprofile-%d.profile' % (self.ident,)) print('Dump done') return res - - #finally: - - diff --git a/Script/cs/Tools/ConfigParser.py b/Script/cs/Tools/ConfigParser.py index add05cbd64e81793e3c9c7d8a5481dc72d3a51d8..6bd784b04654ddd37980cbe22ff10881ab3b5131 100644 --- a/Script/cs/Tools/ConfigParser.py +++ b/Script/cs/Tools/ConfigParser.py @@ -1,8 +1,4 @@ #!/bin/env python -from __future__ import print_function -from builtins import str -from builtins import zip -from builtins import object from cs.Tools.Libraries.config import Config import importlib from collections import namedtuple @@ -437,4 +433,3 @@ class ConfigHolder(object): self.DBLookupMaxRetries = self.DBLookupMaxRetries except AttributeError: self.DBLookupMaxRetries = 5 - diff --git a/Script/cs/Tools/FilenameParsers/BCMFileNameParser.py b/Script/cs/Tools/FilenameParsers/BCMFileNameParser.py index ba4729fb34e821fd579bda2ebe883122e60a2155..a59ce3d6193375b10d2a68ddc145dc72f76bc5c4 100644 --- a/Script/cs/Tools/FilenameParsers/BCMFileNameParser.py +++ b/Script/cs/Tools/FilenameParsers/BCMFileNameParser.py @@ -1,4 +1,3 @@ -from __future__ import print_function import os.path from cs.Tools.FilenameParsers.BaseFileNameParser import BaseFileNameParser diff --git a/Script/cs/Tools/FilenameParsers/BCMSimpleFileNameParser.py b/Script/cs/Tools/FilenameParsers/BCMSimpleFileNameParser.py index 24f088c71bbd4f704351cdec88ce4669097058f0..d176cdebf27ab6eb69955aa24db56778085690a5 100644 --- a/Script/cs/Tools/FilenameParsers/BCMSimpleFileNameParser.py +++ b/Script/cs/Tools/FilenameParsers/BCMSimpleFileNameParser.py @@ -1,4 +1,3 @@ -from __future__ import print_function __version__ = '$Revision$' import os.path diff --git a/Script/cs/Tools/FilenameParsers/BaseFileNameParser.py b/Script/cs/Tools/FilenameParsers/BaseFileNameParser.py index e808db7f98424f94574822b4f10a797e09fae9e5..f428e6d4f6a6136a74b2a7b0bfbd45488dc43738 100644 --- a/Script/cs/Tools/FilenameParsers/BaseFileNameParser.py +++ b/Script/cs/Tools/FilenameParsers/BaseFileNameParser.py @@ -1,4 +1,3 @@ -from builtins import object class BaseFileNameParser(object): def __init__(self, filename): diff --git a/Script/cs/Tools/FilenameParsers/BeastFileNameParser.py b/Script/cs/Tools/FilenameParsers/BeastFileNameParser.py index 58929e9ae141f1fba8016bdb2692b2467b021521..f7c2a61d1b46a6fa432fc833867c1f9e7b802f80 100644 --- a/Script/cs/Tools/FilenameParsers/BeastFileNameParser.py +++ b/Script/cs/Tools/FilenameParsers/BeastFileNameParser.py @@ -1,5 +1,4 @@ #!/usr/bin/env tdaq_python -from __future__ import print_function import os.path from cs.Tools.FilenameParsers.BaseFileNameParser import BaseFileNameParser diff --git a/Script/cs/Tools/FilenameParsers/CocaFileNameParser.py b/Script/cs/Tools/FilenameParsers/CocaFileNameParser.py index b4a0fe23b964c0350e12c2cd7fa449402e13fdc5..8475616fe37de1ed90a186ce90f3b227a90ecef9 100644 --- a/Script/cs/Tools/FilenameParsers/CocaFileNameParser.py +++ b/Script/cs/Tools/FilenameParsers/CocaFileNameParser.py @@ -1,8 +1,6 @@ import os.path from cs.Tools.FilenameParsers.BaseFileNameParser import BaseFileNameParser - -# # CDR parser for file names produced by coca. Main idea is that # we start writing coca files to subdirectories and repeat the # same directory structure in EOS. We split files between diff --git a/Script/cs/Tools/FilenameParsers/MUCalibNameParser.py b/Script/cs/Tools/FilenameParsers/MUCalibNameParser.py index 41417b8e1751d20a356fc32a367ed21582e5120a..46ccfd22126726cbfd41667505bc9a75b9000c27 100644 --- a/Script/cs/Tools/FilenameParsers/MUCalibNameParser.py +++ b/Script/cs/Tools/FilenameParsers/MUCalibNameParser.py @@ -1,5 +1,3 @@ - -from builtins import str from cs.Tools.FilenameParsers.BaseFileNameParser import BaseFileNameParser import os.path diff --git a/Script/cs/Tools/FilenameParsers/SCTFileNameParser.py b/Script/cs/Tools/FilenameParsers/SCTFileNameParser.py index 352f9bece983e471c99b28b7f7bbc298d43eccc0..80da1c8a5757dd34b99f0e363433ace29f1b9119 100644 --- a/Script/cs/Tools/FilenameParsers/SCTFileNameParser.py +++ b/Script/cs/Tools/FilenameParsers/SCTFileNameParser.py @@ -1,5 +1,3 @@ -from __future__ import print_function - from cs.Tools.FilenameParsers.BaseFileNameParser import BaseFileNameParser import os.path diff --git a/Script/cs/Tools/FilenameParsers/SFOFileNameParser.py b/Script/cs/Tools/FilenameParsers/SFOFileNameParser.py index 85626ffb6e00a9bc7f2273edc2bdfc99dd8fbbb5..74cc37b9027baafc67f4a3aa7802660effa87f35 100644 --- a/Script/cs/Tools/FilenameParsers/SFOFileNameParser.py +++ b/Script/cs/Tools/FilenameParsers/SFOFileNameParser.py @@ -1,4 +1,3 @@ -from builtins import str import os.path from cs.Tools.FilenameParsers.BaseFileNameParser import BaseFileNameParser diff --git a/Script/cs/Tools/Libraries/Database.py b/Script/cs/Tools/Libraries/Database.py index 1b7d1d852e58f2cc649fe851164e864714ea8018..aec8328f885b93020b9473183fed1ce16dad8826 100644 --- a/Script/cs/Tools/Libraries/Database.py +++ b/Script/cs/Tools/Libraries/Database.py @@ -1,8 +1,5 @@ #!/bin/env python - -from builtins import str -from builtins import object -import cx_Oracle +import cx_Oracle import sys import datetime import time diff --git a/Script/cs/Tools/LogConfig.py b/Script/cs/Tools/LogConfig.py index 7a72127cc6b94dadecb1da9f16757888b84abe06..25f03432091fe5f2ec392e7509561c65005649e7 100644 --- a/Script/cs/Tools/LogConfig.py +++ b/Script/cs/Tools/LogConfig.py @@ -1,4 +1,3 @@ -from builtins import str import socket import os import logging diff --git a/Script/cs/Tools/MigrationCheckers/DDMMigrated.py b/Script/cs/Tools/MigrationCheckers/DDMMigrated.py index a44f3972805e4b5d499b0733ba68aa05bb2c7c2c..b00263772ed90a67473008d159685b63e04a37d4 100644 --- a/Script/cs/Tools/MigrationCheckers/DDMMigrated.py +++ b/Script/cs/Tools/MigrationCheckers/DDMMigrated.py @@ -1,7 +1,4 @@ #!/bin/env python - -from __future__ import print_function -from builtins import object import os.path import cs.StorageBackends.ctastorage as ctastorage import re diff --git a/Script/cs/Tools/MigrationCheckers/MergedMigrated.py b/Script/cs/Tools/MigrationCheckers/MergedMigrated.py index 499295bc4c65d862ce950bcb315b9704e9d53541..9022ebf527486f96f0f6c4867067d450e23438b1 100644 --- a/Script/cs/Tools/MigrationCheckers/MergedMigrated.py +++ b/Script/cs/Tools/MigrationCheckers/MergedMigrated.py @@ -1,6 +1,4 @@ #!/bin/env python - -from __future__ import print_function import os.path import sys diff --git a/Script/cs/Tools/MigrationCheckers/TestMigrated.py b/Script/cs/Tools/MigrationCheckers/TestMigrated.py index 588aa64e46fa7fea4440f61be24dfcc7bb79ce0c..e1111b04fb6f72f1b71027e8cbea3056ca7a7aa1 100644 --- a/Script/cs/Tools/MigrationCheckers/TestMigrated.py +++ b/Script/cs/Tools/MigrationCheckers/TestMigrated.py @@ -1,6 +1,4 @@ #!/bin/env python -from __future__ import print_function -from builtins import object import os.path import cs.StorageBackends.ctastorage as ctastorage diff --git a/UnitTests/TestSuite_Functional.py b/UnitTests/TestSuite_Functional.py index b9c7768df7bd549978e854e01278ee9091f1404a..755015e23953c2076d60537790358ec702a50c8e 100644 --- a/UnitTests/TestSuite_Functional.py +++ b/UnitTests/TestSuite_Functional.py @@ -1,4 +1,3 @@ -from __future__ import print_function import unittest from UnitTests.FunctionalTests import LocalCopy_Test diff --git a/UnitTests/TestSuite_UnitTests.py b/UnitTests/TestSuite_UnitTests.py index e70aa1dbb57c9d51422755ed8545bcbb3345aff4..76d899d838964d6252d1435fe0491dcf7a48fccf 100644 --- a/UnitTests/TestSuite_UnitTests.py +++ b/UnitTests/TestSuite_UnitTests.py @@ -1,4 +1,3 @@ -from __future__ import print_function import unittest from UnitTests import BaseFileNameParser_Test from UnitTests import LogConfig_Test @@ -17,4 +16,4 @@ runner = unittest.TextTestRunner(verbosity=3) print("\n==============================================================") print("Running Unit Tests:") print("==============================================================\n") -result = runner.run(suite) \ No newline at end of file +result = runner.run(suite) diff --git a/UnitTests/UnitTests/ConfigParser_Test.py b/UnitTests/UnitTests/ConfigParser_Test.py index 28df931dbd8bc9582822fe40fc78640e7d5be127..e24ca930bfde08f4d95b06b8ebc88dfe69b31a87 100644 --- a/UnitTests/UnitTests/ConfigParser_Test.py +++ b/UnitTests/UnitTests/ConfigParser_Test.py @@ -1,5 +1,4 @@ import unittest -#import mock import os if __name__ == '__main__': diff --git a/UnitTests/UnitTests/ERSThread_Test.py b/UnitTests/UnitTests/ERSThread_Test.py index 7f341b2726d3b011c8339056793232747b0435eb..e8acbf5ee5a63f90e2568a30aa55bbf35f9ef2e4 100644 --- a/UnitTests/UnitTests/ERSThread_Test.py +++ b/UnitTests/UnitTests/ERSThread_Test.py @@ -1,5 +1,3 @@ -from future import standard_library -standard_library.install_aliases() import unittest import time import threading diff --git a/UnitTests/UnitTests/FunctionalTests/LocalCopy_Test.py b/UnitTests/UnitTests/FunctionalTests/LocalCopy_Test.py index 4a6a10aa4970c1c307705774d21af1bcbdd0cac7..a6b08e6ec65c7de133d322a971c67d3abd515ea1 100644 --- a/UnitTests/UnitTests/FunctionalTests/LocalCopy_Test.py +++ b/UnitTests/UnitTests/FunctionalTests/LocalCopy_Test.py @@ -1,4 +1,3 @@ -from builtins import str import unittest import signal import shutil @@ -38,14 +37,14 @@ class TestCanCopyFilesLocally(unittest.TestCase): # I make a new file in CastorScript/tmp directory cfgTest = open(self.dirs["tmp"] + "/funcTestConf.cfg", "w") - # And I copy the content and replaces the directories with my own dirs + # And I copy the content and replaces the directories with my own dirs custom_cfg_lines = { "LogDir: ": "LogDir: \'{}\'\n".format(self.dirs["log"]), "DirList: ": "DirList: [\'{}\',]\n".format(self.dirs["src"]), "CopyDir: ": "CopyDir: \'{}\'\n".format(self.dirs["des"]), } - # And I copy the content and replaces the directories with my own dirs + # And I copy the content and replaces the directories with my own dirs for line in cfgTemplate: for key, value in custom_cfg_lines.items(): if line.find(key) is not -1: @@ -75,10 +74,10 @@ class TestCanCopyFilesLocally(unittest.TestCase): def test_localCopy_can_produce_logfiles(self): - + seconds = 10 timeout, output = DirectoryChecker(self.dirs["log"]).waitForAnyFile(seconds) - + timeoutMessage = "Timeout, found no log files within a timeframe of " + str(seconds) + " seconds" self.assertFalse(timeout, msg=timeoutMessage) @@ -87,10 +86,10 @@ class TestCanCopyFilesLocally(unittest.TestCase): def test_localCopy_can_copy_files_to_des_directory(self): - + seconds = 4 timeout, output = DirectoryChecker(self.dirs["des"]).waitForAnyFile(seconds) - + timeoutMessage = "Timeout, found no files within a timeframe of " + str(seconds) + " seconds" self.assertFalse(timeout, msg=timeoutMessage) diff --git a/UnitTests/UnitTests/InfoServiceThread_Test.py b/UnitTests/UnitTests/InfoServiceThread_Test.py index abb53e8a69b791f12a118a400340470653b9a3c5..60c5b5b4ebd409f5a095ecef88aecbe9d2c8e57d 100644 --- a/UnitTests/UnitTests/InfoServiceThread_Test.py +++ b/UnitTests/UnitTests/InfoServiceThread_Test.py @@ -1,5 +1,3 @@ -from future import standard_library -standard_library.install_aliases() import unittest import mock import threading diff --git a/external/mailinglogger/__init__.py b/external/mailinglogger/__init__.py deleted file mode 100644 index b6098ca855e1c72fc47a40ba73c3881fd83130a7..0000000000000000000000000000000000000000 --- a/external/mailinglogger/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from __future__ import absolute_import -from .mailinglogger import MailingLogger -from .summarisinglogger import SummarisingLogger diff --git a/external/mailinglogger/common.py b/external/mailinglogger/common.py deleted file mode 100644 index ee5977291a5d5d315b4d0671cad3198d5aa6f769..0000000000000000000000000000000000000000 --- a/external/mailinglogger/common.py +++ /dev/null @@ -1,24 +0,0 @@ -from cgi import escape -from logging import Formatter -from socket import gethostname - - -class SubjectFormatter(Formatter): - - def format(self, record): - record.message = record.getMessage() - if self._fmt.find('%(line)') >= 0: - record.line = record.message.split('\n')[0] - if self._fmt.find("%(asctime)") >= 0: - record.asctime = self.formatTime(record, self.datefmt) - if self._fmt.find("%(hostname)") >= 0: - record.hostname = gethostname() - return self._fmt % record.__dict__ - - -class HTMLFilter(object): - - def filter(self, record): - record.msg = escape(record.getMessage()) - record.args = () - return True diff --git a/external/mailinglogger/flood_template.txt b/external/mailinglogger/flood_template.txt deleted file mode 100644 index e9e6b70e49157239b6a515f2acb898890c6187a3..0000000000000000000000000000000000000000 --- a/external/mailinglogger/flood_template.txt +++ /dev/null @@ -1,10 +0,0 @@ -Too Many Log Entries - -More than %s entries have been logged that would have resulted in -emails being sent. - -No further emails will be sent for log entries generated between -%s and %i:00:00 - -Please consult any other configured logs, such as a File Logger, -that may contain important entries that have not been emailed. diff --git a/external/mailinglogger/mailinglogger.py b/external/mailinglogger/mailinglogger.py deleted file mode 100644 index ac0234e58ffc1ca38e0c0e02a5d39433fd061e2f..0000000000000000000000000000000000000000 --- a/external/mailinglogger/mailinglogger.py +++ /dev/null @@ -1,116 +0,0 @@ -import datetime -import os -import smtplib - -from six import text_type, PY3 - -try: - from email.Utils import formatdate, make_msgid - from email.MIMEText import MIMEText -except ImportError: - from email.utils import formatdate, make_msgid - from email.mime.text import MIMEText -from logging.handlers import SMTPHandler -from logging import LogRecord, CRITICAL -from .common import SubjectFormatter - -this_dir = os.path.dirname(__file__) -version = open(os.path.join(this_dir, 'version.txt')).read().strip() -x_mailer = 'MailingLogger ' + version -flood_template = open(os.path.join(this_dir, 'flood_template.txt')).read() - - -class MailingLogger(SMTPHandler): - - now = datetime.datetime.now - - def __init__(self, - fromaddr, - toaddrs, - mailhost='localhost', - subject='%(line)s', - send_empty_entries=False, - flood_level=10, - username=None, - password=None, - headers=None, - template=None, - charset='utf-8', - content_type='text/plain'): - SMTPHandler.__init__(self, mailhost, fromaddr, toaddrs, subject) - self.subject_formatter = SubjectFormatter(subject) - self.send_empty_entries = send_empty_entries - self.flood_level = flood_level - self.hour = self.now().hour - self.sent = 0 - self.username = username - self.password = password - self.headers = headers or {} - self.template = template - self.charset = charset - self.content_type = content_type - if not self.mailport: - self.mailport = smtplib.SMTP_PORT - - def getSubject(self, record): - return self.subject_formatter.format(record) - - def emit(self, record): - msg = record.getMessage() - if not self.send_empty_entries and not msg.strip(): - return - - current_time = self.now() - current_hour = current_time.hour - if current_hour != self.hour: - self.hour = current_hour - self.sent = 0 - if self.sent == self.flood_level: - # send critical error - record = LogRecord( - name='flood', - level=CRITICAL, - pathname='', - lineno=0, - msg=flood_template % (self.sent, - current_time.strftime('%H:%M:%S'), - current_hour + 1), - args=(), - exc_info=None) - elif self.flood_level and self.sent > self.flood_level: - # do nothing, we've sent too many emails already - return - self.sent += 1 - - # actually send the mail - try: - msg = self.format(record) - if self.template is not None: - msg = self.template % msg - subtype = self.content_type.split('/')[-1] - if isinstance(msg, text_type): - try: - msg = msg.encode('ascii') - charset = 'ascii' - except UnicodeEncodeError: - charset = self.charset - email = MIMEText(msg, subtype, charset) - else: - email = MIMEText(msg, subtype) - - for header, value in self.headers.items(): - email[header] = value - email['Subject'] = self.getSubject(record) - email['From'] = self.fromaddr - email['To'] = ', '.join(self.toaddrs) - email['X-Mailer'] = x_mailer - email['X-Log-Level'] = record.levelname - email['Date'] = formatdate() - email['Message-ID'] = make_msgid('MailingLogger') - smtp = smtplib.SMTP(self.mailhost, self.mailport) - if self.username and self.password: - smtp.login(self.username, self.password) - smtp.sendmail(self.fromaddr, self.toaddrs, email.as_string()) - smtp.quit() - except: - self.handleError(record) diff --git a/external/mailinglogger/summarisinglogger.py b/external/mailinglogger/summarisinglogger.py deleted file mode 100644 index aae050ad3d0ec8e4fb6bb00f82748cc82b5ac54c..0000000000000000000000000000000000000000 --- a/external/mailinglogger/summarisinglogger.py +++ /dev/null @@ -1,143 +0,0 @@ -from collections import deque -from logging import CRITICAL, FileHandler, Formatter, LogRecord -import atexit as atexit_module -import os - -from .mailinglogger import MailingLogger -from six import PY2 -from tempfile import mkstemp - -flood_template = '%i messages not included as flood limit of %i exceeded' - - -class SummarisingLogger(FileHandler): - - maxlevelno = 0 - message_count = 0 - tail = None - - def __init__(self, - fromaddr, - toaddrs, - mailhost='localhost', - subject='Summary of Log Messages (%(levelname)s)', - send_empty_entries=True, - atexit=True, - username=None, - password=None, - headers=None, - send_level=None, - template=None, - charset='utf-8', - content_type='text/plain', - flood_level=100, - ): - # create the "real" mailinglogger - self.mailer = MailingLogger(fromaddr, - toaddrs, - mailhost, - subject, - send_empty_entries, - username=username, - password=password, - headers=headers, - template=template, - charset=charset, - content_type=content_type) - # set the mailing logger's log format - self.mailer.setFormatter(Formatter('%(message)s')) - self.send_level = send_level - self.charset = charset - self.flood_level = flood_level - self.open() - # register our close method - if atexit: - atexit_module.register(self.close) - - def open(self): - # create a temp file logger to store log entries - self.fd, self.filename = mkstemp() - FileHandler.__init__(self, self.filename, 'w', encoding=self.charset) - self.closed = False - - def setLevel(self, lvl): - self.mailer.setLevel(lvl) - FileHandler.setLevel(self, lvl) - - def emit(self, record): - if self.closed: - return - - if record.levelno > self.maxlevelno: - self.maxlevelno = record.levelno - - self.message_count += 1 - if self.message_count > self.flood_level: - if self.tail is None: - self.tail = deque(maxlen=5) - self.tail.append(record) - else: - FileHandler.emit(self, record) - - def close(self): - if self.closed: - return - self.closed = True - - if self.message_count > self.flood_level: - hidden = self.message_count - self.flood_level - len(self.tail) - if hidden: - # send critical error - FileHandler.emit(self, LogRecord( - name='flood', - level=CRITICAL, - pathname='', - lineno=0, - msg=flood_template % ( - self.message_count - self.flood_level - len(self.tail), - self.flood_level - ), - args=(), - exc_info=None - )) - for record in self.tail: - FileHandler.emit(self, record) - - FileHandler.close(self) - - - if PY2: - f = os.fdopen(self.fd) - summary = f.read().decode(self.charset) - else: - f = open(self.fd, encoding=self.charset) - summary = f.read() - f.close() - try: - encoded_summary = summary.encode('ascii') - self.mailer.charset = 'ascii' - except UnicodeEncodeError: - pass - else: - if PY2: - summary = encoded_summary - - - if os.path.exists(self.filename): - os.remove(self.filename) - if self.send_level is None or self.maxlevelno >= self.send_level: - self.mailer.handle( - LogRecord( - name='Summary', - level=self.maxlevelno, - pathname='', - lineno=0, - msg=summary, - args=(), - exc_info=None - ) - ) - - def reopen(self): - self.close() - self.open() diff --git a/external/mailinglogger/tests/__init__.py b/external/mailinglogger/tests/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/external/mailinglogger/tests/shared.py b/external/mailinglogger/tests/shared.py deleted file mode 100644 index 83607cf9e48797c0c815cfab93158b41dc3e7d5d..0000000000000000000000000000000000000000 --- a/external/mailinglogger/tests/shared.py +++ /dev/null @@ -1,131 +0,0 @@ -from __future__ import print_function - -import logging -import smtplib -from collections import namedtuple -from time import tzset - -from testfixtures import Replacer, test_datetime, test_time - -SentMessage = namedtuple('SentMessage', ['to_addr', 'from_addr', 'host', 'port', 'msg', 'username', 'password']) - - -class DummySMTP: - - broken = False - - sent = [] - - stdout = True - - old_smtp = None - - username = None - password = None - - @staticmethod - def install(stdout=False): - if DummySMTP.old_smtp is None: - DummySMTP.old_smtp = smtplib.SMTP - smtplib.SMTP = DummySMTP - DummySMTP.sent = [] - DummySMTP.stdout = stdout - - @staticmethod - def remove(): - if DummySMTP.old_smtp is not None: - smtplib.SMTP = DummySMTP.old_smtp - DummySMTP.old_smtp = None - DummySMTP.stdout = True - - def __init__(self, mailhost, port=25): - self.mailhost = mailhost - self.port = port - - def login(self, username, password): - self.username = username - self.password = password - - def sendmail(self, fromaddr, toaddrs, msg): - sent = SentMessage( - to_addr=toaddrs, - from_addr=fromaddr, - host=self.mailhost, - port=self.port, - msg=msg.replace('\r\n', '\n'), - username=self.username, - password=self.password, - ) - if self.stdout: - print('sending to %r from %r using %r' % ( - toaddrs, fromaddr, (self.mailhost, self.port) - )) - if self.username and self.password: - print('(authenticated using username:%r and password:%r)' % ( - self.username, - self.password, - )) - parts = msg.split('\n\n', 1) - if len(parts)>1: - headers, body = parts - headers = '\n'.join(sorted(headers.split('\n'))) - print(headers, end='') - print('\n\n', end='') - print(body) - else: - print(msg) - else: - self.sent.append(sent) - - def quit(self): - pass - - -class Dummy: - - def __init__(self, value): - self.value = value - - def __call__(self, *args): - return self.value - - -def removeHandlers(): - logger = logging.getLogger() - logger.setLevel(logging.INFO) - for handler in list(logger.handlers): - logger.removeHandler(handler) - hl = getattr(logging, '_handlerList', None) - if hl: - hl[:] = [] - - -def _setUp(d, stdout=True): - removeHandlers() - DummySMTP.install(stdout=stdout) - - atexit_handlers = [] - datetime = test_datetime(2007, 1, 1, 10, delta=0) - time = test_time(2007, 1, 1, 10, delta=0) - r = Replacer() - r.replace('atexit.register', atexit_handlers.append) - r.replace('mailinglogger.MailingLogger.now', datetime.now) - r.replace('mailinglogger.common.gethostname', Dummy('host.example.com')) - r.replace('time.time', time) - r.replace('os.environ.TZ', 'GMT', strict=False) - tzset() - - d['atexit_handlers'] = atexit_handlers - d['r'] = r - d['smtp'] = DummySMTP - d['datetime'] = datetime - d['time'] = time - d['removeHandlers'] = removeHandlers - - -def _tearDown(d): - # restore stuff we've mocked out - d['r'].restore() - tzset() - # make sure we have no dummy smtp - DummySMTP.remove() diff --git a/external/mailinglogger/tests/test_htmlfilter.py b/external/mailinglogger/tests/test_htmlfilter.py deleted file mode 100644 index 79dc372f5be063e7681a86ea18f87a6e35d501d5..0000000000000000000000000000000000000000 --- a/external/mailinglogger/tests/test_htmlfilter.py +++ /dev/null @@ -1,48 +0,0 @@ -from logging import getLogger -from mailinglogger.common import HTMLFilter -from unittest import TestCase -from testfixtures import LogCapture - - -class TestHTMLFilter(TestCase): - - def setUp(self): - self.log = LogCapture() - self.logger = getLogger() - self.log.addFilter(HTMLFilter()) - - def tearDown(self): - self.log.uninstall() - - def test_plain_string(self): - self.logger.info('foo') - self.log.check(('root', 'INFO', 'foo'),) - - def test_html_string(self): - self.logger.info('<foo &bar>') - self.log.check(('root', 'INFO', '<foo &bar>'),) - - def test_with_params_string(self): - self.logger.info('%s', 'foo') - self.log.check(('root', 'INFO', 'foo'),) - - def test_plain_unicode(self): - self.logger.info(u"accentu\u00E9") - self.log.check(('root', 'INFO', u'accentu\xe9'),) - - def test_html_unicode(self): - self.logger.info(u"<u\u00E9 &bar>") - self.log.check(('root', 'INFO', u'<u\xe9 &bar>'),) - - def test_with_params_unicode(self): - self.logger.info(u"\u00E9%s", u"accentu\u00E9") - self.log.check(('root', 'INFO', u'\xe9accentu\xe9'),) - - def test_some_object(self): - class AnObject(object): - - def __repr__(self): - return 'obj' - __str__ = __repr__ - self.logger.info(AnObject()) - self.log.check(('root', 'INFO', 'obj'),) diff --git a/external/mailinglogger/tests/test_mailinglogger.py b/external/mailinglogger/tests/test_mailinglogger.py deleted file mode 100644 index 7d8695ee7bc8b4e2bb569c123388dcd17333372d..0000000000000000000000000000000000000000 --- a/external/mailinglogger/tests/test_mailinglogger.py +++ /dev/null @@ -1,150 +0,0 @@ -import logging -from unittest import TestCase - -from testfixtures import OutputCapture - -from mailinglogger.mailinglogger import MailingLogger -from mailinglogger.tests.shared import DummySMTP, _setUp, _tearDown - - -class TestMailingLogger(TestCase): - - def getLogger(self): - return logging.getLogger('') - - def setUp(self): - _setUp(self.__dict__, stdout=False) - - def tearDown(self): - _tearDown(self.__dict__) - - def test_imports(self): - pass - - def test_default_flood_limit(self): - # set up logger - self.handler = MailingLogger('from@example.com', ('to@example.com',)) - logger = self.getLogger() - logger.addHandler(self.handler) - # log 11 entries - for i in range(12): - logger.critical('message') - # only 1st 10 should get sent - # +1 for the final warning - self.assertEqual(len(DummySMTP.sent), 11) - - def test_flood_protection_bug(self): - # set up logger - self.handler = MailingLogger('from@example.com', ('to@example.com',), - flood_level=1) - logger = self.getLogger() - logger.addHandler(self.handler) - # make it 11pm - self.datetime.set(2007, 3, 15, 23) - # paranoid check - self.assertEqual(len(DummySMTP.sent), 0) - # log until flood protection kicked in - logger.critical('message1') - logger.critical('message2') - # check - 1 logged, 1 final warning - self.assertEqual(len(DummySMTP.sent), 2) - # check nothing emitted - logger.critical('message3') - self.assertEqual(len(DummySMTP.sent), 2) - # advance time past midnight - self.datetime.set(2007, 3, 15) - # log again - logger.critical('message4') - # check we are emitted now! - self.assertEqual(len(DummySMTP.sent), 3) - - def test_headers_supplied_get_added_to_those_generated(self): - # set up logger - self.handler = MailingLogger('from@example.com', ('to@example.com',), - headers={'From': 'someidiot', - 'to': 'someidiot'}) - logger = self.getLogger() - logger.addHandler(self.handler) - logger.critical('message') - self.assertEqual(len(DummySMTP.sent), 1) - m = DummySMTP.sent[0].msg - # the headers specified in the `headers` parameter get added - # to those generated by mailinglogger - be careful! - self.assertTrue('From: from@example.com' in m) - self.assertTrue('From: someidiot' in m) - # however, if you try hard you *can* break things :-S - self.assertTrue('To: to@example.com' in m) - self.assertTrue('to: someidiot' in m) - - def test_subject_contains_date(self): - # set up logger - self.handler = MailingLogger('from@example.com', ('to@example.com',), - subject="%(asctime)s") - logger = self.getLogger() - logger.addHandler(self.handler) - logger.critical('message') - self.assertEqual(len(DummySMTP.sent), 1) - m = DummySMTP.sent[0].msg - self.assertTrue('Subject: 2007-01-01 10:00:00,000' in m, m) - - def test_non_string_error_messages_dont_break_logging(self): - self.handler = MailingLogger('from@example.com', ('to@example.com',),) - logger = self.getLogger() - logger.addHandler(self.handler) - logger.critical(object()) - self.assertEqual(len(DummySMTP.sent), 1) - - def test_template(self): - self.handler = MailingLogger('from@example.com', ('to@example.com',), - template="<before>%s<after>") - logger = self.getLogger() - logger.addHandler(self.handler) - logger.critical('message') - m = DummySMTP.sent[0].msg - self.assertTrue('Subject: message' in m, m) - self.assertTrue('<before>message<after>' in m, m) - - def test_default_charset(self): - self.handler = MailingLogger('from@example.com', ('to@example.com',), ) - logger = self.getLogger() - logger.addHandler(self.handler) - logger.critical(u"accentu\u00E9") - m = DummySMTP.sent[0].msg - # lovely, utf-8 encoded goodness - self.assertTrue('Subject: =?utf-8?b?YWNjZW50dcOp?=' in m, m) - self.assertTrue('Content-Type: text/plain; charset="utf-8"' in m, m) - self.assertTrue('\nYWNjZW50dcOp' in m, m) - - def test_specified_charset(self): - self.handler = MailingLogger('from@example.com', ('to@example.com',), - charset='iso-8859-1') - logger = self.getLogger() - logger.addHandler(self.handler) - logger.critical(u"accentu\u00E9") - m = DummySMTP.sent[0].msg - # lovely, latin-1 encoded goodness - self.assertTrue('\naccentu=E9' in m, m) - self.assertTrue( - 'Content-Type: text/plain; charset="iso-8859-1"' in m, m) - # no idea why MIMEText doesn't use iso-8859-1 here, best not to - # argue... - self.assertTrue('Subject: =?utf-8?b?YWNjZW50dcOp?=' in m, m) - - def test_specified_content_type(self): - self.handler = MailingLogger('from@example.com', ('to@example.com',), - content_type='foo/bar') - logger = self.getLogger() - logger.addHandler(self.handler) - logger.critical(u"message") - m = DummySMTP.sent[0].msg - # NB: we drop the 'foo' - self.assertTrue('Content-Type: text/bar' in m, m) - - def test_send_failure(self): - handler = MailingLogger('from@example.com', ('to@example.com',), - template='x') - logger = self.getLogger() - logger.addHandler(handler) - with OutputCapture() as output: - logger.critical(u"message") - assert 'TypeError: not all arguments converted' in output.captured diff --git a/external/mailinglogger/tests/test_summarisinglogger.py b/external/mailinglogger/tests/test_summarisinglogger.py deleted file mode 100644 index 5581953e8cd0fb967e416af95381db37af91f16f..0000000000000000000000000000000000000000 --- a/external/mailinglogger/tests/test_summarisinglogger.py +++ /dev/null @@ -1,177 +0,0 @@ -import logging -import os -import threading -from unittest import TestCase - -from mailinglogger.summarisinglogger import SummarisingLogger -from mailinglogger.tests.shared import DummySMTP, removeHandlers - - -class TestSummarisingLogger(TestCase): - - def setUp(self): - removeHandlers() - DummySMTP.install() - - def tearDown(self): - DummySMTP.remove() - - def test_imports(self): - pass - - def create(self, *args, **kw): - kw['atexit'] = False - self.handler = SummarisingLogger(*args, **kw) - self.logger = logging.getLogger('') - self.logger.addHandler(self.handler) - - def test_do_send_empty(self): - self.create('from@example.com', ('to@example.com',)) - logging.shutdown() - self.assertEqual(len(DummySMTP.sent), 1) - - def test_dont_send_empty(self): - self.create('from@example.com', ('to@example.com',), - send_empty_entries=False) - logging.shutdown() - self.assertEqual(len(DummySMTP.sent), 0) - - def test_send_level_filters(self): - self.create('from@example.com', ('to@example.com',), - send_level=logging.CRITICAL) - self.logger.warning('This line will not be sent') - logging.shutdown() - self.assertEqual(len(DummySMTP.sent), 0) - - def test_send_level_includes_lower_level(self): - self.create('from@example.com', ('to@example.com',), - send_level=logging.CRITICAL) - self.logger.warning('a warning') - self.logger.critical('something critical') - logging.shutdown() - self.assertEqual(len(DummySMTP.sent), 1) - message_text = DummySMTP.sent[0].msg - self.assertTrue('a warning' in message_text) - self.assertTrue('something critical' in message_text) - - def test_tmpfile_goes_away(self): - self.create('from@example.com', ('to@example.com',)) - os.remove(self.handler.filename) - logging.shutdown() - self.assertEqual(len(DummySMTP.sent), 1) - - def test_default_charset(self): - self.create('from@example.com', ('to@example.com',), ) - self.logger.critical(u"accentu\u00E9") - logging.shutdown() - m = DummySMTP.sent[0].msg - # lovely, utf-8 encoded goodness - self.assertTrue('Subject: Summary of Log Messages (CRITICAL)' in m, m) - self.assertTrue('Content-Type: text/plain; charset="utf-8"' in m, m) - self.assertTrue('\nYWNjZW50dcOp' in m, m) - - def test_specified_charset(self): - self.create('from@example.com', ('to@example.com',), - charset='iso-8859-1') - self.logger.critical(u"accentu\u00E9") - logging.shutdown() - m = DummySMTP.sent[0].msg - # lovely, latin-1 encoded goodness - self.assertTrue('\naccentu=E9' in m, m) - self.assertTrue( - 'Content-Type: text/plain; charset="iso-8859-1"' in m, m) - self.assertTrue('Subject: Summary of Log Messages (CRITICAL)' in m, m) - - def test_template(self): - self.create('from@example.com', ('to@example.com',), - template='<before>%s<after>') - logging.critical('message') - logging.shutdown() - m = DummySMTP.sent[0].msg - self.assertTrue('Subject: Summary of Log Messages (CRITICAL)' in m, m) - self.assertTrue('<before>message\n<after>' in m, repr(m)) - - def test_specified_content_type(self): - self.create('from@example.com', ('to@example.com',), - content_type='foo/bar') - self.logger.critical(u"message") - logging.shutdown() - m = DummySMTP.sent[0].msg - # NB: we drop the 'foo' - self.assertTrue('Content-Type: text/bar' in m, m) - - def test_flood_level_exceeded(self): - self.create('from@example.com', ('to@example.com', ), - flood_level=3) - self.handler.setFormatter( - logging.Formatter('%(levelname)s - %(message)s') - ) - for i in range(10): - logging.warning('message %s', i) - logging.shutdown() - self.assertEqual(len(DummySMTP.sent), 1) - m = DummySMTP.sent[0].msg - self.assertTrue('Subject: Summary of Log Messages (WARNING)' in m, m) - self.assertTrue('\n'.join([ - 'WARNING - message 0', - 'WARNING - message 1', - 'WARNING - message 2', - 'CRITICAL - 2 messages not included as flood limit of 3 exceeded', - 'WARNING - message 5', - 'WARNING - message 6', - 'WARNING - message 7', - 'WARNING - message 8', - ]) in m, repr(m)) - - def test_flood_highest_level_still_recorded(self): - self.create('from@example.com', ('to@example.com', ), - flood_level=1) - self.handler.setFormatter( - logging.Formatter('%(levelname)s - %(message)s') - ) - logging.info('included') - logging.warning('filtered') - for i in range(5): - logging.info('after %i', i) - logging.shutdown() - self.assertEqual(len(DummySMTP.sent), 1) - m = DummySMTP.sent[0].msg - self.assertTrue('Subject: Summary of Log Messages (WARNING)' in m, m) - self.assertTrue('\n'.join([ - 'INFO - included', - 'CRITICAL - 1 messages not included as flood limit of 1 exceeded', - 'INFO - after 0', - ]) in m, repr(m)) - - def test_flood_except_for_tail(self): - self.create('from@example.com', ('to@example.com', ), - flood_level=1) - self.handler.setFormatter( - logging.Formatter('%(levelname)s - %(message)s') - ) - logging.warning('message 1') - logging.warning('message 2') - logging.shutdown() - self.assertEqual(len(DummySMTP.sent), 1) - m = DummySMTP.sent[0].msg - self.assertTrue('Subject: Summary of Log Messages (WARNING)' in m, m) - self.assertTrue('\n'.join([ - 'WARNING - message 1', - 'WARNING - message 2', - ]) in m, repr(m)) - - def test_reopen(self): - self.create('from@example.com', ('to@example.com',)) - self.handler.reopen() - logging.shutdown() - self.assertEqual(len(DummySMTP.sent), 2) - - def test_safe_close(self): - self.create('from@example.com', ('to@example.com', )) - threads = [] - for i in range(2): - t = threading.Thread(target=self.handler.close) - threads.append(t) - t.start() - [t.join() for t in threads] - self.assertEqual(len(DummySMTP.sent), 1) diff --git a/external/mailinglogger/version.txt b/external/mailinglogger/version.txt deleted file mode 100644 index c00465f00d1664ff55825738fd4da167c61fbf10..0000000000000000000000000000000000000000 --- a/external/mailinglogger/version.txt +++ /dev/null @@ -1,2 +0,0 @@ -5.0.0 -