Skip to content
This repository has been archived by the owner on Dec 13, 2022. It is now read-only.

fix(poller): fix remote server duplication (#11552) #11674

Merged
merged 2 commits into from
Sep 5, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion bin/registerServerTopology.sh
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ function request_to_remote() {
fi

# Prepare Remote Payload
REMOTE_PAYLOAD='{"isRemote":true,"platformName":"'"${CURRENT_NODE_NAME}"'","centralServerAddress":"'"${PARSED_URL[HOST]}"'","apiUsername":"'"${API_USERNAME}"'","apiCredentials":"'"${API_TARGET_PASSWORD}"'","apiScheme":"'"${PARSED_URL[SCHEME]}"'","apiPort":'"${PARSED_URL[PORT]}"',"apiPath":"'"${CENTREON_BASE_URI}"'",'"${PEER_VALIDATION}"
REMOTE_PAYLOAD='{"isRemote":true,"address":"'${PARSED_CURRENT_NODE_URL[HOST]}'","platformName":"'"${CURRENT_NODE_NAME}"'","centralServerAddress":"'"${PARSED_URL[HOST]}"'","apiUsername":"'"${API_USERNAME}"'","apiCredentials":"'"${API_TARGET_PASSWORD}"'","apiScheme":"'"${PARSED_URL[SCHEME]}"'","apiPort":'"${PARSED_URL[PORT]}"',"apiPath":"'"${CENTREON_BASE_URI}"'",'"${PEER_VALIDATION}"
if [[ -n PROXY_PAYLOAD ]]; then
REMOTE_PAYLOAD="${REMOTE_PAYLOAD}""${PROXY_PAYLOAD}"
fi
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
"isRemote": {
"type": "boolean"
},
"address": {
"type": "string"
},
"centralServerAddress": {
"type": "string"
},
Expand Down
4 changes: 4 additions & 0 deletions doc/API/centreon-api-v22.04.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6730,6 +6730,10 @@ components:
type: boolean
example: true
description: "Platform is a remote server"
address:
type: string
example: "10.0.0.1"
description: "The address of the platform"
centralServerAddress:
type: string
example: "192.168.0.1"
Expand Down
10 changes: 5 additions & 5 deletions src/Centreon/Application/ApiPlatform.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,27 +28,27 @@
class ApiPlatform
{
/**
* @var float
* @var string
*/
private $version;

/**
* Get the API version
*
* @return float
* @return string
*/
public function getVersion(): float
public function getVersion(): string
{
return $this->version;
}

/**
* Set the API version
*
* @param float $version
* @param string $version
* @return $this
*/
public function setVersion(float $version): self
public function setVersion(string $version): self
{
$this->version = $version;
return $this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ class PlatformInformation
*/
private $platformName;

/**
* @var string server address
*/
private string $address = '127.0.0.1';

/**
* @var string|null central's address
*/
Expand Down Expand Up @@ -126,6 +131,25 @@ public function setPlatformName(?string $name): self
return $this;
}

/**
* @return string
*/
public function getAddress(): string
{
return $this->address;
}

/**
* @param string $address
* @return $this
*/
public function setAddress(string $address): self
{
$this->address = $address;

return $this;
}

/**
* @return string|null
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ public function createRemoteInformation(array $information): PlatformInformation
$platformInformation = new PlatformInformation($isRemote);
foreach ($information as $key => $value) {
switch ($key) {
case 'address':
$platformInformation->setAddress($value);
break;
case 'centralServerAddress':
$platformInformation->setCentralServerAddress($value);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ private function convertCentralToRemote(
$platformInformationToUpdate,
$currentPlatformInformation
);

$this->remoteServerService->convertCentralToRemote(
$platformInformationToUpdate
);
Expand Down
14 changes: 6 additions & 8 deletions src/Centreon/Domain/PlatformTopology/Model/PlatformPending.php
Original file line number Diff line number Diff line change
Expand Up @@ -196,13 +196,11 @@ private function checkIpAddress(?string $address): ?string
{
// Check for valid IPv4 or IPv6 IP
// or not sent address (in the case of Central's "parent_address")
if (null === $address || false !== filter_var($address, FILTER_VALIDATE_IP)) {
return $address;
}

// check for DNS to be resolved
$addressResolved = filter_var(gethostbyname($address), FILTER_VALIDATE_IP);
if (false === $addressResolved) {
if (
$address !== null
&& ! filter_var($address, FILTER_VALIDATE_IP)
&& ! filter_var($address, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME)
) {
throw new \InvalidArgumentException(
sprintf(
_("The address '%s' of '%s' is not valid or not resolvable"),
Expand All @@ -212,7 +210,7 @@ private function checkIpAddress(?string $address): ?string
);
}

return $addressResolved;
return $address;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,14 +194,11 @@ public function setHostname(?string $hostname): PlatformInterface
*/
private function checkIpAddress(?string $address): ?string
{
// Check for valid IPv4 or IPv6 IP
// or not sent address (in the case of Central's "parent_address")
if (null === $address || false !== filter_var($address, FILTER_VALIDATE_IP)) {
return $address;
}

// check for DNS to be resolved
if (false === filter_var(gethostbyname($address), FILTER_VALIDATE_IP)) {
if (
$address !== null
&& ! filter_var($address, FILTER_VALIDATE_IP)
&& ! filter_var($address, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME)
) {
throw new \InvalidArgumentException(
sprintf(
_("The address '%s' of '%s' is not valid or not resolvable"),
Expand Down
14 changes: 10 additions & 4 deletions src/Centreon/Domain/PlatformTopology/PlatformTopologyService.php
Original file line number Diff line number Diff line change
Expand Up @@ -482,9 +482,14 @@ private function findParentPlatform(PlatformInterface $platform): ?PlatformInter
return null;
}

$registeredParentInTopology = $this->platformTopologyRepository->findPlatformByAddress(
$platform->getParentAddress()
);
if ($platform->getType() === PlatformPending::TYPE_REMOTE) {
$registeredParentInTopology = $this->platformTopologyRepository->findTopLevelPlatform();
} else {
$registeredParentInTopology = $this->platformTopologyRepository->findPlatformByAddress(
$platform->getParentAddress()
);
}

if (null === $registeredParentInTopology) {
throw new EntityNotFoundException(
sprintf(
Expand Down Expand Up @@ -553,6 +558,7 @@ public function getPlatformTopology(): array
);
if (null !== $platformParent) {
$platform->setParentAddress($platformParent->getAddress());
$platform->setParentId($platformParent->getId());
}
}

Expand Down Expand Up @@ -614,7 +620,7 @@ public function deletePlatformAndReallocateChildren(int $serverId): void
*/
if ($deletedPlatform->getServerId() !== null) {
if ($deletedPlatform->getType() === PlatformPending::TYPE_REMOTE) {
$this->remoteServerRepository->deleteRemoteServerByAddress($deletedPlatform->getAddress());
$this->remoteServerRepository->deleteRemoteServerByServerId($deletedPlatform->getServerId());
$this->remoteServerRepository->deleteAdditionalRemoteServer($deletedPlatform->getServerId());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ interface RemoteServerRepositoryInterface
/**
* Delete a Remote Server.
*
* @param string $address
* @param int $serverId
*/
public function deleteRemoteServerByAddress(string $address): void;
public function deleteRemoteServerByServerId(int $serverId): void;

/**
* Delete an Additional Remote Server, for pollers linked to multiple Remote Servers.
Expand Down
4 changes: 4 additions & 0 deletions src/Centreon/Domain/RemoteServer/RemoteServerService.php
Original file line number Diff line number Diff line change
Expand Up @@ -137,16 +137,20 @@ public function convertCentralToRemote(PlatformInformation $platformInformation)
if ($platformInformation->getPlatformName() !== null) {
$topLevelPlatform->setName($platformInformation->getPlatformName());
}
$topLevelPlatform->setAddress($platformInformation->getAddress());

/**
* Find any children platform and forward them to Central Parent.
*/
$platforms = $this->platformTopologyRepository->findChildrenPlatformsByParentId(
$topLevelPlatform->getId()
);

/**
* Insert the Top Level Platform at the beginning of array, as it need to be registered first.
*/
array_unshift($platforms, $topLevelPlatform);

/**
* Register the platforms on the Parent Central
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,12 @@ public function __construct(DatabaseConnection $db)
/**
* @inheritDoc
*/
public function deleteRemoteServerByAddress(string $address): void
public function deleteRemoteServerByServerId(int $serverId): void
{
$statement = $this->db->prepare($this->translateDbName("DELETE FROM remote_servers WHERE ip = :address"));
$statement->bindValue(':address', $address, \PDO::PARAM_STR);
$statement = $this->db->prepare(
$this->translateDbName("DELETE FROM remote_servers WHERE server_id = :server_id")
);
$statement->bindValue(':server_id', $serverId, \PDO::PARAM_INT);
$statement->execute();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ public function getList(): array
public function postGetRemotesList(): array
{
$query = 'SELECT ns.id, ns.ns_ip_address as ip, ns.name FROM nagios_server as ns ' .
'JOIN remote_servers as rs ON rs.ip = ns.ns_ip_address ' .
'JOIN remote_servers as rs ON rs.server_id = ns.id ' .
'WHERE rs.is_connected = 1';
$statement = $this->pearDB->query($query);

Expand Down Expand Up @@ -469,6 +469,7 @@ public function postLinkCentreonRemoteServer(): array

// add server to the list of remote servers in database (table remote_servers)
$this->addServerToListOfRemotes(
(int) $serverId,
$serverIP,
$centreonPath,
$httpMethod,
Expand Down Expand Up @@ -532,6 +533,7 @@ public function authorize($action, $user, $isInternal = false): bool
/**
* Add server ip in table of remote servers
*
* @param int $serverId the poller id
* @param string $serverIP the IP of the server
* @param string $centreonPath the path to access to Centreon
* @param string $httpMethod the method to access to server (HTTP/HTTPS)
Expand All @@ -540,41 +542,54 @@ public function authorize($action, $user, $isInternal = false): bool
* @param bool $noProxy to do not use configured proxy
*/
private function addServerToListOfRemotes(
int $serverId,
string $serverIP,
string $centreonPath,
string $httpMethod,
string $httpPort,
bool $noCheckCertificate,
bool $noProxy
): void {
$dbAdapter = $this->getDi()[\Centreon\ServiceProvider::CENTREON_DB_MANAGER]->getAdapter('configuration_db');
$date = date('Y-m-d H:i:s');

$sql = 'SELECT * FROM `remote_servers` WHERE `ip` = ?';
$dbAdapter->query($sql, [$serverIP]);
$hasIpInTable = (bool)$dbAdapter->count();
$currentDate = date('Y-m-d H:i:s');

if ($hasIpInTable) {
$sql = 'UPDATE `remote_servers` SET
`is_connected` = ?, `connected_at` = ?, `centreon_path` = ?,
`no_check_certificate` = ?, `no_proxy` = ?
WHERE `ip` = ?';
$data = ['1', $date, $centreonPath, ($noCheckCertificate ?: 0), ($noProxy ?: 0), $serverIP];
$dbAdapter->query($sql, $data);
$statement = $this->pearDB->prepare('SELECT 1 FROM `remote_servers` WHERE `server_id` = :server_id');
$statement->bindValue(':server_id', $serverId, \PDO::PARAM_INT);
$statement->execute();
$remoteAlreadyExists = (bool) $statement->rowCount();

if ($remoteAlreadyExists) {
$updateStatement = $this->pearDB->prepare(
'UPDATE `remote_servers` SET
`is_connected` = 1, `connected_at` = :connected_at, `centreon_path` = :centreon_path,
`no_check_certificate` = :no_check_certificate, `no_proxy` = :no_proxy, `ip_address` = :ip_address
WHERE `server_id` = :server_id'
);
$updateStatement->bindValue(':connected_at', $currentDate, \PDO::PARAM_STR);
$updateStatement->bindValue(':centreon_path', $centreonPath, \PDO::PARAM_STR);
$updateStatement->bindValue(':no_check_certificate', $noCheckCertificate ? '1' : '0', \PDO::PARAM_STR);
$updateStatement->bindValue(':no_proxy', $noProxy ? '1' : '0', \PDO::PARAM_STR);
$updateStatement->bindValue(':ip_address', $serverIP, \PDO::PARAM_STR);
$updateStatement->bindValue(':server_id', $serverId, \PDO::PARAM_INT);
$updateStatement->execute();
} else {
$data = [
'ip' => $serverIP,
'version' => '',
'is_connected' => '1',
'created_at' => $date,
'connected_at' => $date,
'centreon_path' => $centreonPath,
'http_method' => $httpMethod,
'http_port' => $httpPort ?: null,
'no_check_certificate' => $noCheckCertificate ?: 0,
'no_proxy' => $noProxy ?: 0
];
$dbAdapter->insert('remote_servers', $data);
$insertStatement = $this->pearDB->prepare(
'INSERT INTO `remote_servers`
(`ip`, `version`, `is_connected`, `created_at`, `connected_at`, `centreon_path`,
`http_method`, `http_port`, `no_check_certificate`, `no_proxy`, `server_id`)
VALUES
(:ip_address, "", 1, :created_at, :connected_at, :centreon_path, :http_method, :http_port,
:no_check_certificate, :no_proxy, :server_id)'
);
$insertStatement->bindValue(':ip_address', $serverIP, \PDO::PARAM_STR);
$insertStatement->bindValue(':created_at', $currentDate, \PDO::PARAM_STR);
$insertStatement->bindValue(':connected_at', $currentDate, \PDO::PARAM_STR);
$insertStatement->bindValue(':centreon_path', $centreonPath, \PDO::PARAM_STR);
$insertStatement->bindValue(':http_method', $httpMethod, \PDO::PARAM_STR);
$insertStatement->bindValue(':http_port', $httpPort ?: null, \PDO::PARAM_INT);
$insertStatement->bindValue(':no_check_certificate', $noCheckCertificate ? '1' : '0', \PDO::PARAM_STR);
$insertStatement->bindValue(':no_proxy', $noProxy ? '1' : '0', \PDO::PARAM_STR);
$insertStatement->bindValue(':server_id', $serverId, \PDO::PARAM_INT);
$insertStatement->execute();
}
}

Expand Down
Loading