tag:blogger.com,1999:blog-44357462244547438172024-03-14T02:05:57.803+03:00Oбрывки в скоросшивателеКлочки бумаги, на которых обычно ведутся записи, имеют обыкновение теряться, если их вовремя не подшить. Мысли на тему линукса, а может и не только его, - чтоб не забыть.Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.comBlogger109125tag:blogger.com,1999:blog-4435746224454743817.post-29958189092872920902019-11-29T10:18:00.000+03:002019-11-29T10:18:58.567+03:00Переехал на свой хост......так что продолжение тут: <a href="https://qiwichupa.net/c/obryvki">https://qiwichupa.net/c/obryvki</a>Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-34143005952334563892017-08-22T14:53:00.002+03:002017-08-22T14:53:37.928+03:00Использование снапшотов LVM как точки восстановления<div style="line-height: 100%; margin-bottom: 0cm;">
<i>Это вольный перевод найденного в инете комментария. В ubuntu синтаксис немного отличается в части указания названия томов, например не "<b>lvrename lvm root root-old"</b>, а "<b>lvrename /dev/lvm/root /dev/lvm/root-old</b>". В остальном все соответствует.</i></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Потребуется
несколько перезагрузок.
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Для начала
переименуем оригинальный root во что-то
новое, чтобы дать это имя снапшоту.:</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
# lvrename lvm root
root-old</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
# lvcreate -n root
-s lvm/root-old -L 10G</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Перезагрузимся,
чтобы «новый» root смонтировался и мы
могли произвести изменения. После этого
мы можем их протестировать, а также
вернуться к старой системе.</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
# lvrename lvm root
root-new</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
# lvrename lvm
root-old root</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
# reboot</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Если мы хотим
откатить изменения и вернуть все как
было, выполняем (из старой системы)</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
# lvremove
lvm/root-new</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
Если мы хотим
применить изменения, выполняем (из
старой истемы)</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
# lvconvert --merge
lvm/root-new</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
или из новой
системы</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
# lvrename lvm root
root-new</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
# lvconvert --merge
lvm/root-new</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
# lvrename lvm
root-old root</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
# reboot</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br />
</div>
<style type="text/css">
@page { margin: 2cm }
p { margin-bottom: 0.25cm; line-height: 120% }
a:link { so-language: zxx }
</style>
<br />
<div style="line-height: 100%; margin-bottom: 0cm;">
Система
откажется применять изменения на
открытых томах, так что мердж произойдет
во время загрузки.</div>
Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-71214740206905051202017-06-18T14:34:00.003+03:002017-06-18T14:35:03.467+03:00Тормозит Lightroom 5, неожиданное решениеДолгое время страдал от диких тормозов в лайтруме. Тормоза были при скроллинге фоток во вьювере, при их обработке - решительно во всех местах лайтрума, причем независимо от размера каталога. В инете можно нагуглить приличное количество решений проблемы - изменение размера кэша Camera RAW, или включение поддержки использования видеокарты (в какой-то версии лайтрума) - но все они мне не помогли.<br />
Совершенно неожиданно проблема таилась в совершенно неожиданном месте - в галочке "Использовать системное сглаживание шрифтов"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-hOy8yFaW3U4/WUZk6aHQGVI/AAAAAAAAZwA/GhEURkFO_Q4qD0thdQ3KHPd0oZXhzud6gCK4BGAYYCw/s1600/Screenshot_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://2.bp.blogspot.com/-hOy8yFaW3U4/WUZk6aHQGVI/AAAAAAAAZwA/GhEURkFO_Q4qD0thdQ3KHPd0oZXhzud6gCK4BGAYYCw/s400/Screenshot_1.png" width="347" /></a></div>
<br />
Невероятно, но факт - когда-то я видимо зачем-то снял эту галку и забыл о ней, и все это время страдал от тормозов, но после возвращения этой опции назад тормоза улетучились! Что это было - непонятно, но надеюсь кому-то эта галка поможет как и мне =))Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-44590750703486640012017-04-13T12:57:00.000+03:002017-04-13T12:57:13.671+03:00Как избавиться от вируса EIMG001.exe и NsCpuCNMiner32.exe в большой сетиЕсли в вашей большой корпоративной сети обнаружилась движуха с сабжевым вирусом, который расползся по компам, проще всего заблокировать его запуск через GPO - это позволит прекратить или как минимум ограничить его распространение.<br />
<br />
Для этого нужно иметь под рукой файлы вируса (большой самораспаковывающийся архив <b>EIMG001.exe</b> и файлы самого майнера, которые можно достать из него: <b>NsCpuCNMiner32.exe</b> и <b>NsCpuCNMiner64.exe</b>). Политика запрета будет выглядеть примерно так (кликабельно):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-XDehsIzEDdQ/WO9KYIDV-zI/AAAAAAAAZpQ/TduZr0dgacUgANeeR_iyVAyJZarkVQyTACK4B/s1600/puushscrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="260" src="https://3.bp.blogspot.com/-XDehsIzEDdQ/WO9KYIDV-zI/AAAAAAAAZpQ/TduZr0dgacUgANeeR_iyVAyJZarkVQyTACK4B/s400/puushscrot.png" width="400" /></a></div>
<br />
<br />
Указаны два варианта: через Software Restriction Policies, или Application Control Policies - оба в целом равноценны. В обоих случаях файлы можно добавлять по имени или по хэшу, предпочтителен второй вариант на случай попыток вируса переименовать исполняемые файлы.Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com4tag:blogger.com,1999:blog-4435746224454743817.post-44174972710753971592017-02-15T14:54:00.002+03:002017-02-16T13:59:12.361+03:00Как перенести Linux с одного mdamd-raid на другойСегодня я бы хотел поговорить о такой серьезной с точки зрения надежности вещи, как линуксовый софтварный рейд. А, вернее, показать, как можно спасти систему, которая требует замены дисков, на которых она и была установлена. Я рассмотрю 2 дистрибутива линукса - CentOS 7 и Debian 8 - которые будут поставлены в идентичные исходные условия. Также, так как тема мне кажется достойной лишней наглядности, помимо традиционных скриншотов и текста, в конце я оставлю ссылки на видео, в которых полностью показана вся процедура: от момента установки исходной системы, до восстановления ее работоспособности на новых дисках.<br />
<br />
<h2>
Общая часть: приготовление и восстановление бэкапа</h2>
<div>
В качестве исходной системы у нас Дебиан/Центось, установленные на один ext4-раздел, который зеркалится на 2 физических диска (скриншоты с центоси).</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-mif5aKHxPAs/WKMgrzkiNEI/AAAAAAAAZbU/8Vpz8WJlTT0wqG8wErPbDBekbFz7FFjlwCK4B/s1600/Screenshot_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://3.bp.blogspot.com/-mif5aKHxPAs/WKMgrzkiNEI/AAAAAAAAZbU/8Vpz8WJlTT0wqG8wErPbDBekbFz7FFjlwCK4B/s400/Screenshot_1.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Легким движением руки выдираем один из дисков, создавая деградацию рейда.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-T16doyxrt18/WKMhN7TLfAI/AAAAAAAAZbc/Gbq6gbwTKGMK4n4hihZ3WwSu1z6-zs5fQCK4B/s1600/Screenshot_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="88" src="https://4.bp.blogspot.com/-T16doyxrt18/WKMhN7TLfAI/AAAAAAAAZbc/Gbq6gbwTKGMK4n4hihZ3WwSu1z6-zs5fQCK4B/s400/Screenshot_2.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Время делать бэкап =)</div>
<div>
Конечно лучше если бэкап уже есть, но в нашем простом случае сделать бэкап также легко:<br />
<br />
<div id="preview" style="background-color: white; color: #333333; font-family: Verdana, Helvetica, Arial, sans-serif; margin: auto 1em; padding-bottom: 3em;">
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">tar -czpvf /mnt/backup.tgz --exclude<span style="color: #333333;">=</span>/dev --exclude<span style="color: #333333;">=</span>/proc --exclude<span style="color: #333333;">=</span>/sys --exclude<span style="color: #333333;">=</span>/mnt /
</pre>
</div>
</div>
</div>
Эта команда создаст сжатую копию всего корня, за исключением трех директорий содержимое которых регенерируется автоматически, и директории /mnt, в которой у нас в данном случае нет ничего, кроме файла бэкапа.<br />
<br />
Когда бэкап приготовился, гасим машину и устанавливаем 2 новых харда, которые составят новое зеркало. <br />
Также я использую убунтовый live cd "<a href="https://help.ubuntu.com/community/Boot-Repair">Boot-Repair</a>" для дальнейших операции, но, собственно, встроенной функцией автоматического восстановления пользоваться не буду. Так что на месте этого диска может быть любой другой Live CD, главное чтобы совпадала архитектура и были доступны утилиты mdadm, chroot, и parted (в моем случае он идет с GUI)<br />
<br />
Итак, теперь у нас есть машинка с тремя дисками: половинка бывшего рейда, от которой нам нужен только файл бэкапа; и два новых неотформатированных диска.<br />
<br />
После загрузки с лайва, закрываем все выплывающие окошки и открываем редактор разделов. <b>sda1</b> - бэкап, <b>sdb</b> и <b>sdc</b> - пустые<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-JXLY1kTpOkc/WKQuHGVjCbI/AAAAAAAAZb8/wrjgwQGI_W8U0Za6FsLC3eDbB-3MK9hGACK4B/s1600/puushscrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://2.bp.blogspot.com/-JXLY1kTpOkc/WKQuHGVjCbI/AAAAAAAAZb8/wrjgwQGI_W8U0Za6FsLC3eDbB-3MK9hGACK4B/s400/puushscrot.png" width="400" /></a></div>
<br />
На дисках <b>sdb</b> и <b>sdc</b> создаем таблицу разделов (<b>Device -> Create Partition Table</b>). Я использую GPT, потому что она подразумевает возможность использования разделов большого объема, а также создает дополнительные сложности для восстановления системы.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Xzr_Sc4Wd84/WKQu-tnws0I/AAAAAAAAZcI/4lgCYkFqIB4FqNCRudjDgIrFgIQr3dNjACK4B/s1600/puushscrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="191" src="https://1.bp.blogspot.com/-Xzr_Sc4Wd84/WKQu-tnws0I/AAAAAAAAZcI/4lgCYkFqIB4FqNCRudjDgIrFgIQr3dNjACK4B/s400/puushscrot.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
После создания таблицы, на обоих дисках создаем симметричную конфигурацию: 2 неотформатированных раздела - первый большой под систему, второй маленький (я оставил буквально 10 мегабайт в конце диска).</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<a href="http://3.bp.blogspot.com/-9Lvzcr7w3Ic/WKQvsOW80tI/AAAAAAAAZcU/ak5HYkdjvKMj1Zq2bWqFbmCHsYRTF4kPACK4B/s1600/puushscrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="136" src="https://3.bp.blogspot.com/-9Lvzcr7w3Ic/WKQvsOW80tI/AAAAAAAAZcU/ak5HYkdjvKMj1Zq2bWqFbmCHsYRTF4kPACK4B/s400/puushscrot.png" width="400" /></a><br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Второй раздел нужен для установки загрузчика GRUB2 на GPT. Также необходимо этим разделам добавить флаг. После применения разметки, нужно кликнуть правой мышкой по разделу, выбрать <b>Manage Flags</b> и отметить флаг <b>bios_grub</b>. Это необходимо сделать также на обоих новых дисках.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-PUPsTZXjv_0/WKQwjktoazI/AAAAAAAAZcg/3hz1dI0kZ08jTLTqPARMNdf0gajVchqpQCK4B/s1600/puushscrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="252" src="https://1.bp.blogspot.com/-PUPsTZXjv_0/WKQwjktoazI/AAAAAAAAZcg/3hz1dI0kZ08jTLTqPARMNdf0gajVchqpQCK4B/s400/puushscrot.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Теперь, когда разделы подготовлены, открываем терминал и первым делом я устанавливаю mdadm, так как его нет на этом Live CD.<br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;">1
2</pre>
</td><td><pre style="line-height: 125%; margin: 0;">sudo bash
apt install mdadm
</pre>
</td></tr>
</tbody></table>
</div>
<br />
<br />
<div>
Так как архив у нас лежит не на простом диске, а диске, который некогда был частью рейда, необходимо этот самый рейд обнаружить.<br />
<b><br /></b>
(<b>Warning!</b> Обратите внимание, что в результате выполнения первой команды, при восстановлении центоси создается устройство <b>/dev/md127</b>, а при восстановлении дебиана - <b>/dev/md0</b>. Нижеследующий блок справедлив для центоси)</div>
<div>
<br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;">1
2
3
4
5
6
7</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #888888;"># сканируем систему на наличие рейдов</span>
<span style="color: #888888;"># эта команда создаст устройство, в моем случае /dev/md127 - нашу </span>
<span style="color: #888888;"># половинку зеркала с бэкапом</span>
mdadm --assemble --scan
<span style="color: #888888;"># создаем папку /mnt/backup и монтируем в нее найденный рейд</span>
mkdir /mnt/backup
mount /dev/md127 /mnt/backup
</pre>
</td></tr>
</tbody></table>
</div>
</div>
<div>
<br />
Файлик бэкапа у нас в каталоге <b>/mnt/backup/mnt/</b>, теперь нужно приготовить новый рейд и залить на него бэкап.<br />
<br /></div>
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;"> 1
2
3
4
5
6
7
8
9
10
11
12
13</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #888888;"># создаем новое устройство рейда</span>
<span style="color: #888888;"># имя может быть любым незанятым, </span>
<span style="color: #888888;"># например /dev/md1</span>
<span style="color: #888888;"># --level=1 - зеркало</span>
<span style="color: #888888;"># --raid-devices=2 - 2 диска в рейде</span>
mdadm --create /dev/md1 --level<span style="color: #333333;">=</span>1 --raid-devices<span style="color: #333333;">=</span>2 /dev/sdb1 /dev/sdc1
<span style="color: #888888;"># форматируем новый рейд</span>
mkfs.ext4 /dev/md1
<span style="color: #888888;"># создаем директорию и монтируем рейд в нее</span>
mkdir /mnt/root
mount /dev/md1 /mnt/root
<span style="color: #888888;"># распаковываем архив </span>
tar -xpvf /mnt/backup/mnt/backup.tgz -C /mnt/root/
</pre>
</td></tr>
</tbody></table>
</div>
<br />
<div data-select-like-a-boss="1">
После распаковки нужно чрутнуться в корень восстанавливаемой системы.<br />
<br /></div>
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;"> 1
2
3
4
5
6
7
8
9
10
11</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #888888;"># создаем недостающие директории</span>
mkdir /mnt/root/dev
mkdir /mnt/root/proc
mkdir /mnt/root/sys
mkdir /mnt/root/mnt
<span style="color: #888888;"># к первым трем монтируем рабочие директории лайва</span>
mount -o <span style="color: #007020;">bind</span> /dev/ /mnt/root/dev/
mount -o <span style="color: #007020;">bind</span> /proc/ /mnt/root/proc/
mount -o <span style="color: #007020;">bind</span> /sys/ /mnt/root/sys/
<span style="color: #888888;"># чрутимся</span>
chroot /mnt/root/
</pre>
</td></tr>
</tbody></table>
</div>
<br />
С этого момента пути восстановления дебиана и центоси расходятся<br />
<br />
<h2>
Debian</h2>
<div>
После чрута выполняем команду </div>
<div>
<br /></div>
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">blkid
</pre>
</div>
<br />
Она покажет ID нашего рейда /dev/md1.<br />
<div data-select-like-a-boss="1">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-oSTu2_VaHCg/WKQ5543o3FI/AAAAAAAAZc4/sEW4Ezjh1G8Jr5gwQ-un2JLZl2pBVfyzACK4B/s1600/puushscrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="185" src="https://2.bp.blogspot.com/-oSTu2_VaHCg/WKQ5543o3FI/AAAAAAAAZc4/sEW4Ezjh1G8Jr5gwQ-un2JLZl2pBVfyzACK4B/s400/puushscrot.png" width="400" /></a></div>
<br />
Этот ID нужно прописать в /etc/fstab вместо имеющегося там.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-p9xCEPTN4e0/WKQ6Q4snLbI/AAAAAAAAZdA/hZoC0Ixfdd8D_XKCNB2nRIwISAQsI9cFACK4B/s1600/puushscrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="95" src="https://1.bp.blogspot.com/-p9xCEPTN4e0/WKQ6Q4snLbI/AAAAAAAAZdA/hZoC0Ixfdd8D_XKCNB2nRIwISAQsI9cFACK4B/s400/puushscrot.png" width="400" /></a></div>
<br />
Далее выполняем<br />
<br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;"> 1
2
3
4
5
6
7
8
9
10</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #888888;"># прописываем в конфиг данные актуального рейда</span>
mdadm --detail --scan | grep md1 > /etc/mdadm/mdadm.conf
<span style="color: #888888;"># пересобираем initrd</span>
update-initramfs -u
<span style="color: #888888;"># обновляем конфиг загрузчика</span>
update-grub2
<span style="color: #888888;"># устанавливаем загрузчик на оба </span>
<span style="color: #888888;"># физических диска</span>
grub-install /dev/sdb
grub-install /dev/sdc
</pre>
</td></tr>
</tbody></table>
</div>
<br />
Собственно всё. Вытаскиваем старые диски, отключаем сидиром, перезагружаемся и видим наш дебиан в целости и сохранности.<br />
<br />
<h2>
CentOS</h2>
<div>
С центосью возни чуть больше, чем с дебианом, но ненамного.</div>
<div>
После чрута правим <b>/etc/fstab</b>, заменяя айдишник корня на имя устройства. В нашем случае <b>/dev/md1</b><br />
(<b>Attention!</b> на картинках ниже везде используется <b>/dev/md0</b> - не обращайте внимания, просто я его так назвал во время экспериментов с центосью)</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-f40kIqkTiso/WKQ8tMCl5MI/AAAAAAAAZdQ/V5mufBreUK0CsGJkNKKXOp1nv6C_S1PtgCK4B/s1600/puushscrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="106" src="https://4.bp.blogspot.com/-f40kIqkTiso/WKQ8tMCl5MI/AAAAAAAAZdQ/V5mufBreUK0CsGJkNKKXOp1nv6C_S1PtgCK4B/s400/puushscrot.png" width="400" /></a></div>
<div>
<br /></div>
<div>
После этого правим <b>/etc/dracut.conf</b>, раскомментируем параметр <b>mdadmconf</b> и присвоим ему значение <b>yes</b>.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-iRiwHph-Ph0/WKQ9z31RkYI/AAAAAAAAZdc/MR9wtJKyatQVmnfR5Ns7MycFoEdnm3CdACK4B/s1600/puushscrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="310" src="https://3.bp.blogspot.com/-iRiwHph-Ph0/WKQ9z31RkYI/AAAAAAAAZdc/MR9wtJKyatQVmnfR5Ns7MycFoEdnm3CdACK4B/s400/puushscrot.png" width="400" /></a></div>
<div>
<br /></div>
<div>
Далее выполняем </div>
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">mdadm --detail --scan | grep md1
</pre>
</div>
<div>
<br />
Эта команда выдаст ID нашего нового рейда.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Lyhbg4vWNfM/WKQ_DodJbYI/AAAAAAAAZdo/1Th4w-M5ORQRWgt9FrInq-e6rWTfouOjgCK4B/s1600/puushscrot%2B%25281%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="21" src="https://2.bp.blogspot.com/-Lyhbg4vWNfM/WKQ_DodJbYI/AAAAAAAAZdo/1Th4w-M5ORQRWgt9FrInq-e6rWTfouOjgCK4B/s400/puushscrot%2B%25281%2529.png" width="400" /></a></div>
<br />
Этот ID нужно указать в файлике <b>/etc/default/grub</b> вместо старого<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-OgFdSDImA4c/WKQ_eOhriNI/AAAAAAAAZd0/WzNAt6vlsoILsa_zxlXAR-2y0bZU5vJrgCK4B/s1600/puushscrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="66" src="https://2.bp.blogspot.com/-OgFdSDImA4c/WKQ_eOhriNI/AAAAAAAAZd0/WzNAt6vlsoILsa_zxlXAR-2y0bZU5vJrgCK4B/s400/puushscrot.png" width="400" /></a></div>
<br />
Теперь<br />
<br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #888888;"># прописываем в конфиг данные актуального рейда</span>
mdadm --detail --scan | grep md1 > /etc/mdadm.conf
<span style="color: #888888;"># пересобираем initrd, </span>
<span style="color: #888888;"># смотрим на ВАШ файлик *.img в директории /boot </span>
<span style="color: #888888;"># и меняем версию по аналогии, если она отлична от моей</span>
dracut /boot/initramfs-3.10.0-514.el7.x86_64.img 3.10.0-514.el7.x86_64 --force
<span style="color: #888888;"># обновляем конфиг загрузчика</span>
grub2-mkconfig -o /boot/grub2/grub.conf
<span style="color: #888888;"># устанавливаем загрузчик на оба </span>
<span style="color: #888888;"># физических диска</span>
grub2-install /dev/sdb
grub2-install /dev/sdc
<span style="color: #888888;"># создаем специальный файлик, без которого магии не случится</span>
touch /.autorelabel
</pre>
</td></tr>
</tbody></table>
</div>
<br />
Перезагружаемся (один раз система перезагрузится автоматически - это нормально) и радуемся ожившей системе.<br />
<br />
<h2>
Вот и сказке конец</h2>
Обещанное в начале видео:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/wfnSiiQohy0/0.jpg" src="https://www.youtube.com/embed/wfnSiiQohy0?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/ASXpSCFecAI/0.jpg" src="https://www.youtube.com/embed/ASXpSCFecAI?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br /></div>
Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-2739212966688215882017-01-27T11:08:00.000+03:002017-01-27T11:08:08.686+03:00Abaqus: Unable to validate FLEXnet serverНа днях с коллегой столкнулись с проблемой при установке abaqus, на которую потратили бессовестно много времени. Ошибка возникала при указании сервера лицензий (FlexLM) и в сокращенном виде звучала как "Unable to validate FLEXnet server".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Gqni9g1hSxg/WIr7OTpc_OI/AAAAAAAAZXU/j59WXh6fB50JCLel9oXh6yOyUjRcZXLEACK4B/s1600/puushscrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="260" src="https://2.bp.blogspot.com/-Gqni9g1hSxg/WIr7OTpc_OI/AAAAAAAAZXU/j59WXh6fB50JCLel9oXh6yOyUjRcZXLEACK4B/s400/puushscrot.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Сервер лицензий при этом исправно работал, пинговался и, в целом, не показывал хоть сколько-нибудь адекватных предпосылок для такого облома. К несчастью выгуглить реальную причину так и не удалось ("Technical details" инсталлятора оказались бесполезны), попытки обновить сервер до последней версии к успеху не привели, а причина оказалась довольно проста. Выяснить ее удалось, установив рядом с абакусом сервер лицензий (но без запуска).</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
В составе сервера лицензий идет утилита, которая позволяет опрашивать сервера лицензий. Для начала мы стукнулись в сервер по айпишнику.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /><a href="http://4.bp.blogspot.com/-kKRdWJLh5h4/WIr91_hILaI/AAAAAAAAZXs/hKHrvbHJrxEwrcVmMi5BCJM2MXelYz2_QCK4B/s1600/puushscrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="57" src="https://4.bp.blogspot.com/-kKRdWJLh5h4/WIr91_hILaI/AAAAAAAAZXs/hKHrvbHJrxEwrcVmMi5BCJM2MXelYz2_QCK4B/s400/puushscrot.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
А потом, добавив в hosts имя сервера лицензий (в нашем случае мы работаем с айпишниками), повторили запрос но уже подставив это имя. И о чудо - утилита выдала в консоль список доступных лицензий. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Оказалось, что FlexLM крайне щепетильно относится к запросам клиентов, и требует чтобы запрос шел или по имени, или по айпишнику, и зависит это от того, что написано в файлике с лицензией! В нашем случае там было указано имя сервера, поэтому при попытке обратиться по IP - сервер считал что спрашивают, возможно, кого-то другого =) Исправить проблему оказалось довольно просто - всего-то нужно поменять имя на IP в первой строке файла лицензий. Можно было бы обращаться к серверу по имени - в большинстве случаев это вообще более правильный подход, но в конкретно нашем случае первый вариант был много проще.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="http://3.bp.blogspot.com/-DV7gUPMEoLE/WIr9JHpu_1I/AAAAAAAAZXg/1f7UzU92pOMQBYurKKa8dAS_vhOV7M9cwCK4B/s1600/puushscrot.png" imageanchor="1"><img border="0" src="https://3.bp.blogspot.com/-DV7gUPMEoLE/WIr9JHpu_1I/AAAAAAAAZXg/1f7UzU92pOMQBYurKKa8dAS_vhOV7M9cwCK4B/s1600/puushscrot.png" /></a></div>
<br />Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-11949676719379266492016-10-28T11:18:00.000+03:002018-03-20T10:40:44.038+03:00Как сменить заголовок (dash) стрима на сервисе restream.io с помощью скрипта.Сервис restream.io позволяет не только разливать стримы на несколько стрим-сервисов, но и централизованно управлять заголовками (дашами, по терминологии твича) на таких сервисах как Twitch или Youtube.<br />
<br />
К сожалению разработчики не предоставили никакого апи для этого, так что пришлось заколхозить скрипт, который логинится на сайт и имитирует ручной ввод. Опять таки к сожалению форма ввода даша выполнена на JS, что усложнило заскриптовывание. К счастью, при помощи хромиума и модуля selenium для питона удалось написать скрипт, который делает все что нужно, при том - на безиксовом сервере.<br />
<br />
Актуальная версия тут: <a href="https://github.com/qiwichupa/restream.io_title_change">https://github.com/qiwichupa/restream.io_title_change</a>Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-51195775272456366742016-10-25T14:12:00.000+03:002017-05-27T17:57:34.228+03:00Очистка временных папок во всех профилях терминального сервераНе обязательно терминального и вообще сервера, но скрипт набросал именно для этой задачи. Не самый оптимальный вариант, но решение вышло вполне себе рабочим и надежным.<br />
<br />
<br />
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><table><tr><td><pre style="margin: 0; line-height: 125%"> 1
2
3
4
5
6
7
8
9
10
11
12</pre></td><td><pre style="margin: 0; line-height: 125%"><span style="color: #007020">Get-ChildItem</span> -Path <span style="background-color: #fff0f0">'C:\Documents and Settings'</span> -Force `
| <span style="color: #008800; font-weight: bold">foreach</span> { <span style="color: #996633">$profilePath</span> = <span style="color: #996633">$_</span>.Fullname
<span style="color: #996633">$path</span> = <span style="color: #996633">$profilePath</span> + <span style="background-color: #fff0f0">"\\Local Settings\\Temp\\"</span>
<span style="color: #007020">Get-ChildItem</span> -Path <span style="color: #996633">$path</span> -Force | <span style="color: #008800; font-weight: bold">foreach</span> {<span style="color: #996633">$_</span>.FullName
<span style="color: #007020">Remove-Item</span> <span style="color: #996633">$_</span>.FullName -Recurse -Force
}
<span style="color: #996633">$path</span> = <span style="color: #996633">$profilePath</span> + <span style="background-color: #fff0f0">"\\Local Settings\\Temporary Internet Files\\"</span>
<span style="color: #007020">Get-ChildItem</span> -Path <span style="color: #996633">$path</span> -Force | <span style="color: #008800; font-weight: bold">foreach</span> {<span style="color: #996633">$_</span>.FullName
<span style="color: #007020">Remove-Item</span> <span style="color: #996633">$_</span>.FullName -Recurse -Force
}
}
</pre></td></tr></table></div>
Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-8065139228360876662016-09-12T12:39:00.000+03:002016-09-12T12:39:13.104+03:00Proxmox и SMB/CIFS-хранилище<a href="http://3.bp.blogspot.com/-4K8CTAyqFR8/V9Z23GaCpKI/AAAAAAAAYrk/-2LtSbQOWEkM3G3PuRbyLPc5_RxpKDNewCK4B/s1600/2707011_orig.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="65" src="https://3.bp.blogspot.com/-4K8CTAyqFR8/V9Z23GaCpKI/AAAAAAAAYrk/-2LtSbQOWEkM3G3PuRbyLPc5_RxpKDNewCK4B/s200/2707011_orig.png" width="200" /></a><br />
<div data-select-like-a-boss="1">
Использую Proxmox дома и столкнулся с неприятной проблемой - при бэкапе относительно больших (несколько гиг) виртуалок на сетевую хранилку (бомжовый QNAP), подключенную по NFS, Proxmox затыкался и повисал вхлам. Вероятно в этом виновата хранилка, возможно, не очень тянущая NFS, может быть в проксмоксе с этим какие-то проблемы, но я решил что пусть оно работает через самбу. Делать перманентное подключение не хотелось, так что я воспользовался autofs, которая неплохо зарекомендовала себя на моем ноуте.</div>
<br />
Итак, ставим autofs на сервер проксмокса<br />
<span style="font-family: Courier New, Courier, monospace;"><b>aptitude install autofs</b></span><br />
<br />
Создаем корневую папку для шар<br />
<span style="font-family: Courier New, Courier, monospace;"><b>mkdir /mnt/autofs</b></span><br />
<br />
Редактируем /etc/auto.master, добавляя строку<br />
<span style="font-family: Courier New, Courier, monospace;"><b>/mnt/autofs /etc/auto.smb --timeout=300</b></span><br />
<br />
Рестартим сервис<br />
<span style="font-family: Courier New, Courier, monospace;"><b>/etc/init.d/autofs restart</b></span><br />
<br />
Тут надо сказать что это очень упрощенный подход без использования логина и пароля (моя шара домашняя и открыта для всех), и без указания конкретной шары. После всего проделанного, через корень /mnt/autofs будет доступно все сетевое окружение. Например мой NAS имеет IP 192.168.1.2 и шару Public, и я могу теперь обратиться к ней: <br />
<span style="font-family: Courier New, Courier, monospace;"><b>ls /mnt/autofs/192.168.1.2/Public</b></span><br />
<br />
Далее все просто. Создаем папку для проксмокса<br />
<span style="font-family: Courier New, Courier, monospace;"><b>mkdir /mnt/autofs/192.168.1.2/Public/proxmox</b></span><br />
<br />
Добавляем эту папку в стораджи как локальную директорию.<br />
<br />
<a href="http://2.bp.blogspot.com/-3MXfVvK1cVU/V9Z2-2Guz4I/AAAAAAAAYrs/XR_3cGlQw4QVOrekO9JT5RJR7NUJ3RVoACK4B/s1600/f32.png" imageanchor="1"><img border="0" src="https://2.bp.blogspot.com/-3MXfVvK1cVU/V9Z2-2Guz4I/AAAAAAAAYrs/XR_3cGlQw4QVOrekO9JT5RJR7NUJ3RVoACK4B/s1600/f32.png" /></a><br />
<br />
Такой метод вполне подходит для хранения бэкапов, темплейтов и исошников.Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-90175939043646412682016-09-08T11:19:00.000+03:002016-09-08T11:24:41.856+03:00Бэкап всех баз MySQL с ротацией (удалением старых) бэкаповСкрипт делает дампы всех БД сервера, сохраняя в папки именованные по дате и времени создания. Сохраняются последние N (переменная $BACKUPS) бэкапов.
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><table><tr><td><pre style="margin: 0; line-height: 125%"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22</pre></td><td><pre style="margin: 0; line-height: 125%"><span style="color: #888888"># Optional variables for a backup script</span>
<span style="color: #336699">MYSQL_USER</span>=<span style="color: #dd2200; background-color: #fff0f0">"root"</span>
<span style="color: #336699">MYSQL_PASS</span>=<span style="color: #dd2200; background-color: #fff0f0">"password"</span>
<span style="color: #336699">BACKUP_ROOT</span>=/var/backups/mysql;
<span style="color: #336699">BACKUPS</span>=2;
<span style="color: #336699">BACKUP_DIR</span>=<span style="color: #dd2200; background-color: #fff0f0">"$BACKUP_ROOT/$(date +%Y-%m-%dT%H_%M_%S)"</span>;
<span style="color: #888888"># Create folders</span>
<span style="color: #003388">test</span> -d <span style="color: #dd2200; background-color: #fff0f0">"$BACKUP_DIR"</span> || mkdir -p <span style="color: #dd2200; background-color: #fff0f0">"$BACKUP_DIR"</span>
<span style="color: #888888"># Get the database list, exclude information_schema</span>
<span style="color: #008800; font-weight: bold">for </span>db in <span style="color: #008800; font-weight: bold">$(</span>mysql -B -s -u <span style="color: #336699">$MYSQL_USER</span> --password=<span style="color: #336699">$MYSQL_PASS</span> -e <span style="color: #dd2200; background-color: #fff0f0">'show databases'</span> | grep -v information_schema<span style="color: #008800; font-weight: bold">)</span>
<span style="color: #008800; font-weight: bold">do</span>
<span style="color: #888888"># dump each database in a separate file</span>
mysqldump -u <span style="color: #336699">$MYSQL_USER</span> --password=<span style="color: #336699">$MYSQL_PASS</span> <span style="color: #dd2200; background-color: #fff0f0">"$db"</span> | gzip > <span style="color: #dd2200; background-color: #fff0f0">"$BACKUP_DIR/$db.sql.gz"</span>
<span style="color: #008800; font-weight: bold">done</span>
<span style="color: #888888"># backup cleanup</span>
ls <span style="color: #dd2200; background-color: #fff0f0">"$BACKUP_ROOT"</span> <span style="color: #0044dd; background-color: #fff0f0">\</span>
| head -n<span style="color: #008800; font-weight: bold">$(</span>expr <span style="color: #008800; font-weight: bold">$(</span>ls <span style="color: #dd2200; background-color: #fff0f0">"$BACKUP_ROOT"</span> | wc -l<span style="color: #008800; font-weight: bold">)</span> - <span style="color: #336699">$BACKUPS</span><span style="color: #008800; font-weight: bold">)</span> <span style="color: #0044dd; background-color: #fff0f0">\</span>
| <span style="color: #008800; font-weight: bold">while </span><span style="color: #003388">read </span>in;
<span style="color: #008800; font-weight: bold">do </span>rm -rf <span style="color: #dd2200; background-color: #fff0f0">"$BACKUP_ROOT/$in"</span>;
<span style="color: #008800; font-weight: bold">done</span>
</pre></td></tr></table></div>
Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-74035002286222333632016-09-03T17:21:00.003+03:002016-09-03T17:21:49.445+03:00Aimp: database disk image is malformedПри возникновении такой ошибки стоит проверить файлы баз данных, которые использует AIMP. Они расположены в папке профиля: <b>%appdata%\AIMP</b> и немногочисленных подпапках.<div>
Файлы баз имеют расширение <b>*.db</b>, проверить их можно утилитами для работы с sqlite, например: <a href="https://github.com/sqlitebrowser/sqlitebrowser/releases">SqliteBrowser</a></div>
<div>
Поврежденный файл можно просто удалить, если не удается его восстановить. При этом, конечно, в зависимости от файла может потеряться часть настроек - например обнулится медиатека.</div>
Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-61587598027144257632016-08-03T15:22:00.000+03:002016-08-05T11:52:10.688+03:00Поиск живых компьютеров в Active Directory<a href="http://4.bp.blogspot.com/-QyaxlxOzEc0/V6Hh0SYLQ4I/AAAAAAAAYOQ/YkfDF-kHLpY6Il4ujCMjGmMz_HDe97-UQCK4B/s1600/IC816884.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="20" src="https://4.bp.blogspot.com/-QyaxlxOzEc0/V6Hh0SYLQ4I/AAAAAAAAYOQ/YkfDF-kHLpY6Il4ujCMjGmMz_HDe97-UQCK4B/s200/IC816884.png" width="30" /></a>Скрипт для поиска компов, которые меняли свой внутренний пароль в AD в течение последних трех дней:<!-- HTML generated using hilite.me --><br />
<br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;">1
2
3
4
5
6
7
8
9</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #003388;">Import-Module</span> ActiveDirectory
<span style="color: #336699;">$lastCheckDays</span> = 3
<span style="color: #336699;">$filter</span> = (<span style="color: #003388;">get-date</span>).AddDays(-<span style="color: #336699;">$lastCheckDays</span>).ToString(<span style="background-color: #fff0f0; color: #dd2200;">"dd/MM/yyyy"</span>)
<span style="color: #003388;">get-adcomputer</span> `
-filter <span style="background-color: #fff0f0; color: #dd2200;">"Passwordlastset -gt '$filter'"</span> `
-properties * `
| Select name,passwordlastset,OperatingSystem
</pre>
</td></tr>
</tbody></table>
</div>
<br />
Выполнять лучше на контроллере соответствующего домена
<br />
<br />
Если требуется собрать и свести в один файл информацию о комьютерах из разных доменов, можно использовать такой скрипт
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #003388;">Import-Module</span> ActiveDirectory
<span style="color: #336699;">$tempfile</span> = <span style="background-color: #fff0f0; color: #dd2200;">'c:\temp\comp.csv.temp'</span>
<span style="color: #336699;">$resultfile</span> = <span style="background-color: #fff0f0; color: #dd2200;">'c:\temp\comp.csv'</span>
<span style="color: #008800; font-weight: bold;">function</span> DoDomain(<span style="color: #336699;">$dc</span>)
{
<span style="color: #336699;">$lastCheckDays</span> = 30 <span style="color: #888888;"># Максимум дней с обновления пароля</span>
<span style="color: #336699;">$filter</span> = (<span style="color: #003388;">get-date</span>).AddDays(-<span style="color: #336699;">$lastCheckDays</span>).ToString(<span style="background-color: #fff0f0; color: #dd2200;">"dd/MM/yyyy"</span>)
<span style="color: #336699;">$error</span>.clear()
<span style="color: #008800; font-weight: bold;">try</span> {<span style="color: #003388;">Get-ADDomain</span> -server <span style="background-color: #fff0f0; color: #dd2200;">"$dc"</span> | <span style="color: #003388;">Out-Null</span> } <span style="color: #888888;"># проверка доступности контроллера</span>
<span style="color: #008800; font-weight: bold;">catch</span> {<span style="background-color: #fff0f0; color: #dd2200;">"[Error] $dc"</span> }
<span style="color: #008800; font-weight: bold;">if</span> (!<span style="color: #336699;">$error</span>){ <span style="color: #888888;"># если контроллер доступен - понеслась...</span>
<span style="color: #888888;"># Вытаскиваем список живых компов, </span>
<span style="color: #888888;"># экспортируем во временный файл, вырезая заголовки</span>
<span style="color: #003388;">get-adcomputer</span> `
-filter <span style="background-color: #fff0f0; color: #dd2200;">"Passwordlastset -gt '$filter'"</span> `
-server <span style="background-color: #fff0f0; color: #dd2200;">"$dc"</span>`
-properties name,CanonicalName,passwordlastset,OperatingSystem `
| Select name,CanonicalName,passwordlastset,OperatingSystem `
| <span style="color: #003388;">ConvertTo-Csv</span> -NoTypeInformation `
| <span style="color: #003388;">Select-Object</span> -Skip 1 `
| <span style="color: #003388;">Out-File</span> <span style="background-color: #fff0f0; color: #dd2200;">"$tempfile"</span>
<span style="color: #888888;">#импортируем временный файл с другими заголовками, </span>
<span style="color: #336699;">$tmp</span> = <span style="color: #003388;">Import-Csv</span> -Header Name,Domain,Date,OS <span style="color: #336699;">$tempfile</span>
<span style="color: #888888;"># из поля с указанием домена и OU компьютера вырезаем все кроме домена</span>
<span style="color: #888888;"># для удобства фильтрации по домену например в экселе</span>
<span style="color: #336699;">$tmp</span> | <span style="color: #008800; font-weight: bold;">ForEach</span>-Object {<span style="color: #336699;">$_</span>.Domain = <span style="color: #003366; font-weight: bold;">[regex]</span><span style="background-color: #e3d2d2; color: #a61717;">::</span>replace(<span style="color: #336699;">$_</span>.Domain,<span style="background-color: #fff0f0; color: #dd2200;">'/.*'</span>,<span style="background-color: #fff0f0; color: #dd2200;">''</span>) }
<span style="color: #888888;"># выбираем добавлять ли заголовок во временный файл. </span>
<span style="color: #888888;"># Добавляем, если результирующий файл еще не был создан и, следовательно</span>
<span style="color: #888888;"># это первый обработанный домен. Записываем временный файл</span>
<span style="color: #008800; font-weight: bold;">if</span> (<span style="color: #003388;">Test-Path</span> <span style="background-color: #fff0f0; color: #dd2200;">"$resultfile"</span>) {
<span style="color: #336699;">$tmp</span> | <span style="color: #003388;">ConvertTo-Csv</span> -NoTypeInformation | <span style="color: #003388;">Select-Object</span> -Skip 1 | <span style="color: #003388;">Out-File</span> <span style="background-color: #fff0f0; color: #dd2200;">"$tempfile"</span>
} <span style="color: #008800; font-weight: bold;">else</span> {
<span style="color: #336699;">$tmp</span> | <span style="color: #003388;">ConvertTo-Csv</span> -NoTypeInformation | <span style="color: #003388;">Out-File</span> <span style="background-color: #fff0f0; color: #dd2200;">"$tempfile"</span>
}
<span style="color: #888888;"># Добавляем временный файл в конец результирующего</span>
<span style="color: #003366; font-weight: bold;">[System.IO.File]</span><span style="background-color: #e3d2d2; color: #a61717;">::</span>ReadAllText(<span style="background-color: #fff0f0; color: #dd2200;">"$tempfile"</span>) | <span style="color: #003388;">Out-File</span> <span style="background-color: #fff0f0; color: #dd2200;">"$resultfile"</span> -Append
<span style="color: #888888;"># пробегаемся по результирующему файлу, удаляя пустые строки </span>
<span style="color: #888888;"># (опять же важно для экселя, чтобы первую строку сделать фильром)</span>
<span style="color: #003366; font-weight: bold;">[System.IO.File]</span><span style="background-color: #e3d2d2; color: #a61717;">::</span>ReadAllText(<span style="background-color: #fff0f0; color: #dd2200;">"$resultfile"</span>) -replace <span style="background-color: #fff0f0; color: #dd2200;">'\s+\r\n+'</span>, <span style="background-color: #fff0f0; color: #dd2200;">"`r`n"</span> | <span style="color: #003388;">Out-File</span> <span style="background-color: #fff0f0; color: #dd2200;">"$resultfile"</span>
<span style="color: #003388;">Remove-Item</span> <span style="background-color: #fff0f0; color: #dd2200;">"$tempfile"</span>
}
}
<span style="color: #003388;">Remove-Item</span> <span style="background-color: #fff0f0; color: #dd2200;">"$resultfile"</span>
DoDomain(<span style="background-color: #fff0f0; color: #dd2200;">"dc.domain1.local"</span>)
DoDomain(<span style="background-color: #fff0f0; color: #dd2200;">"dc.domain2.local"</span>)
DoDomain(<span style="background-color: #fff0f0; color: #dd2200;">"dc.domain3.local"</span>)
</pre>
</td></tr>
</tbody></table>
</div>
<br />
<b>Важно!</b> На контроллерах доменов должна работать служба Active Directory Web Services. <br />
Для контроллеров на Windows 2003, если данная служба не установлена, потребуется установить <a href="https://www.microsoft.com/ru-ru/download/details.aspx?id=22">NET Framework 3.5 SP1</a>, а также патч на фреймворк <a href="https://drive.google.com/open?id=0B3kqpI0yeB0ibi1ydkp1SzRDVzQ">KB969166</a> (у микрософта доступен только через общение с саппортом так что выкладываю архив), ну и саму <a href="https://www.microsoft.com/ru-ru/download/details.aspx?id=2852">службу</a>Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-5283674999923393102016-05-21T16:16:00.001+03:002016-05-21T18:16:56.197+03:00proxmox: shrink lxc container<u>Proxmox 4.2</u><br />
Container: <b>101</b>
<br />
Storage: iSCSI with group "<b>iscsi-lvm-group</b>"<br />
Current size: <b>20G</b><br />
<div data-select-like-a-boss="1">
Needed size: <b>10G</b></div>
<ol>
<li><b>BACKUP FIRST!</b></li>
<li>Stop VM<br /><span style="font-family: "trebuchet ms" , sans-serif;">lcx-stop -n <b>101</b></span></li>
<li>Check disk<br /><span data-select-like-a-boss="1" style="font-family: "trebuchet ms" , sans-serif;">e2fsck -f /dev/<b>iscsi-lvm-group</b>/vm-<b>101</b>-disk-1<br /><i>(</i></span><i><span data-select-like-a-boss="1" style="font-family: inherit;">use tune2fs if "MMP check failed" error, and e2fsck again</span><span style="font-family: "trebuchet ms" , sans-serif;">)</span></i></li>
<li><span style="font-family: inherit;">Do your disk little smaller that you want</span><br /><span style="font-family: "trebuchet ms" , sans-serif;">resize2fs /dev/iscsi-lvm-group/vm-101-disk-1 <b>9G</b></span></li>
<li>Reduce LVM size to what you want<br /><span style="font-family: "trebuchet ms" , sans-serif;">lvreduce -L <b>10G</b> /dev/iscsi-lvm-group/vm-101-disk-1</span></li>
<li>Resize your disk without size parameter<br /><span style="font-family: "trebuchet ms" , sans-serif;">resize2fs /dev/iscsi-lvm-group/vm-101-disk-1</span></li>
<li>Check disk<br /><span style="font-family: "trebuchet ms" , sans-serif;">e2fsck -f /dev/<span data-select-like-a-boss="1">iscsi-lvm-group</span>/vm-<span data-select-like-a-boss="1">101</span>-disk-1<br /><i>(</i></span><i><span style="font-family: inherit;">use tune2fs if "MMP check failed" error, and e2fsck again</span><span style="font-family: "trebuchet ms" , sans-serif;">)</span></i></li>
<li><span style="font-family: inherit;">Edit disk size in container config</span><br /><span style="font-family: "trebuchet ms" , sans-serif;">vi /etc/pve/lxc/<b>101</b>.conf</span></li>
<li><span style="font-family: "trebuchet ms" , sans-serif;">Run the container</span></li>
</ol>
Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com1tag:blogger.com,1999:blog-4435746224454743817.post-77715685092916234582016-05-12T16:54:00.001+03:002016-05-12T16:54:15.389+03:00Поиск левого DHCP для самых маленькихМаленькая детективная история, которая началась с того, что у клиентов начали появляться трудности с доступом к сетевым ресурсам. Выяснилось что они получают IP-адреса с какого-от левого источника (да, это можно предотвратить, но что не сделано - то не сделано).<br />
<br />
Что делаем:<br />
<br />
<ol>
<li>на компе, получившим левый адрес, делаем <br /><b>ipconfig /all</b><br /><br />смотрим IP DHCP-сервера: в моем случае 192.168.1.1, он же шлюз - типичная ситуация "кто-то умный принес домашний роутер".<br />(Для полноты картины качаем <a href="http://www.snapfiles.com/get/roguedhcp.html" target="_blank">Rogue Checker</a> - утилиту для поиска DHCP-серверов в сети. Полезно для мониторинга ситуации со стороны)</li>
<li>Имея комп с левый адресом пингуем IP DHCP-сервера<br /><b>ping 192.168.1.1</b><br />и дальше<br /><b>arp -a</b><br />последняя команда выдаст MAC-адрес DHCP-сервера</li>
<li>ищем MAC-адрес на свичах, выясняем порт на котором висит "злоумышленник" (я для этого использую богоподобный скрипт <a href="https://github.com/linuxdynasty/Linuxdynasty/blob/master/Port_Report_Tools/port_report.py">port_report.py</a>)</li>
<li>Если порт подписан и понятно где находится розетка - идем и рассказываем человеку о безопасности на предприятии. Если розетка не подписана - смотрим какие мак-адреса висят на том же порту, если таковые есть - это скорее всего какое-то оборудование предприятия - компы, ip-телефоны и т.д., которые были воткнуты в принесенный роутер.</li>
</ol>
<div>
В моем случае человек принес роутер чтобы к одной розетке подключить несколько компов. При этом использовал его как хаб, таким образом клиентский порт роутера оказался соединен с нашей локалкой, что и вызвало проблемы. К счастью, по засветившимся на порту мак-адресам мы быстро установили какому оборудованию принадлежат маки (спасибо автоматической базе инвентаризации) и на ком это оборудование числится.</div>
<br />
<br />Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-90153856148003485582016-05-07T19:46:00.000+03:002016-05-07T19:48:14.855+03:00Исправление крестовины (D-Pad) геймпада Retro-bit SNES Gamepad<a href="http://2.bp.blogspot.com/-zC_kFS8TDIg/Vy4N4gz3BPI/AAAAAAAAXgU/67GjJCnjQPQBRlj26sXT4fGWeXsW_MBOgCK4B/s1600/s-l400.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="150" src="https://2.bp.blogspot.com/-zC_kFS8TDIg/Vy4N4gz3BPI/AAAAAAAAXgU/67GjJCnjQPQBRlj26sXT4fGWeXsW_MBOgCK4B/s200/s-l400.jpg" width="150" /></a><br />
Для удобства игры на старой Super Famicom прикупил себе пару беспроводных геймпадов Retro-bit (<a href="http://www.ebay.com/itm/401082549321?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT" target="_blank">ebay</a>). Нареканий в части беспроводной работы к ним не возникло, но выяснилось, что крестовина (aka directional pad, aka D-Pad) у них самая премерзкая - при нажатии одного из направлений практически неизбежно прожимается одно из смежных. К счастью это оказалось несложно исправить.<br />
<div>
<br /></div>
<div>
<br />
<a name='more'></a><ol>
<li>Вот он, герой нашего дня. Для работы нам понадобится отвертка, кусачки (я использовал бабушкины кусачки для ногтей) и напильник.<br /><a href="http://4.bp.blogspot.com/-oiyw2at7924/Vy4Pw7yszzI/AAAAAAAAXgg/QUf9nntcCYwV8eE68Dy3kcNIig_kozVhACK4B/s1600/2016-05-07%2B18.53.41.jpg" imageanchor="1"><img border="0" height="180" src="https://4.bp.blogspot.com/-oiyw2at7924/Vy4Pw7yszzI/AAAAAAAAXgg/QUf9nntcCYwV8eE68Dy3kcNIig_kozVhACK4B/s320/2016-05-07%2B18.53.41.jpg" width="320" /></a></li>
<li>Снимаем крышку батарейного отсека, убираем батарейки, развинчиваем. Не забываем болтик внизу - он был скрыт под наклейкой.<br /><a href="http://2.bp.blogspot.com/-aqsLJanwcbk/Vy4QEQ38BEI/AAAAAAAAXgo/SpKElqgHvPMop98C-l3Iup3LOwIhQUJHQCK4B/s1600/2016-05-07%2B18.54.45.jpg" imageanchor="1"><img border="0" height="180" src="https://2.bp.blogspot.com/-aqsLJanwcbk/Vy4QEQ38BEI/AAAAAAAAXgo/SpKElqgHvPMop98C-l3Iup3LOwIhQUJHQCK4B/s320/2016-05-07%2B18.54.45.jpg" width="320" /></a></li>
<li>Снимаем крышку на себя. Проводка, ведущего от батарейного отсека к плате должно хватить на комфортное открытие.<br /><a href="http://1.bp.blogspot.com/-nQs6Euh6Z3s/Vy4QkHWkGHI/AAAAAAAAXg8/tfqXvBwp5b00lqCm5U6Hph0-wxdBg4nIACK4B/s1600/2016-05-07%2B18.55.42.jpg" imageanchor="1"><img border="0" height="180" src="https://1.bp.blogspot.com/-nQs6Euh6Z3s/Vy4QkHWkGHI/AAAAAAAAXg8/tfqXvBwp5b00lqCm5U6Hph0-wxdBg4nIACK4B/s320/2016-05-07%2B18.55.42.jpg" width="320" /></a></li>
<li>Извлекаем шифты (они одной стороной держатся в дырочках) и одну из платок под ними. Я купил два джоя и у обоих относительно легко изымалась только одна из платок, хотя крепятся они одинаково и в идеале стоит извлечь обе.<br /><a href="http://2.bp.blogspot.com/--pPo99jAADE/Vy4Q8Zw8b8I/AAAAAAAAXhQ/yCJi-FQb1GgPYqDs_zuos2q-j3JS5WvSQCK4B/s1600/2016-05-07%2B18.57.02.jpg" imageanchor="1"><img border="0" height="180" src="https://2.bp.blogspot.com/--pPo99jAADE/Vy4Q8Zw8b8I/AAAAAAAAXhQ/yCJi-FQb1GgPYqDs_zuos2q-j3JS5WvSQCK4B/s320/2016-05-07%2B18.57.02.jpg" width="320" /></a></li>
<li>Однако, даже если извлекается только дальняя от D-Pad'а плата, шлейфа второй платы должно хватить для извлечения основной платы геймпада. Откинув ее в сторону, видим резинку D-Pad'а.<br /><a href="http://4.bp.blogspot.com/-_Hd_q7wfuf8/Vy4RDhj9dTI/AAAAAAAAXhY/yycdiA19W_U25QThuv62loNSPGvD3eZgwCK4B/s1600/2016-05-07%2B18.58.49.jpg" imageanchor="1"><img border="0" height="180" src="https://4.bp.blogspot.com/-_Hd_q7wfuf8/Vy4RDhj9dTI/AAAAAAAAXhY/yycdiA19W_U25QThuv62loNSPGvD3eZgwCK4B/s320/2016-05-07%2B18.58.49.jpg" width="320" /></a></li>
<li>Под резинкой скрывается наш паршивец - китайский D-Pad от дяди Ляо. Смотрим ему в глаза...<br /><a href="http://4.bp.blogspot.com/-YJXauBDLU5A/Vy4TNnTl9OI/AAAAAAAAXho/apoZ_5m4uYsW8SAGabcMGEvsZVrFQvowACK4B/s1600/2016-05-07%2B00.44.12.jpg" imageanchor="1"><img border="0" height="320" src="https://4.bp.blogspot.com/-YJXauBDLU5A/Vy4TNnTl9OI/AAAAAAAAXho/apoZ_5m4uYsW8SAGabcMGEvsZVrFQvowACK4B/s320/2016-05-07%2B00.44.12.jpg" width="307" /></a></li>
<li>... и в зад. Какой круглый! Именно из-за этого он так криво прожимается!<br /><a href="http://1.bp.blogspot.com/-n47JOF7C7nQ/Vy4TPVMnkSI/AAAAAAAAXhw/VoAGdtt_ZwogWhNekTS7w5KYLiZnHaycQCK4B/s1600/2016-05-07%2B00.44.34.jpg" imageanchor="1"><img border="0" height="320" src="https://1.bp.blogspot.com/-n47JOF7C7nQ/Vy4TPVMnkSI/AAAAAAAAXhw/VoAGdtt_ZwogWhNekTS7w5KYLiZnHaycQCK4B/s320/2016-05-07%2B00.44.34.jpg" width="302" /></a></li>
<li>С помощью кусачек выкусываем сектора между направлений. Напильником точим ребра примерно под 45<span style="color: #222222; font-family: "arial" , sans-serif;"><span style="background-color: white; line-height: 19.2px;">°, чтобы при нажатии направления, смежное с ним не нажималось острым ребром. Можно заметить, что я также немного заострил вершины креста - по той же самой причине. Главное не переусердствовать и не сделать давящую поверхность слишком узкой, иначе при нажатии направления пальцем будет ощущаться неустойчивое положение.</span></span><a href="http://1.bp.blogspot.com/-0y33_KmRw48/Vy4TSTkrAXI/AAAAAAAAXh4/39xvQW_nHZ8I82RNphIQ-9vlbGVioLurgCK4B/s1600/2016-05-07%2B00.34.24.jpg" imageanchor="1"><img border="0" height="312" src="https://1.bp.blogspot.com/-0y33_KmRw48/Vy4TSTkrAXI/AAAAAAAAXh4/39xvQW_nHZ8I82RNphIQ-9vlbGVioLurgCK4B/s320/2016-05-07%2B00.34.24.jpg" width="320" /></a></li>
<li>Также, не стоит выламывать края крестовины, так как они - единственное на чем крест будет держаться в корпусе геймпада после операции.<br /><a href="http://3.bp.blogspot.com/-0EMGK6l5oqM/Vy4TTqP0w9I/AAAAAAAAXiA/mBiJXbUO-FE_vgUgYk1BKMGUEKbwAJ3nACK4B/s1600/2016-05-07%2B00.33.52.jpg" imageanchor="1"><img border="0" height="276" src="https://3.bp.blogspot.com/-0EMGK6l5oqM/Vy4TTqP0w9I/AAAAAAAAXiA/mBiJXbUO-FE_vgUgYk1BKMGUEKbwAJ3nACK4B/s320/2016-05-07%2B00.33.52.jpg" width="320" /></a></li>
</ol>
<div data-select-like-a-boss="1">
После произведенных манипуляций аккуратно собираем геймпад в обратной последовательности и проверяем работу. Если при нажатии какого-то направления по-прежнему нажимается смежное - разбираем и еще подтачиваем грань смежного направления, находящуюся со стороны нажимаемого направления.</div>
</div>
Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-73134705968840884432016-04-07T13:38:00.002+03:002016-05-07T18:41:54.290+03:00Как убить лишние копии процесса в windowsПотребовалось сотворить костыль, убивающий незавершающиеся копии процесса, на всякий случай оставив последние из запущенных. В моем случае это костыль, но в целом кому-то может и пригодиться, так что выкладываю рецепт на powershell:<br />
<br /><!-- HTML generated using hilite.me -->
<div style="background: #eeeedd; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #00688b;">$processName</span> = <span style="color: #cd5555;">"php-cgi"</span>
<span style="color: #00688b;">$survivorsCount</span> = 6
<span style="color: #00688b;">$processList</span> = <span style="color: #658b00;">Get-Process</span> -Name <span style="color: #00688b;">$processName</span>
<span style="color: #00688b;">$doomedCount</span> = <span style="color: #00688b;">$processList</span>.Count
<span style="color: darkmagenta; font-weight: bold;">if</span> (<span style="color: #00688b;">$doomedCount</span> -gt <span style="color: #00688b;">$survivorsCount</span>) {
<span style="color: #00688b;">$bulletCount</span> = <span style="color: #00688b;">$doomedCount</span> - <span style="color: #00688b;">$survivorsCount</span>
<span style="color: #00688b;">$bulletCount</span>
<span style="color: #00688b;">$killkillkill</span> = <span style="color: #00688b;">$processList</span> | <span style="color: #658b00;">Select-Object</span> -first <span style="color: #00688b;">$bulletCount</span> | <span style="color: #658b00;">Stop-Process</span> -force
}
</pre>
</div>
Сгенерировано: <a href="hilite.me" target=_blank>hilite.me</a>Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-53799786828323944852016-04-01T15:03:00.000+03:002016-04-01T15:03:39.633+03:00Простейший пингер с логированием под bashСобственно пингуем, ведем лог и это все что надо )<div>
<br /></div>
<div>
<pre style="background: rgb(241, 240, 240);"><span data-select-like-a-boss="1" style="color: #c34e00;">#!</span><span style="color: #007997;">/bin/bash</span>
<span style="color: #400000; font-weight: bold;">if</span> <span style="color: #806030;">[</span><span style="color: #e60000;">[ </span><span style="color: #806030;">-</span><span style="color: #e60000;">z "$1" </span><span style="color: #806030;">]</span>]<span style="color: #806030;">;</span> <span style="color: #400000; font-weight: bold;">then</span>
<span style="color: #bb7977; font-weight: bold;">echo</span> <span style="color: #e60000;">"Please enter IP, ex.: </span><span style="color: #e60000;">$0</span><span style="color: #e60000;"> 127.0.0.1"</span>
<span style="color: #bb7977; font-weight: bold;">exit</span>
<span style="color: #400000; font-weight: bold;">else</span>
<span style="color: #bb7977; font-weight: bold;">echo</span> <span style="color: #e60000;">"Logfile: </span><span style="color: #40015a;">/tmp/ping_</span><span style="color: #e60000;">$1</span><span style="color: #e60000;">"</span>
<span style="color: #400000; font-weight: bold;">fi</span>
<span style="color: #400000; font-weight: bold;">while</span> <span style="color: #44aadd;">true</span>
<span style="color: #400000; font-weight: bold;">do</span>
<span style="color: #400000; font-weight: bold;">while</span> <span style="color: #400000; font-weight: bold;">!</span> ping -c1 $1 &<span style="color: #e34adc;">></span><span style="color: #40015a;">/dev/null</span>
<span style="color: #400000; font-weight: bold;">do</span> <span style="color: #bb7977; font-weight: bold;">echo</span> <span style="color: #e60000;">"Ping Fail - </span><span style="background: rgb(255, 255, 232);">`date`</span><span style="color: #e60000;">"</span> <span style="color: #e34adc;">></span><span style="color: #e34adc;">></span> <span style="color: #40015a;">/tmp/ping_</span>$1
<span style="color: #400000; font-weight: bold;">done</span>
<span style="color: #bb7977; font-weight: bold;">echo</span> <span style="color: #e60000;">"Host Found - </span><span style="background: rgb(255, 255, 232);">`date`</span><span style="color: #e60000;">"</span> <span style="color: #e34adc;">></span><span style="color: #e34adc;">></span> <span style="color: #40015a;">/tmp/ping_</span>$1
sleep <span style="color: #c00000;">1</span>
<span style="color: #400000; font-weight: bold;">done</span></pre>
</div>
Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-39916872696153692782016-03-08T22:35:00.001+03:002016-03-08T22:36:19.792+03:00Как по порядку переименовать файлы, скачанные wget по спискуРешил скачать комикс из вконтакта, полученный список (<b>listfile.txt</b>) для скачивания имел примерно такой вид:<br />
<div>
<br /></div>
<div>
<pre style="background: rgb(255, 255, 255);"><span data-select-like-a-boss="1" style="color: #e34adc;">https:</span><span style="color: dimgrey;">//pp.vk.me/c307313/v307313650/1e94/bj560KCwYY4.jpg</span>
<span style="color: #e34adc;">https:</span><span style="color: dimgrey;">//pp.vk.me/c307313/v307313650/1692/yFPMOuXHLvw.jpg</span>
<span style="color: #808030;">.</span><span style="color: #808030;">.</span><span style="color: #808030;">.</span>
<span style="color: #e34adc;">https:</span><span style="color: dimgrey;">//pp.vk.me/c307313/v307313650/1e7b/d-MXTKSZr34.jpg</span>
<span style="color: #e34adc;">https:</span><span style="color: dimgrey;">//pp.vk.me/c307313/v307313650/1e84/Oj_DhH9Fbvw.jpg</span></pre>
<br />
Собственно, после скачивания wget'ом (<b>wget -i listfile.txt</b>) я получил неудобоваримый набор файлов с рандомными названиями, и мне захотелось переименовать их в вид 001.jpg 002.jpg, согласно порядку, в котором они были в исходном файле. Хорошенько попотев, получил такой однострочник:</div>
<div>
<br /></div>
<div>
<table border="0" style="font-family: sans-serif; table-layout: fixed; width: 90%px;"><tbody>
<tr><td valign="top"><div style="overflow: scroll; width: 638px;">
<pre data-select-like-a-boss="1" style="background: rgb(0, 0, 0); color: #d1d1d1;">cat <span style="color: #d2cd86;">.</span><span style="color: #d2cd86;">/</span>listfile<span style="color: #d2cd86;">.</span>txt <span style="color: #d2cd86;">|</span> tr <span style="color: #d2cd86;">-</span>d <span style="color: #00c4c4;">'\r'</span> <span style="color: #d2cd86;">|</span> <span style="color: #e66170; font-weight: bold;">while</span> read url<span style="color: #b060b0;">;</span> <span style="color: #e66170; font-weight: bold;">do</span> n<span style="color: #d2cd86;">=</span>$<span style="color: #d2cd86;">(</span><span style="color: #d2cd86;">(</span>n<span style="color: #d2cd86;">+</span><span style="color: #008c00;">1</span><span style="color: #d2cd86;">)</span><span style="color: #d2cd86;">)</span><span style="color: #b060b0;">;</span> file<span style="color: #d2cd86;">=</span><span style="color: #02d045;">"</span><span style="color: #00c4c4;">`echo $url| sed -e 's/.*</span><span style="color: teal;">\/</span><span style="color: #00c4c4;">//'`</span><span style="color: #02d045;">"</span><span style="color: #b060b0;">;</span> newfile<span style="color: #d2cd86;">=</span><span style="color: #02d045;">"</span><span style="color: #00c4c4;">`printf </span><span style="color: teal;">\"</span><span style="color: #007997;">%03d</span><span style="color: teal;">\"</span><span style="color: #00c4c4;"> $n`</span><span style="color: #02d045;">"</span><span style="color: #b060b0;">;</span> mv <span style="color: #d2cd86;">.</span><span style="color: #d2cd86;">/</span><span style="color: #02d045;">"</span><span style="color: #00c4c4;">$file</span><span style="color: #02d045;">"</span> <span style="color: #d2cd86;">.</span><span style="color: #d2cd86;">/</span><span style="color: #02d045;">"</span><span style="color: #00c4c4;">$newfile</span><span style="color: #02d045;">"</span><span style="color: #d2cd86;">.</span>jpg <span style="color: #b060b0;">;</span> done
</pre>
<div>
<br /></div>
</div>
</td></tr>
</tbody></table>
</div>
<div>
<br />
Или, для читаемости, так:<br />
<br />
<pre data-select-like-a-boss="1" style="background: rgb(0, 0, 0); color: #d1d1d1;">cat <span style="color: #d2cd86;">.</span><span style="color: #d2cd86;">/</span>listfile<span style="color: #d2cd86;">.</span>txt <span style="color: #d2cd86;">|</span> tr <span style="color: #d2cd86;">-</span>d <span style="color: #00c4c4;">'\r'</span> <span style="color: #d2cd86;">|</span> <span style="color: #e66170; font-weight: bold;">while</span> read url<span style="color: #b060b0;">;</span>
<span style="color: #e66170; font-weight: bold;">do</span>
n<span style="color: #d2cd86;">=</span>$<span style="color: #d2cd86;">(</span><span style="color: #d2cd86;">(</span>n<span style="color: #d2cd86;">+</span><span style="color: #008c00;">1</span><span style="color: #d2cd86;">)</span><span style="color: #d2cd86;">)</span><span style="color: #b060b0;">;</span>
file<span style="color: #d2cd86;">=</span><span style="color: #02d045;">"</span><span style="color: #00c4c4;">`echo $url| sed -e 's/.*</span><span style="color: teal;">\/</span><span style="color: #00c4c4;">//'`</span><span style="color: #02d045;">"</span><span style="color: #b060b0;">;</span>
newfile<span style="color: #d2cd86;">=</span><span style="color: #02d045;">"</span><span style="color: #00c4c4;">`printf </span><span style="color: teal;">\"</span><span style="color: #007997;">%03d</span><span style="color: teal;">\"</span><span style="color: #00c4c4;"> $n`</span><span style="color: #02d045;">"</span><span style="color: #b060b0;">;</span>
mv <span style="color: #d2cd86;">.</span><span style="color: #d2cd86;">/</span><span style="color: #02d045;">"</span><span style="color: #00c4c4;">$file</span><span style="color: #02d045;">"</span> <span style="color: #d2cd86;">.</span><span style="color: #d2cd86;">/</span><span style="color: #02d045;">"</span><span style="color: #00c4c4;">$newfile</span><span style="color: #02d045;">"</span><span style="color: #d2cd86;">.</span>jpg <span style="color: #b060b0;">;</span>
done</pre>
<br />
Немного пояснений:</div>
<div>
<br /></div>
<div>
<b>tr -d '\r'</b> - исходный файл у меня был виндовосформирован, поэтому в каждой строке там был лишний символ перевода коретки, который мешался</div>
<div>
<br /></div>
<div>
<b>while read url</b> - стандартный цикл построчного чтения файла в переменную <b>url</b></div>
<div>
<br /></div>
<div>
<b>n=$((n+1)) </b>- переменная <b>n</b> для нового имени файлов, которая будет прирастать на единицу<br />
<br />
<b>file="`echo $url| sed -e 's/.*\///'`"</b> - старое имя файла, которое получается путем обрезания левой части ссылки <br />
<br />
<b>newfile="`printf \"%03d\" $n`"</b> - новое имя файла, которое состоит из переменной <b>n</b> сформатированной в трехсимвольное отображение (1,2,3 -> 001, 002, 003).</div>
Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-21369631493498458562016-02-15T10:24:00.001+03:002016-02-15T10:24:10.905+03:00Не подключаются мобильные устройства по MTPЕсли после установки антивируса касперского к компьютеру перестали подключаться смартфоны, стоит проверить ветку реестра:<br />
<br />
<b>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{EEC5AD98-8080-425F-922A-DABF3DE3F69A}</b><br />
<br />
Если в ней есть ключи <b>UpperFilters </b>или <b>LowerFilters </b>- удалите их. Массово это можно сделать, проимпортировав политиками reg-файл:<br />
<br />
<pre data-select-like-a-boss="1" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial;">Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\<span style="font-weight: bold;">{</span>EEC5AD98-8080-<span style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; font-style: italic; font-weight: bold;">425F</span>-<span style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; font-style: italic; font-weight: bold;">922A</span>-DABF3DE3F69A<span style="font-weight: bold;">}</span>]
"UpperFilters"=-
"LowerFilters"=-</pre>
<br />
<br />
Также в <a href="https://support.microsoft.com/en-us/kb/929461">интернете</a> <a href="http://imasters.org.ru/viewtopic.php?id=74">встречаются</a> <a href="http://pcsupport.about.com/od/driverssupport/ht/upperfilters-lowerfilters.htm">упоминания</a> о ветках:<br />
<b><br /></b>
<b>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}</b> - наличие фильтров тут может привести к неработоспособности всех юсб-устройств,
<b><br /></b>
<b><br /></b><br />
<b>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318}</b> - ветка, отвечающая за CD-ROM'ы<br />
<br />
<br />Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-76224716769497979902016-01-26T18:22:00.002+03:002016-01-26T18:22:58.291+03:00Как сменить Twitch-аккаунт в Playstation 4<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/NF19QQ-M-hY/0.jpg" src="https://www.youtube.com/embed/NF19QQ-M-hY?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-77643489901622192782016-01-20T18:54:00.000+03:002016-01-20T23:36:12.780+03:00Яндекс.Сервер 2010.09: Руководство по установке и эксплуатацииУдивительно, но в инете решительно не гуглится этот документ: <a href="https://drive.google.com/open?id=0B3kqpI0yeB0iNE9LcWpseHZtVms">yandex-server-manual.pdf</a><br />
(скачать Яндекс.Сервер 2010.09 win+lin можно по <a href="magnet:?xt=urn:btih:5158f2ee03fbb9e23172aa334a6c7f69a6eda0bd&dn=Yandex.Server%20%28%D0%AF%D0%BD%D0%B4%D0%B5%D0%BA%D1%81.%D0%A1%D0%B5%D1%80%D0%B2%D0%B5%D1%80%29%202010.%20Win%2BLin,%20x86%2Bx64&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=http%3A%2F%2Fretracker.local%3A80&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2F9.rarbg.com%3A2710&tr=udp%3A%2F%2Fcoppersurfer.tk%3A6969&tr=udp%3A%2F%2Fbt.rutor.org%3A2710">ссылке</a>)
<br />
<br />
<a name='more'></a><br /><br />
<br />
<iframe src="https://docs.google.com/document/d/1sXB_0zUrU26iyuRW2ixqwF2A5lGC_t83fH-_sPJZwWM/pub?embedded=true" width=595 height=700></iframe>Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-31449730472549469222016-01-14T15:56:00.002+03:002016-01-14T15:56:22.356+03:00Логирование изменений конфигурации Cisco Catalyst на syslogvia @ <a href="https://networklessons.com/network-management/configuration-change-notification-logging/">https://networklessons.com/network-management/configuration-change-notification-logging/</a><br />
<pre style="background: rgb(241, 240, 240);"><pre style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial;"><span style="color: #44aadd;">!</span> Находясь в режиме конфигурации
<span style="color: #005fd2;">Router</span><span style="color: #806030;">(</span><span style="color: #005fd2;">config</span><span style="color: #806030;">)</span><span style="color: #3d85c6;">#</span><span style="color: #b45f06;">archive</span>
<span style="color: #005fd2;">Router</span><span style="color: #806030;">(</span><span style="color: #005fd2;">config-archive</span><span style="color: #806030;">)</span><span data-select-like-a-boss="1" style="color: #3d85c6;">#</span><span style="color: #b45f06;">log config</span>
<span style="color: #44aadd;">!</span> Включаем логирование
<span style="color: #005fd2;">Router</span><span style="color: #806030;">(</span><span style="color: #005fd2;">config-archive-log-cfg</span><span style="color: #806030;">)</span><span data-select-like-a-boss="1" style="color: #3d85c6;">#</span><span style="color: #b45f06;">logging enable</span>
<span style="color: #44aadd;">!</span> Устанавливаем размер локального лога
<span style="color: #005fd2;">Router</span><span style="color: #806030;">(</span><span style="color: #005fd2;">config-archive-log-cfg</span><span style="color: #806030;">)</span><span data-select-like-a-boss="1" style="color: #3d85c6;">#</span><span style="color: #b45f06;">logging size 500</span>
<span style="color: #44aadd;">!</span> Запрещаем сохранять пароли
<span style="color: #005fd2;">Router</span><span style="color: #806030;">(</span><span style="color: #005fd2;">config-archive-log-cfg</span><span style="color: #806030;">)</span><span style="color: #3d85c6;">#</span><span style="color: #b45f06;">hidekeys</span>
<span style="color: #44aadd;">!</span> Включаем перенаправление на сислог
<span style="color: #005fd2;">Router</span><span style="color: #806030;">(</span><span style="color: #005fd2;">config-archive-log-cfg</span><span style="color: #806030;">)</span><span data-select-like-a-boss="1" style="color: #3d85c6;">#</span><span style="color: #b45f06;">notify syslog</span>
<span style="color: #44aadd;">!</span> Просматриваем локальный лог
<span data-select-like-a-boss="1" style="color: #005fd2;">Router#</span><span style="color: #b45f06;">show archive log config all</span></pre>
</pre>
Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-27079871491705112882015-12-01T11:37:00.001+03:002015-12-01T11:37:16.681+03:00Zabbix и мониторинг состояния баз Exchange 2010 (с использованием Low Level Discovery)В результате аварийного отключения сервера, или еще каких-либо непредвиденных обстоятельств, реплики баз данных Exchange могут быть рассинхронизированы. Об этом мы узнали, когда место на рабочем сервере оказалось почти полностью съедено логами. К счастью, о нехватке места мы были предупреждены заббиксом, но встал вопрос о мониторинге состояния баз.<div>
<br /></div>
<div>
В этом посте я расскажу как решил задачу, а также постараюсь доступно рассказать как работает Zabbix <b>Low Level Discovery</b> (<b>LLD</b>), так как интернет не особо пестрит примерами самостоятельных решений для этого функционала заббикса.<br /><a name='more'></a><div>
<br /></div>
<div>
Отталкиваться я предлагаю от консоли <b>Exchange Management Shell</b> и команды </div>
<div>
<pre style="background: rgb(255, 255, 255);"><pre data-select-like-a-boss="1" style="background-attachment: initial; background-clip: initial; background-color: #f1f0f0; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial;"><span style="color: #005fd2;">Get-MailboxDatabaseCopyStatus</span> <span style="color: #074726;">-Identity</span> <span style="color: #e60000;">*</span></pre>
</pre>
</div>
<div>
<br /></div>
<div>
Данная команда выполняется на любом из серверов Exchange и выводит список всех баз с указанием принадлежности к серверам.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-ZoERUzLdjDk/Vl09nOncTvI/AAAAAAAAWRA/efyS2Fk1pLg/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-ZoERUzLdjDk/Vl09nOncTvI/AAAAAAAAWRA/efyS2Fk1pLg/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" /></a></div>
<div>
<br /></div>
<div>
Из вывода нам важно поле <b>Status</b> - "Mounted" или "Healthy" в нем означает, что с базами все ок. В противном случае на базу нужно обратить внимание.</div>
<div>
<br /></div>
<h2>
Выгружаем данные на сервере</h2>
<div>
Набрасываем скрипт.</div>
<div>
<br /></div>
<div>
<pre data-select-like-a-boss="1" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial;"><pre style="background-attachment: initial; background-clip: initial; background-color: #f1f0f0; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial;"><span style="color: #00dddd;">Add-PSSnapin</span> <span style="color: #e60000;">Microsoft.Exchange.Management.PowerShell.E2010</span>
$jsonhead <span style="color: #44aadd;">=</span> <span style="color: maroon;">'</span><span style="color: #e60000;">{"data":[</span><span style="color: maroon;">'</span>
$jsontail <span style="color: #44aadd;">=</span> <span style="color: maroon;">'</span><span style="color: #e60000;">]}</span><span style="color: maroon;">'</span>
$jsonbody<span style="color: #44aadd;">=</span><span style="color: maroon;">"</span><span style="color: maroon;">"</span>
$statusbody <span style="color: #44aadd;">=</span> <span style="color: maroon;">"</span><span style="color: maroon;">"</span>
<span style="color: #005fd2;">Get-MailboxDatabaseCopyStatus</span> <span style="color: #074726;">-Identity</span> <span style="color: #e60000;">*</span> <span style="color: #bb7977; font-weight: bold;">|</span> <span style="color: #00dddd;">ForEach-Object</span> <span style="color: #806030;">{</span>
$base <span style="color: #44aadd;">=</span> <span style="color: #007997;">$_</span><span style="color: #44aadd;">.</span><span style="color: #005fd2;">Name</span> <span style="color: #400000; font-weight: bold;">-replace</span> <span style="color: maroon;">"</span><span style="color: #0f6900;">\\</span><span style="color: maroon;">"</span><span style="color: #44aadd;">,</span> <span style="color: maroon;">"</span><span style="color: #e60000;">/</span><span style="color: maroon;">"</span>
$status <span style="color: #44aadd;">=</span> <span style="color: #007997;">$_</span><span style="color: #44aadd;">.</span><span style="color: #005fd2;">Status</span><span style="color: #44aadd;">.</span><span style="color: #005fd2;">value__</span>
$jsonbody <span style="color: #44aadd;">+=</span> <span style="color: maroon;">'</span><span style="color: #e60000;">{ "{#BASENAME}":"</span><span style="color: maroon;">'</span> <span style="color: #44aadd;">+</span> $base <span style="color: #44aadd;">+</span> <span style="color: maroon;">'</span><span style="color: #e60000;">"}, </span><span style="color: maroon;">'</span>
$statusbody <span style="color: #44aadd;">+=</span> $base <span style="color: #44aadd;">+</span> <span style="color: maroon;">'</span><span style="color: #e60000;"> </span><span style="color: maroon;">'</span> <span style="color: #44aadd;">+</span> $status <span style="color: #44aadd;">+</span> <span style="color: maroon;">"</span><span style="color: #bb7977; font-weight: bold;">`r</span><span style="color: #bb7977; font-weight: bold;">`n</span><span style="color: maroon;">"</span>
<span style="color: #806030;">}</span>
$json <span style="color: #44aadd;">=</span> $jsonhead <span style="color: #44aadd;">+</span> $jsonbody <span style="color: #44aadd;">+</span> $jsontail
$json <span style="color: #44aadd;">=</span> $json <span style="color: #400000; font-weight: bold;">-replace</span> <span style="color: maroon;">"</span><span style="color: #e60000;">}, ]</span><span style="color: maroon;">"</span><span style="color: #44aadd;">,</span> <span style="color: maroon;">"</span><span style="color: #e60000;">}]</span><span style="color: maroon;">"</span>
$json <span style="color: #bb7977; font-weight: bold;">|</span> <span style="color: #00dddd;">Out-File</span> <span style="color: #074726;">-Encoding</span> <span style="color: maroon;">"</span><span style="color: #e60000;">Default</span><span style="color: maroon;">"</span> <span style="color: #e60000;">C:\zabbix_MailDB_status_discovery.txt</span>
$statusbody <span style="color: #bb7977; font-weight: bold;">|</span> <span style="color: #00dddd;">Out-File</span> <span style="color: #074726;">-Encoding</span> <span style="color: maroon;">"</span><span style="color: #e60000;">Default</span><span style="color: maroon;">"</span> <span style="color: #e60000;">C:\zabbix_MailDB_status_result.txt</span></pre>
</pre>
Данный скрипт выгружает информацию о базах в двух представлениях:<br /><ol>
<li>В файл <b>zabbix_MailDB_status_discovery.txt</b> кладется список баз в формате JSON. Это нужно для настройки Low Level Discovery (LLD) - механизма заббикса, который позволит не настраивать проверку статуса для каждой базы, а автоматизировать добавление/удаление баз в список мониторинга при их создании/удалении на серверах Exchange. Выглядит выгрузка примерно так:<br /><pre style="background: rgb(241, 240, 240);"><span data-select-like-a-boss="1" style="color: #806030;">{</span><span style="color: maroon;">"</span><span style="color: #e60000;">data</span><span style="color: maroon;">"</span>:<span style="color: #806030;">[</span><span style="color: #806030;">{</span> <span style="color: maroon;">"</span><span style="color: #e60000;">{#BASENAME}</span><span style="color: maroon;">"</span>:<span style="color: maroon;">"</span><span style="color: #e60000;">mdb3/EXCH01</span><span style="color: maroon;">"</span><span style="color: #806030;">}</span><span style="color: #44aadd;">,</span> <span style="color: #806030;">{</span> <span style="color: maroon;">"</span><span style="color: #e60000;">{#BASENAME}</span><span style="color: maroon;">"</span>:<span style="color: maroon;">"</span><span style="color: #e60000;">mdb4/EXCH01</span><span style="color: maroon;">"</span><span style="color: #806030;">}</span><span style="color: #44aadd;">,</span> <span style="color: #806030;">{</span> <span style="color: maroon;">"</span><span style="color: #e60000;">{#BASENAME}</span><span style="color: maroon;">"</span>:<span style="color: maroon;">"</span><span style="color: #e60000;">mdb5/EXCH01</span><span style="color: maroon;">"</span><span style="color: #806030;">}</span><span style="color: #44aadd;">,</span> <span style="color: #806030;">{</span> <span style="color: maroon;">"</span><span style="color: #e60000;">{#BASENAME}</span><span style="color: maroon;">"</span>:<span style="color: maroon;">"</span><span style="color: #e60000;">mdb1/EXCH01</span><span style="color: maroon;">"</span><span style="color: #806030;">}</span><span style="color: #44aadd;">,</span> <span style="color: #806030;">{</span> <span style="color: maroon;">"</span><span style="color: #e60000;">{#BASENAME}</span><span style="color: maroon;">"</span>:<span style="color: maroon;">"</span><span style="color: #e60000;">mdb2/EXCH01</span><span style="color: maroon;">"</span><span style="color: #806030;">}</span><span style="color: #44aadd;">,</span> <span style="color: #806030;">{</span> <span style="color: maroon;">"</span><span style="color: #e60000;">{#BASENAME}</span><span style="color: maroon;">"</span>:<span style="color: maroon;">"</span><span style="color: #e60000;">mdb2/EXCH04</span><span style="color: maroon;">"</span><span style="color: #806030;">}</span><span style="color: #44aadd;">,</span> <span style="color: #806030;">{</span> <span style="color: maroon;">"</span><span style="color: #e60000;">{#BASENAME}</span><span style="color: maroon;">"</span>:<span style="color: maroon;">"</span><span style="color: #e60000;">mdb3/EXCH04</span><span style="color: maroon;">"</span><span style="color: #806030;">}</span><span style="color: #44aadd;">,</span> <span style="color: #806030;">{</span> <span style="color: maroon;">"</span><span style="color: #e60000;">{#BASENAME}</span><span style="color: maroon;">"</span>:<span style="color: maroon;">"</span><span style="color: #e60000;">mdb5/EXCH06</span><span style="color: maroon;">"</span><span style="color: #806030;">}</span><span style="color: #44aadd;">,</span> <span style="color: #806030;">{</span> <span style="color: maroon;">"</span><span style="color: #e60000;">{#BASENAME}</span><span style="color: maroon;">"</span>:<span style="color: maroon;">"</span><span style="color: #e60000;">mdb4/EXCH07</span><span style="color: maroon;">"</span><span style="color: #806030;">}</span><span style="color: #44aadd;">,</span> <span style="color: #806030;">{</span> <span style="color: maroon;">"</span><span style="color: #e60000;">{#BASENAME}</span><span style="color: maroon;">"</span>:<span style="color: maroon;">"</span><span style="color: #e60000;">mdb1/EXCH08</span><span style="color: maroon;">"</span><span style="color: #806030;">}</span><span style="color: #806030;">]</span><span style="color: #806030;">}</span></pre>
</li>
<li>В файл <b>zabbix_MailDB_status_result.txt </b>выгружаются пары "база/сервер" - "статус" - этот файл впоследствии будет опрашиваться заббиксом.<br /><pre data-select-like-a-boss="1" style="background: rgb(241, 240, 240);"><span style="color: #005fd2;">mdb3/EXCH01</span> <span style="color: #c00000;">11</span>
<span style="color: #005fd2;">mdb4/EXCH01</span> <span style="color: #c00000;">11</span>
<span style="color: #005fd2;">mdb5/EXCH01</span> <span style="color: #c00000;">11</span>
<span style="color: #005fd2;">mdb1/EXCH01</span> <span style="color: #c00000;">6</span>
<span style="color: #005fd2;">mdb2/EXCH01</span> <span style="color: #c00000;">11</span>
<span style="color: #005fd2;">mdb2/EXCH04</span> <span style="color: #c00000;">6</span>
<span style="color: #005fd2;">mdb3/EXCH04</span> <span style="color: #c00000;">6</span>
<span style="color: #005fd2;">mdb5/EXCH06</span> <span style="color: #c00000;">6</span>
<span style="color: #005fd2;">mdb4/EXCH07</span> <span style="color: #c00000;">6</span>
<span style="color: #005fd2;">mdb1/EXCH08</span> <span style="color: #c00000;">11</span></pre>
Как можно заметить, поле статуса на деле имеет числовое представление, где 11=Mounted, а 6=Healthy.</li>
</ol>
<div>
Суем скрипт в планировщик (задание нужно выполнять с повышенными полномочиями) и теперь у нас есть данные по базам. </div>
</div>
<div>
<br /></div>
<h2>
Настраиваем агент Zabbix на передачу данных</h2>
<div>
Для работы с данными, которые мы получили на предыдущем шаге, потребуются (по крайней мере я не нашел способа обойтись без них) 2 дополнительные утилиты: <a href="https://drive.google.com/file/d/0B3kqpI0yeB0iRDJCbnBkN0hCUnc/view?usp=sharing" target="_blank">cut</a> и <a href="https://drive.google.com/file/d/0B3kqpI0yeB0iT3FsZ3ppNVctNHc/view?usp=sharing" target="_blank">iconv</a> - порты одноименных линуксовых утилит. Первая выбирает значение в указанном столбце и служит для парсинга файла <b data-select-like-a-boss="1">zabbix_MailDB_status_result.txt</b><span data-select-like-a-boss="1">, вторая - конвертирует JSON-файл </span><b style="-webkit-user-select: text !important; outline: none !important;">zabbix_MailDB_status_discovery.txt</b> в UTF-8. И да, я знаю что Powershell умеет выгружать в файл в указанной кодировке, в т.ч. UTF-8, но делает он это так, что zabbix перестает понимать, что выгружается JSON, и будет ругаться, что вы подсунули неправильный формат. </div>
<div>
<br /></div>
<div>
Кладем cut в каталог с виндой (так он окажется в поле переменно PATH), а iconv (все его файлы) - например в папку с установленным агентом. После этого у меня образовались 2 строки в zabbix_agent.conf:</div>
<div>
<pre style="background: rgb(241, 240, 240);"><span style="color: #005fd2;">UserParameter=exchange.MailDBStatus.discovery</span><span style="color: #44aadd;">,</span><span style="color: #e60000;">cmd</span> <span style="color: #e60000;">/c</span> <span style="color: #e60000;">type</span> <span style="color: #e60000;">c:\zabbix_MailDB_status_discovery.txt</span> <span style="color: #bb7977; font-weight: bold;">|</span> <span style="color: #005fd2;">%windir%\zabbix_agent\win\x64\iconv.exe</span> <span style="color: #074726;">-f</span> <span style="color: #c00000;">866</span> <span style="color: #074726;">-t</span> <span style="color: #e60000;">utf-8</span>
<span style="color: #005fd2;">
</span></pre>
<pre style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial;"><span style="background-color: #f1f0f0; color: #005fd2;">UserParameter=exchange.MailDBStatus.getstatus[*]</span><span style="background-color: #f1f0f0; color: #44aadd;">,</span><span style="background-color: #f1f0f0; color: #e60000;">cmd</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #e60000;">/c</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #e60000;">type</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #e60000;">c:\zabbix_MailDB_status_result.txt</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #bb7977; font-weight: bold;">|</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #005fd2;">find</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #e60000;">/i</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: maroon;">"</span><span style="background-color: #f1f0f0; color: #e60000;">$1</span><span style="background-color: #f1f0f0; color: maroon;">"</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #bb7977; font-weight: bold;">|</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #005fd2;">cut</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #074726;">-d</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: maroon;">"</span><span style="background-color: #f1f0f0; color: #e60000;"> </span><span style="background-color: #f1f0f0; color: maroon;">"</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #074726;">-f</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #c00000;">2
</span> </pre>
Первый параметр - <b>exchange.MailDBStatus.discovery</b> - будет передавать наш JSON. </div>
<div>
Второй - <b style="-webkit-user-select: text !important; outline: none !important;">exchange.</b><b>MailDBStatus.getstatus[*] </b>- будет принимать вместо астериска имя базы данных/сервера (я упомяну об этом ниже) и передавать в конструкцию<b> find /i "$1"</b>. Таким образом второй параметр будет передавать состояние базы исходя из ее имени.</div>
<div>
<br /></div>
<h2>
Настраиваем Zabbix-сервер</h2>
<div>
На сервере нам нужно создать <b>Discovery Rule</b> с одним <b>Item prototype</b> и одним <b>Trigger prototype</b>.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-zQQBVjZK1Yo/Vl1KZIPf6bI/AAAAAAAAWRQ/AeVdVyyvcyE/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="67" src="http://1.bp.blogspot.com/-zQQBVjZK1Yo/Vl1KZIPf6bI/AAAAAAAAWRQ/AeVdVyyvcyE/s400/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">(Кликабельно)</td></tr>
</tbody></table>
<div>
Я создал это правило в темплейте, который в моем случае применяется для серверов Exchange, но можно это сделать и для конкретного сервера, с которого будет читаться информация.</div>
<div>
<br /></div>
<div>
Настройки самого Discovery Rule</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-8l-Hae8N80Y/Vl1LCsa42eI/AAAAAAAAWRY/TZJei3uXBU4/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="349" src="http://3.bp.blogspot.com/-8l-Hae8N80Y/Vl1LCsa42eI/AAAAAAAAWRY/TZJei3uXBU4/s400/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" width="400" /></a></div>
<div>
<br /></div>
<div>
Как можно видеть, в качестве ключа (<b>Key</b>) указан параметр <b>exchange.MailDBStatus.discovery</b> - через этот параметр, как мы помним, агент отдает наш JSON-файл со списком "имя_базы/имя_сервера". Если быть точнее, то, посмотрев в файл, мы увидим что передаются пары вида:<br /><span data-select-like-a-boss="1" style="color: #806030;">{</span><span style="background-color: #f1f0f0;"> </span><span style="color: maroon;">"</span><span style="color: #e60000;">{#BASENAME}</span><span style="color: maroon;">"</span><span style="background-color: #f1f0f0;">:</span><span style="color: maroon;">"</span><span style="color: #e60000;">mdb3/EXCH01</span><span style="color: maroon;">"</span><span style="color: #806030;">}</span>т.е. переменная с именем "<b>{#BASENAME}</b>" и значение - "имя_базы/имя_сервера". Странное имя переменной обусловлено тем, что оно должно выглядеть как заббиксопонятное имя шаблона - <b>{#имя}</b>.</div>
<div>
<br /></div>
<div>
Итак, согласно этим настройкам, раз в час сервером будет перезапрашиваться JSON. Чтобы на основе этого JSON'а сформировались итемы, нам нужно создать <b>Item Prototype</b> для этого <b>Discovery Rule</b>.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-CMHpDoX7UsA/Vl1N83vjySI/AAAAAAAAWRk/kVuHr0_Q5Ks/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://3.bp.blogspot.com/-CMHpDoX7UsA/Vl1N83vjySI/AAAAAAAAWRk/kVuHr0_Q5Ks/s400/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" width="357" /></a></div>
<div>
<br /></div>
<div>
Вот здесь вступает в дело второй параметр нашего конфига агента - <b style="-webkit-user-select: text !important; outline: none !important;">exchange.</b><b data-select-like-a-boss="1">MailDBStatus.getstatus[*]</b>. В настройках <b>Item prototype</b> этот параметр принимает вид <b>exchange.MailDBStatus.getstatus[{#BASENAME}]</b>. Отмечу, что само название итем прототипа тоже должно содержать шаблон <b>{#BASENAME}</b>, так как в комплексе это работает следующим образом: </div>
<div>
<ol>
<li>Discovery Rule получает JSON </li>
<li>В JSON через переменную <b>{#BASENAME}</b> передаются имена баз</li>
<li>Item prototype генерит Items, подставляя вместо <b>{#BASENAME}</b> реальные имена баз - как в название итема, так и в параметр Key, через которых осуществляется связь с агентом.</li>
</ol>
<div>
Таким образом, если мы <b>не</b> укажем <b>{#BASENAME}</b> в имени прототипа, то при наличии нескольких баз заббикс не сможет сгенерить итемы - имена итемов должны быть уникальны.</div>
</div>
<div>
<br /></div>
<div>
Едем дальше - создаем <b>Trigger prototype</b>. </div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-cjfc4xXDB0c/Vl1QY2EUVZI/AAAAAAAAWRw/dtXPh0Q7T34/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="http://4.bp.blogspot.com/-cjfc4xXDB0c/Vl1QY2EUVZI/AAAAAAAAWRw/dtXPh0Q7T34/s400/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" width="400" /></a></div>
<div>
<br /></div>
<div>
Аналогично, в имени указываем <b style="-webkit-user-select: text !important; outline: none !important;">{#BASENAME}</b><span style="-webkit-user-select: text !important; outline: none !important;">, чтобы для каждой базы смог сгенерироваться триггер с уникальным именем. В "выражении" проверяем чтобы наш ключ (</span><b style="-webkit-user-select: text !important; outline: none !important;">exchange.MailDBStatus.getstatus[{#BASENAME}]</b>) был <b>не</b> равен 6 И <b>не</b> равен 11 - то есть <b>не</b> равен значениям, которые соответствуют нормальным статусам баз. Замечу, также, что при добавлении <b>Trigger expression</b> нужно давить на <b>Select prototype</b>, потому что мы создаем триггер на основе не уже готового итема, а итемов, которые будут создаваться из прототипа.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-2Oe0-7sH9lg/Vl1TMhKW88I/AAAAAAAAWR8/p45wPUVN460/s1600/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="148" src="http://4.bp.blogspot.com/-2Oe0-7sH9lg/Vl1TMhKW88I/AAAAAAAAWR8/p45wPUVN460/s400/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.PNG" width="400" /></a></div>
<div>
<br /></div>
<h2>
Резюме</h2>
<div>
<ol>
<li>Мы по шедулеру на сервере Exchange выгружаем JSON с именами баз и пары "имя базы"-"статус"</li>
<li>Мы создали Discovery rule, которое читает JSON через ключ на агенте. </li>
<li>Мы создали итем и триггер прототипы, которые используют полученные значения переменной <b data-select-like-a-boss="1">{#BASENAME}</b></li>
<li> На основе имен баз из прототипов генерятся итемы и триггеры. </li>
<li>Созданные итемы обращаются по ключу к агенту</li>
<li>Агент, сверив имя запрашиваемого ключа с описанным у себя, подставляет имя базы вместо астериска передает его в командную строку отвечающую за вывод значения<br /><pre data-select-like-a-boss="1" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial;"><span style="background-color: #f1f0f0; color: #005fd2;">UserParameter=exchange.MailDBStatus.getstatus[*]</span><span style="background-color: #f1f0f0; color: #44aadd;">,</span><span style="background-color: #f1f0f0; color: #e60000;">cmd</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #e60000;">/c</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #e60000;">type</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #e60000;">c:\zabbix_MailDB_status_result.txt</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #bb7977; font-weight: bold;">|</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #005fd2;">find</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #e60000;">/i</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: maroon;">"</span><span style="background-color: #f1f0f0; color: #e60000;">$1</span><span style="background-color: #f1f0f0; color: maroon;">"</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #bb7977; font-weight: bold;">|</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #005fd2;">cut</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #074726;">-d</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: maroon;">"</span><span style="background-color: #f1f0f0; color: #e60000;"> </span><span style="background-color: #f1f0f0; color: maroon;">"</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #074726;">-f</span><span style="background-color: #f1f0f0;"> </span><span style="background-color: #f1f0f0; color: #c00000;">2</span></pre>
</li>
<li>Таким образом один юзерпараметр с астериском обслуживает все ключи с конкретными именами баз, выдавая статус.</li>
<li>Триггер реагирует на "неправильный" статус.</li>
</ol>
</div>
</div>
Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com4tag:blogger.com,1999:blog-4435746224454743817.post-64809789808375803982015-11-26T11:58:00.002+03:002015-11-26T11:58:56.270+03:00Конвертирование объектов PowerShell 2 в JSONВ инете распространены скрипты для PowerShell 2, использующие фреймворк. Однако этот способ у меня не заработал - выдавал ошибки типа "Invalid JSON primitive: Microsoft.Exchange.Management.SystemConfigurationTasks.DatabaseCopyStatusEntry."<br />
<br />
Для таких страдальцев как я, нашелся отличный работающий скрипт конвертации: <a href="https://gist.github.com/mdnmdn/6936714">https://gist.github.com/mdnmdn/6936714</a><br />
<br />
Скачать архивом (актуальность на момент поста): <a href="https://drive.google.com/file/d/0B3kqpI0yeB0iLWE1YmRHZ2lCQmc/view?usp=sharing" target="_blank">ConvertTo-JSON.zip</a>Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0tag:blogger.com,1999:blog-4435746224454743817.post-15501625959192142152015-11-19T11:27:00.000+03:002015-11-22T21:49:39.980+03:00[решено] Падение производительности Veeam Backup на больших серверахДолгое время не мог понять, почему Veeam Backup & Replication (6.5 на Win2008/R2) постепенно теряет производительность при бэкапе больших (>2TB) виртуальных машин. Скорость копирования падала с >100MB/c на старте задания до 1-2 MB спустя несколько часов.<br />
Оказалось, дело в неправильной работе дискового кэша в Win 2008/R2 (говорят, в 2012м сервере это поправили, но я не проверял) - он раздувается до неприличных объемов и все начинает тупить и тормозить вплоть до остановки задания.<br />
Для решения этой проблемы я использовал утилиту <a href="https://technet.microsoft.com/ru-ru/sysinternals/bb897561.aspx" target="_blank">cacheset</a> от Марка Руссиновича. Она позволяет выставить минимальный и максимальный размеры кэша, при этом раздутый кэш сдувается до установленных лимитов. Однако, как выяснилось, эти лимиты через какое-то время снова сбрасываются, поэтому данную утилиту я запихал в шедулер:<br />
<br />
<b>c:\bin\cacheset 1024 100000</b><br />
где 1024 - минимальный размер кэша в KB, 100000 - максимальный.<br />
<br />
Запуск этой команды раз в час обеспечил решение проблемы.<br />
<br />
Скачать: <a href="https://technet.microsoft.com/ru-ru/sysinternals/bb897561.aspx" target="_blank">с офиц. сайта</a>, <a href="https://drive.google.com/file/d/0B3kqpI0yeB0ibjhoRmNHVVZ4VnM/view?usp=sharing" target="_blank">отсюда</a>Sergey Pavlovhttp://www.blogger.com/profile/16417568840456263866noreply@blogger.com0