Архивирование и удаление mailbox от удаленных почтовых e-mail

Посмотрев на занятое пространство на почтовом сервере под mailbox для почтовых ящиков нескольких доменов. Я понял, что пора наконец сделать инструмент для удаления не используемых mailbox после удаления пользователей из базы e-mail. Раньше, не было в этом необходимости, но место стало поджимать и настало время разобраться. На помощь пришел bash. На нем я написал вот такой маленький скрипт.

#!/bin/sh

#########################################################################################
#   Created:      Zakharchenko Andrey Ruslanovich
#   Date:         2009.05.20
#   Description:  Поиск mailbox для удаленных почтовых ящиков из базы mysql.
#                      Производится поиск, архивирование в папку хранения и удаление.
#                      исходного mailbox
#########################################################################################

#--- объявляем переменные
i=0
domaindir="/var/files/mail"
mailolddir="/var/files/mailold"

#--- проверяем существование архивной папки
if ! test -d ${mailolddir}.
then
    mkdir ${mailolddir}
fi

#--- составляем листинг доменов
for domain in $( ls ${domaindir} ).
do
#--- создаем в архивной папке доменные папки
    if ! test -d ${mailolddir}/${domain}
    then
             mkdir ${mailolddir}/${domain}
    fi

#--- просматриваем содержимое доменных папок и ищем соответствие mailbox в mysql базе
    for email in $( ls ${domaindir}/${domain} )
    do
tmp=`mysql --user=root -p --database=mail-server --execute="select username.
                                                    from users where username='${email}' "
| awk '$1!="username"'`
#--- если пользователя нету в базе, то архивируем mailbox и удаляем исходную папку
             if test -z ${tmp}
             then
                 TMP=`let "i+=1"`
                 echo -e "Archiving item....  \t  domain: $domain mailbox: ${email}"
                 tar -jcf ${mailolddir}/${domain}/${email}.tar.bz2 ${domaindir}/${domain}/${email}
                 echo -e "Remove item.... \t domain: ${domain}, mailmox: ${email}"
                 rm -rdf ${domaindir}/${domain}/${email}
             fi
    done
done

echo -e "It is processed mail boxes \t $i"

#--- ищем архивные ящики которые хранятся больше полугода и удаляем их
find ${mailolddir} -not -newerct '11 week ago' -and -type f  -delete

От решил все необходимы мне задачи :) Так как порой какой-то невменяемы преподаватель появляется через пол года и просит ему по новой создать почтовый ящик и вернуть ему письма. Из-за этого я сначала архивирую mailbox, а только потом удаляю старый mailbox.

µTorrent и уравление через web

Сегодня запускал в организации в эксплуатацию новый безлимитный интернет канал. Так как в будни у нас практически нельзя ни чего делать важного, пришлось приехать в субботу. В итоге решил раз так пошло, сменить для всего вуза шлюз на новый. Он уже два месяца находится в тестовой эксплуатации. Его работа показала, что все отлично, и я принял решение, что сегодня заменю старый шлюз на новый находящийся в тестовой эксплуатации. В итоге, после всего сделанного, появился 8 Mbit безлимитный интернет канал. Читать далее…

Author: abigor Categories: Заметки Tags:

Парашют APC UPS для FreeBSD

Дошли таки у меня руки настроить парашют для своего шлюза настроенного на FreeBSD 7.1-RELEASE-p5. Мы в организации для серверов закупаем источники бесперебойного питания компании American Power Conversion. В основном у нас используются APC Smart-UPS 2200VA Rack Mount 2U USB. Так как у меня ядро уже было собрано с поддержкой USB, то просто проверим, что система увидела UPS подключенную через USB кабель. Читать далее…

Author: abigor Categories: Работа Tags:

Импорт DHCP списка.

Вот таким коротким кодом в одну строку сделал импорт всей резервации.

ForEach ($address in Get-Content dhcp-export.txt) { $tmp = $address.split("`t"); if ($tmp[0] -notmatch "^10\.1\.2\.") {`
netsh dhcp server \\10.1.1.39 scope 10.1.0.0 add reservedip $tmp[0] $tmp[4] $tmp[1]| Out-Null }}

Тут конечно нету ни чего героического. Разместил так, для себя чтоб не забыть.

MCP клуб.

30 Апрель 2009

Сегодня я стал участком MCP клуба Microsoft в городе Иркутск. MCP это аббревиатура от Microsoft Certified Professional (рус. Сертифицированный профессионал Microsoft). Я правда пока не являюсь таковым, но стремлюсь к этому. Грубо говоря это клуб по интересам, где делаются доклады по продуктам компании Microsoft. При чем докладчики не всегда являются сотрудниками MSFT. Здесь на оборот поощряется если докладчиком выступает член клуба. После доклада можно задавать вопросы докладчику, развивать дискуссии на интересующие темы среди коллег ножа и топора, тем самым повышая свой профессиональный уровень и уровень коллег. Для меня это было первым посещением этого клуба, а для клуба, это уже второй сбор. За это отдельное спасибо товарищу Дмитрию Воцке за создание данного клуба на технической базе компании ООО «Топ эксперт». Пока у меня только положительные эмоции от данного мероприятия. Жду последнего четверга месяца мая для посещения следующего MCP клуба.
Основатель данного движения Алексей Майоров подарил участникам клуба вот такой баннер чтобы была возможность показать свое причастие к движению.

Author: abigor Categories: Саморазвитие Tags:

Мой первый сертификат

30 Апрель 2009

Сегодня я получил свой первый сертификат в жизни удостоверяющий мои знания в сфере IT технологий. Получил я его проходя онлайн сертификацию на сайте RetraTech. Правда сразу хочу покается, сдал я его не с первого раза. Тест содержал некоторые вопросы с задачами, реализацию которых мне делать не приходилось. Будь то: «Как подмонтировать первую сессию на cd диске» и т.д. Так же балл сдачи то же не высок, конечно хотелось большего. А вообще опыт только положительный. Есть к чему стремиться так сказать.
Вот он мой первый сертификат:
«Системное администрирование FreeBSD»


Так же ради интереса сдал на «Пользователь ПК».


Тут я получил достаточно хорошую оценку, хотя конечно хотелось на оборот. Я думал, что больше знаю о работе FreeBSD. Так что буду углублять свои знания! :)
Если у кого есть желание поздравить, то принимаю поздравления в комментарии!

Author: abigor Categories: Саморазвитие Tags:

Ищем уволенных сотрудников в Active Directory через SQL базу

29 Апрель 2009

У меня в организации есть база данных в которой отображается вся миграция сотрудников внутри вуза. Из этой базы мы когда заводим сотруднику учетную запись в Active Directory в поле WebPage заносим ID пользователя. Так, что вот, родился скрипт чтоб вычистить всех уволенных пользователей. Пока он просто на консоль выводит информацию, чтоб инженер мог вручную все просмотреть и принять решение, но его легко можно модифицировать чтоб он сам блокировал/удалял учетную запись пользователя.

param ([switch]$show, [switch]$disable, [switch]$csv)
#########################################################################################
#   Created:      Zakharchenko Andrey Ruslanovich
#   Date:         2009.04.29
#   Description:  Поиск уволенных пользователей в Active Directory через запрос в
#                 к MS SQL серверу
#   Dependencies: Quest.ActiveRoles.ADManagement
#########################################################################################
$SQLServer = "SQLSERVER"
$DBName = "DB_SOTRUDNIC"
$i = 0
$text = "`n
`t Надо использовать следующий синтаксис скрипта:
`t -show        - Выводит информацию на консоль
`t -disable     - Отключает всех уволенных сотрудников
`t -csv         - Выводит информацию в формате для csv
`t------------------------------------------------------------------------------------
`t Пример:
`t ./search-delete-user-from-ad.ps1 -show "


if (!($show) -and !($disable) -and !($csv)) {write-warning $text; return}

$SQLConnection = new-object System.Data.SqlClient.SqlConnection("Initial Catalog=$DBName;Data Source=$SQLServer; `
                                Integrated Security=SSPI"
)
$SQLConnection.Open()
ForEach ($user in Get-QADUser -searchroot "OU=БГУЭП,DC=isea,DC=ru" -IncludedProperties WebPage,LastLogon,ParentContainer, `
                                whenchanged,LogonName,AccountIsDisabled -SizeLimit 0 ) {
    if ($user.webpage){
        if (!($user.webpage -match "^Q")) {
            $query = "SELECT TOP (1) регном FROM dbo.Customer WHERE регном = " + $user.WebPage + ""
            $SQLCommand = New-Object System.Data.SqlClient.SqlCommand($query, $SQLConnection)
            $SQLReader = $SQLCommand.ExecuteScalar()
            if (!$SQLReader) {
                if ($show) {
                    Write-Output "Name: $($user.DisplayName)"              
                    Write-Output "LogonName: $($user.LogonName)"           
                    Write-Output "WebPage: $($user.WebPage)"
                    Write-Output "AccountIsDisabled: $($user.AccountIsDisabled)"               
                    Write-Output "ParentContainer: $($user.ParentContainer)"
                    Write-Output "Whenchanged: $($user.whenchanged)"
                    Write-Output "LastLogon: $($user.LastLogon)"
                    Write-Output "-----------------------------------------------------------------------"
                }
                if ($disable) {
                    If ($user.AccountIsDisabled -eq $false) {
                        ($user).AccountIsDisabled = $true
                        ($user).CommitChanges()
                        Write-Output "Name: $($user.DisplayName) - Отключен"
                        Write-Output "AccountIsDisabled: $($user.AccountIsDisabled)"
                    }
                }
                if ($csv) {
                    $tmp = "" |Select-Object @{name='Name';expression={$($user.DisplayName)}},@{name='LogonName';expression={$($user.LogonName)}}, `
                    @{name='WebPage';expression={$($user.WebPage)}},@{name='AccountIsDisabled';expression={$($user.AccountIsDisabled)}}, `
                    @{name='ParentContainer';expression={$($user.ParentContainer)}},@{name='Whenchanged';expression={$($user.whenchanged)}}, `
                    @{name='LastLogon';expression={$($user.LastLogon)}}
                    Write-Output $tmp
                }
                $i++
            }
        }
    }
}

Write-Output "Итого пользователей: $($i)"
# Out-file -filepath "Пользователи к удалению.txt" -Encoding "Unicode"
$SQLConnection.Close()

mpd5 и настройка экспорта netflow

27 Апрель 2009

Несколько дней назад я написал заметку по установке mpd5 + freeradius2 + mysql. Сегодня я хочу рассказать о настройке экспорта детализированной статистики из mpd5 по средством netflow протокола. Раньше для этого дела надо было самостоятельно через утилиту ngctl самостоятельно создавать сенсоры и управлять ими через [up|down]-script скрипты. Сейчас же это можно сделать средствами самого mpd5. Для этого необходимо внести небольшие изменения в конфигурационный файл mpd5 и воспользоваться набором программ из пакета flow-tools для сброса/просмотра/импорта статистики. Читать далее…

Author: abigor Categories: Заметки, Работа Tags: , ,

mpd5 + freeradius2 + mysql

24 Апрель 2009

Когда-то в далеком 2007 году я разместил статью, о настройки связки mpd + freeradius + mysql на сайте комрада lissyara. Время шло, все работало отлично, выполняло весь необходимый мне функционал. Недавно потребовалось перенести эту связку на новый более мощный сервер. Решено было использовать последние версии используемых продуктов. mpd5 и freeradius2. Данные программные продукты очень изменили свой функционал и конфигурационные файлы, из-за этого я решил сделать набросок статьи. О том как это все дело заставить работать вмести :) .
Сразу хочу оговорить, я не буду писать о том, что надо открыть этот конфигурационный файл, найти какую-то строчку и поменять на другое значение. Мне это не надо, мне просто необходима заметка, что надо сделать, чтоб не забыть :) По этому я просто приведу diff разницу между исходным конфигурационным файлом и целевым. Читать далее…

Author: abigor Categories: Работа Tags: , ,

Virtualization WMI Provider

21 Апрель 2009

Сегодня я хочу попытаться объяснить как используя PowerShell, можно управлять ролью виртуализации Hyper-v. Пока я для себя вижу такую возможность только через WMI провайдер под названием Virtualization WMI Provider. Знакомство начнем с класса Msvm_ComputerSystem он нам позволит узнать информацию о хост машине и о ВМ созданных на этом сервере. Читать далее…