wunderio/updates_log

日志模块更新信息

安装: 28,435

依赖项: 0

建议者: 0

安全: 0

星标: 1

关注者: 4

分支: 1

开放问题: 9

类型:drupal-module

2.4.0 2023-06-16 11:28 UTC

README

记录Drupal项目更新状态。

为什么?当周围有多个Drupals时,跟踪安全更新可能会很具挑战性。一个选项是按日记录模块的状态,并根据日志创建警报(例如在Slack上)。在SumoLogic这样的集中式日志系统中很有意义。它允许创建所有种类的统计数据和分析。

作为替代方案,有Warden,但它缺少高度可配置的警报。

分发

安装

  1. 安装模块: composer require wunderio/updates_log:^2
  2. update 模块安装核心补丁 bug
    1. D9 使用 此补丁
    2. D10 使用 此补丁
    3. D10.1.5+ 使用 此补丁
  3. 启用模块: drush en -y updates_log
  4. 可选:通过使用Config Split,仅在默认分支中启用模块。
  5. 导出配置: drush cex -y
  6. 要验证操作,请运行 drush cron。在第一次cron执行时,它将报告所有模块的状态从“未知”变为“已知”。检查您的日志!

用法

每小时记录模块状态的变化(如果有的话)

 ---- -------------- ------------- ---------- ------------------------------------------------------------------------------------------------------
  ID   Date           Type          Severity   Message
 ---- -------------- ------------- ---------- ------------------------------------------------------------------------------------------------------
  1    01/Jul 15:43   updates_log   Info      updates_log={"project":"drupal","old":"CURRENT","new":"NOT_SECURE","site":"example.com","env:"prod"}==
 ---- -------------- ------------- ---------- ------------------------------------------------------------------------------------------------------

oldnew 表示状态。分别代表旧状态和新的状态。上面的日志可以这样理解:drupal 包在之前的运行中是最新的,现在其状态已更改(发布了安全更新),因此状态从 CURRENT 变为 NOT_SECURE

状态代码来自Drupal代码

  • web/core/modules/update/src/UpdateManagerInterface.php

    • NOT_SECURE
    • REVOKED
    • NOT_SUPPORTED
    • NOT_CURRENT
    • CURRENT
  • web/core/modules/update/src/UpdateFetcherInterface.php

    • NOT_CHECKED
    • UNKNOWN
    • NOT_FETCHED
    • FETCH_PENDING

时间

完整的统计日志条目大约每24小时生成一次。

差异日志条目可能每小时生成一次。

状态

updates_log.last - 只在这里保留最后一次运行的时间戳(每小时)。该值以秒为单位。如果需要观察或更改这些值,请使用以下参考命令:

  • drush sget updates_log.last
  • drush sset updates_log.last 1654253832

updates_log_statistics.last - 只在这里保留最后一次运行的时间戳(每24小时)。该值以秒为单位。与上面显示的类似,应用相同的参考命令。

updates_log.statuses - 模块“当前”状态保存在此状态变量中。这是执行差异所必需的。要观察其内容,请运行以下命令:drush sget updates_log.statuses --format=json

输出

通用格式是 id={json}==。末尾有两个等号,以标记JSON的结尾。这是必需的,因为在某些日志环境中使用了额外的封装,这使得解析变得不可能。

差异

当模块状态有任何变化时,它们的日志输出如下所示

updates_log={
  project: "webform",
  old: "NOT_CURRENT",
  new: "CURRENT"
  site: "example.com"
  env: "prod"
}==

每次状态变化都会有一个日志条目。

统计信息

该模块还会每24小时记录一次“统计信息”,快速概述有多少模块以及它们的状态。

updates_log_statistics={
  "updates_log": "2.4.0",
  "last_check_epoch": 1672835445,
  "last_check_human": "2023-01-04T12:30:450GMT",
  "last_check_ago": 16,
  "site": "project-acme-support",
  "env": "prod",
  "summary": {
    "CURRENT": 31,
    "NOT_CURRENT": 0,
    "NOT_SECURE": 0,
    "NOT_SUPPORTED": 1,
    "REVOKED": 0,
    "UNKNOWN": 0
  },
  "details": {
    "NOT_SUPPORTED": {
       "admin_toolbar": "3.1.0"
    }
  }
}==

“前缀” (updates_log_statistics=) 用于帮助过滤和解析日志条目的数据。

站点

site 用于标识项目。它通过使用第一个非空项进行检测。

  • $settings['updates_log_site']
  • 环境变量 PROJECT_NAME
  • 环境变量 HOSTNAME
  • 环境变量 DRUSH_OPTIONS_URI + 主机名提取
  • "未知"

环境变量

env 用于标识环境(开发、测试、生产等)。它通过使用第一个非空项进行检测。

  • $settings['updates_log_env']
  • 环境变量 ENVIRONMENT_NAME
  • 环境变量 WKV_SITE_ENV
  • 设置 simple_environment_indicator + 颜色移除
  • "未知"

设置

您可以在 settings.php 中添加 $settings['updates_log_disabled'] = TRUE; 以停止 updates_log 报告。

这对于只想在单一环境中报告更新的站点非常有用。

updates_log 的开发

  • drupal-project 作为基础进行克隆
  • updates_log 项目克隆到 web/modules/custom/updates_log
  • 编辑 .lando.yml 以禁用不必要的服务和它们代理(chromeelasticsearchkibanamailhognode
  • lando start - 启动开发环境
  • lando composer install - 安装 GrumPHP
  • lando drush site-install - 填充数据库
  • lando drush en updates_log - 启用模块
  • lando drush cron
    • 通过 lando ssh 连接到容器并运行 UPDATES_LOG_TEST=1 drush cron 以绕过时间检查
  • lando grumphp run 进行代码扫描
  • lando phpunit --group=updates_log 运行测试

发布制作

  • 确保所有更改都有测试
  • 确保所有测试都通过
  • 确保代码扫描是干净的
  • 更新 README.md
  • 如有必要,更新 Drupal 项目模板
  • 更新 versionupdates_log.info.yml
  • 在 GitHub 中创建与相同版本的发布

调试 - 当您看不到预期结果时该怎么办?

使用 UPDATES_LOG_TEST 环境变量来绕过测试的时间要求 UPDATES_LOG_TEST=1 drush cronUPDATES_LOG_TEST=1 drush eval 'updates_log_cron();'。这适用于(按小时和每日)功能模式。运行此命令后,您应该在日志中获取完整的统计信息,如果存在任何状态变化,这些变化也应该有它们自己的日志条目。

以下是一些其他要尝试的事情

  • Drupal update 模块
    • 确保 /admin/reports/updates/settings 可以加载,并且已配置。再次保存表单。
    • 检查“可用更新”报告的状态。它是红色还是绿色?
    • drush eval 'var_dump(update_get_available(TRUE));' - 应返回大型数组。
    • drush eval '$available = update_get_available(TRUE); $project_data = update_calculate_project_data($available); var_dump($project_data);'
    • drush ev '\Drupal::keyValue("update_fetch_task")->deleteAll();' - 在 update 重新安装后
    • drush sqlq 'truncate batch'
    • drush sqlq 'truncate queue'
    • drush pm-uninstall -y update; drush pm-install -y update
    • drush sdel update.last_check
  • 更新日志
    • UPDATES_LOG_TEST=1 drush cron
    • UPDATES_LOG_TEST=1 drush eval 'updates_log_cron();'
    • drush sget updates_log.statuses --format=json
    • drush sget updates_log.last
    • drush sget updates_log_statistics.last

Drupal 核心错误

存在一个 Drupal 核心错误,在某些情况下不会获取新数据,或不会为某些项目获取数据。有关详细信息,请参阅安装说明。