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()
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()
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()
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.")
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()
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()
def _callFUT(self, *args, **kw): from karl.scripting import run_daemon return run_daemon(*args, **kw)
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()
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()
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()
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()