1
0
mirror of https://github.com/webrecorder/pywb.git synced 2025-03-15 00:03:28 +01:00

wsgi server: default to gevent-based wsgi server for all cmd line server apps, add -s command for specifying server #201

cli: add 'webagg-server' cli command for running new webagg system
tests: fix cli test for gevent server
This commit is contained in:
Ilya Kreymer 2016-12-09 16:46:33 -08:00
parent 4f9b963e13
commit 50a3353da3
3 changed files with 51 additions and 17 deletions

View File

@ -1,9 +1,4 @@
import os
import logging
from argparse import ArgumentParser from argparse import ArgumentParser
from pywb.framework.wsgi_wrappers import init_app
from pywb.webapp.pywb_init import create_cdx_server_app, create_wb_router
#================================================================= #=================================================================
def cdx_server(args=None): #pragma: no cover def cdx_server(args=None): #pragma: no cover
@ -26,13 +21,18 @@ def wayback(args=None):
desc='pywb Wayback Web Archive Replay').run() desc='pywb Wayback Web Archive Replay').run()
#=============================================================================
def webagg():
WebaggCli().run()
#============================================================================= #=============================================================================
class BaseCli(object): class BaseCli(object):
def __init__(self, args=None, default_port=8080, desc=''): def __init__(self, args=None, default_port=8080, desc=''):
parser = ArgumentParser(description=desc) parser = ArgumentParser(description=desc)
parser.add_argument('-p', '--port', type=int, default=default_port) parser.add_argument('-p', '--port', type=int, default=default_port)
parser.add_argument('-t', '--threads', type=int, default=4) parser.add_argument('-t', '--threads', type=int, default=4)
parser.add_argument('-s', '--server') parser.add_argument('-s', '--server', default='gevent')
self.desc = desc self.desc = desc
@ -40,6 +40,17 @@ class BaseCli(object):
self.r = parser.parse_args(args) self.r = parser.parse_args(args)
if self.r.server == 'gevent':
try:
from gevent.monkey import patch_all; patch_all()
print('Using Gevent')
except:
print('No Gevent')
self.r.server = 'wsgiref'
from pywb.framework.wsgi_wrappers import init_app
self.init_app = init_app
self.application = self.load() self.application = self.load()
def _extend_parser(self, parser): #pragma: no cover def _extend_parser(self, parser): #pragma: no cover
@ -49,7 +60,9 @@ class BaseCli(object):
pass pass
def run(self): def run(self):
if self.r.server == 'waitress': #pragma: no cover if self.r.server == 'gevent': #pragma: no cover
self.run_gevent()
elif self.r.server == 'waitress': #pragma: no cover
self.run_waitress() self.run_waitress()
else: else:
self.run_wsgiref() self.run_wsgiref()
@ -63,6 +76,11 @@ class BaseCli(object):
from pywb.framework.wsgi_wrappers import start_wsgi_ref_server from pywb.framework.wsgi_wrappers import start_wsgi_ref_server
start_wsgi_ref_server(self.application, self.desc, port=self.r.port) start_wsgi_ref_server(self.application, self.desc, port=self.r.port)
def run_gevent(self):
from gevent.pywsgi import WSGIServer
print('Starting Gevent Server on ' + str(self.r.port))
WSGIServer(('', self.r.port), self.application).serve_forever()
#============================================================================= #=============================================================================
class LiveCli(BaseCli): class LiveCli(BaseCli):
@ -79,7 +97,8 @@ class LiveCli(BaseCli):
enable_auto_colls=False, enable_auto_colls=False,
collections={'live': '$liveweb'}) collections={'live': '$liveweb'})
return init_app(create_wb_router, load_yaml=False, config=config) from pywb.webapp.pywb_init import create_wb_router
return self.init_app(create_wb_router, load_yaml=False, config=config)
#============================================================================= #=============================================================================
@ -98,6 +117,9 @@ class ReplayCli(BaseCli):
def run(self): def run(self):
if self.r.autoindex: if self.r.autoindex:
from pywb.manager.manager import CollectionsManager from pywb.manager.manager import CollectionsManager
import os
import logging
m = CollectionsManager('', must_exist=False) m = CollectionsManager('', must_exist=False)
if not os.path.isdir(m.colls_dir): if not os.path.isdir(m.colls_dir):
msg = 'No managed directory "{0}" for auto-indexing' msg = 'No managed directory "{0}" for auto-indexing'
@ -114,17 +136,29 @@ class ReplayCli(BaseCli):
#============================================================================= #=============================================================================
class CdxCli(ReplayCli): #pragma: no cover class CdxCli(ReplayCli): #pragma: no cover
def load(self): def load(self):
from pywb.webapp.pywb_init import create_cdx_server_app
super(CdxCli, self).load() super(CdxCli, self).load()
return init_app(create_cdx_server_app, return self.init_app(create_cdx_server_app,
load_yaml=True) load_yaml=True)
#============================================================================= #=============================================================================
class WaybackCli(ReplayCli): class WaybackCli(ReplayCli):
def load(self): def load(self):
from pywb.webapp.pywb_init import create_wb_router
super(WaybackCli, self).load() super(WaybackCli, self).load()
return init_app(create_wb_router, return self.init_app(create_wb_router,
load_yaml=True) load_yaml=True)
#=============================================================================
class WebaggCli(BaseCli):
def load(self):
from pywb.apps.webagg import application
return application
def run(self):
self.run_gevent()
#============================================================================= #=============================================================================

View File

@ -107,6 +107,7 @@ setup(
live-rewrite-server = pywb.apps.cli:live_rewrite_server live-rewrite-server = pywb.apps.cli:live_rewrite_server
cdx-indexer = pywb.warc.cdxindexer:main cdx-indexer = pywb.warc.cdxindexer:main
wb-manager = pywb.manager.manager:main_wrap_exc wb-manager = pywb.manager.manager:main_wrap_exc
webagg-server = pywb.apps.cli:webagg
""", """,
classifiers=[ classifiers=[
'Development Status :: 4 - Beta', 'Development Status :: 4 - Beta',

View File

@ -80,25 +80,24 @@ class TestManagedColls(object):
def teardown(self): def teardown(self):
J2TemplateView.shared_jinja_env = None J2TemplateView.shared_jinja_env = None
#@patch('waitress.serve', lambda *args, **kwargs: None) @patch('pywb.apps.cli.BaseCli.run_gevent', lambda *args, **kwargs: None)
@patch('six.moves.BaseHTTPServer.HTTPServer.serve_forever', lambda *args, **kwargs: None)
def test_run_cli(self): def test_run_cli(self):
""" test new wayback cli interface """ test new wayback cli interface
test autoindex error before collections inited test autoindex error before collections inited
""" """
from pywb.apps.cli import wayback from pywb.apps.cli import wayback
wayback(['-p', '0']) wayback(['-p', '0', '-s', 'gevent'])
# Nothing to auto-index.. yet # Nothing to auto-index.. yet
with raises(SystemExit): with raises(SystemExit):
wayback(['-a', '-p', '0']) wayback(['-a', '-p', '0', '-s', 'gevent'])
colls = os.path.join(self.root_dir, 'collections') colls = os.path.join(self.root_dir, 'collections')
os.mkdir(colls) os.mkdir(colls)
pywb.manager.autoindex.keep_running = False pywb.manager.autoindex.keep_running = False
wayback(['-a', '-p', '0']) wayback(['-a', '-p', '0', '-s', 'gevent'])
def test_create_first_coll(self): def test_create_first_coll(self):
""" Test first collection creation, with all required dirs """ Test first collection creation, with all required dirs