Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


пятница, 3 февраля 2017 г.

Хранение сообщений в Zimbra: доведение до нервного срыва

Накопились в хранилище зимбры несколько десятков гигов старых сообщений, которые почему-то не прибились при автоматической чистке почтовых ящиков.
Меня смутил их размер - самих файлов с сообщениями, поэтому решил посмотреть в общих чертах, что там внутри. Через штатный просмотрщик MC сообщения показываются нормально, но он не умеет парсить структуру SMTP, поэтому я такие сообщения скопировал в свой сетевой каталог, дабы глянуть их через Thunderbird.
Копировал с помощью rsync. Сразу удивило, что, несмотря на использование опции -z, ускорения передачи не было, словно копировались уже сжатые данные. Ну да ладно, это не критично.
Захожу в FAR-e из-под винды в этот каталог, открываю первый попавшийся файл и выпадаю в осадок: внутри просто мусор. Открываю этот же файл через MC на сервере, куда его скопировал - MC показывает нормальные внутренности письма.
Копирую файл на свой локальный диск - внутри мусор. Копирую этот "мусор" обратно на самбу - MC показывает всё как положено.
Уже начал подозревать, что умудрился каким-то непонятным образом поймать вирус-шифровальщик, причем очень хитрый, который шифрует файл не на диске, а при открытии, в реальном времени. На всякий случай тот же самый файл из того же самого каталога попробовал открыть на другой машине с другой ОС и другим пользователем. Мусор.

Скажу честно, я растерялся. Растерянности добавило и то, что среди нескольких файлов сообщений небольшого размера, где-то до 10К, часть читается нормально, а часть содержит всё тот же мусор.

Всё оказалось проще. Выяснилось, что большинство сообщений хранится в виде GZIP. MC-шный просмотрщик молча распаковывает эти архивы, благодаря чему я вижу их исходное состояние, а вот FAR под такую подлянку не заточен:

Вот что говорит file про эти сообщения:
# file 1583-5345.msg
1583-5345.msg: gzip compressed data, from FAT filesystem (MS-DOS, OS/2, NT)


А вот то же самое с ключиком -z ("попытаться проверить содержимое сжатых файлов")
# file 1583-5345.msg -z
1583-5345.msg: smtp mail, ASCII text, with CRLF line terminators (gzip compressed data, from FAT filesystem (MS-DOS, OS/2, NT))


Остался вопрос: как же мне посмотреть, эти сообщения, если часть из них сжатые, а часть - нет? Можно, конечно, натравить gunzip на все файлы в каталоге, и пусть себе выдает ошибки на несжатых, но это не труЪ.
Как говорил мой бывший начальник в отделе автоматизации: "мы называемся "отдел автоматизации", а значит наша задача - автоматизировать всё, что можно". Я не возражал тогда, не возражаю и сейчас, поэтому, убедившись что в однострочной команде это писать неудобно, слепил простенький скрипт, который переварил и обработал всю эту массу.

#!/bin/bash
# В этих путях конечный слэш не указываем: привычка, чтобы потом не пришлось его
# убирать где-нибудь в ходе выполнения
INDIR=/путь/к/каталогу/с/исходными/файлами
OUTDIR=/куда/копировать/обработанные/файлы

# Мне это необходимо - назначить права для доступа, если вам не нужно,
# уберите chown в конце скрипта.
RIGHTS="пользователь:группа"

# Проходим по всем сообщениям в каталоге. Обработка подкаталогов не предусмотрена.
for a in  $INDIR/*.msg; do
    # просто для красоты. Можно отключить для небольшого ускорения.
    echo $a
    # Имя файла без расширения используется в 3 местах, лучше использовать
    # переменную, а не дёргать basename трижды
    MESNAM=$(basename $a .msg)
    # Узнаём, что это за файл - gzip или нет?
    file "$a"|grep -q gzip>/dev/null
    # Это присвоение не обязательно, но я предпочитаю гарантированно сохранить
    # в переменной результат последней операции
    DO=$?
    # если grep -q нашел подстроку "gzip", тогда будет возвращён ноль
    if [[ $DO -eq 0 ]]
    then

        # Распаковываем архив в нужное место, меняя расширение
        gunzip -dc $a>$OUTDIR/$MESNAM.eml
    else

        # Не-архив просто копируем туда же
        cp $a $OUTDIR/$MESNAM.eml
    fi

    # Если необходимо, назначаем соответствующие права
    chown "$RIGHTS" $OUTDIR/$MESNAM.eml
done


Вот как-то так...

Комментариев нет:

Отправить комментарий

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