2019-11-29

Переехал на свой хост...

...так что продолжение тут: https://qiwichupa.net/c/obryvki

2017-08-22

Использование снапшотов LVM как точки восстановления

Это вольный перевод найденного в инете комментария. В ubuntu синтаксис немного отличается в части указания названия томов, например не "lvrename lvm root root-old", а "lvrename /dev/lvm/root /dev/lvm/root-old". В остальном все соответствует.



Потребуется несколько перезагрузок.
Для начала переименуем оригинальный root во что-то новое, чтобы дать это имя снапшоту.:

# lvrename lvm root root-old
# lvcreate -n root -s lvm/root-old -L 10G

Перезагрузимся, чтобы «новый» root смонтировался и мы могли произвести изменения. После этого мы можем их протестировать, а также вернуться к старой системе.

# lvrename lvm root root-new
# lvrename lvm root-old root
# reboot

Если мы хотим откатить изменения и вернуть все как было, выполняем (из старой системы)

# lvremove lvm/root-new

Если мы хотим применить изменения, выполняем (из старой истемы)

# lvconvert --merge lvm/root-new

или из новой системы

# lvrename lvm root root-new
# lvconvert --merge lvm/root-new
# lvrename lvm root-old root
# reboot


Система откажется применять изменения на открытых томах, так что мердж произойдет во время загрузки.

2017-06-18

Тормозит Lightroom 5, неожиданное решение

Долгое время страдал от диких тормозов в лайтруме. Тормоза были при скроллинге фоток во вьювере, при их обработке - решительно во всех местах лайтрума, причем независимо от размера каталога. В инете можно нагуглить приличное количество решений проблемы - изменение размера кэша Camera RAW, или включение поддержки использования видеокарты (в какой-то версии лайтрума) - но все они мне не помогли.
Совершенно неожиданно проблема таилась в совершенно неожиданном месте - в галочке "Использовать системное сглаживание шрифтов"


Невероятно, но факт - когда-то я видимо зачем-то снял эту галку и забыл о ней, и все это время страдал от тормозов, но после возвращения этой опции назад тормоза улетучились! Что это было - непонятно, но надеюсь кому-то эта галка поможет как и мне =))

2017-04-13

Как избавиться от вируса EIMG001.exe и NsCpuCNMiner32.exe в большой сети

Если в вашей большой корпоративной сети обнаружилась движуха с сабжевым вирусом, который расползся по компам, проще всего заблокировать его запуск через GPO - это позволит прекратить или как минимум ограничить его распространение.

Для этого нужно иметь под рукой файлы вируса (большой самораспаковывающийся архив EIMG001.exe и файлы самого майнера, которые можно достать из него:  NsCpuCNMiner32.exe и NsCpuCNMiner64.exe). Политика запрета будет выглядеть примерно так (кликабельно):



Указаны два варианта: через Software Restriction Policies, или Application Control Policies - оба в целом равноценны. В обоих случаях файлы можно добавлять по имени или по хэшу, предпочтителен второй вариант на случай попыток вируса переименовать исполняемые файлы.

2017-02-15

Как перенести Linux с одного mdamd-raid на другой

Сегодня я бы хотел поговорить о такой серьезной с точки зрения надежности вещи, как линуксовый софтварный рейд. А, вернее, показать, как можно спасти систему, которая требует замены дисков, на которых она и была установлена. Я рассмотрю 2 дистрибутива линукса - CentOS 7 и Debian 8 - которые будут поставлены в идентичные исходные условия. Также, так как тема мне кажется достойной лишней наглядности, помимо традиционных скриншотов и текста, в конце я оставлю ссылки на видео, в которых полностью показана вся процедура: от момента установки исходной системы, до восстановления ее работоспособности на новых дисках.

Общая часть: приготовление и восстановление бэкапа

В качестве исходной системы у нас Дебиан/Центось, установленные на один ext4-раздел, который зеркалится на 2 физических диска (скриншоты с центоси).


Легким движением руки выдираем один из дисков, создавая деградацию рейда.


Время делать бэкап =)
Конечно лучше если бэкап уже есть, но в нашем простом случае сделать бэкап также легко:


tar -czpvf /mnt/backup.tgz --exclude=/dev --exclude=/proc --exclude=/sys --exclude=/mnt /  
Эта команда создаст сжатую копию всего корня, за исключением трех директорий содержимое которых регенерируется автоматически, и директории /mnt, в которой у нас в данном случае нет ничего, кроме файла бэкапа.

Когда бэкап приготовился, гасим машину и устанавливаем 2 новых харда, которые составят новое зеркало.
Также я использую убунтовый live cd "Boot-Repair" для дальнейших операции, но, собственно, встроенной функцией автоматического восстановления пользоваться не буду. Так что на месте этого диска может быть любой другой Live CD, главное чтобы совпадала архитектура и были доступны утилиты mdadm, chroot, и parted (в моем случае он идет с GUI)

Итак, теперь у нас есть машинка с тремя дисками: половинка бывшего рейда, от которой нам нужен только файл бэкапа; и два новых неотформатированных диска.

После загрузки с лайва, закрываем все выплывающие окошки и открываем редактор разделов. sda1 - бэкап, sdb и sdc - пустые


На дисках sdb и sdc создаем таблицу разделов (Device -> Create Partition Table). Я использую GPT, потому что она подразумевает возможность использования разделов большого объема, а также создает дополнительные сложности для восстановления системы.


После создания таблицы, на обоих дисках создаем симметричную конфигурацию: 2 неотформатированных раздела - первый большой под систему, второй маленький (я оставил буквально 10 мегабайт в конце диска).




Второй раздел нужен для установки загрузчика GRUB2 на GPT. Также необходимо этим разделам добавить флаг. После применения разметки, нужно кликнуть правой мышкой по разделу, выбрать Manage Flags и отметить флаг bios_grub. Это необходимо сделать также на обоих новых дисках.


Теперь, когда разделы подготовлены, открываем терминал и первым делом я устанавливаю mdadm, так как его нет на этом Live CD.

1
2
sudo bash
apt install mdadm


Так как архив у нас лежит не на простом диске, а диске, который некогда был частью рейда, необходимо этот самый рейд обнаружить.

(Warning! Обратите внимание, что в результате выполнения первой команды, при восстановлении центоси создается устройство /dev/md127, а при восстановлении дебиана - /dev/md0. Нижеследующий блок справедлив для центоси)


1
2
3
4
5
6
7
# сканируем систему на наличие рейдов
# эта команда создаст устройство, в моем случае /dev/md127 - нашу 
# половинку зеркала с бэкапом
mdadm --assemble --scan
# создаем папку /mnt/backup и монтируем в нее найденный рейд
mkdir /mnt/backup
mount /dev/md127 /mnt/backup

Файлик бэкапа у нас в каталоге /mnt/backup/mnt/, теперь нужно приготовить новый рейд и залить на него бэкап.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# создаем новое устройство рейда
# имя может быть любым незанятым, 
# например /dev/md1
# --level=1 - зеркало
# --raid-devices=2 - 2 диска в рейде
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
# форматируем новый рейд
mkfs.ext4 /dev/md1
# создаем директорию и монтируем рейд в нее
mkdir /mnt/root
mount /dev/md1 /mnt/root
# распаковываем архив 
tar -xpvf /mnt/backup/mnt/backup.tgz -C /mnt/root/

После распаковки нужно чрутнуться в корень восстанавливаемой системы.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# создаем недостающие директории
mkdir /mnt/root/dev
mkdir /mnt/root/proc
mkdir /mnt/root/sys
mkdir /mnt/root/mnt
# к первым трем монтируем рабочие директории лайва
mount -o bind /dev/ /mnt/root/dev/
mount -o bind /proc/ /mnt/root/proc/
mount -o bind /sys/ /mnt/root/sys/
# чрутимся
chroot /mnt/root/

С этого момента пути восстановления дебиана и центоси расходятся

Debian

После чрута выполняем команду 


blkid

Она покажет ID нашего рейда /dev/md1.


Этот ID нужно прописать в /etc/fstab вместо имеющегося там.


Далее выполняем


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# прописываем в конфиг данные актуального рейда
mdadm --detail --scan | grep md1  >  /etc/mdadm/mdadm.conf
# пересобираем initrd
update-initramfs -u
# обновляем конфиг загрузчика
update-grub2
# устанавливаем загрузчик на оба 
# физических диска
grub-install /dev/sdb
grub-install /dev/sdc

Собственно всё. Вытаскиваем старые диски, отключаем сидиром, перезагружаемся и видим наш дебиан в целости и сохранности.

CentOS

С центосью возни чуть больше, чем с дебианом, но ненамного.
После чрута правим /etc/fstab, заменяя айдишник корня на имя устройства. В нашем случае /dev/md1
(Attention! на картинках ниже везде используется /dev/md0 - не обращайте внимания, просто я его так назвал во время экспериментов с центосью)


После этого правим /etc/dracut.conf, раскомментируем параметр mdadmconf и присвоим ему значение yes.


Далее выполняем 

mdadm --detail --scan | grep md1

Эта команда выдаст ID нашего нового рейда.


Этот ID нужно указать в файлике /etc/default/grub вместо старого


Теперь


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# прописываем в конфиг данные актуального рейда
mdadm --detail --scan | grep md1  > /etc/mdadm.conf
# пересобираем initrd, 
# смотрим на ВАШ файлик *.img в директории /boot 
# и меняем версию по аналогии, если она отлична от моей
dracut /boot/initramfs-3.10.0-514.el7.x86_64.img 3.10.0-514.el7.x86_64 --force
# обновляем конфиг загрузчика
grub2-mkconfig -o /boot/grub2/grub.conf
# устанавливаем загрузчик на оба 
# физических диска
grub2-install /dev/sdb
grub2-install /dev/sdc
# создаем специальный файлик, без которого магии не случится
touch /.autorelabel

Перезагружаемся (один раз система перезагрузится автоматически - это нормально) и радуемся ожившей системе.

Вот и сказке конец

Обещанное в начале видео:



2017-01-27

Abaqus: Unable to validate FLEXnet server

На днях с коллегой  столкнулись с проблемой при установке abaqus, на которую потратили бессовестно много времени. Ошибка возникала при указании сервера лицензий (FlexLM) и в сокращенном виде звучала как "Unable to validate FLEXnet server".


Сервер лицензий при этом исправно работал, пинговался и, в целом, не показывал хоть сколько-нибудь адекватных предпосылок для такого облома. К несчастью выгуглить реальную причину так и не удалось ("Technical details" инсталлятора оказались бесполезны), попытки обновить сервер до последней версии к успеху не привели, а причина оказалась довольно проста. Выяснить ее удалось, установив рядом с абакусом сервер лицензий (но без запуска).

В составе сервера лицензий идет утилита, которая позволяет опрашивать сервера лицензий. Для начала мы стукнулись в сервер по айпишнику.



А потом, добавив в hosts имя сервера лицензий (в нашем случае мы работаем с айпишниками), повторили запрос но уже подставив это имя. И о чудо - утилита выдала в консоль список доступных лицензий. 

Оказалось, что FlexLM крайне щепетильно относится к запросам клиентов, и требует чтобы запрос шел или по имени, или по айпишнику, и зависит это от того, что написано в файлике с лицензией! В нашем случае там было указано имя сервера, поэтому при попытке обратиться по IP - сервер считал что спрашивают, возможно, кого-то другого =) Исправить проблему оказалось довольно просто - всего-то нужно поменять имя на IP в первой строке файла лицензий. Можно было бы обращаться к серверу по имени - в большинстве случаев это вообще более правильный подход, но в конкретно нашем случае первый вариант был много проще.


2016-10-28

Как сменить заголовок (dash) стрима на сервисе restream.io с помощью скрипта.

Сервис restream.io позволяет не только разливать стримы на несколько стрим-сервисов, но и централизованно управлять заголовками (дашами, по терминологии твича) на таких сервисах как Twitch или Youtube.

К сожалению разработчики не предоставили никакого апи для этого, так что пришлось заколхозить скрипт, который логинится на сайт и имитирует ручной ввод. Опять таки к сожалению форма ввода даша выполнена на JS, что усложнило заскриптовывание. К счастью, при помощи хромиума и модуля selenium для питона удалось написать скрипт, который делает все что нужно, при том - на безиксовом сервере.

Актуальная версия тут: https://github.com/qiwichupa/restream.io_title_change

2016-10-25

Очистка временных папок во всех профилях терминального сервера

Не обязательно терминального и вообще сервера, но скрипт набросал именно для этой задачи. Не самый оптимальный вариант, но решение вышло вполне себе рабочим и надежным.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Get-ChildItem -Path 'C:\Documents and Settings'   -Force `
    | foreach { $profilePath = $_.Fullname
                $path = $profilePath + "\\Local Settings\\Temp\\"
                Get-ChildItem -Path $path -Force | foreach {$_.FullName
                                                            Remove-Item $_.FullName -Recurse -Force 
                                                            }
                $path = $profilePath + "\\Local Settings\\Temporary Internet Files\\"
                Get-ChildItem -Path $path -Force | foreach {$_.FullName
                                                            Remove-Item $_.FullName -Recurse -Force 
                                                            }                                            
               }
              

2016-09-12

Proxmox и SMB/CIFS-хранилище


Использую Proxmox дома и столкнулся с неприятной проблемой - при бэкапе относительно больших (несколько гиг) виртуалок на сетевую хранилку (бомжовый QNAP), подключенную по NFS, Proxmox затыкался и повисал вхлам. Вероятно в этом виновата хранилка, возможно, не очень тянущая NFS, может быть в проксмоксе с этим какие-то проблемы, но я решил что пусть оно работает через самбу. Делать перманентное подключение не хотелось, так что я воспользовался autofs, которая неплохо зарекомендовала себя на моем ноуте.

Итак, ставим autofs на сервер проксмокса
aptitude install autofs

Создаем корневую папку для шар
mkdir /mnt/autofs

Редактируем /etc/auto.master, добавляя строку
/mnt/autofs /etc/auto.smb --timeout=300

Рестартим сервис
/etc/init.d/autofs restart

Тут надо сказать что это очень упрощенный подход без использования логина и пароля (моя шара домашняя и открыта для всех), и без указания конкретной шары. После всего проделанного, через корень /mnt/autofs будет доступно все сетевое окружение. Например мой NAS имеет IP 192.168.1.2 и шару Public, и я могу теперь обратиться к ней:
ls /mnt/autofs/192.168.1.2/Public

Далее все просто. Создаем папку для проксмокса
mkdir /mnt/autofs/192.168.1.2/Public/proxmox

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



Такой метод вполне подходит для хранения бэкапов, темплейтов и исошников.

2016-09-08

Бэкап всех баз MySQL с ротацией (удалением старых) бэкапов

Скрипт делает дампы всех БД сервера, сохраняя в папки именованные по дате и времени создания. Сохраняются последние N (переменная $BACKUPS) бэкапов.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Optional variables for a backup script
MYSQL_USER="root"
MYSQL_PASS="password"
BACKUP_ROOT=/var/backups/mysql;
BACKUPS=2;
BACKUP_DIR="$BACKUP_ROOT/$(date +%Y-%m-%dT%H_%M_%S)";

# Create folders
test -d "$BACKUP_DIR" || mkdir -p "$BACKUP_DIR"
# Get the database list, exclude information_schema
for db in $(mysql -B -s -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' | grep -v information_schema)
do
  # dump each database in a separate file
  mysqldump -u $MYSQL_USER --password=$MYSQL_PASS "$db" | gzip > "$BACKUP_DIR/$db.sql.gz"
done

# backup cleanup
ls "$BACKUP_ROOT" \
        | head -n$(expr $(ls "$BACKUP_ROOT" | wc -l) - $BACKUPS) \
        | while read in; 
                do rm -rf  "$BACKUP_ROOT/$in"; 
          done

2016-09-03

Aimp: database disk image is malformed

При возникновении такой ошибки стоит проверить файлы баз данных, которые использует AIMP. Они расположены в папке профиля: %appdata%\AIMP и немногочисленных подпапках.
Файлы баз имеют расширение *.db, проверить их можно утилитами для работы с sqlite, например: SqliteBrowser
Поврежденный файл можно просто удалить, если не удается его восстановить. При этом, конечно, в зависимости от файла может потеряться часть настроек - например обнулится медиатека.

2016-08-03

Поиск живых компьютеров в Active Directory

Скрипт для поиска компов, которые меняли свой внутренний пароль в AD в течение последних трех дней:

1
2
3
4
5
6
7
8
9
Import-Module ActiveDirectory

$lastCheckDays = 3

$filter =  (get-date).AddDays(-$lastCheckDays).ToString("dd/MM/yyyy")
get-adcomputer `
            -filter "Passwordlastset -gt '$filter'" `
            -properties * `
            | Select name,passwordlastset,OperatingSystem

Выполнять лучше на контроллере соответствующего домена

Если требуется собрать и свести в один файл информацию о комьютерах из разных доменов, можно использовать такой скрипт
 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
Import-Module ActiveDirectory

$tempfile   = 'c:\temp\comp.csv.temp'
$resultfile = 'c:\temp\comp.csv'
 

function DoDomain($dc)
    {
    $lastCheckDays = 30 # Максимум дней с обновления пароля
    $filter =  (get-date).AddDays(-$lastCheckDays).ToString("dd/MM/yyyy")

    $error.clear()
    try {Get-ADDomain -server "$dc" | Out-Null } # проверка доступности контроллера
    catch {"[Error] $dc" }
    if (!$error){ # если контроллер доступен - понеслась...
        # Вытаскиваем список живых компов, 
        # экспортируем во временный файл, вырезая заголовки
        get-adcomputer `
                    -filter "Passwordlastset -gt '$filter'" `
                    -server "$dc"`
                    -properties name,CanonicalName,passwordlastset,OperatingSystem `
                    | Select name,CanonicalName,passwordlastset,OperatingSystem  `
                    | ConvertTo-Csv -NoTypeInformation `
                    | Select-Object -Skip 1 `
                    | Out-File "$tempfile" 

        #импортируем временный файл с другими заголовками, 
        $tmp = Import-Csv -Header Name,Domain,Date,OS $tempfile

        # из поля с указанием домена и OU компьютера вырезаем все кроме домена
        # для удобства фильтрации по домену например в экселе
        $tmp | ForEach-Object {$_.Domain = [regex]::replace($_.Domain,'/.*','') }

        # выбираем добавлять ли заголовок во временный файл. 
        # Добавляем, если результирующий файл еще не был создан и, следовательно
        # это первый обработанный домен. Записываем временный файл
        if (Test-Path "$resultfile") {
            $tmp | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Out-File "$tempfile" 
            } else {
            $tmp | ConvertTo-Csv -NoTypeInformation |  Out-File "$tempfile" 
            }

        # Добавляем временный файл в конец результирующего
        [System.IO.File]::ReadAllText("$tempfile") | Out-File "$resultfile" -Append 
        
        # пробегаемся по результирующему файлу, удаляя пустые строки 
        # (опять же важно для экселя, чтобы первую строку сделать фильром)
        [System.IO.File]::ReadAllText("$resultfile")  -replace '\s+\r\n+', "`r`n" |  Out-File "$resultfile"
        Remove-Item "$tempfile"
        }
    }




Remove-Item "$resultfile" 

DoDomain("dc.domain1.local")
DoDomain("dc.domain2.local")
DoDomain("dc.domain3.local")

Важно! На контроллерах доменов должна работать служба Active Directory Web Services.
Для контроллеров на Windows 2003, если данная служба не установлена, потребуется установить NET Framework 3.5 SP1, а также патч на фреймворк KB969166 (у микрософта доступен только через общение с саппортом так что выкладываю архив), ну и саму службу

2016-05-21

proxmox: shrink lxc container

Proxmox 4.2
Container: 101
Storage: iSCSI with group "iscsi-lvm-group"
Current size: 20G
Needed size: 10G
  1. BACKUP FIRST!
  2. Stop VM
    lcx-stop -n 101
  3. Check disk
    e2fsck -f  /dev/iscsi-lvm-group/vm-101-disk-1
    (
    use tune2fs if "MMP check failed" error, and e2fsck again)
  4. Do your disk little smaller that you want
    resize2fs /dev/iscsi-lvm-group/vm-101-disk-1 9G
  5. Reduce LVM size to what you want
    lvreduce -L 10G /dev/iscsi-lvm-group/vm-101-disk-1
  6. Resize your disk without size parameter
    resize2fs /dev/iscsi-lvm-group/vm-101-disk-1
  7. Check disk
    e2fsck -f  /dev/iscsi-lvm-group/vm-101-disk-1
    (
    use tune2fs if "MMP check failed" error, and e2fsck again)
  8. Edit disk size in container config
    vi /etc/pve/lxc/101.conf
  9. Run the container

2016-05-12

Поиск левого DHCP для самых маленьких

Маленькая детективная история, которая началась с того, что у клиентов начали появляться трудности с доступом к сетевым ресурсам. Выяснилось что они получают IP-адреса с какого-от левого источника (да, это можно предотвратить, но что не сделано - то не сделано).

Что делаем:

  1. на компе, получившим левый адрес, делаем
    ipconfig /all

    смотрим IP DHCP-сервера: в моем случае 192.168.1.1, он же шлюз - типичная ситуация "кто-то умный принес домашний роутер".
    (Для полноты картины качаем Rogue Checker - утилиту для поиска DHCP-серверов в сети. Полезно для мониторинга ситуации со стороны)
  2. Имея комп с левый адресом пингуем IP DHCP-сервера
    ping 192.168.1.1
    и дальше
    arp -a
    последняя команда выдаст MAC-адрес DHCP-сервера
  3. ищем MAC-адрес на свичах, выясняем порт на котором висит "злоумышленник" (я для этого использую богоподобный скрипт port_report.py)
  4. Если порт подписан и понятно где находится розетка - идем и рассказываем человеку о безопасности на предприятии. Если розетка не подписана - смотрим какие мак-адреса висят на том же порту, если таковые есть - это скорее всего какое-то оборудование предприятия - компы, ip-телефоны и т.д., которые были воткнуты в принесенный роутер.
В моем случае человек принес роутер чтобы к одной розетке подключить несколько компов. При этом использовал его как хаб, таким образом клиентский порт роутера оказался соединен с нашей локалкой, что и вызвало проблемы. К счастью, по засветившимся на порту мак-адресам мы быстро установили какому оборудованию принадлежат маки (спасибо автоматической базе инвентаризации) и на ком это оборудование числится.


2016-05-07

Исправление крестовины (D-Pad) геймпада Retro-bit SNES Gamepad


Для удобства игры на старой Super Famicom прикупил себе пару беспроводных геймпадов Retro-bit (ebay). Нареканий в части беспроводной работы к ним не возникло, но выяснилось, что крестовина (aka directional pad, aka D-Pad) у них самая премерзкая - при нажатии одного из направлений практически неизбежно прожимается одно из смежных. К счастью это оказалось несложно исправить.


2016-04-07

Как убить лишние копии процесса в windows

Потребовалось сотворить костыль, убивающий незавершающиеся копии процесса, на всякий случай оставив последние из запущенных. В моем случае это костыль, но в целом кому-то может и пригодиться, так что выкладываю рецепт на powershell:

$processName = "php-cgi"
$survivorsCount = 6

$processList = Get-Process -Name $processName
$doomedCount = $processList.Count

if ($doomedCount  -gt $survivorsCount) {
  $bulletCount = $doomedCount - $survivorsCount
  $bulletCount
  $killkillkill = $processList | Select-Object -first $bulletCount | Stop-Process -force
}
Сгенерировано: hilite.me

2016-04-01

Простейший пингер с логированием под bash

Собственно пингуем, ведем лог и это все что надо )

#!/bin/bash

if [[ -z "$1" ]]; then
    echo "Please enter IP, ex.: $0 127.0.0.1"
    exit
else
    echo "Logfile: /tmp/ping_$1"
fi

while true
do
    
    while ! ping -c1 $1 &>/dev/null
 do echo "Ping Fail - `date`" >> /tmp/ping_$1
    done

    echo "Host Found - `date`" >> /tmp/ping_$1
    sleep 1
done

2016-03-08

Как по порядку переименовать файлы, скачанные wget по списку

Решил скачать комикс из вконтакта, полученный список (listfile.txt) для скачивания имел примерно такой вид:

https://pp.vk.me/c307313/v307313650/1e94/bj560KCwYY4.jpg
https://pp.vk.me/c307313/v307313650/1692/yFPMOuXHLvw.jpg
...
https://pp.vk.me/c307313/v307313650/1e7b/d-MXTKSZr34.jpg
https://pp.vk.me/c307313/v307313650/1e84/Oj_DhH9Fbvw.jpg

Собственно, после скачивания wget'ом (wget -i listfile.txt) я получил неудобоваримый набор файлов с рандомными названиями, и мне захотелось переименовать их в вид 001.jpg 002.jpg, согласно порядку, в котором они были в исходном файле. Хорошенько попотев, получил такой однострочник:

cat ./listfile.txt | tr -d  '\r' |  while read url; do n=$((n+1)); file="`echo $url| sed -e 's/.*\///'`"; newfile="`printf \"%03d\" $n`";  mv  ./"$file"  ./"$newfile".jpg ;  done


Или, для читаемости, так:

cat ./listfile.txt | tr -d  '\r' |  while read url; 
do 
    n=$((n+1)); 
    file="`echo $url| sed -e 's/.*\///'`"; 
    newfile="`printf \"%03d\" $n`";  
    mv  ./"$file"  ./"$newfile".jpg ;  
done

Немного пояснений:

tr -d  '\r'  - исходный файл у меня был виндовосформирован, поэтому в каждой строке там был лишний символ перевода коретки, который мешался

while read url - стандартный цикл построчного чтения файла в переменную url

n=$((n+1)) - переменная n для нового имени файлов, которая будет прирастать на единицу

file="`echo $url| sed -e 's/.*\///'`" - старое имя файла, которое получается путем обрезания левой части ссылки

newfile="`printf \"%03d\" $n`" - новое имя файла, которое состоит из переменной n сформатированной в трехсимвольное отображение (1,2,3 -> 001, 002, 003).

2016-02-15

Не подключаются мобильные устройства по MTP

Если после установки антивируса касперского к компьютеру перестали подключаться смартфоны, стоит проверить ветку реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{EEC5AD98-8080-425F-922A-DABF3DE3F69A}

Если в ней есть ключи UpperFilters или LowerFilters - удалите их. Массово это можно сделать, проимпортировав политиками reg-файл:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{EEC5AD98-8080-425F-922A-DABF3DE3F69A}]
"UpperFilters"=-
"LowerFilters"=-


Также в интернете встречаются упоминания о ветках:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000} - наличие фильтров тут может привести к неработоспособности всех юсб-устройств,


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318} - ветка, отвечающая за CD-ROM'ы