2010-07-14

Долбанный ms.help v1.0

В MSDEV 2010 мелкомягковцы решили отказаться от старой монолитной системы помощи..
Пускают мелкий http сервер (они таки решили что IIS 7.0 для html справок - это слишком круто) - который раздаёт локальную справку..
В трее иконка - и.. ну многое сделано через ж@пу - и вообще. например
ссылки там имеют вид http://127.0.0.1:47873/help/1-6072/ms.help?мусор - где номер порта и адрес хоста - статические - а 6072 - это номер процесса. Зачем это они сделали - на их совести. Я уж молчу что они извратили идею http - пути и т.п. - всё в динамике? в запросе. что не позволит нормально использовать html.. но этим страдают многие. Но номер процесса в пути???
С внешки можно подключаться к этому же порту - но на все вопросы - "Bad Host" - как если не угадать номер процесса ..

Так вот. К вопросу хелпа *msdev 2010. Примеры кода там имеют удобный интерфейс - где разные языки заключены в разные "табы". Выбираешь таб - он пишется в куку - и все остальные запросы автоматом этот язык потом будут показывать "по умолчанию".
Реализатору респект К тому же код грамотный при первом взгляде - поддержка разных браузеров (разве что копирование в буфер обмена для хрома без анализа версий или чего-то там добавили). Хотя это мог какой-то исправлятор отсебятину наваять. Но локализаторы или кто там потом порылся.. Проблема в том, что есть язык C#, C++, F#, JScript. А вот бейсиков - оказывается два.
Первый - называется VB - и он идёт первым в списке (оно и понятно - тайную любовь БГ к языку своей молодости в мелкомягкой корпорации возвели в ранг всеобщей любимицы). Ну да оно не страшно в связи с краткостью и памятью на табы. Но вот тот "умник" что ковырялся "после" - добавил ещё одну вкладку - дубликат языка "VB" который так и называется - "Язык Visual Basic". Кроме всего прочего - он показывается отдельной вкладкой Оторвать бы этому ковыряльщику его ковырялки..

Пришлось ковырять "C:\Program Files\Microsoft Help Viewer\v1.0\dev10.mshc" (zip - архив - что также показывает грамотность "родного" автора поделия - не cab какой-то) и править файлик branding.js - и вот такая вот у меня получилась функция:

function addSpecificTextLanguageTagSet(codesnippetid)
{
for (var i = 1;i < 6;i++)
{
var snippetObj = document.getElementById(codesnippetid + "_tab" + i);
if (snippetObj == null) break;

var tagSet = getDevLangFromCodeSnippet(snippetObj.innerHTML);
if (!allLanguageTagSets.hasObject(tagSet))
allLanguageTagSets.push(tagSet);
}

if (!snippetIdSets.hasObject(codesnippetid))
snippetIdSets.push(codesnippetid);
else
{
var obj1 = document.getElementById(codesnippetid);
var obj2= obj1.nextSibling.nextSibling;
if (obj2.id == codesnippetid) obj2.style.display = 'none';
}
}

2010-06-10

Сила NAT

Вот оно как. Связь с "домашним роутером" потерялась, хозяева уехали на две недели и контора сидела с понедельника на сухом пайке. То есть интернет у особо избранных (читай меня) или если придти и хорошо попросить обратно у меня :)

Однако оказалось, что модем живёт и отзывается на SSH :)
Старые попытки поюзать его линукс закончились неудачей.
Отзывается модем о себе так:
BusyBox v0.61.pre (2006.04.28-16:02+0000) Built-in shell (ash)
Linux version 2.4.17_mvl21-malta-mips_fp_le (root@Leachy) (gcc version 2.95.3 20010315 (release/MontaVista)) #87 Fri Apr 28 23:52:07 CST 2006
cpu model: MIPS 4KEc V4.8
Что-то вроде D-LINK 504T или как то так..

Ну попытался на него собрать бинарники openvpn в среде openembedded.
И вроде собралось - только не пускалось. Ибо там не libc - а uClibc.
Попытался собрать на uClibc - openembedded ругнулся на hash-style в binutils.
Ох уж эта crosscompile для mipsel..
Вот если бы собрать openvpn под него.. ммм..

И тут с утра меня осенило :) iptables тут вполне нормальные..
Одна строчка:
iptables -t nat -A PREROUTING -s 95.106.MY.IP -p tcp --dport 55000:56000 -j DNAT --to MY.VPS.IP.ADDR
И всё. Роутер готов :)
На vps настраиваем прокси (его урезанность не позволила пустить OpenVPN) - и заставляем прокси ломиться на роутер как будто он и есть VPS.. Все счастливы.
Интернет в конторе ожил а биллинг провайдера считает трафик правильно (сиречь локально-безлимитно) - что есть гуд.
И так 50% месячного лимита в 300 МБ за три для выбрали - это с одного компа то :)
Страшно посчитать сколько вы расходуем трафика в будние дни то..
Ээх. Когда же дойдёт до "простых смертных" эта кабелизация-оптоволоконизация то есть FTTx..
Осчастливили, изверги, в двух микрорайонах пару десятков домов во всём городе - и хватит.

Вот она сила NAT - в одной строчке iptables :)

2010-06-03

Кодировки GSM модемов

Ужас, сколько всего :)
На самом деле строчка "*100#" превращается такими командами (слегка попортив GSM::PDA код)

$_='AA180C3602';
print;
$_=unpack'b*',pack"H*",$_;
s/([01]{7})/${1}0/g;
$_=pack 'b*',$_;

print "'$_'";

$_=unpack 'b*',$_;
s/([01]{7})0/$1/g;
print unpack"H*", pack'b*',$_;
# aa180c360200

Декодировка. Упаковать в lsb-бинарную строчку (младший бит первый):
AA => 01010101
18 => 00011000
0c => 00110000
36 => 01101100
02 => 01000000
Собираем в кучу:
0101010100011000001100000110110001000000
Нарезаем по 7 бит (я просто добавил по биту после каждого 7-го - а потом снова порезал на 8)
и декодируем.

bits = 01010100 10001100 00001100 00001100 11000100
septet = 0101010
septet = 1000110
septet = 0000110
septet = 0000110
septet = 1100010
Получили '*100#'

Ответ в UCS2 или UTF-16BE..
И ещё интересно:
at+cscs=?
+CSCS: ("IRA","GSM","UCS2")
Хотя at+cscs="GSM" выдаёт ОК и ничего не меняется :)

Да. И всё отправляется и принимается чудненько через консольку ttyUSB1.
Не надо писать в одну и читать в другую :)

Хайвей и все-все-все

Дали тут 3g-модемчик потестировать-настроить :)
Местного Мегафона-Центр который.

ubuntu 10.04
На корпусе нацарапано
Модель: E1550
HSDPA USB Stick
HUAWEI TECHNOLOGIES CO., LTD.

Статей про него много :)
lspci писал про него что он 12d1:1446 и CDROM с "дровами" да microSD картридер виделись.
Вот что dmesg писал:
[ 5296.452028] usb 3-1: new full speed USB device using ohci_hcd and address 2
[ 5296.679200] usb 3-1: configuration #1 chosen from 1 choice
[ 5296.688975] scsi9 : SCSI emulation for USB Mass Storage devices
[ 5296.689247] usb-storage: device found at 2
[ 5296.689249] usb-storage: waiting for device to settle before scanning
[ 5296.689433] scsi10 : SCSI emulation for USB Mass Storage devices
[ 5296.689595] usb-storage: device found at 2
[ 5296.689597] usb-storage: waiting for device to settle before scanning
[ 5301.690339] usb-storage: device scan complete
[ 5301.692309] usb-storage: device scan complete
[ 5301.696945] scsi 9:0:0:0: CD-ROM HUAWEI Mass Storage 2.31 PQ: 0 ANSI: 2
[ 5301.702443] scsi 10:0:0:0: Direct-Access HUAWEI MMC Storage 2.31 PQ: 0 ANSI: 2
[ 5301.751308] sr0: scsi-1 drive
[ 5301.751315] Uniform CD-ROM driver Revision: 3.20
[ 5301.751482] sr 9:0:0:0: Attached scsi CD-ROM sr0
[ 5301.751580] sr 9:0:0:0: Attached scsi generic sg6 type 5
[ 5301.751957] sd 10:0:0:0: Attached scsi generic sg7 type 0
[ 5301.800325] sd 10:0:0:0: [sdg] Attached SCSI removable disk
[ 5314.054935] ISO 9660 Extensions: Microsoft Joliet Level 1
[ 5314.101926] ISOFS: changing to secondary root

Ладно. Нам цэ-дэ не нужен. Надо его из ЦэДэ в модем превратить (что с цэ-дэ сотворить - потом думать буду).

"Лучший способ" пока - прописать
sudoedit /etc/udev/rules.d/15-huawei-155x.rules
SUBSYSTEM=="usb",
ATTRS{idProduct}=="1446",
ATTRS{idVendor}=="12d1",
RUN+="/lib/udev/modem-modeswitch --vendor 0x$attr{idVendor} --product 0x$attr{idProduct} --type option-zerocd"

Хм. Странно. Циферки не совпали. Перетыкаем донгл - получаем через несколько секунд вот такой девайс:
12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
tty не появились (кажется).
sudo modprobe usbserial vendor=0x12d1 product=0x1003
И вот у нас по dmesg появились консольные устройства:

[ 8865.063521] usbserial_generic 3-1:1.0: generic converter detected
[ 8865.063680] usb 3-1: generic converter now attached to ttyUSB0
[ 8865.067561] usbserial_generic 3-1:1.1: generic converter detected
[ 8865.067742] usb 3-1: generic converter now attached to ttyUSB1

Странно что два порта :)
ttyUSB0 - отвечает на AT команды.
и ttyUSB1 тоже отвечает на AT команды - только тут регулярно валятся всякие непонятные сообщения. Вроде:
^RSSI:20
^BOOT:37205608,0,0,0,87
^RSSI:20
^RSSI:20
^RSSI:20
^RSSI:22
^RSSI:18
^BOOT:37205608,0,0,0,87
^RSSI:18
^RSSI:18
^RSSI:18

Ужас. Разбираться лень :)

пишем конфиг /etc/wvdial.conf У меня заработал такой (Рязанский Мегафон):
[Dialer defaults]
Modem = /dev/ttyUSB0

[Dialer mc]
Modem = /dev/ttyUSB0
Baud = 115200
Init2 = AT+CGDCONT=1,"IP","internet"
Phone = *99***1#
Username = *
Password = *
Stupid Mode = 1
New PPPD = yes
Auto DNS = 1

[Dialer pin]
Modem = /dev/ttyUSB0
Baud = 115200
Init1 = AT+CPIN=1234

Пин-код вроде не нужен :)
ну да ладно - пригггадитттсся.
Попытки коннектиться на ttyUSB1 не увенчались успехом :)
CARRIER LOST и всё тут :)
wvdial -n mc
и понеслось :) Ну роутинг там прописать и т.п. - думаю справитесь.
Ага. Попутно появились всякие статейки как слать и принимать USSD :) Занятненько..
Взял отсюда программульку.. http://linux007.livejournal.com/82330.html
./ussd '*100#'
мусор всякий пишеть.. Ладно. Но пишеть же? Значит что-то тут не так :)
выводим в отладку то что у нас ушло в порт и что вернулось.
ушло: AT+CUSD=1,AA180C3602,15
вернулось:00320035002E00340032044004430431002E0421043C043E04420440043800200032003500200422041200
2D043A0430043D0430043B043E0432002C002004420440043004440438043A0020043104350441043F043B002E0021002004170432043E043D04380020002A0035003000360023002000380440002F04340435043D044C
Эти 04ХХ ничего не напоминают? Сообщения то пишутся на русском. а это галимый utf-16 из винды. То есть utf-16be если что (или UCS2 некоторые называют). А никак не utf-7..
проверяем нашу догадку..
В конце файлика комментарим перекодировку и делаем свою:

#$decoded_ussd_reply = Device::Gsm::Pdu::decode_text7('00'.$ussd_reply);
use Encode;
$decoded_ussd_reply = pack "H*",$ussd_reply;
Encode::from_to($decoded_ussd_reply,'UTF-16BE','UTF-8');
(консолька то у нас линуксовая - и utf8 понимает только :)

Вуаля! Вот и наш ответ со спамом:
USSD REPLY: 25.42руб.Смотри 25 ТВ-каналов, трафик беспл.! Звони *506# 8р/день
Пока всё.. будем пилить дальше..

2010-05-26

Terminal Services Interact with User parameter path

Сделал бутлог processmon - смотрел где terminal services for XP смотрит эти параметры.
Нужно чтобы включить управление сессией без запроса - в частности проуправлять отключенными сеансами.. Бухгалтера неисправимы - и требуют что-то у себя исправить не давая разрешения на управление..

Ставим везде: fInheritShadow=0, Shadow=2 (а не Shadow=1 как обычно стоит)

Попробуем перезагрузиться и проуправлять :)
HKLM\ (да, да, именно в корне HKLM - видимо какой-то глюк в winlogon)
HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\ (только Shadow)
HKLM\System\CurrentControlSet\Control\Terminal Server\DefaultUserConfiguration\
HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\Console\
HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\

Вот ещё ссылочку с объяснениями параметров TS нашёл..

2010-05-21

SOCKS proxy v2

Туннель оборвался.. Openvpn выживает - но tcp соединения через него иногда рвутся - что заставило умереть мой ssh прокси :)
Дубль два. Тоже всё просто.
Для туннеля нужно:
1. iptables-based DNAT. Также как и раньше.
2. "правильный" netcat-openbsd с поддержкой SOCKS (ключиком -x):
sudo apt-get install netcat-openbsd
3. SOCKS сервер. Я использую danted - долгие кривые непонятные настройки. Но когда-то успешно настроенный на внешнем сервере. Можно поискать внешние - или пользоваться соксом от ssh -D :)
4. xinetd
Вот его примерный конфиг:
service yaru
{
type = UNLISTED
flags = REUSE
socket_type = stream
wait = no
protocol = tcp
# interface = 127.0.0.1
user = nobody
disable = no
log_type = FILE /var/log/redirect.log
log_on_success += HOST DURATION USERID
log_on_failure = HOST ATTEMPT USERID
only_from = 192.168.0.0/16 127.0/8

port = 5226
server = /bin/nc
server_args = -x 10.8.0.6:1080 93.158.134.48 5222

# log_on_success += TRAFFIC
# redirect = 192.168.1.10 1234
# server = /bin/false
}

Теперь даже если туннель и порвётся - то клиенты просто переподключатся и всё..

2010-04-30

Прозрачный SOCKS

Всё просто. Тупой Empathy не умеет соединяться с jabber через прокси.
Хм.
Прямые соединения на роутере "наружу" закрыты.
Делаем "прозрачный" ssh туннель.
На одном из серверов, через который проходят соединения делаем так:
ssh -g -v user@bridge.local -L 5225:209.85.137.125:5222 -L 5226:93.158.134.48:5222
Можно убрать ключики -v и добавить что-то вроде -n и -f (не помню) чтобы отправить "в фон" без экрана :) Ключик -g важен чтобы внешние компы могли через этот "туннель" проходить..

Это для одного из серверов гмыла и для яндекса соответственно.
dig srv _xmpp-client._tcp.gmail.com
dig srv _xmpp-client._tcp.ya.ru
чтобы получить нужные адреса :)

Всё. Туннель есть.

Теперь засовываем траффик в туннель :)
iptables -t nat -A PREROUTING -p tcp -d 209.85.137.125 --dport 5222 -j REDIRECT --to-port 5225
iptables -t nat -A PREROUTING -p tcp -d 93.158.134.48 --dport 5222 -j REDIRECT --to-port 5226

Проверяем:
nc -vv xmpp.yandex.ru 5222
Open!