User Tools

Site Tools


Sidebar


Tags Cloud
start

Last updates

Простейший скрипт бекапа 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

Сборка пакета из исходников c помощью rpmbuild на примере Monit 5.6 под Centos 6.4

  1. Добавить юзера builder
  2. Установить yum install -y rpmdevtools pam-devel
  3. Зайти к builder в ~/
  4. Стянуть сюда же устаревший rpm с исходниками http://pkgs.repoforge.org/monit/monit-5.5-1.rf.src.rpm
  5. Проставить зависимости от SRPM: yum-builddep monit-5.5-1.rf.src.rpm
  6. Понизить привилегии до su - builder и войти в его $HOME. Все дальнейшие действия выполняются под пользователем.
  7. Создать build-окружение, запустив rpmdev-setuptree
  8. Установить пакет rpm -i monit-5.5-1.rf.src.rpm
  9. Изменить ~/rpmbuild/SPECS/monit.spec, в нем указываем Version: 5.6 и добавляем BuildRequires: pam-devel
  10. Стянуть в ~/rpmbuild/SOURCES обновленные исходники http://mmonit.com/monit/dist/monit-5.6.tar.gz
  11. Зайти в ~/rpmbuild/SPECS
  12. Скомпилировать обновленные до 5.6 пакеты: rpmbuild -ba monit.spec.
2013/11/07 07:59 · kyxap
start.txt · Last modified: 2016/09/22 01:27 by kyxap