/**
* 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.common.util.StringUtil;
import com.redhat.rhn.common.validator.ValidatorException;
import com.redhat.rhn.common.validator.ValidatorResult;
import com.redhat.rhn.domain.kickstart.KickstartCommand;
import com.redhat.rhn.domain.kickstart.KickstartData;
import com.redhat.rhn.domain.kickstart.KickstartFactory;
import com.redhat.rhn.domain.kickstart.KickstartRawData;
import com.redhat.rhn.domain.kickstart.KickstartVirtualizationType;
import com.redhat.rhn.domain.kickstart.KickstartableTree;
import com.redhat.rhn.domain.kickstart.builder.KickstartBuilder;
import com.redhat.rhn.domain.kickstart.builder.KickstartParser;
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.frontend.struts.RhnValidationHelper;
import com.redhat.rhn.frontend.struts.StrutsDelegate;
import com.redhat.rhn.manager.kickstart.KickstartFileDownloadCommand;
import com.redhat.rhn.manager.kickstart.KickstartWizardHelper;
import com.redhat.rhn.manager.kickstart.cobbler.CobblerProfileCommand;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.upload.FormFile;
import org.cobbler.Distro;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author paji
* AdvancedModeDetailsAction
* @version $Rev$
*/
public class AdvancedModeDetailsAction extends RhnAction {
private static final String KSTREES_PARAM = "kstrees";
private static final String NOTREES_PARAM = "notrees";
private static final String KICKSTART_LABEL_PARAM = "kickstartLabel";
private static final String KSTREE_ID_PARAM = "kstreeId";
private static final String VIRTUALIZATION_TYPES_PARAM = "virtualizationTypes";
private static final String VIRTUALIZATION_TYPE_LABEL_PARAM = "virtualizationTypeLabel";
private static final String UPDATE_ALL_PARAM = "updateAll";
private static final String UPDATE_RED_HAT_PARAM = "updateRedHat";
private static final String USING_UPDATE_ALL = "usingUpdateAll";
private static final String USING_UPDATE_RED_HAT = "usingUpdateRedHat";
private static final String CONTENTS = "contents";
private static final String FILE_UPLOAD = "fileUpload";
private static final String ORG_DEFAULT = "org_default";
private static final String ACTIVE = "active";
private static final String CREATE_MODE = "create";
private static final String UPLOAD_KEY = "manage.jsp.uploadbutton";
private static final String UPLOAD_KEY_LABEL = "uploadKey";
private static final String VALIDATION_XSD =
"/com/redhat/rhn/frontend/action/kickstart/validation/kickstartFileForm.xsd";
public static final String CSRF_TOKEN = "csrfToken";
/**
*
* {@inheritDoc}
*/
public ActionForward execute(ActionMapping mapping,
ActionForm formIn,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
RequestContext context = new RequestContext(request);
request.setAttribute(UPLOAD_KEY_LABEL, UPLOAD_KEY);
request.setAttribute(CSRF_TOKEN, request.getSession().getAttribute("csrf_token"));
context.copyParamToAttributes(RequestContext.KICKSTART_ID);
if (CREATE_MODE.equals(mapping.getParameter())) {
context.getRequest().setAttribute(CREATE_MODE, Boolean.TRUE);
}
DynaActionForm form = (DynaActionForm) formIn;
if (!context.isSubmitted()) {
setup(context, form);
}
else if (!isCreateMode(request) && !getKsData(context).isValid()) {
return submitInvalid(context, form, mapping);
}
else {
return submit(context, form, mapping);
}
return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
}
private ActionForward submitInvalid(RequestContext context,
DynaActionForm form, ActionMapping mapping) {
try {
KickstartData data = getKsData(context);
User user = context.getCurrentUser();
KickstartBuilder builder = new KickstartBuilder(user);
KickstartWizardHelper cmd = new KickstartWizardHelper(user);
KickstartableTree tree = cmd.getKickstartableTree(
(Long)form.get(KSTREE_ID_PARAM));
builder.update(data, data.getLabel(), tree,
data.getKickstartDefaults().getVirtualizationType().getLabel());
return getStrutsDelegate().forwardParam(mapping.findForward("success"),
RequestContext.KICKSTART_ID, data.getId().toString());
}
catch (ValidatorException ve) {
RhnValidationHelper.setFailedValidation(context.getRequest());
getStrutsDelegate().saveMessages(context.getRequest(), ve.getResult());
setup(context, form);
if (!isCreateMode(context.getRequest())) {
KickstartRawData ks = getKsData(context);
return getStrutsDelegate().forwardParam(mapping.
findForward(RhnHelper.DEFAULT_FORWARD),
RequestContext.KICKSTART_ID,
ks.getId().toString());
}
return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
}
}
private ActionForward submit(RequestContext context,
DynaActionForm form, ActionMapping mapping) {
try {
validateInput(form, context);
User user = context.getCurrentUser();
KickstartTreeUpdateType updateType = null;
KickstartWizardHelper cmd = new KickstartWizardHelper(user);
KickstartableTree tree = cmd.getKickstartableTree(
(Long)form.get(KSTREE_ID_PARAM));
if (form.get(UPDATE_ALL_PARAM) != null) {
updateType = KickstartTreeUpdateType.ALL;
tree = KickstartFactory.getNewestTree(updateType,
tree.getChannel().getId(),
context.getCurrentUser().getOrg());
}
else if (form.get(UPDATE_RED_HAT_PARAM) != null) {
updateType = KickstartTreeUpdateType.RED_HAT;
tree = KickstartFactory.getNewestTree(updateType,
tree.getChannel().getId(),
context.getCurrentUser().getOrg());
}
else {
updateType = KickstartTreeUpdateType.NONE;
}
String virtType = form.getString(VIRTUALIZATION_TYPE_LABEL_PARAM);
String label = form.getString(KICKSTART_LABEL_PARAM);
KickstartBuilder builder = new KickstartBuilder(user);
KickstartRawData ks;
String fileData = getData(context, form);
if (fileData == null) {
fileData = "";
}
else {
fileData = fileData.trim();
}
// Add info about all commands from fileData to KickstartData, since we use it
// to determine type of password encryption, see Bug 1122422
KickstartParser parser = new KickstartParser(fileData);
if (isCreateMode(context.getRequest())) {
ks = builder.createRawData(label, tree, fileData, virtType,
KickstartTreeUpdateType.NONE);
builder.buildCommands(ks, parser.getOptionLines(), tree);
}
else {
ks = getKsData(context);
// upload content of new kickstart file
ks.setData(fileData);
// build new commands in KickstartData
ks.removeCommands();
builder.buildCommands(ks, parser.getOptionLines(), tree);
builder.update(ks, label, tree, virtType);
ks.setActive(Boolean.TRUE.equals(form.get(ACTIVE)));
ks.setOrgDefault(Boolean.TRUE.equals(form.get(ORG_DEFAULT)));
}
ks.setRealUpdateType(updateType);
KickstartDetailsEditAction.processCobblerFormValues(ks, form,
context.getCurrentUser());
return getStrutsDelegate().forwardParam(mapping.findForward("success"),
RequestContext.KICKSTART_ID,
ks.getId().toString());
}
catch (ValidatorException ve) {
RhnValidationHelper.setFailedValidation(context.getRequest());
getStrutsDelegate().saveMessages(context.getRequest(), ve.getResult());
setup(context, form);
if (!isCreateMode(context.getRequest())) {
KickstartRawData ks = getKsData(context);
return getStrutsDelegate().forwardParam(mapping.
findForward(RhnHelper.DEFAULT_FORWARD),
RequestContext.KICKSTART_ID,
ks.getId().toString());
}
return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
}
}
private void setup(RequestContext context, DynaActionForm form) {
User user = context.getCurrentUser();
KickstartWizardHelper cmd = new KickstartWizardHelper(user);
loadTrees(cmd, form, context);
loadVirtualizationTypes(cmd, form, context);
if (!isCreateMode(context.getRequest())) {
KickstartRawData data = getKsData(context);
Collection<KickstartCommand> commands = data.getCommands();
if (!data.isValid()) {
context.getRequest().setAttribute(KickstartDetailsEditAction.INVALID,
Boolean.TRUE);
return;
}
// set commands if they haven't been set yet
if (commands == null || commands.size() == 0) {
KickstartBuilder builder = new KickstartBuilder(user);
KickstartParser parser = new KickstartParser(data.getData());
KickstartableTree tree =
cmd.getKickstartableTree((Long) form.get(KSTREE_ID_PARAM));
builder.buildCommands(data, parser.getOptionLines(), tree);
}
form.set(KICKSTART_LABEL_PARAM, data.getLabel());
form.set(CONTENTS, data.getData());
KickstartFileDownloadCommand dcmd = new KickstartFileDownloadCommand(
data.getId(),
user,
context.getRequest());
context.getRequest().setAttribute(KickstartFileDownloadAction.KSURL,
dcmd.getOrgDefaultUrl());
KickstartDetailsEditAction.setupCobblerFormValues(context, form, data);
form.set(ORG_DEFAULT, data.isOrgDefault());
form.set(ACTIVE, data.isActive());
KickstartDetailsEditAction.checkKickstartFile(context, getStrutsDelegate());
}
}
private void loadVirtualizationTypes(KickstartWizardHelper cmd, DynaActionForm form,
RequestContext context) {
List<KickstartVirtualizationType> types = cmd.getVirtualizationTypes();
form.set(VIRTUALIZATION_TYPES_PARAM, types);
if (isCreateMode(context.getRequest())) {
form.set(VIRTUALIZATION_TYPE_LABEL_PARAM,
KickstartVirtualizationType.NONE);
}
else {
KickstartRawData data = getKsData(context);
form.set(VIRTUALIZATION_TYPE_LABEL_PARAM, data.getKickstartDefaults().
getVirtualizationType().getLabel());
}
}
private void loadTrees(KickstartWizardHelper cmd, DynaActionForm form,
RequestContext context) {
List<KickstartableTree> trees = cmd.getKickstartableTrees();
if (trees == null || trees.size() == 0) {
context.getRequest().setAttribute(NOTREES_PARAM, Boolean.TRUE);
form.set(KSTREE_ID_PARAM, null);
}
else {
form.set(KSTREES_PARAM, trees);
if (isCreateMode(context.getRequest())) {
form.set(KSTREE_ID_PARAM, null);
}
else {
KickstartRawData data = getKsData(context);
KickstartableTree tree = data.getTree();
if (tree == null) {
form.set(KSTREE_ID_PARAM, null);
}
else {
form.set(KSTREE_ID_PARAM, tree.getId());
}
KickstartTreeUpdateType updateType = data.getRealUpdateType();
if (updateType.equals(KickstartTreeUpdateType.ALL)) {
context.getRequest().setAttribute(USING_UPDATE_ALL, "true");
}
else if (updateType.equals(KickstartTreeUpdateType.RED_HAT)) {
context.getRequest().setAttribute(USING_UPDATE_RED_HAT, "true");
}
}
}
}
private boolean isCreateMode(HttpServletRequest request) {
return Boolean.TRUE.equals(request.getAttribute(CREATE_MODE));
}
private void validateInput(DynaActionForm form,
RequestContext context) {
String label = form.getString(KICKSTART_LABEL_PARAM);
KickstartBuilder builder = new KickstartBuilder(context.getCurrentUser());
if (isCreateMode(context.getRequest())) {
builder.validateNewLabel(label);
}
else {
KickstartRawData data = getKsData(context);
if (!data.getLabel().equals(label)) {
builder.validateNewLabel(label);
}
}
ValidatorResult result = RhnValidationHelper.validate(this.getClass(),
makeValidationMap(form), null,
VALIDATION_XSD);
if (!result.isEmpty()) {
throw new ValidatorException(result);
}
FormFile file = (FormFile) form.get(FILE_UPLOAD);
String contents = form.getString(CONTENTS);
if (!file.getFileName().equals("") && !contents.equals("")) {
ValidatorException.raiseException("kickstart.details.duplicatefile");
}
KickstartableTree tree = KickstartFactory.lookupKickstartTreeByIdAndOrg(
(Long) form.get(KSTREE_ID_PARAM),
context.getCurrentUser().getOrg());
KickstartVirtualizationType vType =
KickstartFactory.lookupKickstartVirtualizationTypeByLabel(
form.getString(VIRTUALIZATION_TYPE_LABEL_PARAM));
Distro distro = CobblerProfileCommand.getCobblerDistroForVirtType(tree, vType,
context.getCurrentUser());
if (distro == null) {
ValidatorException.raiseException("kickstart.cobbler.profile.invalidvirt");
}
}
private String getData(RequestContext context, DynaActionForm form) {
FormFile file = (FormFile) form.get(FILE_UPLOAD);
String contents = form.getString(CONTENTS);
if (!file.getFileName().equals("")) {
StrutsDelegate delegate = getStrutsDelegate();
return delegate.extractString(file);
}
else if (!contents.equals("")) {
return StringUtil.webToLinux(contents);
}
else {
return null;
}
}
private KickstartRawData getKsData(RequestContext context) {
return (KickstartRawData) context.lookupAndBindKickstartData();
}
private Map<String, Object> makeValidationMap(DynaActionForm form) {
Map<String, Object> map = new HashMap<String, Object>();
map.put(KSTREE_ID_PARAM, form.get(KSTREE_ID_PARAM));
map.put(KICKSTART_LABEL_PARAM, form.get(KICKSTART_LABEL_PARAM));
return map;
}
}