The provided module scripts are developed in Python. Theoretically, it is possible to develop module scripts in a different language, as long as the input, output and argument handling remains the same. The example provided in this section makes use of the Python programming language.
Each module script consists of 2 main parts:
The script header, which contains information like script name, targets, priorities and description.
The actual script, which handles a small set of parameters.
For examples of functional module scripts, refer to the existing
modules in the /etc/template.d/scripts
directory.
Module Script Header
Module script headers require a very specific comment block in order for ovm-chkconfig to handle enabling and disabling your script functionality. The format for the script header is as follows:
### BEGIN PLUGIN INFO # name: [script name] # [target]: [priority] # [target]: [priority] # description: a description that can # cross multiple lines. ### END PLUGIN INFO
When developing your own module script, you must include a header following the exact same format. Provide your own script name, which will be used when calling ovm-chkconfig, the targets that your script will support, and the priority for your script. The priority will specify in what order the script gets executed. You do not have to implement all targets. If you have a configure target but no cleanup target, this is still acceptable. The configure target gets called when a first boot/initial start of the virtual machine happens. The cleanup target happens when you manually initiate a cleanup in your virtual machine or when you want to restore the virtual machine to its original state. An example of the network module script header is provided below:
### BEGIN PLUGIN INFO # name: network # configure: 50 # cleanup: 50 # description: Script to configure template network. ### END PLUGIN INFO
Module Script Body
The main requirement for the module script body is that it accepts at least one target parameter. Target parameters that might get presented by the ovm-template-configure script include:
configure
unconfigure
reconfigure
cleanup
suspend
resume
migrate
shutdown
Your script can handle any other arguments that you require.
There is one optional parameter which is useful to implement and
this is -e
or --enumerate
.
ovm-template-config uses this to be able to
enumerate or list the parameters for a target supported by your
script.
A very basic template to use for your script body follows:
try: import json except ImportError: import simplejson as json from templateconfig.cli import main def do_enumerate(target): param = [] if target == 'configure': param += [] elif target == 'cleanup': param += [] return json.dumps(param) def do_configure(param): param = json.loads(param) return json.dumps(param) def do_cleanup(param): param = json.loads(param) return json.dumps(param) if __name__ == '__main__': main(do_enumerate, {'configure': do_configure, 'cleanup': do_cleanup})
This script supports the configure and cleanup targets.
You can fill out the script with your own code. For instance,
for the do_enumerate
function, you would populate
the parameters that are supported for each target in the script.
An example from the firewall module is presented below:
def do_enumerate(target): param = [] if target == 'configure': param += [{'key': 'com.oracle.linux.network.firewall', 'description': 'Whether to enable network firewall: True or False.', 'hidden': True}] return json.dumps(param)
Each target function begins by reading the JSON parameters
passed to the script, using the param =
json.loads(param)
statement. From this point, code can be
written to perform actions based on the values of the keys that
the script expects to receive. Once again, the example provided
below is from the firewall module:
def do_configure(param): param = json.loads(param) firewall = param.get('com.oracle.linux.network.firewall') if firewall == 'True': shell_cmd('service iptables start') shell_cmd('service ip6tables start') shell_cmd('chkconfig --level 2345 iptables on') shell_cmd('chkconfig --level 2345 ip6tables on') elif firewall == 'False': shell_cmd('service iptables stop') shell_cmd('service ip6tables stop') shell_cmd('chkconfig --level 2345 iptables off') shell_cmd('chkconfig --level 2345 ip6tables off') return json.dumps(param)
Module Script Packaging
Once you have written one or more configuration module scripts,
you may want to package them as RPMs that can be deployed on
other systems. In order to install and configure template
configure scripts, they have to be packaged in an RPM, with a
specific naming convention. Package the script as
ovm-template-config-[scriptname]
. Ideally
in the post install of the RPM you should add the script
automatically by executing # /usr/sbin/ovm-chkconfig
--add
. When
de-installing a script/RPM, remove it at uninstall time using
scriptname
# /usr/sbin/ovm-chkconfig --del
. This is
illustrated in the following example of an RPM spec file that
can be used:
scriptname
Name: ovm-template-config-example Version: 3.0 Release: 1%{?dist} Summary: Oracle VM template example configuration script. Group: Applications/System License: GPL URL: http://www.oracle.com/virtualization Source0: %{name}-%{version}.tar.gz BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildArch: noarch Requires: ovm-template-config %description Oracle VM template example configuration script. %prep %setup -q %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT %clean rm -rf $RPM_BUILD_ROOT %post if [ $1 = 1 ]; then /usr/sbin/ovm-chkconfig --add example fi %preun if [ $1 = 0 ]; then /usr/sbin/ovm-chkconfig --del example fi %files %defattr(-,root,root,-) %{_sysconfdir}/template.d/scripts/example %changelog * Tue Mar 22 2011 John Smith - 3.0-1 - Initial build.
Edit the example spec file to reference your own script name.
In order to create RPMs, you must install
rpmbuild
:
# yum install rpm-build
The following example Makefile may help to automate the build process:
DESTDIR= PACKAGE=ovm-template-config-example VERSION=3.0 help: @echo 'Commonly used make targets:' @echo ' install - install program' @echo ' dist - create a source tarball' @echo ' rpm - build RPM packages' @echo ' clean - remove files created by other targets' dist: clean mkdir $(PACKAGE)-$(VERSION) tar -cSp --to-stdout --exclude .svn --exclude .hg --exclude .hgignore \ --exclude $(PACKAGE)-$(VERSION) * | tar -x -C $(PACKAGE)-$(VERSION) tar -czSpf $(PACKAGE)-$(VERSION).tar.gz $(PACKAGE)-$(VERSION) rm -rf $(PACKAGE)-$(VERSION) install: install -D example $(DESTDIR)/etc/template.d/scripts/example rpm: dist rpmbuild -ta $(PACKAGE)-$(VERSION).tar.gz clean: rm -fr $(PACKAGE)-$(VERSION) find . -name '*.py[cdo]' -exec rm -f '{}' ';' rm -f *.tar.gz .PHONY: dist install rpm clean
Edit this Makefile to reference your own script.
Create a working directory, copy over your script, the spec file and the Makefile. Run:
# make dist
to create a src tarball of your code and then run:
# make rpm
This will generate an RPM in the
RPMS/noarch
directory within your working
directory. For example:
RPMS/noarch/ovm-template-config-test-3.0-1.el6.noarch.rpm
.