forked from pyload/pyload
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathServerThread.py
More file actions
150 lines (113 loc) · 4.51 KB
/
ServerThread.py
File metadata and controls
150 lines (113 loc) · 4.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/usr/bin/env python
from __future__ import with_statement
from time import time, sleep
import threading
import logging
from pyload.utils.fs import exists
core = None
setup = None
log = logging.getLogger("log")
class WebServer(threading.Thread):
def __init__(self, pycore=None, pysetup=None):
global core, setup
threading.Thread.__init__(self)
if pycore:
core = pycore
config = pycore.config
elif pysetup:
setup = pysetup
config = pysetup.config
else:
raise Exception("No config context provided")
self.server = config['webUI']['server']
self.https = config['webUI']['https']
self.cert = config["ssl"]["cert"]
self.key = config["ssl"]["key"]
self.host = config['webUI']['host']
self.port = config['webUI']['port']
self.debug = config['general']['debug_mode']
self.force_server = config['webUI']['force_server']
self.error = None
self.setDaemon(True)
def run(self):
self.running = True
import webinterface
global webinterface
if self.https:
if not exists(self.cert) or not exists(self.key):
log.warning(_("SSL certificates not found."))
self.https = False
if webinterface.UNAVAILALBE:
log.warning(_("WebUI built is not available"))
elif webinterface.APP_PATH == "app":
log.info(_("Running webUI in development mode"))
prefer = None
# These cases covers all settings
if self.server == "threaded":
prefer = "threaded"
elif self.server == "fastcgi":
prefer = "flup"
elif self.server == "fallback":
prefer = "wsgiref"
server = self.select_server(prefer)
try:
self.start_server(server)
except Exception, e:
log.error(_("Failed starting webserver: " + e.message))
self.error = e
if core:
core.print_exc()
def select_server(self, prefer=None):
""" find a working server """
from servers import all_server
unavailable = []
server = None
for server in all_server:
if self.force_server and self.force_server == server.NAME:
break # Found server
# When force_server is set, no further checks have to be made
elif self.force_server:
continue
if prefer and prefer == server.NAME:
break # found prefered server
elif prefer: # prefer is similar to force, but force has precedence
continue
# Filter for server that offer ssl if needed
if self.https and not server.SSL:
continue
try:
if server.find():
break # Found a server
else:
unavailable.append(server.NAME)
except Exception, e:
log.error(_("Failed importing webserver: " + e.message))
if unavailable: # Just log whats not available to have some debug information
log.debug("Unavailable webserver: " + ", ".join(unavailable))
if not server and self.force_server:
server = self.force_server # just return the name
return server
def start_server(self, server):
from servers import ServerAdapter
if issubclass(server, ServerAdapter):
if self.https and not server.SSL:
log.warning(_("This server offers no SSL, please consider using threaded instead"))
elif not self.https:
self.cert = self.key = None # This implicitly disables SSL
# there is no extra argument for the server adapter
# TODO: check for openSSL ?
# Now instantiate the serverAdapter
server = server(self.host, self.port, self.key, self.cert, 6, self.debug) # todo, num_connections
name = server.NAME
else: # server is just a string
name = server
log.info(
_("Starting %(name)s webserver: %(host)s:%(port)d") % {"name": name, "host": self.host, "port": self.port})
webinterface.run_server(host=self.host, port=self.port, server=server)
# check if an error was raised for n seconds
def check_error(self, n=1):
t = time() + n
while time() < t:
if self.error:
return self.error
sleep(0.1)