Автоматическая проверка обновлений в pfSense с оповещением по почте

Print Friendly, PDF & Email

Задача:

Настроить автоматическую проверку обновлений пакетов и самой системы с оповещением по почте

---------------------------------------------------------------

Автоматизация данного процесса была найдена на официальном форуме, при необходимости можете найти самостоятельно по названию статьи «Auto update check, checks for updates to base system + packages and sends email alerts»

Сразу хочется предупредить, что если у вас возникнут трудности с предложенным мной вариантом добавления php скрипта на маршрутизатор, существ ещё как минимум два известных мне варианта:

  1. Активировать SSH в меню (System > Advanced > Admin Access) примерно в центре странице ищем «Secure Shell Server»
  2. Загрузить уже готовый файл на сервер, при помощи «Upload File» в меню «Diagnostics > Command Prompt» и командой «rm /tmp/pkg_check.php /root/pkg_check.php» переместить его.

И так настройка, в главном меню выбираем «Diagnostics > Edit File»

делаем всё как на картинке ниже. Нажимаем «Browse» и выбираем директорию «/root», затем в пути дописываем имя файла скрипта «pkg_check.php», чтобы получилось «/root/pkg_check.php» и нажимаем «Load». Теперь в появившемся текстовом поле ниже вставляем содержимое скрипта и наживаем «Save»

<?php

  require_once("pkg-utils.inc");
  require_once("notices.inc");
  require_once("util.inc");

  $msg = null;
  $pmsg = null;
  $p = 0;

  log_error("Starting update check");

  // pfSense base system check
  $system_version = get_system_pkg_version(false, false);
  if ($system_version === false) {
    printf("%s\n", 'Unable to check for updates');
    log_error("Unable to check for updates, exiting");
    exit;
  }

  if (!is_array($system_version) ||
    !isset($system_version['version']) ||
    !isset($system_version['installed_version'])) {
    printf("%s\n", 'Error in version information');
    log_error("Error in version information, exiting");
    exit;
  }

  switch ($system_version['pkg_version_compare']) {
    case '<':
      //printf("%s%s%s\n", "pfSense version ", $system_version['version'], " is available");
      $msg = "An update to pfSense version " . $system_version['version'] . " is available\n\n";
      break;
    case '=':
      //printf("%s%s%s\n", "pfSense version ", $system_version['version'], " (installed) is current");
      break;
    case '>':
      printf("%s%s%s\n", "pfSense version ", $system_version['installed_version'], " is NEWER than the latest available version ", $system_version['version']);
      $msg = "pfSense version " . $system_version['version'] . " is available (downgrade)\n\n";
      break;
    default:
      printf("%s\n", 'Error comparing installed with latest version available');
      log_error("Error comparing installed with latest version available");
      break;
  }

  // package check
  $package_list = get_pkg_info('all', true, true);
  $installed_packages = array_filter($package_list, function($v) {
    return (isset($v['installed']) && isset($v['name']));
  });

  if (empty($installed_packages)) {
    printf("%s\n", 'No packages installed');
    log_error("No packages installed, exiting");
    exit;
  }

  foreach ($installed_packages as $pkg) {
    if (isset($pkg['installed_version']) && isset($pkg['version'])) {
      //printf("%s%s%s\n", $pkg['shortname'], ': ', $pkg['installed_version']);
      $version_compare = pkg_version_compare($pkg['installed_version'], $pkg['version']);
      if ($version_compare != '=') {
        $p++;
        $pmsg .= "\n".$pkg['shortname'].': '.$pkg['installed_version'].' ==> '.$pkg['version'];
        if ($version_compare == '>') {
          $pmsg .= ' (downgrade)';
        }
        printf("%s%s%s%s%s\n", $pkg['shortname'], ': ', $pkg['installed_version'], ' ==> ', $pkg['version']);
      }
    }
  }

  if ($p > 0) {
    $msg = $msg . "The following updates are available and can be installed using System > Package Manager:\n" . $pmsg;
  }

  // check for updates to builtin packages
  exec("/usr/sbin/pkg upgrade -n | /usr/bin/sed -ne '/UPGRADED/,/^$/p'", $output, $retval);
  if (($retval == 0) && (count($output))) {
    $msg .= "\n\n" . "Some packages are part of the base system and will not show up in Package Manager. If any such updates are listed below, run `pkg upgrade` from the shell to install them:\n\n";
    array_shift($output);
    $msg .= implode("\n", array_map('ltrim', $output));
  }

  if (!empty($msg)) {
    log_error("Updates were found - sending email");
    notify_via_smtp($msg);
  }

  log_error("Update check complete");

?> 

При успешном сохранении файла увидите сообщение «File saved successfully.». Для проверки можно выйти на директорию выше и зайти обратно или обновите окно веб-браузера (F5).

Переходим в меню: «Diagnostics > Command Prompt»

и выполняем добавленный нами скрипт

/usr/local/bin/php -q /root/pkg_check.php

В моём случае скрипт нашёл два обновления и указал с какой на какую версию

arpwatch: 0.2.0_1 ==> 0.2.0_2
openvpn-client-export: 1.4.21 ==> 1.4.22

и сразу же пришло уведомление на почту. Если не пришло сообщение, настраиваем в главном меню: «System > Advanced > Notifications», как настроить читаем в статье «Настройка уведомлений в Pfsense по электронной почте GMail«

Теперь надо настроить CRON для автоматического выполнения. я настроил проверку на 12 часов дня, чтобы до конца рабочего дня было время подумать когда обновлять или обновиться сразу.

Если не знаете как, читаем в статье «Установка и настройка CRON на pfSense«

Помогла статья? Есть возможность отблагодарить автора

QR Link:

QR Code

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *