def static(self, name): 'Serves static content' name = name.lower() fname = posixpath.basename(name) try: cherrypy.response.headers['Content-Type'] = { 'js': 'text/javascript', 'css': 'text/css', 'png': 'image/png', 'gif': 'image/gif', 'html': 'text/html', }[fname.rpartition('.')[-1].lower()] except KeyError: raise cherrypy.HTTPError(404, '%r not a valid resource type' % name) cherrypy.response.headers['Last-Modified'] = self.last_modified( self.build_time) basedir = os.path.abspath(P('content_server')) path = os.path.join(basedir, name.replace('/', os.sep)) path = os.path.abspath(path) if not path.startswith(basedir): raise cherrypy.HTTPError(403, 'Access to %s is forbidden' % name) if not os.path.exists(path) or not os.path.isfile(path): raise cherrypy.HTTPError(404, '%s not found' % name) if self.opts.develop: lm = fromtimestamp(os.stat(path).st_mtime) cherrypy.response.headers['Last-Modified'] = self.last_modified(lm) with open(path, 'rb') as f: ans = f.read() if path.endswith('.css'): ans = ans.replace('/static/', self.opts.url_prefix + '/static/') return ans
def static(self, name): 'Serves static content' name = name.lower() fname = posixpath.basename(name) try: cherrypy.response.headers['Content-Type'] = { 'js' : 'text/javascript', 'css' : 'text/css', 'png' : 'image/png', 'gif' : 'image/gif', 'html' : 'text/html', }[fname.rpartition('.')[-1].lower()] except KeyError: raise cherrypy.HTTPError(404, '%r not a valid resource type'%name) cherrypy.response.headers['Last-Modified'] = self.last_modified(self.build_time) basedir = os.path.abspath(P('content_server')) path = os.path.join(basedir, name.replace('/', os.sep)) path = os.path.abspath(path) if not path.startswith(basedir): raise cherrypy.HTTPError(403, 'Access to %s is forbidden'%name) if not os.path.exists(path) or not os.path.isfile(path): raise cherrypy.HTTPError(404, '%s not found'%name) if self.opts.develop: lm = fromtimestamp(os.stat(path).st_mtime) cherrypy.response.headers['Last-Modified'] = self.last_modified(lm) with open(path, 'rb') as f: ans = f.read() if path.endswith('.css'): ans = ans.replace('/static/', self.opts.url_prefix + '/static/') return ans
def make_app(): init_calibre() import handlers from calibre.db.legacy import LibraryDatabase from calibre.utils.date import fromtimestamp auth_db_path = CONF['user_database'] logging.info("Init library with [%s]" % options.with_library) logging.info("Init AuthDB with [%s]" % auth_db_path) logging.info("Init Static with [%s]" % CONF['static_path']) logging.info("Init HTML with [%s]" % CONF['html_path']) book_db = LibraryDatabase(os.path.expanduser(options.with_library)) cache = book_db.new_api # hook 1: 按字母作为第一级目录,解决书库子目录太多的问题 if CONF['BOOK_NAMES_FORMAT'].lower() == 'utf8': bind_utf8_book_names(cache) else: bind_topdir_book_names(cache) # hook 2: don't force GUI from calibre import gui2 old_must_use_qt = gui2.must_use_qt def new_must_use_qt(headless=True): try: old_must_use_qt(headless) except: pass gui2.must_use_qt = new_must_use_qt # build sql session factory engine = create_engine(auth_db_path, echo=False) ScopedSession = scoped_session( sessionmaker(bind=engine, autoflush=True, autocommit=False)) models.bind_session(ScopedSession) init_social(models.Base, ScopedSession, CONF) if options.syncdb: models.user_syncdb(engine) logging.info("Create tables into DB") sys.exit(0) path = CONF['static_path'] + '/calibre/default_cover.jpg' with open(path, 'rb') as cover_file: default_cover = cover_file.read() app_settings = dict(CONF) app_settings.update({ "legacy": book_db, "cache": cache, "ScopedSession": ScopedSession, "build_time": fromtimestamp(os.stat(path).st_mtime), "default_cover": default_cover, }) logging.info("Now, Running...") return web.Application( social_routes.SOCIAL_AUTH_ROUTES + handlers.routes(), **app_settings)
def initialize(self): self.session = self.settings['session'] self.session.close() self.db = self.settings['legacy'] self.cache = self.db.new_api path = self.settings['static_path'] + '/img/default_cover.jpg' self.build_time = fromtimestamp(os.stat(path).st_mtime) self.default_cover = open(path, 'rb').read() self.admin_user = None self.static_host = self.settings.get("static_host", "") if self.static_host: self.static_host = self.request.protocol + "://" + self.static_host
def __init__(self, db, opts, embedded=False, show_tracebacks=True, wsgi=False): self.is_wsgi = bool(wsgi) self.opts = opts self.embedded = embedded self.state_callback = None self.start_failure_callback = None try: self.max_cover_width, self.max_cover_height = \ map(int, self.opts.max_cover.split('x')) except: self.max_cover_width = 1200 self.max_cover_height = 1600 path = P('content_server') self.build_time = fromtimestamp(os.stat(path).st_mtime) self.default_cover = open(P('content_server/default_cover.jpg'), 'rb').read() if not opts.url_prefix: opts.url_prefix = '' cherrypy.engine.bonjour.ip_address = listen_on cherrypy.engine.bonjour.port = opts.port cherrypy.engine.bonjour.prefix = opts.url_prefix Cache.__init__(self) self.set_database(db) st = 0.1 if opts.develop else 1 cherrypy.config.update({ 'log.screen' : opts.develop, 'engine.autoreload_on' : getattr(opts, 'auto_reload', False), 'tools.log_headers.on' : opts.develop, 'tools.encode.encoding' : 'UTF-8', 'checker.on' : opts.develop, 'request.show_tracebacks': show_tracebacks, 'server.socket_host' : listen_on, 'server.socket_port' : opts.port, 'server.socket_timeout' : opts.timeout, #seconds 'server.thread_pool' : opts.thread_pool, # number of threads 'server.shutdown_timeout': st, # minutes }) if embedded or wsgi: cherrypy.config.update({'engine.SIGHUP' : None, 'engine.SIGTERM' : None,}) self.config = {} self.is_running = False self.exception = None auth_controller = None self.users_dict = {} #self.config['/'] = { # 'tools.sessions.on' : True, # 'tools.sessions.timeout': 60, # Session times out after 60 minutes #} if not wsgi: self.setup_loggers() cherrypy.engine.bonjour.subscribe() self.config['global'] = { 'tools.gzip.on' : True, 'tools.gzip.mime_types': ['text/html', 'text/plain', 'text/xml', 'text/javascript', 'text/css'], } if opts.password: self.users_dict[opts.username.strip()] = opts.password.strip() auth_controller = AuthController('Your calibre library', self.users_dict) self.__dispatcher__ = DispatchController(self.opts.url_prefix, wsgi=wsgi, auth_controller=auth_controller) for x in self.__class__.__bases__: if hasattr(x, 'add_routes'): x.__init__(self) x.add_routes(self, self.__dispatcher__) root_conf = self.config.get('/', {}) root_conf['request.dispatch'] = self.__dispatcher__.dispatcher self.config['/'] = root_conf
def __init__(self, db, opts, embedded=False, show_tracebacks=True, wsgi=False): self.is_wsgi = bool(wsgi) self.opts = opts self.embedded = embedded self.state_callback = None self.start_failure_callback = None try: self.max_cover_width, self.max_cover_height = \ map(int, self.opts.max_cover.split('x')) except: self.max_cover_width = 1200 self.max_cover_height = 1600 path = P('content_server') self.build_time = fromtimestamp(os.stat(path).st_mtime) self.default_cover = open(P('content_server/default_cover.jpg'), 'rb').read() if not opts.url_prefix: opts.url_prefix = '' cherrypy.engine.bonjour.ip_address = listen_on cherrypy.engine.bonjour.port = opts.port cherrypy.engine.bonjour.prefix = opts.url_prefix Cache.__init__(self) self.set_database(db) st = 0.1 if opts.develop else 1 cherrypy.config.update({ 'log.screen' : opts.develop, 'engine.autoreload_on' : getattr(opts, 'auto_reload', False), 'tools.log_headers.on' : opts.develop, 'tools.encode.encoding' : 'UTF-8', 'checker.on' : opts.develop, 'request.show_tracebacks': show_tracebacks, 'server.socket_host' : listen_on, 'server.socket_port' : opts.port, 'server.socket_timeout' : opts.timeout, # seconds 'server.thread_pool' : opts.thread_pool, # number of threads 'server.shutdown_timeout': st, # minutes }) if embedded or wsgi: cherrypy.config.update({'engine.SIGHUP' : None, 'engine.SIGTERM' : None,}) self.config = {} self.is_running = False self.exception = None auth_controller = None self.users_dict = {} # self.config['/'] = { # 'tools.sessions.on' : True, # 'tools.sessions.timeout': 60, # Session times out after 60 minutes #} if not wsgi: self.setup_loggers() cherrypy.engine.bonjour.subscribe() self.config['global'] = { 'tools.gzip.on' : True, 'tools.gzip.mime_types': ['text/html', 'text/plain', 'text/xml', 'text/javascript', 'text/css'], } if opts.username and opts.password: self.users_dict[opts.username.strip()] = opts.password.strip() auth_controller = AuthController('Your calibre library', self.users_dict) self.__dispatcher__ = DispatchController(self.opts.url_prefix, wsgi=wsgi, auth_controller=auth_controller) for x in self.__class__.__bases__: if hasattr(x, 'add_routes'): x.__init__(self) x.add_routes(self, self.__dispatcher__) root_conf = self.config.get('/', {}) root_conf['request.dispatch'] = self.__dispatcher__.dispatcher self.config['/'] = root_conf
def __init__(self, db, opts, embedded=False, show_tracebacks=True, wsgi=False): self.is_wsgi = bool(wsgi) self.opts = opts self.embedded = embedded self.state_callback = None self.start_failure_callback = None try: self.max_cover_width, self.max_cover_height = \ map(int, self.opts.max_cover.split('x')) except: self.max_cover_width = 1200 self.max_cover_height = 1600 path = P('content_server') self.build_time = fromtimestamp(os.stat(path).st_mtime) self.default_cover = open(P('content_server/m/img/default_cover.jpg'), 'rb').read() if not opts.url_prefix: opts.url_prefix = '' cherrypy.engine.bonjour.ip_address = listen_on cherrypy.engine.bonjour.port = opts.port cherrypy.engine.bonjour.prefix = opts.url_prefix self.last_lang = "en" self.all_langs = dict(get_all_translators()) cherrypy.request.hooks.attach('before_handler', self.update_lang) cherrypy.request.hooks.attach('before_handler', self.load_user) #cherrypy.request.hooks.attach('on_end_resource', self.save_session) #cherrypy.tools.authenticate = cherrypy.Tool('before_handler', self.load_user) #cherrypy.tools.session = cherrypy.Tool('on_end_resource', self.save_session) Cache.__init__(self) self.set_database(db) st = 1 if opts.develop else 1 cherrypy.config.update({ 'log.screen': opts.develop, 'engine.autoreload_on': getattr(opts, 'auto_reload', False), 'tools.log_headers.on': opts.develop, 'tools.encode.encoding': 'UTF-8', 'checker.on': opts.develop, 'request.show_tracebacks': show_tracebacks, 'server.socket_host': listen_on, 'server.socket_port': opts.port, 'server.socket_timeout': opts.timeout, # seconds 'server.thread_pool': opts.thread_pool, # number of threads 'server.shutdown_timeout': st, # minutes 'tools.sessions.on': True, #'tools.sessions.storage_type': 'ram', 'tools.sessions.timeout': 60000, # Session times out after 60 minutes 'tools.sessions.storage_type': "file", 'tools.sessions.storage_path': "/data/tmp/cherrypy/", 'SOCIAL_AUTH_USER_MODEL': 'calibre.library.server.auth.FuckUser', 'SOCIAL_AUTH_LOGIN_URL': '/auth/', 'SOCIAL_AUTH_LOGIN_REDIRECT_URL': '/', 'SOCIAL_AUTH_AUTHENTICATION_BACKENDS': ( 'social.backends.douban.DoubanOAuth', 'social.backends.douban.DoubanOAuth2', ), 'SOCIAL_AUTH_DOUBAN_OAUTH2_KEY': '052c9ac15e9870500f85d0441bc950f0', 'SOCIAL_AUTH_DOUBAN_OAUTH2_SECRET': '3b524f1487999fc6', }) cherrypy.tools.jinja2env = build_jinja2_env() if embedded or wsgi: cherrypy.config.update({ 'engine.SIGHUP': None, 'engine.SIGTERM': None, }) self.config = {} self.is_running = False self.exception = None auth_controller = None self.users_dict = {} if not wsgi: self.setup_loggers() cherrypy.engine.bonjour.subscribe() self.config['global'] = { 'tools.gzip.on': True, 'tools.gzip.mime_types': [ 'text/html', 'text/plain', 'text/xml', 'text/javascript', 'text/css' ], } if opts.username and opts.password: self.users_dict[opts.username.strip()] = opts.password.strip() auth_controller = AuthController('Your calibre library', self.users_dict) self.__dispatcher__ = DispatchController( self.opts.url_prefix, wsgi=wsgi, auth_controller=auth_controller) for x in self.__class__.__bases__: if hasattr(x, 'add_routes'): x.__init__(self) x.add_routes(self, self.__dispatcher__) root_conf = self.config.get('/', {}) root_conf['request.dispatch'] = self.__dispatcher__.dispatcher self.config['/'] = root_conf
def make_app(): init_calibre() import handlers from calibre.db.legacy import LibraryDatabase from calibre.utils.date import fromtimestamp auth_db_path = CONF['user_database'] logging.info("Init library with [%s]" % options.with_library) logging.info("Init AuthDB with [%s]" % auth_db_path ) logging.info("Init Static with [%s]" % CONF['static_path'] ) logging.info("Init HTML with [%s]" % CONF['html_path'] ) logging.info("Init LANG with [%s]" % P('localization/locales.zip') ) book_db = LibraryDatabase(os.path.expanduser(options.with_library)) cache = book_db.new_api # hook 1: 按字母作为第一级目录,解决书库子目录太多的问题 old_construct_path_name = cache.backend.construct_path_name def new_construct_path_name(*args, **kwargs): s = old_construct_path_name(*args, **kwargs) ns = s[0] + "/" + s logging.debug("new str = %s" % ns) return ns cache.backend.construct_path_name = new_construct_path_name # hook 2: don't force GUI from calibre import gui2 old_must_use_qt = gui2.must_use_qt def new_must_use_qt(headless=True): try: old_must_use_qt(headless) except: pass gui2.must_use_qt = new_must_use_qt # build sql session factory engine = create_engine(auth_db_path, echo=False) ScopedSession = scoped_session(sessionmaker(bind=engine, autoflush=True, autocommit=False)) models.bind_session(ScopedSession) init_social(models.Base, ScopedSession, CONF) if options.syncdb: models.user_syncdb(engine) logging.info("Create tables into DB") sys.exit(0) path = CONF['static_path'] + '/calibre/default_cover.jpg' app_settings = dict(CONF) app_settings.update({ "legacy": book_db, "cache": cache, "ScopedSession": ScopedSession , "build_time": fromtimestamp(os.stat(path).st_mtime), "default_cover": open(path, 'rb').read(), }) #load_calibre_translations() logging.info("Now, Running...") return web.Application( SOCIAL_AUTH_ROUTES + handlers.routes(), **app_settings)
def __init__(self, db, opts, embedded=False, show_tracebacks=True, wsgi=False): self.is_wsgi = bool(wsgi) self.opts = opts self.embedded = embedded self.state_callback = None self.start_failure_callback = None try: self.max_cover_width, self.max_cover_height = \ map(int, self.opts.max_cover.split('x')) except: self.max_cover_width = 1200 self.max_cover_height = 1600 path = P('content_server') self.build_time = fromtimestamp(os.stat(path).st_mtime) self.default_cover = open(P('content_server/m/img/default_cover.jpg'), 'rb').read() if not opts.url_prefix: opts.url_prefix = '' cherrypy.engine.bonjour.ip_address = listen_on cherrypy.engine.bonjour.port = opts.port cherrypy.engine.bonjour.prefix = opts.url_prefix self.last_lang = "en" self.all_langs = dict(get_all_translators()) cherrypy.request.hooks.attach('before_handler', self.update_lang) cherrypy.request.hooks.attach('before_handler', self.load_user) #cherrypy.request.hooks.attach('on_end_resource', self.save_session) #cherrypy.tools.authenticate = cherrypy.Tool('before_handler', self.load_user) #cherrypy.tools.session = cherrypy.Tool('on_end_resource', self.save_session) Cache.__init__(self) self.set_database(db) st = 1 if opts.develop else 1 cherrypy.config.update({ 'log.screen' : opts.develop, 'engine.autoreload_on' : getattr(opts, 'auto_reload', False), 'tools.log_headers.on' : opts.develop, 'tools.encode.encoding' : 'UTF-8', 'checker.on' : opts.develop, 'request.show_tracebacks': show_tracebacks, 'server.socket_host' : listen_on, 'server.socket_port' : opts.port, 'server.socket_timeout' : opts.timeout, # seconds 'server.thread_pool' : opts.thread_pool, # number of threads 'server.shutdown_timeout': st, # minutes 'tools.sessions.on' : True, #'tools.sessions.storage_type': 'ram', 'tools.sessions.timeout': 60000, # Session times out after 60 minutes 'tools.sessions.storage_type': "file", 'tools.sessions.storage_path': "/data/tmp/cherrypy/", 'SOCIAL_AUTH_USER_MODEL': 'calibre.library.server.auth.FuckUser', 'SOCIAL_AUTH_LOGIN_URL': '/auth/', 'SOCIAL_AUTH_LOGIN_REDIRECT_URL': '/', 'SOCIAL_AUTH_AUTHENTICATION_BACKENDS': ( 'social.backends.douban.DoubanOAuth', 'social.backends.douban.DoubanOAuth2', ), 'SOCIAL_AUTH_DOUBAN_OAUTH2_KEY': '052c9ac15e9870500f85d0441bc950f0', 'SOCIAL_AUTH_DOUBAN_OAUTH2_SECRET': '3b524f1487999fc6', }); cherrypy.tools.jinja2env = build_jinja2_env() if embedded or wsgi: cherrypy.config.update({'engine.SIGHUP' : None, 'engine.SIGTERM' : None,}) self.config = {} self.is_running = False self.exception = None auth_controller = None self.users_dict = {} if not wsgi: self.setup_loggers() cherrypy.engine.bonjour.subscribe() self.config['global'] = { 'tools.gzip.on' : True, 'tools.gzip.mime_types': ['text/html', 'text/plain', 'text/xml', 'text/javascript', 'text/css'], } if opts.username and opts.password: self.users_dict[opts.username.strip()] = opts.password.strip() auth_controller = AuthController('Your calibre library', self.users_dict) self.__dispatcher__ = DispatchController(self.opts.url_prefix, wsgi=wsgi, auth_controller=auth_controller) for x in self.__class__.__bases__: if hasattr(x, 'add_routes'): x.__init__(self) x.add_routes(self, self.__dispatcher__) root_conf = self.config.get('/', {}) root_conf['request.dispatch'] = self.__dispatcher__.dispatcher self.config['/'] = root_conf