Example #1
0
    def __init__(self, config, cli_args):
        assert isinstance(config, ConfigProvider)
        assert isinstance(cli_args, QueueMagicCliArguments)

        self._config = config
        self._args = cli_args
        self._app = ServiceResolver(config=config.section('services'))

        set_logger(self._app.get_service(Logs))
Example #2
0
class QueueMagicCli(object):
    def __init__(self, config, cli_args):
        assert isinstance(config, ConfigProvider)
        assert isinstance(cli_args, QueueMagicCliArguments)

        self._config = config
        self._args = cli_args
        self._app = ServiceResolver(config=config.section('services'))

        set_logger(self._app.get_service(Logs))

    def _get_email(self):
        if self._args.should_use_stdin:
            log_debug('read stdin smtp message')
            return EmailFacade(fd=sys.stdin)
        else:
            log_debug('read "{0}" smtp message', self._args.input)
            return EmailFacade(file_path=self._args.input)

    @staticmethod
    def _print_email(email):
        log_debug('write output smtp message to stdout')
        email.write_to(sys.stdout)

    def _write_email(self, email):
        output = self._args.output
        log_debug('write output smtp message to {0}'.format(output))
        with open(name=output, mode='w') as fd:
            email.write_to(fd)

    def _output_exec(self, email):
        log_debug('attempt to start subprocess "{0}"', self._args.output_exec)
        fd = StringIO()
        email.write_to(fd)
        fd.seek(0)
        p = Popen(args=shlex.split(self._args.output_exec), stdout=PIPE, stdin=PIPE)
        p.communicate(input=fd.read())
        p.wait()

        if p.returncode != 0:
            log_warning('subprocess "{0}" exits with code "{1}"', None, self._args.output_exec, p.returncode)
        else:
            log_debug('subprocess terminated with no errors')

        return p.returncode

    def _get_pipeline(self, email):
        log_debug('building pipeline "{0}"', self._args.pipeline)
        svc = self._app.get_service(PipelineService)
        pipeline = svc.build_pipeline(name=self._args.pipeline, message=email, data=self._args.data)
        log_debug('pipeline building complete')

        return pipeline

    def _feed_statistics(self, pipeline):
        log_debug('feeding statistics')
        svc = self._app.get_service(Statistics)
        assert isinstance(svc, Statistics)

        svc.increment_message_number(sender=pipeline.bus.sender, recipient=pipeline.bus.recipient)
        svc.update_last_message_timestamp(sender=pipeline.bus.sender, recipient=pipeline.bus.recipient)
        log_debug('feeding statistics complete')

    def _send(self, email, sender, recipient):
        svc = self._app.get_service(SendMail)
        assert isinstance(svc, SendMail)

        return svc.send(email=email, sender=sender, recipients=[recipient])

    def run(self):
        return_code = posix.EX_OK

        try:
            email = self._get_email()
        except IOError, e:
            log_error('Unable to fetch email', error=e)
            sys.exit(posix.EX_IOERR)
        except Exception, e:
            log_error('Unable to fetch email', error=e)
            sys.exit(posix.EX_DATAERR)