summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Cammarata <jimi@sngx.net>2009-03-10 18:32:30 -0500
committerJames Cammarata <jimi@sngx.net>2009-03-10 18:32:45 -0500
commit1f005d6bbfddb479007f0108a58968c856ade7a4 (patch)
treec1152cfbe0f95687fe6a3db2c4a16a70ebee8bea
parent62d0d2a0803891d92aa06381691fcbbd71635d16 (diff)
parentaf1b793291be4cb85f8fb82ce8f41cabc688c41f (diff)
downloadcobbler-1f005d6bbfddb479007f0108a58968c856ade7a4.tar.gz
cobbler-1f005d6bbfddb479007f0108a58968c856ade7a4.tar.xz
cobbler-1f005d6bbfddb479007f0108a58968c856ade7a4.zip
Merge branch 'devel' of git://git.fedorahosted.org/cobbler into ris-devel
-rw-r--r--CHANGELOG6
-rw-r--r--MANIFEST.in2
-rw-r--r--aux/anamon (renamed from aux/anamon.py)0
-rw-r--r--aux/anamon.init6
-rw-r--r--cobbler.spec6
-rw-r--r--cobbler/action_check.py4
-rw-r--r--cobbler/remote.py3
-rw-r--r--cobbler/webui/CobblerWeb.py42
-rw-r--r--scripts/cobbler-ext-nodes4
-rw-r--r--setup.py2
-rw-r--r--snippets/post_anamon6
-rw-r--r--snippets/pre_anamon4
-rw-r--r--templates/tftpd-rules.template2
-rw-r--r--webui_templates/master.tmpl24
-rw-r--r--webui_templates/search.tmpl135
15 files changed, 188 insertions, 58 deletions
diff --git a/CHANGELOG b/CHANGELOG
index cdb0a764..285ebcf6 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,9 @@
Cobbler CHANGELOG
-- Tue Mar 3 2009 - 1.5.0
+- Mon Mar 7 2009 - 1.7.0
+- Development release start
+
+- Mon Mar 7 2009 - 1.6.0
- (FEAT) Improved anaconda monitoring code
- (FEAT) preliminary linux-ris support for windows installs (WIP)
- (FEAT) download comps.xml always
@@ -16,6 +19,7 @@ Cobbler CHANGELOG
- (FEAT) use nameserver variable in network config in Anaconda when set
- (BUGF) sleep 5 seconds between power cycling systems
- (FEAT) support for /usr/bin/cobbler-register
+- (FEAT) web UI search feature
- Tue Mar 3 2009 - 1.4.3
- (BUGF) fix OMAPI support's (note: deprecated) usage of subprocess
diff --git a/MANIFEST.in b/MANIFEST.in
index 22e55a70..6532779e 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -19,7 +19,7 @@ include config/users.conf
include config/completions
include config/cobbler_bash
include config/cheetah_macros
-include aux/anamon.py
+include aux/anamon
include aux/anamon.init
recursive-include templates *.template
recursive-include installer_templates *.template defaults
diff --git a/aux/anamon.py b/aux/anamon
index fe4d0eb6..fe4d0eb6 100644
--- a/aux/anamon.py
+++ b/aux/anamon
diff --git a/aux/anamon.init b/aux/anamon.init
index b2fd9828..d029c881 100644
--- a/aux/anamon.init
+++ b/aux/anamon.init
@@ -48,7 +48,7 @@ fi
start() {
echo -n $"Starting anamon: "
- daemon /usr/local/sbin/anamon.py --watchfile \"$LOGFILES\" --name $COBBLER_NAME --server $COBBLER_SERVER --port ${COBBLER_PORT:-80} --exit
+ daemon /usr/local/sbin/anamon --watchfile \"$LOGFILES\" --name $COBBLER_NAME --server $COBBLER_SERVER --port ${COBBLER_PORT:-80} --exit
RETVAL=$?
[ $RETVAL -eq 0 ] && touch $LOCKFILE
echo
@@ -61,7 +61,7 @@ start() {
stop () {
echo -n $"Shutting down anamon: "
- killproc /usr/local/sbin/anamon.py
+ killproc /usr/local/sbin/anamon
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f $LOCKFILE
echo
@@ -89,7 +89,7 @@ case "$1" in
fi
;;
status)
- status anamon.py
+ status anamon
RETVAL=$?
;;
*)
diff --git a/cobbler.spec b/cobbler.spec
index 33033e93..73a39f14 100644
--- a/cobbler.spec
+++ b/cobbler.spec
@@ -165,10 +165,8 @@ test "x$RPM_BUILD_ROOT" != "x" && rm -rf $RPM_BUILD_ROOT
%dir /var/www/cobbler/aux
%defattr(444,apache,apache)
/var/www/cobbler/webui/*
-%ghost /var/www/cobbler/aux/anamon.pyc
-%ghost /var/www/cobbler/aux/anamon.pyo
-/var/www/cobbler/aux/*.py
-/var/www/cobbler/aux/*.init
+/var/www/cobbler/aux/anamon
+/var/www/cobbler/aux/anamon.init
%defattr(755,root,root)
%{_bindir}/cobbler
diff --git a/cobbler/action_check.py b/cobbler/action_check.py
index ea1fb66d..3cd4a0f8 100644
--- a/cobbler/action_check.py
+++ b/cobbler/action_check.py
@@ -364,13 +364,13 @@ class BootCheck:
if os.path.exists("/etc/init.d/ris-linuxd"):
return True
else:
- status.append(_("ris-linux is not installed, Microsoft Windows remote installations will not function correctly"))
+ status.append(_("ris-linux was not found, Microsoft Windows remote (physical) installations will not function correctly unless installed"))
return False
def check_for_cabextract(self,status):
if not os.path.exists("/usr/bin/cabextract"):
- status.append(_("cabextract was not found, Microsoft Windows imports will not work correctly"))
+ status.append(_("cabextract was not found, Microsoft Windows imports (for physical installations) will not work correctly unless installed"))
def check_smb_shares(self,status):
diff --git a/cobbler/remote.py b/cobbler/remote.py
index 10e9cc20..6fdb96fe 100644
--- a/cobbler/remote.py
+++ b/cobbler/remote.py
@@ -906,9 +906,6 @@ class CobblerXMLRPCInterface:
data2[str(key)] = self.xmlrpc_hacks(data[key])
return data2
- else:
- data = '~'
-
return data
def get_status(self,**rest):
diff --git a/cobbler/webui/CobblerWeb.py b/cobbler/webui/CobblerWeb.py
index 6175ef50..ebfe5274 100644
--- a/cobbler/webui/CobblerWeb.py
+++ b/cobbler/webui/CobblerWeb.py
@@ -154,17 +154,21 @@ class CobblerWeb(object):
def distro_menu(self,**spam):
return self.__render('blank.tmpl',{ 'more_blank' : 1})
- def __search_execute(self,what,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None):
+ def __search_execute(self,what,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,key4=None,value4=None,key5=None,value5=None):
if not self.__xmlrpc_setup():
return self.xmlrpc_auth_failure()
criteria={}
- if key1 is not None and key1 != "":
+ if value1 is not None and value1 != "":
criteria[key1] = value1.replace('"','')
- if key2 is not None and key2 != "":
+ if value2 is not None and value2 != "":
criteria[key2] = value2.replace('"','')
- if key3 is not None and key3 != "":
+ if value3 is not None and value3 != "":
criteria[key3] = value3.replace('"','')
+ if value4 is not None and value4 != "":
+ criteria[key4] = value4.replace('"','')
+ if value5 is not None and value5 != "":
+ criteria[key5] = value5.replace('"','')
params = {}
params['page'] = -1
@@ -189,16 +193,20 @@ class CobblerWeb(object):
else:
return self.__render('empty.tmpl', { 'search' : 1 })
- def distro_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,**rest):
- return self.__search_execute("distro",key1,value1,key2,value2,key3,value3)
- def profile_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,**rest):
- return self.__search_execute("profile",key1,value1,key2,value2,key3,value3)
- def system_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,**rest):
- return self.__search_execute("system",key1,value1,key2,value2,key3,value3)
- def image_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,**rest):
- return self.__search_execute("image",key1,value1,key2,value2,key3,value3)
- def repo_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,**rest):
- return self.__search_execute("repo",key1,value1,key2,value2,key3,value3)
+ def distro_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,key4=None,value4=None,key5=None,value5=None,**rest):
+ return self.__search_execute("distro",key1,value1,key2,value2,key3,value3,key4,value4,key5,value5)
+
+ def profile_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,key4=None,value4=None,key5=None,value5=None,**rest):
+ return self.__search_execute("profile",key1,value1,key2,value2,key3,value3,key4,value4,key5,value5)
+
+ def system_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,key4=None,value4=None,key5=None,value5=None,**rest):
+ return self.__search_execute("system",key1,value1,key2,value2,key3,value3,key4,value4,key5,value5)
+
+ def image_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,key4=None,value4=None,key5=None,value5=None,**rest):
+ return self.__search_execute("image",key1,value1,key2,value2,key3,value3,key4,value4,key5,value5)
+
+ def repo_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,key4=None,value4=None,key5=None,value5=None,**rest):
+ return self.__search_execute("repo",key1,value1,key2,value2,key3,value3,key4,value4,key5,value5)
def __search(self, what):
caption = ""
@@ -276,7 +284,7 @@ class CobblerWeb(object):
def distro_save(self,name=None,comment=None,oldname=None,new_or_edit=None,editmode='edit',kernel=None,
initrd=None,kopts=None,koptspost=None,ksmeta=None,owners=None,arch=None,breed=None,redhatmanagementkey=None,
- mgmt_classes=None,osversion=None,delete1=False,delete2=False,recursive=False,**args):
+ redhatmanagementserver=None,mgmt_classes=None,osversion=None,delete1=False,delete2=False,recursive=False,**args):
if not self.__xmlrpc_setup():
return self.xmlrpc_auth_failure()
@@ -598,7 +606,7 @@ class CobblerWeb(object):
virtpath=None,virtram=None,virttype=None,virtcpus=None,virtfilesize=None,
name_servers=None,name_servers_search=None,
power_type=None, power_user=None, power_pass=None, power_id=None, power_address=None,
- gateway=None,hostname=None,redhatmanagementkey=None,mgmt_classes=None,delete1=None, delete2=None, **args):
+ gateway=None,hostname=None,redhatmanagementkey=None,redhatmanagementserver=None,mgmt_classes=None,delete1=None, delete2=None, **args):
if not self.__xmlrpc_setup():
@@ -774,7 +782,7 @@ class CobblerWeb(object):
ksmeta=None,owners=None,enablemenu=None,virtfilesize=None,virtram=None,virttype=None,
virtpath=None,repos=None,dhcptag=None,delete1=False,delete2=False,
parent=None,virtcpus=None,virtbridge=None,subprofile=None,server_override=None,
- name_servers=None,name_servers_search=None,redhatmanagementkey=None,mgmt_classes=None,recursive=False,**args):
+ name_servers=None,name_servers_search=None,redhatmanagementserver=None,redhatmanagementkey=None,mgmt_classes=None,recursive=False,**args):
if not self.__xmlrpc_setup():
return self.xmlrpc_auth_failure()
diff --git a/scripts/cobbler-ext-nodes b/scripts/cobbler-ext-nodes
index f9510c0d..919bc948 100644
--- a/scripts/cobbler-ext-nodes
+++ b/scripts/cobbler-ext-nodes
@@ -1,6 +1,6 @@
#!/usr/bin/python
-from cobbler import yaml as yaml
+import yaml # PyYAML version
import urlgrabber
import sys
@@ -15,7 +15,7 @@ if __name__ == "__main__":
conf = open("/etc/cobbler/settings")
data = conf.read()
conf.close()
- server = yaml.load(data).next()["server"]
+ server = yaml.load(data)["server"]
url = "http://%s/cblr/svc/op/puppet/hostname/%s" % (server, hostname)
print urlgrabber.urlread(url)
diff --git a/setup.py b/setup.py
index 10664fe0..1a218981 100644
--- a/setup.py
+++ b/setup.py
@@ -333,7 +333,7 @@ if __name__ == "__main__":
(wwwcon, ['webui_content/cobblerweb.css']),
# Anamon script
- (vw_aux, ['aux/anamon.py', 'aux/anamon.init']),
+ (vw_aux, ['aux/anamon', 'aux/anamon.init']),
# Directories to hold cobbler triggers
("%s/add/distro/pre" % trigpath, []),
diff --git a/snippets/post_anamon b/snippets/post_anamon
index fc33cfa5..816a0c13 100644
--- a/snippets/post_anamon
+++ b/snippets/post_anamon
@@ -1,13 +1,13 @@
#if $str($getVar('anamon_enabled','')) == "1"
## install anamon script
-wget -O /usr/local/sbin/anamon.py "http://$server/cobbler/aux/anamon.py"
+wget -O /usr/local/sbin/anamon "http://$server/cobbler/aux/anamon"
## install anamon system service
wget -O /etc/rc.d/init.d/anamon "http://$server/cobbler/aux/anamon.init"
## adjust permissions
-chmod 755 /etc/rc.d/init.d/anamon /usr/local/sbin/anamon.py
-test -d /selinux && restorecon /etc/rc.d/init.d/anamon /usr/local/sbin/anamon.py
+chmod 755 /etc/rc.d/init.d/anamon /usr/local/sbin/anamon
+test -d /selinux && restorecon /etc/rc.d/init.d/anamon /usr/local/sbin/anamon
## enable the script
chkconfig --add anamon
diff --git a/snippets/pre_anamon b/snippets/pre_anamon
index 636dc1bf..5d38bda2 100644
--- a/snippets/pre_anamon
+++ b/snippets/pre_anamon
@@ -1,4 +1,4 @@
#if $str($getVar('anamon_enabled','')) == "1"
-wget -O /tmp/anamon.py "http://$server/cobbler/aux/anamon.py"
-python /tmp/anamon.py --name "$name" --server "$server" --port "$http_port"
+wget -O /tmp/anamon "http://$server/cobbler/aux/anamon"
+python /tmp/anamon --name "$name" --server "$server" --port "$http_port"
#end if
diff --git a/templates/tftpd-rules.template b/templates/tftpd-rules.template
index 2c22b01c..74c4c25f 100644
--- a/templates/tftpd-rules.template
+++ b/templates/tftpd-rules.template
@@ -1,6 +1,6 @@
# TFTP rules to:
# - Convert backslashes to forward slashes
-# - Convert everything under /winos/*/* to upper-case
+# - Convert everything to upper-case
rg \\ / # Convert backslashes to slashes
r (.*/i386/)(.*) \1\L\2
diff --git a/webui_templates/master.tmpl b/webui_templates/master.tmpl
index 80865605..6244ebaa 100644
--- a/webui_templates/master.tmpl
+++ b/webui_templates/master.tmpl
@@ -32,7 +32,7 @@
<li><a class="menu">Distros</span></li>
##if $mode.find("distro") != -1
<ul id="navaction">
- <li><a href="$base_url?mode=distro_list" class="menu">View</a></li>
+ <li><a href="$base_url?mode=distro_list" class="menu">List</a></li>
<li><a href="$base_url?mode=distro_search" class="menu">Search</a></li>
<li><a href="$base_url?mode=distro_edit" class="menu">Add</a></li>
</ul>
@@ -40,7 +40,7 @@
<li><a class="menu">Profiles</span></li>
##if $mode.find("profile") != -1
<ul id="navaction">
- <li><a href="$base_url?mode=profile_list" class="menu">View</a></li>
+ <li><a href="$base_url?mode=profile_list" class="menu">List</a></li>
<li><a href="$base_url?mode=profile_search" class="menu">Search</a></li>
<li><a href="$base_url?mode=profile_edit" class="menu">Add</a></li>
<li><a href="$base_url?mode=subprofile_edit" class="menu">Add child</a></li>
@@ -49,22 +49,15 @@
<li><a class="menu">Systems</span></li>
##if $mode.find("system") != -1
<ul id="navaction">
- <li><a href="$base_url?mode=system_list" class="menu">View</a></li>
+ <li><a href="$base_url?mode=system_list" class="menu">List</a></li>
<li><a href="$base_url?mode=system_search" class="menu">Search</a></li>
<li><a href="$base_url?mode=system_edit_new" class="menu">Add</a></li>
</ul>
##end if
- <li><a class="menu">Kickstarts</span></li>
- ##if $mode.find("ksfile") != -1
- <ul id="navaction">
- <li><a href="$base_url?mode=ksfile_list" class="menu">View</a></li>
- <li><a href="$base_url?mode=ksfile_new" class="menu">Add</a></li>
- </ul>
- ##end if
<li><a class="menu">Repos</span></li>
##if $mode.find("repo") != -1
<ul id="navaction">
- <li><a href="$base_url?mode=repo_list" class="menu">View</a></li>
+ <li><a href="$base_url?mode=repo_list" class="menu">List</a></li>
<li><a href="$base_url?mode=repo_search" class="menu">Search</a></li>
<li><a href="$base_url?mode=repo_edit" class="menu">Add</a></li>
</ul>
@@ -72,11 +65,18 @@
<li><a class="menu">Images</span></li>
##if $mode.find("image") != -1
<ul id="navaction">
- <li><a href="$base_url?mode=image_list" class="menu">View</a></li>
+ <li><a href="$base_url?mode=image_list" class="menu">List</a></li>
<li><a href="$base_url?mode=image_search" class="menu">Search</a></li>
<li><a href="$base_url?mode=image_edit" class="menu">Add</a></li>
</ul>
##end if
+ <li><a class="menu">Kickstarts</span></li>
+ ##if $mode.find("ksfile") != -1
+ <ul id="navaction">
+ <li><a href="$base_url?mode=ksfile_list" class="menu">List</a></li>
+ <li><a href="$base_url?mode=ksfile_new" class="menu">Add</a></li>
+ </ul>
+ ##end if
<li><hr/><br/></li>
<li><a class="button sync" href="$base_url?mode=sync">Sync</a></li>
</ul>
diff --git a/webui_templates/search.tmpl b/webui_templates/search.tmpl
index f3fca6cb..44f1eb50 100644
--- a/webui_templates/search.tmpl
+++ b/webui_templates/search.tmpl
@@ -12,29 +12,152 @@
<legend>$caption</legend>
<table border=0>
- <tr>
+ #for $ct in [ "1", "2", "3", "4", "5"]
+ #set keyname="key"+$ct
+ #set valname="value"+$ct
+
+ <tr>
<td>
- <select id="key1" name="key1">
+ <select id="$keyname" name="$keyname">
+ #if $ct == "1"
<option value="name">name</option>
+ #else
+ <option value="">[SELECT]</option>
+ #end if
#if $what == "distro":
+ <option value="arch">arch</option>
+ <option value="breed">breed</option>
+ <option value="comment">comment</option>
<option value="kernel">kernel</option>
<option value="initrd">initrd</option>
+ <option value="kernel_options">kernel options</option>
+ <option value="kernel_options_post">kernel options (post install)</option>
+ <option value="ks_meta">kickstart metadata</option>
+ <option value="mgmt_classes">management classes</option>
+ <option value="os_version">os version</option>
+ <option value="owners">owners</option>
+ <option value="redhat_management_key">red hat management key</option>
+ <option value="redhat_management_server">red hat management server</option>
+ <option value="template_files">template files</option>
+
#elif $what == "profile"
+ <option value="comment">comment</option>
+ <option value="dhcp_tag">dhcp tag</option>
<option value="distro">distro</option>
+ <option value="owners">owners</option>
+ <option value="kickstart">kickstart</option>
+ <option value="kernel_options">kernel options</option>
+ <option value="kernel_options_post">kernel options (post install)</option>
+ <option value="ks_meta">kickstart metadata</option>
+ <option value="mgmt_classes">management classes</option>
+ <option value="name_servers">name servers</option>
+ <option value="name_servers_search">name servers search</option>
+ <option value="parent">parent (subprofiles only)</option>
+ <option value="redhat_management_key">red hat management key</option>
+ <option value="redhat_management_server">red hat management server</option>
+ <option value="repos">repos</option>
+ <option value="template_files">template files</option>
+ <option value="virt_bridge">virt bridge</option>
+ <option value="virt_cpus">virt cpus</option>
+ <option value="virt_file_size">virt file size (GB)</option>
+ <option value="virt_path">virt path</option>
+ <option value="virt_ram">virt ram (MB)</option>
+ <option value="virt_type">virt type</option>
+ <option value="server">server override</option>
+
#elif $what == "system"
- <option value="profile">profile</option>
+
+ <option value="bonding">bonding</option>
+ <option value="bonding_master">bonding master</option>
+ <option value="bonding_opts">bonding opts</option>
+ <option value="comment">comment</option>
+ <option value="dhcp_tag">dhcp tag</option>
+ <option value="distro">distro</option>
+ <option value="dns_name">dns name</option>
+ <option value="gateway">gateway</option>
+ <option value="hostname">hostname</option>
<option value="image">image</option>
+ <option value="ip_address">ip address</option>
+ <option value="kickstart">kickstart</option>
+ <option value="kernel_options">kernel options</option>
+ <option value="kernel_options_post">kernel options (post install)</option>
+ <option value="ks_meta">kickstart metadata</option>
+ <option value="mac_address">mac address</option>
+ <option value="mgmt_classes">management classes</option>
+ <option value="name_servers">name servers</option>
+ <option value="name_servers_search">name servers search</option>
+ <option value="netboot_enabled">netboot enabled</option>
+ <option value="owners">owners</option>
+ <option value="power_address">power address</option>
+ <option value="power_id">power id</option>
+ <option value="power_pass">power password</option>
+ <option value="power_type">power type</option>
+ <option value="power_user">power user</option>
+ <option value="profile">profile</option>
+
+ <option value="redhat_management_key">red hat management key</option>
+ <option value="redhat_management_server">red hat management server</option>
+ <option value="repos">repos</option>
+ <option value="server">server override</option>
+ <option value="subnet">subnet</option>
+ <option value="static">static</option>
+ <option value="static_routes">static_routes</option>
+ <option value="template_files">template files</option>
+ <option value="virt_bridge">virt bridge</option>
+ <option value="virt_cpus">virt cpus</option>
+ <option value="virt_file_size">virt file size (GB)</option>
+ <option value="virt_path">virt path</option>
+ <option value="virt_ram">virt ram (MB)</option>
+ <option value="virt_type">virt type</option>
+
+ #elif $what == "repo"
+ <option value="arch">arch</option>
+ <option value="breed">breed</option>
+ <option value="comment">comment</option>
+ <option value="createrepo_flags">createrepo flags</option>
+ <option value="environment">environment</option>
+ <option value="keep_updated">keep updated</option>
+ <option value="mirror">mirror</option>
+ <option value="mirror_locally">mirror locally</option>
+ <option value="owners">owners</option>
+ <option value="priority">priority</option>
+ <option value="rpm_list">rpm list</option>
+ <option value="yumopts">yum options</option>
+
+
+ #elif $what == "image"
+ <option value="arch">arch</option>
+ <option value="breed">breed</option>
+ <option value="comment">comment</option>
+ <option value="file">file</option>
+ <option value="image_type">image type</option>
+ <option value="network_count">network count</option>
+ <option value="os_version">os version</option>
+ <option value="owners">owners</option>
+ <option value="virt_ram">virt ram (MB)</option>
+ <option value="virt_path">virt path</option>
+ <option value="virt_type">virt type</option>
+ <option value="virt_cpus">virt cpus</option>
+ <option value="virt_bridge">virt bridge</option>
+ <option value="virt_file_size">virt file size (GB)</option>
+
## FIMXE: more values for more fields, add images, add repos
#end if
</select>
</td>
- ## FIXME copy and paste key2,value2 and key3,value3 in a loop
<td>
- <input type="text" id="value1" name="value1"/>
+ <input type="text" id="$valname" name="$valname"/>
</td>
-
+ </tr>
+
+ #end for
+
+ <tr>
+ <td colspan="2">Tip: Use shell wildcards above, ex: "*" and "?".</td>
+ </tr>
+
</table>
<input type="submit" value="search"/>