Работа по расписанию во FreeBSD::Журнал СА 4.2004
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Наука и технологии
Авторам
Рекламодателям
Контакты
   

  Опросы
  Статьи

Дата-центры  

Дата-центры: есть ли опасность утечки данных?

Российские компании уже несколько лет испытывают дефицит вычислительных мощностей. Рост числа проектов,

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

Событие  

В банке рассола ждет сисадмина с полей фрактал-кукумбер

Читайте впечатления о слете ДСА 2024, рассказанные волонтером и участником слета

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

Организация бесперебойной работы  

Бесперебойная работа ИТ-инфраструктуры в режиме 24/7 Как обеспечить ее в нынешних условиях?

Год назад ИТ-компания «Крок» провела исследование «Ключевые тренды сервисного рынка 2023». Результаты

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

Книжная полка  

Читайте и познавайте мир технологий!

Издательство «БХВ» продолжает радовать выпуском интересных и полезных, к тому же прекрасно

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

СУБД PostgreSQL  

СУБД Postgres Pro

Сертификация по новым требованиям ФСТЭК и роль администратора без доступа к данным

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

Критическая инфраструктура  

КИИ для оператора связи. Готовы ли компании к повышению уровня кибербезопасности?

Похоже, что провайдеры и операторы связи начали забывать о требованиях законодательства

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

Архитектура ПО  

Архитектурные метрики. Качество архитектуры и способность системы к эволюционированию

Обычно соответствие программного продукта требованиям мы проверяем через скоуп вполне себе понятных

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

Как хорошо вы это знаете  

Что вам известно о разработках компании ARinteg?

Компания ARinteg (ООО «АРинтег») – системный интегратор на российском рынке ИБ –

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

Графические редакторы  

Рисование абстрактных гор в стиле Paper Cut

Векторный графический редактор Inkscape – яркий представитель той прослойки open source, с

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

День сисадмина  

Учите матчасть! Или как стать системным администратором

Лето – время не только отпусков, но и хорошая возможность определиться с профессией

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

День сисадмина  

Живой айтишник – это всегда движение. Остановка смерти подобна

Наши авторы рассказывают о своем опыте и дают советы начинающим системным администраторам.

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

Виртуализация  

Рынок решений для виртуализации

По данным «Обзора российского рынка инфраструктурного ПО и перспектив его развития», сделанного

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

Книжная полка  

Как стать креативным и востребованным

Издательский дом «Питер» предлагает новинки компьютерной литературы, а также книги по бизнесу

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

Книжная полка  

От создания сайтов до разработки и реализации API

В издательстве «БХВ» недавно вышли книги, которые будут интересны системным администраторам, создателям

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

1001 и 1 книга  
19.03.2018г.
Просмотров: 6234
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

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

12.03.2018г.
Просмотров: 6941
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

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

12.03.2018г.
Просмотров: 4228
Комментарии: 0
Глубокое обучение с точки зрения практика

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

12.03.2018г.
Просмотров: 3014
Комментарии: 0
Изучаем pandas

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

12.03.2018г.
Просмотров: 3810
Комментарии: 0
Программирование на языке Rust (Цветное издание)

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

19.12.2017г.
Просмотров: 3827
Комментарии: 0
Глубокое обучение

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

19.12.2017г.
Просмотров: 6323
Комментарии: 0
Анализ социальных медиа на Python

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

19.12.2017г.
Просмотров: 3174
Комментарии: 0
Основы блокчейна

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

19.12.2017г.
Просмотров: 3466
Комментарии: 0
Java 9. Полный обзор нововведений

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

16.02.2017г.
Просмотров: 7283
Комментарии: 0
Опоздавших не бывает, или книга о стеке

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

17.05.2016г.
Просмотров: 10649
Комментарии: 0
Теория вычислений для программистов

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

30.03.2015г.
Просмотров: 12370
Комментарии: 0
От математики к обобщенному программированию

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

18.02.2014г.
Просмотров: 14004
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

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

13.02.2014г.
Просмотров: 9130
Комментарии: 0
Читайте, размышляйте, действуйте

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

12.02.2014г.
Просмотров: 7083
Комментарии: 0
Рисуем наши мысли

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

10.02.2014г.
Просмотров: 5392
Комментарии: 3
Страна в цифрах

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

18.12.2013г.
Просмотров: 4619
Комментарии: 0
Большие данные меняют нашу жизнь

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

18.12.2013г.
Просмотров: 3431
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

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

04.12.2013г.
Просмотров: 3160
Комментарии: 0
Паутина в облаках

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

03.12.2013г.
Просмотров: 3405
Комментарии: 0
Рецензия на книгу «MongoDB в действии»

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

02.12.2013г.
Просмотров: 3029
Комментарии: 0
Не думай о минутах свысока

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

Друзья сайта  

 Работа по расписанию во FreeBSD

Архив номеров / 2004 / Выпуск №4 (17) / Работа по расписанию во FreeBSD

Рубрика: Администрирование /  Продукты и решения

СЕРГЕЙ СУПРУНОВ

Работа по расписанию во FreeBSD

Способность операционной системы выполнять задачи в заданное время (по расписанию) может сделать администрирование существенно проще и эффективнее, а в ряде случаев такая способность просто необходима. В данной статье рассмотрены средства отложенной работы и работы по расписанию, имеющиеся во FreeBSD (на примере FreeBSD 5.1), однако большинство описанных здесь функций будут доступны вам и в других ОС семейства UNIX, включая Linux. Особое внимание уделено механизмам работы, знание которых необходимо для эффективного поиска возможных проблем.

Прежде всего рассмотрим утилиту, которая позволяет однократно выполнить ту или иную команду в заданное время. Это команда at, простейший синтаксис которой выглядит следующим образом:

# at time

Здесь time – время, когда задача должна быть выполнена. Перечень команд, составляющих задачу, считывается со стандартного ввода (как правило, это ввод с клавиатуры, завершаемый символом ). Например:

# at 11:00pm

who

last -s -20

df

^D

Этот ввод приведет к тому, что в 23:00 (сегодня, если дело происходит утром, и завтра, если после обеда) последовательно будут выполнены команды who, last и df, и их вывод будет отправлен на электронный адрес пользователя.

Команда предоставляет пользователю большую свободу в выборе формата времени:

Таблица 1

Формат времени

Примеры

Описание

HH[:]MM[pm|am]

 

1405

14:05

2:05pm

Команда будет выполнена

в 14:05 текущего

или следующего дня

midnight

Midnight

Команда выполнится в полночь

noon

Noon

Команда выполнится в полдень

teatime

Teatime

Команда выполнится в 16:00

+N Unit

+3 minutes

+3 hours

+3 days

+3 weeks

+3 month

+3 years

Выполнить через 3 минуты

Через 3 часа

Через 3 дня

Через 3 недели

Через 3 месяца

Через 3 года

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

Так, дата «12 февраля 2005 года» может быть записана одним из следующих способов: 12.02.2005, 12.02.05, 12/02/2005, 12/02/05, Feb 12 2005… Также вместо конкретной даты можно использовать ключевое слово tomorrow, указывающее, что задание должно быть исполнено в указанное время завтра. При необходимости указать, что задание должно быть выполнено именно сегодня, можно использовать дополнение today. Естественно, при попытке задать уже прошедшее время вы получите соответствующее сообщение об ошибке.

Кроме того, время может быть задано в формате POSIX, для чего следует использовать ключ -t:

# at -t [[CC]YY]MMDDhhmm[.SS]

// команда выполнится 1 декабря этого года в 15:30

# at -t 12011530

По умолчанию команду at может выполнять только суперпользователь root. Чтобы дать такое право другим пользователям, их следует перечислить в файле /var/at/at.allow. Если файл at.allow в этой директории отсутствует, но есть файл at.deny, то команду at смогут запускать все пользователи, кроме перечисленных в at.deny. Обратите внимание, что имена пользователей в этих файлах должны начинаться строго с первой позиции и обязательно завершаться символом перевода строки даже для последней строчки.

Из дополнительных опций команды at перечислим следующие:

  • -f file – задает имя файла, содержимое которого будет воспринято как задание. Если опция не указана, задания считываются со стандартного ввода (до символа Ctrl-D). Например:

# at –f myjobs +2 minutes

В результате через 2 минуты будет выполнена последовательность команд, перечисленных в файле myjobs. Команды в этом файле задаются по одной на каждой строке (так же, как и при вводе с клавиатуры). Результат также будет направлен по электронной почте.

  • -m – заставляет отсылать письмо о выполнении задания пользователю (без этой опции письмо отсылается только в том случае, если результат выполнения задания отправляется на стандартный вывод).
  • -q queue – позволяет поместить задание в указанную очередь, которая может быть задана одной буквой латинского алфавита (a-z, A-Z). По умолчанию задание помещается в очередь «c» для at и в «E» для batch (см. далее). Помимо удобства работы с большим числом отложенных заданий, различные очереди позволяют управлять приоритетом (nice) их выполнения – чем дальше буква, соответствующая очереди, находится от начала алфавита, тем большее значение nice, то есть меньший приоритет, получат задачи, стоящие в этой очереди. Очереди, обозначенные буквами верхнего регистра, будут обрабатываться только в том случае, если загрузка системы позволяет это сделать (см. далее описание ключа -b (batch)), и после того, как будут запущены задания из очередей, обозначенных строчными буквами.
  • -l [-q queue] – выводит список заданий, находящихся в очереди. Можно использовать также псевдоним atq, выполняющий те же функции. Если команду atq выполняет суперпользователь, то выводятся все задания, находящиеся в очереди. Иначе – только задания, принадлежащие текущему пользователю.
  • -r job – удаляет указанное задание из очереди. Эта команда также может быть вызвана с использованием псевдонима: atrm.
  • -b – выполняет задание, если средняя загрузка системы (посмотреть ее можно с помощью команды w или top, параметр load average) не превышает указанное значение (по умолчанию 1.5; как его изменить – смотрите далее в описании команды atrun). Batch – псевдоним для вызова at с данным ключом:

# batch -f myjobs +2 minutes

Команда аналогична примеру, приведенному выше для опции -f, но задание будет выполнено, когда средняя загрузка системы (load average) будет ниже 1.5. Так, если это условие будет истинно через 2 минуты, то задание выполнится в указанное время. Иначе оно будет откладываться, пока загрузка не снизится до требуемого значения.

С остальными параметрами можно ознакомиться на страницах справочного руководства «man at».

Для чего может понадобиться отложенное выполнение команд? Например, можно поставить на ночь (когда нагрузка меньше, а трафик дешевле) закачку большого файла:

# echo ‘fetch ftp://ftp.ru/pub/bigfile.avi’ | at 0200

Здесь мы просто направляем на стандартный ввод программы at строку «fetch ftp://ftp.ru/pub/bigfile.avi»; данная команда будет запущена в 2:00.

Далее, пусть с 1 января вступают в силу новые тарифы на услуги, оказываемые вашей компанией, и вы хотите, чтобы информация о них на вашем сайте всегда была актуальна (пусть она находится в файле /usr/local/www/data/tariffs.html). Чтобы не встречать Новый год наедине с сервером, создайте файл tariffs.html с новой информацией и разместите его, скажем, в /home/myhome/temp. Теперь задача обновления ровно в полночь будет решаться так:

# at midnight Jan 01

cp /home/myhome/temp/tariffs.html /usr/local/www/data/

^D

Можно запустить сборку системы из исходных текстов, когда нагрузка на систему будет меньше 1.5 (процесс этот ресурсоемкий, но не срочный):

# batch

cd /usr/src

// мы же не хотим получить все это по почте?

make buildworld > buildword.log

^D

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

Еще небольшой совет – вступая во владение новым сервером, проверьте, какие команды у него в очереди. А то вдруг предыдущий администратор, уволенный за неумеренное потребление спиртного, оставил вам «сюрприз» в виде «rm -fR /*», запланированный на запуск через пару месяцев?

Теперь несколько подробнее рассмотрим механизм, обеспечивающий работу команды at. Когда с ее помощью формируется отложенное задание, в папке /var/at/jobs создается файл сценария, содержащий переменные окружения (какими они были на момент формирования задания; при выполнении задания эти переменные будут восстановлены) и собственно команды, которые должны быть выполнены. Периодически (по умолчанию – каждые 5 минут) запускается процесс atrun, выполняющий все задания, срок выполнения которых истек. Таким образом, говоря ранее, что «задание будет выполнено через 2 минуты», я был не совсем точен. На самом деле задания выполняются с точностью в 5 минут (как это можно изменить – читайте ниже). Процесс atrun может быть выполнен с двумя ключами:

# atrun [-l average] [-d]

Ключ -l задает максимальное значение средней загрузки системы, при котором могут быть выполнены задания, сформированные командой at -b (batch). Нужно заметить, что если в очереди имеется несколько batch-заданий, то при снижении загрузки до допустимого уровня будет запущено только одно (имеющее более раннее время исполнения). Последующие будут запускаться на выполнение также по одному при каждом следующем вызове atrun, если средняя загрузка системы все еще будет позволять сделать это. По умолчанию значение average равно 1.5. Ключ -d включает режим отладки (все сообщения об ошибках поступают на стандартный вывод, а не в системные файлы протоколов через механизм syslog).

После выполнения задания с соответствующего файла сценария снимается признак исполнимости (x), а при следующем вызове процесса atrun он удаляется из /var/at/jobs. Просмотреть выполненные, но еще не удаленные задания с указанием времени, когда они были выполнены, позволяет команда atq -v (для at с ключом -l ключ -v игнорируется).

Периодический запуск процесса atrun обеспечивается другим механизмом UNIX-систем – cron. О нем и пойдет речь далее.

Демон cron запускается автоматически при старте системы (конкретно – сценарием /etc/rc.d/cron) и каждую минуту проверяет файлы расписаний пользователей и системный файл расписаний /etc/crontab на предмет наличия заданий, которые должны быть выполнены в данную минуту.

По умолчанию каждый пользователь может иметь свой файл расписаний. Изменить это можно с помощью файлов /var/cron/allow и /var/cron/deny (так же, как и для команды at: если файл allow существует, то использование cron будет разрешено только пользователям, перечисленным в нем). Файлы расписаний располагаются в /var/cron/tabs с именами, соответствующими имени пользователя. Для управления ими следует использовать утилиту crontab, синтаксис которой представлен ниже:

crontab [-u user] (-l | -r | -e)

Опция -u позволяет работать с файлом расписаний указанного пользователя user, а не текущего, как это происходит без данной опции. Если вы работаете через su, лучше всегда использовать этот ключ, чтобы избежать разночтений. Ключ -l позволяет вывести на экран пользовательский файл расписаний, -r – удалить его, -e – редактировать. Для редактирования вызывается редактор, указанный в переменной окружения EDITOR или VISUAL. Формат строки задания в пользовательском файле следующий:

Min Hour   Day    Month  WDay   Command

То есть через пробельные символы (пробелы и символы табуляции) указываются минута, час, день, месяц, день недели, когда должна быть выполнена команда, указанная в шестом поле. Допускаются перечисления (через запятую: 1,3,5), интервалы (через дефис: 1-5), шаг (после символа «/»: 1-9/2 означает «1,3,5,7,9», то есть каждое второе значение из указанного диапазона). Звездочка «*» означает все допустимые значения. Для месяца и дня недели можно использовать их сокращенные английские названия (первые три буквы), например: Feb, JUN, tue, Fri (регистр значения не имеет). Диапазоны и перечисления для имен недопустимы, то есть по имени можно обозначить только один месяц или день недели. Для числового обозначения дней недели допустимыми являются числа 0-7, где как 0, так и 7 обозначают воскресенье. Несколько примеров:

# Запускать программу каждый вторник в 12:00

0   12     *      *      2      /usr/home/admin/checkmail

 

# Выполнять задание через день в январе, марте и с сентября  по декабрь

0   0      */2    1,3,9-12     *      /usr/local/test/test

 

# Запускать скрипт 1-го и 15-го числа каждого месяца в 2:05, а также по воскресеньям (Day и WDay работают в режиме «ИЛИ»)

Демон cron при каждой активизации проверяет дату изменения файла /etc/crontab и директории /var/cron/tabs. Если они изменились, то он перечитывает все изменения и учитывает их при последующих вызовах. Поскольку утилита crontab после редактирования файла заданий меняет дату изменения для папки /var/cron/tabs, то после того, как в пользовательский файл расписаний будут внесены изменения, нет нужды в перезапуске процесса cron – эти изменения будут учтены при следующей активизации. Именно по этой причине для редактирования пользовательских файлов расписаний следует использовать команду crontab -e, а не редактировать файлы непосредственно. Для файла /etc/crontab дата изменения проверяется отдельно, поэтому его можно изменять обычным редактором (естественно, для этого нужны права root).

Формат файла crontab также допускает вместо первых пяти позиций, означающих время выполнения задания, использовать предопределенные значения:

  • @reboot (выполнять при загрузке операционной системы);
  • @yearly (выполнять ежегодно в полночь 1 января);
  • @monthly (выполнять ежемесячно в полночь 1 числа);
  • @weekly (выполнять в полночь каждый понедельник);
  • @daily (выполнять ежедневно в 0:00);
  • @hourly (выполнять в начале каждого часа).

Рассмотрим пример:

# Выполнять 1-го числа каждого месяца в 0:00

@monthly   /usr/local/billing/close_month.pl

Помимо собственно заданий, файл crontab может содержать строки, задающие системные переменные, с которыми задания будут отрабатываться. Так, можно задать оболочку, в которой будут исполняться сценарии (переменная SHELL, по умолчанию это sh), переменную PATH. Если нужно, чтобы выводимая выполняемыми командами информация пересылалась на почтовый ящик не владельца файла расписаний (как это происходит по умолчанию), а на другого пользователя, для этого можно использовать переменную MAILTO. Пустое значение (MAILTO=») приведет к тому, что сообщения будут перенаправляться в /dev/null.

Формат системного файла /etc/crontab несколько отличается от пользовательского: на шестой позиции указывается имя пользователя, с правами которого должна запускаться команда (и опционально – группа, отделенная от имени пользователя двоеточием, например, «root:wheel»), а сама команда отодвигается на седьмую. Например, вызов atrun задан в этом файле такой строкой:

*/5 *      *      *      *      root   /usr/libexec/atrun

Из этой записи видно, что процесс atrun, обеспечивающий отработку заданий, сформированных командой at, будет запускаться каждые 5 минут. При необходимости повысить точность отработки заданий по at, следует соответствующим образом изменить приведенную выше строку.

С использованием механизма cron выполняется и такая важная задача, как ротация log-файлов (см. строку, отвечающую за запуск newsyslog). По умолчанию процесс newsyslog запускается каждый час и проводит ротацию (архивирование и перезапись) log-файлов в соответствии с настройками в /etc/newsyslog.conf. На загруженных системах с подробным протоколированием ротация может понадобиться чаще, чем раз в час, для чего следует изменить соответствующую строку в /etc/crontab.

С механизмом cron связана еще одна полезная вещь – автоматическое обслуживание системы, обеспечиваемое с помощью periodic-сценариев. В системном crontab можно заметить следующие три строки:

1   3      *      *      *      root   periodic daily

15  4      *      *      6      root   periodic weekly

30  5      1      *      *      root   periodic monthly

Утилита periodic исполняет все сценарии, расположенные в папке, соответствующей параметру, переданному ей при вызове. Эта папка ищется в каталоге /etc/periodic. Например, запуск periodic daily приведет к выполнению всех скриптов, расположенных в /etc/periodic/daily. Также существует возможность создавать свои периоды обслуживания, для чего должна быть создана новая директория в /etc/periodic, в которую помещаются необходимые скрипты, и добавлена соответствующая строка запуска в crontab. Настроить обслуживание системы под собственные нужды можно в файле /etc/periodic.conf (по умолчанию отсутствует). Настройки по умолчанию заданы в /etc/defaults/periodic.conf. Как видно, эти сценарии выполняют очистку временных файлов, резервное копирование жизненно важной информации, формируют отчеты о состоянии системы и т. д. Основная работа приходится на ежедневное обслуживание (daily). Можно заметить, что в папке /etc/periodic присутствует поддиректория security, хотя в crontab вызова для нее нет. Если поискать внимательно, то команду вызова «periodic security» можно найти в файле /etc/periodic/daily/450.status.security, то есть сбор сведений о состоянии безопасности выполняется в ходе ежедневного обслуживания, но для удобства вынесен в отдельную поддиректорию, и по этой же причине отчет высылается отдельным письмом.

Поскольку порядок исполнения сценариев определяется в результате сортировки их имен, для формирования нужной последовательности исполнения служит трехзначное число, предваряющее имя почти каждого файла.

В директориях daily, weekly и monthly можно заметить сценарии 999.local. Они позволяют запускать так называемые локальные periodic-сценарии, которые перечисляются в файлах /etc/daily.local, /etc/weekly.local и /etc/monthly.local соответственно. Использование локальных сценариев для собственных нужд более предпочтительно, чем добавление скриптов в /etc/periodic, поскольку позволяет четко разделить системные и пользовательские сценарии и тем самым упростить сопровождение и обновление системы.

Как и для остальных команд, выполняемых по cron, весь стандартный вывод будет перенаправлен на электронный адрес пользователя – владельца таблицы crontab или указанного в переменной MAILTO.

Придумывать полезные примеры для cron труда не составляет. Приведу два первых, пришедших в голову. Предположим, нам нужно контролировать состояние сети. Для этого достаточно занести в ваш пользовательский файл расписаний (системный файл лучше использовать исключительно по системному назначению) строку:

0   *      *      *      *   /sbin/ping –с10 my.provider.ru | /usr/bin/grep ‘avg’ >> /var/log/ping.log

 Как это будет работать? В начале каждого часа будет выполняться команда ping, посылающая десять пакетов на адрес вашего провайдера. Из возвращаемой информации будет выбрана последняя строка с результатами, которая будет записана в файл ping.log для последующего анализа таких величин, как среднее время передачи пакета, величина девиации и т. д. Причем в файл будут заноситься только результаты успешного пинга, а все ошибки (типа «Host is down») будут отправляться по электронной почте владельцу файла расписаний.

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

12  4      *      *      *      /usr/sbin/ntpdate ntp.alaska.edu

Естественно, вы можете использовать для получения информации о точном времени тот сервер, который вам больше нравится (список серверов можно получить, если на любом поисковике подать запрос «Public ntp server»).

Еще несколько слов о путях к вызываемым программам. Для сервиса at переменная PATH и каталог, в котором задание будет выполняться, соответствуют тем значениям, которые были на момент формирования задания. То есть если я запускаю at, находясь в директории /etc, то и задание будет выполняться так, как будто оно было запущено из этой же директории, и соответственно все относительные пути, имеющиеся в запускаемом сценарии, будут разрешаться относительно этого каталога. Cron ведет себя несколько иначе – он запускает задания из домашнего каталога пользователя, а в качестве переменной PATH использует то значение, которое задано в файле расписаний (см. crontab -) в переменной PATH. По умолчанию PATH=/usr/bin:/bin. Проверить это достаточно просто – сформируйте задание с командами pwd и echo $PATH, и вы получите письмо со значениями этих параметров на момент выполнения задания.

На этом знакомство со службами выполнения заданий по расписанию можно завершить. Как обычно, дополнительную информацию можно получить на страницах справочного руководства man: at(1), atrun(8), cron(8), crontab(1), crontab(5), periodic(8), periodic.conf(5).


Комментарии отсутствуют

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

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru