Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
douban-api-proxy
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
captainwong
douban-api-proxy
Commits
cc8a4315
Commit
cc8a4315
authored
Jun 21, 2019
by
Ozzieisaacs
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'socket/unix-socket' into Develop
parents
5c7aeb2f
e2545659
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
185 additions
and
171 deletions
+185
-171
cps.py
cps.py
+3
-2
__init__.py
cps/__init__.py
+3
-3
about.py
cps/about.py
+3
-2
admin.py
cps/admin.py
+4
-8
logger.py
cps/logger.py
+34
-27
server.py
cps/server.py
+124
-101
ub.py
cps/ub.py
+12
-25
updater.py
cps/updater.py
+2
-3
No files found.
cps.py
View file @
cc8a4315
...
@@ -28,8 +28,8 @@ sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'vendor
...
@@ -28,8 +28,8 @@ sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'vendor
from
cps
import
create_app
from
cps
import
create_app
from
cps
import
web_server
from
cps.opds
import
opds
from
cps.opds
import
opds
from
cps
import
Server
from
cps.web
import
web
from
cps.web
import
web
from
cps.jinjia
import
jinjia
from
cps.jinjia
import
jinjia
from
cps.about
import
about
from
cps.about
import
about
...
@@ -56,7 +56,8 @@ def main():
...
@@ -56,7 +56,8 @@ def main():
app
.
register_blueprint
(
editbook
)
app
.
register_blueprint
(
editbook
)
if
oauth_available
:
if
oauth_available
:
app
.
register_blueprint
(
oauth
)
app
.
register_blueprint
(
oauth
)
Server
.
startServer
()
success
=
web_server
.
start
()
sys
.
exit
(
0
if
success
else
1
)
if
__name__
==
'__main__'
:
if
__name__
==
'__main__'
:
...
...
cps/__init__.py
View file @
cc8a4315
...
@@ -84,8 +84,8 @@ searched_ids = {}
...
@@ -84,8 +84,8 @@ searched_ids = {}
from
.worker
import
WorkerThread
from
.worker
import
WorkerThread
global_WorkerThread
=
WorkerThread
()
global_WorkerThread
=
WorkerThread
()
from
.server
import
s
erver
from
.server
import
WebS
erver
Server
=
s
erver
()
web_server
=
WebS
erver
()
from
.ldap
import
Ldap
from
.ldap
import
Ldap
ldap
=
Ldap
()
ldap
=
Ldap
()
...
@@ -103,7 +103,7 @@ def create_app():
...
@@ -103,7 +103,7 @@ def create_app():
Principal
(
app
)
Principal
(
app
)
lm
.
init_app
(
app
)
lm
.
init_app
(
app
)
app
.
secret_key
=
os
.
getenv
(
'SECRET_KEY'
,
'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
)
app
.
secret_key
=
os
.
getenv
(
'SECRET_KEY'
,
'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
)
Server
.
init_app
(
app
)
web_server
.
init_app
(
app
,
config
)
db
.
setup_db
()
db
.
setup_db
()
babel
.
init_app
(
app
)
babel
.
init_app
(
app
)
ldap
.
init_app
(
app
)
ldap
.
init_app
(
app
)
...
...
cps/about.py
View file @
cc8a4315
...
@@ -41,8 +41,9 @@ from jinja2 import __version__ as jinja2Version
...
@@ -41,8 +41,9 @@ from jinja2 import __version__ as jinja2Version
from
pytz
import
__version__
as
pytzVersion
from
pytz
import
__version__
as
pytzVersion
from
sqlalchemy
import
__version__
as
sqlalchemyVersion
from
sqlalchemy
import
__version__
as
sqlalchemyVersion
from
.
import
db
,
converter
,
Server
,
uploader
from
.
import
db
,
converter
,
uploader
from
.isoLanguages
import
__version__
as
iso639Version
from
.isoLanguages
import
__version__
as
iso639Version
from
.server
import
VERSION
as
serverVersion
from
.web
import
render_title_template
from
.web
import
render_title_template
...
@@ -71,7 +72,7 @@ def stats():
...
@@ -71,7 +72,7 @@ def stats():
versions
[
'pySqlite'
]
=
'v'
+
db
.
engine
.
dialect
.
dbapi
.
version
versions
[
'pySqlite'
]
=
'v'
+
db
.
engine
.
dialect
.
dbapi
.
version
versions
[
'Sqlite'
]
=
'v'
+
db
.
engine
.
dialect
.
dbapi
.
sqlite_version
versions
[
'Sqlite'
]
=
'v'
+
db
.
engine
.
dialect
.
dbapi
.
sqlite_version
versions
.
update
(
converter
.
versioncheck
())
versions
.
update
(
converter
.
versioncheck
())
versions
.
update
(
Server
.
getNameVersion
()
)
versions
.
update
(
serverVersion
)
versions
[
'Python'
]
=
sys
.
version
versions
[
'Python'
]
=
sys
.
version
return
render_title_template
(
'stats.html'
,
bookcounter
=
counter
,
authorcounter
=
authors
,
versions
=
versions
,
return
render_title_template
(
'stats.html'
,
bookcounter
=
counter
,
authorcounter
=
authors
,
versions
=
versions
,
categorycounter
=
categorys
,
seriecounter
=
series
,
title
=
_
(
u"Statistics"
),
page
=
"stat"
)
categorycounter
=
categorys
,
seriecounter
=
series
,
title
=
_
(
u"Statistics"
),
page
=
"stat"
)
cps/admin.py
View file @
cc8a4315
...
@@ -41,7 +41,7 @@ from sqlalchemy.exc import IntegrityError
...
@@ -41,7 +41,7 @@ from sqlalchemy.exc import IntegrityError
from
werkzeug.security
import
generate_password_hash
from
werkzeug.security
import
generate_password_hash
from
.
import
constants
,
logger
,
ldap
from
.
import
constants
,
logger
,
ldap
from
.
import
db
,
ub
,
S
erver
,
get_locale
,
config
,
updater_thread
,
babel
,
gdriveutils
from
.
import
db
,
ub
,
web_s
erver
,
get_locale
,
config
,
updater_thread
,
babel
,
gdriveutils
from
.helper
import
speaking_language
,
check_valid_domain
,
check_unrar
,
send_test_mail
,
generate_random_password
,
\
from
.helper
import
speaking_language
,
check_valid_domain
,
check_unrar
,
send_test_mail
,
generate_random_password
,
\
send_registration_mail
send_registration_mail
from
.gdriveutils
import
is_gdrive_ready
,
gdrive_support
,
downloadFile
,
deleteDatabaseOnChange
,
listRootFolders
from
.gdriveutils
import
is_gdrive_ready
,
gdrive_support
,
downloadFile
,
deleteDatabaseOnChange
,
listRootFolders
...
@@ -102,12 +102,10 @@ def shutdown():
...
@@ -102,12 +102,10 @@ def shutdown():
showtext
=
{}
showtext
=
{}
if
task
==
0
:
if
task
==
0
:
showtext
[
'text'
]
=
_
(
u'Server restarted, please reload page'
)
showtext
[
'text'
]
=
_
(
u'Server restarted, please reload page'
)
Server
.
setRestartTyp
(
True
)
else
:
else
:
showtext
[
'text'
]
=
_
(
u'Performing shutdown of server, please close window'
)
showtext
[
'text'
]
=
_
(
u'Performing shutdown of server, please close window'
)
Server
.
setRestartTyp
(
False
)
# stop gevent/tornado server
# stop gevent/tornado server
Server
.
stopServer
(
)
web_server
.
stop
(
task
==
0
)
return
json
.
dumps
(
showtext
)
return
json
.
dumps
(
showtext
)
else
:
else
:
if
task
==
2
:
if
task
==
2
:
...
@@ -220,8 +218,7 @@ def view_configuration():
...
@@ -220,8 +218,7 @@ def view_configuration():
# ub.session.close()
# ub.session.close()
# ub.engine.dispose()
# ub.engine.dispose()
# stop Server
# stop Server
Server
.
setRestartTyp
(
True
)
web_server
.
stop
(
True
)
Server
.
stopServer
()
log
.
info
(
'Reboot required, restarting'
)
log
.
info
(
'Reboot required, restarting'
)
readColumn
=
db
.
session
.
query
(
db
.
Custom_Columns
)
\
readColumn
=
db
.
session
.
query
(
db
.
Custom_Columns
)
\
.
filter
(
and_
(
db
.
Custom_Columns
.
datatype
==
'bool'
,
db
.
Custom_Columns
.
mark_for_delete
==
0
))
.
all
()
.
filter
(
and_
(
db
.
Custom_Columns
.
datatype
==
'bool'
,
db
.
Custom_Columns
.
mark_for_delete
==
0
))
.
all
()
...
@@ -554,8 +551,7 @@ def configuration_helper(origin):
...
@@ -554,8 +551,7 @@ def configuration_helper(origin):
title
=
_
(
u"Basic Configuration"
),
page
=
"config"
)
title
=
_
(
u"Basic Configuration"
),
page
=
"config"
)
if
reboot_required
:
if
reboot_required
:
# stop Server
# stop Server
Server
.
setRestartTyp
(
True
)
web_server
.
stop
(
True
)
Server
.
stopServer
()
log
.
info
(
'Reboot required, restarting'
)
log
.
info
(
'Reboot required, restarting'
)
if
origin
:
if
origin
:
success
=
True
success
=
True
...
...
cps/logger.py
View file @
cc8a4315
...
@@ -25,6 +25,7 @@ from logging.handlers import RotatingFileHandler
...
@@ -25,6 +25,7 @@ from logging.handlers import RotatingFileHandler
from
.constants
import
BASE_DIR
as
_BASE_DIR
from
.constants
import
BASE_DIR
as
_BASE_DIR
ACCESS_FORMATTER_GEVENT
=
Formatter
(
"
%(message)
s"
)
ACCESS_FORMATTER_GEVENT
=
Formatter
(
"
%(message)
s"
)
ACCESS_FORMATTER_TORNADO
=
Formatter
(
"[
%(asctime)
s]
%(message)
s"
)
ACCESS_FORMATTER_TORNADO
=
Formatter
(
"[
%(asctime)
s]
%(message)
s"
)
...
@@ -33,7 +34,6 @@ DEFAULT_LOG_LEVEL = logging.INFO
...
@@ -33,7 +34,6 @@ DEFAULT_LOG_LEVEL = logging.INFO
DEFAULT_LOG_FILE
=
os
.
path
.
join
(
_BASE_DIR
,
"calibre-web.log"
)
DEFAULT_LOG_FILE
=
os
.
path
.
join
(
_BASE_DIR
,
"calibre-web.log"
)
DEFAULT_ACCESS_LOG
=
os
.
path
.
join
(
_BASE_DIR
,
"access.log"
)
DEFAULT_ACCESS_LOG
=
os
.
path
.
join
(
_BASE_DIR
,
"access.log"
)
LOG_TO_STDERR
=
'/dev/stderr'
LOG_TO_STDERR
=
'/dev/stderr'
DEFAULT_ACCESS_LEVEL
=
logging
.
INFO
logging
.
addLevelName
(
logging
.
WARNING
,
"WARN"
)
logging
.
addLevelName
(
logging
.
WARNING
,
"WARN"
)
logging
.
addLevelName
(
logging
.
CRITICAL
,
"CRIT"
)
logging
.
addLevelName
(
logging
.
CRITICAL
,
"CRIT"
)
...
@@ -73,35 +73,26 @@ def is_valid_logfile(file_path):
...
@@ -73,35 +73,26 @@ def is_valid_logfile(file_path):
return
(
not
log_dir
)
or
os
.
path
.
isdir
(
log_dir
)
return
(
not
log_dir
)
or
os
.
path
.
isdir
(
log_dir
)
def
setup
(
log_file
,
log_level
=
None
,
logger
=
None
):
def
_absolute_log_file
(
log_file
,
default_log_file
):
if
logger
!=
"access"
and
logger
!=
"tornado.access"
:
formatter
=
FORMATTER
default_file
=
DEFAULT_LOG_FILE
else
:
if
logger
==
"tornado.access"
:
formatter
=
ACCESS_FORMATTER_TORNADO
else
:
formatter
=
ACCESS_FORMATTER_GEVENT
default_file
=
DEFAULT_ACCESS_LOG
if
log_file
:
if
log_file
:
if
not
os
.
path
.
dirname
(
log_file
):
if
not
os
.
path
.
dirname
(
log_file
):
log_file
=
os
.
path
.
join
(
_BASE_DIR
,
log_file
)
log_file
=
os
.
path
.
join
(
_BASE_DIR
,
log_file
)
log_file
=
os
.
path
.
abspath
(
log_file
)
return
os
.
path
.
abspath
(
log_file
)
else
:
log_file
=
LOG_TO_STDERR
return
default_log_file
# log_file = default_file
def
setup
(
log_file
,
log_level
=
None
):
'''
Configure the logging output.
May be called multiple times.
'''
log_file
=
_absolute_log_file
(
log_file
,
DEFAULT_LOG_FILE
)
# print ('%r -- %r' % (log_level, log_file))
if
logger
!=
"access"
and
logger
!=
"tornado.access"
:
r
=
logging
.
root
r
=
logging
.
root
else
:
r
=
logging
.
getLogger
(
logger
)
r
.
propagate
=
False
r
.
setLevel
(
log_level
or
DEFAULT_LOG_LEVEL
)
r
.
setLevel
(
log_level
or
DEFAULT_LOG_LEVEL
)
previous_handler
=
r
.
handlers
[
0
]
if
r
.
handlers
else
None
previous_handler
=
r
.
handlers
[
0
]
if
r
.
handlers
else
None
# print ('previous %r' % previous_handler)
if
previous_handler
:
if
previous_handler
:
# if the log_file has not changed, don't create a new handler
# if the log_file has not changed, don't create a new handler
if
getattr
(
previous_handler
,
'baseFilename'
,
None
)
==
log_file
:
if
getattr
(
previous_handler
,
'baseFilename'
,
None
)
==
log_file
:
...
@@ -115,16 +106,32 @@ def setup(log_file, log_level=None, logger=None):
...
@@ -115,16 +106,32 @@ def setup(log_file, log_level=None, logger=None):
try
:
try
:
file_handler
=
RotatingFileHandler
(
log_file
,
maxBytes
=
50000
,
backupCount
=
2
)
file_handler
=
RotatingFileHandler
(
log_file
,
maxBytes
=
50000
,
backupCount
=
2
)
except
IOError
:
except
IOError
:
if
log_file
==
default_file
:
if
log_file
==
DEFAULT_LOG_FILE
:
raise
raise
file_handler
=
RotatingFileHandler
(
default_file
,
maxBytes
=
50000
,
backupCount
=
2
)
file_handler
=
RotatingFileHandler
(
DEFAULT_LOG_FILE
,
maxBytes
=
50000
,
backupCount
=
2
)
file_handler
.
setFormatter
(
formatter
)
file_handler
.
setFormatter
(
FORMATTER
)
for
h
in
r
.
handlers
:
for
h
in
r
.
handlers
:
r
.
removeHandler
(
h
)
r
.
removeHandler
(
h
)
h
.
close
()
h
.
close
()
r
.
addHandler
(
file_handler
)
r
.
addHandler
(
file_handler
)
# print ('new handler %r' % file_handler)
def
create_access_log
(
log_file
,
log_name
,
formatter
):
'''
One-time configuration for the web server's access log.
'''
log_file
=
_absolute_log_file
(
log_file
,
DEFAULT_ACCESS_LOG
)
logging
.
debug
(
"access log:
%
s"
,
log_file
)
access_log
=
logging
.
getLogger
(
log_name
)
access_log
.
propagate
=
False
access_log
.
setLevel
(
logging
.
INFO
)
file_handler
=
RotatingFileHandler
(
log_file
,
maxBytes
=
50000
,
backupCount
=
2
)
file_handler
.
setFormatter
(
formatter
)
access_log
.
addHandler
(
file_handler
)
return
access_log
# Enable logging of smtp lib debug output
# Enable logging of smtp lib debug output
...
...
cps/server.py
View file @
cc8a4315
...
@@ -20,54 +20,57 @@
...
@@ -20,54 +20,57 @@
from
__future__
import
division
,
print_function
,
unicode_literals
from
__future__
import
division
,
print_function
,
unicode_literals
import
sys
import
sys
import
os
import
os
import
errno
import
signal
import
signal
import
socket
import
socket
import
logging
try
:
try
:
from
gevent.pywsgi
import
WSGIServer
from
gevent.py
i
wsgi
import
WSGIServer
from
gevent.pool
import
Pool
from
gevent.pool
import
Pool
from
gevent
import
__version__
as
geventVersion
from
gevent
import
__version__
as
_version
gevent_present
=
True
VERSION
=
{
'Gevent'
:
'v'
+
_version
}
_GEVENT
=
True
except
ImportError
:
except
ImportError
:
from
tornado.wsgi
import
WSGIContainer
from
tornado.wsgi
import
WSGIContainer
from
tornado.httpserver
import
HTTPServer
from
tornado.httpserver
import
HTTPServer
from
tornado.ioloop
import
IOLoop
from
tornado.ioloop
import
IOLoop
from
tornado
import
version
as
tornadoVersion
from
tornado
import
version
as
_version
from
tornado
import
log
as
tornadoLog
VERSION
=
{
'Tornado'
:
'v'
+
_version
}
from
tornado
import
options
as
tornadoOptions
_GEVENT
=
False
gevent_present
=
False
from
.
import
logger
,
config
,
global_WorkerThread
from
.
import
logger
,
global_WorkerThread
log
=
logger
.
create
()
log
=
logger
.
create
()
class
server
:
class
WebServer
:
wsgiserver
=
None
restart
=
False
app
=
None
access_logger
=
None
def
__init__
(
self
):
def
__init__
(
self
):
signal
.
signal
(
signal
.
SIGINT
,
self
.
killServer
)
signal
.
signal
(
signal
.
SIGINT
,
self
.
_
killServer
)
signal
.
signal
(
signal
.
SIGTERM
,
self
.
killServer
)
signal
.
signal
(
signal
.
SIGTERM
,
self
.
_
killServer
)
def
init_app
(
self
,
application
):
self
.
wsgiserver
=
None
self
.
app
=
application
self
.
port
=
config
.
config_port
self
.
listening
=
config
.
get_config_ipaddress
(
readable
=
True
)
+
":"
+
str
(
self
.
port
)
self
.
access_logger
=
None
self
.
access_logger
=
None
self
.
restart
=
False
self
.
app
=
None
self
.
listen_address
=
None
self
.
listen_port
=
None
self
.
IPV6
=
False
self
.
unix_socket_file
=
None
self
.
ssl_args
=
None
def
init_app
(
self
,
application
,
config
):
self
.
app
=
application
self
.
listen_address
=
config
.
get_config_ipaddress
()
self
.
IPV6
=
config
.
get_ipaddress_type
()
self
.
listen_port
=
config
.
config_port
if
config
.
config_access_log
:
if
config
.
config_access_log
:
if
gevent_present
:
log_name
=
"gevent.access"
if
_GEVENT
else
"tornado.access"
logger
.
setup
(
config
.
config_access_logfile
,
logger
.
DEFAULT_ACCESS_LEVEL
,
"access"
)
formatter
=
logger
.
ACCESS_FORMATTER_GEVENT
if
_GEVENT
else
logger
.
ACCESS_FORMATTER_TORNADO
self
.
access_logger
=
logging
.
getLogger
(
"access"
)
self
.
access_logger
=
logger
.
create_access_log
(
config
.
config_access_logfile
,
log_name
,
formatter
)
else
:
logger
.
setup
(
config
.
config_access_logfile
,
logger
.
DEFAULT_ACCESS_LEVEL
,
"tornado.access"
)
self
.
ssl_args
=
None
certfile_path
=
config
.
get_config_certfile
()
certfile_path
=
config
.
get_config_certfile
()
keyfile_path
=
config
.
get_config_keyfile
()
keyfile_path
=
config
.
get_config_keyfile
()
if
certfile_path
and
keyfile_path
:
if
certfile_path
and
keyfile_path
:
...
@@ -79,101 +82,121 @@ class server:
...
@@ -79,101 +82,121 @@ class server:
log
.
warning
(
'Cert path:
%
s'
,
certfile_path
)
log
.
warning
(
'Cert path:
%
s'
,
certfile_path
)
log
.
warning
(
'Key path:
%
s'
,
keyfile_path
)
log
.
warning
(
'Key path:
%
s'
,
keyfile_path
)
def
_make_gevent_unix_socket
(
self
,
socket_file
):
# the socket file must not exist prior to bind()
if
os
.
path
.
exists
(
socket_file
):
# avoid nuking regular files and symbolic links (could be a mistype or security issue)
if
os
.
path
.
isfile
(
socket_file
)
or
os
.
path
.
islink
(
socket_file
):
raise
OSError
(
errno
.
EEXIST
,
os
.
strerror
(
errno
.
EEXIST
),
socket_file
)
os
.
remove
(
socket_file
)
unix_sock
=
WSGIServer
.
get_listener
(
socket_file
,
family
=
socket
.
AF_UNIX
)
self
.
unix_socket_file
=
socket_file
# ensure current user and group have r/w permissions, no permissions for other users
# this way the socket can be shared in a semi-secure manner
# between the user running calibre-web and the user running the fronting webserver
os
.
chmod
(
socket_file
,
0o660
)
return
unix_sock
def
_make_gevent_socket
(
self
):
def
_make_gevent_socket
(
self
):
if
config
.
get_config_ipaddress
():
if
os
.
name
!=
'nt'
:
return
(
config
.
get_config_ipaddress
(),
self
.
port
)
unix_socket_file
=
os
.
environ
.
get
(
"CALIBRE_UNIX_SOCKET"
)
if
unix_socket_file
:
output
=
"socket:"
+
unix_socket_file
+
":"
+
str
(
self
.
listen_port
)
return
self
.
_make_gevent_unix_socket
(
unix_socket_file
),
output
if
self
.
listen_address
:
return
(
self
.
listen_address
,
self
.
listen_port
),
self
.
_get_readable_listen_address
()
if
os
.
name
==
'nt'
:
if
os
.
name
==
'nt'
:
return
(
'0.0.0.0'
,
self
.
port
)
self
.
listen_address
=
'0.0.0.0'
return
(
self
.
listen_address
,
self
.
listen_port
),
self
.
_get_readable_listen_address
()
address
=
(
''
,
self
.
listen_port
)
try
:
try
:
s
=
WSGIServer
.
get_listener
((
''
,
self
.
port
),
family
=
socket
.
AF_INET6
)
sock
=
WSGIServer
.
get_listener
(
address
,
family
=
socket
.
AF_INET6
)
output
=
self
.
_get_readable_listen_address
(
True
)
except
socket
.
error
as
ex
:
except
socket
.
error
as
ex
:
log
.
error
(
'
%
s'
,
ex
)
log
.
error
(
'
%
s'
,
ex
)
log
.
warning
(
'Unable to listen on
\'\'
, trying on IPv4 only...'
)
log
.
warning
(
'Unable to listen on
""
, trying on IPv4 only...'
)
s
=
WSGIServer
.
get_listener
((
''
,
self
.
port
),
family
=
socket
.
AF_INET
)
output
=
self
.
_get_readable_listen_address
(
False
)
log
.
debug
(
"
%
r
%
r"
,
s
.
_sock
,
s
.
_sock
.
getsockname
()
)
sock
=
WSGIServer
.
get_listener
(
address
,
family
=
socket
.
AF_INET
)
return
s
return
s
ock
,
output
def
start_gevent
(
self
):
def
_
start_gevent
(
self
):
ssl_args
=
self
.
ssl_args
or
{}
ssl_args
=
self
.
ssl_args
or
{}
log
.
info
(
'Starting Gevent server'
)
try
:
try
:
sock
=
self
.
_make_gevent_socket
()
sock
,
output
=
self
.
_make_gevent_socket
()
log
.
info
(
'Starting Gevent server on
%
s'
,
output
)
self
.
wsgiserver
=
WSGIServer
(
sock
,
self
.
app
,
log
=
self
.
access_logger
,
spawn
=
Pool
(),
**
ssl_args
)
self
.
wsgiserver
=
WSGIServer
(
sock
,
self
.
app
,
log
=
self
.
access_logger
,
spawn
=
Pool
(),
**
ssl_args
)
self
.
wsgiserver
.
serve_forever
()
self
.
wsgiserver
.
serve_forever
()
except
socket
.
error
:
finally
:
try
:
if
self
.
unix_socket_file
:
log
.
info
(
'Unable to listen on "", trying on "0.0.0.0" only...'
)
os
.
remove
(
self
.
unix_socket_file
)
self
.
wsgiserver
=
WSGIServer
((
'0.0.0.0'
,
config
.
config_port
),
self
.
app
,
spawn
=
Pool
(),
**
ssl_args
)
self
.
unix_socket_file
=
None
self
.
wsgiserver
.
serve_forever
()
except
(
OSError
,
socket
.
error
)
as
e
:
log
.
info
(
"Error starting server:
%
s"
,
e
.
strerror
)
print
(
"Error starting server:
%
s"
%
e
.
strerror
)
global_WorkerThread
.
stop
()
sys
.
exit
(
1
)
except
Exception
:
log
.
exception
(
"Unknown error while starting gevent"
)
sys
.
exit
(
0
)
def
start_tornado
(
self
):
def
_
start_tornado
(
self
):
log
.
info
(
'Starting Tornado server on
%
s'
,
self
.
listening
)
log
.
info
(
'Starting Tornado server on
%
s'
,
self
.
_get_readable_listen_address
()
)
try
:
# Max Buffersize set to 200MB )
# Max Buffersize set to 200MB )
http_server
=
HTTPServer
(
WSGIContainer
(
self
.
app
),
http_server
=
HTTPServer
(
WSGIContainer
(
self
.
app
),
max_buffer_size
=
209700000
,
max_buffer_size
=
209700000
,
ssl_options
=
self
.
ssl_args
)
ssl_options
=
self
.
ssl_args
)
address
=
config
.
get_config_ipaddress
()
http_server
.
listen
(
self
.
listen_port
,
self
.
listen_address
)
http_server
.
listen
(
self
.
port
,
address
)
self
.
wsgiserver
=
IOLoop
.
instance
()
self
.
wsgiserver
=
IOLoop
.
instance
()
self
.
wsgiserver
.
start
()
self
.
wsgiserver
.
start
()
# wait for stop signal
# wait for stop signal
self
.
wsgiserver
.
close
(
True
)
self
.
wsgiserver
.
close
(
True
)
except
socket
.
error
as
err
:
log
.
exception
(
"Error starting tornado server"
)
print
(
"Error starting server:
%
s"
%
err
.
strerror
)
global_WorkerThread
.
stop
()
sys
.
exit
(
1
)
def
startServer
(
self
):
def
_get_readable_listen_address
(
self
,
ipV6
=
False
):
if
gevent_present
:
if
self
.
listen_address
==
""
:
listen_string
=
'""'
else
:
ipV6
=
self
.
IPV6
listen_string
=
self
.
listen_address
if
ipV6
:
adress
=
"["
+
listen_string
+
"]"
else
:
adress
=
listen_string
return
adress
+
":"
+
str
(
self
.
listen_port
)
def
start
(
self
):
try
:
if
_GEVENT
:
# leave subprocess out to allow forking for fetchers and processors
# leave subprocess out to allow forking for fetchers and processors
self
.
start_gevent
()
self
.
_
start_gevent
()
else
:
else
:
self
.
start_tornado
()
self
.
_start_tornado
()
except
Exception
as
ex
:
log
.
error
(
"Error starting server:
%
s"
,
ex
)
print
(
"Error starting server:
%
s"
%
ex
)
return
False
finally
:
self
.
wsgiserver
=
None
global_WorkerThread
.
stop
()
if
not
self
.
restart
:
log
.
info
(
"Performing shutdown of Calibre-Web"
)
return
True
if
self
.
restart
is
True
:
log
.
info
(
"Performing restart of Calibre-Web"
)
log
.
info
(
"Performing restart of Calibre-Web"
)
global_WorkerThread
.
stop
()
arguments
=
list
(
sys
.
argv
)
arguments
.
insert
(
0
,
sys
.
executable
)
if
os
.
name
==
'nt'
:
if
os
.
name
==
'nt'
:
arguments
=
[
"
\"
"
+
sys
.
executable
+
"
\"
"
]
arguments
=
[
"
\"
%
s
\"
"
%
a
for
a
in
arguments
]
for
e
in
sys
.
argv
:
arguments
.
append
(
"
\"
"
+
e
+
"
\"
"
)
os
.
execv
(
sys
.
executable
,
arguments
)
os
.
execv
(
sys
.
executable
,
arguments
)
else
:
return
True
os
.
execl
(
sys
.
executable
,
sys
.
executable
,
*
sys
.
argv
)
else
:
log
.
info
(
"Performing shutdown of Calibre-Web"
)
global_WorkerThread
.
stop
()
sys
.
exit
(
0
)
def
setRestartTyp
(
self
,
starttyp
):
self
.
restart
=
starttyp
def
killServer
(
self
,
signum
,
frame
):
def
_
killServer
(
self
,
signum
,
frame
):
self
.
stop
Server
()
self
.
stop
()
def
stopServer
(
self
):
def
stop
(
self
,
restart
=
False
):
self
.
restart
=
restart
if
self
.
wsgiserver
:
if
self
.
wsgiserver
:
if
gevent_present
:
if
_GEVENT
:
self
.
wsgiserver
.
close
()
self
.
wsgiserver
.
close
()
else
:
else
:
self
.
wsgiserver
.
add_callback
(
self
.
wsgiserver
.
stop
)
self
.
wsgiserver
.
add_callback
(
self
.
wsgiserver
.
stop
)
@
staticmethod
def
getNameVersion
():
if
gevent_present
:
return
{
'Gevent'
:
'v'
+
geventVersion
}
else
:
return
{
'Tornado'
:
'v'
+
tornadoVersion
}
cps/ub.py
View file @
cc8a4315
...
@@ -476,35 +476,22 @@ class Config:
...
@@ -476,35 +476,22 @@ class Config:
def
get_config_certfile
(
self
):
def
get_config_certfile
(
self
):
if
cli
.
certfilepath
:
if
cli
.
certfilepath
:
return
cli
.
certfilepath
return
cli
.
certfilepath
else
:
if
cli
.
certfilepath
is
""
:
if
cli
.
certfilepath
is
""
:
return
None
return
None
else
:
return
self
.
config_certfile
return
self
.
config_certfile
def
get_config_keyfile
(
self
):
def
get_config_keyfile
(
self
):
if
cli
.
keyfilepath
:
if
cli
.
keyfilepath
:
return
cli
.
keyfilepath
return
cli
.
keyfilepath
else
:
if
cli
.
certfilepath
is
""
:
if
cli
.
certfilepath
is
""
:
return
None
return
None
else
:
return
self
.
config_keyfile
return
self
.
config_keyfile
def
get_config_ipaddress
(
self
,
readable
=
False
):
def
get_config_ipaddress
(
self
):
if
not
readable
:
return
cli
.
ipadress
or
""
if
cli
.
ipadress
:
return
cli
.
ipadress
def
get_ipaddress_type
(
self
):
else
:
return
cli
.
ipv6
return
""
else
:
answer
=
"0.0.0.0"
if
cli
.
ipadress
:
if
cli
.
ipv6
:
answer
=
"["
+
cli
.
ipadress
+
"]"
else
:
answer
=
cli
.
ipadress
return
answer
def
_has_role
(
self
,
role_flag
):
def
_has_role
(
self
,
role_flag
):
return
constants
.
has_flag
(
self
.
config_default_role
,
role_flag
)
return
constants
.
has_flag
(
self
.
config_default_role
,
role_flag
)
...
...
cps/updater.py
View file @
cc8a4315
...
@@ -33,7 +33,7 @@ from tempfile import gettempdir
...
@@ -33,7 +33,7 @@ from tempfile import gettempdir
from
babel.dates
import
format_datetime
from
babel.dates
import
format_datetime
from
flask_babel
import
gettext
as
_
from
flask_babel
import
gettext
as
_
from
.
import
constants
,
logger
,
config
,
get_locale
,
S
erver
from
.
import
constants
,
logger
,
config
,
get_locale
,
web_s
erver
log
=
logger
.
create
()
log
=
logger
.
create
()
...
@@ -95,8 +95,7 @@ class Updater(threading.Thread):
...
@@ -95,8 +95,7 @@ class Updater(threading.Thread):
self
.
status
=
6
self
.
status
=
6
log
.
debug
(
u'Preparing restart of server'
)
log
.
debug
(
u'Preparing restart of server'
)
time
.
sleep
(
2
)
time
.
sleep
(
2
)
Server
.
setRestartTyp
(
True
)
web_server
.
stop
(
True
)
Server
.
stopServer
()
self
.
status
=
7
self
.
status
=
7
time
.
sleep
(
2
)
time
.
sleep
(
2
)
except
requests
.
exceptions
.
HTTPError
as
ex
:
except
requests
.
exceptions
.
HTTPError
as
ex
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment