]> arthur.barton.de Git - bup.git/commitdiff
web: attempt orderly shut down on SIGTERM
authorRob Browning <rlb@defaultvalue.org>
Sat, 5 Mar 2016 22:56:03 +0000 (16:56 -0600)
committerRob Browning <rlb@defaultvalue.org>
Sat, 12 Mar 2016 16:27:53 +0000 (10:27 -0600)
Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Documentation/bup-web.md
cmd/web-cmd.py

index 08fd84dc75f190e48ea38048ad1cc984652f6448..6b650885fdd89e764b8578ae84e6e9a74b9b4f81 100644 (file)
@@ -21,6 +21,9 @@ hierarchy is the same as that shown by `bup-fuse`(1), `bup-ls`(1) and
 you'd like to expose the web server to anyone on your network (dangerous!) you
 can omit the bind address to bind to all available interfaces: `:8080`.
 
+A `SIGTERM` signal may be sent to the server to request an orderly
+shutdown.
+
 # OPTIONS
 
 --human-readable
@@ -34,15 +37,25 @@ can omit the bind address to bind to all available interfaces: `:8080`.
     $ bup web
     Serving HTTP on 127.0.0.1:8080...
     ^C
+    Interrupted.
 
     $ bup web :8080
     Serving HTTP on 0.0.0.0:8080...
     ^C
+    Interrupted.
 
+    $ bup web &
+    [1] 30980
+    Serving HTTP on 127.0.0.1:8080...
+    $ kill -s TERM 30980
+    Shutdown requested
+    $ wait 30980
+    $ echo $?
+    0
 
 # SEE ALSO
 
-`bup-fuse`(1), `bup-ls`(1), `bup-ftp`(1), `bup-restore`(1)
+`bup-fuse`(1), `bup-ls`(1), `bup-ftp`(1), `bup-restore`(1), `kill`(1)
 
 
 # BUP
index 2ddc0b1a345737ee7998afecd1005a9a58a7948b..850c6fb06b4b59f27c9d0b4a645c8c7d65f17369 100755 (executable)
@@ -5,14 +5,15 @@ exec "$bup_python" "$0" ${1+"$@"}
 """
 # end of bup preamble
 
-import mimetypes, os, posixpath, stat, sys, time, urllib, webbrowser
+import mimetypes, os, posixpath, signal, stat, sys, time, urllib, webbrowser
 
 from bup import options, git, vfs
-from bup.helpers import debug1, handle_ctrl_c, log, resource_path
+from bup.helpers import (debug1, handle_ctrl_c, log, resource_path,
+                         saved_errors)
 
 try:
+    from tornado.ioloop import IOLoop
     import tornado.httpserver
-    import tornado.ioloop
     import tornado.web
 except ImportError:
     log('error: cannot find the python "tornado" module; please install it\n')
@@ -192,6 +193,19 @@ class BupRequestHandler(tornado.web.RequestHandler):
         return time.strftime('%a, %d %b %Y %H:%M:%S', time.gmtime(t))
 
 
+io_loop = None
+
+def handle_sigterm(signum, frame):
+    global io_loop
+    debug1('\nbup-web: signal %d received\n' % signum)
+    log('Shutdown requested\n')
+    if not io_loop:
+        sys.exit(0)
+    io_loop.stop()
+
+
+signal.signal(signal.SIGTERM, handle_sigterm)
+
 optspec = """
 bup web [[hostname]:port]
 --
@@ -236,8 +250,14 @@ except AttributeError as e:
 
 print "Serving HTTP on %s:%d..." % sock.getsockname()
 
-loop = tornado.ioloop.IOLoop.instance()
+io_loop_pending = IOLoop.instance()
 if opt.browser:
     browser_addr = 'http://' + address[0] + ':' + str(address[1])
-    loop.add_callback(lambda : webbrowser.open(browser_addr))
-loop.start()
+    io_loop_pending.add_callback(lambda : webbrowser.open(browser_addr))
+
+io_loop = io_loop_pending
+io_loop.start()
+
+if saved_errors:
+    log('WARNING: %d errors encountered while saving.\n' % len(saved_errors))
+    sys.exit(1)