пятница, 27 апреля 2012 г.

Блокировка клавиатуры и мыши

Ранее я уже описывал небольшую утилиту grabkeyboard, которую я написал, чтобы защитить компьютер от посягательств маленького ребенка. За время ее использования выявились недочеты, которые не были учтены в первой версии.

Например:
  1. блокировка клавиатуры не помогает, если ребенок добрался до мыши. Частенько приходилось приводить рабочий стол в порядок после набегов дочки.
  2. нет индикации того, что блокировка активна. Иногда это приводит к попыткам заблокировать экран через штатный screensaver, которые терпят неудачу из-за захваченной клавиатуры в grabkeyboard.
Для решения первой проблемы я просто добавил опциональный захват ввода с мыши (это полезно, когда идет просмотр фильма в XBMC, запуженном на отдельном экране). Чтобы воспользоваться им достаточно вызвать grabinput с опцией -l.

$ grabinput -l

Вторая часть проблемы решается сменой курсора при захвате мыши. Сейчас он меняется на пиратский череп с костями (XC_pirate). Для лучшей визуализации блокировки добавлена возможность запускать скринсейвер (из комплекта xscreensaver) при блокировке.

Попутно при написании следующей версии я переименовал утилиту в grabinput и завел исходники под контроль версий. Последняя версия grabinput доступна тут.

четверг, 26 апреля 2012 г.

FreeRDP 1.0.1 release

From time to time I need to connect to the windows-powered terminal server to do some tasks. Some years ago I didn't know any alternative to rdesktop. But this RDP implementation have several troubles with keyboard-related stuff.

Everything changed when I discovered freerdp - the fork of rdesktop. I liked it from the first time. At that time FreeRDP missed some features compared to rdesktop, but it's keyboard handling works very well. The one feature I really missed - seamless RDP mode. I used this feature to run MS software on my linux box.

After 1.0 release I wish to do some tests, but haven't any free time for this. Today I backported new freerdp release to Debian Squeeze and tryed it.

Firstly I check "Remote Application" - this feature works, but sometimes application windows looks crappy and present refresh lag. Also I get error when I try to use "Remote application" for the first time. Error looks like:

$ xfreerdp -u username --app --plugin rail --data "calc.exe" -- serveraddress
...
RAIL exec error: execResult=RAIL_EXEC_E_NOT_IN_ALLOWLIST NtError=0x15

After googling around I found solution for this problem:
  • On windows machine, run regedit and under HKLM\SOFTWARE\Policies\Microsoft\Windows NT add a key named "Terminal Services"
  • Under that, add a DWORD32 value named "fAllowUnlistedRemotePrograms" and set the value to 1
The next thing I tried was "Multimedia redirection".

$ xfreerdp -u username --plugin drdynvc --data tsmf:audio:alsa -- serveraddress

In windows terminal session I run Media Player and try to listen music and to watch videos. Everything works perfectly and smoothly. This feature not really valuable for me since I started to use XBMC at home. As I understand from freerdp wiki - "TSMF" supported only in Windows 7/2008 R2 and only by Windows Media Player.

The last thing I tested was "Device redirection".

$ xfreerdp -u username --plugin cliprdr --plugin rdpdr --data disk:andrey:/home/andrey -- serveraddress

I try to use home directory as a drive attached to terminal session. Everything works as expected.

If you want to try new freerdp release you can grab Debian Squeeze packages from my repository.

Links from the Web: Debian sources list generator

Debian sources list generator - I found interesting link while googling around. It can be very useful for those who migrating to Debian, or simply needed third-party software which not shipped with official distribution.

HOW-TO: Highly anonymous proxy with multiple ip support

Today I completed proxy-related task which looks unique for me. So I decide to write a small how-to to memorize steps and have ability to use it in future as reference.

The main difficulty in this task was a deprecated CentOS installation on server. If you try simply try to run

yum search squid

then yum will complain about absent repodata.xml - centos 4 repos already removed from CentOS mirrors and I need to configure vault.centos.org repo in YUM. So I backup /etc/yum.repos.d/CentOS-Base.repo and edit it:

[base]
name=CentOS-4.8 - Base
baseurl=http://vault.centos.org/4.8/os/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-centos4
priority=1
protect=1

#released updates
[update]
name=CentOS-4.8 - Updates
baseurl=http://vault.centos.org/4.8/updates/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-centos4
priority=1
protect=1

#packages used/produced in the build but not released
[addons]
name=CentOS-4.8 - Addons
baseurl=http://vault.centos.org/4.8/addons/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-centos4
priority=1
protect=1

#additional packages that may be useful
[extras]
name=CentOS-4.8 - Extras
baseurl=http://vault.centos.org/4.8/extras/$basearch/
gpgcheck=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-centos4
priority=1
protect=1

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-4.8 - Plus
baseurl=http://vault.centos.org/4.8/centosplus/$basearch/
gpgcheck=1
enabled=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-centos4
priority=2
protect=1

#contrib - packages by Centos Users
[contrib]
name=CentOS-4.8 - Contrib
baseurl=http://vault.centos.org/4.8/contrib/$basearch/
gpgcheck=1
enabled=1
gpgkey=http://vault.centos.org/RPM-GPG-KEY-centos4
priority=2
protect=1

Then I cleanup yum cache info and run search again

# yum clean all
# yum search squid

Now squid available for install, so installing it

# yum install squid

Next step is to setup authentication. I use only BASIC auth, so I uncomment related lines in /etc/squid/squid.conf

auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/proxy.auth
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

Then I create file with password info:

# htpasswd -c /etc/squid/proxy.auth squid

Next step is to hide proxy info. After this step web sites lost ability to detect if you use proxy or not.

For this I added following lines in squid.conf

# Disable client ip forwarding
forwarded_for off

# Header control
header_access Allow allow all
header_access Authorization allow all
header_access Cache-Control allow all
header_access Content-Encoding allow all
header_access Content-Length allow all
header_access Content-Type allow all
header_access Date allow all
header_access Expires allow all
header_access Host allow all
header_access If-Modified-Since allow all
header_access Last-Modified allow all
header_access Location allow all
header_access Pragma allow all
header_access Accept allow all
header_access Accept-Encoding allow all
header_access Accept-Language allow all
header_access Accept-Charset allow all
header_access Content-Language allow all
header_access Mime-Version allow all
header_access Cookie allow all
header_access Set_Cookie allow all
header_access Retry-After allow all
header_access Title allow all
header_access Connection allow all
header_access Proxy-Connection allow all
header_access Proxy-Authorization allow all
header_access Proxy-Authenticate allow all
header_access WWW-Authenticate allow all
header_access User-Agent allow all
header_access All deny all

If you want to hide or spoof User-Agent, than replace last but one line to

header_replace User-Agent Nutscrape/1.0 (CP/M; 8-bit)

The last step is to add ability to use multiple ip source address depending on proxy address currently used. For example if you use 192.168.17.43:3128 as proxy address then sites detect your ip address as 192.168.17.43.

For this I use file with ip list: one ip per line. Than I run script to generate config:

# i=0; for ip in `cat /tmp/squid-ips.txt`; do i+=1; echo "acl ip${i} myip ${ip}"; echo "tcp_outgoing_address ${ip} ip${i}"; done | tee -a /etc/squid/squid.conf

The last step is to reload squid conf and enable squid startup during system boot

# service squid reload
# chkconfig squid on

To check proxy info you can visit this link.

среда, 25 апреля 2012 г.

Midnight Commander packages now available for Ubuntu Precise Pangolin

Today I added additional buildbot branch to support upcoming Ubuntu LTS release - Precise Pangolin (12.04).

You can already grab latest midnight commander release for Ubuntu Precise Pangolin from my repository (currently only version 4.8.3 available). Nightly builds will be available within the next few hours.

Enjoy the power of the best console file manager.

понедельник, 23 апреля 2012 г.

Midnight Commander 4.8.3 release

Yesterday midnight commander team released a brand new 4.8.3 version. More info about release you can get at changelog page. This release doesn't bring any new features, but contains a bunch of bugfixes.

As always you can grab Debian/Ubuntu packages from my repository.

среда, 11 апреля 2012 г.

Debian/Ubuntu packages for deadbeef audio player

Recently was released a new version of my favourite DEADBEEF audio player. DeaDBeeF (as in 0xDEADBEEF) is an audio player for GNU/Linux, BSD, OpenSolaris and probably other UNIX-like systems. This player very minimalistic but have all functionality needed to me.

As for now upstream didn't release binary packages for version 0.5.2 for Debian Squeeze, so I decided to build myself packages for Debian (Squeeze, Wheezy, Sid) and Ubuntu (Maverick, Lucid, Natty, Oneiric) both i386 and amd64 versions. You can grab this packages in my repository in section "main" or just simply download from pool directory (ex. for Squeeze)

Deadbeef 0.5.2

Much more about deadbeef you can learn on it's SourceForge page.

вторник, 10 апреля 2012 г.

Критическая уязвимость в SAMBA 3.0.x - 3.6.3 (включительно)

Наткнулся в новостях на анонс CVE-2012-1182 - наверное самой критической уязвимости в SAMBA, найденной за всю историю существования проекта. Эта уязвимость связана с неверной обработкой запросов RPC и позволяет любому не авторизованному злоумышленнику удаленно выполнить код с привилегиями "root".

В качестве частичного решения проблемы предлагается настроить опцию "hosts allow", но это не поможет в случае подмены ip адреса. Для всех версий SAMBA уже выпущены патчи, но многие дистрибутивы еще не подготовили обновления.

На данный момент обновления готовы только у RHEL (судя по закрытому репорту в багзилле). Надеюсь, что обновления от CentOS и Debian не заставят себя ждать.

Stay tuned так сказать!

UPDATE : Выпущены обновления для RHEL/CentOS (в этот раз centos радует своей оперативностью)

воскресенье, 8 апреля 2012 г.

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

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

Временным решением стал ярлык на рабочих столах, но это неудобно. Одним из последующих решений стало выполнение setxkbmap при выходе компа из спящего режима. Чтобы отловить события в системе до и после засыпания на диск, я запустил dbus-monitor и выполнил цикл засыпания/пробуждения.

$ dbus-monitor --system | tee ~/tmp/dbus-system.log

В процессе изучения полученного лога нашлись записи от UPower (подсистема управления питанием).

$ grep UPower ~/tmp/dbus-monitor.log
signal sender=:1.15 -> dest=(null destination) serial=80 path=/org/freedesktop/UPower; interface=org.freedesktop.UPower; member=Sleeping
signal sender=:1.15 -> dest=(null destination) serial=81 path=/org/freedesktop/UPower; interface=org.freedesktop.UPower; member=Resuming

Чтобы восстановить настройки клавиатуры, достаточно отловить событие 'Resuming' от UPower и выполнить команду setxkbmap $(cat ~/.Xkbmap). Готовый скрипт можно взять тут.

Позже всплыл баг, когда при одновременной работе двух пользователей настройки восстанавливаются только у пользователя, у которого активна сессия на момент пробуждения. В виде хака добавил прослушивание событий и от ConsoleKit.

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

суббота, 7 апреля 2012 г.

Проблемы с засыпанием на диск с подключенными USB устройствами

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

Поискав по интернет магазинам, я остановил свой выбор на продукции A4Tech. Кандидатом на новую клавиатуру стала модель A4Tech KV-300H. У этой модели помимо "ноутбучных" клавиш еще есть USB 2.0 хаб на два порта что делает более удобной работу с флешками и прочей USB-мелочевкой.

На роль нового грызуна была выбрана A4Tech N-360.
У этой модели нет никаких излишеств вроде кучи кнопок или геймерских примочек. Простая и надежная рабочая лошадка. К тому же производитель обещает уверенную работу на любой поверхности благодаря технологии V-Track.

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

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

На следующий день я стал изучать интернет на предмет упоминания аналогичных ситуаций - наиболее частое решение - выгружать модуль ehci_hcd в процессе засыпания. Поскольку у меня используется pm-utils + uswsusp для реализации засыпания на диск, то я просто дописал два модуля, ответственных за работу USB на моем компе. Получилось так:

$ cat /etc/pm/config.d/modules
SUSPEND_MODULES="ath9k_htc ohci_hcd ehci_hcd"

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

$ setxkbmap $(cat ~/.Xkbmap)

UPDATE. Добавил немного автоматизации.

вторник, 3 апреля 2012 г.

Прерывание проверки дискового массива в mdadm

MDADM, поставляемый вместе с дистрибутивом Debian, содержит задание CRON, которое раз в месяц запускает проверку целостности массива. На больших массивах, размер которых превышает несколько терабайт, такая проверка может занять слишком много времени. Прогресс выполнения проверки можно узнать в /proc/mdstat

# cat /proc/mdstat
Personalities : [raid1] 
md1 : active raid1 sdb2[0] sda2[1]
      1911569360 blocks super 1.2 [2/2] [UU]
      [>....................]  check =  0.0% (8832/1911569360) finish=7201.4min speed=4416K/sec
      
md0 : active raid1 sdb1[0] sda1[1]
      41941944 blocks super 1.2 [2/2] [UU]
      
unused devices: <none>

Прервать такую проверку можно так:

# echo idle > /sys/block/md1/md/sync_action

После чего можно проверить, что массив действительно перестал проверяться:
# cat /proc/mdadm
Personalities : [raid1] 
md1 : active raid1 sdb2[0] sda2[1]
      1911569360 blocks super 1.2 [2/2] [UU]
      
md0 : active raid1 sdb1[0] sda1[1]
      41941944 blocks super 1.2 [2/2] [UU]
      
unused devices:  <none>

Чтобы отменить такую проверку в будущем, нужно установить параметр AUTOCHECK=false в /etc/default/mdadm