Ru-Board.club
← Вернуться в раздел «В помощь системному администратору»

» MDaemon: ежедневная рассылка лога SMTP (out)

Автор: SlaWEEK
Дата сообщения: 28.04.2010 09:11
Добрый день.
Мне поставили задачу реализовать на почтовом сервере MDaemon 10.1.2 необходимость ежедневной рассылки определенного лог-файла MDaemon 10.1.2, а именно SMTP (out) для его дальнейшего анализа.
В принципе часть задачи решил, а именно выдернул кусок программы из MDAEMON, которая сможет отобразить журнал формата smtp (out).txt в виде удобочитаемой таблицы. А вот решить вопрос с автоматической ежедневной передачей другому сотруднику конкретно только одного файла smtp (out).txt никак не могу.
Почтовый сервер находится в демилитаризованной зоне, в домен не включен, открыть share на каталог со всеми лог файлами не имеет смысла по безопасности и разрешить подключение к удаленному рабочему столу сервера не могу.
Вообще есть соображения или предположения как можно это организовать?
Автор: vlary
Дата сообщения: 28.04.2010 10:00

Цитата:
Вообще есть соображения или предположения как можно это организовать?
Есть масса способов. На ваш вкус и умение. Я бы лично скомпилил простенькую програмку на .Net с использованием Net.SMT и повесил ее в планировщик.
Автор: ipmanyak
Дата сообщения: 28.04.2010 10:54
SlaWEEK Чем не устраивает отсылка этого лога в запакованном виде по почте через планировщик задач? Не знаете консольных программ отправки почты? Их масса:
http://www.autocode.ru/sendfile/
http://www.blat.net/
http://ironfist.at.tut.by/zerat.htm
есть и vbs скрипт - http://www.paulsadowski.com/WSH/cdo.htm
p.s.
Лог демона и так в нормальном читаемом виде, дайте ему расширение txt и открывайте блокнотом.
Автор: SlaWEEK
Дата сообщения: 30.04.2010 05:37
ipmanyak
Да о таких консольных программах не знал, спасибо. Но еще один вопрос как в каталоге с логами я смогу отправлять только файлы лога smtp (out).log? Они формируются каждый день и имеют формат MDaemon-20100430-SMTP-(out).log Как я смогу сообщить консольной программе отправки почты, что необходимо отправить только определенный файл допустим за 2010 04 30? потому что в 00-00 система заведет новый файл MDaemon-20100501-SMTP-(out).log

Добавлено:
vlary
Пару-тройку вариантов можешь описать? К сожалению програмку на .Net с использованием Net.SMT написать не смогу, т.к. опыта написания данных вещей нет, а разбираться с нуля времени не дадут. надо сделать как можно в короткие сроки.
Автор: ipmanyak
Дата сообщения: 30.04.2010 07:19
SlaWEEK Есть такая хорошая программа forfiles в w2k3, позволяет выбирать файл с датой на нужное число дней назад, ею выцепляешь файл на 1 день назад и шлете.
ECHO ON
forfiles /P "M:\Logs" /M *SMTP-(out).log /D -1 /C "cmd /c echo @fname"
pause
покажет два файла, как выбрать нужный, домысливай сам, как запаковать тоже. Можно паковать и слать оба, дабы шибко не заморачиваться
Автор: SlaWEEK
Дата сообщения: 30.04.2010 07:41
ipmanyak
в этот же пакетный файл указывать параметры консольной программы по отправке почты (остановился на http://www.autocode.ru/sendfile/) выбранных файлов?
Автор: vlary
Дата сообщения: 30.04.2010 12:30

Цитата:
Пару-тройку вариантов можешь описать?

Вот тебе один вариант, за глаза хватит.
Копируешь программу в файл, скажем, c:\temp\sendfile.cs
Делаешь необходимые изменения (директория логов, адрес сервера, адреса от кого и кому.
Находишь на сервере фреймворк, заходишь в ее директорию, например
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 и выполняешь там команду
csc.exe /out:c:\temp\sendfile.exe c:\temp\sendfile.cs
Запускаешь экзешник, убеждаешься, что работает, ставишь его в планировщик на выполнение ежедневно в час ночи, и идешь к начальству за премией

Код: using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net.Mail;


namespace sendfile
{
class Program
{
static void Main(string[] args)
{
DateTime dt;
string logname;
string logdir;
string filename;
string mtext;
bool found = false;

dt = DateTime.Now.AddDays(-1);
logname = String.Format("MDaemon-{0}{1}{2}-SMTP-(out).log", dt.Year, dt.Month, dt.Day);
logdir = @"C:\Logs\";
filename = logdir + logname;
if (!File.Exists(filename))
{
mtext = "Cannot open file: " + filename;
}
else
{
mtext = "Log file for " + dt.ToString("dd-MM-yy");
found = true;
}
MailMessage msg = new MailMessage("info@yourdomain.ru", "slaweek@yourdomain.ru", "MDaemon dayly log", mtext);
if (found)
msg.Attachments.Add(new Attachment(filename));
SmtpClient smtp = new SmtpClient("127.0.0.1"); //MDaemon IP
smtp.Send(msg);

}
}
}
Автор: ipmanyak
Дата сообщения: 30.04.2010 15:14
SlaWEEK

Цитата:
"cmd /c echo @fname"
вместо echo @fname вызываешь другой батник, которому передаешь параметром имя файла и путь к нему, типа
call packlog.bat @path @file
в том батнике типа
"C:\Program Files\7-zip\7z.exe" a D:\#7\%1.zip %1\%2
ну и команда для autocode
Приницип понял - далее разберешься. Vlary любитель NETFramework (я нет) можешь его скриптец заюзать. Премию нам с Vlary отдаешь.
Автор: vlary
Дата сообщения: 30.04.2010 15:56

Цитата:
Vlary любитель NETFramework (я нет)
Да не такой уж я любитель, но коли эта шняга стоит на серваках по умолчанию - почему бы не использовать? Сделал бы на Перле, но его нужно специально ставить. А так уж исторически сложилось, что я из мира Юникса и виндузовыми скриптами просто не привык пользоваться, мне проще программу написать.
Автор: ipmanyak
Дата сообщения: 30.04.2010 16:51
vlary у мну всё в точности до наоборот, мне проще батник написать.
Автор: SlaWEEK
Дата сообщения: 05.05.2010 03:11
ipmanyak
vlary
Спасибо ребятки за помощь. Но увы, премии за это нифига не будет. В нашем отделе не на этом вся работа строится. Не оценят просто, а вот за не выполнение могут и наказать рублем. так что могу поделиться только взысканием. Сойдет?
ipmanyak
С батником у меня сложности, хотя ими сам частенько пользуюсь, но настолько сложных вещей не писал еще. За сутки размер лога не превышает 500 кб, можно и не проводить его архивацию, а отправить как есть.
vlary
Твое решение кажется наиболее целостным что ли. Необходимо его еще опробовать.
Автор: vlary
Дата сообщения: 05.05.2010 10:30

Цитата:
Твое решение кажется наиболее целостным что ли. Необходимо его еще опробовать.
Та шо там пробовать? Сало як сало ...
Я смотрю, тебе времени на попробовать требуется гораздо больше , чем нам с ipmanyak на написать. Посему на часть твоего взыскания не претендуем, ты его честно заработал .

Автор: SlaWEEK
Дата сообщения: 07.05.2010 05:59
vlary
Привет. Не получается... Пока понять почему не могу.
Сделал все как ты описал. Внешне все выполняется нормально, но сообщений не приходит.
Автор: vlary
Дата сообщения: 07.05.2010 08:18
SlaWEEK Если просто выполнить команду "от руки", работает? Адрес почтовика правильный прописан? Адреса "от кого" и "кому" нормально выставдены? В логах почтовика никаких сообщений об ошибках нет?
Я эту программу сам компилил и проверял, она нормально нашла файл и отправила его мне по почте.
Автор: SlaWEEK
Дата сообщения: 07.05.2010 08:56
vlary
я пока разобраться не могу как вообще работает sendfile.exe Пробовал различные варианты, и с sendfile.ini и без него. Вообще нужен ли sendfile.ini, или просто достаточно скопировать в каталог c:\temp туда же где лежит файл sendfile.cs
От руки выполняется, но письма не приходит.
В sendfile.cs прописываются все данные по почтовику?

Добавлено:
vlary
Сделал все верно, вроде бы. Да там и путать-то нечего, письма один фиг не приходит с логом. Слушай, а я же прописал в батник строки
ECHO OFF@
cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
csc.exe /out:c:\temp\sendfile.exe c:\temp\sendfile.cs

В ручную команды выполняются нормально, ошибок в каталог с логами никаких не пишет, а электронного письма нет.
Автор: vlary
Дата сообщения: 07.05.2010 10:19
SlaWEEK Блин, вот это улыбнуло!
Да что же ты делаешь? Командой csc.exe /out:c:\temp\sendfile.exe c:\temp\sendfile.cs
ты просто из исходника должен сделать программу sendfile.exe.
А потом попробовать ее просто выполнить из командной строки: c:\temp\sendfile.exe
Убедившись, что письмо с логом пришло, ставишь прогу в планировщик задач эдак на час ночи, и получаешь ежедневные репорты с логом по почте. Безо всякого батника.
Автор: SlaWEEK
Дата сообщения: 07.05.2010 10:28
vlary
Мда уж. Я выше писал что взял за основу программу sendfile.exe компании автокод. Вот это-то меня в заблуждение ввело... Пытался склеить.
Давно не писал программ. Могу сделать exe`шник в delphi.
Автор: vlary
Дата сообщения: 07.05.2010 11:12
SlaWEEKЗачем его делать в делфи?! После выполнения команды csc.exe /out:c:\temp\sendfile.exe c:\temp\sendfile.cs он уже готов и лежит в c:\temp !
И его уже можно использовать как я написал выше!
Автор: SlaWEEK
Дата сообщения: 11.05.2010 02:48
vlary
Привет. Да уж улыбнуло, так улыбнуло. Согласен. Просто раннее с такими вещами не работал. Как говорится "Не ошибается только тот, кто ничего не делает".
В принципе получилось все. Только вот attachment с лог файлом не прикрепляется к письму пишет: "Cannot open file: D:\MDaemon\Logs\MDaemon-2010510-SMTP-(out).log"
Попытался отправить лог файл вручную через MS Outlook все нормально приходит.
Автор: vlary
Дата сообщения: 11.05.2010 10:03

Цитата:
"Cannot open file: D:\MDaemon\Logs\MDaemon-2010510-SMTP-(out).log"
Программа запускается на том же сервере, где находится почтовый сервер и лог? Имя файла точно D:\MDaemon\Logs\MDaemon-2010510-SMTP-(out).log? Может, имя D:\MDaemon\Logs\MDaemon-20100510-SMTP-(out).log (еще ноль перед пятеркой)?
Автор: SlaWEEK
Дата сообщения: 11.05.2010 10:18
vlary
Программа запускается на том же сервере, где и стоит почтовый сервер и там же лежит лог.
Да имя "D:\MDaemon\Logs\MDaemon-20100510-SMTP-(out).log" Обратил внимание на это сразу, но решил все таки тебя дождаться и спросить.
Слушай, а в случае если формат даты будет меняться. Допустим 01, 02 ... 10, 11, 12 ... 20 тогда как?
Автор: vlary
Дата сообщения: 11.05.2010 10:27

Цитата:
Слушай, а в случае если формат даты будет меняться. Допустим 01, 02 ... 10, 11, 12 ... 20 тогда как?
Ничего страшного. Найди в скрипте строчку
logname = String.Format("MDaemon-{0}{1}{2}-SMTP-(out).log", dt.Year, dt.Month, dt.Day);
и замени ее этой строчкой
logname = "MDaemon-" + dt.ToString("yyyyMMdd") + "-SMTP-(out).log";
Перекомпили программу, и будет тебе щастье.
Автор: SlaWEEK
Дата сообщения: 11.05.2010 10:31
vlary
Ок. Разрешите выполнять?

Добавлено:
vlary
Вот спасибо тебе, ДОБРЫЙ ЧЕЛОВЕК! Заработало!!!
Автор: SlaWEEK
Дата сообщения: 12.05.2010 02:44
vlary
Привет. Рано радовался. Сегодня в 1-00 задание не выполнено. даже сейчас в ручную запускаю, долго-долго висит окно выполнения sendfile.exe и ничего. Файла по почте не приходит...
При этом систему загружает DW20.exe на 94%
Автор: vlary
Дата сообщения: 12.05.2010 10:29

Цитата:
При этом систему загружает DW20.exe на 94%
Что такое DW20.exe ?
Автор: ipmanyak
Дата сообщения: 12.05.2010 10:38
http://www.liutilities.com/products/wintaskspro/processlibrary/dw20/
Автор: SlaWEEK
Дата сообщения: 12.05.2010 10:45
vlary
Появляется в диспетчере задач windows, а именно в процессах после запуска скомпилированного sendfile.exe Странно вчера все нормально работало, поставил только в планировщик задач на выполение и все. Сегодня уже никак работкать отказывается.

Добавлено:
ipmanyak
Нет, это не то пальто. У меня на этом серваке MS Office даже и не пахнет. Не ставил я его, нет в этом необходимости.
Автор: vlary
Дата сообщения: 12.05.2010 11:07

Цитата:
долго-долго висит окно выполнения sendfile.exe и ничего.
Чем отличается ситуация вчера от ситуации сегодня? Долго висит - такое впечатление, что сервер не принимает почтовое сообщение. Смотри по сегодняшним логам почтовика, какие ошибки. Можешь в скрипт на разных этапах выполнения вставить для дебага строчки Console.WriteLine("......"); чтобы понять, на каком этапе заткнулась.
Можешь для страховки заменить строчки
SmtpClient smtp = new SmtpClient("127.0.0.1");
smtp.Send(msg);
строчками
try
{
SmtpClient smtp = new SmtpClient("127.0.0.1");
smtp.Timeout = 100000;
smtp.Send(msg);
}
catch (Exception ex)
{
Console.WriteLine("Cannot send: " + ex.Message);
}


Добавлено:
Еще посмотри, что пишут в системном логе
Автор: SlaWEEK
Дата сообщения: 12.05.2010 11:27
vlary
Хорошо, у меня на сегодня рабочий день закончился. Завтра с утра выполню твои рекомендации и отпишусь. Ок?
Автор: SlaWEEK
Дата сообщения: 13.05.2010 03:31
vlary
Привет. Вообще ничего понять не могу. Оставил вчера в планировщике задач выполнение SendFile.exe Сегодня утром пришло письмо с нужным логом за нужное число. Попробовал вручную выполнить этот файл - тоже все отлично получилось. Было предположение что файл лога вырос. Потому как 10 мая файл весил порядка 98 Кб, а за 11 мая около 600 Кб. Но что странно за 12 мая размер файла лога был равен около 1 Мб и все отлично работает. Остается пока понаблюдать за работой скрипта, если будут какие вопросы в его работе, то сообщю об этом.
То что ты советовал сделать пока не использовал. Как считаешь имеет смысл заменять строки?

Страницы: 12

Предыдущая тема: вопрос по поводу просмотр событий безопасность


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.