22 дек. 2014 г.

Решение проблемы с геймпадом - постоянно зажата кнопка.

Была как-то проблема с геймпадом - всё время как буд-то залип правый стик (соответственнок амера в играх всё время крутится и нельзя настроить кнопки - всё время как-будто одна нажата).

Вначале подумал, что джойстик сдох. А нет - на других ПК работает нормально.

Фикс оказался довольно простым.

Запускаем Regedit, там идем в папку:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\MediaProperties\PrivateProperties\Joystick\OEM

Здесь в подпапках находим ту, где будет ключ с названием вашего геймпада в ключе OEMName (см. скриншот ниже). Редктируем ключ и меняем имя на "Logitech Rumblepad 2 USB".

Всё! Тперь джойстик должен работать нормально.


Ссылки:

4 дек. 2014 г.

Linux подмена src для TCP/IP пакетов без использования iptables

Допустим, у нас есть два IP адреса на физической карточке (второй настроен как alias) - 192.168.1.2 и 192.168.1.3.

По умолчанию для подсети 192.168.2.0/24 пакеты идут через интерфейс 192.168.1.2, но мы хотим, чтобы поле src пакетов для определенного dst (в нашем примере - это хост 192.168.2.10) было 192.168.1.3.

Для этого не применяя iptables (который работает на сетевом уровне (Network Layer) модели OSI), можно применить команду ip route, которая всё сделает быстрее, на Link Layer'e:

ip route add 192.168.2.10/32 via 192.168.2.1 dev eth0 src 192.168.1.3


20 нояб. 2014 г.

Добавление второго IP-адреса (алиаса) к сетевой карте в Windows из командной строки (cmd)

Напомню, что для добавления адреса к сетевой карте в GUI необходимо зайти в свойства сетевой карты, свойства протокола TCP/IPv4 и там - в Дополнительно и Добавить:


Но для скриптования или удаленного доступа может пригодиться команда для добавления нетворк алиасов в cmd:

netsh -c Interface ip add address name="Local Area Connection" addr=192.168.1.9 mask=255.255.255.0

А также для их удаления:

netsh -c Interface ip delete address name="Local Area Connection" addr=192.168.1.9

Где name - это название сетевого адаптера, например, в Центре управления сетями / Сетевые подключения. Адрес и маска - понятно.
Команда требует административных привелегий, конечно же.

Ссылки:

Источник

4 нояб. 2014 г.

Решение проблем с зависимостями при локальной установке пакета в Debian

Допустим, есть у нас пакет .deb и мы хотим его установить.
Но dpkg не сможет удовлетворить зависимости. Чтобы сделать это, пробуем установку:

dpkg -i somepackage.deb

dpkg выругается наподобии такого:

dpkg: error processing somepackage (--install): 
 dependency problems - leaving unconfigured 
Errors were encountered while processing:
 somepackage

Теперь установим не удовлетворенные зависимости с помощью команды:

apt-get install -f

Теперь снова повторяем установку .deb-пакета:

dpkg -i somepackage.deb

Теперь пакет должен установиться, если зависимости были удовлетворены.

1 нояб. 2014 г.

Windows 8 после загрузки вылазит сообщение об ошибке Explorer.exe

Если у вас после загрузки Windows 8/8.1 вылазить такое пустое окошко с ошибкой Explorer.exe:


это значит, что у вас скорее всего backdoor или иной вирус прописал себя в автозагрузку вместе с процессом Explorer.exe.

Лечится это следующим образом:
Открываем Run (Win + R) и запускаем редактор реестра regedit.

Там находим ключ HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\Load и смело удаляем его. Всё, теперь эта ошибка вас беспокоить перестанет (не забудьте также изжить вирус, прописавшийся там с помощью, например, бесплатного сканера Kaspersky Virus Removal Tool).

28 июл. 2014 г.

PostgreSQL как посмотреть, где хранятся файлы БД на Linux-машине

Тема на 5 минут. Если сервер настраивался не вами, то бывает сразу сложно разобраться, где лежат файлы БД PostgreSQL, т. к. их расположение может быть настроено отличным, от по-умолчанию, образом.

Поможет в этом следующая консольная команда:

ps auxw | grep postgres | grep -- -D

в итоге, мы получим  нечто на подопбии такого:

postgres 12917  0.0  0.1 118783 60648 ?        S    Jul27   0:01 /usr/pgsql-9/bin/postgres -D /data/postgres-9

Вот после опции -D и указан каталог, в котором лежат файлы БД (обычно в подпапке base).

7 июл. 2014 г.

Удаленное выполнение команд на Windows

Для удаленного выполнения команд в Windows есть отличная штука - PsExec. Принципиально похожа на линуксовый SSH. Эта утилита работает со всеми версиями Windows, начиная с XP (XP, 2003, Vista, 2008, 7,8, 2012).

Итак, на локальной машине скачиваем утилиту (точнее, набор утилит), с сайта Microsoft Technet и распаковываем, например, в папку C:\PSTools.
Далее, открываем консоль путем [Win+R] или Пуск - Выполнить - cmd.
Переходим в распакованную папку:

cd C:\PSTools

Теперь мы можем выполнять команды на удаленной Windows машине, запуская psecex в таком формате:

psexec \\remote_name_or_ip -u user -p password command

На удаленной машине должны быть запущены службы Server и Workstation.

Вот так - из-коробки - работает только на Windows 2003/XP. В версиях начиная с Vista из-за другого механизма доступа (UAC и т. д.), необходимо немного "пошаманить".

На удаленной машине под управлением Windows Vista или поздней открываем Редактор Реестра (Start - Run - regedit) и создаём ключ реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy типа DWORD и со значением 1.

Всё, теперь можно выполнять команды и на удаленной Vista+ системе, выполняя следующую команду:

psexec \\remote_name_or_ip -u user -p password -h command

Флаг -h нужен, чтобы запустить команду от имени Администратора.

Если имя пользователя и праоль совпадают с локальными - их можно не указывать, так же как и пароль - он будет запрошен.

А для того, чтобы получить шелл на удаленной машине, выполняем команду:

psexec \\remote_name_or_ip -u user -p password -h cmd

Ссылки:

  1. http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx
  2. http://forum.sysinternals.com/faq-common-pstools-issues_topic15920.html
  3. http://stackoverflow.com/questions/828432/psexec-access-denied-errors

10 июн. 2014 г.

Как завершить зависший процесс из консоли (cmd) Windows

У Windows есть аналог линуксовой команды kill - taskkill,  позволяющий завершить зависший "намертво" процесс, который никак нельзя завершить в графическом интерфейсе.

Для начала, необходимо узнать PID засшей службы или процесса.

Делаем это либо с помощью команды в cmd (с администраторскими правами) tasklist, либо заходим в апплет Службы, открываем свойства зависшей и смотрим её Имя:


Теперь в cmd (для Windows 2008+ - с правами Администратора) находим PID службы:

C:\Windows\system32>sc queryex nscp

SERVICE_NAME: nscp
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 544


А теперь команда для завершения процесса:

C:\>taskkill /PID 544 /F

30 мая 2014 г.

Решение проблемы с извлечением дисков в Linux

Если привод компакт-дисков не реагирует на нажатие кнопки извлечения, то следует открыть консоль и попробовать выполнить следующую команду от root или с sudo:

eject /dev/cdrom

Если, при этом выдаётся следующая ошибка:

eject: unable to eject, last error: Inappropriate ioctl for device

То нужно попробовать следующую последовательность команд:

file /dev/sr0

должна выдать такой результат:

/dev/sr0: sticky block special

Далее:

eject -i off

После этого диск должен извлечься при нажатии кнопки на дисководе.

Ссылки:

22 мая 2014 г.

Vino - стандартный VNC-сервер многих Linux-дистрибутивов или как настроить удаленный доступ на свой Linux

Недавно столкнулся с проблемой неработоспособности удаленного рабочего стола в Linux Debian. По-умолчанию за подключение удаленно к рабочему столу по протоколу VNC отвечает демон vino.

Конфигурационных файлов в /etc он не имеет, в init.d его тоже нет. Чтобы его настроить делаем следующее:

1. Нужно дописать опцию Enable=true в секции “xdmcp” конфига /etc/gdm3/daemon.conf для Gnome 3.

2. Заходим в консоль под нашим десктопным пользователем и вызываем окно настроек Vino:

vino-preferences

Откроется окно вроде такого:


Где указываем отмечаем галочки и устанавливаем пароль.
Также в опции vino можно зайти через апплет Desktop Sharing или Remote Desktop (смотря какой дистрибутив).

Если отметить опцию Configure network automatically to accept connections, то vino будет открывать порт на роутере (если там разрешен UPnP) 5900 наружу, в Интернет, что обычно не желательно.

3. Запускаем собственно демона:

export DISPLAY=:0.0
xhost +/usr/lib/vino/vino-server &
netstat -nl | grep 5900
Последняя команда служит для проверки того, что vino запустился и слушает порт 5900.

4. Теперь с другой машины, которая имеет доступ к нашей пробуем подключиться (для Windows это можно сделать при помощи бесплатных программ TightVNC или UltraVNC).

Настройки по-умолчанию должны сработать.

5. Теперь проблема в том, что vino не стартует со стартом системы и не имеет скрипта запуска. И стартовать он должен с тем пользователем, на который планируется удалённый вход. Для этого нужно добавить в файл /home/username/.bashrc в конец следующие строчки:

export DISPLAY=:0.0
/usr/lib/vino/vino-server &

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

UPDATE:

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

export DISPLAY=:0.0
ps cax | grep vino-server > /dev/null
if [ $? -ne 0 ]; then
  /usr/lib/vino/vino-server &
fi

Ссылки:
  1. http://debian-handbook.info/browse/wheezy/sect.remote-login.html
  2. http://ubuntuforums.org/showthread.php?t=266981&s=bdce9ca764aeb4ff4abf932220541d93
  3. http://stackoverflow.com/questions/9117507/linux-unix-command-to-determine-if-process-is-running

21 мая 2014 г.

Студенческий анлок (Jailbreak) смартфонов под управлением Windows Phone 7 (Nokia Lumia)

Для телефонов под управлением Windows Phone 7.8 (а так же 7.5 и 8) существует несколько способов анлока или джеилбрейка, но почти все эти способы работают не на всех моделях и даже если модель подходит, то в ней может оказаться не подходящий загрузчик (а подходящий как правило есть только в самых ранних партиях).

Самый безопасный, но и самый мало функциональный анлок - это т. н. студенческий.

Суть его состоит в том, что мы совершенно легально регистрируемся как начинающий разработчик для платформы Windows Phone, что дает нам возможность устанавливать приложения не только из Магазина, но и из пакетов XAP.

Бесплатный студенческий аккаунт позволяет установить одновременно только 2 пакета XAP... Можно увеличить лимит до 10, если купить платный аккаунт.

Процедура такова.

1. Вначале нам нужно заиметь почтовый ящик в домене .edu дабы подтвердить наш студенческий статус. Если у вас уже есть такой почтовый ящик, то используйте его. А если нет, то вы можете получить свой выполнив бесплатную регистрацию на сайте  https://secure.californiacolleges.edu/ - нужно просто заполнить вдумчиво форму - и всё, почтовый ящик у нас есть. Входящую почту нужно искать (после лог-ина, естественно)  по этому адресу.

2. Теперь необходимо зарегистрировать аккаунт разработчика. Для этого идем на сайт Microsoft Dreamspark и нажимаем внизу Create account. Идти желательно браузером Internet Explorer. Заполняем форму - там всё очевидно. Также нужно уже иметь или зарегистрировать аккаунт Windows Live ID. Именно здесь на этапе регистрации нужно будет ввести свой адрес почты .edu для получения письма с ссылкой для подтверждения аккаунта. Письма на этом сайте отображаются несколько кривовато, потому с ссылкой придется малость повозиться - я уже не помню точно, как я ее оттуда вытащил, но это вполне реально.
Находим строчку вида:
-Navigate to: https://www.msacademicverify.com/AVE/NewActivate?=
ACID=3DL%2byQVWHYymALYTI%2flZA%3d%3d&lc=3D1033=0D
И экспериментируем. "=0D" в конце точно не нужно копировать. Также нужно убрать пробелы.

3. После регистрации, подтверждения и авторизации идем сюда  Windows Phone 7 App Development и скачиваем Windows Phone SDK. Точнее, 3 его компоненты и устанавливаем в том порядке, в котором написано в даунлоадере (он представляет из себя 2 плагина для IE, описание установки которых и ссылки есть на страничке скачивания). Скачать можно ТОЛЬКО в браузере Internet Explorer. Никакие Chrome или Firefox тут не помогут... Майкрософт, что ж вы хотели.

4. Подключаем Nokia Lumia, которой хотим сделать анлок к ПК. На Пк должен быть установлен Zune. Запускаем программу Windows Phone Developer Registration, которая идёт вместе с Windows Phone SDK. Предварительно разблокировав экран телефона (иначе получите ошибку как на моей картинке)


Вводим данные своего аккаунта Windows Live ID и нажимаем кнопку внизу, ждем положительного результата.

5. Теперь можно ставить программы из пакета XAP с помощью опять же входящей в установленную Windows Phone SDK утилиты Application Deployment:


Здесь указываем XAP, нажимаем Deploy и дожидаемся результата. При запуске этой утилиты экран телефона так же должен быть разблокирован!

При достижении лимита пакетов (по-умолч. 2) будете получать ошибку с кодом 0×81030119.
"Error - 0x89731811" - означает, что не запущен Zune или его служба. Соответственно, запускаем Zune и смотрим, чтобы он увидел телефон.

Всё вышеописанное проверено и работает на телефоне Nokia Lumia 900.

Ссылки:
  1. http://jailbreaknokia.blogspot.com/2013/07/jailbreak-nokia-lumia-900.html
  2. http://atechguide.com/get-edu-email-address/
  3. http://forum.xda-developers.com/showthread.php?t=917613
UPD
Нашел расшифровку некоторых кодов ошибок при Application Deployment:

  • 0×8973180E: Zune программное обеспечение не установлено. Пожалуйста, установите последнюю версию программного обеспечения Zune.
  • 0×8973180F: неправильная версия softeware Zune установлен. Вы можете скачать последнюю версию.
  • 0×89731810: Поврежденный конфигурации устройства. Чтобы устранить эту проблему, переустановите Visual Studio 2010 Express для Windows Phone.
  • 0×89731811: Zune программного обеспечения не запускается. Пожалуйста, попробуйте еще раз с Zune для обеспечения работы программного обеспечения.
  • 0×89731812: Подключение к устройству не удалось. Пожалуйста, убедитесь, что телефон подключен и не на экране блокировки.
  • 0×89731813: Применение Не удалось запустить. Пожалуйста, убедитесь, что устройство было зарегистрировано и разблокирована. Объяснение о том, как зарегистрироваться можно найти здесь .
  • 0×89740005: Закончился срок регистрации телефона как для разработки. Т. е. нужно повторить пункт 4. Ну или телефон вообще не был зарегистрирован. 
  • 0×89740006: Телефон заблокирован. Пожалуйста, разблокируйте телефон и попробуйте снова.
  • 0×81030110: Не удалось установить приложение. Runtime ошибка. Возможности WMAppManifest.xml файл, расположенный в содержимом атрибута является неправильным.
  • 0×81030118: Установка приложения не удалась. Устройство разработчик заблокирован. Регистрация для разработчиков разблокировать программу перед развертыванием приложения.
  • 0×81030119: Не удается установить приложение. Вы достигли максимального числа приложений, разрабатываемых для устройства может быть установлен на такое развитие событий. Пожалуйста, удалите предыдущие разработчиком приложения. (можно просто увеличить число устанавливаемых приложений с помощью твика или xap).
  • 0x81030120: Устанавливаемое приложение имеет флаг ID_CAP_INTEROPSERVICES.

Починка колёсика мышки, если изображение дергается при прокручивании

Недавно приключилась такая беда - у мышки фирмы A4Tech X5 стало глючить колёсико - при прокручивании колёсиком картинка дергается вверх-вниз. Мышка мне очень нравится и выбрасывать её было жалко. К тому же решение проблемы нашлось в интернете.

Пишут, что этот бок проявляется в течении полгода-года на многих мышках фирмы A4Tech и лечится следующим образом:

1. Разбираем мышку (обычно путем откручивания пары болтов внизу)

2. Находим механизм колесика и аккуратно вытаскиваем колесико вместе с осью на которой оно сидит (отгибаем слегка вверх и вытаскиваем). Видим нечто похожее как на картинке:


3. Стрелками указаны металлические зажими, который надо подогнуть к механизму. Я сделал это кусачками, можно утконосами, маленькими плоскогубцами или чем-нибудь похожим - но без сильного фанатизма, чтобы не сломать! :)

4. Собираем всю конструкцию воедино и наслаждаемся нормальной работой колёсика.

Ссылки:

http://uluchshim.ru/2010/11/kak-pochinit-slomannoe-ili-ploxo-rabotayushhee-kolesiko-na-lyuboj-myshke/

2 мая 2014 г.

Как создать файл произвольного размера в OS Windows

Делается это довольно просто. Открываем консоль (cmd)  и набираем команду, например, для файла размеров 2 Гб (последний аргумент - в байтах)

fsutil file createnew C:\testfile.txt 2147483648


27 мар. 2014 г.

Ошибка после установки Zabbix: Zabbix server is not running: the information displayed may not be current

Если вы установили серверную часть системы мониторинга Zabbix на системах RHEL (Oracle Linux, RedHat, CentOS) и вроде бы всё правильно, но в веб-интерфейсе вылазит ошибка
Zabbix server is not running: the information displayed may not be current

то, здесь обычно 2 варианта:

  • самый простой - не запущен или не корректно сконфигурирован демон zabbix-server. Проверьте, совпадают ли номера портов в конфигах zabbix-server (/etc/zabbix/zabbix_server.conf) и zabbix-web (/etc/zabbix/web/zabbix.conf.php), а так же правильно ли настроено подключение к БД.
  • если всё в конфигурационных файлах правильно и демон запущен, это скорее всего значит, что вам надо или отключить систему защиты SeLinux совсем или - что будет корректнее - изменить политику доступа к портам системы для демона httpd.

1. Проверим, что проблема действительно в настройках SeLinux:

tail -f /var/log/audit/audit.log |grep -i avc

Должны периодически добавляться в лог строки вроде этой:

type=AVC msg=audit(1395664684.460:297): avc:  denied  { name_connect } for  pid=3078 comm="httpd" dest=10051 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:zabbix_port_t:s0 tclass=tcp_socket

а команда:

getsebool -a | grep zabbix

должна в таком случае дать результат:

zabbix_can_network --> off

Изменим политику для httpd:

setsebool -P httpd_can_network_connect on

Проверяем:

getsebool httpd_can_network_connect

Результат должен быть следующий:

httpd_can_network_connect --> on

Теперь веб-интерфейс Zabbix должен нормально подключаться к серверу через порт 10051 (по-умолчанию) и ошибка исчезнет.

24 мар. 2014 г.

Установка и удаление X-сервера для RHEL Linux

Устанавливать X-сервер на серверную машину конечно же не правильно. Но бывают ситуации, когда без этого не обойтись. Например, нужно установить что-либо, а установщик только GUI и экспортировать дисплей нельзя. Для этого можно установить X-сервер (в этой статье будет использован оконный менеджер Gnome), сделать дело и удалить X-сервер полностью.

В общем, от философии к делу.

Для установки X-сервера в RHEL-подобных ОС Linux (Oracle Linux, RedHat, CentOS, Fedora), которые были установлены без Xorg достаточно выполнить команду:

yum groupinstall "GNOME Desktop Environment" "X Window System" "Desktop"

В большинстве случаев создавать/редактировать конфигурационные файлы не понадобиться. Колдовать с конфигом Xorg придётся в случае нестандартных драйверов, режима нескольких мониторов и т. п., что не есть наш случай просто временной установки X-сервера. Запускаем X-сервер:

startx

Далее логинимся, делаем своё черное дело и после этого можно так же легко удалить X сервер вместе со всеми его пакетами:

yum groupremove "GNOME Desktop Environment" "X Window System" "Desktop"

21 мар. 2014 г.

Использование библиотеки Mechanize в Python для авторизации, отправки веб-форм и скачивания файлов

Для языка Python существует довольно много библиотек для работы с веб-ресурсами. Это и стандартная urllib / urllib2 и сторонние - mechanize, Twill, Request, Client Form.

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

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

Проблема заключалась в следующих моментах:

  • для скачивания нужно было авторизоваться на сайте. Причем, авторизация с помощью forms, а не Basic HTTP. 
  • необходимо было хранить кукисы, дабы авторизация не пропала. 
  • путем манипуляций со списками (SelectControl) выбирались параметры скачивания. 
  • далее нужно было получить ссылку, содержащую уникальный токен, не позволявший сачать файл по одной и той же ссылке боле 1 раза просто поменяв параметры GET запроса. 
  • и авторизация и скачивание и всё остальное нехорошие программисты сделали на одной html-странице в одной и той же форме, только с разными кнопками типа Submit.

Итак, начнемс. Вначале импорт необходимых библиотек. Mechanize не идет в стандартной поставке с Python  и его необходимо установить или с помозью PiPy или вручную, как написано на официальном сайте (python setup.py install).


import cookielib, shutil, os
from mechanize import Browser

Далее, создаем объекты: основной Browser и объект для хранения кукисов, который прикрепляем к нашему Browser. Объект Browser представляет собой контейнер по смыслу похожий на вкладку настоящего браузера. Т. е. в пределах его можно оществлять навигацию по web-сайту, авторизацию, хранить кукисы и т. д.


br = Browser()
# Create cookie jar and attach it to Browser
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

Затем, добавляем html хэдэры и открываем URL нужной странички в объекте Browser.


# Add some headers
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
# Open url in Browser instance
br.open('http://www.example.com/download.aspx')

Далее выбираем форму, в которую будем вносить данные. nr=0 - индекс формы по счету в коде веб-страницы (0,1,2 ...) И вводим данные в поля для авторизации в формате (для элементов типа TextControl):

br["id_html_элемента"] = "Значение"

id элементов и возможные значения можно посмотреть двумя способами:
  • в браузере Google Chrome нажать правой кнопкой мыши на нужном элементе и выбрать Просмотр исходного кода элемента, затем правой кнопкой на выделенном элементе и Copy as HTML. После этого, вставить текст в любой текстовый редактор. 
  • выполнив код в интерпретаторе python или в отдельном скрипте:

import cookielib
from mechanize import ParseResponse, urlopen
response = urlopen("http://www.eoddata.com/download.aspx")
forms = ParseResponse(response, backwards_compat=False)
form = forms[0]
print form

Вы получите список всех элементов формы и их возможных значений в формате:

<Тип(id=список_значений)>

Вроде такого:

<aspnetForm POST http://www.example.com/download.aspx application/x-www-form-urlencoded
  <SelectControl(ctl00$DataFormat=[17, 2, 36, 16, 27, 28, 33, 32, 8, 24, 35, *9, 1, 39, 11, 14, 6, 5, 4, 12, 3, 26, 15])>
  <SubmitControl(ctl00$Download=Download) (readonly)>
  <TextControl(ctl00$txtEmail=)>
  <PasswordControl(ctl00$txtPassword=)>
  <CheckboxControl(ctl00$Remember=[on])>
  <SubmitControl(ctl00$btnLogin=Login) (readonly)>>

Итак, пример кода основного скрипта для авторизации:


# Select form for modification and "enter" login info
br.select_form(nr=0)
br["ctl00$txtEmail"] = "User"
br["ctl00$txtPassword"] = "Secret"
# Submit form
br.submit(nr=3)

Обратите внимание на строку

br.submit(nr=3)

В скобках указан номер кноки типа Submit по порядку её нахождения в html-коде страницы. Это важно, если в форме есть несколько кнопок типа Submit, но выполняющих различные функции (как в нашем случае). Нумерация 0,1,2...

Далее, выбираем необходимые данные в списках значений, например (значения посмотреть описанными выше методами):


br.select_form(nr=0)
# Select Options
br["ctl00$cboSomething"] = ["EXAMPLE",]
br["ctl00$cboDataFormat"] = ["11",]
# Update page
br.submit(nr=1)

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

Скачиваем файл (считая, что искомый URL на файл находится в переменной download_url):


local_path = "/home/user"
filename = "very_important.txt"
f = br.retrieve(download_url)[0]
# Copy saved file to normal location
shutil.copy2(f,os.path.join(local_path, filename))

В переменной f мы получаем путь к скачанному файлу, обычно это какое-то случайное имя в директории /tmp. Далее перемещаем его в нужное нам место.

Ссылки:
  • http://stockrt.github.io/p/emulating-a-browser-in-python-with-mechanize/
  • http://www.voidspace.org.uk/python/articles/authentication.shtml
  • http://mozgovipc.blogspot.com/2012/06/python-http-basic-authentication-with.html
  • http://docs.python-requests.org/en/latest/
  • http://stackoverflow.com/questions/9541677/urllib2-post-request
  • http://docs.python.org/2/howto/urllib2.html
  • http://stackoverflow.com/questions/9288662/need-more-mechanize-documentation-python
  • http://www.pythonforbeginners.com/cheatsheet/python-mechanize-cheat-sheet
  • http://blog.spritecloud.com/2010/01/posting-forms-with-python/

Регулирование частоты CPU (энергосбережение) в Linux Debian

CPU загружен полностью не всегда, потому для повышения энергосбережения современные поколения процессоров позволяют уменьшать свою частоту во время простоя. В Windows Vista, 7, 8 этот принцип реализован по-умолчанию (включается/выключается в настройках BIOS), а в OS Linux для этого нужно установить специального демона cpufrequtils:

aptitude install cpufrequtils

Он запустится и по-умолчанию в нем настроен т. н. governor (регулятор) управления частотой ondemand. Регуляторы бывают:
  • performance, производительность (по умолчанию). Этот регулятор встроен в ядро и заставляет работать CPU с максимальной скоростью; 
  • ondemand. Динамически изменяет частоту процессора в зависимости от нагрузки на систему (повышает частоту при достижении 95% нагрузки на текущей частоте); 
  • conservative. Похоже на регулятор ondemand, разница лишь в том, что повышает частоту при достижении 75% нагрузки на текущей частоте; 
  • powersave. Выставляет минимальную частоту для процессора; 
  • userspace. Пользователь выставляет частоту вручную. 
Задать регулятор можно в файле /etc/default/cpufrequtils (если его нет, нужно создать), например:

# valid values: userspace conservative powersave ondemand performance 
# get them from cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
GOVERNOR="conservative"

14 мар. 2014 г.

Определение и вызов fabric task в одном Python скрипте

Библиотека fabric для Python является хорошим средством для автоматизации действий (админимстрирования, deployment и т. д.) для инфраструктуры серверов под управлением ОС Linux. Библиотека использует протокол open ssh для выполнения команд и перемещения данных.

Подробнее о библиотеке можно прочитать на официальном сайте или здесь.

Бывают ситуации, когда необходимо в одном скрипте и объявить таск из библиотеки fabric и выполнить его.

Пример структуры такого скрипта:

#!/usr/bin/env python
# Script dependencies: python-devel, fabric (https://github.com/fabric/fabric/archive/master.zip)
# Usage: python script.py
import fabric
from fabric.api import *
# Define ssh-like address user@server_hostname
remote_host = user@server

def some_fab_task():
    # Define fabric task here
    # hide('everything') helps to execute task with minimum output to console
    with settings(hide('everything')):
        try:
           ....
        except:
           ....

# Main function
if __name__ == '__main__':
    # Call fabric task from here
    fabric.tasks.execute(some_fab_task, hosts=[remote_host])

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

Update:

Для передачи аргументов в скрипт, указываем их перед hosts=.


fabric.tasks.execute(some_fab_task, arg1, arg2, hosts=[remote_host])

Для передачи xargs, можно указывать их также до или после hosts=


fabric.tasks.execute(some_fab_task, arg1, arg2, hosts=[remote_host], xarg1=value1)

6 мар. 2014 г.

Автоматизация скриптов с помощью expect

Недавно открыл для себя интересную консольную утилиту expect. Сия утилита является интерпретатором (со своим языком) для взаимодействия с интерактивными (т. е. требующими какого-либо ввода от пользователя) программами.

Дабы не писать много лишнего, рассмотрим использование expect на примере.

Допустим,
  • есть удалённый sftp-сервер с адресом 192.168.1.2, 
  • к которому у нас есть доступы вида user/SECRET, порт 20022,
  • нам нужно автоматически брать с этого сервера файл вида TODAYDATE_smtng_important.txt, где TODAYDATE - текущая дата вида YYYYMMDD, 
  • файлик лежит в корневой директории.
При авторизации на sftp-сервере требуется ввод пароля, который никак ни опцией ни указать, ни ключ не прокинуть (предположим, нет административного доступа на sftp-сервер).

Вот именно здесь в автоматизации этой задачи поможет нам линуксовая консольная утилита expect.

создаем файл get_file.sh со следующим содержимым:

#!/usr/bin/expect
# Script to get important file from sftp quetly. Uses expect (yum install expect -y)
# Usage: ./get_file.sh YYYYMMDD
# where YYYYMMDD - today's date

set today [lindex $argv 0]
spawn sftp -oPort=20022 user@192.168.1.2:${today}_smtng_important.txt /home/user/${today}_smtng_important.txt
expect "password:"
send "SECRET\n";
interact

Строки после комментария:
  1. Создаем переменную today, присваивая ей первый аргумент, переданный скрипту при запуске.
  2. Выполняем команду для подключения к sftp, где вместо ${today} интерпретатор вставляет значение даты (переданное скрипту)
  3. Далее скрипт ждет указанного запроса (prompt) - здесь возможно много вариантов, в т. ч. и таймауты и различные prompt-ы, об этом можно прочитать в мане или в более расширенных статьях.
  4. Получив указанный выше промпт, посылаем в ответ наш пароль и знак окончания строки (аналог нажатия пользователем [Enter])
  5. Далее скрипт полностью передает управление пользователю.
Запускать скрипт, понятное дело после chmod o+x, например так:

./get_file.sh 20142902

Минусом изложенного подхода, конечно же, является хранение пароля для sftp в открытом, не зашифрованном виде.

Ссылки:

  1. Хорошая статья по командам expect
  2. Туториал по expect
  3. Ман по sftp в Linux


13 февр. 2014 г.

Установка системы мониторинга Nagios Core 4 на Linux Debian 6

Недавно возникла необходимость установить систему мониторинга Nagios Core 4 на сервер под управлением Linux Debian 6 (Squeeze). Здесь изложу свой опыт. В принципе, на Debian 7, Ubuntu, а также RHEL-ы (CentOS, Oracle Linux, Fedora) Nagios ставится походим образом. Необходимо лишь учитывать особенности путей на этих системах и наименования пакетов для установки.

Подробнее про Nagios, различие его редакций и т. д. можно прочитать на официальном сайте проекта.

Планируется установить следующие компоненты:

  • Nagios Core, 
  • Nagios Plugins, 
  • NRPE, 
  • Nagios V-Shell (симпатичный фронт-энд для Nagios Core). 

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

Єдиний соціальний внесок за 2014 для ФЛП (ФОП), Украина

Всем платильщикам ЕСВ посвящается памятка.

Минимальный размер взноса (34,7%):

  • с января пo июнь = 1218 * 0,347 = 422,65 гривен, 
  • c июля пo сентябрь = 1250 * 0,347 = 433,75 гривен, 
  • c октября пo декабрь = 1301 * 0,347 = 451,45 гривен.

Вообще платить ЕВС надобно поквартально - до 20 числа месяца следующего за последним в квартале. НО лично мне удобнее платить каждый месяц.

Т. к. с октября 2013 года ЕСВ необходимо платить не в Пенсионный фонд, а в Мин. доходов и сборов, то реквизиты для налоговой службы своего района смотрим здесь.

Согласно того же ресурса, назначение платежа следующее:

*;101; Ваш_идент._код; єдиний соціальний внесок  34,7% за грудень 2014 р.; ; ;

Где 101 - код назначения платежа, а идент. код (10-значный) и месяц - понятное дело - менять согласно вашей ситуации.

UPDATE:

Весь год взнос составляет 422,65 грн. Кабмин издал постановление не увеличивать мин. ЗП с июля, потому взнос также не увеличится.

22 янв. 2014 г.

Автодополнение в командной строке Linux

Автодополнение в командной строке Linux - это крайне удобная вещь. Вот скажем, нужно вам посмотреть информацию о пакете, скажем, php-mcrypt, но вы не помните как точно он пишется. С автодополнением достаточно в команде написать первые буквы и двойное нажатие [TAB] покажет вам варианты, а одинарное - дополнит, если вариант единственный:

rpm -q ph [TAB][TAB]

phonon-backend-gstreamer  php-devel                 php-mysql
php                       php-gd                    php-pdo
php-cli                   php-mbstring              php-xml
php-common                php-mcrypt                

Эта полезная фишка содержится в пакете bash-completion. При установке Debian-based систем этот пакет устанавливается по-умолчанию.А во многих же RHEL-дистрибутивах (например, Oracle Linux) - почему-то нет. Устанавливаем командой:

yum install bash-completion
aptitude install bash-completion

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

ls /etc/bash_completion.d

autoconf       gdbus-bash-completion.sh      mysqladmin        scl.bash
automake       getent                        ncftp             screen
bash-builtins  gpg2                          net-tools         service
bind-utils     gsettings-bash-completion.sh  nmap              sh
brctl          gzip                          ntpdate           shadow
bzip2          iconv                         openssl           smartctl
chkconfig      iftop                         perf              sqlite3
configure      ifupdown                      perl              ssh
coreutils      info                          pkg-config        strace
cpan2dist      iproute2                      pm-utils          subversion
cpio           iptables                      postfix           tar
crontab        java                          procps            tcpdump
cryptsetup     lsof                          python            util-linux
cups           lvm                           qdbus             wireless-tools
cvs            lzma                          quota-tools       xmllint
dd             make                          redefine_filedir  xmlwf
dhclient       man                           rfkill            xsltproc
e2fsprogs      mc                            rpcdebug          xz
findutils      mdadm                         rpm               yp-tools
gcc            minicom                       rsync             yum.bash
gdb            module-init-tools             samba             yum-utils.bash

18 янв. 2014 г.

Использование встроенной базы данных AstDB в Asterisk

AstDB является частью Asterisk  и устанавливается вместе с ним. Это простая БД (Barkley DB версии 1), без всяких заморочек. Если нужно подключить к Asterisk БД MySQL или PosrgreSQL - это тоже можно сделать, но для несложных задач вполне хватит и AstDB.

Предположим, у нас уже настроен GSM-модем в Asterisk - например, как я описывал здесь для модемов Huawei - и мы хотим звонить на мобильные номера наших абонентов (к примеру, в не рабочее время, когда они находятся вне доступа к SIP телефонам).

Хранится информация в БД с помощью трех понятий - семейство, ключ и значение. Семейство - это аналог таблицы, в которой хранятся пары ключ-значение.

Для начала, нам необходимо наполнить нашу БД номерами. Сделать это можно в процессе диалплана командой вроде:

exten => s,n,Set(DB(mobile/1112)=0991111111)

Здесь мы создаем (или модифицируем, если таковой ключ уже есть) ключ 1112 - SIP-номер для нашего абонента, в моем примере - в семейтве mobile. И присваиваем ему номер мобильного для этого абонента.

Но для большого количества абонентов делать такое не есть хорошо, тем более что БД хранит данные и после перезапуска Asterisk  и после перезагрузки сервера. Потому, целесообразнее - для моего примера - заранее заполнить БД данными из командной строки Asterisk.

Добавление/модификация значений:

database put <семейство> <ключ> <значение>
Пример: database put mobile 1112 0991111111

Для просмотра информации имеем команду:

database get <семейство> <ключ>

а также для просмотра всей БД:

database show

В плане набора (dialplan) пишем следующее:

...
; Вызываем макрос для дозвона по GSM, передавая ему SIP номер абонента как аргумент
exten => _1XXX,n,Macro(dial-mobile,${EXTEN})
....
[macro-dial-mobile]
; Вытаскиваем из БД значение номера для нужного абонента
; и помещаем в его переменную MobNumber
exten => 1,1(mobile),Set(MobNumber=${DB(mobile/${ARG1})})
; Звоним через GSM-модем
exten => 1,n,Dial(Dongle/dongle0/${MobNumber},100,dmghHtT)
...

Вот в общем-то и всё. 

15 янв. 2014 г.

Как перенаправить порт в Windows встроенными средствами

Перенаправление порта (port forwarding, port mapping) может понадобиться, когда у машины PC1 есть доступ в сеть 1 и сеть 2, а у машины PC1 - только в сеть 1, а ей нужно подключиться к какому-то сервису на машине PC3 в сети 2. В таком случае схема будет примерно такая:


В данном примере необходимо на PC2 открыть CMD с правами администратора и выполнить команду:

netsh interface portproxy add v4tov4 listenport=2222 listenaddress=192.168.1.3 connectport=22 connectaddress=192.168.2.5

Чтобы удалить форвардинг - команда:

netsh interface portproxy delete v4tov4 listenport=2222 listenaddress=192.168.1.3

Ссылки:

http://technet.microsoft.com/en-us/library/cc731068(v=ws.10).aspx#BKMK_1

9 янв. 2014 г.

Как получить размер свободного дискового пространства точки монтирования в Python (Linux)

Чтобы получить размер свободного пространства для точки монтирования (или размер свободное место на разделе, где находится указанная папка), необходимо выполнить следующее:


import os
st = os.statvfs("/home")
du = st.f_bsize * st.f_bavail
print(du)

Получим значение в байтах, чтобы получить значение, например, в Мб:


du = st.f_bsize * st.f_bavail / 1024 / 1024

Отправка почты (e-mail) из консоли Linux

Иногда необходимо отправить письмо из консоли/скрипта в Linux. Сделать это достаточно просто:

echo "Тело письма" | mail -s "Тема письма" recipient@example.com

или, чтобы вставить содержимое тектового файла как тело письма:

mail -s "Тема письма" recipient@example.com < /var/log/some.log

Параметры команды:

-s subject - тема письма
-c email-address 
- адрес для копии
-b email-address - 
адрес для невидимой копии