|
@@ -23,12 +23,11 @@ from pwman.util.crypto import CryptoEngine
|
|
|
import pwman.data.factory
|
|
|
from pwman.data.tags import TagNew
|
|
|
from pwman import parser_options, get_conf_options
|
|
|
-from daemon import Daemon
|
|
|
from pkg_resources import resource_filename
|
|
|
import itertools
|
|
|
-import argparse
|
|
|
import sys
|
|
|
-from os.path import expanduser, join
|
|
|
+from signal import SIGTERM
|
|
|
+import os
|
|
|
|
|
|
templates_path = [resource_filename('pwman', 'ui/templates')]
|
|
|
statics = [resource_filename('pwman', 'ui/templates/static')][0]
|
|
@@ -44,6 +43,11 @@ DB = None
|
|
|
# WEB GUI shows multiple tags as one tag!
|
|
|
|
|
|
|
|
|
+@route('/exit', method=['GET'])
|
|
|
+def exit():
|
|
|
+ os.kill(os.getpid(), SIGTERM)
|
|
|
+
|
|
|
+
|
|
|
def require_auth(fn):
|
|
|
def check_auth(**kwargs):
|
|
|
if AUTHENTICATED:
|
|
@@ -114,7 +118,13 @@ def is_authenticated():
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
key = request.POST.get('pwd', '')
|
|
|
- crypto.auth(key)
|
|
|
+ while True:
|
|
|
+ try:
|
|
|
+ crypto.auth(key)
|
|
|
+ break
|
|
|
+ except Exception:
|
|
|
+ redirect('/auth')
|
|
|
+
|
|
|
AUTHENTICATED = True
|
|
|
redirect('/')
|
|
|
else:
|
|
@@ -163,21 +173,10 @@ def server_static(filepath):
|
|
|
return static_file(filepath, root=statics)
|
|
|
|
|
|
|
|
|
-class Pwman3WebDaemon(Daemon):
|
|
|
+class Pwman3WebDaemon(object):
|
|
|
|
|
|
- def startd(self):
|
|
|
- """
|
|
|
- Start the daemon
|
|
|
- """
|
|
|
- # Check for a pidfile to see if the daemon already runs
|
|
|
- self.exit_running()
|
|
|
- #if not os.path.exists(self.pidfile):
|
|
|
- # Start the daemon
|
|
|
- self.daemonize()
|
|
|
- # after self.daemonize()
|
|
|
- # all output is redirected
|
|
|
- print(open(self.pidfile).read())
|
|
|
- self.run()
|
|
|
+ def __enter__(self):
|
|
|
+ return self
|
|
|
|
|
|
def run(self):
|
|
|
global AUTHENTICATED, TAGS, DB
|
|
@@ -196,54 +195,10 @@ class Pwman3WebDaemon(Daemon):
|
|
|
debug(True)
|
|
|
run(port=9030)
|
|
|
|
|
|
+ def __exit__(self, type, value, traceback):
|
|
|
+ return isinstance(value, TypeError)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
|
- parser = argparse.ArgumentParser(
|
|
|
- description="Start the webui of pwman3",
|
|
|
- usage='%(prog)s start|stop|restart|status [-p|-d]\n',
|
|
|
- )
|
|
|
- parser.add_argument('-D', '--NoDaemon',
|
|
|
- help='Do not fork, start in foreground',
|
|
|
- action="store_true", default=False)
|
|
|
-
|
|
|
- ext_usage = ("{prog} start - starts the webui."
|
|
|
- "{prog} stop - stops the webui."
|
|
|
- "{prog} status - check if the process is already running."
|
|
|
- "".format(prog=parser.prog))
|
|
|
-
|
|
|
- if len(sys.argv) == 1:
|
|
|
- parser.print_help()
|
|
|
- sys.exit(1)
|
|
|
-
|
|
|
- action = sys.argv[1]
|
|
|
-
|
|
|
- if action not in ['start', 'stop', 'restart', 'status']:
|
|
|
- parser.print_help()
|
|
|
- print(ext_usage)
|
|
|
- sys.exit(1)
|
|
|
-
|
|
|
- sys.argv = sys.argv[1:]
|
|
|
-
|
|
|
- path = join(expanduser("~"), '.pwman')
|
|
|
- daemon = Pwman3WebDaemon(parser.prog, join(path, '%s.pid' % parser.prog),
|
|
|
- noisy=True)
|
|
|
-
|
|
|
- args = parser.parse_args()
|
|
|
-
|
|
|
- if action == 'status':
|
|
|
- running = daemon.check_proc()
|
|
|
- if running:
|
|
|
- print("%s already runs with pid: %d" % (parser.prog, running))
|
|
|
- if action == 'start' and args.NoDaemon:
|
|
|
- try:
|
|
|
- daemon.start()
|
|
|
- except KeyboardInterrupt:
|
|
|
- daemon.set_level("auto")
|
|
|
- daemon.stop()
|
|
|
- if action == 'start' and not args.NoDaemon:
|
|
|
- daemon.startd()
|
|
|
- if action == "restart":
|
|
|
- daemon.restart()
|
|
|
- if action == "stop":
|
|
|
- daemon.stop()
|
|
|
+ with Pwman3WebDaemon() as webui:
|
|
|
+ webui.run()
|