diff options
-rw-r--r-- | cobbler/remote.py | 8 | ||||
-rw-r--r-- | cobbler/webui/CobblerWeb.py | 34 | ||||
-rw-r--r-- | cobbler/webui/master.py | 30 | ||||
-rw-r--r-- | config/cobbler.conf | 10 | ||||
-rwxr-xr-x | scripts/index.py | 59 | ||||
-rw-r--r-- | webui_templates/distro_edit.tmpl | 3 | ||||
-rw-r--r-- | webui_templates/distro_list.tmpl | 2 | ||||
-rw-r--r-- | webui_templates/ksfile_edit.tmpl | 2 | ||||
-rw-r--r-- | webui_templates/ksfile_list.tmpl | 4 | ||||
-rw-r--r-- | webui_templates/master.tmpl | 24 | ||||
-rw-r--r-- | webui_templates/paginate.tmpl | 6 | ||||
-rw-r--r-- | webui_templates/profile_edit.tmpl | 2 | ||||
-rw-r--r-- | webui_templates/profile_list.tmpl | 6 | ||||
-rw-r--r-- | webui_templates/repo_edit.tmpl | 2 | ||||
-rw-r--r-- | webui_templates/system_edit.tmpl | 4 | ||||
-rw-r--r-- | webui_templates/system_list.tmpl | 4 |
16 files changed, 107 insertions, 93 deletions
diff --git a/cobbler/remote.py b/cobbler/remote.py index dcc01d1..081f8c8 100644 --- a/cobbler/remote.py +++ b/cobbler/remote.py @@ -456,9 +456,9 @@ class CobblerReadWriteXMLRPCInterface(CobblerXMLRPCInterface): self.logger.debug("invalid token: %s" % token) raise CX(_("invalid token: %s" % token)) - def check_access(self,token,resource): + def check_access(self,token,resource,arg1=None,arg2=None): validated = self.__validate_token(token) - return self.__authorize(token,resource) + return self.__authorize(token,resource,arg1,arg2) def __get_user_from_token(self,token): if not self.token_cache.has_key(token): @@ -481,9 +481,9 @@ class CobblerReadWriteXMLRPCInterface(CobblerXMLRPCInterface): self.logger.info("login failed: %s" % login_user) raise CX(_("login failed: %s") % login_user) - def __authorize(self,token,resource): + def __authorize(self,token,resource,arg1=None,arg2=None): user = self.__get_user_from_token(token) - if self.authz.authorize(user,resource): + if self.authz.authorize(user,resource,arg1,arg2): return True else: raise CX(_("user does not have access to resource: %s") % resource) diff --git a/cobbler/webui/CobblerWeb.py b/cobbler/webui/CobblerWeb.py index a69df82..9985994 100644 --- a/cobbler/webui/CobblerWeb.py +++ b/cobbler/webui/CobblerWeb.py @@ -20,7 +20,9 @@ from cobbler.utils import * import logging import sys -LOGGING_ENABLED = False +# FIXME: make logging use apache logging + +LOGGING_ENABLED = True if LOGGING_ENABLED: # set up logging @@ -179,10 +181,10 @@ class CobblerWeb(object): # Index # ------------------------------------------------------------------------ # - def index(self): + def index(self,**args): return self.__render( 'index.tmpl', { } ) - def menu(self): + def menu(self,**args): return self.__render( 'blank.tmpl', { } ) # ------------------------------------------------------------------------ # @@ -206,7 +208,7 @@ class CobblerWeb(object): # Distributions # ------------------------------------------------------------------------ # - def distro_list(self,page=None,limit=None): + def distro_list(self,page=None,limit=None,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() @@ -223,7 +225,7 @@ class CobblerWeb(object): else: return self.__render('empty.tmpl', {}) - def distro_edit(self, name=None): + def distro_edit(self, name=None,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() @@ -330,7 +332,7 @@ class CobblerWeb(object): return (page, results_per_page, pages) - def system_list(self,page=None,limit=None): + def system_list(self,page=None,limit=None,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() @@ -456,7 +458,7 @@ class CobblerWeb(object): return self.system_list() - def system_edit(self, name=None): + def system_edit(self, name=None,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() @@ -474,7 +476,7 @@ class CobblerWeb(object): # ------------------------------------------------------------------------ # # Profiles # ------------------------------------------------------------------------ # - def profile_list(self,page=None,limit=None): + def profile_list(self,page=None,limit=None,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() @@ -491,10 +493,10 @@ class CobblerWeb(object): else: return self.__render('empty.tmpl', {}) - def subprofile_edit(self, name=None): + def subprofile_edit(self, name=None,**spam): return self.profile_edit(name,1) - def profile_edit(self, name=None, subprofile=0): + def profile_edit(self, name=None, subprofile=0, **spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() @@ -611,7 +613,7 @@ class CobblerWeb(object): # Repos # ------------------------------------------------------------------------ # - def repo_list(self,page=None,limit=None): + def repo_list(self,page=None,limit=None,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() @@ -628,7 +630,7 @@ class CobblerWeb(object): else: return self.__render('empty.tmpl', {}) - def repo_edit(self, name=None): + def repo_edit(self, name=None,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() @@ -706,14 +708,14 @@ class CobblerWeb(object): # Kickstart files # ------------------------------------------------------------------------ # - def ksfile_list(self): + def ksfile_list(self,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() return self.__render( 'ksfile_list.tmpl', { 'ksfiles': self.remote.get_kickstart_templates(self.token) } ) - def ksfile_edit(self, name=None): + def ksfile_edit(self, name=None,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() return self.__render( 'ksfile_edit.tmpl', { @@ -757,7 +759,7 @@ class CobblerWeb(object): mac = self.remote.get_random_mac() return mac - def error_page(self, message): + def error_page(self, message, **spam): # hack to remove some junk from remote fault errors so they # look as if they were locally generated and not exception-based. @@ -769,7 +771,7 @@ class CobblerWeb(object): 'message': message } ) - def xmlrpc_auth_failure(self): + def xmlrpc_auth_failure(self, **spam): return self.__render( 'error_page.tmpl', { 'message': "XMLRPC Authentication Error. See Apache logs for details." } ) diff --git a/cobbler/webui/master.py b/cobbler/webui/master.py index 356fceb..d4b1d2b 100644 --- a/cobbler/webui/master.py +++ b/cobbler/webui/master.py @@ -33,10 +33,10 @@ VFN=valueForName currentTime=time.time __CHEETAH_version__ = '2.0' __CHEETAH_versionTuple__ = (2, 0, 0, 'final', 0) -__CHEETAH_genTime__ = 1196374123.089437 -__CHEETAH_genTimestamp__ = 'Thu Nov 29 17:08:43 2007' +__CHEETAH_genTime__ = 1196809899.3260081 +__CHEETAH_genTimestamp__ = 'Tue Dec 4 18:11:39 2007' __CHEETAH_src__ = 'webui_templates/master.tmpl' -__CHEETAH_srcLastModified__ = 'Wed Nov 7 12:24:52 2007' +__CHEETAH_srcLastModified__ = 'Tue Dec 4 17:33:59 2007' __CHEETAH_docstring__ = 'Autogenerated by CHEETAH: The Python-Powered Template Engine' if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple: @@ -152,56 +152,56 @@ class master(Template): <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 32, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 32, col 22. - write('''/settings_view" class="menu">Settings</a></li> + write('''?mode=settings_view" class="menu">Settings</a></li> <li><hr/></li> <li>LIST</li> <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 35, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 35, col 22. - write('''/distro_list" class="menu">Distros</a></li> + write('''?mode=distro_list" class="menu">Distros</a></li> <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 36, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 36, col 22. - write('''/profile_list" class="menu">Profiles</a></li> + write('''?mode=profile_list" class="menu">Profiles</a></li> <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 37, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 37, col 22. - write('''/system_list" class="menu">Systems</a></li> + write('''?mode=system_list" class="menu">Systems</a></li> <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 38, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 38, col 22. - write('''/ksfile_list" class="menu">Kickstarts</a></li> + write('''?mode=ksfile_list" class="menu">Kickstarts</a></li> <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 39, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 39, col 22. - write('''/repo_list" class="menu">Repos</a></li> + write('''?mode=repo_list" class="menu">Repos</a></li> <li><hr/></li> <li>ADD</li> <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 42, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 42, col 22. - write('''/distro_edit" class="menu">Distro</a></li> + write('''?mode=distro_edit" class="menu">Distro</a></li> <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 43, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 43, col 22. - write('''/profile_edit" class="menu">Profile</a></li> + write('''?mode=profile_edit" class="menu">Profile</a></li> <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 44, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 44, col 22. - write('''/subprofile_edit" class="menu">Subprofile</a></li> + write('''?mode=subprofile_edit" class="menu">Subprofile</a></li> <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 45, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 45, col 22. - write('''/system_edit" class="menu">System</a></li> + write('''?mode=system_edit" class="menu">System</a></li> <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 46, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 46, col 22. - write('''/repo_edit" class="menu">Repo</a></li> + write('''?mode=repo_edit" class="menu">Repo</a></li> <li><hr/><br/></li> <li><a class="button sync" href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 48, col 42 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 48, col 42. - write('''/sync">Sync</a></li> + write('''?mode=sync">Sync</a></li> </ul> </div> diff --git a/config/cobbler.conf b/config/cobbler.conf index 77bfe84..b4ab6d6 100644 --- a/config/cobbler.conf +++ b/config/cobbler.conf @@ -38,14 +38,10 @@ BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On AuthType Basic AuthName Cobbler Require valid-user - SetHandler mod_python - + SetHandler mod_python PythonAuthenHandler index - #PythonAccessHandler index - #PythonAuthZHandler index - PythonHandler mod_python.publisher - - # disable in production + PythonHandler index + # disable? PythonDebug on </Directory> diff --git a/scripts/index.py b/scripts/index.py index fc528df..c5ff4c0 100755 --- a/scripts/index.py +++ b/scripts/index.py @@ -1,6 +1,5 @@ """ -mod_python gateway to all interesting cobbler web and web service -functions. +mod_python gateway to all interesting cobbler web functions Copyright 2007, Red Hat, Inc Michael DeHaan <mdehaan@redhat.com> @@ -13,12 +12,13 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. """ -# still TODO: -# serve up Web UI through this interface, via tokens in headers - from mod_python import apache from mod_python import Session +from mod_python import util + import xmlrpclib +import cgi +from cobbler.webui import CobblerWeb XMLRPC_SERVER = "http://127.0.0.1/cobbler_api_rw" @@ -58,36 +58,51 @@ def __get_session(req): #====================================================== -def index(req): +def handler(req): """ Right now, index serves everything. Hitting this URL means we've already cleared authn/authz but we still need to use the token for all remote requests. - - FIXME: deal with query strings and defer to CobblerWeb.py """ my_user = __get_user(req) my_uri = req.uri - sess = __get_session(req) token = sess['cobbler_token'] - return "it seems to be all good: %s" % token - -#====================================================== - -def hello(req): - - """ - This is just another example for the publisher handler. - """ - - user = __get_user(req) - path = req.uri - return "We are in hello(%s)" % path + # needed? + req.add_common_vars() + + # process form and qs data, if any + fs = util.FieldStorage(req) + form = {} + for x in fs.keys(): + form[x] = str(fs.get(x,'default')) + + # instantiate a CobblerWeb object + cw = CobblerWeb.CobblerWeb( + token = token, + base_url = "/cobbler/web/", + server = "http://127.0.0.1/cobbler_api_rw" + ) + + # check for a valid path/mode + # handle invalid paths gracefully + mode = form.get('mode','index') + if mode in cw.modes(): + func = getattr( cw, mode ) + content = func( **form ) + else: + func = getattr( cw, 'error_page' ) + content = func( "Invalid Mode: \"%s\"" % mode ) + + # apache.log_error("%s:%s ... %s" % (my_user, my_uri, str(form))) + req.content_type = "text/html" + req.write(content) + + return apache.OK #====================================================== diff --git a/webui_templates/distro_edit.tmpl b/webui_templates/distro_edit.tmpl index 5e45800..167f8cb 100644 --- a/webui_templates/distro_edit.tmpl +++ b/webui_templates/distro_edit.tmpl @@ -15,12 +15,13 @@ function disablename(value) </script> #end if -<form method="post" action="$base_url/distro_save"> +<form method="POST" action="$base_url"> <fieldset id="cform"> #if $distro <legend>Editing Distro</legend> + <input type="hidden" name="mode" value="distro_save"> <input type="hidden" name="new_or_edit" value="edit"/> <input type="hidden" name="oldname" value="$distro.name"/> #else diff --git a/webui_templates/distro_list.tmpl b/webui_templates/distro_list.tmpl index db9897f..4fabd48 100644 --- a/webui_templates/distro_list.tmpl +++ b/webui_templates/distro_list.tmpl @@ -30,7 +30,7 @@ <tr class="$tr_class"> <td> - <a href="$base_url/distro_edit?name=$distro.name">$distro.name</a> + <a href="$base_url?mode=distro_edit&name=$distro.name">$distro.name</a> </td> <td>$distro.breed</td> <td>$distro.arch</td> diff --git a/webui_templates/ksfile_edit.tmpl b/webui_templates/ksfile_edit.tmpl index 8b0eeec..5e0c5ae 100644 --- a/webui_templates/ksfile_edit.tmpl +++ b/webui_templates/ksfile_edit.tmpl @@ -2,7 +2,7 @@ #attr $title = "Cobbler: Edit Kickstart File $ksfile" #block body -<form method="post" action="$base_url/ksfile_save"> +<form method="post" action="$base_url?mode=ksfile_save"> <input type="hidden" name="name" value="$name"/> <fieldset id="cform"> <legend>Edit Kickstart File</legend> diff --git a/webui_templates/ksfile_list.tmpl b/webui_templates/ksfile_list.tmpl index 292fcf9..dcfaa0a 100644 --- a/webui_templates/ksfile_list.tmpl +++ b/webui_templates/ksfile_list.tmpl @@ -22,9 +22,9 @@ <tr class="$tr_class"> <td>$ksfile</td> #if $ksfile.startswith("/var/lib/cobbler/kickstarts") - <td><a href="$base_url/ksfile_edit?name=$ksfile">edit</a></td> + <td><a href="$base_url?mode=ksfile_edit&name=$ksfile">edit</a></td> #else if $ksfile.startswith("/etc/cobbler") - <td><a href="$base_url/ksfile_edit?name=$ksfile">edit</a></td> + <td><a href="$base_url?mode=ksfile_edit&name=$ksfile">edit</a></td> #else if $ksfile.startswith("http://") <td><a href="$ksfile">view</A></td> #else diff --git a/webui_templates/master.tmpl b/webui_templates/master.tmpl index abd09af..96fbe75 100644 --- a/webui_templates/master.tmpl +++ b/webui_templates/master.tmpl @@ -29,23 +29,23 @@ <div id="sidebar"> <ul id="nav"> <li><a href="/cobbler/webui/wui.html" class="menu">Docs</a></li> - <li><a href="$base_url/settings_view" class="menu">Settings</a></li> + <li><a href="$base_url?mode=settings_view" class="menu">Settings</a></li> <li><hr/></li> <li>LIST</li> - <li><a href="$base_url/distro_list" class="menu">Distros</a></li> - <li><a href="$base_url/profile_list" class="menu">Profiles</a></li> - <li><a href="$base_url/system_list" class="menu">Systems</a></li> - <li><a href="$base_url/ksfile_list" class="menu">Kickstarts</a></li> - <li><a href="$base_url/repo_list" class="menu">Repos</a></li> + <li><a href="$base_url?mode=distro_list" class="menu">Distros</a></li> + <li><a href="$base_url?mode=profile_list" class="menu">Profiles</a></li> + <li><a href="$base_url?mode=system_list" class="menu">Systems</a></li> + <li><a href="$base_url?mode=ksfile_list" class="menu">Kickstarts</a></li> + <li><a href="$base_url?mode=repo_list" class="menu">Repos</a></li> <li><hr/></li> <li>ADD</li> - <li><a href="$base_url/distro_edit" class="menu">Distro</a></li> - <li><a href="$base_url/profile_edit" class="menu">Profile</a></li> - <li><a href="$base_url/subprofile_edit" class="menu">Subprofile</a></li> - <li><a href="$base_url/system_edit" class="menu">System</a></li> - <li><a href="$base_url/repo_edit" class="menu">Repo</a></li> + <li><a href="$base_url?mode=distro_edit" class="menu">Distro</a></li> + <li><a href="$base_url?mode=profile_edit" class="menu">Profile</a></li> + <li><a href="$base_url?mode=subprofile_edit" class="menu">Subprofile</a></li> + <li><a href="$base_url?mode=system_edit" class="menu">System</a></li> + <li><a href="$base_url?mode=repo_edit" class="menu">Repo</a></li> <li><hr/><br/></li> - <li><a class="button sync" href="$base_url/sync">Sync</a></li> + <li><a class="button sync" href="$base_url?mode=sync">Sync</a></li> </ul> </div> diff --git a/webui_templates/paginate.tmpl b/webui_templates/paginate.tmpl index 9d986f3..9b20e56 100644 --- a/webui_templates/paginate.tmpl +++ b/webui_templates/paginate.tmpl @@ -3,7 +3,7 @@ #if $page != 0 #set $previous_page = $page - 1 - <A HREF="${base_url}/${what}_list?page=${previous_page}&limit=${results_per_page}"><</A> + <A HREF="${base_url}?mode=${what}_list&page=${previous_page}&limit=${results_per_page}"><</A> #else < #end if @@ -15,13 +15,13 @@ #else #set doselect = " selected " #end if - <option value="${base_url}/${what}_list?page=${this_page}&limit=${results_per_page}" ${doselect} >Page ${this_page}</option> + <option value="${base_url}?mode=${what}_list&page=${this_page}&limit=${results_per_page}" ${doselect} >Page ${this_page}</option> #end for </select> #if $page != $pages #set $next_page = $page + 1 - <A HREF="${base_url}/${what}_list?page=${next_page}&limit=${results_per_page}">></A> + <A HREF="${base_url}?mode=${what}_list&page=${next_page}&limit=${results_per_page}">></A> #else > #end if diff --git a/webui_templates/profile_edit.tmpl b/webui_templates/profile_edit.tmpl index 6be47d0..f9eca09 100644 --- a/webui_templates/profile_edit.tmpl +++ b/webui_templates/profile_edit.tmpl @@ -13,7 +13,7 @@ function disablename(value) </script> #end if -<form method="post" action="$base_url/profile_save"> +<form method="post" action="$base_url?mode=profile_save"> <fieldset id="cform"> <!-- diff --git a/webui_templates/profile_list.tmpl b/webui_templates/profile_list.tmpl index 047714a..f213775 100644 --- a/webui_templates/profile_list.tmpl +++ b/webui_templates/profile_list.tmpl @@ -29,13 +29,13 @@ <tr class="$tr_class"> <td> - <a href="$base_url/profile_edit?name=$profile.name">$profile.name</a> + <a href="$base_url?mode=profile_edit&name=$profile.name">$profile.name</a> </td> <td> #if $profile.distro != "<<inherit>>" - <a href="$base_url/distro_edit?name=$profile.distro">$profile.distro</a> + <a href="$base_url?mode=distro_edit&name=$profile.distro">$profile.distro</a> #else - <a href="$base_url/profile_edit?name=$profile.parent">$profile.parent</A> + <a href="$base_url?mode=profile_edit&name=$profile.parent">$profile.parent</A> #end if </td> <td>$profile.kickstart</td> diff --git a/webui_templates/repo_edit.tmpl b/webui_templates/repo_edit.tmpl index 6fb5c72..17ca4ec 100644 --- a/webui_templates/repo_edit.tmpl +++ b/webui_templates/repo_edit.tmpl @@ -14,7 +14,7 @@ function disablename(value) #end if -<form method="post" action="$base_url/repo_save"> +<form method="post" action="$base_url?mode=repo_save"> <fieldset id="cform"> #if $repo diff --git a/webui_templates/system_edit.tmpl b/webui_templates/system_edit.tmpl index cc1c0c3..fa37244 100644 --- a/webui_templates/system_edit.tmpl +++ b/webui_templates/system_edit.tmpl @@ -32,7 +32,7 @@ function disablename(value) function get_random_mac() { xmlHttp = new XMLHttpRequest(); - xmlHttp.open("GET", "$base_url/random_mac", true); + xmlHttp.open("GET", "$base_url?mode=random_mac", true); xmlHttp.onreadystatechange = function () { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { var mac_field = document.getElementById("macaddress") @@ -87,7 +87,7 @@ function page_onload() { } </script> -<form method="post" action="$base_url/system_save"> +<form method="post" action="$base_url?mode=system_save"> <fieldset id="cform"> #if $system diff --git a/webui_templates/system_list.tmpl b/webui_templates/system_list.tmpl index 2e5833a..5c70ffc 100644 --- a/webui_templates/system_list.tmpl +++ b/webui_templates/system_list.tmpl @@ -31,10 +31,10 @@ <tr class="$tr_class"> <td> - <a href="$base_url/system_edit?name=${system.name}">${system.name}</a> + <a href="$base_url?mode=system_edit&name=${system.name}">${system.name}</a> </td> <td> - <a href="$base_url/profile_edit?name=${system.profile}">${system.profile}</a> + <a href="$base_url?mode=profile_edit&name=${system.profile}">${system.profile}</a> </td> ## <td> ${system.mac_address} </td> ## <td> ${system.ip_address} </td> |