def load_ssl_certificate(self, certificate=None, private_key=None): if certificate and private_key: with open(sickrage.app.https_cert_file, 'w') as cert_out: cert_out.write(certificate) with open(sickrage.app.https_key_file, 'w') as key_out: key_out.write(private_key) else: if os.path.exists(sickrage.app.https_key_file) and os.path.exists(sickrage.app.https_cert_file): if self.is_certificate_valid() and not self.certificate_needs_renewal(): return True resp = sickrage.app.api.server.get_server_certificate(sickrage.app.config.general.server_id) if not resp or 'certificate' not in resp or 'private_key' not in resp: if not create_https_certificates(sickrage.app.https_cert_file, sickrage.app.https_key_file): return False if not os.path.exists(sickrage.app.https_cert_file) or not os.path.exists(sickrage.app.https_key_file): return False return True with open(sickrage.app.https_cert_file, 'w') as cert_out: cert_out.write(resp['certificate']) with open(sickrage.app.https_key_file, 'w') as key_out: key_out.write(resp['private_key']) sickrage.app.log.info("Loaded SSL certificate successfully, restarting server in 1 minute") if self.server: # restart after 1 minute IOLoop.current().add_timeout(datetime.timedelta(minutes=1), sickrage.app.restart) return True
def run(self): self.started = True # load languages tornado.locale.load_gettext_translations(sickrage.LOCALE_DIR, 'messages') # clear mako cache folder mako_cache = os.path.join(sickrage.app.cache_dir, 'mako') if os.path.isdir(mako_cache): shutil.rmtree(mako_cache) # video root if sickrage.app.config.root_dirs: root_dirs = sickrage.app.config.root_dirs.split('|') self.video_root = root_dirs[int(root_dirs[0]) + 1] # web root if sickrage.app.config.web_root: sickrage.app.config.web_root = sickrage.app.config.web_root = ( '/' + sickrage.app.config.web_root.lstrip('/').strip('/')) # api root self.api_root = r'%s/api/%s' % (sickrage.app.config.web_root, sickrage.app.config.api_key) # tornado setup if sickrage.app.config.enable_https: # If either the HTTPS certificate or key do not exist, make some self-signed ones. if not (sickrage.app.config.https_cert and os.path.exists( sickrage.app.config.https_cert)) or not ( sickrage.app.config.https_key and os.path.exists(sickrage.app.config.https_key)): if not create_https_certificates( sickrage.app.config.https_cert, sickrage.app.config.https_key): sickrage.app.log.info( "Unable to create CERT/KEY files, disabling HTTPS") sickrage.app.config.enable_https = False if not (os.path.exists(sickrage.app.config.https_cert) and os.path.exists(sickrage.app.config.https_key)): sickrage.app.log.warning( "Disabled HTTPS because of missing CERT and KEY files") sickrage.app.config.enable_https = False # Load the app self.app = Application( [ # api (r'%s(/?.*)' % self.api_root, ApiHandler), # redirect to web root (r"(?!%s)(.*)" % sickrage.app.config.web_root, RedirectHandler, { "url": "%s/{0}" % sickrage.app.config.web_root }), # api key (r'%s/getkey(/?.*)' % sickrage.app.config.web_root, KeyHandler ), # api builder (r'%s/api/builder' % sickrage.app.config.web_root, RedirectHandler, { "url": sickrage.app.config.web_root + '/apibuilder/' }), # login (r'%s/login(/?)' % sickrage.app.config.web_root, LoginHandler), # logout (r'%s/logout(/?)' % sickrage.app.config.web_root, LogoutHandler ), # calendar (r'%s/calendar' % sickrage.app.config.web_root, CalendarHandler ), # favicon (r'%s/(favicon\.ico)' % sickrage.app.config.web_root, StaticFileHandler, { "path": os.path.join(sickrage.app.config.gui_static_dir, 'images/favicon.ico') }), # images (r'%s/images/(.*)' % sickrage.app.config.web_root, StaticImageHandler, { "path": os.path.join(sickrage.app.config.gui_static_dir, 'images') }), # css (r'%s/css/(.*)' % sickrage.app.config.web_root, StaticFileHandler, { "path": os.path.join(sickrage.app.config.gui_static_dir, 'css') }), # scss (r'%s/scss/(.*)' % sickrage.app.config.web_root, StaticFileHandler, { "path": os.path.join(sickrage.app.config.gui_static_dir, 'scss') }), # fonts (r'%s/fonts/(.*)' % sickrage.app.config.web_root, StaticFileHandler, { "path": os.path.join(sickrage.app.config.gui_static_dir, 'fonts') }), # javascript (r'%s/js/(.*)' % sickrage.app.config.web_root, StaticFileHandler, { "path": os.path.join(sickrage.app.config.gui_static_dir, 'js') }), # videos (r'%s/videos/(.*)' % sickrage.app.config.web_root, StaticFileHandler, { "path": self.video_root }), ] + Route.get_routes(sickrage.app.config.web_root), debug=True, autoreload=False, gzip=sickrage.app.config.web_use_gzip, xheaders=sickrage.app.config.handle_reverse_proxy, cookie_secret=sickrage.app.config.web_cookie_secret, login_url='%s/login/' % sickrage.app.config.web_root) self.server = HTTPServer(self.app, no_keep_alive=True) if sickrage.app.config.enable_https: self.server.ssl_options = { "certfile": sickrage.app.config.https_cert, "keyfile": sickrage.app.config.https_key } try: self.server.listen(sickrage.app.config.web_port, None) sickrage.app.log.info("SiCKRAGE :: STARTED") sickrage.app.log.info("SiCKRAGE :: VERSION:[{}]".format( sickrage.app.version_updater.version)) sickrage.app.log.info("SiCKRAGE :: CONFIG:[{}] [v{}]".format( sickrage.app.config_file, sickrage.app.config.config_version)) sickrage.app.log.info("SiCKRAGE :: URL:[{}://{}:{}/]".format( ('http', 'https')[sickrage.app.config.enable_https], sickrage.app.config.web_host, sickrage.app.config.web_port)) # launch browser window if all([ not sickrage.app.no_launch, sickrage.app.config.launch_browser ]): threading.Thread( None, lambda: launch_browser( ('http', 'https')[sickrage.app.config.enable_https ], sickrage.app.config.web_host, sickrage.app.config.web_port), name="LAUNCH-BROWSER").start() sickrage.app.io_loop.start() except socket.error as e: sickrage.app.log.warning(e.strerror) raise SystemExit
def start(self): self.started = True # clear mako cache folder mako_cache = os.path.join(sickrage.CACHE_DIR, 'mako') if os.path.isdir(mako_cache): shutil.rmtree(mako_cache) # video root if sickrage.srCore.srConfig.ROOT_DIRS: root_dirs = sickrage.srCore.srConfig.ROOT_DIRS.split('|') self.video_root = root_dirs[int(root_dirs[0]) + 1] # web root if sickrage.srCore.srConfig.WEB_ROOT: sickrage.srCore.srConfig.WEB_ROOT = sickrage.srCore.srConfig.WEB_ROOT = ( '/' + sickrage.srCore.srConfig.WEB_ROOT.lstrip('/').strip('/')) # api root if not sickrage.srCore.srConfig.API_KEY: sickrage.srCore.srConfig.API_KEY = generateApiKey() self.api_root = r'%s/api/%s' % (sickrage.srCore.srConfig.WEB_ROOT, sickrage.srCore.srConfig.API_KEY) # tornado setup if sickrage.srCore.srConfig.ENABLE_HTTPS: # If either the HTTPS certificate or key do not exist, make some self-signed ones. if not (sickrage.srCore.srConfig.HTTPS_CERT and os.path.exists( sickrage.srCore.srConfig.HTTPS_CERT)) or not ( sickrage.srCore.srConfig.HTTPS_KEY and os.path.exists( sickrage.srCore.srConfig.HTTPS_KEY)): if not create_https_certificates( sickrage.srCore.srConfig.HTTPS_CERT, sickrage.srCore.srConfig.HTTPS_KEY): sickrage.srCore.srLogger.info( "Unable to create CERT/KEY files, disabling HTTPS") sickrage.srCore.srConfig.ENABLE_HTTPS = False if not (os.path.exists(sickrage.srCore.srConfig.HTTPS_CERT) and os.path.exists(sickrage.srCore.srConfig.HTTPS_KEY)): sickrage.srCore.srLogger.warning( "Disabled HTTPS because of missing CERT and KEY files") sickrage.srCore.srConfig.ENABLE_HTTPS = False # Load the app self.app = Application( [ # api (r'%s(/?.*)' % self.api_root, ApiHandler), # api key (r'%s/getkey(/?.*)' % sickrage.srCore.srConfig.WEB_ROOT, KeyHandler), # api builder (r'%s/api/builder' % sickrage.srCore.srConfig.WEB_ROOT, RedirectHandler, { "url": sickrage.srCore.srConfig.WEB_ROOT + '/apibuilder/' }), # login (r'%s/login(/?)' % sickrage.srCore.srConfig.WEB_ROOT, LoginHandler), # logout (r'%s/logout(/?)' % sickrage.srCore.srConfig.WEB_ROOT, LogoutHandler), # calendar (r'%s/calendar' % sickrage.srCore.srConfig.WEB_ROOT, CalendarHandler), # favicon (r'%s/(favicon\.ico)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, { "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'images/ico/favicon.ico') }), # images (r'%s/images/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticImageHandler, { "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'images') }), # css (r'%s/css/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, { "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'css') }), # scss (r'%s/scss/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, { "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'scss') }), # fonts (r'%s/fonts/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, { "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'fonts') }), # javascript (r'%s/js/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, { "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'js') }), # videos (r'%s/videos/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, { "path": self.video_root }), ] + Route.get_routes(sickrage.srCore.srConfig.WEB_ROOT), debug=sickrage.DEBUG, autoreload=False, gzip=sickrage.srCore.srConfig.WEB_USE_GZIP, xheaders=sickrage.srCore.srConfig.HANDLE_REVERSE_PROXY, cookie_secret=sickrage.srCore.srConfig.WEB_COOKIE_SECRET, login_url='%s/login/' % sickrage.srCore.srConfig.WEB_ROOT) self.server = HTTPServer(self.app, no_keep_alive=True) if sickrage.srCore.srConfig.ENABLE_HTTPS: self.server.ssl_options = { "certfile": sickrage.srCore.srConfig.HTTPS_CERT, "keyfile": sickrage.srCore.srConfig.HTTPS_KEY } try: self.server.listen(sickrage.srCore.srConfig.WEB_PORT, None) except socket.error as e: print(e.message) raise
def start(self): self.started = True # video root self.video_root = None if sickrage.srCore.srConfig.ROOT_DIRS: root_dirs = sickrage.srCore.srConfig.ROOT_DIRS.split('|') self.video_root = root_dirs[int(root_dirs[0]) + 1] # web root if sickrage.srCore.srConfig.WEB_ROOT: sickrage.srCore.srConfig.WEB_ROOT = sickrage.srCore.srConfig.WEB_ROOT = ( '/' + sickrage.srCore.srConfig.WEB_ROOT.lstrip('/').strip('/')) # api root if not sickrage.srCore.srConfig.API_KEY: sickrage.srCore.srConfig.API_KEY = generateApiKey() self.api_root = r'%s/api/%s' % (sickrage.srCore.srConfig.WEB_ROOT, sickrage.srCore.srConfig.API_KEY) # tornado setup if sickrage.srCore.srConfig.ENABLE_HTTPS: # If either the HTTPS certificate or key do not exist, make some self-signed ones. if not (sickrage.srCore.srConfig.HTTPS_CERT and os.path.exists( sickrage.srCore.srConfig.HTTPS_CERT)) or not ( sickrage.srCore.srConfig.HTTPS_KEY and os.path.exists( sickrage.srCore.srConfig.HTTPS_KEY)): if not create_https_certificates( sickrage.srCore.srConfig.HTTPS_CERT, sickrage.srCore.srConfig.HTTPS_KEY): sickrage.srCore.srLogger.info( "Unable to create CERT/KEY files, disabling HTTPS") sickrage.srCore.srConfig.ENABLE_HTTPS = False if not (os.path.exists(sickrage.srCore.srConfig.HTTPS_CERT) and os.path.exists(sickrage.srCore.srConfig.HTTPS_KEY)): sickrage.srCore.srLogger.warning( "Disabled HTTPS because of missing CERT and KEY files") sickrage.srCore.srConfig.ENABLE_HTTPS = False # Load the app self.app = Application( [], debug=False, autoreload=False, gzip=sickrage.srCore.srConfig.WEB_USE_GZIP, xheaders=sickrage.srCore.srConfig.HANDLE_REVERSE_PROXY, cookie_secret=sickrage.srCore.srConfig.WEB_COOKIE_SECRET, login_url='%s/login/' % sickrage.srCore.srConfig.WEB_ROOT) # Main Handlers self.app.add_handlers( '.*$', [ # webapi handler (r'%s(/?.*)' % self.api_root, ApiHandler), # webapi key retrieval (r'%s/getkey(/?.*)' % sickrage.srCore.srConfig.WEB_ROOT, KeyHandler), # webapi builder redirect (r'%s/api/builder' % sickrage.srCore.srConfig.WEB_ROOT, RedirectHandler, { "url": sickrage.srCore.srConfig.WEB_ROOT + '/apibuilder/' }), # webui login/logout handlers (r'%s/login(/?)' % sickrage.srCore.srConfig.WEB_ROOT, LoginHandler), (r'%s/logout(/?)' % sickrage.srCore.srConfig.WEB_ROOT, LogoutHandler), # webui handlers ] + Route.get_routes(sickrage.srCore.srConfig.WEB_ROOT)) # Web calendar handler (Needed because option Unprotected calendar) self.app.add_handlers('.*$', [ (r'%s/calendar' % sickrage.srCore.srConfig.WEB_ROOT, CalendarHandler), ]) # Static File Handlers self.app.add_handlers( ".*$", [ # favicon (r'%s/(favicon\.ico)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, { "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'images/ico/favicon.ico') }), # images (r'%s.*?/images/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticImageHandler, { "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'images') }), # css (r'%s/css/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, { "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'css') }), # scss (r'%s/scss/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, { "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'scss') }), # fonts (r'%s/fonts/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, { "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'fonts') }), # javascript (r'%s/js/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, { "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'js') }), # videos ] + [(r'%s/videos/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, { "path": self.video_root })]) self.server = HTTPServer(self.app, no_keep_alive=True) if sickrage.srCore.srConfig.ENABLE_HTTPS: self.server.ssl_options = { "certfile": sickrage.srCore.srConfig.HTTPS_CERT, "keyfile": sickrage.srCore.srConfig.HTTPS_KEY } try: self.server.listen(sickrage.srCore.srConfig.WEB_PORT, None) except socket.error as e: print(e.message) raise # launch browser window if all( [not sickrage.NOLAUNCH, sickrage.srCore.srConfig.LAUNCH_BROWSER]): threading.Thread( None, lambda: launch_browser( ('http', 'https')[sickrage.srCore.srConfig.ENABLE_HTTPS], get_lan_ip(), sickrage.srCore.srConfig.WEB_PORT)).start() # clear mako cache folder makocache = os.path.join(sickrage.srCore.srConfig.CACHE_DIR, 'mako') if os.path.isdir(makocache): shutil.rmtree(makocache) sickrage.srCore.srLogger.info("SiCKRAGE :: STARTED") sickrage.srCore.srLogger.info("SiCKRAGE :: VERSION:[{}]".format( sickrage.srCore.VERSIONUPDATER.updater.version)) sickrage.srCore.srLogger.info("SiCKRAGE :: CONFIG:[{}]".format( sickrage.CONFIG_FILE)) sickrage.srCore.srLogger.info("SiCKRAGE :: URL:[{}://{}:{}/]".format( ('http', 'https')[sickrage.srCore.srConfig.ENABLE_HTTPS], get_lan_ip(), sickrage.srCore.srConfig.WEB_PORT))
def run(self): self.started = True self.io_loop = IOLoop() # load languages tornado.locale.load_gettext_translations(sickrage.LOCALE_DIR, 'messages') # Check configured web port is correct if sickrage.app.config.web_port < 21 or sickrage.app.config.web_port > 65535: sickrage.app.config.web_port = 8081 # clear mako cache folder mako_cache = os.path.join(sickrage.app.cache_dir, 'mako') if os.path.isdir(mako_cache): shutil.rmtree(mako_cache, ignore_errors=True) # video root if sickrage.app.config.root_dirs: root_dirs = sickrage.app.config.root_dirs.split('|') self.video_root = root_dirs[int(root_dirs[0]) + 1] # web root if sickrage.app.config.web_root: sickrage.app.config.web_root = sickrage.app.config.web_root = ( '/' + sickrage.app.config.web_root.lstrip('/').strip('/')) # api root self.api_root = r'%s/api/%s' % (sickrage.app.config.web_root, sickrage.app.config.api_key) # tornado setup if sickrage.app.config.enable_https: # If either the HTTPS certificate or key do not exist, make some self-signed ones. if not create_https_certificates(sickrage.app.config.https_cert, sickrage.app.config.https_key): sickrage.app.log.info("Unable to create CERT/KEY files, disabling HTTPS") sickrage.app.config.enable_https = False if not (os.path.exists(sickrage.app.config.https_cert) and os.path.exists(sickrage.app.config.https_key)): sickrage.app.log.warning("Disabled HTTPS because of missing CERT and KEY files") sickrage.app.config.enable_https = False # Load templates mako_lookup = TemplateLookup( directories=[sickrage.app.config.gui_views_dir], module_directory=os.path.join(sickrage.app.cache_dir, 'mako'), filesystem_checks=True, strict_undefined=True, input_encoding='utf-8', output_encoding='utf-8', encoding_errors='replace' ) templates = {} for root, dirs, files in os.walk(sickrage.app.config.gui_views_dir): path = root.split(os.sep) for x in sickrage.app.config.gui_views_dir.split(os.sep): if x in path: del path[path.index(x)] for file in files: filename = '{}/{}'.format('/'.join(path), file).lstrip('/') templates[filename] = mako_lookup.get_template(filename) # Load the app self.app = Application( debug=True, autoreload=False, gzip=sickrage.app.config.web_use_gzip, cookie_secret=sickrage.app.config.web_cookie_secret, login_url='%s/login/' % sickrage.app.config.web_root, templates=templates, default_handler_class=NotFoundHandler ) # Websocket handler self.app.add_handlers('.*$', [ (r'%s/ws/ui' % sickrage.app.config.web_root, WebSocketUIHandler) ]) # Static File Handlers self.app.add_handlers('.*$', [ # api (r'%s/api/(\w{32})(/?.*)' % sickrage.app.config.web_root, ApiHandler), # redirect to home (r"(%s)(/?)" % sickrage.app.config.web_root, RedirectHandler, {"url": "%s/home" % sickrage.app.config.web_root}), # api builder (r'%s/api/builder' % sickrage.app.config.web_root, RedirectHandler, {"url": sickrage.app.config.web_root + '/apibuilder/'}), # login (r'%s/login(/?)' % sickrage.app.config.web_root, LoginHandler), # logout (r'%s/logout(/?)' % sickrage.app.config.web_root, LogoutHandler), # favicon (r'%s/(favicon\.ico)' % sickrage.app.config.web_root, StaticNoCacheFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'images/favicon.ico')}), # images (r'%s/images/(.*)' % sickrage.app.config.web_root, StaticImageHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'images')}), # css (r'%s/css/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'css')}), # scss (r'%s/scss/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'scss')}), # fonts (r'%s/fonts/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'fonts')}), # javascript (r'%s/js/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'js')}), # videos (r'%s/videos/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler, {"path": self.video_root}), ]) # Handlers self.app.add_handlers('.*$', [ (r'%s/robots.txt' % sickrage.app.config.web_root, RobotsDotTxtHandler), (r'%s/messages.po' % sickrage.app.config.web_root, MessagesDotPoHandler), (r'%s/quicksearch.json' % sickrage.app.config.web_root, QuicksearchDotJsonHandler), (r'%s/apibuilder(/?)' % sickrage.app.config.web_root, APIBulderHandler), (r'%s/setHomeLayout(/?)' % sickrage.app.config.web_root, SetHomeLayoutHandler), (r'%s/setPosterSortBy(/?)' % sickrage.app.config.web_root, SetPosterSortByHandler), (r'%s/setPosterSortDir(/?)' % sickrage.app.config.web_root, SetPosterSortDirHandler), (r'%s/setHistoryLayout(/?)' % sickrage.app.config.web_root, SetHistoryLayoutHandler), (r'%s/toggleDisplayShowSpecials(/?)' % sickrage.app.config.web_root, ToggleDisplayShowSpecialsHandler), (r'%s/toggleScheduleDisplayPaused(/?)' % sickrage.app.config.web_root, ToggleScheduleDisplayPausedHandler), (r'%s/setScheduleSort(/?)' % sickrage.app.config.web_root, SetScheduleSortHandler), (r'%s/forceSchedulerJob(/?)' % sickrage.app.config.web_root, ForceSchedulerJobHandler), (r'%s/announcements(/?)' % sickrage.app.config.web_root, AnnouncementsHandler), (r'%s/announcements/announcementCount(/?)' % sickrage.app.config.web_root, AnnouncementCountHandler), (r'%s/announcements/mark-seen(/?)' % sickrage.app.config.web_root, MarkAnnouncementSeenHandler), (r'%s/schedule(/?)' % sickrage.app.config.web_root, ScheduleHandler), (r'%s/setScheduleLayout(/?)' % sickrage.app.config.web_root, SetScheduleLayoutHandler), (r'%s/calendar(/?)' % sickrage.app.config.web_root, CalendarHandler), (r'%s/changelog(/?)' % sickrage.app.config.web_root, ChangelogHandler), (r'%s/account/link(/?)' % sickrage.app.config.web_root, AccountLinkHandler), (r'%s/account/unlink(/?)' % sickrage.app.config.web_root, AccountUnlinkHandler), (r'%s/account/is-linked(/?)' % sickrage.app.config.web_root, AccountIsLinkedHandler), (r'%s/history(/?)' % sickrage.app.config.web_root, HistoryHandler), (r'%s/history/clear(/?)' % sickrage.app.config.web_root, HistoryClearHandler), (r'%s/history/trim(/?)' % sickrage.app.config.web_root, HistoryTrimHandler), (r'%s/irc(/?)' % sickrage.app.config.web_root, IRCHandler), (r'%s/logs(/?)' % sickrage.app.config.web_root, LogsHandler), (r'%s/logs/errorCount(/?)' % sickrage.app.config.web_root, ErrorCountHandler), (r'%s/logs/warningCount(/?)' % sickrage.app.config.web_root, WarningCountHandler), (r'%s/logs/view(/?)' % sickrage.app.config.web_root, LogsViewHandler), (r'%s/logs/clearAll(/?)' % sickrage.app.config.web_root, LogsClearAllHanlder), (r'%s/logs/clearWarnings(/?)' % sickrage.app.config.web_root, LogsClearWarningsHanlder), (r'%s/logs/clearErrors(/?)' % sickrage.app.config.web_root, LogsClearErrorsHanlder), (r'%s/browser(/?)' % sickrage.app.config.web_root, WebFileBrowserHandler), (r'%s/browser/complete(/?)' % sickrage.app.config.web_root, WebFileBrowserCompleteHandler), (r'%s/home(/?)' % sickrage.app.config.web_root, HomeHandler), (r'%s/home/showProgress(/?)' % sickrage.app.config.web_root, ShowProgressHandler), (r'%s/home/is-alive(/?)' % sickrage.app.config.web_root, IsAliveHandler), (r'%s/home/testSABnzbd(/?)' % sickrage.app.config.web_root, TestSABnzbdHandler), (r'%s/home/testSynologyDSM(/?)' % sickrage.app.config.web_root, TestSynologyDSMHandler), (r'%s/home/testTorrent(/?)' % sickrage.app.config.web_root, TestTorrentHandler), (r'%s/home/testFreeMobile(/?)' % sickrage.app.config.web_root, TestFreeMobileHandler), (r'%s/home/testTelegram(/?)' % sickrage.app.config.web_root, TestTelegramHandler), (r'%s/home/testJoin(/?)' % sickrage.app.config.web_root, TestJoinHandler), (r'%s/home/testGrowl(/?)' % sickrage.app.config.web_root, TestGrowlHandler), (r'%s/home/testProwl(/?)' % sickrage.app.config.web_root, TestProwlHandler), (r'%s/home/testBoxcar2(/?)' % sickrage.app.config.web_root, TestBoxcar2Handler), (r'%s/home/testPushover(/?)' % sickrage.app.config.web_root, TestPushoverHandler), (r'%s/home/twitterStep1(/?)' % sickrage.app.config.web_root, TwitterStep1Handler), (r'%s/home/twitterStep2(/?)' % sickrage.app.config.web_root, TwitterStep2Handler), (r'%s/home/testTwitter(/?)' % sickrage.app.config.web_root, TestTwitterHandler), (r'%s/home/testTwilio(/?)' % sickrage.app.config.web_root, TestTwilioHandler), (r'%s/home/testSlack(/?)' % sickrage.app.config.web_root, TestSlackHandler), (r'%s/home/testAlexa(/?)' % sickrage.app.config.web_root, TestAlexaHandler), (r'%s/home/testDiscord(/?)' % sickrage.app.config.web_root, TestDiscordHandler), (r'%s/home/testKODI(/?)' % sickrage.app.config.web_root, TestKODIHandler), (r'%s/home/testPMC(/?)' % sickrage.app.config.web_root, TestPMCHandler), (r'%s/home/testPMS(/?)' % sickrage.app.config.web_root, TestPMSHandler), (r'%s/home/testLibnotify(/?)' % sickrage.app.config.web_root, TestLibnotifyHandler), (r'%s/home/testEMBY(/?)' % sickrage.app.config.web_root, TestEMBYHandler), (r'%s/home/testNMJ(/?)' % sickrage.app.config.web_root, TestNMJHandler), (r'%s/home/settingsNMJ(/?)' % sickrage.app.config.web_root, SettingsNMJHandler), (r'%s/home/testNMJv2(/?)' % sickrage.app.config.web_root, TestNMJv2Handler), (r'%s/home/settingsNMJv2(/?)' % sickrage.app.config.web_root, SettingsNMJv2Handler), (r'%s/home/getTraktToken(/?)' % sickrage.app.config.web_root, GetTraktTokenHandler), (r'%s/home/testTrakt(/?)' % sickrage.app.config.web_root, TestTraktHandler), (r'%s/home/loadShowNotifyLists(/?)' % sickrage.app.config.web_root, LoadShowNotifyListsHandler), (r'%s/home/saveShowNotifyList(/?)' % sickrage.app.config.web_root, SaveShowNotifyListHandler), (r'%s/home/testEmail(/?)' % sickrage.app.config.web_root, TestEmailHandler), (r'%s/home/testNMA(/?)' % sickrage.app.config.web_root, TestNMAHandler), (r'%s/home/testPushalot(/?)' % sickrage.app.config.web_root, TestPushalotHandler), (r'%s/home/testPushbullet(/?)' % sickrage.app.config.web_root, TestPushbulletHandler), (r'%s/home/getPushbulletDevices(/?)' % sickrage.app.config.web_root, GetPushbulletDevicesHandler), (r'%s/home/serverStatus(/?)' % sickrage.app.config.web_root, ServerStatusHandler), (r'%s/home/providerStatus(/?)' % sickrage.app.config.web_root, ProviderStatusHandler), (r'%s/home/shutdown(/?)' % sickrage.app.config.web_root, ShutdownHandler), (r'%s/home/restart(/?)' % sickrage.app.config.web_root, RestartHandler), (r'%s/home/updateCheck(/?)' % sickrage.app.config.web_root, UpdateCheckHandler), (r'%s/home/update(/?)' % sickrage.app.config.web_root, UpdateHandler), (r'%s/home/verifyPath(/?)' % sickrage.app.config.web_root, VerifyPathHandler), (r'%s/home/installRequirements(/?)' % sickrage.app.config.web_root, InstallRequirementsHandler), (r'%s/home/branchCheckout(/?)' % sickrage.app.config.web_root, BranchCheckoutHandler), (r'%s/home/displayShow(/?)' % sickrage.app.config.web_root, DisplayShowHandler), (r'%s/home/togglePause(/?)' % sickrage.app.config.web_root, TogglePauseHandler), (r'%s/home/deleteShow' % sickrage.app.config.web_root, DeleteShowHandler), (r'%s/home/refreshShow(/?)' % sickrage.app.config.web_root, RefreshShowHandler), (r'%s/home/updateShow(/?)' % sickrage.app.config.web_root, UpdateShowHandler), (r'%s/home/subtitleShow(/?)' % sickrage.app.config.web_root, SubtitleShowHandler), (r'%s/home/updateKODI(/?)' % sickrage.app.config.web_root, UpdateKODIHandler), (r'%s/home/updatePLEX(/?)' % sickrage.app.config.web_root, UpdatePLEXHandler), (r'%s/home/updateEMBY(/?)' % sickrage.app.config.web_root, UpdateEMBYHandler), (r'%s/home/syncTrakt(/?)' % sickrage.app.config.web_root, SyncTraktHandler), (r'%s/home/deleteEpisode(/?)' % sickrage.app.config.web_root, DeleteEpisodeHandler), (r'%s/home/testRename(/?)' % sickrage.app.config.web_root, TestRenameHandler), (r'%s/home/doRename(/?)' % sickrage.app.config.web_root, DoRenameHandler), (r'%s/home/searchEpisode(/?)' % sickrage.app.config.web_root, SearchEpisodeHandler), (r'%s/home/getManualSearchStatus(/?)' % sickrage.app.config.web_root, GetManualSearchStatusHandler), (r'%s/home/searchEpisodeSubtitles(/?)' % sickrage.app.config.web_root, SearchEpisodeSubtitlesHandler), (r'%s/home/setSceneNumbering(/?)' % sickrage.app.config.web_root, SetSceneNumberingHandler), (r'%s/home/retryEpisode(/?)' % sickrage.app.config.web_root, RetryEpisodeHandler), (r'%s/home/fetch_releasegroups(/?)' % sickrage.app.config.web_root, FetchReleasegroupsHandler), (r'%s/home/postprocess(/?)' % sickrage.app.config.web_root, HomePostProcessHandler), (r'%s/home/postprocess/processEpisode(/?)' % sickrage.app.config.web_root, HomeProcessEpisodeHandler), (r'%s/home/addShows(/?)' % sickrage.app.config.web_root, HomeAddShowsHandler), (r'%s/home/addShows/searchIndexersForShowName(/?)' % sickrage.app.config.web_root, SearchIndexersForShowNameHandler), (r'%s/home/addShows/massAddTable(/?)' % sickrage.app.config.web_root, MassAddTableHandler), (r'%s/home/addShows/newShow(/?)' % sickrage.app.config.web_root, NewShowHandler), (r'%s/home/addShows/traktShows(/?)' % sickrage.app.config.web_root, TraktShowsHandler), (r'%s/home/addShows/popularShows(/?)' % sickrage.app.config.web_root, PopularShowsHandler), (r'%s/home/addShows/addShowToBlacklist(/?)' % sickrage.app.config.web_root, AddShowToBlacklistHandler), (r'%s/home/addShows/existingShows(/?)' % sickrage.app.config.web_root, ExistingShowsHandler), (r'%s/home/addShows/addShowByID(/?)' % sickrage.app.config.web_root, AddShowByIDHandler), (r'%s/home/addShows/addNewShow(/?)' % sickrage.app.config.web_root, AddNewShowHandler), (r'%s/home/addShows/addExistingShows(/?)' % sickrage.app.config.web_root, AddExistingShowsHandler), (r'%s/manage(/?)' % sickrage.app.config.web_root, ManageHandler), (r'%s/manage/editShow(/?)' % sickrage.app.config.web_root, EditShowHandler), (r'%s/manage/showEpisodeStatuses(/?)' % sickrage.app.config.web_root, ShowEpisodeStatusesHandler), (r'%s/manage/episodeStatuses(/?)' % sickrage.app.config.web_root, EpisodeStatusesHandler), (r'%s/manage/changeEpisodeStatuses(/?)' % sickrage.app.config.web_root, ChangeEpisodeStatusesHandler), (r'%s/manage/setEpisodeStatus(/?)' % sickrage.app.config.web_root, SetEpisodeStatusHandler), (r'%s/manage/showSubtitleMissed(/?)' % sickrage.app.config.web_root, ShowSubtitleMissedHandler), (r'%s/manage/subtitleMissed(/?)' % sickrage.app.config.web_root, SubtitleMissedHandler), (r'%s/manage/downloadSubtitleMissed(/?)' % sickrage.app.config.web_root, DownloadSubtitleMissedHandler), (r'%s/manage/backlogShow(/?)' % sickrage.app.config.web_root, BacklogShowHandler), (r'%s/manage/backlogOverview(/?)' % sickrage.app.config.web_root, BacklogOverviewHandler), (r'%s/manage/massEdit(/?)' % sickrage.app.config.web_root, MassEditHandler), (r'%s/manage/massUpdate(/?)' % sickrage.app.config.web_root, MassUpdateHandler), (r'%s/manage/failedDownloads(/?)' % sickrage.app.config.web_root, FailedDownloadsHandler), (r'%s/manage/manageQueues(/?)' % sickrage.app.config.web_root, ManageQueuesHandler), (r'%s/manage/manageQueues/forceBacklogSearch(/?)' % sickrage.app.config.web_root, ForceBacklogSearchHandler), (r'%s/manage/manageQueues/forceDailySearch(/?)' % sickrage.app.config.web_root, ForceDailySearchHandler), (r'%s/manage/manageQueues/forceFindPropers(/?)' % sickrage.app.config.web_root, ForceFindPropersHandler), (r'%s/manage/manageQueues/pauseDailySearcher(/?)' % sickrage.app.config.web_root, PauseDailySearcherHandler), (r'%s/manage/manageQueues/pauseBacklogSearcher(/?)' % sickrage.app.config.web_root, PauseBacklogSearcherHandler), (r'%s/manage/manageQueues/pausePostProcessor(/?)' % sickrage.app.config.web_root, PausePostProcessorHandler), (r'%s/config(/?)' % sickrage.app.config.web_root, ConfigHandler), (r'%s/config/reset(/?)' % sickrage.app.config.web_root, ConfigResetHandler), (r'%s/config/anime(/?)' % sickrage.app.config.web_root, ConfigAnimeHandler), (r'%s/config/anime/saveAnime(/?)' % sickrage.app.config.web_root, ConfigSaveAnimeHandler), (r'%s/config/backuprestore(/?)' % sickrage.app.config.web_root, ConfigBackupRestoreHandler), (r'%s/config/backuprestore/backup(/?)' % sickrage.app.config.web_root, ConfigBackupHandler), (r'%s/config/backuprestore/restore(/?)' % sickrage.app.config.web_root, ConfigRestoreHandler), (r'%s/config/backuprestore/saveBackupRestore(/?)' % sickrage.app.config.web_root, SaveBackupRestoreHandler), (r'%s/config/general(/?)' % sickrage.app.config.web_root, ConfigGeneralHandler), (r'%s/config/general/generateApiKey(/?)' % sickrage.app.config.web_root, GenerateApiKeyHandler), (r'%s/config/general/saveRootDirs(/?)' % sickrage.app.config.web_root, SaveRootDirsHandler), (r'%s/config/general/saveAddShowDefaults(/?)' % sickrage.app.config.web_root, SaveAddShowDefaultsHandler), (r'%s/config/general/saveGeneral(/?)' % sickrage.app.config.web_root, SaveGeneralHandler), (r'%s/config/notifications(/?)' % sickrage.app.config.web_root, ConfigNotificationsHandler), (r'%s/config/notifications/saveNotifications(/?)' % sickrage.app.config.web_root, SaveNotificationsHandler), (r'%s/config/postProcessing(/?)' % sickrage.app.config.web_root, ConfigPostProcessingHandler), (r'%s/config/postProcessing/savePostProcessing(/?)' % sickrage.app.config.web_root, SavePostProcessingHandler), (r'%s/config/postProcessing/testNaming(/?)' % sickrage.app.config.web_root, TestNamingHandler), (r'%s/config/postProcessing/isNamingValid(/?)' % sickrage.app.config.web_root, IsNamingPatternValidHandler), (r'%s/config/postProcessing/isRarSupported(/?)' % sickrage.app.config.web_root, IsRarSupportedHandler), (r'%s/config/providers(/?)' % sickrage.app.config.web_root, ConfigProvidersHandler), (r'%s/config/providers/canAddNewznabProvider(/?)' % sickrage.app.config.web_root, CanAddNewznabProviderHandler), (r'%s/config/providers/canAddTorrentRssProvider(/?)' % sickrage.app.config.web_root, CanAddTorrentRssProviderHandler), (r'%s/config/providers/getNewznabCategories(/?)' % sickrage.app.config.web_root, GetNewznabCategoriesHandler), (r'%s/config/providers/saveProviders(/?)' % sickrage.app.config.web_root, SaveProvidersHandler), (r'%s/config/qualitySettings(/?)' % sickrage.app.config.web_root, ConfigQualitySettingsHandler), (r'%s/config/qualitySettings/saveQualities(/?)' % sickrage.app.config.web_root, SaveQualitiesHandler), (r'%s/config/search(/?)' % sickrage.app.config.web_root, ConfigSearchHandler), (r'%s/config/search/saveSearch(/?)' % sickrage.app.config.web_root, SaveSearchHandler), (r'%s/config/subtitles(/?)' % sickrage.app.config.web_root, ConfigSubtitlesHandler), (r'%s/config/subtitles/get_code(/?)' % sickrage.app.config.web_root, ConfigSubtitleGetCodeHandler), (r'%s/config/subtitles/wanted_languages(/?)' % sickrage.app.config.web_root, ConfigSubtitlesWantedLanguagesHandler), (r'%s/config/subtitles/saveSubtitles(/?)' % sickrage.app.config.web_root, SaveSubtitlesHandler), ]) # HTTPS Cert/Key object ssl_ctx = None if sickrage.app.config.enable_https: ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_ctx.load_cert_chain(sickrage.app.config.https_cert, sickrage.app.config.https_key) # Web Server self.server = HTTPServer(self.app, ssl_options=ssl_ctx, xheaders=sickrage.app.config.handle_reverse_proxy) try: self.server.listen(sickrage.app.config.web_port) except socket.error as e: sickrage.app.log.warning(e.strerror) raise SystemExit self.io_loop.start()
def run(self): self.started = True self.io_loop = IOLoop() # load languages tornado.locale.load_gettext_translations(sickrage.LOCALE_DIR, 'messages') # Check configured web port is correct if sickrage.app.config.general.web_port < 21 or sickrage.app.config.general.web_port > 65535: sickrage.app.config.general.web_port = 8081 # clear mako cache folder mako_cache = os.path.join(sickrage.app.cache_dir, 'mako') if os.path.isdir(mako_cache): shutil.rmtree(mako_cache, ignore_errors=True) # video root if sickrage.app.config.general.root_dirs: root_dirs = sickrage.app.config.general.root_dirs.split('|') self.video_root = root_dirs[int(root_dirs[0]) + 1] # web root if sickrage.app.config.general.web_root: sickrage.app.config.general.web_root = sickrage.app.config.general.web_root = ( '/' + sickrage.app.config.general.web_root.lstrip('/').strip('/')) # api root self.api_v1_root = fr'{sickrage.app.config.general.web_root}/api/(?:v1/)?{sickrage.app.config.general.api_v1_key}' self.api_v2_root = fr'{sickrage.app.config.general.web_root}/api/v2' # tornado setup if sickrage.app.config.general.enable_https: # If either the HTTPS certificate or key do not exist, make some self-signed ones. if not create_https_certificates( sickrage.app.config.general.https_cert, sickrage.app.config.general.https_key): sickrage.app.log.info( "Unable to create CERT/KEY files, disabling HTTPS") sickrage.app.config.general.enable_https = False if not (os.path.exists(sickrage.app.config.general.https_cert) and os.path.exists(sickrage.app.config.general.https_key)): sickrage.app.log.warning( "Disabled HTTPS because of missing CERT and KEY files") sickrage.app.config.general.enable_https = False # Load templates mako_lookup = TemplateLookup(directories=[sickrage.app.gui_views_dir], module_directory=os.path.join( sickrage.app.cache_dir, 'mako'), filesystem_checks=True, strict_undefined=True, input_encoding='utf-8', output_encoding='utf-8', encoding_errors='replace') templates = {} for root, dirs, files in os.walk(sickrage.app.gui_views_dir): path = root.split(os.sep) for x in sickrage.app.gui_views_dir.split(os.sep): if x in path: del path[path.index(x)] for file in files: filename = '{}/{}'.format('/'.join(path), file).lstrip('/') templates[filename] = mako_lookup.get_template(filename) # Websocket handler self.handlers['websocket_handlers'] = [ (fr'{sickrage.app.config.general.web_root}/ws/ui', WebSocketUIHandler) ] # API v1 Handlers self.handlers['api_v1_handlers'] = [ # api (fr'{self.api_v1_root}(/?.*)', ApiHandler), # api builder (fr'{sickrage.app.config.general.web_root}/api/builder', RedirectHandler, { "url": sickrage.app.config.general.web_root + '/apibuilder/' }), ] # API v2 Handlers self.handlers['api_v2_handlers'] = [ (fr'{self.api_v2_root}/ping', ApiPingHandler), (fr'{self.api_v2_root}/swagger.json', ApiSwaggerDotJsonHandler, { 'api_handlers': 'api_v2_handlers', 'api_version': '2.0.0' }), (fr'{self.api_v2_root}/config', ApiV2ConfigHandler), (fr'{self.api_v2_root}/file-browser', ApiV2FileBrowserHandler), (fr'{self.api_v2_root}/postprocess', Apiv2PostProcessHandler), (fr'{self.api_v2_root}/retrieve-series-metadata', ApiV2RetrieveSeriesMetadataHandler), (fr'{self.api_v2_root}/schedule', ApiV2ScheduleHandler), (fr'{self.api_v2_root}/series-providers', ApiV2SeriesProvidersHandler), (fr'{self.api_v2_root}/series-providers/([a-z]+)/search', ApiV2SeriesProvidersSearchHandler), (fr'{self.api_v2_root}/series-providers/([a-z]+)/languages', ApiV2SeriesProvidersLanguagesHandler), (fr'{self.api_v2_root}/series', ApiV2SeriesHandler), (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)', ApiV2SeriesHandler), (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/episodes', ApiV2SeriesEpisodesHandler), (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/images', ApiV2SeriesImagesHandler), (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/imdb-info', ApiV2SeriesImdbInfoHandler), (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/blacklist', ApiV2SeriesBlacklistHandler), (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/whitelist', ApiV2SeriesWhitelistHandler), (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/refresh', ApiV2SeriesRefreshHandler), (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/update', ApiV2SeriesUpdateHandler), (fr'{self.api_v2_root}/episodes/rename', ApiV2EpisodesRenameHandler), (fr'{self.api_v2_root}/episodes/(\d+[-][a-z]+)/search', ApiV2EpisodesManualSearchHandler), ] # New UI Static File Handlers self.handlers['new_ui_static_file_handlers'] = [ # media (fr'{sickrage.app.config.general.web_root}/app/static/media/(.*)', StaticImageHandler, { "path": os.path.join(sickrage.app.gui_app_dir, 'static', 'media') }), # css (fr'{sickrage.app.config.general.web_root}/app/static/css/(.*)', StaticNoCacheFileHandler, { "path": os.path.join(sickrage.app.gui_app_dir, 'static', 'css') }), # js (fr'{sickrage.app.config.general.web_root}/app/static/js/(.*)', StaticNoCacheFileHandler, { "path": os.path.join(sickrage.app.gui_app_dir, 'static', 'js') }), # base (fr"{sickrage.app.config.general.web_root}/app/(.*)", tornado.web.StaticFileHandler, { "path": sickrage.app.gui_app_dir, "default_filename": "index.html" }) ] # Static File Handlers self.handlers['static_file_handlers'] = [ # redirect to home (fr"({sickrage.app.config.general.web_root})(/?)", RedirectHandler, { "url": f"{sickrage.app.config.general.web_root}/home" }), # login (fr'{sickrage.app.config.general.web_root}/login(/?)', LoginHandler ), # logout (fr'{sickrage.app.config.general.web_root}/logout(/?)', LogoutHandler), # favicon (fr'{sickrage.app.config.general.web_root}/(favicon\.ico)', StaticNoCacheFileHandler, { "path": os.path.join(sickrage.app.gui_static_dir, 'images/favicon.ico') }), # images (fr'{sickrage.app.config.general.web_root}/images/(.*)', StaticImageHandler, { "path": os.path.join(sickrage.app.gui_static_dir, 'images') }), # css (fr'{sickrage.app.config.general.web_root}/css/(.*)', StaticNoCacheFileHandler, { "path": os.path.join(sickrage.app.gui_static_dir, 'css') }), # scss (fr'{sickrage.app.config.general.web_root}/scss/(.*)', StaticNoCacheFileHandler, { "path": os.path.join(sickrage.app.gui_static_dir, 'scss') }), # fonts (fr'{sickrage.app.config.general.web_root}/fonts/(.*)', StaticNoCacheFileHandler, { "path": os.path.join(sickrage.app.gui_static_dir, 'fonts') }), # javascript (fr'{sickrage.app.config.general.web_root}/js/(.*)', StaticNoCacheFileHandler, { "path": os.path.join(sickrage.app.gui_static_dir, 'js') }), # videos (fr'{sickrage.app.config.general.web_root}/videos/(.*)', StaticNoCacheFileHandler, { "path": self.video_root }), ] # Handlers self.handlers['web_handlers'] = [ (fr'{sickrage.app.config.general.web_root}/robots.txt', RobotsDotTxtHandler), (fr'{sickrage.app.config.general.web_root}/messages.po', MessagesDotPoHandler), (fr'{sickrage.app.config.general.web_root}/quicksearch.json', QuicksearchDotJsonHandler), (fr'{sickrage.app.config.general.web_root}/apibuilder(/?)', APIBulderHandler), (fr'{sickrage.app.config.general.web_root}/setHomeLayout(/?)', SetHomeLayoutHandler), (fr'{sickrage.app.config.general.web_root}/setPosterSortBy(/?)', SetPosterSortByHandler), (fr'{sickrage.app.config.general.web_root}/setPosterSortDir(/?)', SetPosterSortDirHandler), (fr'{sickrage.app.config.general.web_root}/setHistoryLayout(/?)', SetHistoryLayoutHandler), (fr'{sickrage.app.config.general.web_root}/toggleDisplayShowSpecials(/?)', ToggleDisplayShowSpecialsHandler), (fr'{sickrage.app.config.general.web_root}/toggleScheduleDisplayPaused(/?)', ToggleScheduleDisplayPausedHandler), (fr'{sickrage.app.config.general.web_root}/setScheduleSort(/?)', SetScheduleSortHandler), (fr'{sickrage.app.config.general.web_root}/forceSchedulerJob(/?)', ForceSchedulerJobHandler), (fr'{sickrage.app.config.general.web_root}/announcements(/?)', AnnouncementsHandler), (fr'{sickrage.app.config.general.web_root}/announcements/announcementCount(/?)', AnnouncementCountHandler), (fr'{sickrage.app.config.general.web_root}/announcements/mark-seen(/?)', MarkAnnouncementSeenHandler), (fr'{sickrage.app.config.general.web_root}/schedule(/?)', ScheduleHandler), (fr'{sickrage.app.config.general.web_root}/setScheduleLayout(/?)', SetScheduleLayoutHandler), (fr'{sickrage.app.config.general.web_root}/calendar(/?)', CalendarHandler), (fr'{sickrage.app.config.general.web_root}/changelog(/?)', ChangelogHandler), (fr'{sickrage.app.config.general.web_root}/account/link(/?)', AccountLinkHandler), (fr'{sickrage.app.config.general.web_root}/account/unlink(/?)', AccountUnlinkHandler), (fr'{sickrage.app.config.general.web_root}/account/is-linked(/?)', AccountIsLinkedHandler), (fr'{sickrage.app.config.general.web_root}/history(/?)', HistoryHandler), (fr'{sickrage.app.config.general.web_root}/history/clear(/?)', HistoryClearHandler), (fr'{sickrage.app.config.general.web_root}/history/trim(/?)', HistoryTrimHandler), (fr'{sickrage.app.config.general.web_root}/logs(/?)', LogsHandler), (fr'{sickrage.app.config.general.web_root}/logs/errorCount(/?)', ErrorCountHandler), (fr'{sickrage.app.config.general.web_root}/logs/warningCount(/?)', WarningCountHandler), (fr'{sickrage.app.config.general.web_root}/logs/view(/?)', LogsViewHandler), (fr'{sickrage.app.config.general.web_root}/logs/clearAll(/?)', LogsClearAllHanlder), (fr'{sickrage.app.config.general.web_root}/logs/clearWarnings(/?)', LogsClearWarningsHanlder), (fr'{sickrage.app.config.general.web_root}/logs/clearErrors(/?)', LogsClearErrorsHanlder), (fr'{sickrage.app.config.general.web_root}/browser(/?)', WebFileBrowserHandler), (fr'{sickrage.app.config.general.web_root}/browser/complete(/?)', WebFileBrowserCompleteHandler), (fr'{sickrage.app.config.general.web_root}/home(/?)', HomeHandler), (fr'{sickrage.app.config.general.web_root}/home/showProgress(/?)', ShowProgressHandler), (fr'{sickrage.app.config.general.web_root}/home/is-alive(/?)', IsAliveHandler), (fr'{sickrage.app.config.general.web_root}/home/testSABnzbd(/?)', TestSABnzbdHandler), (fr'{sickrage.app.config.general.web_root}/home/testSynologyDSM(/?)', TestSynologyDSMHandler), (fr'{sickrage.app.config.general.web_root}/home/testTorrent(/?)', TestTorrentHandler), (fr'{sickrage.app.config.general.web_root}/home/testFreeMobile(/?)', TestFreeMobileHandler), (fr'{sickrage.app.config.general.web_root}/home/testTelegram(/?)', TestTelegramHandler), (fr'{sickrage.app.config.general.web_root}/home/testJoin(/?)', TestJoinHandler), (fr'{sickrage.app.config.general.web_root}/home/testGrowl(/?)', TestGrowlHandler), (fr'{sickrage.app.config.general.web_root}/home/testProwl(/?)', TestProwlHandler), (fr'{sickrage.app.config.general.web_root}/home/testBoxcar2(/?)', TestBoxcar2Handler), (fr'{sickrage.app.config.general.web_root}/home/testPushover(/?)', TestPushoverHandler), (fr'{sickrage.app.config.general.web_root}/home/twitterStep1(/?)', TwitterStep1Handler), (fr'{sickrage.app.config.general.web_root}/home/twitterStep2(/?)', TwitterStep2Handler), (fr'{sickrage.app.config.general.web_root}/home/testTwitter(/?)', TestTwitterHandler), (fr'{sickrage.app.config.general.web_root}/home/testTwilio(/?)', TestTwilioHandler), (fr'{sickrage.app.config.general.web_root}/home/testSlack(/?)', TestSlackHandler), (fr'{sickrage.app.config.general.web_root}/home/testAlexa(/?)', TestAlexaHandler), (fr'{sickrage.app.config.general.web_root}/home/testDiscord(/?)', TestDiscordHandler), (fr'{sickrage.app.config.general.web_root}/home/testKODI(/?)', TestKODIHandler), (fr'{sickrage.app.config.general.web_root}/home/testPMC(/?)', TestPMCHandler), (fr'{sickrage.app.config.general.web_root}/home/testPMS(/?)', TestPMSHandler), (fr'{sickrage.app.config.general.web_root}/home/testLibnotify(/?)', TestLibnotifyHandler), (fr'{sickrage.app.config.general.web_root}/home/testEMBY(/?)', TestEMBYHandler), (fr'{sickrage.app.config.general.web_root}/home/testNMJ(/?)', TestNMJHandler), (fr'{sickrage.app.config.general.web_root}/home/settingsNMJ(/?)', SettingsNMJHandler), (fr'{sickrage.app.config.general.web_root}/home/testNMJv2(/?)', TestNMJv2Handler), (fr'{sickrage.app.config.general.web_root}/home/settingsNMJv2(/?)', SettingsNMJv2Handler), (fr'{sickrage.app.config.general.web_root}/home/getTraktToken(/?)', GetTraktTokenHandler), (fr'{sickrage.app.config.general.web_root}/home/testTrakt(/?)', TestTraktHandler), (fr'{sickrage.app.config.general.web_root}/home/loadShowNotifyLists(/?)', LoadShowNotifyListsHandler), (fr'{sickrage.app.config.general.web_root}/home/saveShowNotifyList(/?)', SaveShowNotifyListHandler), (fr'{sickrage.app.config.general.web_root}/home/testEmail(/?)', TestEmailHandler), (fr'{sickrage.app.config.general.web_root}/home/testNMA(/?)', TestNMAHandler), (fr'{sickrage.app.config.general.web_root}/home/testPushalot(/?)', TestPushalotHandler), (fr'{sickrage.app.config.general.web_root}/home/testPushbullet(/?)', TestPushbulletHandler), (fr'{sickrage.app.config.general.web_root}/home/getPushbulletDevices(/?)', GetPushbulletDevicesHandler), (fr'{sickrage.app.config.general.web_root}/home/serverStatus(/?)', ServerStatusHandler), (fr'{sickrage.app.config.general.web_root}/home/providerStatus(/?)', ProviderStatusHandler), (fr'{sickrage.app.config.general.web_root}/home/shutdown(/?)', ShutdownHandler), (fr'{sickrage.app.config.general.web_root}/home/restart(/?)', RestartHandler), (fr'{sickrage.app.config.general.web_root}/home/updateCheck(/?)', UpdateCheckHandler), (fr'{sickrage.app.config.general.web_root}/home/update(/?)', UpdateHandler), (fr'{sickrage.app.config.general.web_root}/home/verifyPath(/?)', VerifyPathHandler), (fr'{sickrage.app.config.general.web_root}/home/installRequirements(/?)', InstallRequirementsHandler), (fr'{sickrage.app.config.general.web_root}/home/branchCheckout(/?)', BranchCheckoutHandler), (fr'{sickrage.app.config.general.web_root}/home/displayShow(/?)', DisplayShowHandler), (fr'{sickrage.app.config.general.web_root}/home/togglePause(/?)', TogglePauseHandler), (fr'{sickrage.app.config.general.web_root}/home/deleteShow', DeleteShowHandler), (fr'{sickrage.app.config.general.web_root}/home/refreshShow(/?)', RefreshShowHandler), (fr'{sickrage.app.config.general.web_root}/home/updateShow(/?)', UpdateShowHandler), (fr'{sickrage.app.config.general.web_root}/home/subtitleShow(/?)', SubtitleShowHandler), (fr'{sickrage.app.config.general.web_root}/home/updateKODI(/?)', UpdateKODIHandler), (fr'{sickrage.app.config.general.web_root}/home/updatePLEX(/?)', UpdatePLEXHandler), (fr'{sickrage.app.config.general.web_root}/home/updateEMBY(/?)', UpdateEMBYHandler), (fr'{sickrage.app.config.general.web_root}/home/syncTrakt(/?)', SyncTraktHandler), (fr'{sickrage.app.config.general.web_root}/home/deleteEpisode(/?)', DeleteEpisodeHandler), (fr'{sickrage.app.config.general.web_root}/home/testRename(/?)', TestRenameHandler), (fr'{sickrage.app.config.general.web_root}/home/doRename(/?)', DoRenameHandler), (fr'{sickrage.app.config.general.web_root}/home/searchEpisode(/?)', SearchEpisodeHandler), (fr'{sickrage.app.config.general.web_root}/home/getManualSearchStatus(/?)', GetManualSearchStatusHandler), (fr'{sickrage.app.config.general.web_root}/home/searchEpisodeSubtitles(/?)', SearchEpisodeSubtitlesHandler), (fr'{sickrage.app.config.general.web_root}/home/setSceneNumbering(/?)', SetSceneNumberingHandler), (fr'{sickrage.app.config.general.web_root}/home/retryEpisode(/?)', RetryEpisodeHandler), (fr'{sickrage.app.config.general.web_root}/home/fetch_releasegroups(/?)', FetchReleasegroupsHandler), (fr'{sickrage.app.config.general.web_root}/home/postprocess(/?)', HomePostProcessHandler), (fr'{sickrage.app.config.general.web_root}/home/postprocess/processEpisode(/?)', HomeProcessEpisodeHandler), (fr'{sickrage.app.config.general.web_root}/home/addShows(/?)', HomeAddShowsHandler), (fr'{sickrage.app.config.general.web_root}/home/addShows/searchSeriesProviderForShowName(/?)', SearchSeriesProviderForShowNameHandler), (fr'{sickrage.app.config.general.web_root}/home/addShows/massAddTable(/?)', MassAddTableHandler), (fr'{sickrage.app.config.general.web_root}/home/addShows/newShow(/?)', NewShowHandler), (fr'{sickrage.app.config.general.web_root}/home/addShows/traktShows(/?)', TraktShowsHandler), (fr'{sickrage.app.config.general.web_root}/home/addShows/popularShows(/?)', PopularShowsHandler), (fr'{sickrage.app.config.general.web_root}/home/addShows/addShowToBlacklist(/?)', AddShowToBlacklistHandler), (fr'{sickrage.app.config.general.web_root}/home/addShows/existingShows(/?)', ExistingShowsHandler), (fr'{sickrage.app.config.general.web_root}/home/addShows/addShowByID(/?)', AddShowByIDHandler), (fr'{sickrage.app.config.general.web_root}/home/addShows/addNewShow(/?)', AddNewShowHandler), (fr'{sickrage.app.config.general.web_root}/home/addShows/addExistingShows(/?)', AddExistingShowsHandler), (fr'{sickrage.app.config.general.web_root}/manage(/?)', ManageHandler), (fr'{sickrage.app.config.general.web_root}/manage/editShow(/?)', EditShowHandler), (fr'{sickrage.app.config.general.web_root}/manage/showEpisodeStatuses(/?)', ShowEpisodeStatusesHandler), (fr'{sickrage.app.config.general.web_root}/manage/episodeStatuses(/?)', EpisodeStatusesHandler), (fr'{sickrage.app.config.general.web_root}/manage/changeEpisodeStatuses(/?)', ChangeEpisodeStatusesHandler), (fr'{sickrage.app.config.general.web_root}/manage/setEpisodeStatus(/?)', SetEpisodeStatusHandler), (fr'{sickrage.app.config.general.web_root}/manage/showSubtitleMissed(/?)', ShowSubtitleMissedHandler), (fr'{sickrage.app.config.general.web_root}/manage/subtitleMissed(/?)', SubtitleMissedHandler), (fr'{sickrage.app.config.general.web_root}/manage/downloadSubtitleMissed(/?)', DownloadSubtitleMissedHandler), (fr'{sickrage.app.config.general.web_root}/manage/backlogShow(/?)', BacklogShowHandler), (fr'{sickrage.app.config.general.web_root}/manage/backlogOverview(/?)', BacklogOverviewHandler), (fr'{sickrage.app.config.general.web_root}/manage/massEdit(/?)', MassEditHandler), (fr'{sickrage.app.config.general.web_root}/manage/massUpdate(/?)', MassUpdateHandler), (fr'{sickrage.app.config.general.web_root}/manage/failedDownloads(/?)', FailedDownloadsHandler), (fr'{sickrage.app.config.general.web_root}/manage/manageQueues(/?)', ManageQueuesHandler), (fr'{sickrage.app.config.general.web_root}/manage/manageQueues/forceBacklogSearch(/?)', ForceBacklogSearchHandler), (fr'{sickrage.app.config.general.web_root}/manage/manageQueues/forceDailySearch(/?)', ForceDailySearchHandler), (fr'{sickrage.app.config.general.web_root}/manage/manageQueues/forceFindPropers(/?)', ForceFindPropersHandler), (fr'{sickrage.app.config.general.web_root}/manage/manageQueues/pauseDailySearcher(/?)', PauseDailySearcherHandler), (fr'{sickrage.app.config.general.web_root}/manage/manageQueues/pauseBacklogSearcher(/?)', PauseBacklogSearcherHandler), (fr'{sickrage.app.config.general.web_root}/manage/manageQueues/pausePostProcessor(/?)', PausePostProcessorHandler), (fr'{sickrage.app.config.general.web_root}/config(/?)', ConfigWebHandler), (fr'{sickrage.app.config.general.web_root}/config/reset(/?)', ConfigResetHandler), (fr'{sickrage.app.config.general.web_root}/config/anime(/?)', ConfigAnimeHandler), (fr'{sickrage.app.config.general.web_root}/config/anime/saveAnime(/?)', ConfigSaveAnimeHandler), (fr'{sickrage.app.config.general.web_root}/config/backuprestore(/?)', ConfigBackupRestoreHandler), (fr'{sickrage.app.config.general.web_root}/config/backuprestore/backup(/?)', ConfigBackupHandler), (fr'{sickrage.app.config.general.web_root}/config/backuprestore/restore(/?)', ConfigRestoreHandler), (fr'{sickrage.app.config.general.web_root}/config/backuprestore/saveBackupRestore(/?)', SaveBackupRestoreHandler), (fr'{sickrage.app.config.general.web_root}/config/general(/?)', ConfigGeneralHandler), (fr'{sickrage.app.config.general.web_root}/config/general/generateApiKey(/?)', GenerateApiKeyHandler), (fr'{sickrage.app.config.general.web_root}/config/general/saveRootDirs(/?)', SaveRootDirsHandler), (fr'{sickrage.app.config.general.web_root}/config/general/saveAddShowDefaults(/?)', SaveAddShowDefaultsHandler), (fr'{sickrage.app.config.general.web_root}/config/general/saveGeneral(/?)', SaveGeneralHandler), (fr'{sickrage.app.config.general.web_root}/config/notifications(/?)', ConfigNotificationsHandler), (fr'{sickrage.app.config.general.web_root}/config/notifications/saveNotifications(/?)', SaveNotificationsHandler), (fr'{sickrage.app.config.general.web_root}/config/postProcessing(/?)', ConfigPostProcessingHandler), (fr'{sickrage.app.config.general.web_root}/config/postProcessing/savePostProcessing(/?)', SavePostProcessingHandler), (fr'{sickrage.app.config.general.web_root}/config/postProcessing/testNaming(/?)', TestNamingHandler), (fr'{sickrage.app.config.general.web_root}/config/postProcessing/isNamingValid(/?)', IsNamingPatternValidHandler), (fr'{sickrage.app.config.general.web_root}/config/postProcessing/isRarSupported(/?)', IsRarSupportedHandler), (fr'{sickrage.app.config.general.web_root}/config/providers(/?)', ConfigProvidersHandler), (fr'{sickrage.app.config.general.web_root}/config/providers/canAddNewznabProvider(/?)', CanAddNewznabProviderHandler), (fr'{sickrage.app.config.general.web_root}/config/providers/canAddTorrentRssProvider(/?)', CanAddTorrentRssProviderHandler), (fr'{sickrage.app.config.general.web_root}/config/providers/getNewznabCategories(/?)', GetNewznabCategoriesHandler), (fr'{sickrage.app.config.general.web_root}/config/providers/saveProviders(/?)', SaveProvidersHandler), (fr'{sickrage.app.config.general.web_root}/config/qualitySettings(/?)', ConfigQualitySettingsHandler), (fr'{sickrage.app.config.general.web_root}/config/qualitySettings/saveQualities(/?)', SaveQualitiesHandler), (fr'{sickrage.app.config.general.web_root}/config/search(/?)', ConfigSearchHandler), (fr'{sickrage.app.config.general.web_root}/config/search/saveSearch(/?)', SaveSearchHandler), (fr'{sickrage.app.config.general.web_root}/config/subtitles(/?)', ConfigSubtitlesHandler), (fr'{sickrage.app.config.general.web_root}/config/subtitles/get_code(/?)', ConfigSubtitleGetCodeHandler), (fr'{sickrage.app.config.general.web_root}/config/subtitles/wanted_languages(/?)', ConfigSubtitlesWantedLanguagesHandler), (fr'{sickrage.app.config.general.web_root}/config/subtitles/saveSubtitles(/?)', SaveSubtitlesHandler), ] # Initialize Tornado application self.app = Application( handlers=sum(self.handlers.values(), []), debug=True, autoreload=False, gzip=sickrage.app.config.general.web_use_gzip, cookie_secret=sickrage.app.config.general.web_cookie_secret, login_url='%s/login/' % sickrage.app.config.general.web_root, templates=templates, default_handler_class=NotFoundHandler) # HTTPS Cert/Key object ssl_ctx = None if sickrage.app.config.general.enable_https: ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_ctx.load_cert_chain(sickrage.app.config.general.https_cert, sickrage.app.config.general.https_key) # Web Server self.server = HTTPServer( self.app, ssl_options=ssl_ctx, xheaders=sickrage.app.config.general.handle_reverse_proxy) try: self.server.listen(sickrage.app.config.general.web_port, sickrage.app.web_host) except socket.error as e: sickrage.app.log.warning(e.strerror) raise SystemExit # launch browser window if not sickrage.app.no_launch and sickrage.app.config.general.launch_browser: sickrage.app.scheduler.add_job( launch_browser, args=[('http', 'https')[sickrage.app.config.general.enable_https], (get_internal_ip(), sickrage.app.web_host)[sickrage.app.web_host != ''], sickrage.app.config.general.web_port]) sickrage.app.log.info("SiCKRAGE :: STARTED") sickrage.app.log.info( f"SiCKRAGE :: APP VERSION:[{sickrage.version()}]") sickrage.app.log.info( f"SiCKRAGE :: CONFIG VERSION:[v{sickrage.app.config.db.version}]") sickrage.app.log.info( f"SiCKRAGE :: DATABASE VERSION:[v{sickrage.app.main_db.version}]") sickrage.app.log.info( f"SiCKRAGE :: DATABASE TYPE:[{sickrage.app.db_type}]") sickrage.app.log.info( f"SiCKRAGE :: URL:[{('http', 'https')[sickrage.app.config.general.enable_https]}://{(get_internal_ip(), sickrage.app.web_host)[sickrage.app.web_host != '']}:{sickrage.app.config.general.web_port}/{sickrage.app.config.general.web_root}]" ) self.io_loop.start()
def __init__(self, **kwargs): self.running = True self.restart = False self.io_loop = IOLoop.instance() self.options = {} self.options.setdefault('port', 8081) self.options.setdefault('host', '0.0.0.0') self.options.setdefault('log_dir', None) self.options.setdefault('username', '') self.options.setdefault('password', '') self.options.setdefault('web_root', '/') self.options.setdefault('stop_timeout', 3) self.options.update(kwargs) # video root if sickrage.ROOT_DIRS: root_dirs = sickrage.ROOT_DIRS.split('|') self.video_root = root_dirs[int(root_dirs[0]) + 1] else: self.video_root = None # web root if self.options[b'web_root']: sickrage.WEB_ROOT = self.options[b'web_root'] = ('/' + self.options[b'web_root'].lstrip('/').strip('/')) # api root if not sickrage.API_KEY: sickrage.API_KEY = generateApiKey() self.options[b'api_root'] = r'%s/api/%s' % (sickrage.WEB_ROOT, sickrage.API_KEY) # tornado setup self.enable_https = self.options[b'enable_https'] self.https_cert = self.options[b'https_cert'] self.https_key = self.options[b'https_key'] if self.enable_https: # If either the HTTPS certificate or key do not exist, make some self-signed ones. if not (self.https_cert and os.path.exists(self.https_cert)) or not ( self.https_key and os.path.exists(self.https_key)): if not create_https_certificates(self.https_cert, self.https_key): sickrage.LOGGER.info("Unable to create CERT/KEY files, disabling HTTPS") sickrage.ENABLE_HTTPS = False self.enable_https = False if not (os.path.exists(self.https_cert) and os.path.exists(self.https_key)): sickrage.LOGGER.warning("Disabled HTTPS because of missing CERT and KEY files") sickrage.ENABLE_HTTPS = False self.enable_https = False # Load the app self.app = Application([], debug=sickrage.DEBUG, autoreload=False, gzip=sickrage.WEB_USE_GZIP, xheaders=sickrage.HANDLE_REVERSE_PROXY, cookie_secret=sickrage.WEB_COOKIE_SECRET, login_url='%s/login/' % self.options[b'web_root'], ) # Main Handlers self.app.add_handlers('.*$', [ # webapi handler (r'%s(/?.*)' % self.options[b'api_root'], ApiHandler), # webapi key retrieval (r'%s/getkey(/?.*)' % self.options[b'web_root'], KeyHandler), # webapi builder redirect (r'%s/api/builder' % self.options[b'web_root'], RedirectHandler, {"url": self.options[b'web_root'] + '/apibuilder/'}), # webui login/logout handlers (r'%s/login(/?)' % self.options[b'web_root'], LoginHandler), (r'%s/logout(/?)' % self.options[b'web_root'], LogoutHandler), # webui handlers ] + route.get_routes(self.options[b'web_root'])) # Web calendar handler (Needed because option Unprotected calendar) self.app.add_handlers('.*$', [ (r'%s/calendar' % self.options[b'web_root'], CalendarHandler), ]) # Static File Handlers self.app.add_handlers(".*$", [ # favicon (r'%s/(favicon\.ico)' % self.options[b'web_root'], StaticFileHandler, {"path": os.path.join(self.options[b'gui_root'], 'images/ico/favicon.ico')}), # images (r'%s.*?/images/(.*)' % self.options[b'web_root'], StaticImageHandler, {"path": os.path.join(self.options[b'gui_root'], 'images')}), # css (r'%s/css/(.*)' % self.options[b'web_root'], StaticFileHandler, {"path": os.path.join(self.options[b'gui_root'], 'css')}), # javascript (r'%s/js/(.*)' % self.options[b'web_root'], StaticFileHandler, {"path": os.path.join(self.options[b'gui_root'], 'js')}), # videos ] + [(r'%s/videos/(.*)' % self.options[b'web_root'], StaticFileHandler, {"path": self.video_root})]) # daemonize sickrage if sickrage.DAEMONIZE: import daemon ctx = daemon.DaemonContext() ctx.initgroups = False ctx.open() # write sickrage pidfile sickrage.PID = os.getpid() if sickrage.CREATEPID: with file(sickrage.PIDFILE, 'w+') as pf: pf.write(str(sickrage.PID)) self.io_loop.add_callback(sickrage.Scheduler.start)
def start(self): self.started = True # load languages tornado.locale.load_gettext_translations(sickrage.LOCALE_DIR, 'messages') # clear mako cache folder mako_cache = os.path.join(sickrage.app.cache_dir, 'mako') if os.path.isdir(mako_cache): shutil.rmtree(mako_cache) # video root if sickrage.app.config.root_dirs: root_dirs = sickrage.app.config.root_dirs.split('|') self.video_root = root_dirs[int(root_dirs[0]) + 1] # web root if sickrage.app.config.web_root: sickrage.app.config.web_root = sickrage.app.config.web_root = ( '/' + sickrage.app.config.web_root.lstrip('/').strip('/')) # api root self.api_root = r'%s/api/%s' % (sickrage.app.config.web_root, sickrage.app.config.api_key) # tornado setup if sickrage.app.config.enable_https: # If either the HTTPS certificate or key do not exist, make some self-signed ones. if not ( sickrage.app.config.https_cert and os.path.exists( sickrage.app.config.https_cert)) or not ( sickrage.app.config.https_key and os.path.exists(sickrage.app.config.https_key)): if not create_https_certificates(sickrage.app.config.https_cert, sickrage.app.config.https_key): sickrage.app.log.info("Unable to create CERT/KEY files, disabling HTTPS") sickrage.app.config.enable_https = False if not (os.path.exists(sickrage.app.config.https_cert) and os.path.exists( sickrage.app.config.https_key)): sickrage.app.log.warning("Disabled HTTPS because of missing CERT and KEY files") sickrage.app.config.enable_https = False # Load the app self.app = Application( debug=True, autoreload=False, gzip=sickrage.app.config.web_use_gzip, cookie_secret=sickrage.app.config.web_cookie_secret, login_url='%s/login/' % sickrage.app.config.web_root) # Websocket handler self.app.add_handlers(".*$", [ (r'%s/ws/ui' % sickrage.app.config.web_root, WebSocketUIHandler) ]) # Static File Handlers self.app.add_handlers('.*$', [ # api (r'%s/api/(\w{32})(/?.*)' % sickrage.app.config.web_root, ApiHandler), # redirect to home (r"(%s)" % sickrage.app.config.web_root, RedirectHandler, {"url": "%s/home" % sickrage.app.config.web_root}), # api builder (r'%s/api/builder' % sickrage.app.config.web_root, RedirectHandler, {"url": sickrage.app.config.web_root + '/apibuilder/'}), # login (r'%s/login(/?)' % sickrage.app.config.web_root, LoginHandler), # logout (r'%s/logout(/?)' % sickrage.app.config.web_root, LogoutHandler), # calendar (r'%s/calendar' % sickrage.app.config.web_root, CalendarHandler), # favicon (r'%s/(favicon\.ico)' % sickrage.app.config.web_root, StaticNoCacheFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'images/favicon.ico')}), # images (r'%s/images/(.*)' % sickrage.app.config.web_root, StaticImageHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'images')}), # css (r'%s/css/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'css')}), # scss (r'%s/scss/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'scss')}), # fonts (r'%s/fonts/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'fonts')}), # javascript (r'%s/js/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'js')}), # videos (r'%s/videos/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler, {"path": self.video_root}), ]) # Web Handlers self.app.add_handlers('.*$', Route.get_routes(sickrage.app.config.web_root)) # HTTPS Cert/Key object ssl_ctx = None if sickrage.app.config.enable_https: ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_ctx.load_cert_chain(sickrage.app.config.https_cert, sickrage.app.config.https_key) # Web Server self.server = HTTPServer(self.app, ssl_options=ssl_ctx, xheaders=sickrage.app.config.handle_reverse_proxy) try: self.server.listen(sickrage.app.config.web_port) sickrage.app.log.info( "SiCKRAGE :: STARTED") sickrage.app.log.info( "SiCKRAGE :: VERSION:[{}]".format(sickrage.version())) sickrage.app.log.info( "SiCKRAGE :: CONFIG:[{}] [v{}]".format(sickrage.app.config_file, sickrage.app.config.config_version)) sickrage.app.log.info( "SiCKRAGE :: DATABASE:[v{}]".format(sickrage.app.main_db.version)) sickrage.app.log.info( "SiCKRAGE :: URL:[{}://{}:{}{}]".format(('http', 'https')[sickrage.app.config.enable_https], sickrage.app.config.web_host, sickrage.app.config.web_port, sickrage.app.config.web_root)) except socket.error as e: sickrage.app.log.warning(e.strerror) raise SystemExit
def __init__(self, **kwargs): self.running = True self.restart = False self.io_loop = IOLoop.instance() self.options = {} self.options.setdefault('port', 8081) self.options.setdefault('host', '0.0.0.0') self.options.setdefault('log_dir', None) self.options.setdefault('username', '') self.options.setdefault('password', '') self.options.setdefault('web_root', '/') self.options.setdefault('stop_timeout', 3) self.options.update(kwargs) # video root if sickrage.ROOT_DIRS: root_dirs = sickrage.ROOT_DIRS.split('|') self.video_root = root_dirs[int(root_dirs[0]) + 1] else: self.video_root = None # web root if self.options[b'web_root']: sickrage.WEB_ROOT = self.options[b'web_root'] = ( '/' + self.options[b'web_root'].lstrip('/').strip('/')) # api root if not sickrage.API_KEY: sickrage.API_KEY = generateApiKey() self.options[b'api_root'] = r'%s/api/%s' % (sickrage.WEB_ROOT, sickrage.API_KEY) # tornado setup self.enable_https = self.options[b'enable_https'] self.https_cert = self.options[b'https_cert'] self.https_key = self.options[b'https_key'] if self.enable_https: # If either the HTTPS certificate or key do not exist, make some self-signed ones. if not (self.https_cert and os.path.exists(self.https_cert)) or not ( self.https_key and os.path.exists(self.https_key)): if not create_https_certificates(self.https_cert, self.https_key): sickrage.LOGGER.info( "Unable to create CERT/KEY files, disabling HTTPS") sickrage.ENABLE_HTTPS = False self.enable_https = False if not (os.path.exists(self.https_cert) and os.path.exists(self.https_key)): sickrage.LOGGER.warning( "Disabled HTTPS because of missing CERT and KEY files") sickrage.ENABLE_HTTPS = False self.enable_https = False # Load the app self.app = Application( [], debug=sickrage.DEBUG, autoreload=False, gzip=sickrage.WEB_USE_GZIP, xheaders=sickrage.HANDLE_REVERSE_PROXY, cookie_secret=sickrage.WEB_COOKIE_SECRET, login_url='%s/login/' % self.options[b'web_root'], ) # Main Handlers self.app.add_handlers( '.*$', [ # webapi handler (r'%s(/?.*)' % self.options[b'api_root'], ApiHandler), # webapi key retrieval (r'%s/getkey(/?.*)' % self.options[b'web_root'], KeyHandler), # webapi builder redirect (r'%s/api/builder' % self.options[b'web_root'], RedirectHandler, { "url": self.options[b'web_root'] + '/apibuilder/' }), # webui login/logout handlers (r'%s/login(/?)' % self.options[b'web_root'], LoginHandler), (r'%s/logout(/?)' % self.options[b'web_root'], LogoutHandler), # webui handlers ] + route.get_routes(self.options[b'web_root'])) # Web calendar handler (Needed because option Unprotected calendar) self.app.add_handlers('.*$', [ (r'%s/calendar' % self.options[b'web_root'], CalendarHandler), ]) # Static File Handlers self.app.add_handlers( ".*$", [ # favicon (r'%s/(favicon\.ico)' % self.options[b'web_root'], StaticFileHandler, { "path": os.path.join(self.options[b'gui_root'], 'images/ico/favicon.ico') }), # images (r'%s.*?/images/(.*)' % self.options[b'web_root'], StaticImageHandler, { "path": os.path.join(self.options[b'gui_root'], 'images') }), # css (r'%s/css/(.*)' % self.options[b'web_root'], StaticFileHandler, { "path": os.path.join(self.options[b'gui_root'], 'css') }), # javascript (r'%s/js/(.*)' % self.options[b'web_root'], StaticFileHandler, { "path": os.path.join(self.options[b'gui_root'], 'js') }), # videos ] + [(r'%s/videos/(.*)' % self.options[b'web_root'], StaticFileHandler, { "path": self.video_root })]) # daemonize sickrage if sickrage.DAEMONIZE: import daemon ctx = daemon.DaemonContext() ctx.initgroups = False ctx.open() # write sickrage pidfile sickrage.PID = os.getpid() if sickrage.CREATEPID: with file(sickrage.PIDFILE, 'w+') as pf: pf.write(str(sickrage.PID)) self.io_loop.add_callback(sickrage.Scheduler.start)
def run(self): self.started = True # load languages tornado.locale.load_gettext_translations(sickrage.LOCALE_DIR, 'messages') # clear mako cache folder mako_cache = os.path.join(sickrage.app.cache_dir, 'mako') if os.path.isdir(mako_cache): shutil.rmtree(mako_cache) # video root if sickrage.app.config.root_dirs: root_dirs = sickrage.app.config.root_dirs.split('|') self.video_root = root_dirs[int(root_dirs[0]) + 1] # web root if sickrage.app.config.web_root: sickrage.app.config.web_root = sickrage.app.config.web_root = ( '/' + sickrage.app.config.web_root.lstrip('/').strip('/')) # api root self.api_root = r'%s/api/%s' % (sickrage.app.config.web_root, sickrage.app.config.api_key) # tornado setup if sickrage.app.config.enable_https: # If either the HTTPS certificate or key do not exist, make some self-signed ones. if not ( sickrage.app.config.https_cert and os.path.exists( sickrage.app.config.https_cert)) or not ( sickrage.app.config.https_key and os.path.exists(sickrage.app.config.https_key)): if not create_https_certificates(sickrage.app.config.https_cert, sickrage.app.config.https_key): sickrage.app.log.info("Unable to create CERT/KEY files, disabling HTTPS") sickrage.app.config.enable_https = False if not (os.path.exists(sickrage.app.config.https_cert) and os.path.exists( sickrage.app.config.https_key)): sickrage.app.log.warning("Disabled HTTPS because of missing CERT and KEY files") sickrage.app.config.enable_https = False # Load the app self.app = Application( [ # api (r'%s(/?.*)' % self.api_root, ApiHandler), # redirect to web root (r"(?!%s)(.*)" % sickrage.app.config.web_root, RedirectHandler, {"url": "%s/{0}" % sickrage.app.config.web_root}), # api key (r'%s/getkey(/?.*)' % sickrage.app.config.web_root, KeyHandler), # api builder (r'%s/api/builder' % sickrage.app.config.web_root, RedirectHandler, {"url": sickrage.app.config.web_root + '/apibuilder/'}), # login (r'%s/login(/?)' % sickrage.app.config.web_root, LoginHandler), # logout (r'%s/logout(/?)' % sickrage.app.config.web_root, LogoutHandler), # calendar (r'%s/calendar' % sickrage.app.config.web_root, CalendarHandler), # favicon (r'%s/(favicon\.ico)' % sickrage.app.config.web_root, StaticFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'images/favicon.ico')}), # images (r'%s/images/(.*)' % sickrage.app.config.web_root, StaticImageHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'images')}), # css (r'%s/css/(.*)' % sickrage.app.config.web_root, StaticFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'css')}), # scss (r'%s/scss/(.*)' % sickrage.app.config.web_root, StaticFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'scss')}), # fonts (r'%s/fonts/(.*)' % sickrage.app.config.web_root, StaticFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'fonts')}), # javascript (r'%s/js/(.*)' % sickrage.app.config.web_root, StaticFileHandler, {"path": os.path.join(sickrage.app.config.gui_static_dir, 'js')}), # videos (r'%s/videos/(.*)' % sickrage.app.config.web_root, StaticFileHandler, {"path": self.video_root}), ] + Route.get_routes(sickrage.app.config.web_root), debug=True, autoreload=False, gzip=sickrage.app.config.web_use_gzip, xheaders=sickrage.app.config.handle_reverse_proxy, cookie_secret=sickrage.app.config.web_cookie_secret, login_url='%s/login/' % sickrage.app.config.web_root) self.server = HTTPServer(self.app, no_keep_alive=True) if sickrage.app.config.enable_https: self.server.ssl_options = { "certfile": sickrage.app.config.https_cert, "keyfile": sickrage.app.config.https_key } try: self.server.listen(sickrage.app.config.web_port, None) sickrage.app.log.info( "SiCKRAGE :: STARTED") sickrage.app.log.info( "SiCKRAGE :: VERSION:[{}]".format(sickrage.app.version_updater.version)) sickrage.app.log.info( "SiCKRAGE :: CONFIG:[{}] [v{}]".format(sickrage.app.config_file, sickrage.app.config.config_version)) sickrage.app.log.info( "SiCKRAGE :: URL:[{}://{}:{}/]".format( ('http', 'https')[sickrage.app.config.enable_https], sickrage.app.config.web_host, sickrage.app.config.web_port)) # launch browser window if all([not sickrage.app.no_launch, sickrage.app.config.launch_browser]): threading.Thread(None, lambda: launch_browser( ('http', 'https')[sickrage.app.config.enable_https], sickrage.app.config.web_host, sickrage.app.config.web_port ), name="LAUNCH-BROWSER").start() sickrage.app.io_loop.start() except socket.error as e: sickrage.app.log.warning(e.strerror) raise SystemExit
def start(self): self.started = True # video root self.video_root = None if sickrage.srCore.srConfig.ROOT_DIRS: root_dirs = sickrage.srCore.srConfig.ROOT_DIRS.split('|') self.video_root = root_dirs[int(root_dirs[0]) + 1] # web root if sickrage.srCore.srConfig.WEB_ROOT: sickrage.srCore.srConfig.WEB_ROOT = sickrage.srCore.srConfig.WEB_ROOT = ( '/' + sickrage.srCore.srConfig.WEB_ROOT.lstrip('/').strip('/')) # api root if not sickrage.srCore.srConfig.API_KEY: sickrage.srCore.srConfig.API_KEY = generateApiKey() self.api_root = r'%s/api/%s' % (sickrage.srCore.srConfig.WEB_ROOT, sickrage.srCore.srConfig.API_KEY) # tornado setup if sickrage.srCore.srConfig.ENABLE_HTTPS: # If either the HTTPS certificate or key do not exist, make some self-signed ones. if not ( sickrage.srCore.srConfig.HTTPS_CERT and os.path.exists( sickrage.srCore.srConfig.HTTPS_CERT)) or not ( sickrage.srCore.srConfig.HTTPS_KEY and os.path.exists(sickrage.srCore.srConfig.HTTPS_KEY)): if not create_https_certificates(sickrage.srCore.srConfig.HTTPS_CERT, sickrage.srCore.srConfig.HTTPS_KEY): sickrage.srCore.srLogger.info("Unable to create CERT/KEY files, disabling HTTPS") sickrage.srCore.srConfig.ENABLE_HTTPS = False if not (os.path.exists(sickrage.srCore.srConfig.HTTPS_CERT) and os.path.exists( sickrage.srCore.srConfig.HTTPS_KEY)): sickrage.srCore.srLogger.warning("Disabled HTTPS because of missing CERT and KEY files") sickrage.srCore.srConfig.ENABLE_HTTPS = False # Load the app self.app = Application([], debug=False, autoreload=False, gzip=sickrage.srCore.srConfig.WEB_USE_GZIP, xheaders=sickrage.srCore.srConfig.HANDLE_REVERSE_PROXY, cookie_secret=sickrage.srCore.srConfig.WEB_COOKIE_SECRET, login_url='%s/login/' % sickrage.srCore.srConfig.WEB_ROOT) # Main Handlers self.app.add_handlers('.*$', [ # webapi handler (r'%s(/?.*)' % self.api_root, ApiHandler), # webapi key retrieval (r'%s/getkey(/?.*)' % sickrage.srCore.srConfig.WEB_ROOT, KeyHandler), # webapi builder redirect (r'%s/api/builder' % sickrage.srCore.srConfig.WEB_ROOT, RedirectHandler, {"url": sickrage.srCore.srConfig.WEB_ROOT + '/apibuilder/'}), # webui login/logout handlers (r'%s/login(/?)' % sickrage.srCore.srConfig.WEB_ROOT, LoginHandler), (r'%s/logout(/?)' % sickrage.srCore.srConfig.WEB_ROOT, LogoutHandler), # webui handlers ] + Route.get_routes(sickrage.srCore.srConfig.WEB_ROOT)) # Web calendar handler (Needed because option Unprotected calendar) self.app.add_handlers('.*$', [ (r'%s/calendar' % sickrage.srCore.srConfig.WEB_ROOT, CalendarHandler), ]) # Static File Handlers self.app.add_handlers(".*$", [ # favicon (r'%s/(favicon\.ico)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, {"path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'images/ico/favicon.ico')}), # images (r'%s.*?/images/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticImageHandler, {"path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'images')}), # css (r'%s/css/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, {"path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'css')}), # scss (r'%s/scss/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, {"path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'scss')}), # fonts (r'%s/fonts/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, {"path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'fonts')}), # javascript (r'%s/js/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, {"path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'js')}), # videos ] + [(r'%s/videos/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler, {"path": self.video_root})]) self.server = HTTPServer(self.app, no_keep_alive=True) if sickrage.srCore.srConfig.ENABLE_HTTPS: self.server.ssl_options = { "certfile": sickrage.srCore.srConfig.HTTPS_CERT, "keyfile": sickrage.srCore.srConfig.HTTPS_KEY } try: self.server.listen(sickrage.srCore.srConfig.WEB_PORT, None) except socket.error as e: print(e.message) raise # launch browser window if all([not sickrage.NOLAUNCH, sickrage.srCore.srConfig.LAUNCH_BROWSER]): threading.Thread(None, lambda: launch_browser( ('http', 'https')[sickrage.srCore.srConfig.ENABLE_HTTPS], get_lan_ip(), sickrage.srCore.srConfig.WEB_PORT )).start() # clear mako cache folder makocache = os.path.join(sickrage.srCore.srConfig.CACHE_DIR, 'mako') if os.path.isdir(makocache): shutil.rmtree(makocache) sickrage.srCore.srLogger.info("SiCKRAGE :: STARTED") sickrage.srCore.srLogger.info("SiCKRAGE :: VERSION:[{}]".format(sickrage.srCore.VERSIONUPDATER.updater.version)) sickrage.srCore.srLogger.info("SiCKRAGE :: CONFIG:[{}]".format(sickrage.CONFIG_FILE)) sickrage.srCore.srLogger.info("SiCKRAGE :: URL:[{}://{}:{}/]".format( ('http', 'https')[sickrage.srCore.srConfig.ENABLE_HTTPS], get_lan_ip(), sickrage.srCore.srConfig.WEB_PORT))