воскресенье, 17 января 2021 г.

Sendmail: анализ логов

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

#journalctl --since yesterday -u sendmail|grep ctladdr|grep Sent|awk -F: '{print $5}'|grep -Po 'ctladdr=<\K[^>]*' 

Это смотрим отправщиков писем.

#ls -al /var/mail/|awk '{printf("%-20s%s\n", $3,$5)}'

Это анализируем почтовые ящики.

#journalctl -u dovecot|grep pop3-login|egrep -v Disconnected|awk -F, '{print $1}'|awk -v RS='<' -v FS='>' 'NR>1{print $1}'

Это анализируем читателей писем.


sort|uniq -c|sort -nk1 такое добавляем в конец пайпа для сортировки вывода по числам в первом столбце.

awk '{sum+=$2} END {print $2}' такого типа команду добавляем в конец пайпа, чтоб просуммировать числа во втором столбце.

Ну и напоследок формат по умолчанию записи в журнал сендмейлом в случае если отсылка мыла произошла успешно (схематично):

Date Time MyServerName sm-mta[x]: 10HF0kYP020730: from=<g@g.org>, size=x, class=0, nrcpts=1, msgid=<xxx>, proto=ESMTPSA, daemon=MTA, relay=server.domen [x.x.x.x]
Date Time MeServerName sm-mta[x]: 10HF0kYP020730: to=<g2@g2.org>, ctladdr=<g@g.org> (1254/1498), delay=00:00:02, xdelay=00:00:02, mailer=esmtp, pri=120563, relay=x.net. [x.x.x.x], dsn=2.0.0, stat=Sent (ok dirdel)



 

 

четверг, 31 декабря 2020 г.

git: обобщенная схема команд

 

Наиболее частые команды:

git init
git add .
git rm file.txt
git rm --cached file.txt
git mv old_name new_name
git rm \*~

git config --global user.email "your@mail.address.org"
git config --global user.name "you_name"
git config --global --add https.proxy https://10.10.0.1:3128
git config --list
git config --global --unset http.proxy
git config --list | grep proxy

git commit -m "some comment"
git commit -am "commit with all changed files"
git remote add master  https://your_name@bitbucket.org/_/repository_name.git
git remote -v //To list the existing remotes
git push -f master master
git remote rm master

git status //делайте почаще эти команды
git status -s
git log

git reset --hard <hash>
git reset --hard origin/master

git branch
git checkout -b newbranch
git checkout newbranch
git merge newbranch (делать, если находимся на ветке master)

git diff
git diff --staged

воскресенье, 13 декабря 2020 г.

Основные команды для работы с пакетами в Debian

  • dpkg -i пакет.deb проинсаллировать пакет
  • dpkg -r пакет (без расширения  deb) удалить пакет, исключая файлы конфигурации
  • dpkg -P пакет (без расширения  deb)полностью удалить пакет
  • dpkg -l список всех проинсталлированных пакетов
  • dpkg -l пакет (без расширения  deb) вывод короткой информации про отдельный пакет
  • dpkg -L (без расширения  deb) вывод всех файлов проинсталлированных из данного пакета
  • dpkg -c пакет.deb список файлов в еще непроинсталлированном пакете
  • dpkg -S /path/to/file показывает какому пакету принадлежит файл
  • dpkg -p пакет (без расширения  deb) вывод детальной информации про отдельный пакет
  • dpkg -s пакет (без расширения  deb) проверяет, установлен ли пакет

суббота, 14 декабря 2019 г.

Бэкап на коленке: утилита expect

Задача: несколько серверов и один комп-архиватор, на котором нужно делать бекап "избранных" файлов. На каждом сервере создаем юзера archiver (ну или какой вам нравиться). В домашнем каталоге у него (на каждом  же сервере) создаем папочку  backup (ну или какое название вам нравиться другое). Также создаем скрипт, который кроном запускается с нужной периодичностью и пакует в эту папку нужный вам контент.
На компе-архиваторе создаем папку backups с подкаталогами у которых имена сопадают  с именами архивируемых серверов. Далее устанавливаем утилиту expect на компе-архиваторе и пишем скрипт такого содержания:

#!/usr/bin/expect -f
set ret [ catch {

array set user {
        server_1        archiver
        server_2        archiver
# etc
        server_n         archiver
}

#можно и без этого абзаца, но вдруг find на серверах находится в разных местах
array set find {
        server_1          /usr/bin/find
        server_2          /usr/bin/find
# etc
        server_n         /usr/bin/find
}

array set ips_passwords {
        server_1          password1 
        server_2          password2 
# etc
        server_n          passwordn
}

set timeout -1

send_user "backup is starting!...\n"
foreach keyip [array name ips_passwords] {
        #
        #Копируем периодические бэкапы на наш комп-архиватор
        spawn /usr/bin/scp $user($keyip)@$keyip:/home/$user($keyip)/backup/* /home/backuper/backups/$keyip
        match_max 100000
        expect  "*?assword*:"
        send -- "$ips_passwords($keyip)\r"
        send -- "\r"   
        expect eof
        #
        #Со следующим абзацем поосторожней. Удаляет в директории, где храняться
        #наши бэкапы файлы старше 5 дней.
        spawn /usr/bin/ssh $user($keyip)@$keyip $find($keyip) /home/$user($keyip)/backup -ctime +5 -exec /bin/rm \{\} \\\;
        match_max 100000
        expect "*?assword*:*"
        send -- "$ips_passwords($keyip)\r"
        send -- "\r"
        expect eof
}
send_user "backup had finished succesfully!\n"

} result ]

set fh [open /home/backuper/Desktop/expect-works w]
puts $fh "Code $ret, Message/Result $::result \n"
close $fh


Нюанс. Сделайте, если еще не делали, логин юзером archiver с вашего компа-архиватора через ssh на каждый сервер. Эту ситуацию (первая сессия ssh archiver@server_x) можно отработать и в скрипте, но тогда код усложниться. А нам нужна проcтота. Не так ли?