1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/imip_manager.py Sun Oct 26 00:45:58 2014 +0200
1.3 @@ -0,0 +1,125 @@
1.4 +#!/usr/bin/env python
1.5 +
1.6 +import cgi, os, sys
1.7 +
1.8 +sys.path.append("/var/lib/imip-agent")
1.9 +
1.10 +import markup
1.11 +import imip_store
1.12 +
1.13 +getenv = os.environ.get
1.14 +setenv = os.environ.__setitem__
1.15 +
1.16 +class CGIEnvironment:
1.17 +
1.18 + "A CGI-compatible environment."
1.19 +
1.20 + def __init__(self):
1.21 + self.args = None
1.22 + self.method = None
1.23 + self.path = None
1.24 + self.path_info = None
1.25 + self.user = None
1.26 +
1.27 + def get_args(self):
1.28 + if self.args is None:
1.29 + if self.get_method() != "POST":
1.30 + setenv("QUERY_STRING", "")
1.31 + self.args = cgi.parse(keep_blank_values=True)
1.32 + return self.args
1.33 +
1.34 + def get_method(self):
1.35 + if self.method is None:
1.36 + self.method = getenv("REQUEST_METHOD") or "GET"
1.37 + return self.method
1.38 +
1.39 + def get_path(self):
1.40 + if self.path is None:
1.41 + self.path = getenv("SCRIPT_NAME") or ""
1.42 + return self.path
1.43 +
1.44 + def get_path_info(self):
1.45 + if self.path_info is None:
1.46 + self.path_info = getenv("PATH_INFO") or ""
1.47 + return self.path_info
1.48 +
1.49 + def get_user(self):
1.50 + if self.user is None:
1.51 + self.user = getenv("REMOTE_USER") or ""
1.52 + return self.user
1.53 +
1.54 + def get_output(self):
1.55 + return sys.stdout
1.56 +
1.57 + def get_url(self):
1.58 + path = self.get_path()
1.59 + path_info = self.get_path_info()
1.60 + return "%s%s" % (path.rstrip("/"), path_info)
1.61 +
1.62 +class Manager:
1.63 +
1.64 + "A simple manager application."
1.65 +
1.66 + def __init__(self):
1.67 + self.store = imip_store.FileStore()
1.68 + self.env = CGIEnvironment()
1.69 + user = self.env.get_user()
1.70 + self.user = user and "mailto:%s" % user or None
1.71 + self.out = self.env.get_output()
1.72 + self.page = markup.page()
1.73 + self.encoding = "utf-8"
1.74 +
1.75 + def new_page(self, title):
1.76 + self.page.init(title=title, charset=self.encoding)
1.77 +
1.78 + def status(self, code, message):
1.79 + print >>self.out, "Status:", code, message
1.80 +
1.81 + def no_user(self):
1.82 + self.status(403, "Forbidden")
1.83 + self.new_page(title="Forbidden")
1.84 + self.page.p("You are not logged in and thus cannot access scheduling requests.")
1.85 +
1.86 + def show_requests(self):
1.87 +
1.88 + "Show requests for the current user."
1.89 +
1.90 + # NOTE: This list could be more informative, but it is envisaged that
1.91 + # NOTE: the requests would be visited directly anyway.
1.92 +
1.93 + self.new_page(title="Pending Requests")
1.94 + self.page.ul()
1.95 +
1.96 + requests = self.store.get_requests(self.user)
1.97 + for request in requests:
1.98 + self.page.li()
1.99 + self.page.a(request, href="%s/%s" % (self.env.get_url(), request))
1.100 + self.page.li.close()
1.101 +
1.102 + self.page.ul.close()
1.103 +
1.104 + def select_action(self):
1.105 +
1.106 + "Select the desired action and show the result."
1.107 +
1.108 + path_info = self.env.get_path_info().rstrip("/")
1.109 + if not path_info:
1.110 + self.show_requests()
1.111 +
1.112 + def show(self):
1.113 +
1.114 + "Interpret a request and show an appropriate response."
1.115 +
1.116 + if not self.user:
1.117 + self.no_user()
1.118 + else:
1.119 + self.select_action()
1.120 +
1.121 + print >>self.out, "Content-Type: text/html; charset=%s" % self.encoding
1.122 + print >>self.out
1.123 + self.out.write(unicode(self.page).encode(self.encoding))
1.124 +
1.125 +if __name__ == "__main__":
1.126 + Manager().show()
1.127 +
1.128 +# vim: tabstop=4 expandtab shiftwidth=4