среда, 26 июня 2013 г.

Вычищаем KDE из Ubuntu

Если вдруг стало неуютно с кедами.
Взято отсюда http://www.psychocats.net/ubuntu/pureubuntu и отредактировано после выставления в apt.conf
Debug::pkgProblemResolver "true";
Что бы не удаляло wine, abiword, gnupg и gstreamer.
# apt-get remove akonadi-facebook akregator amarok amarok-common amarok-utils apport-kde apturl-kde ark audiocd-kio bluedevil calligra-data calligra-libs colord-kde cryptsetup dolphin dragonplayer freespacenotifier  gstreamer0.10-qapt gtk2-engines-oxygen gtk3-engines-oxygen gwenview ibus-qt4 kaccessible kaddressbook kamera kamoso kate kcalc kde-base-artwork kde-baseapps-bin kde-baseapps-data kde-config-gtk-style kde-config-tablet kde-config-telepathy-accounts kde-config-touchpad kde-style-oxygen kde-telepathy kde-telepathy-approver kde-telepathy-auth-handler kde-telepathy-contact-list kde-telepathy-data kde-telepathy-filetransfer-handler kde-telepathy-integration-module kde-telepathy-minimal kde-telepathy-send-file kde-telepathy-text-ui kde-wallpapers-default kde-window-manager kde-window-manager-common kde-workspace kde-workspace-bin kde-workspace-data kde-workspace-kgreet-plugins kde-zeroconf kdegames-card-data kdegames-data kdegraphics-strigi-analyzer kdemultimedia-kio-plugins kdenetwork-filesharing kdepasswd kdepim-kresources kdepim-strigi-plugins kdesudo kexi khelpcenter4 kinfocenter klipper kmag kmail kmenuedit kmix kmousetool knotes konsole kontact korganizer kpat kppp krdc krita krita-data ksnapshot ksysguard ksysguardd ksystemlog ktorrent ktorrent-data kubuntu-default-settings kubuntu-desktop kubuntu-docs kubuntu-firefox-installer kubuntu-netbook-default-settings kubuntu-notification-helper kubuntu-web-shortcuts kvkbd kwalletmanager libaudiocdplugins4 libbluedevil1 libcalendarsupport4 libchm1 libcln6 libdebconf-kde0 libepub0 libeventviews4 libgpgme++2 libgps20 libgrantlee-core0 libgtlcore0.8 libgtlfragment0.8 libibus-qt1 libincidenceeditorsng4 libindicate-qt1 libkateinterfaces4 libkblog4 libkcompactdisc4 libkdcraw-data libkdecorations4abi1 libkdegames6 libkdepim4 libkdepimdbusinterfaces4 libkdgantt2 libkephal4abi1 libkexiv2-11 libkexiv2-data libkipi-data libkipi9 libkleo4 libkmanagesieve4 libkonq-common libkonq5-templates libkonq5abi1 libkontactinterface4 libkpgp4 libkrossui4 libksane-data libksane0 libkscreensaver5 libksgrd4 libksieve4 libksieveui4 libksignalplotter4 libktnef4 libktorrent-l10n libktpchat0 libkunitconversion4 libkwineffects1abi4 libkwinglutils1abi1 libkwinnvidiahack4 libkworkspace4abi2 liblastfm1 liblightdm-qt-2-0 libllvm3.0 libmailcommon4 libmailimporter4 libmessagecomposer4 libmessagecore4 libmessagelist4 libmessageviewer4 libmuonprivate1 libmygpo-qt1 libokularcore1abi1 libopenconnect2 libopenctl0.8 libopenjpeg2 libopenshiva0.8 libplasma-geolocation-interface4 libplasmaclock4abi3 libplasmagenericshell4 libpoppler-qt4-4 libprocesscore4abi1 libprocessui4a libqalculate5 libqalculate5-data libqca2-plugin-ossl libqgpgme1 libqimageblitz4 libqoauth1 libqtglib-2.0-0 libqtgstreamer-0.10-0 libqtgstreamerui-0.10-0 libqtscript4-core libqtscript4-gui libqtscript4-network libqtscript4-sql libqtscript4-uitools libqtscript4-xml libqtshiva0.1 libreoffice-kde libreoffice-style-oxygen libsolidcontrol4abi2 libsolidcontrolifaces4abi2 libspnav0 libsyndication4 libtag-extras1 libtaskmanager4abi3 libtelepathy-logger-qt4-1 libtelepathy-qt4-2 libtemplateparser4 libweather-ion6 libzip2 lightdm-kde-greeter muon muon-installer muon-notifier muon-updater okular okular-extra-backends oxygen-cursor-theme partitionmanager pinentry-gtk2 pinentry-qt4 plasma-dataengines-addons plasma-dataengines-workspace plasma-desktop plasma-netbook plasma-scriptengine-python plasma-widget-facebook plasma-widget-folderview plasma-widget-kimpanel plasma-widget-menubar plasma-widget-message-indicator plasma-widget-networkmanagement plasma-widget-telepathy-presence plasma-widgets-addons plasma-widgets-workspace plymouth-theme-kubuntu-logo plymouth-theme-kubuntu-text print-manager python-pyudev python3-pykde4 python3-pyqt4 python3-sip qapt-deb-installer quassel quassel-data rekonq skanlite software-properties-kde systemsettings tasks-icons ubuntu-release-upgrader-qt usb-creator-kde userconfig

суббота, 8 июня 2013 г.

Неработающие hotkey в Mate

У меня дома, если отваливается nfs/smb шара, то перестают работать хоткеи в Mate.
После долгих поисков, удалось найти такой баг:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=563592

И аналогичное решение для Mate:

$ mateconf-editor
выключаем /apps/gnome_settings_daemon/plugins/housekeeping/active

Перезапускаем mate и всё хорошо.

понедельник, 29 апреля 2013 г.

Блокируем w00tw00t сканы

На одном сервере появились вот такие вот подарки:

error.log

[Mon Apr 29 20:17:54 2013] [error] [client 50.63.136.60] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.test0:)
acess.log
50.63.136.60 - - [29/Apr/2013:20:17:54 +0200] "GET /w00tw00t.at.ISC.SANS.test0:) HTTP/1.1" 400 523 "-" "-"
Считаем
# grep "w00tw00t.at.ISC.SANS" /var/log/apache2/access.log | awk '{ print $1}' | sort | uniq -c
      1 42.121.99.77
     85 50.63.136.60
      3 81.161.248.17
      1 87.98.227.69
      3 94.23.26.88
Это привет от DFind Scanner и кулцацкеров.
Ну, Fail2ban нам поможет.
У меня UFW, так что

action.d/ufw-all.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = ufw insert 1 deny from
actionunban = ufw delete deny from
И сам банхаммер:

jail.conf
[apache-w00tw00t]
enabled  = true
port     = http,https
filter   = apache-w00tw00t
logpath  = /var/log/apache*/*error.log
maxretry = 3
bantime  = 86400
filter.d/apache-w00tw00t.conf
[Definition]
failregex = [[]client []] .*w00tw00t.at.ISC.SANS..*
ignoreregex =
И проверяем:
# fail2ban-regex /var/log/apache2/error.log /etc/fail2ban/filter.d/apache-w00tw00t.conf
...
Success, the total number of match is 98
...
Рестарт
# /etc/init.d/fail2ban restart
И вроде всё.

вторник, 26 февраля 2013 г.

Building Deluge 1.3.6

Я так долго ждал новой версии!

В репах нет, но видна новая версия в PPA

# add-apt-repository ppa:deluge-team/ppa
# apt-get update

Однако PPA меня огорчил

# apt-cache show deluge-gtk
Package: deluge-gtk
Source: deluge
Version: 1.3.5-1ubuntu4
Но тут http://ppa.launchpad.net/deluge-team/ppa/ubuntu/pool/main/d/deluge/ есть сорсы
root@antix-pc:/etc/apt# apt-cache showsrc deluge-gtk
Package: deluge
Binary: deluge-common, deluged, deluge-console, deluge-web, deluge-gtk, deluge, deluge-webui, deluge-torrent
Version: 1.3.6-0~quantal~ppa1

Так что, чего ждать
$ mkdir deluge136
$ cd deluge136
$ sudo apt-get build-dep deluge
$ apt-get source deluge
$ cd deluge-1.3.6/
$ debuild -us -uc -i -I
$ cd ..
$ sudo dpkg -i *.deb
Трям.

P.S. и похоже, что оно даже не виснет, в отличии от версии 1.3.5 из репозитория ;-)

вторник, 19 февраля 2013 г.

Обновление MediaWiki

Обновлял вики с версии 1,16 до 1,20,2

Сначала читаем Upgrading Guide

Потом страдаем:

1) как минимум юзеру надо права на дроп таблиц
2) будут плагины, которые просто морально устарели и не заработают
смотреть ерор лог апача
3) много плагинов придётся кропотливо обновлять и читать INSTALL/README (не, серёзно)
например
tar cjvf Variables.tar.bz2 Variables
rm -fr Variables
wget --content-disposition 'https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/Variables.git;a=snapshot;h=refs/heads/master;sf=tgz'
tar xvf Variables-master-8a5e73f.tar.gz
mv Variables-master-8a5e73f Variables
4) семантик вики надо обновлять в первую очередь, от неё зависят много других плагинов (у меня, по крайней мере)
5) лучше по отключать эти плагины, пока не обновишь семантик вики

Wget и тупые линки с редиректами

Иногда бывает так:

root@server:/var/www/wiki/extensions# wget 'https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/Variables.git;a=snapshot;h=refs/heads/master;sf=tgz'
...
2013-02-19 03:25:02 (18.2 MB/s) - `gitweb?p=mediawiki%2Fextensions%2FVariables.git;a=snapshot;h=refs%2Fheads%2Fmaster;sf=tgz' saved [10239/10239]

FAIL

И тогда, мы делает так:
root@server:/var/www/wiki/extensions# wget --content-disposition 'https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/Variables.git;a=snapshot;h=refs/heads/master;sf=tgz'
...
2013-02-19 03:27:10 (16.0 MB/s) - `Variables-master-8a5e73f.tar.gz' saved [10239/10239]

WIN!!!

вторник, 12 февраля 2013 г.

четверг, 7 февраля 2013 г.

RAID10 and ext4

После неудачного опыта использования zfs on linux, решили временно вернуться к чему-то более стабильному, но довольно быстрому.

Мой выбор пал на raid10 + ext4 с отключённым журналом.


Создавать можно и по дефолту, но есть рекомендации по подбору параметров для создания ФС - https://raid.wiki.kernel.org/index.php/RAID_setup#ext2.2C_ext3.2C_and_ext4

А ещё есть полезный калькулятор - http://busybox.net/~aldot/mkfs_stride.html
Пример для RAID10
# mdadm --create --verbose /dev/md0 --level=10  --raid-devices=4 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1
# mkfs.ext4 -b 4096 -E stride=128,stripe-width=256 -L RAID10 /dev/md0

Далее надо отключить журнал и подобрать параметры монтирования.

# tune2fs -o journal_data_writeback /dev/md0
# tune2fs -O ^has_journal /dev/md0
# e2fsck -f /dev/md0
# dumpe2fs /dev/md0 | more
# vim /etc/fstab
/dev/md0 /opt ext4 defaults,data=writeback,noatime,nodiratime 0 0


Полезные мелочи при создании Software RAID


Предположим, после авто деплоймента по шаблонному preseed файлу, надо добавить в RAID дополнительные диски:

Дополнительные винты разбиваем как основные (например добавляем sdc):
если MBR:
sfdisk -d /dev/sda | sfdisk /dev/sdc
если GPT:
sgdisk -R=/dev/sdc /dev/sda
sgdisk -G /dev/sdc
и добавляем их в массив
# partprobe
# mkswap /dev/sdc2
# mkswap /dev/sdd2
# sgdisk -t 3:fd00 /dev/sdd
# sgdisk -t 3:fd00 /dev/sdc
# mdadm /dev/md0 -a /dev/sdc3
# mdadm /dev/md0 -a /dev/sdd3
# mdadm -G /dev/md0 --raid-devices=4
Это актуально для RAID с чередованием (например - raid5).

Если массив уже создан как RAID1, а дисков больше чем 2, то лучший вариант сварить RAID10:
# mdadm --zero-superblock /dev/sda4
# mdadm --zero-superblock /dev/sdb4
# mdadm --zero-superblock /dev/sdc4
# mdadm --zero-superblock /dev/sdd4
# dd if=/dev/zero of=/dev/sda4 bs=512 count=100
# dd if=/dev/zero of=/dev/sdb4 bs=512 count=100
# dd if=/dev/zero of=/dev/sdc4 bs=512 count=100
# dd if=/dev/zero of=/dev/sdd4 bs=512 count=100
# mdadm --create --verbose /dev/md1 --level=10  --raid-devices=4 /dev/sda4 /dev/sdb4 /dev/sdc4 /dev/sdd4
# cat /proc/mdstat
# mdadm -D /dev/md1
# dd if=/dev/zero of=/dev/md1 bs=4M count=100
# mkfs.xfs /dev/md1



четверг, 31 января 2013 г.

Использование Proxy в APT

Всё в принципе просто, хотя тырнет информацией не блещет


$ cat /etc/apt/apt.conf.d/99proxy
Acquire::http
{
  Proxy "http://10.10.10.1:3128/";
  Proxy::ppa.launchpad.net "DIRECT";
}

Все репозитории, кроме тех, для которых прописано "DIRECT" - будут идти через прокси.

воскресенье, 13 января 2013 г.

Nagios NRPE and SELinux (or the tale of check_mount.pl)

После перехода одного клиента с RHEL6 на репозитоий от Scientific Linux 6 стали приходить нотификации от nagios - check_mount.pl отказывался видеть примонтированную шару, хотя она была и

# /usr/lib64/nagios/plugins/check_mount.pl -m /someshare
/someshare is mounted!
рапотровал что всё ok.

Однако 
# /usr/lib64/nagios/plugins/check_nrpe -H localhost -c check_mount
/someshare is not mounted!
валился.

Стал разбираться и нашёл причину - SELinux (ну кто бы сомневался).

Игры с restorecon не помогли. Возможно ребут с Relabeling помог бы (http://www.centos.org/docs/5/html/5.2/Deployment_Guide/sec-sel-fsrelabel.html), но перезагружать сервак не хотелось, да и просто fixfiles делать тоже не улыбалось.

Из несотыковок со старым сервером (там где ещё был чистый RHEL6) было
[root@new ~]# ps auxZ | grep nrpe|grep -v grep
unconfined_u:system_r:nrpe_t:s0 nrpe     23079  0.0  0.0  40944  1312 ?        Ss   Jan11   0:05 /usr/sbin/nrpe -c /etc/nagios/nrpe.cfg -d
[root@old ~]# ps auxZ | grep nrpe|grep -v grep
system_u:system_r:nrpe_t:s0     nrpe      1618  0.0  0.0  40888  1116 ?        Ss    2012   0:23 /usr/sbin/nrpe -c /etc/nagios/nrpe.cfg -d

Но ошибки в логах были про типы.

Поочерёдным разрешением был выведен полный лог:
type=AVC msg=audit(1357998818.538:612779): avc:  denied  { read open } for  pid=1779 comm="check_mount.pl" name="bash" dev=dm-0 ino=913934 scontext=unconfined_u:system_r:nagios_services_plugin_t:s0 tcontext=system_u:object_r:shell_exec_t:s0 tclass=file
type=AVC msg=audit(1357999043.623:612812): avc:  denied  { execute } for  pid=2450 comm="check_mount.pl" name="bash" dev=dm-0 ino=913934 scontext=unconfined_u:system_r:nagios_services_plugin_t:s0 tcontext=system_u:object_r:shell_exec_t:s0 tclass=file
type=AVC msg=audit(1357999147.645:612833): avc:  denied  { execute_no_trans } for  pid=2571 comm="check_mount.pl" path="/bin/bash" dev=dm-0 ino=913934 scontext=unconfined_u:system_r:nagios_services_plugin_t:s0 tcontext=system_u:object_r:shell_exec_t:s0 tclass=file
type=AVC msg=audit(1357999256.580:612863): avc:  denied  { getattr } for  pid=3124 comm="sh" path="/bin/bash" dev=dm-0 ino=913934 scontext=unconfined_u:system_r:nagios_services_plugin_t:s0 tcontext=system_u:object_r:shell_exec_t:s0 tclass=file
type=AVC msg=audit(1357999256.581:612864): avc:  denied  { execute } for  pid=3125 comm="sh" name="mount" dev=dm-0 ino=913990 scontext=unconfined_u:system_r:nagios_services_plugin_t:s0 tcontext=system_u:object_r:mount_exec_t:s0 tclass=file
type=AVC msg=audit(1357999256.581:612865): avc:  denied  { getattr } for  pid=3125 comm="sh" path="/bin/mount" dev=dm-0 ino=913990 scontext=unconfined_u:system_r:nagios_services_plugin_t:s0 tcontext=system_u:object_r:mount_exec_t:s0 tclass=file
type=AVC msg=audit(1357999256.581:612866): avc:  denied  { getattr } for  pid=3125 comm="sh" path="/bin/mount" dev=dm-0 ino=913990 scontext=unconfined_u:system_r:nagios_services_plugin_t:s0 tcontext=system_u:object_r:mount_exec_t:s0 tclass=file
type=AVC msg=audit(1357999376.586:612887): avc:  denied  { read open } for  pid=3252 comm="sh" name="mount" dev=dm-0 ino=913990 scontext=unconfined_u:system_r:nagios_services_plugin_t:s0 tcontext=system_u:object_r:mount_exec_t:s0 tclass=file
type=AVC msg=audit(1357999376.586:612888): avc:  denied  { read } for  pid=3252 comm="sh" name="mount" dev=dm-0 ino=913990 scontext=unconfined_u:system_r:nagios_services_plugin_t:s0 tcontext=system_u:object_r:mount_exec_t:s0 tclass=file
type=AVC msg=audit(1357999376.586:612889): avc:  denied  { read } for  pid=3252 comm="sh" name="mount" dev=dm-0 ino=913990 scontext=unconfined_u:system_r:nagios_services_plugin_t:s0 tcontext=system_u:object_r:mount_exec_t:s0 tclass=file
type=AVC msg=audit(1357999481.484:612914): avc:  denied  { execute_no_trans } for  pid=3626 comm="sh" path="/bin/mount" dev=dm-0 ino=913990 scontext=unconfined_u:system_r:nagios_services_plugin_t:s0 tcontext=system_u:object_r:mount_exec_t:s0 tclass=file
type=AVC msg=audit(1357999594.918:612928): avc:  denied  { setattr } for  pid=4172 comm="mount" name="mtab" dev=dm-0 ino=655655 scontext=unconfined_u:system_r:nagios_services_plugin_t:s0 tcontext=unconfined_u:object_r:etc_runtime_t:s0 tclass=file
Потом
cat nrpe|audit2allow -M nrpe
semodule -i nrpe.pp
(Кстати теперь audit2allow в пакете policycoreutils-python.)
И получаем такой модуль
# cat ~/nrpe.te
module nrpe 1.0;
require {
type shell_exec_t;
type etc_runtime_t;
type mount_exec_t;
type nagios_services_plugin_t;
class file { execute setattr read execute_no_trans getattr open };
}
#============= nagios_services_plugin_t ==============
allow nagios_services_plugin_t etc_runtime_t:file setattr;
#!!!! This avc is allowed in the current policy
allow nagios_services_plugin_t mount_exec_t:file { read execute open getattr execute_no_trans };
#!!!! This avc is allowed in the current policy
allow nagios_services_plugin_t shell_exec_t:file { read execute open getattr execute_no_trans };
 Ошибки пропали и nrpe заработал.

Хотя это не сказать что правильное решение. Вероятно После обновления поменялись политики, но опять же - разница в версиях минорна.

wget http://ftp.scientificlinux.org/linux/scientific/6x/SRPMS/vendor/selinux-policy-3.7.19-155.el6_3.14.src.rpm
wget http://ftp.redhat.com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS/selinux-policy-3.7.19-93.el6_1.2.src.rpm
rpm2cpio selinux-policy-3.7.19-93.el6_1.2.src.rpm | cpio -idmv
tar xvf serefpolicy-3.7.19.tgz
mv serefpolicy-3.7.19 serefpolicy-3.7.19_old
rm serefpolicy-3.7.19.tgz
rpm2cpio selinux-policy-3.7.19-155.el6_3.14.src.rpm | cpio -idmv
tar xvf serefpolicy-3.7.19.tgz
vimdiff  serefpolicy-3.7.19/policy/modules/services/nagios.te serefpolicy-3.7.19_old/policy/modules/services/nagios.te

И... И никакой разницы.

И тут приходит мысль - сервер то был ещё давно и ставил его не я.
Смотрим что есть у selinux
# semanage fcontext -l|grep nagios
и нет его
# rpm -q --whatprovides /usr/lib64/nagios/plugins/check_mount.pl
file /usr/lib64/nagios/plugins/check_mount.pl is not owned by any package
Файл не из репозитория и соответственно к нему нет политики.
И вот как оно работало раньше...

В общем, попробовав все типы для плагинов взятые из semanage "fcontext -l|grep nagios" я понял, что надо либо наследоваться от уже существующего типа и добавлять роли вроде mount_exec_t, либо просто установить тип nagios_unconfined_plugin_exec_t.
Лень взяла вверх:
semanage fcontext -a -s system_u -t nagios_unconfined_plugin_exec_t -f -- '/etc/nagios/plugins/check_mount.pl'
restorecon -v check_mount.pl
/usr/lib64/nagios/plugins/check_nrpe -H localhost -c check_mount
Выгружаем наш модуль
semodule -r nrpe
И проверяем
# /usr/lib64/nagios/plugins/check_nrpe -H localhost -c check_mount
/someshare is mounted!
Ну вот так получше.

Заодно написал автору коммент - http://binfalse.de/software/nagios/check_mount-pl/comment-page-1/#comment-417

четверг, 10 января 2013 г.

Resize LVM physical volume


Стандартная процедура, которая обычно не вызывает никаких проблем.
Однако иногда попадаются "интересные" таблицы разделов, из-за который приходится подумать.

Есть proxmox, а на нём виртуалка.

# qemu-img info vm-100-disk-1.qcow2
# qemu-img resize vm-100-disk-1.qcow2 +50G
# qm start 100
Заходим на виртуалку и видим
# fdisk -l /dev/vda
Disk /dev/vda: 182.5 GB, 182536110080 bytes
16 heads, 63 sectors/track, 353686 cylinders, total 356515840 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000df459
   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048      499711      248832   83  Linux
/dev/vda2          501758   251656191   125577217    5  Extended
/dev/vda5          501760   251656191   125577216   8e  Linux LVM
Разница между началом extended и первым logical - всего 2 сектора, при стандартных для fdisk - 2048. Ну и конец 1й партиции 499711, а начало второй - сразу 501758.

Ну вот мы как обычно делаем
1) удаляем старую партицию - d 5
2) создаём новую - n 5 - и тут видим, что начала свежесозданной партиции не будет совпадать с началом только что удалённой. фиаско.

Но всё на самом деле оказалось просто - надо было пересоздать ещё и extended.
И всё красиво подогналось - 501760-2048=499712.
   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048      499711      248832   83  Linux
/dev/vda2          499712   356515839   178008064    5  Extended
/dev/vda5          501760   356515839   178007040   8e  Linux LVM
Ну а дальше как обычно:

1) partprobe или ребут
2) pvs, vgs, lvs для проверки
3) pvresize /dev/vda5
4) lvresize main/opt -L+50g
5) umount /opt
6) e2fsck -f /dev/mapper/main-opt
7) resize2fs /dev/mapper/main-opt
8) mount /opt
9) df -h, pvs, vgs, lvs для проверки

Избранное сообщение

Запуск "Петька и Василий Иванович спасают галактику" в Linux через wine

Совсем недавно, почему-то вспомнил про серию "Петька и Василий Иванович". К своему удивлению, обнаружил, что первую и вторую част...