package org.ovirt.engine.core.bll.hostdeploy;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.logging.Level;
import org.apache.commons.lang.StringUtils;
import org.ovirt.engine.core.utils.PKIResources;
import org.ovirt.engine.core.utils.hostinstall.OpenSslCAWrapper;
import org.ovirt.otopi.dialog.Event;
import org.ovirt.ovirt_host_deploy.constants.Const;
import org.ovirt.ovirt_host_deploy.constants.Displays;
import org.ovirt.ovirt_host_deploy.constants.VMConsoleEnv;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class VdsDeployVmconsoleUnit implements VdsDeployUnit {
private static final Logger log = LoggerFactory.getLogger(VdsDeployVmconsoleUnit.class);
private static final String COND_VMCONSOLE_DEPLOY = "VMCONSOLE_DEPLOY";
private static final String COND_VMCONSOLE_PKI = "VMCONSOLE_PKI";
private final List<Callable<Boolean>> CUSTOMIZATION_DIALOG = Arrays.asList(
new Callable<Boolean>() {@VdsDeployUnit.CallWhen(COND_VMCONSOLE_DEPLOY)
public Boolean call() throws Exception {
Integer support = (Integer)_deploy.getParser().cliEnvironmentGet(
VMConsoleEnv.SUPPORT
);
if (support == null || support != Const.VMCONSOLE_SUPPORT_V1) {
_deploy.removeCustomizationCondition(COND_VMCONSOLE_DEPLOY);
_deploy.removeCustomizationCondition(COND_VMCONSOLE_PKI);
}
return true;
}},
new Callable<Boolean>() {@VdsDeployUnit.CallWhen(COND_VMCONSOLE_DEPLOY)
public Boolean call() throws Exception {
_deploy.getParser().cliEnvironmentSet(
VMConsoleEnv.ENABLE,
true
);
return true;
}},
new Callable<Boolean>() {@VdsDeployUnit.CallWhen(COND_VMCONSOLE_PKI)
public Boolean call() throws Exception {
_deploy.getParser().cliEnvironmentSet(
VMConsoleEnv.CERTIFICATE_ENROLLMENT,
Const.CERTIFICATE_ENROLLMENT_INLINE
);
return true;
}},
new Callable<Boolean>() {@VdsDeployUnit.CallWhen(COND_VMCONSOLE_PKI)
public Boolean call() throws Exception {
_deploy.getParser().cliEnvironmentSet(
VMConsoleEnv.CAKEY,
PKIResources.getCaCertificate().toString(
PKIResources.Format.OPENSSH_PUBKEY
).replace("\n", "")
);
return true;
}}
);
private VdsDeployBase _deploy;
private boolean _pkionly;
private String _sercon_certificate;
public VdsDeployVmconsoleUnit(boolean pkionly) {
_pkionly = pkionly;
}
public VdsDeployVmconsoleUnit() {
this(false);
}
// VdsDeployUnit interface
@Override
public void setVdsDeploy(VdsDeployBase deploy) {
_deploy = deploy;
}
@Override
public void init() {
_deploy.addCustomizationDialog(CUSTOMIZATION_DIALOG);
_deploy.addCustomizationCondition(COND_VMCONSOLE_PKI);
if (!_pkionly) {
_deploy.addCustomizationCondition(COND_VMCONSOLE_DEPLOY);
}
}
@Override
public boolean processEvent(Event.Base bevent) throws IOException {
boolean unknown = true;
if (bevent instanceof Event.QueryValue) {
Event.QueryValue event = (Event.QueryValue)bevent;
if (org.ovirt.ovirt_host_deploy.constants.Queries.VMCONSOLE_CERTIFICATE.equals(event.name)) {
event.value = _sercon_certificate.replace("\n", "");
unknown = false;
}
}
else if (bevent instanceof Event.DisplayMultiString) {
Event.DisplayMultiString event = (Event.DisplayMultiString)bevent;
if (Displays.VMCONSOLE_CERTIFICATE_REQUEST.equals(event.name)) {
_deploy.userVisibleLog(
Level.INFO,
"Enrolling serial console certificate"
);
String name = String.format("%s-ssh", _deploy.getVds().getHostName());
OpenSslCAWrapper.signCertificateRequest(
StringUtils.join(event.value, "\n"),
name,
_deploy.getVds().getHostName()
);
_sercon_certificate = OpenSslCAWrapper.signOpenSSHCertificate(
name,
_deploy.getVds().getHostName(),
_deploy.getVds().getHostName()
);
unknown = false;
}
}
return unknown;
}
}