More .bashrc improvements

I need to see long path and host name. And not to lose command line space at the same time:

BOLD="\[$($TTY  && /usr/bin/tput bold)\]"
COLOR_BLACK="\[$($TTY  && /usr/bin/tput setaf 0)\]"
COLOR_RED="\[$($TTY  && /usr/bin/tput setaf 1)\]"
COLOR_GREEN="\[$($TTY  && /usr/bin/tput setaf 2)\]"
COLOR_YELLOW="\[$($TTY && /usr/bin/tput setaf 3)\]"
COLOR_BLUE="\[$($TTY  && /usr/bin/tput setaf 4)\]"
COLOR_MAGENTA="\[$($TTY  && /usr/bin/tput setaf 5)\]"
COLOR_CYAN="\[$($TTY  && /usr/bin/tput setaf 6)\]"
COLOR_WHITE="\[$($TTY  && /usr/bin/tput setaf 7)\]"
COLOR_GRAY="\[$($TTY  && /usr/bin/tput setaf 8)\]"
RESET="\[$($TTY  && /usr/bin/tput sgr0)\]"

function prompt_command  {     
    local TIMESTAMP="${BOLD}${COLOR_GRAY}\D{%d/%m %H:%M:%S}${RESET}"
    local CURPWD="${BOLD}${COLOR_BLUE}${PWD/#${HOME}/~}${RESET}"

    PS1=${PS1}"└─"${TIMESTAMP}${BOLD}"-> "



TOC and collapsible block samples

I am writing some tool for my daily work that produces fancy HTML page from RHEL, CentOS or Fedora log and config files, so it would be more easy to read them. Nothing special, just some bash scripts with sed, grep and awk that produce HTML with some CSS and JQuery.

  1. TOC I really liked: It’s very easy to use and implement, it just looking through the document for h1, h2, etc tags. Scope and what tags to look can be customized.
  2. Collapsible blocks sample:

May be it would be yet another “log2html” framework in the end.

How to sort messages log

If you need to sort out what is reporting to the /var/log/messages to array in case of Red Hat Enterprise Linux or Fedora, you need to do flowing manipulations:

  1. read log;
  2. get 5th column from the log, it’s daemon name;
  3. get rid of all digits, so the daemons with different PIDs would be counted as one;

1. get rid of all ‘/’ and replace ‘[’ and ‘]’ with ‘\[’ and ‘\]’ to keep things both readable and usable for future scripting;

  1. sort unique stuff.

in my case this gets look like:

cat /var/log/messages | awk '{ print $5 }'| sed 's/\[[0-9].*$//'|sed 's/\[/\\\[/g' | sed 's/\]/\\\]/g'| sed 's/://g' |sed 's/\///g' |sort -u``

the result is usable as array for example. My host’s result:


Not to forget useful vi and bash settings


alias opera=opera --disable-remote-fonts
alias grep='grep --color=auto'
alias unigrep='grep -P "[^\x00-\x7F]"'
alias mkdir="mkdir -p"
alias ls='ls -lh --color=auto'


set mouse=r
syntax enable
set tabstop=4
set softtabstop=4
set expandtab
set number
set cursorline
set hlsearch
set incsearch  
set showmatch
nmap <F1> <Esc>:set nonumber<cr>                                                                                                                                             
nmap <F2> <Esc>:set number<cr>
nmap <F5> <Esc>yy<cr>
nmap <F6> <Esc>p<cr>
nmap <F8> <Esc>dd<cr>
nmap <F10> <Esc>:wq!<cr>
nmap <F12> <Esc>:q!<cr>

Not sure about ‘number’ setting, if interferes with the clipboard annoyingly, so I can turn them off.

E-mail notification on every login

It’s useful sometimes to get notifications on every ssh login that is happen on the server (though, could be used to monitor logins made by other means). First method is based on the /etc/profile, but it should not be used because user can override it with setting own variables if home directory is writable for him. Most convenient is to use PAM, putting in the /etc/pam.d/sshd execution of the script that whould send the mail in the session section:

session optional seteuid  /usr/local/bin/

I would not recommend to set “required” here because the fail of the scrip should not be critical. The script just sends notification mail:

if [ "$PAM_TYPE" != "open_session" ]
	exit 0

    echo "User: $PAM_USER"
    echo "User: $PAM_TYPE"
    echo "Remote Host: $PAM_RHOST"
    echo "Service: $PAM_SERVICE"
    echo "TTY: $PAM_TTY"
    echo "Date: `date`"
    echo "Server: `uname -a`"
 } | mail -s "$PAM_SERVICE login on `hostname -s` for account $PAM_USER"

exit 0

Don’t forget to put +x permissions on it with:

chmod +x  /usr/local/bin/

Backuping mysql

Recently I have to backup mysql database on quite heavily loaded server and I wanted to make backup daily on one hand and I wanted them not to affect production on the other. DB size is more than 150 Gb, about 50k users daily.

First approach was ty try to simply run musqldump and see what would happen. Site was down right after the backup has begun. Then I have tried to nice the mysqldump with

/usr/bin/nice -n 10 ionice -c2 -n 7

The result was better, site was down at about 10% of the job. Next I add –single-transaction, that have solved about 95% of problems, still some time site was down, so I had to add -q option. The final command was:

/usr/bin/nice -n 10 ionice -c2 -n 7 /usr/bin/mysqldump --plugin-dir=/usr/lib/mysql/plugin --user=dbuser -h bd.lxc --port=3306 --all-databases --single-transaction -q|/bin/gzip >  /var/bcp/backup-db-`/bin/date -I`.sql.gz

Rsync backup speedup

Чтобы самому не забыть, запишу как надо зеркалировать NAS на NAS.

Итак, есть 2 штуки NAS’ов с ARM’ами и Linux’ами разной степени кастрированности на них. В моем случае это WD Sharespace и ZyXEL NSA221, оба с кастомными прошивками. Кастомные они, конечно, кастомные, но это не Gentoo и не Debian, где есть все, это просто пара репозиториев с пакетами неизвестно какого возраста и качества, а так же отрезанные к черту ненужные Твонки и т.п. На WD из коробки есть SSH и rsync, а на ZyXEL NSA221 их нет, так что для Зикселя очень актуален вот этот материал:

В чем проблема использовать rsync в лоб, через SSH, как это предусмотрено по умолчанию? В шифровании. Если для Core i3 это все не проблема, то для худосочного одноядерного ARM’a на 200 МГц triple DES становится доминирующей задачей и скорость зеркалирования падает до совершенно идиотских значений вроде 1.4 МБ/c. Переключение в arcfour увеличивает скорость примерно в 2 раза, что лучше, но все равно плохо. Метод шифрования “none” из SSH кто-то выпилил (подозреваю эманации Поттеринга), но подсказал, что rsyncd в отличие от rsync SSH не использует. Я все понимаю про безопасность, но шифрование при копировании в пределах одного свича нафиг не нужно.


на клиенте запускалась команда: rsync -e ‘ssh -p 22’ -av –delete root@ /i-data/8g6d1a87/public/ > log.rsync &


Конфигурация сервера-источника:

~ $ cat /etc/rsyncd.conf
log file = /var/log/rsyncd.log
transfer logging = true
path = /DataVolume/
uid = root
read only = yes
list = yes
comment = main directory
hosts allow =
auth users = bcp
secrets file = /etc/rsyncd.scrt

где /DataVolume/ – путь к зеркалируемому контенту.

~ $ cat /etc/rsyncd.scrt

просто логин+пароль.

Потом просто пускаем rsync –daemon.

Клиент запускается командой: rsync -av –delete bcp@ /i-data/8g6s1e67/public > log.rsync &

Пароль приходится вводить, так как эта сборка rsync не понимает опцию –secrets_file=/etc/rsyncd.scrt.

Все! Так как у моей сборки rsync в расчет скорости принимается время подсчета количества файлов in question (а их больше 90000000), то точно скорость не измерял, но явно больше 10 МБ/c, что уже приемлемо для жизни и дома.