public function OnHostInit(HostInitEvent $event)
{
if (!in_array($event->DBServer->platform, array(\SERVER_PLATFORMS::CLOUDSTACK, \SERVER_PLATFORMS::IDCF))) {
return;
}
if ($event->DBServer->farmRoleId) {
$dbFarmRole = $event->DBServer->GetFarmRoleObject();
if ($dbFarmRole->GetSetting(Entity\FarmRoleSetting::CLOUDSTACK_USE_STATIC_NAT)) {
CloudstackHelper::setStaticNatForServer($event->DBServer);
return true;
}
$networkType = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::CLOUDSTACK_NETWORK_TYPE);
$networkId = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::CLOUDSTACK_NETWORK_ID);
if ($networkType == 'Direct' || !$networkId) {
return true;
}
if ($networkId == 'SCALR_MANUAL') {
$map = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::CLOUDSTACK_STATIC_NAT_PRIVATE_MAP);
$map = explode(";", $map);
foreach ($map as $ipMapping) {
$ipInfo = explode("=", $ipMapping);
if ($ipInfo[0] == $event->DBServer->localIp) {
$event->DBServer->remoteIp = $ipInfo[1];
$event->DBServer->Save();
}
}
}
$sharedIpId = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::CLOUDSTACK_SHARED_IP_ID);
}
try {
$environment = $event->DBServer->GetEnvironmentObject();
$cloudLocation = $event->DBServer->GetCloudLocation();
if (empty($sharedIpId)) {
$sharedIpId = $environment->keychain($event->DBServer->platform)->properties[Entity\CloudCredentialsProperty::CLOUDSTACK_SHARED_IP_ID . ".{$cloudLocation}"];
}
if (!$sharedIpId) {
return;
}
$cs = $environment->cloudstack($event->DBServer->platform);
// Create port forwarding rules for scalarizr
$port = $environment->keychain($event->DBServer->platform)->properties[Entity\CloudCredentialsProperty::CLOUDSTACK_SZR_PORT_COUNTER . ".{$cloudLocation}.{$sharedIpId}"];
if (!$port) {
$port1 = 30000;
$port2 = 30001;
$port3 = 30002;
$port4 = 30003;
} else {
$port1 = $port + 1;
$port2 = $port1 + 1;
$port3 = $port2 + 1;
$port4 = $port3 + 1;
}
$cs->firewall->createPortForwardingRule(array('ipaddressid' => $sharedIpId, 'privateport' => 8014, 'protocol' => "udp", 'publicport' => $port1, 'virtualmachineid' => $event->DBServer->GetProperty(\CLOUDSTACK_SERVER_PROPERTIES::SERVER_ID)));
$cs->firewall->createPortForwardingRule(array('ipaddressid' => $sharedIpId, 'privateport' => 8013, 'protocol' => "tcp", 'publicport' => $port1, 'virtualmachineid' => $event->DBServer->GetProperty(\CLOUDSTACK_SERVER_PROPERTIES::SERVER_ID)));
$cs->firewall->createPortForwardingRule(array('ipaddressid' => $sharedIpId, 'privateport' => 8010, 'protocol' => "tcp", 'publicport' => $port3, 'virtualmachineid' => $event->DBServer->GetProperty(\CLOUDSTACK_SERVER_PROPERTIES::SERVER_ID)));
$cs->firewall->createPortForwardingRule(array('ipaddressid' => $sharedIpId, 'privateport' => 8008, 'protocol' => "tcp", 'publicport' => $port2, 'virtualmachineid' => $event->DBServer->GetProperty(\CLOUDSTACK_SERVER_PROPERTIES::SERVER_ID)));
$cs->firewall->createPortForwardingRule(array('ipaddressid' => $sharedIpId, 'privateport' => 22, 'protocol' => "tcp", 'publicport' => $port4, 'virtualmachineid' => $event->DBServer->GetProperty(\CLOUDSTACK_SERVER_PROPERTIES::SERVER_ID)));
$event->DBServer->SetProperties(array(SERVER_PROPERTIES::SZR_CTRL_PORT => $port1, SERVER_PROPERTIES::SZR_SNMP_PORT => $port1, SERVER_PROPERTIES::SZR_API_PORT => $port3, SERVER_PROPERTIES::SZR_UPDC_PORT => $port2, SERVER_PROPERTIES::CUSTOM_SSH_PORT => $port4));
$environment->keychain($event->DBServer->platform)->properties->saveSettings([Entity\CloudCredentialsProperty::CLOUDSTACK_SZR_PORT_COUNTER . ".{$cloudLocation}.{$sharedIpId}" => $port4]);
} catch (Exception $e) {
$this->Logger->fatal(new FarmLogMessage(!empty($this->FarmID) ? $this->FarmID : null, sprintf(_("Cloudstack handler failed: %s."), $e->getMessage()), !empty($event->DBServer->serverId) ? $event->DBServer->serverId : null, !empty($event->DBServer->envId) ? $event->DBServer->envId : null, !empty($event->DBServer->farmRoleId) ? $event->DBServer->farmRoleId : null));
}
}