2012-11-29

как можно ограничить число устройств у абонента?

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

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

2. следующий шаг - использование аутентификации.
например - 802.1x или PPPoE/PPTP доступ в сеть.
решение - выполнять аутентификацию на роутере и с него же поднимать туннель.
не проблема для абонента.

3. тяжелая артиллерия - фильтрация по TTL :)
вешать на клиента список доступа, принимающие пакеты ровно с TTL=128(венда) или TTL=64(unix/linux/macos).
здесь все становится немного сложнее.
не все роутеры умеют такое бороть, но если роутер использует прошивку на линуксе (dd-wrt/openwrt/и т.д.), то там все решается предельно просто:
iptables -t mangle -A POSTROUTING -o -j TTL --ttl-set 128
большинство прошивок могут такую команду добавить а автозапуск.

4. сверх-тяжелая артелерия и приз зрительских симпатий - УСТАНОВКА TTL!
роутер провайдера на все пакеты идующие в сторону клиента ставит TTL=1.
если абонент подключил маршрутизатор, то он при пересылке пакета внутрь на проводную ил беспроводную либо даже виртуальную сеть уменшает TTL на единицу, и тут - упс, TTL=0, пакет нужно отбросить и отправить TTL exceeded!
на линуксе (dd-wrt/openwrt/и т.д.) все решается предельно просто, как и в прошлом варианте, только теперь на трафик полученный на wan интерфейсе:
iptables -t mangle -A PREROUTING -i -j TTL --ttl-set 128
большинство прошивок могут такую команду добавить а автозапуск.

если вы можете список дополнить - буду благодарен :)

2012-11-06

управление тачпадом из коммандной строки

У меня забавная проблема с отключением тачпада в убунте.
Конечно же оно не работает :)
Но на самом деле проблема не в том что кнопка отключения не работает. Она-то как раз в норме. Вот проверка xev'ом:
KeyPress event, serial 40, synthetic NO, window 0x4600001,
    root 0xd8, subw 0x0, time 26256081, (598,673), root:(601,696),
    state 0x0, keycode 199 (keysym 0x1008ffa9, XF86TouchpadToggle), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0x4600001,
    root 0xd8, subw 0x0, time 26256156, (598,673), root:(601,696),
    state 0x0, keycode 199 (keysym 0x1008ffa9, XF86TouchpadToggle), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False
Проблема в том что у меня оказывается нет тачпада:
#  xinput
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ PS/2 Generic Mouse                        id=12   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Laptop_Integrated_Webcam_HD               id=10   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=11   [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                          id=13   [slave  keyboard (3)]
Вот та хрень PS/2 Generic Mouse и есть мой тачпад :(
Модель ALPS воткнутая долбаным делом не существует, и дров на нее не бывает, как и прокрутки и малтитача.

Но вопрос по отключению, и здесь все просто: xinput enable 12 и xinput disable 12 (12 это айди из вывода xinput).

Но это не интересно, нужно написать скрипт touchpad-toggle!
#!/bin/bash
TOUCHPAD=12
if [[ $(xinput list ${TOUCHPAD} | grep "This device is") =~ disabled ]]; then
        echo "Enabling touchpad"
        xinput enable ${TOUCHPAD}
else
        echo "Disabling touchpad"
        xinput disable ${TOUCHPAD}
fi
Теперь можно было бы попробовать повесить этот скрипт на кнопку XF86TouchpadToggle но, к сожалению, КДЕ не позволяет именно на эту кнопку вешать скрипты :(

А вас раздражает когда ноут просыпается от открытия крышки?

Лично меня - да.
Я обычно предпочитаю его открыть поставить в дальний угол стола, подключить все мониторы, сетевой кабель, usb-хаб, и только потом нажать кнопку power.
Но - не судьба. Под убунтой он просыпается от открытия крышки :(

Не беда! Это можно полечить.
Разгадка этой проблемы в /proc/acpi/wakeup:
# cat /proc/acpi/wakeup
Device  S-state   Status   Sysfs node
P0P1      S4    *disabled 
EHC1      S4    *enabled   pci:0000:00:1d.0
EHC2      S4    *enabled   pci:0000:00:1a.0
XHC       S4    *enabled   pci:0000:00:14.0
RP01      S4    *disabled  pci:0000:00:1c.0
PXSX      S4    *disabled  pci:0000:01:00.0
RP05      S4    *disabled  pci:0000:00:1c.4
PXSX      S4    *disabled  pci:0000:02:00.0
RP06      S4    *disabled 
PXSX      S4    *disabled 
PEG0      S4    *disabled 
LID0      S3    *enabled  
Это список устройств которые могут будить систему из разных уровней сна(S3=suspend to ram, S4=hibernate to disk), и то разрешено им это делать или нет(enabled/disabled).
Что за pci устройства можно проверить относительно просто:
# lspci -s  0000:00:1d.0
00:1d.0 USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB Enhanced Host Controller #1 (rev 04)
Но меня интересует последняя строка - LID0.
Отключить - просто:
echo -n LID0 > /proc/acpi/wakeup
cat  /proc/acpi/wakeup
Device  S-state   Status   Sysfs node
P0P1      S4    *disabled 
EHC1      S4    *enabled   pci:0000:00:1d.0
EHC2      S4    *enabled   pci:0000:00:1a.0
XHC       S4    *enabled   pci:0000:00:14.0
RP01      S4    *disabled  pci:0000:00:1c.0
PXSX      S4    *disabled  pci:0000:01:00.0
RP05      S4    *disabled  pci:0000:00:1c.4
PXSX      S4    *disabled  pci:0000:02:00.0
RP06      S4    *disabled 
PXSX      S4    *disabled 
PEG0      S4    *disabled 
LID0      S3    *disabled 
 Осталось сделать это умолчанием. Можно это положить где-то в /etc/pm/sleep.d, что б оно применялось при выходе из сна(на случай если потеряется например при хибернейте), или в /etc/rc.local.

P.S. Сначала написал пост, потом нагуглил точно такой же :)
P.P.S. Осталась только одна маааленькая проблемака. Это не работает :(

И вновь про криворуких программистов

Есть еще одна милая проблема которая не дает мне спокойно жить.
Она состоит в том что мониторов у меня не два, а ТРИ.
Но. На самом деле, видеокарта одновременно может аппаратно обрабатывать ровно столько мониторов, сколько в ней есть CRTC, которых в большинстве случаев два.
Потому я использую два внешних(подключенных к VGA и HDMI), а третий - дисплей ноута отключаю.
Но. Люди Творящие Добро сделали так, что X-сервер автомагически при запуске пытается включить ВСЕ мониторы. И это заканчивается либо Тремя Черными Экранами Не Реагирующими Ни На Что, либо (если повезет), консолью с сообщением
[drm:drm_crtc_helper_set_config] *ERROR* failed to set mode on [CRTC:7]
Решение - отключить механически один из мониторов, затем с телефона зайти по ssh на ноут, и сделать /etc/init.d/?dm restart
Круто, правда? Чистый юзабилити, мать его так...

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

Проблема первая: Ведь теперь нет xorg.conf! где X-сервер хранит свой конфиг???
Все очень просто -
mkdir -p /etc/X11/xorg.conf.d
^mkdir^cd^
vim 10-monitor.conf
Section "Monitor"
        Identifier "LVDS1"
        Option "Primary" "true"
        Option "Enable" "true"
EndSection

Section "Monitor"
        Identifier "HDMI1"
        Option "Enable" "false"
EndSection

Section "Monitor"
        Identifier "VGA1"
        Option "Enable" "false"
EndSection
Думаете заработало? Хрен!

1) для привязки мониторам к видеовыходам нужно добавить настройку видеокарты:
Section "Device"
        Identifier "vcard"
        Driver     "intel"
        Option "Monitor-LVDS1" "LVDS1"
        Option "Monitor-VGA1" "VGA1"
        Option "Monitor-HDMI1" "HDMI1"
        Option "Monitor-DP1" "DP1"
EndSection
2) Опция Enable, несмотря на то что описана в документации, оказывается не работает! И нет, NOTABUG!!!
Ок, добавляем кроме Enable false еще и Disable true.
работает? Конечно же НЕТ!

Не смотря на то что теперь конфиг правильный (проверяем по логам иксов):
 (II) intel(0): Output LVDS1 enabled by config file
 (II) intel(0): Output VGA1 disabled by config file
 (II) intel(0): Output HDMI1 disabled by config file
Проблема на месте, и дальше в логе мы видим:
 (WW) intel(0): Option "Primary" is not used
 (WW) intel(0): Option "Enable" is not used
Т.е. интеловский драйвер просто ложит болт на опцию Enable?

3) Есть еще мега-опция "Ignore" "true"
Но если ее повесить на выход, он становится полностью недоступным, т.е. даже исчезает из xrandr.
Но это плюс, ведь xrandr мне еще светит неведомого зверя под именем DP1, повод исправить! Добавляю в 10-monitor.conf
Section "Monitor"
        Identifier "DP1"
        Option "Ignore" "true"
EndSection
Итог: проблема осталась на месте. Я ненавижу разработчиков Xorg. Я ненавижу разработчиков Intel. При включении ноута надо не забыть отключить внешние мониторы :(

Еще один камень в сторону криворуких программеров

Еще одна веселая проблема.
Проявляется во многих "кросс-платфоменных" ява-приложениях, но больнее всего меня поразила в такой штуке как NX.
Мне приходится постоянно с ним работать в удаленных лабах.
Вот так он должен выглядеть:
В конфигурации терминальной сессии для удобства вшито разрешение 1024х768, это удобно, его хватает (разрешение можно поменять на сервере лаб, и оно опять таки вшивается в настройки сессии NX).
Все бы супер, но, все работает нормально только если у меня подключен один монитор. Как только мониторов два, картинка становится такой:
Как вам такое?
Вы можете подумать что у меня два огромных 40" монитора, но фиг там! Это окошко по ширине "почти" помещается на два монитора!
И долбаный NX плюет с колокольни на то что в сессию вшито разрешение экрана(при одном мониторе эти опции работают идеально):

И внутри терминальной сессии сменить разрешение невозможно.

Решение нашел здесь
Написать библиотеку подменяющую функции Xinerama возвращающие размер дисплея и перезагрузить ее с помощью LD_PRELOAD!!!
ОФИГЕТЬ

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

Теперь воркараунд.
1) скрипт nestify, запускающий одну программу под Xephyr:
#!/bin/bash
RESOLUTION="1024x768"
while [[ $1 =~ - ]]; do
        case $1 in
                -r)
                        RESOLUTION=$2
                        shift 2
                        ;;
        esac
done
for i in `seq 30`; do
        [[ -a /tmp/.X$i-lock ]] && continue
        Xephyr -ac -screen ${RESOLUTION} -br :$i > /tmp/xephyr.$PID.out 2>&1 &
        export DISPLAY=:$i
        sleep 1
        exec $*
        exit
done
Большая часть скрипта - грязный хак перебирающий свободные десктопы что б можно было запустить одновременно несколько таких сессий.
2) скрипт-оболочка для nxclient:
#!/bin/bash
nestify -r "1024x768" /usr/NX/bin/nxclient $*

Теперь вместо порнографии со второго скриншота у меня получается такая картинка:
Есть конечно недостатки: пока не придумал как изменить заголовок окна на более информативный, но намеки нашел здесь, но патчить и пересобирать ради этого не готов :(

P.S. За моральную и техническую помощь спасибо Илье :)

2012-07-30

"Изкувство проффесианального програмирования"

была такая шутка, якобы кусок кода венды, в котором каждая вторая строка имела вид типа while(do_nothing()){ sleep(100) };

так вот, такой стиль написания кода существует.
и применяется ушлепками из canonical.

расследования надоедливой проблемы с двухминутным ожиданием подключения сети вывело на файлик /etc/init/failsafe.conf, который на половину состоит из sleep!

 

cat /etc/init/failsafe.conf | grep -v '^[ ]*(#.*)?$'                                                                                                          <1194]14:02:43 description "Failsafe Boot Delay" author "Clint Byrum " start on filesystem and net-device-up IFACE=lo stop on static-network-up or starting rc-sysinit emits failsafe-boot console output script         # Determine if plymouth is available         if [ -x /bin/plymouth ] && /bin/plymouth --ping ; then                 PLYMOUTH=/bin/plymouth         else                 PLYMOUTH=":"         fi         sleep 20         $PLYMOUTH message --text="Waiting for network configuration..." || :         sleep 40         $PLYMOUTH message --text="Waiting up to 60 more seconds for network configuration..." || :         sleep 59         $PLYMOUTH message --text="Booting system without full network configuration..." || :         sleep 1     exec initctl emit --no-wait failsafe-boot end script post-start exec logger -t 'failsafe' -p daemon.warning "Failsafe of 120 seconds reached."


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

2012-07-25

вопросы по network-manager

помогите кто-нибудь победить network-manager.
для меня всегда лучшим рецептом было снести его к *беням и делать все самому, но если с проводными интерфейсами мои скрипты работают на несколько порядков лучше и надежнее, то с беспроводкой все печально.

проблема 1:
при выходе из сна эта дрянь не обновляет настройки сети(dhcp), и я могу хоть весь день сидеть как дурак думая где же мой интернет.
нужно или выдернуть кабель и, подождав минуту пока он одуплит что сеть отвалилась, воткнуть обратно, либо сделать откл/вкл мышкой.

проблема 2:
для новых интерфейсов постоянно запускает без спросу dhcp, вешает APIPA адреса, и если не дай боже получит адрес - херит установленые сессии и маршруты.

проблема 3:
я хочу что б он управлял только беспроводкой и ваще не трогал проводный интерфейс. как?

2012-06-24

краткие впечатления от win8

так случилось что поставил себе эту штуку.
если в двух словах, то если вернуть старое меню пуск (а это я так понял главное отличие от win7), то неплохо. намного больше похоже на современные тренды линуховых DE чем win7
  • меню пуск (которое красивая мозайка, метро и т.д.) - отстой, самый отстойный отстой из всего что я когда-либо видел. наверное сойдет для телефона или планшета. или если у пользователя компьютер это как телефон или планшет, только большой. но у меня ноут звонить не умеет, тачскрина нет, демо-приложения мне до фени(погода, спорт, финансы, чат и т.д.) а разобраться в этом говне и как-то его использовать мне оказалось слабо. хоть я и старался, минут 30 на это убил.
  • рабочий стол как и в win7, только попасть в него чуть сложнее.
  • explorer (не интернет) мне понравился. красивые у него теперь рюшечки, менюшечки.
  • очень красивый диалог копирования. лучшее из того что я видел в win8.
  • до сих пор не починили долбаную переключалку раскладки. после переключения нужно закрыть глаза, посчитать до ста, открыть глаза, проверить в трее текущий язык и только тогда продолжать набирать текст. иначе блин с вероятностью 50%(если привык к быстрому переключениюв иксах то 100%) успеваешь нажать что-то до переключения языка, и переключение отменяется.
  • бесит менюшка "search start devices settings" всплывающая когда курсор касается краев экрана. постоянно жму вместо прокрутки, вместо крестика или свернуть/развернуть в нее. кретинизм.
  • симпатичное окошко входа в систему. почти как на андроиде.
  • нихрена нет драйверов, не ставятся приложения работы с камерой, с сканером очепятков пальцев, с тачскрином, не работают большая часть кнопок fn. хотя все и "завелось".
  • больше нет нормальной "панели управления" а то что есть я мягко говоря не осилил.
вердикт: дописываю и сношу нахер.

2012-05-05

убунта

вынужден признать, я был совершенно не прав, заявляя что победил тупость программистов.
может я и выиграл отдельную битву (смог обновить систему, смог избавится от "бонусов", и т.д.), но война явно проиграна.
полет на 12.04 напоминает купание в зыбучем говне: много времени тратится на то что хоть на один вздох выпрыгнуть и глотнуть воздуха а не той самой субстанции которой разработчики нас снабдили на 3 года (срок действия 12.04 не пол-года, а целых три!).

причины:
1) слегка не совсем работоспособная текстовая консоль.
если стартуют иксы, в консоли нафик слетают все клавиши модификаторы, особенно fn и num-lock, и залогиниться становится задачей нетривиальной.
если долго кнопки fn, numlock, scrolllock, capslock жмакать то со временем можно уловить систему, и добиться штатной работы клавиатуры. но эту процедуру нужно повторять при каждой загрузке/перезагрузке/перезапуске иксов.
почему это меня волнует? очень просто -
2) в иксах постоянно слетает видеодрайвер. идут артефакты изображения. перезапуск иксов это решает. на время. для перезапуска нужно попасть в консоль, а тут см. пункт 1. и так каждые пару часов.
замечу, что никаких хитрых приложений я просто не запускаю, композитный менеджер окон не использую. т.е. причин для такого поведения - ноль.
3) не работает вывод видео.
ведь убунта это не какая-нибудь шлака, тут все должно быть по самому понтовому разряду. декодирование видео должен делать видеоадаптер. и сам же должен его накладывать на картинку.
и то и другое работает только первые минут 30-40 после перезагрузки системы(замечу что перезапуск иксов не помогает).
4) пару раз видеодрайвер слетал с концами. т.е. только ребут. кнопкой павер или по ссш.
5) если в трее идет любая анимация(получено сообщение, идет копирование - любая) , то Xorg жрет весь проц, система превращается в кипятильник, кулеры рычат, и все тормозит.

так что посылаю еще пучек лучей поноса всем причастным к этому празднику жизни.

п.с. читаю установку kde на windows....

2012-05-04

350-380 CCIE Data Center Written Beta exam

С 1го мая уже можно сдавать.
Последний срок - 15е июня.
Может и себе сдать? :)
Шансов сдать конечно не много, но еще месяц можно полистать книжки и попробовать...

2012-05-03

Победа интеллекта пользователей на тупостью программистов, или обновление ubuntu до 12.04

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

* любое обновление этой патриконеугодной системы ставит заново все стартовые скрипты в положение "к бою". в том числе с пол-десятка скриптов которые умножают на ноль цепочки файрвола. т.е. пере обновлением убедитесь что актуальные правила файрвола у вас забекаплены. (такие "полезные" скрипты входят в пакеты virtualbox, libvirtd, dnsmasq-base, lxc, и многие другие которые я просто вычищал до кучи).
скрипты запускаются и все херят без объявления войны прямо при установке, будьте осторожны.
для того что б это безобразие прекратить для всех лишних скриптов, после обновления делаем update-rc.d -f X remove или, если это скрипт апстарта, echo manual > /etc/init/X.override

* система заботливо заменила мне кнопку win, на которой у меня прорва горячих кнопок, на кнопку compose, которая даже не кнопка-модификатор, т.е. на нее просто нельзя вешать горячие кнопки. кроме того, система заботливо сменила мне кнопки переключения раскладок. все эти действия были системой применены столь элегантно, что ни настройки kde, ни мои собственные скрипты скомпенсировать это безобразие не смогли. для исправления:
vim /etc/default/keyboard
чистим и исправляем XKB_OPTIONS

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

* если при обновлении dpkg жалуется на битую базу пакетов - vim в помощь, уберите из файла базы лишние спец-символы которые смущают dpkg (в моем случае это были переводы строк в описании нескольких пакетов, которые воспринимались как конец записи)

* если вы для запуска обновлений пользовались какой-нибудь удъобной хренью, то проще рестарт обновлений запускать через apt-get -f install или apt-get dist-upgrade (в зависимости от того как оно оборвалось, лучше чередовать :))

* рекомендую после обновления тщательно ознакомится с содержимым /etc/default. с каждым обновлением все больше всякой хйуни творится благодаря созданию новых опций повеведия системы и нормальных сервисов через скрипты-оболочки и опции в этом каталоге.

и большой всем удачи.

2012-04-25

SNMP-Flood.bat

У замечательной циски есть гнусная привычка не продавать инструкторам утилиты, используемые в лабах курсах. Например в качестве генератора SNMP можно использовать обычный ping. Точнее hping ( http://wiki.hping.org/86 ). а дальше hping.exe -2 --flood -p 161 10.1.1.1 где -2 это указание UDP, -p 161 это порт snmp, --flood это слать много, сразу, и не утруждаться отображением результатов :)

2012-04-05

Cisco Challenge

Дано:
злой администратор решил напакостить своим коллегам перед увольнением.
он на каждом роутере ввел следующие команды:

conf t
no service password-recovery
event manager applet no-re
 event cli pattern "^rel.*" sync yes
 action 010 syslog msg "Platform doesn't support reload"
event man applet no-con
 event cli pattern "^conf" sync yes
 action 010 syslog ms "Platform doesn't support configuration"
end
write mem

задача: восстановить работоспособность роутера не очищая его в ноль :)

ВНИМАНИЕ!!! Не стоит эти команды вбивать на важных роутерах, вы можете получить неприятный эфект:
Rack05R1#conf t

Rack05R1#
*Apr  5 06:35:50.454: %HA_EM-6-LOG: no-con: Platform doesn't support configuration
Rack05R1#reload

Rack05R1#
*Apr  5 06:35:51.546: %HA_EM-6-LOG: no-re: Platform doesn't support reload

2012-02-01

Кросплатформенноя Java посвящается

если ваше java-приложение официально работает под linux, но не хочет работать именно в вашем linux, не отчаивайтесь!
возможно, ваше приложение не работает с 64-битным linux.
в этом случае достаточно поставить 32-битную ява.
например для у*банты:

# apt-add-repository ppa:ferramroberto/java
# apt-get update
# apt-get install ia32-sun-java6-bin
# update-java-alternatives -s ia32-java-6-sun