При поддержке множества сайтов с разными плагинами, темами и открытыми CMS, такими как Wordpress, часто встает проблема своевременного обновления. Автоматически обновлять - не всегда хорошая идея, а вот узнавать о том, что обновление появилось - очень полезно. Для мониторинга этого (как и многого другого) подходит Zabbix - система мониторинга IT-ресурсов.
Однако, штатного функционала для связки Wordpress с Zabbix-ом нет. Приходится придумывать. Не углубляясь в историю придумывания решения, выдаю готовую схему.
Описание общей схемы
Zabbix периодически (в моем случае раз в 10 часов) запрашивает у Wordpress сколько обновлений доступно. При изменении числа обновлений (плагинов, тем, ядра), выдается предупреждение администратору.
Настройки на стороне Wordpress.
Для того, чтобы wordpress отдавал сведения о доступных обновлениях, помещаем туда файл zabbix-wordpress.php со следующим содержанием:
<?php
require('wp-load.php');
require('wp-admin/includes/update.php');
// from wp_get_update_data() function
$counts = array( 'plugins' => 0, 'themes' => 0, 'wordpress' => 0, 'translations' => 0 );
$update_plugins = get_site_transient( 'update_plugins' );
if ( ! empty( $update_plugins->response ) )
$counts['plugins'] = count( $update_plugins->response );
$update_themes = get_site_transient( 'update_themes' );
if ( ! empty( $update_themes->response ) )
$counts['themes'] = count( $update_themes->response );
if ( function_exists( 'get_core_updates' ) ) {
$update_wordpress = get_core_updates( array('dismissed' => false) );
if ( ! empty( $update_wordpress ) && ! in_array( $update_wordpress[0]->response, array('development', 'latest') ) )
$counts['wordpress'] = 1;
}
$r=$counts;
if ( (!isset($_GET['k'])) or (!isset($r[$_GET['k']])) ) {
foreach ($r as $k=>$l) {
echo $k.": ".$l."\n";
}
} else {
echo $r[$_GET['k']];
}
?>
Этот файл при помощи встроенного инструментария собирает сведения о доступных обновлениях и выдает их или все сразу, или по одному из ключей: plugins, themes, wordpress, translations
Настройки на стороне Zabbix-клиента
На стороне клиента Zabbix, который будет запрашивать данные с сайта и потом передават их на сервер Zabbix необходимо внести в файл новый параметр:
UserParameter=mywebsite.wp.updates[*],curl -s http://my.web.site/zabbix-wordpress.php?k=$1
Конечно же не забыв указать правильный адрес вашего сайта, и при необходимости путь к curl
Настройки на стороне Zabbix-сервера
На стороне сервер остается только прописать нужные вам данные, которые могут быть:
- mywebsite.wp.updates[themes],
- mywebsite.wp.updates[plugins],
- mywebsite.wp.updates[wordpress],
- mywebsite.wp.updates[translations]
И установить необходимые тригеры и действия. Они вполне подходят под общую схему.
Лично я в качестве триггера указал изменение значения доступных обновлений: {zclient:mywebsite.wp.update[plugins].diff(0)}>0 особо рьяные любители того, чтобы у них было все самое свежее, могут настроить так, что наличие неустановленных обновлений zabbix будет считать "проблемой", а когда кол-во обновлений будет нулевым автоматически проблему закрывать.
Развитие и улучшения
В качестве резвития и улучшения этой схемы отмечу, что в качестве параметра можно передавать не только значение типа обновлений, но и адрес сайта. Это будет полезно, когда необходимо мониторить много сайтов на Wordpress одним Zabbix-ом. В этом случае на клиенте надо будет прописать пользовательский параметр такого вида:
UserParameter=wp.updates[*],curl -s $1/zabbix-wordpress.php?k=$2
Вызывать такой параметр надо будет строкой: wp.updates[http://my.web.site,wordpress]
Со временем будут решения для Joomla, Битрикс и других CMS.