Category Archives: Dev

Парсинг лога Exim и отправка его по почте на Perl

В сегодняшней заметке по написанию скриптов на Perl мы будем извлекать данные за вчерашнее число из лога Exim и отправлять эти данные по почте. Буду рад любым замечаниям и конструктивной критике специалистов по Perl. Вот так обычно выглядит лог Exim:

2022-08-30 08:15:41 [31309] 1T6wAO-00088v-W6 => user1 <[email protected]> F=<[email protected]> P=<[email protected]> R=mysql_localuser T=local_delivery S=1152 QT=1s DT=0s
2022-08-30 08:15:41 [31310] 1T6wAP-000890-1c <= [email protected] H=(domain) [ip1]:39258 I=[ip2]:25 P=esmtp S=1034 [email protected] T="Shutdown" from <[email protected]> for [email protected] [email protected]
2022-08-30 08:15:41 [2287] SMTP connection from [ip1]:39259 I=[ip2]:25 (TCP/IP connection count = 5)
2022-08-30 08:15:41 [31310] SMTP connection from (domain) [ip1]:39258 I=[ip2]:25 closed by QUIT
2022-08-30 08:15:41 [31309] 1T6wAO-00088v-W6 => user2 <[email protected]> F=<[email protected]> P=<[email protected]> R=mysql_localuser T=local_delivery S=1147 QT=1s DT=0s
2022-08-30 08:15:41 [31309] 1T6wAO-00088v-W6 Completed QT=1s

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

#!/usr/bin/perl -w
# Подключаем необходимые модули DateTime, MIME::Lite
use strict;
use warnings;
use DateTime;
use MIME::Lite;


# Объявляем переменные
my $today = DateTime->now; # Определяем текущую дату
my $yesterday_format = $today->subtract(days => 1); # Получаем вчерашнюю дату
my $yesterday = $yesterday_format->ymd; # Форматируем дату в формат даты лога Exim


open INPUTFILE, "/path/to/input/log/mainlog" or die "Cannot open input file\n"; # Открываем на чтение исходный (анализируемый) файл лога Exim
open OUTPUTFILE, ">/path/to/output/log/log.txt" or die "Cannot open output file\n"; # Открываем на запись файл, который впоследствии будем отправлять по почте
# Проходим по исходному файлу построчно в цикле
while (<INPUTFILE>) {
chomp; # Убираем символы перевода строки в конце каждой строки
	if (/^$yesterday */) { # Регулярным выражением проверяем соответствие даты вчерашней
		print OUTPUTFILE "$_\n"; # Пишем в файл все записи лога, сделанные вчера
	} # end block of if
} # end block of while
close OUTPUTFILE; # Закрываем конечный файл 
close INPUTFILE; # Закрываем исходный файл

# Используя модуль MIME::Lite создаем тело сообщения, заполняя необходимые поля своими данными: От Кого, Кому, Тема, Текст письма, Вложение etc.
my $msg = MIME::Lite->new(
			From	=>'monitoring_script',
			To	=>'[email protected]',
			Subject	=>'Logfile of exim',
			Type	=>'multipart/mixed'
);

# Создаем текст письма
$msg->attach(Type	=>'TEXT',
	     Data	=>"Logfile of exim for ".$yesterday
);

# Создаем вложение
$msg->attach(Type	=>'application/zip',
	    Path	=>'/path/to/scripts/log.txt',
	    Filename	=>'log.txt',
	    Disposition	=> 'attachment'
);

# Отправляем письмо
$msg->send();

Теперь все это ставим в cron и ждем писем. Также при желании можно доработать скрипт: задать другой интервал, можно также приспособить данный скрипт для выборки из логов Nginx. Все это просто реализуется и очень хорошо все описано на страницах модулей MIME::Lite и DateTime.

Более подробно про модуль MIME::Lite
Более подробно про модуль DateTime

Примитивнейший генератор паролей на Perl

Чтобы данный скрипт заработал необходимо установить модуль String::Random, делается это следующим образом (Debian/Ubuntu):

perl -MCPAN -e 'install String::Random'
#!/usr/bin/perl
# Это убережет нас от небезопасных конструкций, таких как ошибка в имени переменной
use strict
# Это будет выводить необязательные предупреждения
use warnings;
# Подключаем модуль String::Random
use String::Random;
# Объявляем переменную password
my $password;
# Создаем экземпляр класса String::Random
$password = new String::Random;
print "Password generated \n";
# Используя метод randpattern создаем шаблон пароля и выводим сгенерированный пароль
print "Your password is ", $password->randpattern("CCcc!ccn"), "\n";

В шаблоне по которому генерируется пароль:

C – любой заглавный символ [A-Z]
c – любой строчный символ [a-z]
! – любой специальный символ [~`[email protected]$%^&*()-_+={}[]|\:;”‘.<>?/#,]
n – любой целое число [0-9]

Ссылка на модуль String::Random

Скрипт автоматической установки latest stable версии nginx для CentOS 5,6 и Debian, Ubuntu

Несколько слов о самом скрипте. Работа скрипта проверялась на дистрибутивах CentOS 6.3 и Debian 6.0. Если вы найдете ошибку или обнаружите, что скрипт не работает в других версиях CentOS, Debian, Ubuntu буду благодарен вам, если сообщите об этом в комментариях. Возможно истинным Мастерам shell этот скрипт покажется топорным и дилетантским, я буду рад, если вы укажете на мои ошибки или моменты, которые можно было бы улучшить. Для работы скрипта в дистрибутивах Debian, Ubuntu необходимо, чтобы был установлен wget.

nginx-latest.sh

#!/bin/sh
# Author: Demin Eugene
# Script for automatic install of latest stable version of nginx for CentOS 5,6 and Debian, Ubuntu

centOS_distr=$(awk '{if($1 ~ /CentOS/) print $1}' /etc/issue)
deb_distr=$(awk '{if($1 ~ /Debian/) print $1}' /etc/issue)
ubuntu_distr=$(awk '{if($1 ~ /Ubuntu/) print $1}' /etc/issue)

# Если дистрибутив является Debian или Ubuntu,
# то устанавливаем lsb-release
if [ $deb_distr ] || [ $ubuntu_distr ]
	then apt-get update
	     apt-get install -y lsb-release
fi

# Определяем кодовые имена дистрибутивов Debian и Ubuntu
codename_deb=$(lsb_release -c | awk '{print $2}')

codename_ubuntu=$(lsb_release -c | awk '{print $2}')

# Определяем версию CentOS
ver=$(awk '{if($3 ~ /^[56]/) print $3}' /etc/issue)

# Проверяем является ли дистрибутив CentOS версии 5.х
# Подключаем репозиторий и устанавливаем nginx 
if [ $centOS_distr ] && [ $ver==/^5/ ]
	then # CentOS 5
	     rpm -ihv http://nginx.org/packages/centos/5/noarch/RPMS/nginx-release-centos-5-0.el5.ngx.noarch.rpm
	     yum install -y nginx
fi

# Проверяем является ли дистрибутив CentOS версии 6.х
# Подключаем репозиторий и устанавливаем nginx 
if [ $centOS_distr ] && [ $ver==/^6/ ]
	then # CentOS 6
	     rpm -ihv http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
	     yum install -y nginx
fi

# Проверяем является ли дистрибутив Debian 
# Скачиваем ключ и добавляем его в связку ключей программы apt
# Подключаем репозиторий, обновляем и устанавливаем nginx 
if [ $deb_distr ]
	then 	cd /
		wget http://nginx.org/keys/nginx_signing.key
		apt-key add /nginx_signing.key
		echo "deb http://nginx.org/packages/debian/" $codename_deb "nginx" >> /etc/apt/sources.list
		echo "deb-src http://nginx.org/packages/debian/" $codename_deb "nginx" >> /etc/apt/sources.list
		apt-get update
		apt-get install -y nginx
fi

# Проверяем является ли дистрибутив Ubuntu 
# Скачиваем ключ и добавляем его в связку ключей программы apt
# Подключаем репозиторий, обновляем и устанавливаем nginx 
if [ $ubuntu_distr ]
	then	cd /
		wget http://nginx.org/keys/nginx_signing.key
		apt-key add /nginx_signing.key
		echo "deb http://nginx.org/packages/ubuntu/" $codename_ubuntu "nginx" >> /etc/apt/sources.list
		echo "deb-src http://nginx.org/packages/ubuntu/" $codename_ubuntu "nginx" >> /etc.apt/sources.list
		apt-get update
		apt-get install -y nginx
fi

Cкрипт также можно скачать на GitHub

А какими инструментами для автоматизации рутинной работы пользуетесь вы?

Скрипт написан по материалам: http://nginx.org/ru/download.html

Скрипт резервного копирования БД на удаленный сервер mysqldump+rsync

Мы будем делать дамп базы данных MySQL утилитой mysqldump в локальный каталог, а затем делать резервную копию дампа на удаленный сервер при помощи утилиты rsync, чтобы это все происходило без нашего вмешательства все это дело вставим в cron, а также необходимо будет настроить авторизацию по ключу на удаленном сервере. Предварительно нужно установить сам rsync, если этого не сделано. Собственно сам скрипт:

Читать далее…