pandorafms/pandora_console/include/functions_update_manager.php

1001 lines
32 KiB
PHP
Executable File

<?php
// Pandora FMS - http://pandorafms.com
// ==================================================
// Copyright (c) 2005-2009 Artica Soluciones Tecnologicas
// Please see http://pandorafms.org for full contribution list
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License
// as published by the Free Software Foundation; version 2
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
/**
* @package Include
* @subpackage UI
*/
function update_manager_get_config_values()
{
global $config;
global $build_version;
global $pandora_version;
$license = db_get_value(
db_escape_key_identifier('value'),
'tupdate_settings',
db_escape_key_identifier('key'),
'customer_key'
);
$limit_count = db_get_value_sql('SELECT count(*) FROM tagente');
return [
'license' => $license,
'current_update' => update_manager_get_current_package(),
'limit_count' => $limit_count,
'build' => $build_version,
'version' => $pandora_version,
];
}
// Function to remove dir and files inside
function rrmdir($dir)
{
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != '.' && $object != '..') {
if (filetype($dir.'/'.$object) == 'dir') {
rrmdir($dir.'/'.$object);
} else {
unlink($dir.'/'.$object);
}
}
}
reset($objects);
rmdir($dir);
} else {
unlink($dir);
}
}
function update_manager_install_package_step2()
{
global $config;
ob_clean();
$package = (string) get_parameter('package');
$package = trim($package);
$version = (string) get_parameter('version', 0);
$path = sys_get_temp_dir().'/pandora_oum/'.$package;
// All files extracted
$files_total = $path.'/files.txt';
// Files copied
$files_copied = $path.'/files.copied.txt';
$return = [];
if (file_exists($files_copied)) {
unlink($files_copied);
}
if (file_exists($path)) {
if ($files_h = fopen($files_total, 'r')) {
while ($line = stream_get_line($files_h, 65535, "\n")) {
$line = trim($line);
// Tries to move the old file to the directory backup inside the extracted package
if (file_exists($config['homedir'].'/'.$line)) {
rename($config['homedir'].'/'.$line, $path.'/backup/'.$line);
}
// Tries to move the new file to the Integria directory
$dirname = dirname($line);
if (!file_exists($config['homedir'].'/'.$dirname)) {
$dir_array = explode('/', $dirname);
$temp_dir = '';
foreach ($dir_array as $dir) {
$temp_dir .= '/'.$dir;
if (!file_exists($config['homedir'].$temp_dir)) {
mkdir($config['homedir'].$temp_dir);
}
}
}
if (is_dir($path.'/'.$line)) {
if (!file_exists($config['homedir'].'/'.$line)) {
mkdir($config['homedir'].'/'.$line);
file_put_contents($files_copied, $line."\n", (FILE_APPEND | LOCK_EX));
}
} else {
// Copy the new file
if (rename($path.'/'.$line, $config['homedir'].'/'.$line)) {
// Append the moved file to the copied files txt
if (!file_put_contents($files_copied, $line."\n", (FILE_APPEND | LOCK_EX))) {
// If the copy process fail, this code tries to restore the files backed up before
if ($files_copied_h = fopen($files_copied, 'r')) {
while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) {
$line_c = trim($line_c);
if (!rename($path.'/backup/'.$line, $config['homedir'].'/'.$line_c)) {
$backup_status = __('Some of your files might not be recovered.');
}
}
if (!rename($path.'/backup/'.$line, $config['homedir'].'/'.$line)) {
$backup_status = __('Some of your files might not be recovered.');
}
fclose($files_copied_h);
} else {
$backup_status = __('Some of your old files might not be recovered.');
}
fclose($files_h);
$return['status'] = 'error';
$return['message'] = __("Line '$line' not copied to the progress file.").'&nbsp;'.$backup_status;
echo json_encode($return);
return;
}
} else {
// If the copy process fail, this code tries to restore the files backed up before
if ($files_copied_h = fopen($files_copied, 'r')) {
while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) {
$line_c = trim($line_c);
if (!rename($path.'/backup/'.$line, $config['homedir'].'/'.$line)) {
$backup_status = __('Some of your old files might not be recovered.');
}
}
fclose($files_copied_h);
} else {
$backup_status = __('Some of your files might not be recovered.');
}
fclose($files_h);
$return['status'] = 'error';
$return['message'] = __("File '$line' not copied.").'&nbsp;'.$backup_status;
echo json_encode($return);
return;
}
}
}
fclose($files_h);
} else {
$return['status'] = 'error';
$return['message'] = __('An error ocurred while reading a file.');
echo json_encode($return);
return;
}
} else {
$return['status'] = 'error';
$return['message'] = __('The package does not exist');
echo json_encode($return);
return;
}
update_manager_enterprise_set_version($version);
$product_name = get_product_name();
db_pandora_audit("Update $product_name", "Update version: $version of $product_name by ".$config['id_user']);
$return['status'] = 'success';
$return['message'] = __('The package is installed.');
echo json_encode($return);
return;
}
function update_manager_main()
{
global $config;
?>
<script type="text/javascript">
<?php
echo 'var unknown_error_update_manager = "'.__('There is a unknown error.').'";';
?>
</script>
<script src="include/javascript/update_manager.js"></script>
<script type="text/javascript">
var version_update = "";
var stop_check_progress = 0;
$(document).ready(function() {
check_online_free_packages();
});
</script>
<?php
}
function update_manager_check_online_free_packages_available()
{
global $config;
$update_message = '';
$um_config_values = update_manager_get_config_values();
$params = [
'action' => 'newest_package',
'license' => $um_config_values['license'],
'limit_count' => $um_config_values['limit_count'],
'current_package' => $um_config_values['current_update'],
'version' => $um_config_values['version'],
'build' => $um_config_values['build'],
];
$curlObj = curl_init();
curl_setopt($curlObj, CURLOPT_URL, $config['url_update_manager']);
curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curlObj, CURLOPT_POST, true);
curl_setopt($curlObj, CURLOPT_POSTFIELDS, $params);
curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curlObj, CURLOPT_CONNECTTIMEOUT, 4);
if (isset($config['update_manager_proxy_server'])) {
curl_setopt($curlObj, CURLOPT_PROXY, $config['update_manager_proxy_server']);
}
if (isset($config['update_manager_proxy_port'])) {
curl_setopt($curlObj, CURLOPT_PROXYPORT, $config['update_manager_proxy_port']);
}
if (isset($config['update_manager_proxy_user'])) {
curl_setopt($curlObj, CURLOPT_PROXYUSERPWD, $config['update_manager_proxy_user'].':'.$config['update_manager_proxy_password']);
}
$result = curl_exec($curlObj);
$http_status = curl_getinfo($curlObj, CURLINFO_HTTP_CODE);
curl_close($curlObj);
if ($result === false) {
return false;
} else if ($http_status >= 400 && $http_status < 500) {
return false;
} else if ($http_status >= 500) {
return false;
} else {
$result = json_decode($result, true);
if (empty($result)) {
return false;
} else {
return true;
}
}
}
function update_manager_check_online_free_packages($is_ajax=true)
{
global $config;
$update_message = '';
$um_config_values = update_manager_get_config_values();
$params = [
'action' => 'newest_package',
'license' => $um_config_values['license'],
'limit_count' => $um_config_values['limit_count'],
'current_package' => $um_config_values['current_update'],
'version' => $um_config_values['version'],
'build' => $um_config_values['build'],
];
// For to test in the shell
/*
wget https://artica.es/pandoraupdate7/server.php -O- --no-check-certificate --post-data "action=newest_package&license=PANDORA_FREE&limit_count=1&current_package=1&version=v5.1RC1&build=PC140625"
*/
$curlObj = curl_init();
curl_setopt($curlObj, CURLOPT_URL, $config['url_update_manager']);
curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curlObj, CURLOPT_POST, true);
curl_setopt($curlObj, CURLOPT_POSTFIELDS, $params);
curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false);
if (isset($config['update_manager_proxy_server'])) {
curl_setopt($curlObj, CURLOPT_PROXY, $config['update_manager_proxy_server']);
}
if (isset($config['update_manager_proxy_port'])) {
curl_setopt($curlObj, CURLOPT_PROXYPORT, $config['update_manager_proxy_port']);
}
if (isset($config['update_manager_proxy_user'])) {
curl_setopt($curlObj, CURLOPT_PROXYUSERPWD, $config['update_manager_proxy_user'].':'.$config['update_manager_proxy_password']);
}
$result = curl_exec($curlObj);
$http_status = curl_getinfo($curlObj, CURLINFO_HTTP_CODE);
curl_close($curlObj);
if ($result === false) {
if ($is_ajax) {
echo __('Could not connect to internet');
} else {
$update_message = __('Could not connect to internet');
}
} else if ($http_status >= 400 && $http_status < 500) {
if ($is_ajax) {
echo __('Server not found.');
} else {
$update_message = __('Server not found.');
}
} else if ($http_status >= 500) {
if ($is_ajax) {
echo $result;
} else {
$update_message = $result;
}
} else {
if ($is_ajax) {
$result = json_decode($result, true);
if (!empty($result)) {
?>
<script type="text/javascript">
var mr_available = "<?php echo __('Minor release available'); ?>\n";
var package_available = "<?php echo __('New package available'); ?>\n";
var mr_not_accepted = "<?php echo __('Minor release rejected. Changes will not apply.'); ?>\n";
var mr_not_accepted_code_yes = "<?php echo __('Minor release rejected. The database will not be updated and the package will apply.'); ?>\n";
var mr_cancel = "<?php echo __('Minor release rejected. Changes will not apply.'); ?>\n";
var package_cancel = "<?php echo __('These package changes will not apply.'); ?>\n";
var package_not_accepted = "<?php echo __('Package rejected. These package changes will not apply.'); ?>\n";
var mr_success = "<?php echo __('Database successfully updated'); ?>\n";
var mr_error = "<?php echo __('Error in MR file'); ?>\n";
var package_success = "<?php echo __('Package updated successfully'); ?>\n";
var package_error = "<?php echo __('Error in package updated'); ?>\n";
var bad_mr_file = "<?php echo __('Database MR version is inconsistent, do you want to apply the package?'); ?>\n";
var mr_available_header = "<?php echo __('There are db changes'); ?>\n";
var text1_mr_file = "<?php echo __('There are new database changes available to apply. Do you want to start the DB update process?'); ?>\n";
var text2_mr_file = "<?php echo __('We recommend launching '); ?>\n";
var text3_mr_file = "<?php echo __('planned downtime'); ?>\n";
var language = "<?php echo $config['language']; ?>";
var docsUrl = (language === "es")
? "http://wiki.pandorafms.com/index.php?title=Pandora:Documentation_es:Actualizacion#Versi.C3.B3n_7.0NG_.28_Rolling_Release_.29"
: "http://wiki.pandorafms.com/index.php?title=Pandora:Documentation_en:Anexo_Upgrade#Version_7.0NG_.28_Rolling_Release_.29";
var text4_mr_file = "<?php echo __(' to this process'); ?>";
text4_mr_file += "<br><br>";
text4_mr_file += "<a style=\"font-size:10pt;font-style:italic;\" target=\"blank\" href=\"" + docsUrl + "\">";
text4_mr_file += "<?php echo __('About minor release update'); ?>";
text4_mr_file += "</a>";
var text1_package_file = "<?php echo __('There is a new update available'); ?>\n";
var text2_package_file = "<?php echo __('There is a new update available to apply. Do you want to start the update process?'); ?>\n";
var applying_mr = "<?php echo __('Applying DB MR'); ?>\n";
var cancel_button = "<?php echo __('Cancel'); ?>\n";
var ok_button = "<?php echo __('Ok'); ?>\n";
var apply_mr_button = "<?php echo __('Apply MR'); ?>\n";
var apply_button = "<?php echo __('Apply'); ?>\n";
</script>
<?php
$baseurl = ui_get_full_url(false, false, false, false);
echo '<p><b>There is a new version:</b> '.$result[0]['version'].'</p>';
echo "<a href='javascript: update_last_package(\"".base64_encode($result[0]['file_name']).'", "'.$result[0]['version'].'", "'.$baseurl."\");'>".__('Update to the last version').'</a>';
} else {
echo __('There is no update available.');
}
return;
} else {
if (!empty($result)) {
$result = json_decode($result, true);
$update_message = 'There is a new version: '.$result[0]['version'];
}
return $update_message;
}
}
}
function update_manager_curl_request($action, $additional_params=false)
{
global $config;
$error_array = [
'success' => true,
'update_message' => '',
];
$update_message = '';
$um_config_values = update_manager_get_config_values();
$params = [
'license' => $um_config_values['license'],
'limit_count' => $um_config_values['limit_count'],
'current_package' => $um_config_values['current_update'],
'version' => $um_config_values['version'],
'build' => $um_config_values['build'],
];
if ($additional_params !== false) {
$params = array_merge($params, $additional_params);
}
$params['action'] = $action;
$curlObj = curl_init();
curl_setopt($curlObj, CURLOPT_URL, $config['url_update_manager']);
curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curlObj, CURLOPT_POST, true);
curl_setopt($curlObj, CURLOPT_POSTFIELDS, $params);
curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false);
if (isset($config['update_manager_proxy_server'])) {
curl_setopt($curlObj, CURLOPT_PROXY, $config['update_manager_proxy_server']);
}
if (isset($config['update_manager_proxy_port'])) {
curl_setopt($curlObj, CURLOPT_PROXYPORT, $config['update_manager_proxy_port']);
}
if (isset($config['update_manager_proxy_user'])) {
curl_setopt($curlObj, CURLOPT_PROXYUSERPWD, $config['update_manager_proxy_user'].':'.$config['update_manager_proxy_password']);
}
$result = curl_exec($curlObj);
$http_status = curl_getinfo($curlObj, CURLINFO_HTTP_CODE);
curl_close($curlObj);
$error_array['http_status'] = $http_status;
if ($result === false) {
$error_array['success'] = false;
if ($is_ajax) {
echo __('Could not connect to internet');
return $error_array;
} else {
$error_array['update_message'] = __('Could not connect to internet');
return $error_array;
}
} else if ($http_status >= 400 && $http_status < 500) {
$error_array['success'] = false;
if ($is_ajax) {
echo __('Server not found.');
return $error_array;
} else {
$error_array['update_message'] = __('Server not found.');
return $error_array;
}
} else if ($http_status >= 500) {
$error_array['success'] = false;
if ($is_ajax) {
echo $result;
return $error_array;
} else {
$error_array['update_message'] = $result;
return $error_array;
}
}
$error_array['update_message'] = $result;
return $error_array;
}
function update_manager_insert_newsletter($email)
{
global $config;
if ($email === '') {
return false;
}
$params = [
'email' => $email,
'language' => $config['language'],
];
$result = update_manager_curl_request('new_newsletter', $params);
if (!$result['success']) {
return [
'success' => false,
'message' => __('Remote server error on newsletter request'),
];
}
switch ($result['http_status']) {
case 200:
$message = json_decode($result['update_message'], true);
if ($message['success'] == 1) {
return [
'success' => true,
'message' => __('E-mail successfully subscribed to newsletter.'),
];
}
return [
'success' => false,
'message' => __('E-mail has already subscribed to newsletter.'),
];
default:
return [
'success' => false,
'message' => __('Update manager returns error code: ').$result['http_status'].'.',
];
break;
}
}
function update_manager_register_instance()
{
global $config;
$email = db_get_value('email', 'tusuario', 'id_user', $config['id_user']);
$params = [
'language' => $config['language'],
'timezone' => $config['timezone'],
'email' => $email,
];
$result = update_manager_curl_request('new_register', $params);
if (!$result['success']) {
return [
'success' => false,
'message' => __('Remote server error on newsletter request'),
];
}
switch ($result['http_status']) {
case 200:
// Retrieve the PUID
$message = json_decode($result['update_message'], true);
if ($message['success'] == 1) {
$puid = $message['pandora_uid'];
config_update_value('pandora_uid', $puid);
// The tupdate table is reused to display messages. A specific entry to tupdate_package is required.
// Then, this tupdate_package id is saved in tconfig
db_process_sql_insert('tupdate_package', ['description' => '__UMMESSAGES__']);
$id_um_package_messages = db_get_value('id', 'tupdate_package', 'description', '__UMMESSAGES__');
config_update_value('id_um_package_messages', $id_um_package_messages);
return [
'success' => true,
'message' => __('Pandora successfully subscribed with UID: ').$puid.'.',
];
}
return [
'success' => false,
'message' => __('Unsuccessful subscription.'),
];
break;
default:
return [
'success' => false,
'message' => __('Update manager returns error code: ').$result['http_status'].'.',
];
break;
}
}
function update_manager_download_messages()
{
include_once 'include/functions_io.php';
global $config;
if (!isset($config['pandora_uid'])) {
return;
}
// Do not ask in next 2 hours
$future = (time() + 2 * SECONDS_1HOUR);
config_update_value('last_um_check', $future);
// Delete old messages
// db_get_sql('DELETE FROM tupdate WHERE UNIX_TIMESTAMP(filename) < UNIX_TIMESTAMP(NOW())');
// Build the curl request
$params = [
'pandora_uid' => $config['pandora_uid'],
'timezone' => $config['timezone'],
'language' => $config['language'],
];
$result = update_manager_curl_request('get_messages', $params);
if (!$result['success']) {
return ($result['update_message']);
}
switch ($result['http_status']) {
case 200:
$message = json_decode($result['update_message'], true);
if ($message['success'] == 1) {
foreach ($message['messages'] as $single_message) {
// Convert subject -> db_field_value; message_html -> data; expiration -> filename; message_id -> svn_version
$single_message['db_field_value'] = io_safe_input($single_message['subject']);
unset($single_message['subject']);
$single_message['data'] = io_safe_input_html($single_message['message_html']);
// It is mandatory to prepend a backslash to all single quotes
$single_message['data'] = preg_replace('/\'/', '\\\'', $single_message['data']);
unset($single_message['message_html']);
$single_message['filename'] = $single_message['expiration'];
unset($single_message['expiration']);
$single_message['svn_version'] = $single_message['message_id'];
unset($single_message['message_id']);
// Add common tconfig id_update_package
$single_message['id_update_package'] = $config['id_um_package_messages'];
$result = db_process_sql_insert('tupdate', $single_message);
}
}
break;
default:
break;
}
}
function update_manager_remote_read_messages($id_message)
{
global $config;
$params = [
'pandora_uid' => $config['pandora_uid'],
'message_id' => $id_message,
];
$result = update_manager_curl_request('mark_as_read', $params);
return $result['success'];
}
function update_manager_extract_package()
{
global $config;
$path_package = $config['attachment_store'].'/downloads/last_package.tgz';
ob_start();
if (!defined('PHP_VERSION_ID')) {
$version = explode('.', PHP_VERSION);
define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}
$extracted = false;
// Phar and exception working fine in 5.5.0 or higher
if (PHP_VERSION_ID >= 50505) {
$phar = new PharData($path_package);
try {
$result = $phar->extractTo($config['attachment_store'].'/downloads/', null, true);
$extracted = true;
} catch (Exception $e) {
echo ' There\'s a problem ... -> '.$e->getMessage();
$extracted = false;
}
}
$return = true;
if ($extracted === false) {
$return = false;
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
// unsupported OS
echo 'This OS ['.PHP_OS.'] does not support direct extraction of tgz files. Upgrade PHP version to be > 5.5.0';
} else {
$return = true;
system('tar xzf "'.$path_package.'" -C '.$config['attachment_store'].'/downloads/');
}
}
ob_end_clean();
rrmdir($path_package);
if ($result != 0) {
db_process_sql_update(
'tconfig',
[
'value' => json_encode(
[
'status' => 'fail',
'message' => __('Failed extracting the package to temp directory.'),
]
),
],
['token' => 'progress_update_status']
);
return false;
}
db_process_sql_update(
'tconfig',
['value' => 50],
['token' => 'progress_update']
);
return $return;
}
/**
* The update copy entirire the tgz or fail (leave some parts copies and some part not).
* This does make any thing with the BD.
*/
function update_manager_starting_update()
{
global $config;
$full_path = $config['attachment_store'].'/downloads';
$homedir = $config['homedir'];
$result = update_manager_recurse_copy(
$full_path,
$homedir,
['install.php']
);
rrmdir($full_path.'/pandora_console');
if (!$result) {
db_process_sql_update(
'tconfig',
[
'value' => json_encode(
[
'status' => 'fail',
'message' => __('Failed the copying of the files.'),
]
),
],
['token' => 'progress_update_status']
);
return false;
} else {
db_process_sql_update(
'tconfig',
['value' => 100],
['token' => 'progress_update']
);
db_process_sql_update(
'tconfig',
[
'value' => json_encode(
[
'status' => 'end',
'message' => __('Package extracted successfully.'),
]
),
],
['token' => 'progress_update_status']
);
return true;
}
}
function update_manager_recurse_copy($src, $dst, $black_list)
{
$dir = opendir($src);
@mkdir($dst);
@trigger_error('NONE');
while (false !== ( $file = readdir($dir))) {
if (( $file != '.' ) && ( $file != '..' ) && (!in_array($file, $black_list))) {
if (is_dir($src.'/'.$file)) {
if (!update_manager_recurse_copy($src.'/'.$file, $dst.'/'.$file, $black_list)) {
return false;
}
} else {
$result = copy($src.'/'.$file, $dst.'/'.$file);
$error = error_get_last();
if (strstr($error['message'], 'copy(')) {
return false;
}
}
}
}
closedir($dir);
return true;
}
function update_manager_set_current_package($current_package)
{
if (enterprise_installed()) {
$token = 'current_package_enterprise';
} else {
$token = 'current_package';
}
$col_value = db_escape_key_identifier('value');
$col_key = db_escape_key_identifier('key');
$value = db_get_value(
$col_value,
'tupdate_settings',
$col_key,
$token
);
if ($value === false) {
db_process_sql_insert(
'tupdate_settings',
[
$col_value => $current_package,
$col_key => $token,
]
);
} else {
db_process_sql_update(
'tupdate_settings',
[$col_value => $current_package],
[$col_key => $token]
);
}
}
function update_manager_get_current_package()
{
global $config;
if (enterprise_installed()) {
$token = 'current_package_enterprise';
} else {
$token = 'current_package';
}
$current_update = db_get_value(
db_escape_key_identifier('value'),
'tupdate_settings',
db_escape_key_identifier('key'),
$token
);
if ($current_update === false) {
$current_update = 0;
if (isset($config[$token])) {
$current_update = $config[$token];
}
}
return $current_update;
}
// Set the read or not read status message of current user
function update_manger_set_read_message($message_id, $status)
{
global $config;
$rollback = db_get_value('data_rollback', 'tupdate', 'svn_version', $message_id);
$users_read = json_decode($rollback, true);
$users_read[$config['id_user']] = $status;
$rollback = json_encode($users_read);
db_process_sql_update('tupdate', ['data_rollback' => $rollback], ['svn_version' => $message_id]);
}
// Get the read or not read status message
function update_manger_get_read_message($message_id, $rollback=false)
{
global $config;
if ($rollback === false) {
$rollback = db_get_value('data_rollback', 'tupdate', 'svn_version', $message_id);
}
$users_read = json_decode($rollback, true);
if (isset($users_read[$config['id_user']]) && ($users_read[$config['id_user']] == 1)) {
return true;
}
return false;
}
// Get the last message
function update_manger_get_last_message()
{
global $config;
$sql = 'SELECT data, svn_version, db_field_value FROM tupdate ';
$sql .= 'WHERE data_rollback NOT LIKE \'%"'.$config['id_user'].'":1%\' ';
$sql .= 'OR data_rollback IS NULL ';
$sql .= 'ORDER BY svn_version DESC ';
$message = db_get_row_sql($sql);
return $message;
}
// Get the a single message message
function update_manger_get_single_message($message_id)
{
global $config;
$sql = 'SELECT data, svn_version, db_field_value FROM tupdate ';
$sql .= 'WHERE svn_version='.$message_id;
$message = db_get_row_sql($sql);
return $message;
}
function update_manager_get_total_messages()
{
global $config;
$sql = 'SELECT COUNT(*) FROM tupdate';
return (int) db_get_sql($sql);
}
function update_manager_get_unread_messages()
{
global $config;
$total = update_manager_get_total_messages();
$sql = 'SELECT COUNT(*) FROM tupdate WHERE data_rollback LIKE \'%"'.$config['id_user'].'":1%\'';
$read = (int) db_get_sql($sql);
return ($total - $read);
}
function update_manager_get_not_deleted_messages()
{
global $config;
$total = update_manager_get_total_messages();
$sql = 'SELECT COUNT(*) FROM tupdate WHERE description LIKE \'%"'.$config['id_user'].'":1%\'';
$read = (int) db_get_sql($sql);
return ($total - $read);
}
function update_manger_set_deleted_message($message_id)
{
global $config;
$rollback = db_get_value('description', 'tupdate', 'svn_version', $message_id);
$users_read = json_decode($rollback, true);
$users_read[$config['id_user']] = 1;
$rollback = json_encode($users_read);
db_process_sql_update('tupdate', ['description' => $rollback ], ['svn_version' => $message_id]);
// Mark as read too
update_manger_set_read_message($message_id, 1);
}