Community:40GUIDevelopment
From Splunk Wiki
Developing GUI components in Splunk 4.0?
Let us know what you did and how you did it! Add a topic to this page and explain how you solved your problem with the all-new Splunk 4.0 development interface and architecture!
Packaging custom UI components
This topic shows how to package custom UI components for apps so the custom components can be accessed from Splunk Web.
When configuring custom endpoints for Splunk Web, the custom endpoints behave identically as the standard Splunk Web endpoints:
- use the route system (Splunk Web uses the route system to map a URL to code)
- allow authorized and unauthorized access
- have full access to the request object
- have full python access, which means full disk access
Configuring custom endpoints for Splunk Web
The mount point for custom endpoints is:
http://localhost:8000/custom/<AppName>/
This mount point avoids name collision with any standard Splunk endpoint.
Declare a host controller for the custom endpoint in web.conf
. To set custom configurations, create or edit web.conf in $SPLUNK_HOME/etc/apps/<APP_NAME>/default/
.
Add the following stanza to web.conf:
[endpoint:<unique identifier>] # no other content required
Place the python resources implementing the custom endpoint in the controllers directory, which is at the following location:
$SPLUNK_HOME/etc/apps/<APP_NAME>/appserver/controllers/
The controller framework imports any valid python module+controller class declared in web.conf
.
Note: Changes to web.conf
require a full restart; changes to python code require a splunkweb restart.
Example: Sample controller providing network utilities for a network app
This example provides network utilities for a network app, and exposes the following URIs:
http://localhost:8000/custom/network/netutils/header_echo http://localhost:8000/custom/network/netutils/routed?A=B http://localhost:8000/custom/network/netutils/mako_template
The endpoint author has full access to the CherryPy, Mako, and Splunk Python modules.
netutils.py
netutils.py
provides HTTP utilities for the app. Place the file in the controllers directory:
$SPLUNK_HOME/etc/apps/network/appserver/controllers/netutils.py
# netutils.py import cherrypy import splunk.appserver.mrsparkle.controllers as controllers from splunk.appserver.mrsparkle.lib.decorators import expose_page from splunk.appserver.mrsparkle.lib.routes import route class TestController(controllers.BaseController): """ Test instantiation of a BaseController-style class """ @expose_page(must_login=True) def header_echo(self, **kwargs): cherrypy.response.headers['Content-Type'] = 'text/plain' output = [] for k,v in cherrypy.request.headers.items(): output.append('%s: %s' % (k, v)) return '\n'.join(output) @route('/:path=routed') @expose_page(must_login=True) def request_echo(self, **kwargs): """ Example handler that uses the @route() decorator to control the URI endpoint mapping """ cherrypy.response.headers['Content-Type'] = 'text/plain' output = [] for k,v in kwargs.items(): output.append('%s: %s' % (k, v)) return '\n'.join(output) @expose_page(must_login=True) def mako_template(self, **kwargs): # note the path syntax here: in order to reference templates # included in an app, use the modified path of the form: # /<YOUR_APP_NAME>:/templates/<YOUR_TEMPLATE_NAME> return self.render_template('/network:/templates/controller_test.html', {'qs': kwargs}) |
web.conf
Place the following single line stanza in web.conf
at $SPLUNK_HOME/etc/apps/network/default/web.conf
[endpoint:netutils] |
Example: Executing a Splunk script
This example shows how the network application from the first example executes a script located in $SPLUNK_HOME/bin/scripts
.
It exposes a URI for the script, such as:
http://localhost:8000/custom/network/networkscripts/proxy_raw?script_name=echo.sh&arg=A%20B%20C
networkscripts.py
Place networkscripts.py
in the controllers directory:
$SPLUNK_HOME/etc/apps/network/appserver/controllers/networkscripts.py
# networkscripts.py import re import logging import os from subprocess import Popen, PIPE import cherrypy import splunk.appserver.mrsparkle.controllers as controllers import splunk.appserver.mrsparkle.lib.util as util from splunk.appserver.mrsparkle.lib.decorators import expose_page from splunk.appserver.mrsparkle.lib.routes import route logger = logging.getLogger('splunk.appserver.custom.testing.shell') class UserScriptController(controllers.BaseController): """ Proof of concept custom shell script proxy runner. WARNING: DO NOT COPY PASTE THIS INTO PRODUCTION. IT HAS NOT BEEN VETTED FOR SECURITY. USAGE: http://localhost:8000/custom/testing/shell/proxy_raw?script_name=echo.sh&arg=A%20B%20C """ @expose_page(must_login=True) def proxy_raw(self, script_name, arg=, **unused): # clean the script name script_name = re.split(r'[\/\\]+', script_name)[-1] script_path = util.make_splunkhome_path(['bin', 'scripts', script_name]) # verify that script exists if not os.path.exists(script_path): raise Exception, 'The user script %s was not found' % script_name # execute and return script output script_line = [script_path, arg] logger.info('executing custom script: %s' % script_line) return Popen(script_line, stdout=PIPE).communicate()[0] |
web.conf
Place the following single line stanza in web.conf
at $SPLUNK_HOME/etc/apps/network/default/web.conf
[endpoint:networkscripts] |