Показ дописів із міткою рецепты. Показати всі дописи
Показ дописів із міткою рецепты. Показати всі дописи

вівторок, 24 квітня 2012 р.

Конструктор HTC Desire и всякие фенечки

В какой-то момент мне надоела постоянная ругань телефона на нехватку памяти. В результате я таки добрался до перепрошивки его на CyanogenMod. Перепрошил. Потерял HTC Sense, взамен получил громадный конструктор с кучей настроек, полезность большинства из которых очень сомнительна.
Самое весёлое что просто переход на CyanogenMod проблему с памятью не решает: все-равно очень многие программы не умеют полностью уезжать на SD карточку, и внутренний флеш всё-равно заканчивается.
Но решение таки есть: http://www.andreagrandi.it/2011/08/13/howto-extend-htc-desire-internal-memory-to-2gb-using-cyanogenmod-7-and-data2sd/ . В результате у меня теперь стоит куча софта и при этом куча памяти свободно.

четвер, 4 листопада 2010 р.

ipfw vs pf: удобство синтаксиса

Многие взлюбили pf за наличие кучи приятных плюшек в конфиге. Вот только иногда люди забывают (или даже не знают), что большинство этих плюшек реализуются не собственно фаерволлом, а утилитой pfctl, которая транслирует конфиг при загрузке. А это: переменные, возможность вместо адреса или сети указывать "адрес (или сеть) с такого то интерфейса", возможность практически в любом месте правила вместо одного элемента указать список (в фигурных скобках).
"Ну и что?" скажут некоторые. А то, что, во первых, без четкого понимания что это всего лишь syntax sugar, реализуемый pfctl, часто можно оказаться обманутым и получить не то, что ожидалось. Напримерь кусок "from em0:network" это на самом деле не "от адресов с сетей, которые установлены на em0", а "от адресов с сетей, который былы установлены на em0 в момент загрузки правил". А правило "block in from not { 192.168.0.0/16, 10.0.0.0/8 }" на самом деле оттранслируется в два: "block in from not 192.168.0.0/16" и "block in from not 10.0.0.0/8" и в результате заблокирует весь трафик, а не трафик от сетей, кроме перечисленных.
"Ну и пусть! Все-равно же удобно! А в ipfw такого нет". Или есть?
Ну, во первых некоторые вещи в ipfw просто не нужны, потому что изначально есть правильные элементы: есть "me" вместо костыля "table <me> { self; }", есть "allow ip from { x or not y or z } to any" (причем и то, и то это элементы фаерволла, а не препроцессора), есть возможность задавать через запятую список сетей или вообще "1.2.3.0/24{128,35-55,89}"
Ну а во вторых все-равно хочется переменных и т.п., пусть и это будет транслироваться на этапе загрузки? Ну так вот же: -p . И вот так оно включается
firewall_enable="YES"
firewall_type="/etc/ipfw.conf.m4"
firewall_flags="-p /usr/bin/m4"
firewall_nat_enable="YES"
А вот так используется:
define(`ext_if',`vlan3')
define(`nat_ip',`100.100.100.20')
define(`rfc1918',`10.0.0.0/8, 172.16/12, 192.168/16')
define(`mailserviceip',`100.100.100.29')
define(`mailerip',`10.1.2.102')

nat 1 config ip nat_ip same_ports log
add nat 1 all from 10.0.0.0/8 to any out xmit ext_if
add deny all from rfc1918 to any out xmit ext_if

add nat 1 all from any to nat_ip in recv ext_if

add fwd mailerip,imaps tcp from any to mailserviceip imaps in

вівторок, 12 жовтня 2010 р.

Advanced disk format on FreeBSD

Вот такой вот свой маленький велосипедик получился:
# cat /etc/rc.d/gnop 
#!/bin/sh
#

# PROVIDE: gnop
# REQUIRE: mountcritlocal
# BEFORE:  zfs
# KEYWORD: nojail

. /etc/rc.subr

name="gnop"
rcvar=`set_rcvar`
start_cmd="do_gnop"
stop_cmd=":"

do_gnop()
{
        for d in $gnop_disks
        do
                if [ -e /dev/$d.nop ]
                then
                        echo "gnop: device $d already configured"
                else
                        echo -n "gnop: configuring device $d ..."
                        gnop create -v $gnop_flags $d
                fi
        done
}

load_rc_config $name
run_rc_command "$1"
# fgrep gnop /etc/rc.conf
gnop_enable="YES"
gnop_disks="ada0 ada1 ada2 ada3"
gnop_flags="-S 4096"

пʼятниця, 10 вересня 2010 р.

named in jail

Скрипт запуска named в базовой системе FreeBSD по умолчанию запускает его в chroot /var/named . Для своей работы named-у нужен /dev/null и /dev/random , поэтому этот же скрипт запуска монтирует в chroot devfs с рулесетами, оставляющими только эти устройства. Естественно в jail подобный фокус не получится ввиду того, что по умолчанию в jail вообще запрещен mount, и разрешить его можно только для определенных "jail-friendly file systems"
Выходов 3:
  1. не запускать named в jail :)
  2. выключить chroot, выставив named_chrootdir=""
  3. предварительно подготовить dev/ для named: стартовый скрипт при запуске внутри jail не пытается сам примонтировать devfs, а проверяет не примонтирован ли он уже для него.
Вообще наличие 3-го пункта (благодаря r188293) намекает на наличие какой-то "стандартной" процедуры делать это предварительное монтирование, но я эту процедуру не нашел. Поэтому соорудил сам:
jail_levsha_named_dev="${jail_levsha_rootdir}/var/named/dev"
jail_levsha_exec_prestart0="devfs_domount ${jail_levsha_named_dev} devfsrules_hide_all"
jail_levsha_exec_prestart1="devfs -m ${jail_levsha_named_dev} rule apply path null unhide"
jail_levsha_exec_prestart2="devfs -m ${jail_levsha_named_dev} rule apply path random unhide"
jail_levsha_exec_poststop0="umount ${jail_levsha_named_dev}"

субота, 7 серпня 2010 р.

mutt & imap

В mutt есть поддержка imap, вполне себе рабочая. Но есть некоторые нюансы:
  • нет offline mode (хотя письма mutt и кеширует)
  • синхронизация прочитанных/удаленных писем делается не сразу по прочтению/удалению, а по нажатию специальной клавиши или по переходу в другую папку. И если к моменту синхронизации связь с сервером оборвалась, то информация, которую нужно засинхронизировать, просто теряется
Отказываться от imap полностью и переходить на fetchmail не хочется: теряется возможность читать почту с телефона и через webmail.
Возвращаться к чтению почты в mutt прямо на сервере тоже не хочется: в своё время я ушел от этого потому, что не хочу держать свой pgp ключ на сервере и заниматься поддержкой pgp database на сервере. Да и опять же хочется иметь offline mode.
Решением всего этого стало использование программы offlineimap: запущенная программа периодически синхронизирует imap ящик с локальным maildir, mutt работает со своим любимым локальным maildir. Настройка offlineimap и mutt есть в offlineimap faq.

четвер, 1 липня 2010 р.

copy-paste между компом и мобилкой

Задача: скопировать какой-то текст (допустим url) c компьютера на мобилку. Как её будет решать обычный человек? Правильно - вручную перенаберет. Просто и терпимо по скорости.
Как его будет решать помешанний типа меня? Погуглит, найдет что то, что надо, называется QR Code, установит соответствующую утилитку, потом на компе сделает

qrencode -o- http://blog.levsha.me |xv -

а на мобилке запустит QR Code/barcode scanner и сосканирует эту картинку :)
P.S. Сотрудник, которому было продемонстрировано таку методику copy-paste, сказал "наконец то я буду знать зачем в телефоне нужна камера"

неділя, 7 лютого 2010 р.

Переключение раскладок

Наконец то нашел то, чего давно хотел: включение нужной раскладки клавиатуры по определенной комбинации клавиш (это когда раскладки не переключаются по кругу, а при нажатии определенной клавишы/комбинации сразу включается английска, другой - русская, третей - украинская). Это может показаться не удобным на первый взгляд, но на самом деле это просто не привычно. В то же время по правилам построения интерфейсов это более правильно. Потому что задача то и есть "включить такую то раскладку", а не "включить раскладку на 2 вперед от текущей". И попытка её решения круговым переключением хуже тем, что нужно смотреть а какая раскладка сейчас включилась, вместо того, чтобы просто включить нужную, не зависимо от текущей.
Делал по заметке с хабрахабра: http://habrahabr.ru/blogs/linux/83223/

середа, 27 січня 2010 р.

Ethernet <->Wi-Fi failover

Простой случай: у вас есть одна сеть, доступная и по витой паре, и по wi-fi (очень распостраненная ситуация дома, а иногда и на некоторых фирмах). Хочется в случае подключения к витой паре работать через неё (чтобы быстрее), в случае отключения работать через wi-fi (для мобильности). Делается элементарно:
rc.conf:
#выставить на ethernet интерфейсе MAC с wifi интерфейса
# поднять оба интерфейса и запустить wpa_supplicant на wifi линке
ifconfig_em0="ether 00:16:ed:5d:6a:38 up"
wlans_iwn0="wlan0"
ifconfig_wlan0="WPA up"
# объединить линки
cloned_interfaces="lagg0"
ifconfig_lagg0="laggproto failover laggport em0 laggport wlan0 DHCP"

Сложный случай: есть разные сети, и только в некоторых из них wifi и ethernet это одна сеть, а в остальных разные. Тогда добавляем wlan0 в lagg только для сетей, которые мы явно указали.
rc.conf:
ifconfig_em0="ether 00:16:ed:5d:6a:38 up"
wlans_iwn0="wlan0"
ifconfig_wlan0="WPA DHCP"
cloned_interfaces="lagg0"
ifconfig_lagg0="laggproto failover laggport em0 wlan0 DHCP"
Находим и правим секцию в devd.conf:
notify 0 {
        match "system"          "IFNET";
        match "type"            "LINK_UP";
        media-type              "802.11";
        action "/etc/wlan_up.sh $subsystem";
};
Содержимое wlan_up.sh:
#!/bin/sh

subsystem=$1

laggether="`ifconfig lagg0 |awk '/ether/ {print \$2}'`"
wlanether="`ifconfig ${subsystem} |awk '/ether/ {print \$2}'`"
ssid="`ifconfig ${subsystem} |awk '/ssid/ {print \$2}'`"

if [ "x${laggether}" = "x${wlanether}" ]
then
        if [ "x${ssid}" = "xasus" ]
        then
                ifconfig lagg0 laggport ${subsystem}
                exit
        fi
fi

/etc/rc.d/dhclient quietstart $subsystem
В моём случае wlan добавляется в lagg только для ssid asus и только в случае, если MAC адрес wlan интерфейса и lagg интерфейса совпадает (это сделано для того, чтобы не добавлять в lagg другие wlan интерфейсы - я еще иногда подключал usb wlan карточку)

четвер, 10 грудня 2009 р.

3G ExpressCard modem on FreeBSD

Итак, мною куплен HSDPA модем Novatel Merlin XU870. Под FreeBSD 9.x он без каких-либо вопросов распознался с помощью u3g(4):

Dec 10 16:00:29 laptop kernel: ugen5.2: at usbus5
Dec 10 16:00:29 laptop kernel: u3g0: on usbus5
Dec 10 16:00:29 laptop kernel: u3g0: Found 2 ports.

После втыкания появляются два порта: ttyU0.0 и ttyU0.1. Первый обычный AT порт, второй судя по всему порт для мониторинга и какого-то управления.
Через первый порт стандартно всё почти работает через ppp(8) обычными настройками как для мобилки. "Почти" потому, что umc додумался выдавать адреса на концы туннеля в стиле 95.109.188.33 -> 0.0.0.0 . В принципе вполне рабочая конструкция, но ppp офигевает от такого, ругается что не может выставить адреса на tun интерфейс и всё сваливается. Поэтому немного покопался и настроил через mpd.
В mpd всё получилось достаточно просто вот такой секцией в mpd.conf

hypernet:
create link static LHP modem
set modem device /dev/cuaU0.0
set modem watch -cd
set modem var $APN "hyper.net"
set modem script DialGprs
set link disable chap pap
set link accept chap pap
set link action bundle BHP
create bundle static BHP
set bundle links LHP
set iface addrs 0.0.0.0 !10.253.252.251
set iface route default

Плюс еще поправил штатный mpd.scripts: была добавлена секция

DialGprs:
set $DialPrefix "DT"
set $Telephone "*99#"
goto DialPeer

(хотя не думаю что это правильный метод - это можно было и в mpd.conf вынести), и добавлено определение и инициализация модема: после строки print "ATI\r\n" была добавлена строка match "+CGSM" ModemIdentGSM и описана Ident секция:

ModemIdentGSM:
set $ModemDescription "GSM modem"
set $ModemIsAnalog "no"
set $ModemSetupFunc GsmSetup
return
...
GsmSetup:
set $Baundrate 921600
set $modemCmd "+CGDCONT=1,\"IP\",\"${APN}\",\"0.0.0.0\",0,0"
call ModemCmd2
return

Всё работает вполне чётко и стабильно.
С рюшечками пока ничего нет: umtsmon достаточно быстро собрал под фрей, но работать он пока не захотел. Так что с ним еще буду разбираться

неділя, 1 листопада 2009 р.

ata(4) в FreeBSD 8.0

В FreeBSD 8.0 и выше ata(4) разделен на отдельные функциональные и специфичные для вендоров модули. Если вы привыкли прописывать device ata в конфиг ядра, то ничего не изменится, так как device ata в конфиге ядра включит все vendor модули. Если же использовать подгрузку ata модулями (как делаю это я), то обязательно нужно подгружать и соответствующий vendor модуль (ataintel.ko , atanvidia.ko , atavia.ko etc), даже если обычный atapci нормально распознает контроллер.
Я уже два раза нарвался на последствия отсутствия vendor модуля:
- на рабочей станции с ide контроллером Marvell 88SX6121 UDMA133 controller не определялся dvd rw привод, хотя канал определялся
- на сервере с ich7 под нагрузкой пропадал диск со второго sata канала

пʼятниця, 13 лютого 2009 р.

Разруливание разных программ в разные каналы

Из раздела "вдруг еще кому пригодится"
Условия: есть несколько внешних каналов. В моём случае это основное ethernet подключение и vpn поверх него
Задача: управлять каким программам через какой канал ходить в интернет.
Необходимо: freebsd 7-stable после r180774 (Thu Jul 24 2008, 7.1-RELEASE подходит)
Пересобираем ядро, добавив такую опцию:
options         ROUTETABLES=16           # max 16. 1 is back compatible.

После этого в основной route table оставляем default на основной канал, во второй добавляем default на второй канал методом sudo setfib 1 route -n add 0 <default_gw2> . После этого команды, которые необходимо отправлять в инет через второй канал, запускаем методом setfib 1 <program> . Запускать можно от обычного пользователя.
Для vpn, поднимаемого mpd, я себе написал скрипт такого содержания:

#!/bin/sh

REMOTEIP=$4

setfib 1 route -n delete 0/0
setfib 1 route -n add 0/0 $REMOTEIP

и прописал его как set iface up-script
UPD: sem сделал поддержку static/default route для разных fib в rc.d/routing: conf/132476