Для получения триального ключа
заполните форму ниже
Team License (базовая версия)
Enterprise License (расширенная версия)
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
GBP
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
Perl-скрипт вместо blame-notifier на ОС…

Perl-скрипт вместо blame-notifier на ОС Linux

08 Апр 2021

Как известно, нашими клиентами являются разработчики. А разработчики могут неожиданно приятно удивлять. К примеру, один из наших пользователей написал свой собственный скрипт, который позволяет настроить рассылку email-сообщений об ошибках, найденных PVS-Studio. Отличие данного скрипта от нашего инструмента blame-notifier заключается в том, что он не требует установки .NET Core на Linux. Мы решили написать небольшую заметку про этот Perl-скрипт, т. к. считаем, что он может пригодиться кому-то еще.

0821_perl-script_ru/image1.png

Введение

Perl-скрипт, о котором пойдёт речь в этой заметке, опубликован на github под лицензией GPL-2.0, поэтому воспользоваться им может любой желающий.

Основной его функционал заключается в том, что он уведомляет о проблемах, найденных PVS-Studio, путем рассылки email. Можно сказать, что это практически аналог нашего инструмента blame-notifier. Электронное письмо, которое отправляет Perl-скрипт, формируется в HTML-формате и отправляется автору коммита. Информация о коммите и его авторе извлекается из Git. Стоит заметить, что для отправки email есть ряд настроек, которые мы рассмотрим чуть позже.

Скрипт сохраняет все предупреждения в базе данных (которую нужно будет настроить заранее), чтобы иметь возможность отправлять уведомления не обо всех проблемах, а только о новых обнаруженных ошибках.

Также есть возможность добавления к письму вложений. К примеру, к email можно прикрепить полный лог ошибок, обнаруженных PVS-Studio.

Требования

Конечно, есть ряд предварительных настроек, которые необходимо сделать для того, чтобы скриптом можно было воспользоваться.

Во-первых, проект должен использовать систему контроля версий Git, так как скрипт извлекает всю необходимую информацию об авторе коммита через git blame / git annotate.

Во-вторых, необходимо настроить базу данных для того, чтобы скрипт мог автоматически сохранять там найденные ошибки и, соответственно, отправлять email только для новых ошибок. Если вы хотите получать уведомления обо всех ошибках в проекте, а не только о новых – такое тоже возможно. В разделе "Варианты использования" я напишу об этом чуть подробнее.

В-третьих, необходимо настроить почту для отправки электронных писем, если у вас она еще не настроена. Этот пункт я тоже детально разберу в разделе "Настройка почты".

И самое последнее – необходимо, чтобы в операционной системе был установлен Perl. Но называть это требованием не совсем верно, т. к. обычно Perl бывает установлен на каждой ОС Linux.

Установка

Приступим к рассмотрению процесса настройки более подробно. Установку я буду производить на своей виртуальной машине, на которой установлен дистрибутив Linux openSUSE. Кстати, в файле README git-репозитория вы можете посмотреть настройку под Debian, но процесс почти ничем не отличается.

Итак, перед настройкой нам необходимо будет клонировать репозиторий с github.

Необходимые модули

Для того чтобы воспользоваться скриптом, нам понадобится установить следующие модули (указаны необходимые модули для openSUSE):

  • perl-DBI – инструмент для Perl, не зависимый от базы данных;
  • perl-DBD-mysql – драйвер для базы данных MySQL;
  • perl-MIME-Lite – для генерации MIME-сообщений;
  • perl-YAML – YML-парсер для загрузки файлов конфигурации;
  • perl-List-MoreUtils – дополнительные утилиты;
  • perl-FindBin-Real – для поиска каталога исходного Perl-скрипта.

Сделать это можно командой:

$> sudo zypper install perl-DBI
perl-DBD-mysql 
perl-MIME-Lite 
perl-YAML 
perl-List-MoreUtils 
perl-FindBin-Real

А данные модули вы можете установить по желанию. Они упростят вам работу с кодом, но на работоспособность скрипта никак не повлияют:

  • perl-IPC-Filter – нужен для подсветки синтаксиса;
  • highlight – нужен для подсветки исходного кода GNU.

Настройка почты

Для настройки отправления почты воспользуемся msmtp. Установка производится командой:

$> sudo zypper install msmtp msmtp-mta

После установки необходимо создать файл /etc/msmtprc. Файл должен содержать настройки почты. К примеру, для Yandex-почты данный файл будет выглядеть таким образом:

# Set default values for all following accounts.
defaults
auth on
tls on
tls_starttls on
tls_certcheck off
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log

# Account
account        default
host           smtp.yandex.ru
port           587
auth           on
keepbcc        on
from           email@yandex.ru
user           email@yandex.ru
password       emailpassword

# Set a default account
account default: default

# Map local users to mail addresses (for crontab)
aliases /etc/aliases

Файл msmtp.log, в который скрипт будет записывать логи, вам нужно будет также создать самостоятельно.

Также для отправки почты вам потребуется включить протоколы POP3 и IMAP в настройках вашего почтового ящика.

На этом настройку почты можно считать завершенной. Чтобы убедиться, что все работает, вы можете отправить тестовое сообщение:

$> echo "test message" | mail -s "test" email@yandex.com

Настройка базы данных

Далее нам необходимо настроить любую из баз данных, которая будет поддерживаться Perl. Возьмем MariaDB, как и предлагает автор скрипта.

Установить ее можно командой:

$> sudo zypper install mariadb

Затем необходимо сделать:

$> sudo rcmysql start
$> sudo mysql_secure_installation

После установки нам необходимо создать новую базу данных с именем blame и нового пользователя с таким же именем:

$> sudo mysql
mysql> CREATE DATABASE blame;
mysql> GRANT ALL on blame.* TO 'blame'@'localhost' IDENTIFIED BY
'secret_mysql_password';
mysql> quit

Базу данных необходимо будет запустить перед запуском скрипта.

Конфигурация

Perl-скрипт будет искать конфигурационный файл в двух местах:

  • /etc/blame.cfg
  • $HOME/.blame.cfg

Если будут найдены оба файла, то файл, находящийся в домашней директории (home), переопределит файл с глобальными настройками.

Содержимое файла должно иметь YAML-формат:

---
# database connection string
dsn: DBI:mysql:blame
# database username
username: blame
# database password
password: secret_mysql_password
# smtp sender address
smtp_from: email@yandex.ru
# smtp subject
smtp_subject: New PVS Issues
# path substitution
path_search: '/root/src/src/'
path_replace: ''

Стоит обратить внимание на то, что данный файл содержит конфиденциальные данные и не должен быть доступен для чтения всем пользователям.

Варианты использования

Perl-скрипт в качестве входного параметра принимает путь до файла в формате errorfile, полученный в результате конвертации вывода анализатора через утилиту PlogConverter. Более подробно почитать про данную утилиту вы можете здесь.

К примеру, у нас есть отчёт о проверке PVS-Studio (назовём его report.plog). Получить файл, необходимый для работы Perl-скрипта, мы можем, задав PlogConverter-у следующую команду:

plog-converter report.plog -t errorfile -o report.txt

Теперь, чтобы запустить Perl-скрипт, нам необходимо выполнить следующую команду:

$> ./blame-notifier.pl < report.txt

Содержимое письма, которое придёт на почту, будет примерно следующим:

0821_perl-script_ru/image2.png

Помимо этого, существует ряд дополнительных параметров, которые позволят более гибко использовать скрипт. Для того чтобы получить больше информации, вы можете воспользоваться опцией -h.

Давайте рассмотрим некоторые примеры использования с дополнительными опциями.

По умолчанию скрипт группирует предупреждения анализатора по автору и отсылает на почту, которая извлекается скриптом командой git annotate. Помимо этого, вы можете изменить поведение так, чтобы получать уведомления от всех авторов, переопределив их почтовые адреса. Сделать это можно, указав при запуске опцию -r <your.email>:

$> ./blame-notifier.pl -r email@yandex.ru < report.txt

При каждом запуске скрипта обновляется база данных и формируется email-рассылка со свежими предупреждениями анализатора. Если вы не хотите ограничиваться отправкой рассылки только с новыми предупреждениями, то вы можете воспользоваться опцией -d. В таком случае к базе данных применится команда SQL DROP TABLE, и скрипт разошлет уведомления обо всех предупреждениях PVS-Studio.

$> ./blame-notifier.pl -d -r email@yandex.ru < report.txt

Помимо обычного уведомления, вы можете еще прикреплять к письму вложения (например, сам отчет или его html-вариант). Для использования такой возможности передайте скрипту при запуске опцию -a, которая принимает список файлов, разделенных запятыми:

$> ./blame-notifier.pl -a 'report.txt,report.html' < report.txt

И, наконец, если вы хотите увидеть в консоли подробный вывод того, что сейчас происходит, вы можете передать скрипту опцию -v.

В заключение

Если вы не хотите устанавливать .NET Core на Linux – вы можете присмотреться к данному Perl-скрипту. Возможно, вы захотите использовать именно его вместо официального решения. Во всяком случае, теперь вы точно знаете, что такой способ тоже есть.

Однако обращаем ваше внимание на то, что за данное решение мы не несем ответственности и не гарантируем, что в случае изменений логов или форматов файлов автор скрипта будет поддерживать какую-либо совместимость с предыдущими версиями.

И, напоследок, важное примечание: автор скрипта не рекомендует запускать его под root, т. к. это потребует хранения конфигурационных файлов в домашнем каталоге пользователя. Вместо этого вы можете запускать анализ PVS-Studio в контейнере Docker.

Популярные статьи по теме
Зло живёт в функциях сравнения

Дата: 19 Май 2017

Автор: Андрей Карпов

Возможно, читатели помнят мою статью под названием "Эффект последней строки". В ней идёт речь о замеченной мной закономерности: ошибка чаще всего допускается в последней строке однотипных блоков текс…
Любите статический анализ кода!

Дата: 16 Окт 2017

Автор: Андрей Карпов

Я в шоке от возможностей статического анализа кода, хотя сам участвую в разработке инструмента PVS-Studio. На днях я был искренне удивлён тому, что анализатор оказался умнее и внимательнее меня.
Технологии, используемые в анализаторе кода PVS-Studio для поиска ошибок и потенциальных уязвимостей

Дата: 21 Ноя 2018

Автор: Андрей Карпов

Краткое описание технологий, используемых в инструменте PVS-Studio, которые позволяют эффективно обнаруживать большое количество паттернов ошибок и потенциальных уязвимостей. Статья описывает реализа…
Эффект последней строки

Дата: 31 Май 2014

Автор: Андрей Карпов

Я изучил множество ошибок, возникающих в результате копирования кода. И утверждаю, что чаще всего ошибки допускают в последнем фрагменте однотипного кода. Ранее я не встречал в книгах описания этого …
Главный вопрос программирования, рефакторинга и всего такого

Дата: 14 Апр 2016

Автор: Андрей Карпов

Вы угадали, ответ - "42". Здесь приводится 42 рекомендации по программированию, которые помогут избежать множества ошибок, сэкономить время и нервы. Автором рекомендаций выступает Андрей Карпов - тех…
Статический анализ как часть процесса разработки Unreal Engine

Дата: 27 Июн 2017

Автор: Андрей Карпов

Проект Unreal Engine развивается - добавляется новый код и изменятся уже написанный. Неизбежное следствие развития проекта - появление в коде новых ошибок, которые желательно выявлять как можно раньш…
PVS-Studio ROI

Дата: 30 Янв 2019

Автор: Андрей Карпов

Время от времени нам задают вопрос, какую пользу в денежном эквиваленте получит компания от использования анализатора PVS-Studio. Мы решили оформить ответ в виде статьи и привести таблицы, которые по…
PVS-Studio для Java

Дата: 17 Янв 2019

Автор: Андрей Карпов

В седьмой версии статического анализатора PVS-Studio мы добавили поддержку языка Java. Пришло время немного рассказать, как мы начинали делать поддержку языка Java, что у нас получилось и какие дальн…
Бесплатный PVS-Studio для тех, кто развивает открытые проекты

Дата: 22 Дек 2018

Автор: Андрей Карпов

В канун празднования нового 2019 года команда PVS-Studio решила сделать приятный подарок всем контрибьюторам open-source проектов, хостящихся на GitHub, GitLab или Bitbucket. Им предоставляется возмо…
Как и почему статические анализаторы борются с ложными срабатываниями

Дата: 20 Мар 2017

Автор: Андрей Карпов

В своей предыдущей статье я писал, что мне не нравится подход, при котором статические анализаторы кода оцениваются с помощью синтетических тестов. В статье приводился пример, воспринимаемый анализат…

Комментарии (0)

Следующие комментарии

На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Этот сайт использует куки и другие технологии, чтобы предоставить вам более персонализированный опыт. Продолжая просмотр страниц нашего веб-сайта, вы принимаете условия использования этих файлов. Если вы не хотите, чтобы ваши данные обрабатывались, пожалуйста, покиньте данный сайт. Подробнее →
Принять