User Tools

Site Tools


Sidebar


Tags Cloud
start

Last updates

Настройка автоматических извещений о проблемах в SMART

Активация smartd
start_smartd=yes
smartd_opts="--interval=1800"
Отправка алертов

Системные сообщения от различных сервисов удобно слать на алиас.

mailcollector: [email protected]
Установленные диски

/dev/sda и /dev/sdb - типовые WD RE4 4TB накопители.
/dev/sdc - Intel 320 160GB SSD, у которого необходимо отслеживать атрибуты 232 (Available Reserved Space) и 233 (Media Wearout Indicator).

Обновление базы

Набор устройств постоянно модифицируется и дополняется.

# update-smart-drivedb
Конфигурация дисков для smartd
/dev/sda -a -s (S/../../(1|3|5)/01|L/../../6/23) -m mailcollector -M diminishing
/dev/sdb -a -s (S/../../(1|3|5)/01|L/../../6/23) -m mailcollector -M diminishing
/dev/sdc -a -r 233! -R 233! -r 232! -R 232! -s (S/../../(1|3|5)/01|L/../../6/23) -m mailcollector -M diminishing

Пояснение конфигурационного файла:

-a
  эквивалент
              -Hft -l error -l selftest -l selfteststs -C 197 -U 19
   где

    -H              check the SMART health status
    -f              report failures of Usage (rather than Prefail) Attributes
    -t              track changes in both Prefailure and Usage Attributes
    -l error        report increases in the number of ATA errors
    -l selftest     report increases in the number of Self-Test Log errors
    -l selfteststs  report changes of Self-Test execution status
    -C 197          report nonzero values of the current pending sector count
    -U 198          report nonzero values of the offline pending sector count

-s
  задает тип и расписание выполнения диагностических тестов в виде регулярного выражения.

  Например,
            -s (S/../../(1|3|5)/01|L/../../6/23)
   будет выполнять

  Short self-test каждые понедельник, среду, пятницу с 01 до 02 ночи
  Long self-test каждую субботу после 23 вечера

-m user
  указывает системный аккаунт, на который будут высылаться алерты.
  В данном примере mailcollector является алиасом.

-M behaviour
  модифицирует поведение и интенсивность отправки алертов.
  Флаг diminishing активирует регулярную отправку напоминаний,
  однако интервал (в днях) между напоминаниями будет постоянно увеличиваться: 1,2,4,8,16..N.

-r AttributeID[!]
  К normalized value, которое отслеживается по умолчанию, в отчеты добавляется и raw value атрибута.
  Если атрибут отмечен восклицательным знаком, то изменения в normalized value будут расценены как критические события.

-R AttributeID[!]
  Вместо normalized value начинает отслеживаться raw value атрибута.
  Ключ -R автоматически применяет ключ -r, а в отчеты добавляется normalized value.
  Если атрибут отмечен восклицательным знаком, то изменения в raw value будут расценены как критические события.
2014/11/25 18:13 · kyxap

Простейший скрипт бекапа MySQL

#!/usr/bin/env bash
#
# Daily backup mysql databases
# CLI args: none

#exit on error
set -e

LANG=C
PATH="/bin:/usr/sbin:/usr/bin:/sbin:/usr/local/bin:/usr/local/sbin"

DATE=$(date +%F)
BACKUP_DIR=/home/mysql_backups
DUMP_DIR=$BACKUP_DIR/dumps
LOG=$BACKUP_DIR/backup.log

DAYS=7
DB="all"
OPTS="--order-by-primary --add-drop-database"

#########################

print_error() { echo "$@"; write_log "[ERROR] $@"; exit 1; }
print_info()  { echo "$@"; write_log "[INFO] $@"; }
write_log()   { echo "`date -R -u` $@" >> $LOG; }

##########################

# check dir
[[ -d $DUMP_DIR ]] || mkdir -p $DUMP_DIR

# check permissions on backup dir
if PERMS=$(stat --format="%a" $BACKUP_DIR)
then
  # restore chmod
  [[ $PERMS -eq 700 ]] || chmod 700 $BACKUP_DIR
fi

# check binaries
[[ -f `which mysqldump 2>/dev/null` ]] && MYSQLDUMP=mysqldump || print_error "No mysqldump binary found in $PATH"
[[ -f `which mysql 2>/dev/null` ]] && MYSQL=mysql || print_error "No mysql binary found in $PATH"

# validate $DB and skip default dbs
[[ $DB == all ]] && DB=$(mysql -e 'show databases' | tail -n +2 | grep -v -E "^(information_schema|performance_schema)$")

# create dumps
for db in $DB
do
  # is db exist?
  if ! EXISTS=$($MYSQL -s -N -e "show databases" | tail -n +2 | grep -x $db)
  then
    print_info "No such database: $db"
    break
  fi

  DUMP_FILE=$DUMP_DIR/$DATE/$db.sql.gz
  # is dump exist?
  [[ -s $DUMP_FILE ]] || (
    # log
    print_info "Creating new: $DUMP_FILE"

    # mkdir
    mkdir -p $DUMP_DIR/$DATE

    # add --events to mysql db
    [[ $db == mysql ]] && OPTS+=" --events"

    # dump
    $MYSQLDUMP $OPTS $db | gzip -1 > $DUMP_FILE
  )
done

# remove dirs
if OUTDATED_DIRS=$(find $DUMP_DIR -maxdepth 1 -type d -mtime +$DAYS)
then
  for dir in $OUTDATED_DIRS
  do
    # log
    print_info "Deleting outdated: $dir"

    # rm
    [[ -d $dir ]] && rm -r "$dir" || print_error "Can't remove $dir"
  done
fi

2014/09/01 20:40 · kyxap

Преобразование строк/таблиц/колонок

#!/usr/bin/env bash

export LANG=C # must have

# 1-column to tabs-separated multicolumn
cat 1-col.txt | sort | column

# 1-column to spaces-separated multicolumn
cat 1-col.txt | sort | column | expand

# 1-column to string w/delimiter
cat 1-col.txt | sort | paste -sd:

# multicolumn to 1-column
cat multi-col-spaces.txt | xargs -n 1 | sort

# string w/delimiter to 1-column
cat 1-string-delim.txt | tr ':' '\n' | sort
2014/05/18 04:23 · kyxap

Docker

Создание базового all-in-one образа

Исходный скрипт для создания минимального образа
Добавляем необходимые приложения
include='iproute,iputils-ping,lsb-security,bash-completion,build-essential,debian-keyring,debian-archive-keyring,checkinstall,chkconfig,dselect,bzip2,cpio,p7zip,pbzip2,tar,unzip,pigz,zip,gzip,p7zip-full,xz-utils,lzma,lrzip,busybox,coreutils,fakeroot,less,locales,sed,dos2unix,mysqltuner,mytop,sqlite3,diffutils,gcc,gdb,libc6-dev,make,patch,strace,dnsutils,nano,vim,dosfstools,e2fsprogs,ext3grep,extundelete,fuse,lvm2,mdadm,ntfs-3g,parted,perl,python,ruby,uw-mailutils,aria2,arping,bridge-utils,curl,ethtool,fping,hostname,ipcalc,iperf,ipmitool,iproute,lftp,libwww-perl,mtr,netcat,openipmi,rsync,snmp,tcpdump,telnet,wget,whois,xinetd,alien,checkinstall,procps,psmisc,bash,bash-completion,dash,tcsh,zsh,bzr,cvs,git,mercurial,subversion,bc,chkconfig,cron,dmidecode,findutils,hdparm,htop,iotop,lm-sensors,logrotate,lsof,ntp,parallel,pciutils,pwgen,rsyslog,screen,tmux,usbutils,geoip-bin,geoip-database,links,chkrootkit,ebtables,iptables,nmap,rkhunter,unhide,monit,sysstat'
Создаем образ
./mkimage-debootstrap.sh pro-manage.net/debian wheezy http://mirrors.linode.com/debian/

Сохранение всех запущенных контейнеров

docker ps -a | tail -n+2 | awk '{print $1" "$2}' | xargs -n2

Создание образов для переноса

docker images | tail -n+2 | awk '{print $1}' | while read i; do docker save $i > $(echo $i | tr '/' '_').tar.gz; done

Восстановление образов

ls *.tar.gz | xargs -n1 docker load -i
2014/05/17 18:46 · kyxap

Скрипт добавления клиентского сертификата для OpenVPN

#!/usr/bin/env bash

# Usage: $0 with no args

set -e

PATH="/sbin:/bin:/usr/sbin:/usr/bin:/sbin:$PATH"
MAIL_TO='[email protected]'
SCRIPTS_DIR=/etc/openvpn/easy-rsa
ACCOUNTS_DIR=/etc/openvpn/KEYS

#####################################

function error_print
{
  echo "ERROR $1" 1>&2
  exit 1;
}

# read account
[[ -z $account ]] && echo -n "Provide account name to add: " || error_print "No account provided"
read account
[[ -z $account ]] && error_print "No account provided"

# cd scripts dir
[[ -d $SCRIPTS_DIR ]] && cd $SCRIPTS_DIR || error_print "No such dir $SCRIPTS_DIR"

# read vars
[[ -f vars ]] && source vars || error_print "No such file vars"

echo "Creating cert and key for $account"

# build key
[[ -x pkitool ]] && ./pkitool $account || error_print "No such file pkitool"

# make account dir
mkdir -p /etc/openvpn/KEYS/$account

# copy account cert & key
cp $SCRIPTS_DIR/keys/${account}.crt $SCRIPTS_DIR/keys/${account}.key $ACCOUNTS_DIR/$account/

# copy ca cert and tls key
cp $SCRIPTS_DIR/keys/ca.crt $SCRIPTS_DIR/keys/ta.key $ACCOUNTS_DIR/$account/

# generate ovpn config
cat > $ACCOUNTS_DIR/$account/${account}.ovpn << EOF
client
remote SERVER'S.EXTERNAL.IP
port 1194
proto tcp
dev tun
nobind
persist-key
persist-tun
ca ca.crt
cert ${account}.crt
key ${account}.key
tls-auth ta.key 1
cipher BF-CBC
#log-append /var/log/ovpn_$account.log
EOF

# remove old archive if exists
[[ -f $ACCOUNTS_DIR/${account}.zip ]] && rm -f $ACCOUNTS_DIR/${account}.zip

cd $ACCOUNTS_DIR

# creating archive
[[ -f `which zip 2>/dev/null` ]] && zip ${account}.zip -r $account

# sending email
[[ -f `which uuencode 2>/dev/null` ]] && uuencode ${account}.zip ${account}.zip | sendmail $MAIL_TO
2013/12/19 22:43 · kyxap

Включение vnc в Intel AMT через wsmancli на платформе Intel NUC D53427RKE

Предполагается что AMT изначально активирован через UEFI (CTRL+P при загрузке, все доступные опции в ENABLE), а так же в web-интерфейсе (https, port 16692) используется выделенный IP.
Единственный NIC обслуживает как плату AMT, так и сеть хоста. При этом вы НИКАК не можете получить доступ из хостовой системы к AMT: одно из многочисленных проявлений security модели Intel, которое невозможно обойти.
Включение VNC производится только со стороннего компьютера, через WS-Management API. Для работы с ним я использовал клиент wsmancli, который присутствует в репозитории Ubuntu, но отсутствует в Debian.
К сожалению, по прошествии полугода уже не могу вспомнить ключи, передаваемые MEI CLI для активации http-интерфейса, но могу сказать точно: предоставляемая Intel версия CLI не работает с ядрами от Debian Squeeze/Wheezy, а качество исходников требует множества правок, экспериментов с версиями gcc и веселых упражнений с флагами компилятора. В целом, активация VNC оказалась несколько нетривиальной задачей, т.к. на поддержку управления новыми версиями контроллера в Linux товарищи из Intel забили где-то в районе 2008-2009 года.

Для Debian Wheezy можно использовать следующий ubuntu-пакет и его зависимости:

Методом вдумчивого изучения документации к SDK AMT, был изготовлен следующий скрипт.
Основным затыком в процессе настройки стал пароль, который визуально соответствовал требованиям безопасности Intel и принимался API без ошибки - но настройки попросту не менялись.

It must be a strong password – exactly eight characters long, containing a capital letter, a lower case letter, a digit, and at least one 7-bit ASCII non alpha-numeric character above 32, (e.g. '!', '$', ';'). Note that “_” is considered alphanumeric. The password cannot contain the characters '"', ',', and ':'.

С описанием использованных параметров можно ознакомиться тут.

#!/usr/bin/env bash

CIM=http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2
AMT=http://intel.com/wbem/wscim/1/amt-schema/1
IPS=http://intel.com/wbem/wscim/1/ips-schema/1

# configure parameter
HOST=192.168.111.100
# admin password, defined through initial UEFI setup 
ADMIN_PW=yiexoob8Miup$
# password to access VNC remotely
VNC_PW=VaeZ1reu4aizi$

auth="-h $HOST -P 16992 -u admin -p $ADMIN_PW"

wsman put $IPS/IPS_KVMRedirectionSettingData $auth -k "SessionTimeout=10" -k "OptInPolicy=false" -k "RFBPassword=$VNC_PW" -k "Is5900PortEnabled=true" -k "RequestedState=2"

# DEBUG: track changes
#wsman get $IPS/IPS_KVMRedirectionSettingData $auth

2013/11/29 22:55 · kyxap

Копирование больших объемов данных в несколько потоков с помощью lftp

Примеры копирования при использовании авторизации по ssh-ключам.
Закрывающий слеш в пути к исходной директории обязателен.
Задание представляет из себя текстовый файл.

  • Выполнение задания
    lftp -f tasks.lftp

Примеры

  • Данные закачиваются с локального сервера на удаленный.
    open sftp://root:@192.168.111.83
    mirror -c -P10 -R --allow-chown /LOCAL_DIR/ /REMOTE_DIR
    exit
  • Данные скачиваются с удаленного сервера на локальный.
    open sftp://root:@192.168.111.83
    mirror -c -P10 --allow-chown /REMOTE_DIR/ /LOCAL_DIR
    exit

Копирование больших объемов данных с помощью rsync

rsync в один поток - ресурсоемкий и медленный процесс.
xargs позволит запустить несколько процессов копирования отдельных директорий, но это скажется на скорости работы дисков.
В целом, использовать для копирования lftp предпочтительнее.

  • Флаги, позволяющие ускорить процесс копирования:
    -W отключает просчет checksum
    --delay-updates выполнять синхронизацию ПОСЛЕ анализа, а не во время
    -e 'ssh -o "Compression no" -c arcfour' не использовать сжатие данных и минимизировать нагрузку на CPU
    --only-write-batch=file вместо синхронизации с удаленным сервером готовит бинарный апдейт для развертывания на удаленном сервере. Полезно при большом количестве мелких файлов.

Примеры

  • Полное копирование системы:
    rsync -aHAXv --progress --numeric-ids -e 'ssh -o "Compression no" -c arcfour' --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/media/*,/lost+found} /* [email protected]:/
2013/11/09 22:19 · kyxap
start.txt · Last modified: 2016/09/22 01:27 by kyxap