/**
* Copyright (c) 2009--2014 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.kickstart;
import com.redhat.rhn.domain.kickstart.KickstartCommand;
import com.redhat.rhn.domain.kickstart.KickstartCommandName;
import com.redhat.rhn.domain.kickstart.KickstartFactory;
import com.redhat.rhn.domain.user.User;
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.manager.kickstart.KickstartOptionsCommand;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
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 java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* KickstartAdvancedOptions extends RhnAction
* @version $Rev: 1 $
*/
public class KickstartAdvancedOptionsAction extends RhnAction {
/**
* Logger for this class
*/
private static Logger log = Logger
.getLogger(KickstartAdvancedOptionsAction.class);
public static final String OPTIONS = "options";
public static final String CUSTOM_OPTIONS = "customOptions";
private static final String NEWLINE = "\n";
/**
*
* {@inheritDoc}
*/
public final ActionForward execute(ActionMapping mapping,
ActionForm formIn,
HttpServletRequest request,
HttpServletResponse response) {
RequestContext ctx = new RequestContext(request);
KickstartHelper helper = new KickstartHelper(request);
KickstartOptionsCommand cmd =
new KickstartOptionsCommand(ctx.getRequiredParam(RequestContext.KICKSTART_ID),
ctx.getCurrentUser());
List displayList = new LinkedList();
//Display message if this kickstart profile's channel is inadequate.
User user = new RequestContext(request).getCurrentUser();
if (!helper.verifyKickstartChannel(cmd.getKickstartData(), user)) {
getStrutsDelegate().saveMessages(request,
helper.createInvalidChannelMsg(cmd.getKickstartData()));
}
// store/refresh the submitted data
if (request.getParameter(SUBMITTED) != null) {
ActionErrors messages = new ActionErrors();
//lets first make sure all required params are set
for (Iterator it = cmd.getRequiredOptions().iterator(); it.hasNext();) {
KickstartCommandName cn = (KickstartCommandName) it.next();
if ((request.getParameter(cn.getName()) == null) ||
(request.getParameter(cn.getName().concat("_txt")) == "")) {
messages.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("errors.required", cn.getName()));
}
}
// store to the db
if (messages.isEmpty()) {
Set s = new HashSet();
for (Iterator itr = cmd.getAvailableOptions().iterator(); itr.hasNext();) {
KickstartCommandName cn = (KickstartCommandName) itr.next();
if (request.getParameter(cn.getName()) != null) {
KickstartCommand kc = new KickstartCommand();
kc.setCommandName(cn);
kc.setKickstartData(cmd.getKickstartData());
kc.setCreated(new Date());
kc.setModified(new Date());
if (cn.getArgs().booleanValue()) {
String argsName = cn.getName() + "_txt";
// handle password encryption
if (cn.getName().equals("rootpw")) {
String pwarg = request.getParameter(argsName);
// password already encrypted
String encrypt = request.getParameter("encrypt_rootpw");
if (StringUtils.isEmpty(encrypt)) {
kc.setArguments(pwarg);
}
// password changed, encrypt it
else {
kc.setArguments(kc.getKickstartData().encryptPassword(
pwarg));
}
}
else {
kc.setArguments(request.getParameter(argsName));
}
}
s.add(kc);
}
}
log.debug("updating options");
cmd.getKickstartData().setOptions(s);
//set custom options
String customOps = request.getParameter(CUSTOM_OPTIONS);
LinkedHashSet customSet = new LinkedHashSet();
log.debug("Adding custom options");
if (customOps != null) {
for (StringTokenizer strtok = new StringTokenizer(
customOps, NEWLINE); strtok.hasMoreTokens();) {
KickstartCommand custom = new KickstartCommand();
KickstartCommandName cn = KickstartFactory
.lookupKickstartCommandName("custom");
custom.setCommandName(cn);
custom.setKickstartData(cmd.getKickstartData());
String args = strtok.nextToken().trim();
if (!args.isEmpty()) {
custom.setArguments(args);
custom.setKickstartData(cmd.getKickstartData());
custom.setCustomPosition(customSet.size());
custom.setCreated(new Date());
custom.setModified(new Date());
customSet.add(custom);
}
}
log.debug("Clearing custom options");
cmd.getKickstartData().setCustomOptions(customSet);
log.debug("Adding all");
}
cmd.store();
log.debug("stored.");
displayList = cmd.getDisplayOptions(); //refresh after storing
createSuccessMessage(request, getSuccessKey(), null);
}
else {
// refresh the list to display to user and show error msgs
displayList = cmd.refreshOptions(request.getParameterMap());
addErrors(request, messages);
}
}
else {
displayList = cmd.getDisplayOptions();
}
Collections.sort(displayList);
LinkedHashSet displaySet = new LinkedHashSet();
Iterator<KickstartCommand> iter;
iter = cmd.getKickstartData().getCustomOptions().iterator();
while (iter.hasNext()) {
KickstartCommand displayCommand = new KickstartCommand();
displayCommand.setArguments(iter.next().getArguments().concat("\n"));
displaySet.add(displayCommand);
}
request.setAttribute(RequestContext.KICKSTART, cmd.getKickstartData());
request.setAttribute(OPTIONS, displayList);
request.setAttribute(CUSTOM_OPTIONS, displaySet);
return getStrutsDelegate().forwardParams(
mapping.findForward(RhnHelper.DEFAULT_FORWARD),
request.getParameterMap());
}
/**
*
* @return i18n key
*/
private String getSuccessKey() {
return "kickstart.options.success";
}
}