Files
adocWP/getolm.php
2026-05-27 14:17:22 +02:00

378 lines
11 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
require_once plugin_dir_path(__FILE__) . '../controller/logger.php';
require_once plugin_dir_path(__FILE__) . '../model/olm-login.php';
function get_all_host_from_olm_cache()
{
$olm_api = get_option('olm_url');
$token_olm = cache_get_olm_token();
$headers_olm = array(
'Content-Type: application/json',
'Accept: application/json',
'Authorization: Bearer ' . $token_olm['bearerToken']
);
$page = 1;
$size = 1000;
$allResults = [];
do {
echo "page: $page<br>";
flush();
$url = $olm_api . "/api/rest/v1/host?page={$page}&size={$size}";
$response = curl_get($url, $headers_olm);
flush();
$data = $response;
flush();
if ($data === null) {
echo "Fehlgeschlagen beim Abrufen der Seite {$page}. Ungültiges JSON.<br>";
throw new Exception("Ungültiges JSON auf Seite {$page}");
}
// Inhalte sammeln (falls vorhanden)
if (isset($data['content']) && is_array($data['content'])) {
$allResults = array_merge($allResults, $data['content']);
}
$isLast = $data['last'] ?? true; // Sicherheitshalber abbrechen, falls Feld fehlt
$page++;
} while ($isLast === false);
global $wpdb;
$table = $wpdb->prefix . 'api_cache';
foreach ($allResults as $item) {
flush();
$json_id = $item['id'];
$name = $item['name'];
$customer_no = $item['customer']['customerNo'];
$customer_name = $item['customer']['name'];
$identifier = $item['identifier'];
$reported_version = $item['reportedVersion'] ?? null;
// Falls assignedReseller.customerNo existiert
$assigned_reseller_no = $item['customer']['assignedReseller']['customerNo'] ?? null;
$wpdb->replace(
$table,
[
'json_id' => $json_id,
'name' => $name,
'customer_no' => $customer_no,
'customer' => $customer_name,
'identifier' => $identifier,
'assigned_reseller_no' => $assigned_reseller_no,
'reported_version' => $reported_version,
'response' => json_encode($item),
]
);
}
}
function _host_build_where_sql($wpdb, $search, $filters)
{
$filter_map = [
'name' => 'customer',
'customerNo' => 'customer_no',
'hostName' => 'name',
'licenseKey' => 'identifier',
];
$search = trim((string) $search);
$pbx_key = strtolower(str_replace('-', '', $search));
$where_parts = [];
$prepare_values = [];
if ($search !== '') {
if (!empty($filters)) {
foreach ($filters as $filter) {
if (!isset($filter_map[$filter])) continue;
$column = $filter_map[$filter];
$where_parts[] = "$column LIKE %s";
$prepare_values[] = '%' . $wpdb->esc_like($column === 'identifier' ? $pbx_key : $search) . '%';
}
} else {
$where_parts = ["customer LIKE %s", "name LIKE %s", "customer_no LIKE %s", "identifier LIKE %s"];
$prepare_values = [
'%' . $wpdb->esc_like($search) . '%',
'%' . $wpdb->esc_like($search) . '%',
'%' . $wpdb->esc_like($search) . '%',
'%' . $wpdb->esc_like($pbx_key) . '%',
];
}
}
$where_sql = empty($where_parts) ? '' : ' AND (' . implode(' OR ', $where_parts) . ')';
return [$where_sql, $prepare_values];
}
function host_db_reseller_cached($customer_no, $start, $size, $search, $filters = [])
{
global $wpdb;
$table = $wpdb->prefix . 'api_cache';
$start = (int) $start;
$size = (int) $size;
[$where_sql, $prepare_values] = _host_build_where_sql($wpdb, $search, $filters);
$total_count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM {$table}
WHERE (customer_no = %s OR assigned_reseller_no = %s) {$where_sql}",
array_merge([$customer_no, $customer_no], $prepare_values)
));
$result = $wpdb->get_results($wpdb->prepare(
"SELECT response FROM {$table}
WHERE (customer_no = %s OR assigned_reseller_no = %s) {$where_sql}
ORDER BY customer ASC LIMIT %d OFFSET %d",
array_merge([$customer_no, $customer_no], $prepare_values, [$size, $start])
), ARRAY_A);
foreach ($result as $item) {
$entry = json_decode($item['response'], true);
if ($uuid = $entry['id'] ?? null) queue_add_job('cachedKunden', $uuid);
}
return ['total' => (int) $total_count, 'data' => $result];
}
function host_db_reseller_cached_by_customer($customer_no, $page, $size, $search, $filters = [])
{
global $wpdb;
$table = $wpdb->prefix . 'api_cache';
$start = (int) (($page - 1) * $size);
$size = (int) $size;
[$where_sql, $prepare_values] = _host_build_where_sql($wpdb, $search, $filters);
$total_count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(DISTINCT customer_no) FROM {$table}
WHERE (customer_no = %s OR assigned_reseller_no = %s) {$where_sql}",
array_merge([$customer_no, $customer_no], $prepare_values)
));
$customer_nos = $wpdb->get_col($wpdb->prepare(
"SELECT DISTINCT customer_no FROM {$table}
WHERE (customer_no = %s OR assigned_reseller_no = %s) {$where_sql}
ORDER BY customer ASC LIMIT %d OFFSET %d",
array_merge([$customer_no, $customer_no], $prepare_values, [$size, $start])
));
if (empty($customer_nos)) {
return ['total' => (int) $total_count, 'data' => []];
}
$placeholders = implode(',', array_fill(0, count($customer_nos), '%s'));
$result = $wpdb->get_results($wpdb->prepare(
"SELECT response FROM {$table}
WHERE customer_no IN ($placeholders)
AND (customer_no = %s OR assigned_reseller_no = %s)
ORDER BY customer ASC, name ASC",
array_merge($customer_nos, [$customer_no, $customer_no])
), ARRAY_A);
foreach ($result as $item) {
$entry = json_decode($item['response'], true);
if ($uuid = $entry['id'] ?? null) queue_add_job('cachedKunden', $uuid);
}
return ['total' => (int) $total_count, 'data' => $result];
}
function refresh_host_by($id)
{
$url = get_option('olm_url') . "/api/rest/v1/host/{$id}";
$token_olm = cache_get_olm_token();
$headers_olm = array(
'Content-Type: application/json',
'Accept: application/json',
'Authorization: Bearer ' . $token_olm['bearerToken']
);
$item = curl_get($url, $headers_olm);
$json_id = $item['id'];
$name = $item['name'];
$customer_no = $item['customer']['customerNo'];
$customer_name = $item['customer']['name'];
$identifier = $item['identifier'];
$reported_version = $item['reportedVersion'] ?? null;
// Falls assignedReseller.customerNo existiert
$assigned_reseller_no = $item['customer']['assignedReseller']['customerNo'] ?? null;
global $wpdb;
$table = $wpdb->prefix . 'api_cache';
$wpdb->replace(
$table,
[
'json_id' => $json_id,
'name' => $name,
'customer_no' => $customer_no,
'customer' => $customer_name,
'identifier' => $identifier,
'assigned_reseller_no' => $assigned_reseller_no,
'reported_version' => $reported_version,
'response' => json_encode($item),
]
);
}
function curl_get($url, $headers)
{
$maxRetries = 3;
$attempt = 0;
$response = false;
$start = microtime(true);
$formattedHeaders = [];
foreach ($headers as $key => $value) {
$formattedHeaders[] = $key . ": " . $value;
}
do {
$opts = [
"http" => [
"method" => "GET",
"header" => $headers,
"timeout" => 3, // Timeout in Sekunden
]
// ,
// "ssl" => [
// "verify_peer" => false, // wie CURLOPT_SSL_VERIFYPEER
// "verify_peer_name" => false, // wie CURLOPT_SSL_VERIFYHOST
// ]
];
$context = stream_context_create($opts);
$response = @file_get_contents($url, false, $context);
$attempt++;
if ($response === false) {
$error = error_get_last();
log_msg("Versuch $attempt fehlgeschlagen: " . ($error['message'] ?? 'Unbekannter Fehler') . " url: $url<br>");
flush();
}
} while ($response === false && $attempt < $maxRetries);
if ($response === false) {
echo "Fehler nach $maxRetries Versuchen: ";
log_msg("❌ ERROR: CURL GET fehlgeschlagen nach $maxRetries Versuchen: " . ($error['message'] ?? 'Unbekannter Fehler') . " url: $url<br>");
return null;
}
return json_decode($response, true);
}
function curl_get_cached($url, $headers, $norefresh = true)
{
$hash = md5($url);
$kundennummer = explode('/', trim((explode('/api/rest/v1/customer/customerno/', $url)[1]), '/'))[0];
$cached = get_transient($hash);
if (!$norefresh) {
$response = curl_get($url, $headers);
delete_transient($hash);
$result = set_transient($hash, $response, 7200 * MINUTE_IN_SECONDS);
if (!$result) {
log_msg("❌ Transient konnte nicht gesetzt werden!");
}
return null;
}
if (!($cached === false)) {
queue_add_job('cachedKunden', $kundennummer);
return $cached; // aus Cache
}
$response = curl_get($url, $headers);
set_transient($hash, $response, 7200 * MINUTE_IN_SECONDS);
return $response;
}
function post_request($url, $headers, $data)
{
$options = array(
'http' => array(
'header' => implode("\r\n", $headers),
'method' => 'POST',
'content' => json_encode($data)
)
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
return json_decode($result, true);
}
function queue_add_job($job_type, $payload = [])
{
global $wpdb;
$table = $wpdb->prefix . "job_queue";
// Prüfen ob Payload existiert
$exists = $wpdb->get_var(
$wpdb->prepare(
"SELECT 1 FROM {$table} WHERE payload = %s LIMIT 1",
$payload
)
);
if ($exists) {
return false; // oder true / ID zurückgeben je nach Logik
}
$wpdb->insert(
$table,
[
'job_type' => sanitize_text_field($job_type),
'payload' => ($payload),
'status' => 'pending',
'created_at' => current_time('mysql'),
]
);
return $wpdb->insert_id; // Job-ID zurückgeben
}
?>