Example #1
0
def _start_outbound_queue(args, relay, inbound_queue):
    from slimta.queue.dict import DictStorage
    from slimta.queue import Queue
    from slimta.policy.headers import AddDateHeader, \
        AddMessageIdHeader, AddReceivedHeader
    from slimta.policy.split import RecipientDomainSplit

    envelope_db = {}
    meta_db = {}

    storage = DictStorage(envelope_db, meta_db)
    queue = Queue(storage, relay, bounce_queue=inbound_queue)
    queue.start()

    queue.add_policy(AddDateHeader())
    queue.add_policy(AddMessageIdHeader())
    queue.add_policy(AddReceivedHeader())
    queue.add_policy(RecipientDomainSplit())

    return queue
Example #2
0
def _start_inbound_queue(args, relay):
    from slimta.queue.dict import DictStorage
    from slimta.queue import Queue
    from slimta.policy.headers import AddDateHeader, \
        AddMessageIdHeader, AddReceivedHeader
    from slimta.policy.spamassassin import SpamAssassin

    envelope_db = {}
    meta_db = {}

    storage = DictStorage(envelope_db, meta_db)
    queue = Queue(storage, relay)
    queue.start()

    queue.add_policy(AddDateHeader())
    queue.add_policy(AddMessageIdHeader())
    queue.add_policy(AddReceivedHeader())
    if args.spamassassin:
        queue.add_policy(SpamAssassin())

    return queue
 def setUp(self):
     self.env = {}
     self.meta = {}
     self.dict = DictStorage(self.env, self.meta)
class TestDictStorage(unittest.TestCase):

    id_pattern = re.compile(r'[0-9a-fA-F]{32}')

    def setUp(self):
        self.env = {}
        self.meta = {}
        self.dict = DictStorage(self.env, self.meta)

    def _write_test_envelope(self, rcpts=None):
        env = Envelope('*****@*****.**', rcpts or ['*****@*****.**'])
        env.timestamp = 9876543210
        id = self.dict.write(env, 1234567890)
        return id, env

    def test_write(self):
        id, env = self._write_test_envelope()
        assert_true(self.id_pattern.match(id))
        assert_equal(env, self.env[id])
        assert_equal(1234567890, self.meta[id]['timestamp'])
        assert_equal(0, self.meta[id]['attempts'])
        assert_equal('*****@*****.**', self.env[id].sender)
        assert_equal(['*****@*****.**'], self.env[id].recipients)
        assert_equal(9876543210, self.env[id].timestamp)

    def test_set_timestamp(self):
        id, env = self._write_test_envelope()
        self.dict.set_timestamp(id, 1111)
        assert_equal(env, self.env[id])
        assert_equal(1111, self.meta[id]['timestamp'])

    def test_increment_attempts(self):
        id, env = self._write_test_envelope()
        assert_equal(1, self.dict.increment_attempts(id))
        assert_equal(2, self.dict.increment_attempts(id))
        assert_equal(env, self.env[id])
        assert_equal(2, self.meta[id]['attempts'])

    def test_load(self):
        queued = [self._write_test_envelope(),
                  self._write_test_envelope()]
        loaded = [info for info in self.dict.load()]
        assert_equal(len(queued), len(loaded))
        for timestamp, loaded_id in loaded:
            for queued_id, env in queued:
                if loaded_id == queued_id:
                    assert_equal(env, self.env[loaded_id])
                    assert_equal(timestamp, self.meta[queued_id]['timestamp'])
                    break
            else:
                raise ValueError('Queued does not match loaded')

    def test_get(self):
        id, env = self._write_test_envelope()
        self.dict.increment_attempts(id)
        get_env, get_attempts = self.dict.get(id)
        assert_equal(env, get_env)
        assert_equal(1, get_attempts)

    def test_remove(self):
        id, env = self._write_test_envelope()
        self.dict.remove(id)
        id, env = self._write_test_envelope()
        del self.env[id]
        self.dict.remove(id)
        id, env = self._write_test_envelope()
        del self.meta[id]
        self.dict.remove(id)

    def test_get_info(self):
        id1, _ = self._write_test_envelope()
        id2, _ = self._write_test_envelope()
        id3, _ = self._write_test_envelope()
        self.dict.remove(id2)
        info = self.dict.get_info()
        assert_equal(2, info['size'])
        assert_equal(2, info['meta_size'])
Example #5
0
class TestDictStorage(unittest.TestCase):

    id_pattern = re.compile(r'[0-9a-fA-F]{32}')

    def setUp(self):
        self.env = {}
        self.meta = {}
        self.dict = DictStorage(self.env, self.meta)

    def _write_test_envelope(self, rcpts=None):
        env = Envelope('*****@*****.**', rcpts or ['*****@*****.**'])
        env.timestamp = 9876543210
        id = self.dict.write(env, 1234567890)
        return id, env

    def test_write(self):
        id, env = self._write_test_envelope()
        self.assertTrue(self.id_pattern.match(id))
        self.assertEqual(env, self.env[id])
        self.assertEqual(1234567890, self.meta[id]['timestamp'])
        self.assertEqual(0, self.meta[id]['attempts'])
        self.assertEqual('*****@*****.**', self.env[id].sender)
        self.assertEqual(['*****@*****.**'], self.env[id].recipients)
        self.assertEqual(9876543210, self.env[id].timestamp)

    def test_set_timestamp(self):
        id, env = self._write_test_envelope()
        self.dict.set_timestamp(id, 1111)
        self.assertEqual(env, self.env[id])
        self.assertEqual(1111, self.meta[id]['timestamp'])

    def test_increment_attempts(self):
        id, env = self._write_test_envelope()
        self.assertEqual(1, self.dict.increment_attempts(id))
        self.assertEqual(2, self.dict.increment_attempts(id))
        self.assertEqual(env, self.env[id])
        self.assertEqual(2, self.meta[id]['attempts'])

    def test_load(self):
        queued = [self._write_test_envelope(), self._write_test_envelope()]
        loaded = [info for info in self.dict.load()]
        self.assertEqual(len(queued), len(loaded))
        for timestamp, loaded_id in loaded:
            for queued_id, env in queued:
                if loaded_id == queued_id:
                    self.assertEqual(env, self.env[loaded_id])
                    self.assertEqual(timestamp,
                                     self.meta[queued_id]['timestamp'])
                    break
            else:
                raise ValueError('Queued does not match loaded')

    def test_get(self):
        id, env = self._write_test_envelope()
        self.dict.increment_attempts(id)
        get_env, get_attempts = self.dict.get(id)
        self.assertEqual(env, get_env)
        self.assertEqual(1, get_attempts)

    def test_remove(self):
        id, env = self._write_test_envelope()
        self.dict.remove(id)
        id, env = self._write_test_envelope()
        del self.env[id]
        self.dict.remove(id)
        id, env = self._write_test_envelope()
        del self.meta[id]
        self.dict.remove(id)
Example #6
0
 def setUp(self):
     self.env = {}
     self.meta = {}
     self.dict = DictStorage(self.env, self.meta)
Example #7
0
 def _start_queue(self, name, options=None):
     if name in self.queues:
         return self.queues[name]
     if not options:
         options = getattr(self.cfg.queue, name)
     from .helpers import add_queue_policies, build_backoff_function
     new_queue = None
     relay_name = options.relay
     relay = self._start_relay(relay_name) if relay_name else None
     bounce_queue_name = options.get('bounce_queue', name)
     bounce_queue = self._start_queue(bounce_queue_name) \
                    if bounce_queue_name != name else None
     if options.type == 'memory':
         from slimta.queue import Queue
         from slimta.queue.dict import DictStorage
         store = DictStorage()
         backoff = build_backoff_function(options.retry)
         new_queue = Queue(store, relay, backoff=backoff,
                           bounce_queue=bounce_queue)
         new_queue.start()
     elif options.type == 'disk':
         from slimta.queue import Queue
         from slimta.diskstorage import DiskStorage
         env_dir = options.envelope_dir
         meta_dir = options.meta_dir
         tmp_dir = options.tmp_dir
         store = DiskStorage(env_dir, meta_dir, tmp_dir)
         backoff = build_backoff_function(options.retry)
         new_queue = Queue(store, relay, backoff=backoff,
                           bounce_queue=bounce_queue)
         new_queue.start()
     elif options.type == 'redis':
         from slimta.queue import Queue
         from slimta.redisstorage import RedisStorage
         kwargs = {}
         if 'host' in options:
             kwargs['host'] = options.host
         if 'port' in options:
             kwargs['port'] = int(options.port)
         if 'db' in options:
             kwargs['db'] = int(options.db)
         if 'password' in options:
             kwargs['password'] = options.password
         if 'socket_timeout' in options:
             kwargs['socket_timeout'] = float(options.socket_timeout)
         if 'prefix' in options:
             kwargs['prefix'] = options.prefix
         store = RedisStorage(**kwargs)
         backoff = build_backoff_function(options.retry)
         new_queue = Queue(store, relay, backoff=backoff,
                           bounce_queue=bounce_queue)
         new_queue.start()
     elif options.type == 'rackspace':
         from slimta.queue import Queue
         from slimta.cloudstorage import CloudStorage
         from slimta.cloudstorage.rackspace import RackspaceCloudAuth, \
                 RackspaceCloudFiles, RackspaceCloudQueues
         credentials = {'username': options.username}
         if 'password' in options:
             credentials['password'] = options.password
         if 'api_key' in options:
             credentials['api_key'] = options.api_key
         if 'tenant_id' in options:
             credentials['tenant_id'] = options.tenant_id
         auth_kwargs = {'region': options.region,
                        'timeout': 10.0}
         if 'endpoint' in options:
             auth_kwargs['endpoint'] = options.endpoint
         auth = RackspaceCloudAuth(credentials, **auth_kwargs)
         cloud_files = RackspaceCloudFiles(auth,
                 container=options.container_name, timeout=20.0)
         cloud_queues = None
         if 'queue_name' in options:
             cloud_queues = RackspaceCloudQueues(auth,
                     queue_name=options.queue_name, timeout=10.0)
         store = CloudStorage(cloud_files, cloud_queues)
         new_queue = Queue(store, relay, backoff=backoff,
                           bounce_queue=bounce_queue)
         new_queue.start()
     elif options.type == 'aws':
         from slimta.queue import Queue
         from slimta.cloudstorage import CloudStorage
         from slimta.cloudstorage.aws import SimpleStorageService, \
                 SimpleQueueService
         import boto
         if 'access_key_id' in options:
             from boto.s3.connection import S3Connection
             s3_conn = S3Connection(options.access_key_id,
                                    options.secret_access_key)
         else:
             s3_conn = boto.connect_s3()
         s3_bucket = s3_conn.get_bucket(options.bucket_name)
         s3 = SimpleStorageService(s3_bucket, timeout=20.0)
         sqs = None
         if 'queue_name' in options:
             from boto.sqs import connect_to_region
             region = options.get('queue_region', 'us-west-2')
             if 'access_key_id' in options:
                 sqs_conn = connect_to_region(region,
                         aws_access_key_id=options.access_key_id,
                         aws_secret_access_key=options.secret_access_key)
             else:
                 sqs_conn = connect_to_region(region)
             sqs_queue = sqs_conn.create_queue(options.queue_name)
             sqs = SimpleQueueService(sqs_queue, timeout=10.0)
         store = CloudStorage(s3, sqs)
         new_queue = Queue(store, relay, backoff=backoff,
                           bounce_queue=bounce_queue)
         new_queue.start()
     elif options.type == 'proxy':
         from slimta.queue.proxy import ProxyQueue
         new_queue = ProxyQueue(relay)
     elif options.type == 'custom':
         new_queue = custom_factory(options, relay)
     else:
         msg = 'queue type does not exist: '+options.type
         raise ConfigValidationError(msg)
     add_queue_policies(new_queue, options.get('policies', []))
     self.queues[name] = new_queue
     return new_queue