예제 #1
0
파일: mailout.py 프로젝트: reebalazs/karl
def main():
    parser = optparse.OptionParser(description=__doc__, usage="%prog [options] queue_path")
    parser.add_option(
        "-C",
        "--config",
        dest="config",
        default=None,
        help="Path to configuration file (defaults to $CWD/etc/karl.ini)",
        metavar="FILE",
    )
    parser.add_option("--daemon", "-D", dest="daemon", action="store_true", default=False, help="Run in daemon mode.")
    parser.add_option(
        "--interval",
        "-i",
        dest="interval",
        type="int",
        default=6 * 3600,
        help="Interval, in seconds, between executions when in " "daemon mode.",
    )
    parser.add_option(
        "--server", "-s", dest="hostname", default="localhost", help="SMTP server host name", metavar="HOST"
    )
    parser.add_option("--port", "-P", dest="port", type="int", default=25, help="Port of SMTP server", metavar="PORT")
    parser.add_option("--username", "-u", dest="username", default=None, help="Username, if authentication is required")
    parser.add_option("--password", "-p", dest="password", default=None, help="Password, if authentication is required")
    parser.add_option(
        "--force-tls", "-f", dest="force_tls", action="store_true", default=False, help="Require that TLS be used."
    )
    parser.add_option(
        "--no-tls", "-n", dest="no_tls", action="store_true", default=False, help="Require that TLS not be used."
    )

    options, args = parser.parse_args()

    if not args:
        parser.error("Please specify queue path.")
    elif len(args) > 1:
        parser.error("Too many arguments.")
    queue_path = args[0]

    config = options.config
    if config is None:
        config = get_default_config()
    app = loadapp("config:%s" % config, "karl")
    set_subsystem("mailout")

    mailer = SMTPMailer(
        hostname=options.hostname,
        port=options.port,
        username=options.username,
        password=options.password,
        no_tls=options.no_tls,
        force_tls=options.force_tls,
    )
    qp = QueueProcessor(mailer, queue_path)

    if options.daemon:
        run_daemon("digest", qp.send_messages, options.interval)
    else:
        qp.send_messages()
예제 #2
0
파일: mailout.py 프로젝트: boothead/karl
def main():
    parser = optparse.OptionParser(
        description=__doc__,
        usage="%prog [options] queue_path",
    )
    parser.add_option('-C', '--config', dest='config',
        default=None,
        help='Path to configuration file (defaults to $CWD/etc/karl.ini)',
        metavar='FILE')
    parser.add_option('--daemon', '-D', dest='daemon',
                      action='store_true', default=False,
                      help='Run in daemon mode.')
    parser.add_option('--interval', '-i', dest='interval', type='int',
                      default=6*3600,
                      help='Interval, in seconds, between executions when in '
                           'daemon mode.')
    parser.add_option('--server', '-s', dest='hostname', default="localhost",
                      help='SMTP server host name', metavar='HOST')
    parser.add_option('--port', '-P', dest='port', type='int', default=25,
                      help='Port of SMTP server', metavar='PORT')
    parser.add_option('--username', '-u', dest='username', default=None,
                      help='Username, if authentication is required')
    parser.add_option('--password', '-p', dest='password', default=None,
                      help='Password, if authentication is required')
    parser.add_option('--force-tls', '-f', dest='force_tls',
                      action='store_true', default=False,
                      help='Require that TLS be used.')
    parser.add_option('--no-tls', '-n', dest='no_tls',
                      action='store_true', default=False,
                      help='Require that TLS not be used.')

    options, args = parser.parse_args()

    if not args:
        parser.error('Please specify queue path.')
    elif len(args) > 1:
        parser.error('Too many arguments.')
    queue_path = args[0]

    config = options.config
    if config is None:
        config = get_default_config()
    app = loadapp('config:%s' % config, 'karl')
    set_subsystem('mailout')

    mailer = SMTPMailer(
        hostname=options.hostname,
        port=options.port,
        username=options.username,
        password=options.password,
        no_tls=options.no_tls,
        force_tls=options.force_tls
    )
    qp = QueueProcessor(mailer, queue_path)

    if options.daemon:
        run_daemon('digest', qp.send_messages, options.interval)
    else:
        qp.send_messages()
예제 #3
0
def main(argv=sys.argv, root=None, update_func=update_feeds, tx=transaction):
    parser = optparse.OptionParser(description=__doc__)
    parser.add_option('-C', '--config', dest='config',
        help='Path to configuration file (defaults to $CWD/etc/karl.ini)',
        metavar='FILE')
    parser.add_option('-f', '--force', dest='force',
        action='store_true', default=False,
        help='Update all feeds, even if unchanged')
    parser.add_option('--dry-run', dest='dryrun',
        action='store_true', default=False,
        help="Don't actually commit the transaction")
    parser.add_option('--daemon', '-D', dest='daemon',
                      action='store_true', default=False,
                      help='Run in daemon mode.')
    parser.add_option('--interval', '-i', dest='interval', type='int',
                      default=300,
                      help='Interval, in seconds, between executions when in '
                           'daemon mode.')
    parser.add_option('--timeout', '-t', dest='timeout', type='int',
                      default=None,
                      help='Timeout, in seconds, for URL requests.')
    options, args = parser.parse_args(argv[1:])

    if args:
        parser.error("Too many parameters: %s" % repr(args))

    config = options.config
    if config is None:
        config = get_default_config()
    if root is None:
        app = loadapp('config:%s' % config, name='karl')
    #else: unit test

    def run(root=root):
        closer = lambda: None  # unit test
        try:
            if root is None:
                root, closer = get_root(app)
            #else: unit test
            set_subsystem('update_feeds')
            update_func(root, config, force=options.force)
        except:
            tx.abort()
            closer()
            raise
        else:
            if options.dryrun:
                tx.abort()
            else:
                tx.commit()
            closer()

    if options.timeout is not None:
        socket.setdefaulttimeout(options.timeout)

    if options.daemon:
        run_daemon('update_feeds', run, options.interval)
    else:
        run()
예제 #4
0
    def wrapper(args):
        def finish(signum, frame):
            raise KeyboardInterrupt
        signal.signal(signal.SIGTERM, finish)

        try:
            def run():
                func(args)
            run_daemon(args.subsystem, run, args.interval)
        except KeyboardInterrupt:
            log.info("Exiting.")
예제 #5
0
def main():
    parser = optparse.OptionParser(description=__doc__)
    parser.add_option('-C', '--config', dest='config',
        default=None,
        help='Path to configuration file (defaults to $CWD/etc/karl.ini)',
        metavar='FILE')
    parser.add_option('-l', '--log-file', dest='log_file',
        default=None,
        help="log file name (default to stderr)")
    parser.add_option('--daemon', '-D', dest='daemon',
                      action='store_true', default=False,
                      help='Run in daemon mode.')
    parser.add_option('--frequency', '-f', dest='frequency', default='daily',
                      help='Digest frequency:  daily/weekly/biweekly.')
    parser.add_option('--interval', '-i', dest='interval', type='int',
                      default=6*3600,
                      help='Interval, in seconds, between executions when in '
                           'daemon mode.')

    options, args = parser.parse_args()

    if options.log_file:
        logging.basicConfig(filename=options.log_file)
    else:
        logging.basicConfig() # log to stderr

    config = options.config
    if config is None:
        config = get_default_config()
    app = loadapp('config:%s' % config, 'karl')
    alerts = queryUtility(IAlerts, default=Alerts())

    def run():
        set_subsystem('digest')
        root, closer = get_root(app)
        alerts.send_digests(root, options.frequency)
        closer()

    if options.daemon:
        run_daemon('digest', run, options.interval)
    else:
        run()
예제 #6
0
파일: digest.py 프로젝트: zagy/karl
def main():
    parser = optparse.OptionParser(description=__doc__)
    parser.add_option('-C', '--config', dest='config',
        default=None,
        help='Path to configuration file (defaults to $CWD/etc/karl.ini)',
        metavar='FILE')
    parser.add_option('-l', '--log-file', dest='log_file',
        default=None,
        help="log file name (default to stderr)")
    parser.add_option('--daemon', '-D', dest='daemon',
                      action='store_true', default=False,
                      help='Run in daemon mode.')
    parser.add_option('--interval', '-i', dest='interval', type='int',
                      default=6*3600,
                      help='Interval, in seconds, between executions when in '
                           'daemon mode.')

    options, args = parser.parse_args()

    if options.log_file:
        logging.basicConfig(filename=options.log_file)
    else:
        logging.basicConfig() # log to stderr

    config = options.config
    if config is None:
        config = get_default_config()
    app = loadapp('config:%s' % config, 'karl')
    alerts = queryUtility(IAlerts, default=Alerts())

    def run():
        set_subsystem('digest')
        root, closer = get_root(app)
        alerts.send_digests(root)
        closer()

    if options.daemon:
        run_daemon('digest', run, options.interval)
    else:
        run()
예제 #7
0
    def _callFUT(self, *args, **kw):
        from karl.scripting import run_daemon

        return run_daemon(*args, **kw)
예제 #8
0
파일: test_scripting.py 프로젝트: zagy/karl
 def _callFUT(self, *args, **kw):
     from karl.scripting import run_daemon
     return run_daemon(*args, **kw)
예제 #9
0
파일: mailin.py 프로젝트: cguardia/karl
def main(argv=sys.argv, factory=MailinRunner, root=None):
    parser = optparse.OptionParser(
        description=__doc__,
        usage="%prog [options] maildir_root",
        )
    parser.add_option('-C', '--config', dest='config',
        help='Path to configuration file (defaults to $CWD/etc/karl.ini)',
        metavar='FILE')
    parser.add_option('--dry-run', '-n', dest='dry_run',
        action='store_true', default=False,
        help="Don't actually commit any transaction")
    parser.add_option('--quiet', '-q', dest='verbosity',
        action='store_const', const=0, default=1,
        help="Quiet: no extraneous output")
    parser.add_option('--verbose', '-v', dest='verbosity',
        action='count',
        help="Increase verbosity of output")
    parser.add_option('--pending-queue', '-p', dest='pq_file',
        help="Path to the repoze.mailin IPendingQueue db "
                "(default, '%{maildir_root}s/pending.db')")
    parser.add_option('--log-file', '-l', dest='log_file',
        default='log/mailin.log',
        help="Log file name (default, 'log/mailin.log')")
    parser.add_option('--default-tool', '-t', dest='default_tool',
        default=None,
        help="Name of the default tool to handle new "
                "content, if none is supplied in the 'To:' "
                "address (default, None).")
    parser.add_option('--text-scrubber', '-s', dest='text_scrubber',
        help="Name of the utlity (implementing "
                "karl.utilities.interfaces.IMailinTextScrubber) "
                "used to scrub text of mail-in content.")
    parser.add_option('--draino', '-d', dest='run_draino',
                      action='store_true', default=False,
                      help="Run draino command before processing mailin.")
    parser.add_option('--daemon', '-D', dest='daemon',
                      action='store_true', default=False,
                      help='Run in daemon mode.')
    parser.add_option('--interval', '-i', dest='interval', type='int',
                      default=300,
                      help='Interval, in seconds, between executions when in '
                           'daemon mode.')

    options, args = parser.parse_args(argv[1:])

    if len(args) != 1:
        parser.error('Please pass exactly one maildir_root parameter')

    maildir_root = args[0]
    if not os.path.isdir(maildir_root):
        parser.error('Not a directory:  %s' % maildir_root)

    maildir = os.path.join(maildir_root, 'Maildir')
    if not os.path.isdir(maildir):
        parser.error('Not a directory:  %s' % maildir)

    contents = os.listdir(maildir)
    for sub in ('cur', 'new', 'tmp'):
        if not sub in contents:
            parser.error('Not a maildir:  %s' % maildir)

    if options.pq_file is None:
        options.pq_file = os.path.join(maildir_root, 'pending.db')

    if root is None:
        config = options.config
        if config is None:
            config = get_default_config()
        app = loadapp('config:%s' % config, name='karl')
    #else: unit test

    def run(root=root):
        closer = lambda: None # unit test
        if options.run_draino:
            draino_args = ['draino', '-vvv', '-p', '%s/Maildir' % maildir_root,
                           maildir_root]
            if options.dry_run:
                draino_args.insert(1, '--dry-run')
            draino = Draino(draino_args)

        if root is None:
            root, closer = get_root(app)
        #else: unit test

        set_subsystem('mailin')
        if options.run_draino:
            draino.run()
        runner = factory(root, maildir_root, options)
        runner()
        p_jar = getattr(root, '_p_jar', None)
        if p_jar is not None:
            # Attempt to fix memory leak
            p_jar.db().cacheMinimize()
        closer()

    if options.daemon:
        run_daemon('mailin', run, options.interval)
    else:
        run()
예제 #10
0
파일: mailin.py 프로젝트: cguardia/karl
def main2(argv=sys.argv[1:]):
    """ Version which uses repoze.postoffice.
    """
    logging.basicConfig()

    parser = optparse.OptionParser(
        description=__doc__,
        usage="%prog [options] maildir_root",
        )
    parser.add_option('-C', '--config', dest='config',
        help='Path to configuration file (defaults to $CWD/etc/karl.ini)',
        metavar='FILE')
    parser.add_option('--dry-run', '-n', dest='dry_run',
        action='store_true', default=False,
        help="Don't actually commit any transaction")
    parser.add_option('--verbose', '-v', dest='verbose',
        action='store_true', default=False,
        help="Output info level logging.")
    parser.add_option('--daemon', '-D', dest='daemon',
                      action='store_true', default=False,
                      help='Run in daemon mode.')
    parser.add_option('--interval', '-i', dest='interval', type='int',
                      default=300,
                      help='Interval, in seconds, between executions when in '
                           'daemon mode.')

    options, args = parser.parse_args(argv)

    if args:
        parser.error('Unknown arguments: %s' % ' '.join(args))

    config = options.config
    if config is None:
        config = get_default_config()
    app = loadapp('config:%s' % config, name='karl')

    log_level = logging.WARN
    if options.verbose:
        log_level = logging.INFO
    logging.getLogger('karl.mailin').setLevel(log_level)

    def run():
        root, closer = get_root(app)
        set_subsystem('mailin')

        zodb_uri = get_setting(root, 'postoffice.zodb_uri')
        zodb_path = get_setting(root, 'postoffice.zodb_path', '/postoffice')
        queue = get_setting(root, 'postoffice.queue')

        if zodb_uri is None:
            parser.error("postoffice.zodb_uri must be set in config file")

        if queue is None:
            parser.error("postoffice.queue must be set in config file")

        runner = MailinRunner2(root, zodb_uri, zodb_path, queue)
        try:
            runner()

            if options.dry_run:
                transaction.abort()
            else:
                transaction.commit()

            p_jar = getattr(root, '_p_jar', None)
            if p_jar is not None:
                # Attempt to fix memory leak
                p_jar.db().cacheMinimize()

        except:
            transaction.abort()
            raise

        finally:
            closer()
            runner.close()

    if options.daemon:
        run_daemon('mailin', run, options.interval)
    else:
        run()
예제 #11
0
def main(argv=sys.argv, root=None, update_func=update_feeds, tx=transaction):
    parser = optparse.OptionParser(description=__doc__)
    parser.add_option(
        '-C',
        '--config',
        dest='config',
        help='Path to configuration file (defaults to $CWD/etc/karl.ini)',
        metavar='FILE')
    parser.add_option('-f',
                      '--force',
                      dest='force',
                      action='store_true',
                      default=False,
                      help='Update all feeds, even if unchanged')
    parser.add_option('--dry-run',
                      dest='dryrun',
                      action='store_true',
                      default=False,
                      help="Don't actually commit the transaction")
    parser.add_option('--daemon',
                      '-D',
                      dest='daemon',
                      action='store_true',
                      default=False,
                      help='Run in daemon mode.')
    parser.add_option('--interval',
                      '-i',
                      dest='interval',
                      type='int',
                      default=300,
                      help='Interval, in seconds, between executions when in '
                      'daemon mode.')
    parser.add_option('--timeout',
                      '-t',
                      dest='timeout',
                      type='int',
                      default=None,
                      help='Timeout, in seconds, for URL requests.')
    options, args = parser.parse_args(argv[1:])

    if args:
        parser.error("Too many parameters: %s" % repr(args))

    config = options.config
    if config is None:
        config = get_default_config()
    if root is None:
        app = loadapp('config:%s' % config, name='karl')
    #else: unit test

    def run(root=root):
        closer = lambda: None  # unit test
        try:
            if root is None:
                root, closer = get_root(app)
            #else: unit test
            update_func(root, config, force=options.force)
        except:
            tx.abort()
            closer()
            raise
        else:
            if options.dryrun:
                tx.abort()
            else:
                tx.commit()
            closer()

    if options.timeout is not None:
        socket.setdefaulttimeout(options.timeout)

    if options.daemon:
        run_daemon('update_feeds', run, options.interval)
    else:
        run()
예제 #12
0
파일: update_feeds.py 프로젝트: hj91/karl
def main(argv=sys.argv, root=None, update_func=update_feeds, tx=transaction):
    parser = optparse.OptionParser(description=__doc__)
    parser.add_option(
        "-C",
        "--config",
        dest="config",
        help="Path to configuration file (defaults to $CWD/etc/karl.ini)",
        metavar="FILE",
    )
    parser.add_option(
        "-f", "--force", dest="force", action="store_true", default=False, help="Update all feeds, even if unchanged"
    )
    parser.add_option(
        "--dry-run", dest="dryrun", action="store_true", default=False, help="Don't actually commit the transaction"
    )
    parser.add_option("--daemon", "-D", dest="daemon", action="store_true", default=False, help="Run in daemon mode.")
    parser.add_option(
        "--interval",
        "-i",
        dest="interval",
        type="int",
        default=300,
        help="Interval, in seconds, between executions when in " "daemon mode.",
    )
    parser.add_option(
        "--timeout", "-t", dest="timeout", type="int", default=None, help="Timeout, in seconds, for URL requests."
    )
    options, args = parser.parse_args(argv[1:])

    if args:
        parser.error("Too many parameters: %s" % repr(args))

    config = options.config
    if config is None:
        config = get_default_config()
    if root is None:
        app = loadapp("config:%s" % config, name="karl")
    # else: unit test

    def run(root=root):
        closer = lambda: None  # unit test
        try:
            if root is None:
                root, closer = get_root(app)
            # else: unit test
            set_subsystem("update_feeds")
            update_func(root, config, force=options.force)
        except:
            tx.abort()
            closer()
            raise
        else:
            if options.dryrun:
                tx.abort()
            else:
                tx.commit()
            closer()

    if options.timeout is not None:
        socket.setdefaulttimeout(options.timeout)

    if options.daemon:
        run_daemon("update_feeds", run, options.interval)
    else:
        run()