Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagecell
Path: blob/master/permalink_server.py
447 views
1
"""
2
Permalink web server
3
4
This Tornado server provides a permalink service with a convenient
5
post/get api for storing and retrieving code.
6
"""
7
8
import os
9
import signal
10
11
import psutil
12
import tornado.httpserver
13
import tornado.ioloop
14
import tornado.web
15
16
import permalink
17
from log import permalink_logger as logger
18
19
20
PERMALINK_DB = "sqlalchemy"
21
PERMALINK_URI = "sqlite:///permalinks.db"
22
PERMALINK_PID_FILE = "permalink.pid"
23
24
25
class PermalinkServer(tornado.web.Application):
26
def __init__(self):
27
handlers_list = [
28
(r"/", permalink.PermalinkHandler),
29
(r"/permalink", permalink.PermalinkHandler),
30
]
31
db = __import__('db_' + PERMALINK_DB)
32
self.db = db.DB(PERMALINK_URI)
33
34
#self.ioloop = ioloop.IOLoop.instance()
35
# to check for blocking when debugging, uncomment the following
36
# and set the argument to the blocking timeout in seconds
37
#self.ioloop.set_blocking_log_threshold(.5)
38
39
super(PermalinkServer, self).__init__(handlers_list)
40
41
if __name__ == "__main__":
42
import argparse
43
parser = argparse.ArgumentParser(
44
description='Launch a permalink database web server',
45
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
46
parser.add_argument('-p', '--port', type=int, default=8080,
47
help='port to launch the server')
48
args = parser.parse_args()
49
50
from lockfile.pidlockfile import PIDLockFile
51
pidfile_path = PERMALINK_PID_FILE
52
pidlock = PIDLockFile(pidfile_path)
53
if pidlock.is_locked():
54
old_pid = pidlock.read_pid()
55
if os.getpid() != old_pid:
56
try:
57
old = psutil.Process(old_pid)
58
if os.path.basename(__file__) in old.cmdline():
59
try:
60
old.terminate()
61
try:
62
old.wait(10)
63
except psutil.TimeoutExpired:
64
old.kill()
65
except psutil.AccessDenied:
66
pass
67
except psutil.NoSuchProcess:
68
pass
69
pidlock.break_lock()
70
71
pidlock.acquire(timeout=10)
72
app = PermalinkServer()
73
app.listen(port=args.port, xheaders=True)
74
75
def handler(signum, frame):
76
logger.info("Received %s, shutting down...", signum)
77
ioloop = tornado.ioloop.IOLoop.current()
78
ioloop.add_callback_from_signal(ioloop.stop)
79
80
signal.signal(signal.SIGHUP, handler)
81
signal.signal(signal.SIGINT, handler)
82
signal.signal(signal.SIGTERM, handler)
83
84
try:
85
from systemd.daemon import notify
86
notify('READY=1\nMAINPID={}'.format(os.getpid()), True)
87
except ImportError:
88
pass
89
90
tornado.ioloop.IOLoop.current().start()
91
pidlock.release()
92
93