package jp.primecloud.auto.process.vmware;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import jp.primecloud.auto.common.component.PasswordEncryptor;
import jp.primecloud.auto.common.constant.PCCConstant;
import jp.primecloud.auto.config.Config;
import jp.primecloud.auto.entity.crud.Farm;
import jp.primecloud.auto.entity.crud.Image;
import jp.primecloud.auto.entity.crud.Instance;
import jp.primecloud.auto.entity.crud.PccSystemInfo;
import jp.primecloud.auto.entity.crud.PlatformVmware;
import jp.primecloud.auto.entity.crud.User;
import jp.primecloud.auto.entity.crud.VmwareInstance;
import jp.primecloud.auto.entity.crud.VmwareNetwork;
import jp.primecloud.auto.exception.AutoException;
import jp.primecloud.auto.service.ServiceSupport;
import jp.primecloud.auto.util.MessageUtils;
import jp.primecloud.auto.vmware.VmwareClient;
import com.vmware.vim25.CustomizationAdapterMapping;
import com.vmware.vim25.CustomizationDhcpIpGenerator;
import com.vmware.vim25.CustomizationFixedName;
import com.vmware.vim25.CustomizationGlobalIPSettings;
import com.vmware.vim25.CustomizationGuiUnattended;
import com.vmware.vim25.CustomizationIPSettings;
import com.vmware.vim25.CustomizationIdentification;
import com.vmware.vim25.CustomizationLicenseDataMode;
import com.vmware.vim25.CustomizationLicenseFilePrintData;
import com.vmware.vim25.CustomizationPassword;
import com.vmware.vim25.CustomizationSpec;
import com.vmware.vim25.CustomizationSysprep;
import com.vmware.vim25.CustomizationSysprepRebootOption;
import com.vmware.vim25.CustomizationUserData;
import com.vmware.vim25.CustomizationWinOptions;
import com.vmware.vim25.VirtualDevice;
import com.vmware.vim25.VirtualEthernetCard;
import com.vmware.vim25.VirtualMachineConfigInfo;
import com.vmware.vim25.mo.VirtualMachine;
public class VmwareCustomizeProcess extends ServiceSupport {
protected String windowsFullName = StringUtils.defaultIfEmpty(Config.getProperty("vmware.windowsFullName"), "PCC");
protected String windowsOrgName = StringUtils.defaultIfEmpty(Config.getProperty("vmware.windowsOrgName"), "PCC");
protected String windowsWorkgroup = StringUtils.defaultIfEmpty(Config.getProperty("vmware.windowsWorkgroup"),
"WORKGROUP");
public void customize(VmwareProcessClient vmwareProcessClient, Long instanceNo) {
VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo);
VmwareClient vmwareClient = vmwareProcessClient.getVmwareClient();
// VirtualMachine
VirtualMachine machine = vmwareClient.search(VirtualMachine.class, vmwareInstance.getMachineName());
if (machine == null) {
// 仮想マシンが見つからない場合
throw new AutoException("EPROCESS-000501", vmwareInstance.getMachineName());
}
// Windowsで始まるOSはカスタマイズする
Instance instance = instanceDao.read(instanceNo);
Image image = imageDao.read(instance.getImageNo());
if (StringUtils.startsWith(image.getOs(), PCCConstant.OS_NAME_WIN)) {
if (log.isInfoEnabled()) {
log.info(MessageUtils.getMessage("IPROCESS-100464", vmwareInstance.getMachineName()));
}
customizeWindows(vmwareProcessClient, vmwareInstance, machine);
vmwareProcessClient.powerOnVM(vmwareInstance.getMachineName());
vmwareProcessClient.waitForStopped(vmwareInstance.getMachineName());
vmwareProcessClient.powerOnVM(vmwareInstance.getMachineName());
// ネットワーク名の取得
PlatformVmware platformVmware = platformVmwareDao.read(instance.getPlatformNo());
String publicNetworkName = platformVmware.getPublicNetwork();
String privateNetworkName = platformVmware.getPrivateNetwork();
List<VmwareNetwork> vmwareNetworks = vmwareNetworkDao.readByFarmNo(instance.getFarmNo());
for (VmwareNetwork vmwareNetwork : vmwareNetworks) {
if (BooleanUtils.isTrue(vmwareNetwork.getPublicNetwork())) {
publicNetworkName = vmwareNetwork.getNetworkName();
} else {
privateNetworkName = vmwareNetwork.getNetworkName();
}
}
List<String> networkNames = new ArrayList<String>();
if (StringUtils.isNotEmpty(publicNetworkName)) {
networkNames.add(publicNetworkName);
}
if (StringUtils.isNotEmpty(privateNetworkName)) {
networkNames.add(privateNetworkName);
}
vmwareProcessClient.waitForRunning(vmwareInstance.getMachineName(), networkNames);
vmwareProcessClient.shutdownGuest(vmwareInstance.getMachineName());
if (log.isInfoEnabled()) {
log.info(MessageUtils.getMessage("IPROCESS-100465", vmwareInstance.getMachineName()));
}
}
}
protected void customizeWindows(VmwareProcessClient vmwareProcessClient, VmwareInstance vmwareInstance,
VirtualMachine machine) {
CustomizationSpec customSpec = new CustomizationSpec();
// Windows設定
CustomizationSysprep identity = new CustomizationSysprep();
CustomizationGuiUnattended guiUnattended = new CustomizationGuiUnattended();
guiUnattended.setAutoLogon(false);
guiUnattended.setAutoLogonCount(1);
guiUnattended.setTimeZone(235);
CustomizationPassword password = new CustomizationPassword();
password.setPlainText(true);
// Adminパスワードのデフォルトはユーザのパスワードをセットする
Instance instance = instanceDao.read(vmwareInstance.getInstanceNo());
Farm farm = farmDao.read(instance.getFarmNo());
User user = userDao.read(farm.getUserNo());
PccSystemInfo pccSystemInfo= pccSystemInfoDao.read();
if(pccSystemInfo == null) {
// PCC_SYSTEM_INFOのレコードが存在しない場合
log.error(MessageUtils.getMessage("EPROCESS-000532"));
throw new AutoException("EPROCESS-000532");
}
PasswordEncryptor encryptor = new PasswordEncryptor();
String decryptPassword = encryptor.decrypt(user.getPassword(), pccSystemInfo.getSecretKey());
password.setValue(decryptPassword);
guiUnattended.setPassword(password);
identity.setGuiUnattended(guiUnattended);
CustomizationUserData userData = new CustomizationUserData();
userData.setProductId("");
userData.setFullName(windowsFullName);
userData.setOrgName(windowsOrgName);
CustomizationFixedName computerName = new CustomizationFixedName();
computerName.setName(instance.getInstanceName());
userData.setComputerName(computerName);
identity.setUserData(userData);
CustomizationIdentification identification = new CustomizationIdentification();
identification.setJoinWorkgroup(windowsWorkgroup);
identity.setIdentification(identification);
// Windows Server 2000, 2003のみ必要
CustomizationLicenseFilePrintData printData = new CustomizationLicenseFilePrintData();
printData.setAutoMode(CustomizationLicenseDataMode.perSeat);
identity.setLicenseFilePrintData(printData);
customSpec.setIdentity(identity);
// Windowsオプション設定
CustomizationWinOptions options = new CustomizationWinOptions();
options.setChangeSID(true);
options.setReboot(CustomizationSysprepRebootOption.shutdown);
customSpec.setOptions(options);
// グローバル設定
CustomizationGlobalIPSettings globalIpSettings = new CustomizationGlobalIPSettings();
// DNSサーバ設定
List<String> dnsServerList = new ArrayList<String>();
// Primary DNSサーバ
dnsServerList.add(Config.getProperty("dns.server"));
// Secondry DNSサーバ
String dns2 = Config.getProperty("dns.server2");
if (dns2 != null && dns2.length() > 0) {
dnsServerList.add(Config.getProperty("dns.server2"));
}
globalIpSettings.setDnsServerList(dnsServerList.toArray(new String[dnsServerList.size()]));
List<String> dnsSuffixList = new ArrayList<String>();
dnsSuffixList.add(farm.getDomainName());
globalIpSettings.setDnsSuffixList(dnsSuffixList.toArray(new String[dnsSuffixList.size()]));
customSpec.setGlobalIPSettings(globalIpSettings);
// NIC設定
List<CustomizationAdapterMapping> nicSettingMap = createCustomizationAdapterMappings(vmwareProcessClient,
machine);
customSpec.setNicSettingMap(nicSettingMap.toArray(new CustomizationAdapterMapping[nicSettingMap.size()]));
vmwareProcessClient.customize(vmwareInstance.getMachineName(), customSpec);
}
protected List<CustomizationAdapterMapping> createCustomizationAdapterMappings(
VmwareProcessClient vmwareProcessClient, VirtualMachine machine) {
List<CustomizationAdapterMapping> nicSettingMap = new ArrayList<CustomizationAdapterMapping>();
// VirtualEthernetCardを取得
VirtualMachineConfigInfo configInfo = machine.getConfig();
for (VirtualDevice device : configInfo.getHardware().getDevice()) {
if (device instanceof VirtualEthernetCard) {
VirtualEthernetCard virtualEthernetCard = VirtualEthernetCard.class.cast(device);
CustomizationAdapterMapping mapping = new CustomizationAdapterMapping();
CustomizationIPSettings settings = new CustomizationIPSettings();
// すべてのNICをDHCPにする
CustomizationDhcpIpGenerator dhcpIp = new CustomizationDhcpIpGenerator();
settings.setIp(dhcpIp);
mapping.setMacAddress(virtualEthernetCard.getMacAddress());
mapping.setAdapter(settings);
nicSettingMap.add(mapping);
}
}
return nicSettingMap;
}
}