java/code/src/com/redhat/rhn/common/db/datasource/xml/scap_queries.xml
| 37 ++
java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java
| 149 ++++++++++
java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchHelper.java
| 91 ++++++
java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
| 6
java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
| 21 +
java/code/src/com/redhat/rhn/frontend/xmlrpc/system/scap/SystemScapHandler.java
| 5
java/code/src/com/redhat/rhn/manager/audit/ScapManager.java
| 31 ++
java/code/webapp/WEB-INF/nav/sitenav-authenticated.xml
| 5
java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp
| 73 ++++
java/code/webapp/WEB-INF/pages/common/fragments/audit/rule-common-columns.jspf
| 28 +
java/code/webapp/WEB-INF/pages/systems/details/audit/xccdfdetails.jsp
| 20 -
java/code/webapp/WEB-INF/struts-config.xml
| 15 +
search-server/spacewalk-search/scripts/Reindex.groovy
| 6
search-server/spacewalk-search/src/config/com/redhat/satellite/search/db/config.xml
| 1
search-server/spacewalk-search/src/config/com/redhat/satellite/search/db/xccdf_ident.xml
| 42 ++
search-server/spacewalk-search/src/java/com/redhat/satellite/search/DeleteIndexes.java
| 2
search-server/spacewalk-search/src/java/com/redhat/satellite/search/db/models/XccdfIdent.java
| 38 ++
search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/IndexManager.java
| 6
search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/builder/BuilderFactory.java
| 4
search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/builder/XccdfIdentDocumentBuilder.java
| 51 +++
search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/ScheduleManager.java
| 8
search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/tasks/IndexXccdfIdentTask.java
| 107 +++++++
search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/tests/ScheduleManagerTest.java
| 1
web/html/nav/sitenav-authenticated.xml
| 5
24 files changed, 728 insertions(+), 24 deletions(-)
New commits:
commit 7be11b102bf1854ec7c038fb4b3227172dd1b0c0
Author: Simon Lukasik <slukasik(a)redhat.com>
Date: Mon May 28 18:11:04 2012 +0200
Fail gracefully on empty list of systems
Addressing:
2012-05-28 10:30:06,416 [TP-Processor3] ERROR
com.redhat.rhn.frontend.xmlrpc.BaseHandler - Caused by:
java.lang.NullPointerException
at
com.redhat.rhn.frontend.xmlrpc.system.scap.SystemScapHandler.scheduleXccdfScan(SystemScapHandler.java:156)
at
com.redhat.rhn.frontend.xmlrpc.system.scap.SystemScapHandler.scheduleXccdfScan(SystemScapHandler.java:122)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at com.redhat.rhn.frontend.xmlrpc.BaseHandler.invoke(BaseHandler.java:108)
at redstone.xmlrpc.XmlRpcDispatcher.dispatch(XmlRpcDispatcher.java:123)
at com.redhat.rhn.frontend.xmlrpc.RhnXmlRpcServer.execute(RhnXmlRpcServer.java:54)
at com.redhat.rhn.frontend.xmlrpc.XmlRpcServlet.doPost(XmlRpcServlet.java:162)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
(...)
diff --git
a/java/code/src/com/redhat/rhn/frontend/xmlrpc/system/scap/SystemScapHandler.java
b/java/code/src/com/redhat/rhn/frontend/xmlrpc/system/scap/SystemScapHandler.java
index ebc30a4..b6ff28d 100644
--- a/java/code/src/com/redhat/rhn/frontend/xmlrpc/system/scap/SystemScapHandler.java
+++ b/java/code/src/com/redhat/rhn/frontend/xmlrpc/system/scap/SystemScapHandler.java
@@ -27,6 +27,7 @@ import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.frontend.dto.XccdfRuleResultDto;
import com.redhat.rhn.frontend.dto.XccdfTestResultDto;
import com.redhat.rhn.frontend.xmlrpc.BaseHandler;
+import com.redhat.rhn.frontend.xmlrpc.InvalidSystemException;
import com.redhat.rhn.manager.MissingCapabilityException;
import com.redhat.rhn.manager.MissingEntitlementException;
import com.redhat.rhn.manager.action.ActionManager;
@@ -145,6 +146,10 @@ public class SystemScapHandler extends BaseHandler {
String xccdfPath, String oscapParams, Date date) {
User loggedInUser = getLoggedInUser(sessionKey);
+ if (serverIds.isEmpty()) {
+ throw new InvalidSystemException();
+ }
+
HashSet<Long> longServerIds = new HashSet<Long>();
for (Iterator it = serverIds.iterator(); it.hasNext();) {
longServerIds.add(new Long((Integer) it.next()));
commit 1f7a2b0e009c6e0af01f3bca9e0e4e640be4de84
Author: Simon Lukasik <slukasik(a)redhat.com>
Date: Fri May 25 13:40:57 2012 +0200
Add option to search scap within SSM.
diff --git a/java/code/src/com/redhat/rhn/common/db/datasource/xml/scap_queries.xml
b/java/code/src/com/redhat/rhn/common/db/datasource/xml/scap_queries.xml
index 8403b4c..592cd8d 100644
--- a/java/code/src/com/redhat/rhn/common/db/datasource/xml/scap_queries.xml
+++ b/java/code/src/com/redhat/rhn/common/db/datasource/xml/scap_queries.xml
@@ -131,6 +131,25 @@
</query>
</mode>
+<mode name="ruleresults_by_idents_for_ssm"
class="com.redhat.rhn.frontend.dto.XccdfRuleResultDto">
+ <query params="user_id">
+ SELECT DISTINCT rr.id, rrt.label, rr.testresult_id AS test_result_id
+ FROM rhnXccdfRuleresult rr,
+ rhnXccdfRuleresultType rrt,
+ rhnXccdfRuleIdentMap rim,
+ rhnXccdfTestResult tr,
+ rhnSet st
+ WHERE rim.ident_id IN (%s)
+ AND rim.rresult_id = rr.id
+ AND rr.result_id = rrt.id
+ AND tr.id = testresult_id
+ AND tr.server_id = st.element
+ AND st.user_id = :user_id
+ AND st.label = 'system_list'
+ ORDER BY rr.id DESC
+ </query>
+</mode>
+
<mode name="idents_per_ruleresult"
class="com.redhat.rhn.frontend.dto.XccdfIdentDto">
<query params="rr_id">
SELECT xi.id, xi.identifier, xis.system
diff --git
a/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java
b/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java
index 9743cef..831abe8 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java
@@ -47,6 +47,7 @@ import com.redhat.rhn.frontend.taglibs.list.ListTagHelper;
public class XccdfSearchAction extends RhnAction {
private static String SEARCH_STRING = "search_string";
+ private static String WHERE_TO_SEARCH = "whereToSearch";
private static Logger log = Logger.getLogger(XccdfSearchAction.class);
/** {@inheritDoc} */
@@ -114,11 +115,15 @@ public class XccdfSearchAction extends RhnAction {
throws MalformedURLException, XmlRpcException, XmlRpcFault {
RequestContext context = new RequestContext(request);
String searchString = request.getParameter(SEARCH_STRING);
+ String whereToSearch = request.getParameter(WHERE_TO_SEARCH);
request.setAttribute(SEARCH_STRING, searchString);
+ form.set(WHERE_TO_SEARCH,
+ "system_list".equals(whereToSearch) ? whereToSearch :
"all");
if (!StringUtils.isBlank(searchString)) {
- List results = XccdfSearchHelper.performSearch(searchString, context);
+ List results = XccdfSearchHelper.performSearch(searchString, whereToSearch,
+ context);
request.setAttribute(RequestContext.PAGE_LIST,
results != null ? results : Collections.EMPTY_LIST);
}
diff --git
a/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchHelper.java
b/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchHelper.java
index 57cd699..a153b55 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchHelper.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchHelper.java
@@ -35,8 +35,10 @@ public class XccdfSearchHelper extends RhnAction {
private static String IDENT_INDEX = "xccdfIdent";
private static String INDEX_SEARCH = "index.search";
+ private static String SYSTEM_LIST = "system_list";
- public static List performSearch(String searchString, RequestContext context)
+ public static List performSearch(String searchString, String whereToSearch,
+ RequestContext context)
throws MalformedURLException, XmlRpcException, XmlRpcFault {
ArrayList args = new ArrayList();
args.add(context.getWebSession().getId());
@@ -52,7 +54,14 @@ public class XccdfSearchHelper extends RhnAction {
Long id = new Long((String)item.get("id"));
identIds.add(id);
}
- return ScapManager.ruleResultsByIdentIds(context.getCurrentUser(), identIds);
+
+ if (SYSTEM_LIST.equals(whereToSearch)) {
+ return ScapManager.ruleResultsByIdentIdsForSsm(context.getCurrentUser(),
+ identIds);
+ }
+ else {
+ return ScapManager.ruleResultsByIdentIds(context.getCurrentUser(),
identIds);
+ }
}
private static String preprocessSearchString(String searchString) {
diff --git a/java/code/src/com/redhat/rhn/manager/audit/ScapManager.java
b/java/code/src/com/redhat/rhn/manager/audit/ScapManager.java
index caf2f7a..46cc269 100644
--- a/java/code/src/com/redhat/rhn/manager/audit/ScapManager.java
+++ b/java/code/src/com/redhat/rhn/manager/audit/ScapManager.java
@@ -145,6 +145,22 @@ public class ScapManager extends BaseManager {
}
/**
+ * Get xccdf:rule-results by ident's ids, but only those in relation
+ * with some of the SSM systems.
+ * @param user requesting results
+ * @param identIds list of xccdf:ident ids
+ * @return the result
+ */
+ public static List<XccdfRuleResultDto> ruleResultsByIdentIdsForSsm(
+ User user, List<Long> identIds) {
+ SelectMode m = ModeFactory.getMode("scap_queries",
+ "ruleresults_by_idents_for_ssm");
+ HashMap params = new HashMap();
+ params.put("user_id", user.getId());
+ return m.execute(params, identIds);
+ }
+
+ /**
* Show xccdf:ident results for given rule-result
* @param ruleResultId of XccdfRuleResultDto
* @return the list of idents
diff --git a/java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp
b/java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp
index c48de4b..55d85fe 100644
--- a/java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp
+++ b/java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp
@@ -33,6 +33,18 @@
</span>
</td>
</tr>
+ <tr><th><bean:message
key="systemsearch.jsp.wheretosearch"/></th>
+ <td>
+ <div style="text-align: left">
+ <html:radio property="whereToSearch" value="all"
styleId="whereToSearch-all"/>
+ <label for="whereToSearch-all"><bean:message
key="systemsearch.jsp.searchallsystems"/></label>
+ </div>
+ <div style="text-align: left">
+ <html:radio property="whereToSearch"
value="system_list" styleId="whereToSearch-system_list"/>
+ <label for="whereToSearch-system_list"><bean:message
key="systemsearch.jsp.searchSSM"/></label>
+ </div>
+ </td>
+ </tr>
</table>
</div> <!-- search-choices-group -->
</div> <!-- search-choices -->
@@ -53,6 +65,7 @@
<!-- there are two forms here, need to keep the formvars around for pagination
-->
<input type="hidden" name="submitted"
value="true"/>
<input type="hidden" name="search_string"
value="${search_string}"/>
+ <input type="hidden" name="whereToSearch"
value="${whereToSearch}"/>
</rl:listset>
</c:if>
diff --git a/java/code/webapp/WEB-INF/struts-config.xml
b/java/code/webapp/WEB-INF/struts-config.xml
index 0fb7027..0565d64 100644
--- a/java/code/webapp/WEB-INF/struts-config.xml
+++ b/java/code/webapp/WEB-INF/struts-config.xml
@@ -236,6 +236,7 @@
<form-bean name="xccdfSearchForm"
type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
<form-property name="search_string"
type="java.lang.String"/>
+ <form-property name="whereToSearch"
type="java.lang.String"/>
<form-property name="submitted"
type="java.lang.Boolean" />
</form-bean>
<form-bean name="errataSearchForm"
commit b2c78eafd7efd1a3ed7e1a733fbb844c045729c4
Author: Simon Lukasik <slukasik(a)redhat.com>
Date: Tue May 22 12:22:14 2012 +0200
OpenSCAP integration -- A simple search page.
diff --git a/java/code/src/com/redhat/rhn/common/db/datasource/xml/scap_queries.xml
b/java/code/src/com/redhat/rhn/common/db/datasource/xml/scap_queries.xml
index ff67100..8403b4c 100644
--- a/java/code/src/com/redhat/rhn/common/db/datasource/xml/scap_queries.xml
+++ b/java/code/src/com/redhat/rhn/common/db/datasource/xml/scap_queries.xml
@@ -113,6 +113,24 @@
</query>
</mode>
+<mode name="ruleresults_by_idents"
class="com.redhat.rhn.frontend.dto.XccdfRuleResultDto">
+ <query params="user_id">
+ SELECT DISTINCT rr.id, rrt.label, rr.testresult_id AS test_result_id
+ FROM rhnXccdfRuleresult rr,
+ rhnXccdfRuleresultType rrt,
+ rhnXccdfRuleIdentMap rim,
+ rhnXccdfTestresult tr,
+ rhnUserServerPerms usp
+ WHERE rim.ident_id IN (%s)
+ AND rim.rresult_id = rr.id
+ AND rr.result_id = rrt.id
+ AND tr.id = rr.testresult_id
+ AND tr.server_id = usp.server_id
+ AND usp.user_id = :user_id
+ ORDER BY rr.id DESC
+ </query>
+</mode>
+
<mode name="idents_per_ruleresult"
class="com.redhat.rhn.frontend.dto.XccdfIdentDto">
<query params="rr_id">
SELECT xi.id, xi.identifier, xis.system
diff --git
a/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java
b/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java
new file mode 100644
index 0000000..9743cef
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchAction.java
@@ -0,0 +1,144 @@
+/**
+ * Copyright (c) 2012 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ *
http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.rhn.frontend.action.audit.scap;
+
+import java.net.MalformedURLException;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.action.DynaActionForm;
+import org.directwebremoting.util.Logger;
+
+import redstone.xmlrpc.XmlRpcException;
+import redstone.xmlrpc.XmlRpcFault;
+
+import com.redhat.rhn.frontend.struts.RequestContext;
+import com.redhat.rhn.frontend.struts.RhnAction;
+import com.redhat.rhn.frontend.struts.RhnHelper;
+import com.redhat.rhn.frontend.taglibs.list.ListTagHelper;
+
+/**
+ * XccdfSearchAction
+ */
+public class XccdfSearchAction extends RhnAction {
+
+ private static String SEARCH_STRING = "search_string";
+ private static Logger log = Logger.getLogger(XccdfSearchAction.class);
+
+ /** {@inheritDoc} */
+ public ActionForward execute(ActionMapping mapping, ActionForm formIn,
+ HttpServletRequest request, HttpServletResponse response) {
+ ActionErrors errors = new ActionErrors();
+ DynaActionForm form = (DynaActionForm) formIn;
+ String searchString = request.getParameter(SEARCH_STRING);
+
+ request.setAttribute(ListTagHelper.PARENT_URL, request.getRequestURI());
+
+ if (!isSubmitted(form)) {
+ try {
+ setupForm(request, form);
+ return getStrutsDelegate().forwardParams(
+ mapping.findForward(RhnHelper.DEFAULT_FORWARD),
+ request.getParameterMap());
+ }
+ catch (XmlRpcException xre) {
+ log.error("Could not connect to search server.", xre);
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new
ActionMessage("packages.search.connection_error"));
+ }
+ catch (XmlRpcFault e) {
+ log.info("Caught Exception :" + e);
+ log.info("ErrorCode = " + e.getErrorCode());
+ e.printStackTrace();
+ if (e.getErrorCode() == 100) {
+ log.error("Invalid search query", e);
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new
ActionMessage("packages.search.could_not_parse_query",
+ searchString));
+ }
+ else if (e.getErrorCode() == 200) {
+ log.error("Index files appear to be missing: ", e);
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new
ActionMessage("packages.search.index_files_missing",
+ searchString));
+ }
+ else {
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new
ActionMessage("packages.search.could_not_execute_query",
+ searchString));
+ }
+ }
+ catch (MalformedURLException e) {
+ log.error("Could not connect to server.", e);
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new
ActionMessage("packages.search.connection_error"));
+ }
+ }
+
+ if (!errors.isEmpty()) {
+ addErrors(request, errors);
+ return getStrutsDelegate().forwardParams(
+ mapping.findForward(RhnHelper.DEFAULT_FORWARD),
+ createForwardParams(request));
+ }
+ return getStrutsDelegate().forwardParams(
+ mapping.findForward("success"),
+ createForwardParams(request));
+ }
+
+ private void setupForm(HttpServletRequest request, DynaActionForm form)
+ throws MalformedURLException, XmlRpcException, XmlRpcFault {
+ RequestContext context = new RequestContext(request);
+ String searchString = request.getParameter(SEARCH_STRING);
+
+ request.setAttribute(SEARCH_STRING, searchString);
+
+ if (!StringUtils.isBlank(searchString)) {
+ List results = XccdfSearchHelper.performSearch(searchString, context);
+ request.setAttribute(RequestContext.PAGE_LIST,
+ results != null ? results : Collections.EMPTY_LIST);
+ }
+ else {
+ request.setAttribute(RequestContext.PAGE_LIST, Collections.EMPTY_LIST);
+ }
+ }
+
+ private Map createForwardParams(HttpServletRequest request) {
+ Map forwardParams = makeParamMap(request);
+ // keep all params except submitted, in order for the new list
+ // tag pagination to work we need to pass along all the formvars it
+ // generated.
+ Enumeration paramNames = request.getParameterNames();
+ while (paramNames.hasMoreElements()) {
+ String name = (String) paramNames.nextElement();
+ if (!SUBMITTED.equals(name)) {
+ forwardParams.put(name, request.getParameter(name));
+ }
+ }
+ return forwardParams;
+ }
+}
diff --git
a/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchHelper.java
b/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchHelper.java
new file mode 100644
index 0000000..57cd699
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/frontend/action/audit/scap/XccdfSearchHelper.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2012 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ *
http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.rhn.frontend.action.audit.scap;
+
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import redstone.xmlrpc.XmlRpcClient;
+import redstone.xmlrpc.XmlRpcException;
+import redstone.xmlrpc.XmlRpcFault;
+
+import com.redhat.rhn.common.conf.ConfigDefaults;
+import com.redhat.rhn.frontend.struts.RequestContext;
+import com.redhat.rhn.frontend.struts.RhnAction;
+import com.redhat.rhn.manager.audit.ScapManager;
+
+/**
+ * XccdfSearchHelper
+ */
+public class XccdfSearchHelper extends RhnAction {
+
+ private static String IDENT_INDEX = "xccdfIdent";
+ private static String INDEX_SEARCH = "index.search";
+
+ public static List performSearch(String searchString, RequestContext context)
+ throws MalformedURLException, XmlRpcException, XmlRpcFault {
+ ArrayList args = new ArrayList();
+ args.add(context.getWebSession().getId());
+ args.add(IDENT_INDEX);
+ args.add(preprocessSearchString(searchString));
+ args.add(true); //fine grained
+ List searchResult = invokeSearchServer(INDEX_SEARCH, args);
+ // searchResult contains id to rhnXccdfIdent relation,
+ // while we want to return RuleResults
+ List<Long> identIds = new ArrayList<Long>();
+ for (int x = searchResult.size() - 1; x >= 0; x--) {
+ Map item = (Map) searchResult.get(x);
+ Long id = new Long((String)item.get("id"));
+ identIds.add(id);
+ }
+ return ScapManager.ruleResultsByIdentIds(context.getCurrentUser(), identIds);
+ }
+
+ private static String preprocessSearchString(String searchString) {
+ return "identifier:(" + keywordsToUpper(searchString) + ")";
+ }
+
+ private static String keywordsToUpper(String searchString) {
+ StringBuffer buf = new StringBuffer(searchString.length() + 1);
+ for (String s : searchString.split(" ")) {
+ if (s.trim().equalsIgnoreCase("AND") ||
+ s.trim().equalsIgnoreCase("OR") ||
+ s.trim().equalsIgnoreCase("NOT")) {
+ s = s.toUpperCase();
+ }
+ buf.append(s);
+ buf.append(" ");
+ }
+ return buf.toString().trim();
+ }
+
+ private static List invokeSearchServer(String path, List args)
+ throws MalformedURLException, XmlRpcException, XmlRpcFault {
+ XmlRpcClient client = new XmlRpcClient(
+ ConfigDefaults.get().getSearchServerUrl(), true);
+ return (List) client.invoke(path, args);
+ }
+}
diff --git a/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
b/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
index 549bc4f..e0f656a 100644
--- a/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
+++ b/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
@@ -373,6 +373,12 @@
http://www.oasis-open.org/committees/xliff/documents/xliff-core-1.1.xsd&q...
<context context-type="sourcefile">Navigation
Menu</context>
</context-group>
</trans-unit>
+ <trans-unit id="All Scans">
+<source>All Scans</source>
+ <context-group name="ctx">
+ <context context-type="sourcefile">Navigation
Menu</context>
+ </context-group>
+ </trans-unit>
<trans-unit id="audit.nav.logreview">
<source>Log Review</source>
<context-group name="ctx">
diff --git a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
index 3a01190..2283fc2 100644
--- a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
+++ b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
@@ -12117,6 +12117,27 @@ the <strong>Red Hat Enterprise Linux System
Administration Guide.</stro
</trans-unit>
</group>
+ <group>
+ <context-group name="ctx">
+ <context context-type="sourcefile">Search of OpenSCAP
scans</context>
+ </context-group>
+ <trans-unit id="scapsearch.jsp.toolbar">
+ <source>OpenSCAP Search</source>
+ </trans-unit>
+ <trans-unit id="scapsearch.jsp.summary">
+ <source>OpenSCAP Search will return finished OpenSCAP scans from all scans
you have access.</source>
+ </trans-unit>
+ <trans-unit id="scapsearch.jsp.instructions">
+ <source>Specify your search criteria below.</source>
+ </trans-unit>
+ <trans-unit id="scapsearch.jsp.searchfor">
+ <source>Search XCCDF Rules For</source>
+ </trans-unit>
+ <trans-unit id="scapsearch.jsp.whatsearch.tip">
+ <source><strong>Examples:</strong>
'no_hashes_outside_shadow', 'CCE-14300-8'</source>
+ </trans-unit>
+ </group>
+
<!-- Action common -->
<group>
<context-group name="ctx">
diff --git a/java/code/src/com/redhat/rhn/manager/audit/ScapManager.java
b/java/code/src/com/redhat/rhn/manager/audit/ScapManager.java
index 4eeb25a..caf2f7a 100644
--- a/java/code/src/com/redhat/rhn/manager/audit/ScapManager.java
+++ b/java/code/src/com/redhat/rhn/manager/audit/ScapManager.java
@@ -130,6 +130,21 @@ public class ScapManager extends BaseManager {
}
/**
+ * Get xccdf:rule-results by ident's ids
+ * @param user attempting to view results
+ * @param identIds list of xccdf:ident ids
+ * @return the result
+ */
+ public static List<XccdfRuleResultDto> ruleResultsByIdentIds(User user,
+ List<Long> identIds) {
+ SelectMode m = ModeFactory.getMode("scap_queries",
+ "ruleresults_by_idents");
+ HashMap params = new HashMap();
+ params.put("user_id", user.getId());
+ return m.execute(params, identIds);
+ }
+
+ /**
* Show xccdf:ident results for given rule-result
* @param ruleResultId of XccdfRuleResultDto
* @return the list of idents
diff --git a/java/code/webapp/WEB-INF/nav/sitenav-authenticated.xml
b/java/code/webapp/WEB-INF/nav/sitenav-authenticated.xml
index 98148b0..6250800 100644
--- a/java/code/webapp/WEB-INF/nav/sitenav-authenticated.xml
+++ b/java/code/webapp/WEB-INF/nav/sitenav-authenticated.xml
@@ -171,7 +171,10 @@
</rhn-tab>
<rhn-tab name="Audit" url="/rhn/audit/ListXccdf.do">
<rhn-tab-directory>/rhn/audit</rhn-tab-directory>
- <rhn-tab name="OpenSCAP" url="/rhn/audit/ListXccdf.do" />
+ <rhn-tab name="OpenSCAP" url="/rhn/audit/ListXccdf.do">
+ <rhn-tab name="All Scans"
url="/rhn/audit/ListXccdf.do"/>
+ <rhn-tab name="Advanced Search"
url="/rhn/audit/scap/Search.do"/>
+ </rhn-tab>
<rhn-tab name="audit.nav.logreview"
url="/rhn/audit/Overview.do" acl="not is_satellite()">
<rhn-tab name="Overview" url="/rhn/audit/Overview.do"
/>
<rhn-tab name="Reviews" url="/rhn/audit/Machine.do"
/>
diff --git a/java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp
b/java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp
new file mode 100644
index 0000000..c48de4b
--- /dev/null
+++ b/java/code/webapp/WEB-INF/pages/audit/scap/xccdfsearch.jsp
@@ -0,0 +1,60 @@
+<%@ taglib
uri="http://struts.apache.org/tags-html" prefix="html"
%>
+<%@ taglib
uri="http://java.sun.com/jsp/jstl/core" prefix="c"
%>
+<%@ taglib
uri="http://rhn.redhat.com/rhn" prefix="rhn" %>
+<%@ taglib
uri="http://rhn.redhat.com/tags/list" prefix="rl"
%>
+<%@ taglib
uri="http://struts.apache.org/tags-bean" prefix="bean"
%>
+
+<html:xhtml/>
+<html>
+<body>
+
+<rhn:toolbar base="h1" img="/img/rhn-icon-search.gif"
imgAlt="search.alt.img">
+ <bean:message key="scapsearch.jsp.toolbar"/>
+</rhn:toolbar>
+
+<p><bean:message key="scapsearch.jsp.summary"/></p>
+<p><bean:message key="scapsearch.jsp.instructions"/></p>
+
+<html:form action="/audit/scap/Search.do">
+ <rhn:csrf/>
+ <div class="search-choises">
+ <div class="search-choices-group">
+ <table class="details">
+ <tr><th><bean:message
key="scapsearch.jsp.searchfor"/>:</th>
+ <td>
+ <html:text property="search_string"
name="search_string"
+ value="${search_string}" maxlength="100"
accesskey="4"/>
+ <html:submit>
+ <bean:message key="button.search" />
+ </html:submit>
+ <br/>
+ <span class="small-text">
+ <bean:message key="scapsearch.jsp.whatsearch.tip"/>
+ </span>
+ </td>
+ </tr>
+ </table>
+ </div> <!-- search-choices-group -->
+ </div> <!-- search-choices -->
+ <input type="hidden" name="submitted"
value="true"/>
+</html:form>
+
+<c:if test="${(search_string != null && search_string !=
'')}">
+ <c:set var="pageList" value="${requestScope.pageList}"/>
+ <hr/>
+
+ <rl:listset name="searchSet" legend="xccdf">
+ <rhn:csrf/>
+ <rl:list emptykey="generic.jsp.none" name="searchResults"
dataset="pageList">
+ <rl:decorator name="PageSizeDecorator"/>
+ <%@ include
file="/WEB-INF/pages/common/fragments/audit/rule-common-columns.jspf" %>
+ </rl:list>
+
+ <!-- there are two forms here, need to keep the formvars around for pagination
-->
+ <input type="hidden" name="submitted"
value="true"/>
+ <input type="hidden" name="search_string"
value="${search_string}"/>
+ </rl:listset>
+</c:if>
+
+</body>
+</html>
diff --git
a/java/code/webapp/WEB-INF/pages/common/fragments/audit/rule-common-columns.jspf
b/java/code/webapp/WEB-INF/pages/common/fragments/audit/rule-common-columns.jspf
index 12f6623..885580f 100644
--- a/java/code/webapp/WEB-INF/pages/common/fragments/audit/rule-common-columns.jspf
+++ b/java/code/webapp/WEB-INF/pages/common/fragments/audit/rule-common-columns.jspf
@@ -1,6 +1,13 @@
<rl:column headerkey="system.audit.xccdfdetails.jsp.idref"
sortattr="documentIdref"
sortable="true" styleclass="first-column">
- <a
href="/rhn/systems/details/audit/RuleDetails.do?sid=${param.sid}&rrid=${current.id}">
+ <c:choose>
+ <c:when test="${not empty param.sid}">
+ <a
href="/rhn/systems/details/audit/RuleDetails.do?sid=${param.sid}&rrid=${current.id}">
+ </c:when>
+ <c:otherwise>
+ <a
href="/rhn/systems/details/audit/RuleDetails.do?sid=${current.testResult.server.id}&rrid=${current.id}">
+ </c:otherwise>
+ </c:choose>
<c:choose>
<c:when test="${empty current.documentIdref}">
<bean:message key="system.audit.xccdfdetails.jsp.unknown"/>
diff --git a/java/code/webapp/WEB-INF/struts-config.xml
b/java/code/webapp/WEB-INF/struts-config.xml
index 204f81e..0fb7027 100644
--- a/java/code/webapp/WEB-INF/struts-config.xml
+++ b/java/code/webapp/WEB-INF/struts-config.xml
@@ -233,6 +233,11 @@
<form-property name="end_minute"
type="java.lang.Integer" />
<form-property name="end_am_pm"
type="java.lang.Integer" />
</form-bean>
+ <form-bean name="xccdfSearchForm"
+
type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
+ <form-property name="search_string"
type="java.lang.String"/>
+ <form-property name="submitted"
type="java.lang.Boolean" />
+ </form-bean>
<form-bean name="errataSearchForm"
type="com.redhat.rhn.frontend.struts.ScrubbingDynaActionForm">
<form-property name="search_string"
type="java.lang.String"/>
@@ -1937,6 +1942,15 @@
<forward name="default"
path="/WEB-INF/pages/audit/listxccdf.jsp"/>
</action>
+ <action path="/audit/scap/Search"
+ name="xccdfSearchForm"
+ scope="request"
+ input="/WEB-INF/pages/audit/scap/xccdfsearch.jsp"
+ type="com.redhat.rhn.frontend.action.audit.scap.XccdfSearchAction">
+ <forward name="default"
path="/WEB-INF/pages/audit/scap/xccdfsearch.jsp"/>
+ <forward name="success" path="/audit/scap/Search.do"
redirect="true" />
+ </action>
+
<!-- ===== ERRATA ===== -->
<action path="/errata/Search"
name="errataSearchForm"
diff --git a/web/html/nav/sitenav-authenticated.xml
b/web/html/nav/sitenav-authenticated.xml
index 31ff60d..f2ae908 100644
--- a/web/html/nav/sitenav-authenticated.xml
+++ b/web/html/nav/sitenav-authenticated.xml
@@ -121,7 +121,10 @@
</rhn-tab>
<rhn-tab name="Audit" url="/rhn/audit/ListXccdf.do">
<rhn-tab-directory>/rhn/audit</rhn-tab-directory>
- <rhn-tab name="OpenSCAP" url="/rhn/audit/ListXccdf.do" />
+ <rhn-tab name="OpenSCAP" url="/rhn/audit/ListXccdf.do">
+ <rhn-tab name="All Scans"
url="/rhn/audit/ListXccdf.do"/>
+ <rhn-tab name="Advanced Search"
url="/rhn/audit/scap/Search.do"/>
+ </rhn-tab>
<rhn-tab name="audit.nav.logreview"
url="/rhn/audit/Overview.do" acl="not is_satellite()">
<rhn-tab name="Overview" url="/rhn/audit/Overview.do"
/>
<rhn-tab name="Reviews" url="/rhn/audit/Machine.do"
/>
commit e4bc48112bda523334060a3f0858157c9b9a594e
Author: Simon Lukasik <slukasik(a)redhat.com>
Date: Mon May 21 14:59:48 2012 +0200
Start indexing XCCDF idents.
diff --git a/search-server/spacewalk-search/scripts/Reindex.groovy
b/search-server/spacewalk-search/scripts/Reindex.groovy
index 49e94e0..61c429f 100644
--- a/search-server/spacewalk-search/scripts/Reindex.groovy
+++ b/search-server/spacewalk-search/scripts/Reindex.groovy
@@ -21,7 +21,8 @@ def deleteQuery(config, queryName) {
Configuration config = new Configuration()
deleteQueries = ["deleteLastErrata", "deleteLastPackage",
"deleteLastServer", "deleteLastHardwareDevice",
- "deleteLastSnapshotTag", "deleteLastServerCustomInfo"]
+ "deleteLastSnapshotTag", "deleteLastServerCustomInfo",
+ "deleteLastXccdfIdent"]
deleteQueries.each{deleteQuery(config, it)}
println "Database has been prepared so we can re-index."
@@ -31,7 +32,8 @@ println "Previous indexes will be deleted on filesystem under
${indexWorkDir}"
dirs = [indexWorkDir+"/package", indexWorkDir+"/errata",
indexWorkDir+"/server", indexWorkDir+"/hwdevice",
- indexWorkDir+"/snapshotTag", indexWorkDir+"/serverCustomInfo"]
+ indexWorkDir+"/snapshotTag", indexWorkDir+"/serverCustomInfo",
+ indexWorkDir+"/xccdfIdent"]
dirs.each {
cmd = "rm -r $it"
def proc = cmd.execute()
diff --git
a/search-server/spacewalk-search/src/config/com/redhat/satellite/search/db/config.xml
b/search-server/spacewalk-search/src/config/com/redhat/satellite/search/db/config.xml
index 4fb411b..655d953 100644
--- a/search-server/spacewalk-search/src/config/com/redhat/satellite/search/db/config.xml
+++ b/search-server/spacewalk-search/src/config/com/redhat/satellite/search/db/config.xml
@@ -35,4 +35,5 @@
<sqlMap resource="com/redhat/satellite/search/db/hwdevice.xml" />
<sqlMap resource="com/redhat/satellite/search/db/snapshot_tag.xml" />
<sqlMap resource="com/redhat/satellite/search/db/server_custom_info.xml"
/>
+ <sqlMap resource="com/redhat/satellite/search/db/xccdf_ident.xml" />
</sqlMapConfig>
diff --git
a/search-server/spacewalk-search/src/config/com/redhat/satellite/search/db/xccdf_ident.xml
b/search-server/spacewalk-search/src/config/com/redhat/satellite/search/db/xccdf_ident.xml
new file mode 100644
index 0000000..ab060a6
--- /dev/null
+++
b/search-server/spacewalk-search/src/config/com/redhat/satellite/search/db/xccdf_ident.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE sqlMap
+ PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
+ "http://ibatis.apache.org/dtd/sql-map-2.dtd">
+
+<sqlMap namespace="xccdfIdent">
+ <select id="getXccdfIdentById" parameterClass="java.util.Map"
+ resultClass="com.redhat.satellite.search.db.models.XccdfIdent">
+ SELECT id, identifier
+ FROM rhnXccdfIdent
+ WHERE id > #id#
+ ORDER BY id ASC
+ </select>
+ <select id="queryAllXccdfIdentIds" resultClass="Long">
+ SELECT id
+ FROM rhnXccdfIdent
+ </select>
+
+ <insert id="createLastXccdfIdent"
parameterClass="java.util.Map">
+ INSERT INTO rhnIndexerWork
+ VALUES ('xccdf_ident', #id#, #last_modified#)
+ </insert>
+ <select id="getLastXccdfIdentId"
resultClass="java.lang.Long">
+ SELECT last_id
+ FROM rhnIndexerWork
+ WHERE object_type='xccdf_ident'
+ </select>
+ <select id="getLastXccdfIdentIndexRun"
resultClass="java.util.Date">
+ SELECT last_modified
+ FROM rhnIndexerWork
+ WHERE object_type='xccdf_ident'
+ </select>
+ <update id="updateLastXccdfIdent"
parameterClass="java.util.Map">
+ UPDATE rhnIndexerWork
+ SET last_id = #id#, last_modified = #last_modified#
+ WHERE object_type = 'xccdf_ident'
+ </update>
+ <delete id="deleteLastXccdfIdent">
+ DELETE FROM rhnIndexerWork
+ WHERE object_type = 'xccdf_ident'
+ </delete>
+</sqlMap>
diff --git
a/search-server/spacewalk-search/src/java/com/redhat/satellite/search/DeleteIndexes.java
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/DeleteIndexes.java
index bcc2e89..c6fd0af 100644
---
a/search-server/spacewalk-search/src/java/com/redhat/satellite/search/DeleteIndexes.java
+++
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/DeleteIndexes.java
@@ -114,6 +114,8 @@ public class DeleteIndexes {
indexWorkDir + File.separator + "snapshotTag"));
indexes.add(new IndexInfo("deleteLastServerCustomInfo",
indexWorkDir + File.separator + "serverCustomInfo"));
+ indexes.add(new IndexInfo("deleteLastXccdfIdent",
+ indexWorkDir + File.separator + "xccdfIdent"));
for (IndexInfo info : indexes) {
deleteQuery(databaseManager, info.getQueryName());
if (!deleteIndexPath(info.getDirPath())) {
diff --git
a/search-server/spacewalk-search/src/java/com/redhat/satellite/search/db/models/XccdfIdent.java
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/db/models/XccdfIdent.java
new file mode 100644
index 0000000..61f1c51
--- /dev/null
+++
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/db/models/XccdfIdent.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2012 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ *
http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.satellite.search.db.models;
+
+/**
+ * XccdfIdent
+ * @version $Rev$
+ */
+public class XccdfIdent extends GenericRecord {
+
+ private String identifier;
+
+ /**
+ * @return the xccdf:identifier
+ */
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ /**
+ * @param identifierIn the identifier to set
+ */
+ public void setIdentifier(String identifierIn) {
+ this.identifier = identifierIn;
+ }
+}
diff --git
a/search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/IndexManager.java
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/IndexManager.java
index 9f9667c..70ede4d 100644
---
a/search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/IndexManager.java
+++
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/IndexManager.java
@@ -499,6 +499,12 @@ public class IndexManager {
else if (indexName.compareTo(BuilderFactory.SERVER_CUSTOM_INFO_TYPE) == 0) {
pr = new ServerCustomInfoResult(x, hits.score(x), doc);
}
+ else if (indexName.compareTo(BuilderFactory.XCCDF_IDENT_TYPE) == 0) {
+ pr = new Result(x,
+ doc.getField("id").stringValue(),
+ doc.getField("identifier").stringValue(),
+ hits.score(x));
+ }
else {
pr = new Result(x,
doc.getField("id").stringValue(),
diff --git
a/search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/builder/BuilderFactory.java
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/builder/BuilderFactory.java
index 2d6971a..0730049 100644
---
a/search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/builder/BuilderFactory.java
+++
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/builder/BuilderFactory.java
@@ -28,6 +28,7 @@ public class BuilderFactory {
public static final String HARDWARE_DEVICE_TYPE = "hwdevice";
public static final String SNAPSHOT_TAG_TYPE = "snapshotTag";
public static final String SERVER_CUSTOM_INFO_TYPE = "serverCustomInfo";
+ public static final String XCCDF_IDENT_TYPE = "xccdfIdent";
/**
* Private constructor.
*/
@@ -59,6 +60,9 @@ public class BuilderFactory {
else if (SERVER_CUSTOM_INFO_TYPE.equals(type)) {
return new ServerCustomInfoDocumentBuilder();
}
+ else if (XCCDF_IDENT_TYPE.equals(type)) {
+ return new XccdfIdentDocumentBuilder();
+ }
else {
throw new UnsupportedOperationException(type +
" is an unsuppported type");
diff --git
a/search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/builder/XccdfIdentDocumentBuilder.java
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/builder/XccdfIdentDocumentBuilder.java
new file mode 100644
index 0000000..461e475
--- /dev/null
+++
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/index/builder/XccdfIdentDocumentBuilder.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2012 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ *
http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.satellite.search.index.builder;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+
+import java.util.Iterator;
+import java.util.Map;
+
+
+/**
+ * XccdfIdentDocumentBuilder
+ * @version $Rev$
+ */
+public class XccdfIdentDocumentBuilder implements DocumentBuilder {
+
+ /**
+ * {@inheritDoc}
+ */
+ public Document buildDocument(Long objId, Map<String, String> metadata) {
+ Document doc = new Document();
+ doc.add(new Field("id", objId.toString(), Field.Store.YES,
+ Field.Index.UN_TOKENIZED));
+
+ for (Iterator<String> iter = metadata.keySet().iterator(); iter.hasNext();)
{
+ Field.Store store = Field.Store.YES;
+ Field.Index tokenize = Field.Index.TOKENIZED;
+
+ String name = iter.next();
+ String value = metadata.get(name);
+
+ doc.add(new Field(name, String.valueOf(value), store,
+ tokenize));
+ }
+ return doc;
+ }
+
+}
diff --git
a/search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/ScheduleManager.java
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/ScheduleManager.java
index 4e016e7..2413424 100644
---
a/search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/ScheduleManager.java
+++
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/ScheduleManager.java
@@ -25,6 +25,7 @@ import
com.redhat.satellite.search.scheduler.tasks.IndexSnapshotTagsTask;
import com.redhat.satellite.search.scheduler.tasks.IndexServerCustomInfoTask;
import com.redhat.satellite.search.scheduler.tasks.IndexSystemsTask;
import com.redhat.satellite.search.scheduler.tasks.IndexHardwareDevicesTask;
+import com.redhat.satellite.search.scheduler.tasks.IndexXccdfIdentTask;
import org.apache.log4j.Logger;
@@ -132,6 +133,10 @@ public class ScheduleManager implements Startable {
mode, interval,
IndexServerCustomInfoTask.class, jobData);
+ scheduleJob(scheduler, BuilderFactory.XCCDF_IDENT_TYPE,
+ mode, interval,
+ IndexXccdfIdentTask.class, jobData);
+
scheduler.start();
}
catch (SchedulerException e) {
@@ -157,7 +162,8 @@ public class ScheduleManager implements Startable {
BuilderFactory.PACKAGES_TYPE.equals(indexName) ||
BuilderFactory.SERVER_CUSTOM_INFO_TYPE.equals(indexName) ||
BuilderFactory.SERVER_TYPE.equals(indexName) ||
- BuilderFactory.SNAPSHOT_TAG_TYPE.equals(indexName)) {
+ BuilderFactory.SNAPSHOT_TAG_TYPE.equals(indexName) ||
+ BuilderFactory.XCCDF_IDENT_TYPE.equals(indexName)) {
return true;
}
else if (BuilderFactory.DOCS_TYPE.equals(indexName)) {
diff --git
a/search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/tasks/IndexXccdfIdentTask.java
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/tasks/IndexXccdfIdentTask.java
new file mode 100644
index 0000000..5490ebf
--- /dev/null
+++
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/tasks/IndexXccdfIdentTask.java
@@ -0,0 +1,107 @@
+/**
+ * Copyright (c) 2012 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ *
http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.satellite.search.scheduler.tasks;
+
+import com.redhat.satellite.search.db.models.GenericRecord;
+import com.redhat.satellite.search.db.models.XccdfIdent;
+import com.redhat.satellite.search.index.builder.BuilderFactory;
+
+import org.apache.log4j.Logger;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * IndexXccdfIdentTask
+ * @version $Rev$
+ */
+public class IndexXccdfIdentTask extends GenericIndexTask {
+
+ private static Logger log = Logger.getLogger(IndexXccdfIdentTask.class);
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected Map<String, String> getFieldMap(GenericRecord data)
+ throws ClassCastException {
+ XccdfIdent dev = (XccdfIdent)data;
+ Map<String, String> attrs = new HashMap<String, String>();
+ attrs.put("id", new Long(dev.getId()).toString());
+ attrs.put("identifier", dev.getIdentifier());
+ return attrs;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getIndexName() {
+ return BuilderFactory.XCCDF_IDENT_TYPE;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected String getQueryCreateLastRecord() {
+ return "createLastXccdfIdent";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected String getQueryLastRecord() {
+ return "getLastXccdfIdentId";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected String getQueryLastIndexDate() {
+ return "getLastXccdfIdentIndexRun";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected String getQueryRecordsToIndex() {
+ return "getXccdfIdentById";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected String getQueryUpdateLastRecord() {
+ return "updateLastXccdfIdent";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getUniqueFieldId() {
+ return "id";
+ }
+ /**
+ * {@inheritDoc}
+ */
+ public String getQueryAllIds() {
+ return "queryAllXccdfIdentIds";
+ }
+}
diff --git
a/search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/tests/ScheduleManagerTest.java
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/tests/ScheduleManagerTest.java
index 382c3c7..46788fd 100644
---
a/search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/tests/ScheduleManagerTest.java
+++
b/search-server/spacewalk-search/src/java/com/redhat/satellite/search/scheduler/tests/ScheduleManagerTest.java
@@ -40,6 +40,7 @@ public class ScheduleManagerTest extends BaseTestCase {
assertTrue(sm.triggerIndexTask(BuilderFactory.SERVER_CUSTOM_INFO_TYPE));
assertTrue(sm.triggerIndexTask(BuilderFactory.SERVER_TYPE));
assertTrue(sm.triggerIndexTask(BuilderFactory.SNAPSHOT_TAG_TYPE));
+ assertTrue(sm.triggerIndexTask(BuilderFactory.XCCDF_IDENT_TYPE));
assertFalse(sm.triggerIndexTask(BuilderFactory.DOCS_TYPE));
assertFalse(sm.triggerIndexTask(null));
assertFalse(sm.triggerIndexTask("biteme"));
commit 723009c9d821a5642b28e7dac6ed0962a7f4ea9c
Author: Simon Lukasik <slukasik(a)redhat.com>
Date: Tue May 22 16:58:23 2012 +0200
Promote some of the rule's columns to fragment.
diff --git
a/java/code/webapp/WEB-INF/pages/common/fragments/audit/rule-common-columns.jspf
b/java/code/webapp/WEB-INF/pages/common/fragments/audit/rule-common-columns.jspf
new file mode 100644
index 0000000..12f6623
--- /dev/null
+++ b/java/code/webapp/WEB-INF/pages/common/fragments/audit/rule-common-columns.jspf
@@ -0,0 +1,21 @@
+<rl:column headerkey="system.audit.xccdfdetails.jsp.idref"
sortattr="documentIdref"
+ sortable="true" styleclass="first-column">
+ <a
href="/rhn/systems/details/audit/RuleDetails.do?sid=${param.sid}&rrid=${current.id}">
+ <c:choose>
+ <c:when test="${empty current.documentIdref}">
+ <bean:message key="system.audit.xccdfdetails.jsp.unknown"/>
+ </c:when>
+ <c:otherwise>
+ <c:out value="${current.documentIdref}"/>
+ </c:otherwise>
+ </c:choose>
+ </a>
+</rl:column>
+
+<rl:column headerkey="system.audit.xccdfdetails.jsp.idents"
sortattr="identsString" sortable="true">
+ <c:out value="${current.identsString}"/>
+</rl:column>
+
+<rl:column headerkey="system.audit.xccdfdetails.jsp.result"
sortattr="label" sortable="true" filterattr="label">
+ <c:out value="${current.label}"/>
+</rl:column>
diff --git a/java/code/webapp/WEB-INF/pages/systems/details/audit/xccdfdetails.jsp
b/java/code/webapp/WEB-INF/pages/systems/details/audit/xccdfdetails.jsp
index cb489a3..e03d7d3 100644
--- a/java/code/webapp/WEB-INF/pages/systems/details/audit/xccdfdetails.jsp
+++ b/java/code/webapp/WEB-INF/pages/systems/details/audit/xccdfdetails.jsp
@@ -56,26 +56,8 @@
<rl:list>
<rl:decorator name="PageSizeDecorator"/>
- <rl:column headerkey="system.audit.xccdfdetails.jsp.idref"
sortattr="documentIdref"
- sortable="true" styleclass="first-column">
- <a
href="/rhn/systems/details/audit/RuleDetails.do?sid=${param.sid}&rrid=${current.id}">
- <c:choose>
- <c:when test="${empty current.documentIdref}">
- <bean:message key="system.audit.xccdfdetails.jsp.unknown"/>
- </c:when>
- <c:otherwise>
- <c:out value="${current.documentIdref}"/>
- </c:otherwise>
- </c:choose>
- </a>
+ <%@ include
file="/WEB-INF/pages/common/fragments/audit/rule-common-columns.jspf" %>
- </rl:column>
- <rl:column headerkey="system.audit.xccdfdetails.jsp.idents"
sortattr="identsString" sortable="true">
- <c:out value="${current.identsString}"/>
- </rl:column>
- <rl:column headerkey="system.audit.xccdfdetails.jsp.result"
sortattr="label" sortable="true" filterattr="label">
- <c:out value="${current.label}"/>
- </rl:column>
</rl:list>
</rl:listset>