Поиск по этому блогу

пятница, 30 декабря 2011 г.

pam_usb

Для начала установим пакеты:
~$ sudo aptitude  install libpam-usb pamusb-tools
Для добавления не нужно монтировать накопитель.
~$ sudo pamusb-conf --add-device usbkey
Please select the device you wish to add.
* Using "UFD 2.0 Silicon-Power16G (UFD_2.0_Silicon-Power16G_1112049600002481-0:0)" (only option)
Which volume would you like to use for storing data ?
* Using "/dev/sdb1 (UUID: A107-E528)" (only option)
Name  : usbkey
Vendor  : UFD 2.0
Model  : Silicon-Power16G
Serial  : UFD_2.0_Silicon-Power16G_1112049600002481-0:0
UUID  : A107-E528
Save to /etc/pamusb.conf ?
[Y/n] Y
Done.
Вместо usbkey можно нарисовать любой идентификатор для флешки.
Добавляем пользователя:
~$ sudo pamusb-conf --add-user olden
Which device would you like to use for authentication ?
* Using "usbkey" (only option)
User  : olden
Device  : usbkey
Save to /etc/pamusb.conf ?
[Y/n]
Done.
Проверяем правильность настроек:
~$ pamusb-check olden
* Authentication request for user "olden" (pamusb-check)
* Device "usbkey" is connected (good).
* Performing one time pad verification...
* Regenerating new pads...
* Access granted.
Правим /etc/pam.d/common-auth на предмет авторизации по usb:
sed -i "s/\(.*pam_unix.so.*\)/auth\tsufficient\tpam_usb.so\n\1/" /etc/pam.d/common-auth
Для блокировки десктопа в случае изъятия флешки в файле /etc/pamusb.conf, в секции пользователя, можно объявить соответствующие события.
Для GNOME:
<user id="olden">
<device>usbkey</device>
<agent event="lock">gnome-screensaver-command --lock</agent>
<agent event="unlock">gnome-screensaver-command --deactivate</agent>
</user>
Для KDE:
<user id="olden">
<device>usbkey</device>
<agent event="lock">qdbus org.kde.screensaver /ScreenSaver Lock</agent>
<agent event="unlock">qdbus org.kde.screensaver /ScreenSaver SetActive false</agent>
</user>
Добавляем автозапуск агента pamusb-agent.
GNOME:
System > Preferences > Sessions > Startup Programs > Add > pamusb-agent > ОК > Close
KDE:
~$ cd ~/.kde/Autostart && ln -s /usr/bin/pamusb-agent pamusb-agent

пятница, 18 ноября 2011 г.

MySQL: тригеры и вызов внешних приложений

Синтаксис создания триггера:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
  • trigger_name — название триггера;
  • trigger_time — Время срабатывания триггера. BEFORE — перед событием. AFTER — после события;
  • trigger_event — событие:
    • insert — событие возбуждается операторами insert, data load, replace;
    • update — событие возбуждается оператором update;
    • delete — событие возбуждается операторами delete, replace;
  • tbl_name — название таблицы;
  • trigger_stmt — выражение, которое выполняется при активации триггера.
Операторы DROP TABLE и TRUNCATE не активируют выполнение триггера.

DELIMITER $$
CREATE TRIGGER tg1 AFTER INSERT ON `your_table`
FOR EACH ROW
BEGIN
\! echo "php algun_script_php.php" >> /log/yourlog.txt
END $$
DELIMITER;
Выполнение внешнего скрипта через sys_eval UDF:
  1. Создаём хранимую процедуру:
    DELIMITER $$
    CREATE PROCEDURE udfwrapper_sp
    (p1   DOUBLE,
    p2   DOUBLE,
    p3 BIGINT)
    BEGIN
    DECLARE cmd CHAR(255);
    DECLARE result CHAR(255);
    SET cmd = CONCAT('C:/xampp/php/php.exe -f "C:/xampp/htdocs/phpFile.php" ', p1, ' ', p2, ' ', p3);
    SET result = sys_eval(cmd);
    END$$;
  2. Создаём тригер:
    CREATE TRIGGER udfwrapper_trigger AFTER INSERT ON sometable
    FOR EACH ROW
    CALL udfwrapper_sp(NEW.Column1, NEW.Column2, NEW.Column3);


вторник, 15 ноября 2011 г.

PHP - выводить все ошибки и предупреждения

error_reporting(E_ALL^E_STRICT);
ini_set('display_errors','On');

Perl & GeoIP

Простенькая такая себенапоминалка о Perl и GeoIP:
# aptitude install libgeo-ip-perl
$ perl -e 'use Geo::IP; my $gi = Geo::IP->open("/usr/share/GeoIP/GeoIP.dat", GEOIP_STANDARD); print $gi->country_code_by_addr("212.90.160.40"), "\n";'
UA
$ perl -e 'use Geo::IP; my $gi = Geo::IP->open("/usr/share/GeoIP/GeoIP.dat", GEOIP_STANDARD); print $gi->country_code_by_addr("193.34.140.1"), "\n";'
UA
$ perl -e 'use Geo::IP; my $gi = Geo::IP->open("/usr/share/GeoIP/GeoIP.dat", GEOIP_STANDARD); print $gi->country_code_by_addr("8.8.8.8"), "\n";'
US
$ perl -e 'use Geo::IP; my $gi = Geo::IP->open("/usr/share/GeoIP/GeoIP.dat", GEOIP_STANDARD); print $gi->country_code_by_addr("8.8.4.4"), "\n";'
US

Генерация хеша для /etc/shadow в Debian

Прочитал статью, решил проверить и с некоторым удивлением заметил, что у меня на одном из серверов хеш начинался с $1. Вооружившись новыми знаниями решил перестроить хеш в /etc/shadow вручную.
Первое, что стало любопытно, а какие форматы для хеша поддерживает mkpasswd в Debian Lenny и какие в Debian Squeeze:
lenny$ mkpasswd -m help
Available methods:
des standard 56 bit DES-based crypt(3)
md5 MD5
sha-256 SHA-256
sha-512 SHA-512

squeeze$ mkpasswd -m help
Доступные методы:
des standard 56 bit DES-based crypt(3)
md5 MD5
sha-256 SHA-256
sha-512 SHA-512
Вполне ожидаемый результат.
Осталось сгенерировать пароль. Глянул в статью, попробовал, и получил неожиданный результат:
$ mkpasswd -m sha-512 --salt=KlLePXXM
Испорченная длина salt: 8 байт(а) при ожидаемой 16.
но для 16 байтной "соли" всё прошло гладко:
$ mkpasswd -m sha-512 --salt=eruighergmbreger
Пароль: 
$6$eruighergmbreger$chkaHXfrafLH4Quq1bCLj1krzDAKORTiA0.pg5.0EdWUZyeHuuMrAdryXkaM6wlTL3NRVDlyS7489YiCvGn/A/
Дальше всё очень просто, берём этот хеш и подставляем его в /etc/shadow вместо существующего. Пробуем подлогиниться и не получаем никакого отлупа. Довольные идём пить кофе :)

пятница, 30 сентября 2011 г.

Тест на Украинскость

Тест на украинскость от "КП" в Украине"
Ваш индекс
украинскости: 63
«Поздравляем, ты – нормальный среднестатистический украинец. Вступать в УПА еще рано, но ты рад, что не москаль - и слава богу! И героям слава!»
 
Пройти тест!

среда, 14 сентября 2011 г.

Latin1 -> KOI8-U -> UTF8

В общем столкнулся давеча с такой ситуацией. Долго и нудно использовалось на работе приложение в котором составлялись заявки на аварии ну и сохранялись в базе MySQL.
Как-то не приходилось обращать внимания в какой кодировке, где, как и что хранится, а тут задумал переписать приложение, при этом захотелось задействовать ExtJS. Ну то, что этот фреймворк для отображения русского текста использует UTF8 нисколько не останавливало, в конце-концов в том-же PHP есть поддержка замечательного функционала iconv (не говоря уже о том, что iconv есть в Linux). И вот в этом месте поджидала необычная засада…
Таблица в базе была создана в кодировке Latin1, но данные в неё сохранялись из KOI8-U. Помимо всего прочего ситуация усугублялась тем, что системная локаль выставлена в UTF8. Простая смена через ALTER TABLE кодировки полей (или для всей таблицы) к успеху не приводила так как при этом выполнялось дополнительное преобразование кодировки, которое в общем-то делать было не к чему - данные и без того в KOI8.
Первое что пришло на ум это слить таблицу через mysqldump, затем конвертануть всё, что понадобится через iconv, через sed поменять описание для CHARSET и слить таблицу обратно. Но тут опять наметился геморой с двойной-тройной перекодировкой… короче чёрт ногу мог сломать быстрее нежели в этом всём разобраться. Данный путь был быстренько признан тупиковым.
Что же оставалось делать? На выручку пришло поле типа BLOB :)
Итак, пошагово. Заходим в mysql и делаем следующее:


  • Устанавливаем текущую кодировку для таблицы:
    SET NAMES LATIN1;
  • Создаём новую таблицу с использованием структуры старой:
    CREATE TABLE new LIKE old;
  • Сохраняем все записи старой таблицы в новую:
    INSERT INTO new SELECT * FROM old;
  • Меняем кодировку на текущую системную:
    SET NAMES UTF8;
  • Затем для каждого текстового поля (char, varchar и т.п.) было проделано подобное преобразование:
    ALTER TABLE new CHANGE field field BLOB;
    ALTER TABLE new CHANGE field field varchar(64) CHARACTER SET koi8u;

Безусловно, что цифровые, перечисляемые и другие типы полей подобной конвертации не подлежат.
Собственно после столь незначительных усилий таблица new стала содержать все данные из таблицы old только в правильной KOI8-U кодировке, вместо Latin1. Осталось подменить старую таблицу на новую:
  • RENAME TABLE old TO bak, new TO old;
В старые php-скрипты была добавлена инструкция mysql_query('SET NAMES KOI8U') и всё стало на свои места: пока ещё не написан полностью новый функционал - вполне корректно продолжили работать старые скрипты, а в новых, перед использованием json_encode текстовые поля из koi8-u приходится просто перекодировать в utf8 при помощи замечательной функции iconv ;)

Есть вероятность, что из BLOB можно было бы "вытащить" данные в UTF8, но пока мне это просто не нужно, так как старый функционал всё-таки заточен под KOI8-U.

четверг, 8 сентября 2011 г.

Мегабит, мегабайт… замечания и мысли вслух.

Помните тот анекдот про программиста?
«Программист отличается от нормального человека тем, что нормальный человек думает что в килобайте 1000 байтов, а программист уверен что в километре 1024 метра»
Собственно лично я привык думать, что во всём, что связано с цифровой техникой приставка кило это 2^10, мега это 2^20, гига это 2^30 ну и т.д. А вот вчера опубликовав заметку я ещё раз задумался, а насколько же я прав или не прав?

 Так или иначе, но я открыл для себя стандарт IEEE 1541-2002 в котором в общем-то чётко сказано, что подсчёт приведённых выше степеней двойки обозначается соответственно как киби, миби, гиби ну т.д.

Что-же нам рекомендует стандарт IEEE 1541-2002?

Стандарт устанавливает:

  • единицы измерения количества информации в цифровой и вычислительной технике:
    • бит (bit, b), двоичный знак;
    • байт (byte, B), набор битов (их количество не обязательно равно восьми), обрабатываемых совместно;
    • октет (octet, o), набор из восьми битов;
  • двоичные приставки для вышеупомянутых единиц:
    • киби (Ki), 210 = 1024;
    • меби (Mi), 220 = 1048576;
    • гиби (Gi), 230 = 1073741824;
    • теби (Ti), 240 = 1099511627776;
    • пеби (Pi), 250 = 1125899906842624;
    • эксби (Ei), 260 = 1152921504606846976;
    • зеби (Zi), 270 = 1180591620717411303424;
    • йоби (Yi), 280 = 1208925819614629174706176;
  • что первая часть двоичной приставки произносится аналогично приставке СИ, а вторая часть — как -би;
  • что приставки СИ не используются в качестве двоичных приставок.
Приставка киби- начинается с большой буквы 'K', в то время как соответствующая ей приставка СИ начинается с маленькой 'k'.

Нет, я конечно же понимаю, что стандарт стандартом, но как-то странно на слух звучит: «йобибит». Кибибит это сколько от йобибита? ;)

На практике же мы продолжаем использовать привычным нам приставки: кило, мега, гига и т.д. (йоттабит, всё-таки это не йобибит).

Тем не менее и таким образом, имеем то, что имеем:
килоk1031000 кибиKi2101024
мегаM1061000000 мебиMi2201048576
гигаG1091000000000 гибиGi2301073741824
тераG10121000000000000 тебиTi2401099511627776
… ну и т.д.

Собственно, чтобы не путаться, правила простые:
  • измерение количества (объёма) информации проводится в степенях двойки («вчера скачал фильм в хорошем разрешении, "весит" 2 гигабайта…», т.е. 2·230 = 2147483648 байт);
  • скорость передачи информации проводится в степенях десятки («… и скорость была потрясающая - 38 мегабит», т.е. 38·106 = 38000000 бит в секунду, т.е. 4750000 байт (октетов) в секунду, т.е. 4.53 мегабайта (мегаоктетов) в секунду).

    понедельник, 5 сентября 2011 г.

    Восстановление openssh public key из private key

    Случается, что теряется (удаляется или перезаписывается по ошибке) публичная часть ключа (та, которая обычно имеет суффикс ".pub"), но если секретная часть жива ("id_rsa" или "id_dsa") то восстановить публичную — как два пальца:
    $ ssh-keygen -y -f id_rsa > id_rsa.pub
    или
    $ ssh-keygen -y -f id_dsa > id_dsa.pub

    Исходная заметка.

    среда, 10 августа 2011 г.

    Список дополнительных смайлов в Skype



    mooning – (mooning)
    finger – (finger)
    bandit – (bandit)
    drunk – (drunk)
    smoke – (smoking) (smoke) (ci)
    toivo – (toivo)
    rock – (rock)
    headbang – (headbang) (banghead)
    poolparty – (poolparty) (hrv)
    swear – (swear)
    bug – (bug)
    fubar – (fubar)
    tmi – (tmi)
    heidy – (heidy)
    flag – (flag:%%)


    пятница, 17 июня 2011 г.

    Как установить libreoffice в Debian Squeeze

    Если вы не любитель собирать всё из исходников то идём сюда www.libreoffice.org и скачиваем пакеты (deb) выбрав нужную архитектуру (x86 или x64):
    $ wget http://download.documentfoundation.org/libreoffice/stable/3.4.0/deb/x86/LibO_3.4.0_Linux_x86_install-deb_en-US.tar.gz
    $ wget http://download.documentfoundation.org/libreoffice/stable/3.4.0/deb/x86/LibO_3.4.0_Linux_x86_langpack-deb_ru.tar.gz
    $ wget http://download.documentfoundation.org/libreoffice/stable/3.4.0/deb/x86/LibO_3.4.0_Linux_x86_helppack-deb_ru.tar.gz 
    Распаковываем:
    $ for F in $( ls *.tar.gz ); do tar xzf $F; done
    Затем устанавливаем libreoffice и интегрируем его в свой desktop:
    $ cd LibO_3.4.0rc2_Linux_x86_install-deb_en-US/DEBS/
    $ sudo dpkg -i *.deb
    $ cd desktop-integration/
    $ sudo dpkg -i *.deb
    
    Устанавливаем пакет поддержки русского языка и помощи:
    $ cd ../../../LibO_3.4.0rc2_Linux_x86_langpack-deb_ru/DEBS/
    $ sudo dpkg -i *.deb
    $ cd ../../LibO_3.4.0rc2_Linux_x86_helppack-deb_ru/DEBS/
    $ sudo dpkg -i *.deb
    После этого можно смело запускать libreoffice3.4 и знакомиться с его отличиями от openoffice. Первое, что впечатлило лично меня это скорость запуска. Ну, а дальше поглядим ;)

    вторник, 14 июня 2011 г.

    Заметки по Xen

    Проверить поддерживается ли аппаратная виртуализация можно так:
    $ cat /proc/cpuinfo | egrep flags.*'svm|vmx'

    Создать образ:
    # xen-create-image --hostname=xen-host0 --size=10Gb --swap=256Mb --ip=10.100.1.168 --memory=256Mb --arch=amd64 --role=udev --fs=ext4

    вторник, 7 июня 2011 г.

    Отдельный лог для sudo

    Не знаю кому как, но лично мне давно хотелось журнал того что, кто и как делает через sudo вести отдельно от системных логов. Как оказалось это достаточно просто сделать, даже никаких лишних велосипедов изобретать не надо. Просто добавляем
    Defaults env_reset,logfile=/var/log/sudo.log,!syslog,authenticate,loglinelen=160
    после всех записей в /etc/sudoers (ну или где он там у вас хранится) и всё, сразу же начинает вестись новый журнал /var/log/sudo.log.

    четверг, 28 апреля 2011 г.

    Ограничения на количество соединений в Windows XP

    Внимание! Речь не о TCP/IP соединениях, а о сервисах.
    Ограничение присутствует физически в файлах, а не в реестре:
    • Home - 5
    • Pro - 10
    Смотреть надо в сторону srv.sys и srvsvc.dll.
    Windows LanServer Connectionlimit patch
    =======================================
    Removes the allowed LanConnections:
    In WinXP Home the limit was 5 and in
    In WinXP Pro 10 connections allowed.
    Only the files with WinXP SP2
    (Compare Versioninfo of file if you're unsure
    different version might work too but if you get
    and error keep in mind)
    Copy/overwrite with your systemfiles - be careful
    the windows system file protection might restore
    the original files in background and so undo the patch ...
    Techdata
    patched:
    srvsvc.dll::SsLoadConfigurationParameters
    srv.sys::SrvNetServerSetInfo
    srvsvc.dll::SsLoadConfigurationParameters
     
    75098BF9 8BFF MOV EDI, EDI
    75098BFB 55 PUSH EBP
    75098BFC 8BEC MOV EBP, ESP
    75098BFE 51 PUSH ECX
    75098BFF E8 D40A0000 CALL LoadSizeParameter
    75098C04 85C0 TEST EAX, EAX
    75098C06 8945 FC MOV [EBP-4], EAX
    75098C09 75 1E JNZ SHORT 75098C29
    75098C0B 68 28800975 PUSH 75098028 "LanmanServer\AutotunedParameters"
    75098C10 E8 DC000000 CALL LoadParameters
    75098C15 85C0 TEST EAX, EAX
    75098C17 8945 FC MOV [EBP-4], EAX
    75098C1A 75 0D JNZ SHORT 75098C29
    75098C1C 68 64610975 PUSH 75096164 "LanmanServer\Parameters"
    75098C21 E8 CB000000 CALL LoadParameters
    75098C26 8945 FC MOV [EBP-4], EAX
    75098C29 A1 40300A75 MOV EAX, [750A3040]
    75098C2E 3905 40310A75 CMP [750A3140], EAX
    75098C34 0F83 21320000 JNB 7509BE5B
    75098C3A 833D 94310A75 0>CMP [DWORD 750A3194], 0
    75098C41 0F85 1E320000 JNZ 7509BE65
    75098C47 53 PUSH EBX
    75098C48 56 PUSH ESI
    75098C49 E9 89000000 JMP 75098CD7 <-PATCH!!!
    
    75098C4E FFFF ???
    75098C50 85C0 TEST EAX, EAX
    75098C52 0F85 86000000 JNZ 75098CDE
    75098C58 833D 1C310A75 0>CMP [DWORD 750A311C], 1
    75098C5F 6A 05 PUSH 5
    75098C61 5E POP ESI
    75098C62 6A 0A PUSH 0A
    75098C64 5B POP EBX
    75098C65 75 5E JNZ SHORT 75098CC5
    75098C67 68 00020000 PUSH 200
    75098C6C E8 5DF6FFFF CALL IsSuiteVersion
    75098C71 85C0 TEST EAX, EAX
    75098C73 0F85 FB310000 JNZ 7509BE74
    75098C79 803D 1C4E0A75 0>CMP [BYTE ExtendedLicensing], 0
    75098C80 0F85 2F320000 JNZ 7509BEB5
    75098C86 391D 18300A75 CMP [750A3018], EBX
    75098C8C 72 06 JB SHORT 75098C94
    75098C8E 891D 18300A75 MOV [750A3018], EBX
    75098C94 6A 40 PUSH 40
    75098C96 58 POP EAX
    75098C97 3905 48300A75 CMP [750A3048], EAX
    75098C9D 0F83 08320000 JNB 7509BEAB
    75098CA3 891D B4300A75 MOV [750A30B4], EBX
    75098CA9 3935 18310A75 CMP [750A3118], ESI
    75098CAF 72 06 JB SHORT 75098CB7
    75098CB1 8935 18310A75 MOV [750A3118], ESI
    75098CB7 8325 44310A75 0>AND [DWORD 750A3144], 0
    75098CBE 8325 D0300A75 0>AND [DWORD 750A30D0], 0
    75098CC5 68 00040000 PUSH 400
    75098CCA E8 FFF5FFFF CALL IsSuiteVersion
    75098CCF 85C0 TEST EAX, EAX
    75098CD1 0F85 F3310000 JNZ 7509BECA
    
    75098CD7 8B45 FC MOV EAX, [EBP-4]
    75098CDA 5E POP ESI
    75098CDB 5B POP EBX
    75098CDC C9 LEAVE
    75098CDD C3 RETN
    
    75098CDE 833D 18300A75 0>CMP [DWORD 750A3018], 0A
    75098CE5 ^ 75 F0 JNZ SHORT 75098CD7
    75098CE7 E9 13320000 JMP 7509BEFF
    75098CEC 90 NOP
    75098CED 90 NOP
    75098CEE 90 NOP
    75098CEF 90 NOP

    srv.sys::SrvNetServerSetInfo
     
    0002B4D4 E8 495DFFFF CALL SecondsToTime
    0002B4D9 A3 F0F80100 MOV [SrvLinkInfoValidTime], EAX
    0002B4DE 8915 F4F80100 MOV [1F8F4], EDX
    0002B4E4 8B83 0C010000 MOV EAX, [EBX+10C]
    0002B4EA 33D2 XOR EDX, EDX
    0002B4EC F7B3 A0000000 DIV [DWORD EBX+A0]
    0002B4F2 A3 F8F80100 MOV [SrvScavengerUpdateQosCount], EA>
    
    0002B4F7 B8 FFFF0000 MOV EAX, 0FFFF <-Patch!!!
    0002B4FC EB 5C JMP SHORT 0002B55A <-Patch!!!
    
    0002B4FE FFFF ??? ; Unknown command
    0002B500 85C0 TEST EAX, EAX
    0002B502 75 44 JNZ SHORT 0002B548
    0002B504 3805 F2F70100 CMP [SrvProductTypeServer], AL
    0002B50A 75 2A JNZ SHORT 0002B536
    0002B50C 68 00020000 PUSH 200
    0002B511 E8 7DECFFFF CALL IsSuiteVersion
    0002B516 85C0 TEST EAX, EAX
    0002B518 0F85 F8720000 JNZ 00032816
    0002B51E 893D 58F90100 MOV [SrvCachedOpenLimit], EDI
    0002B524 893D 2C0D0200 MOV [SrvMaxCachedDirectory], EDI
    0002B52A 893D 8CF80100 MOV [SrvMaxFreeRfcbs], EDI
    0002B530 893D 90F80100 MOV [SrvMaxFreeMfcbs], EDI
    0002B536 68 00040000 PUSH 400
    0002B53B E8 53ECFFFF CALL IsSuiteVersion
    0002B540 85C0 TEST EAX, EAX
    0002B542 0F85 06730000 JNZ 0003284E
    0002B548 833D B8F80100 F>CMP [DWORD SrvMaxUsers], -1
    0002B54F 73 0E JNB SHORT 0002B55F
    0002B551 393D B8F80100 CMP [SrvMaxUsers], EDI
    0002B557 76 06 JBE SHORT 0002B55F
    !002B559 FFA3 B8F80100 JMP [EBX+SrvMaxUsers]
    ^^<- Patch
    
    0002B55A A3 B8F80100 MOV [SrvMaxUsers], EAX
    0002B55F FF35 08F80100 PUSH [DWORD SrvMaxReceiveWorkItemCoun>
    0002B565 E8 74000000 CALL MultipleOfProcessors
    0002B56A A3 08F80100 MOV [SrvMaxReceiveWorkItemCount], EA>
    0002B56F FF35 04F80100 PUSH [DWORD SrvInitialReceiveWorkItem>
    0002B575 E8 64000000 CALL MultipleOfProcessors
    0002B57A A3 04F80100 MOV [SrvInitialReceiveWorkItemCount]>
    0002B57F FF35 84F80100 PUSH [DWORD SrvMinReceiveQueueLength]
    0002B585 E8 54000000 CALL MultipleOfProcessors
    0002B58A A3 84F80100 MOV [SrvMinReceiveQueueLength], EAX
    0002B58F FF35 10F80100 PUSH [DWORD SrvMaxRawModeWorkItemCoun>
    0002B595 E8 44000000 CALL MultipleOfProcessors
    0002B59A A3 10F80100 MOV [SrvMaxRawModeWorkItemCount], EA>
    0002B59F FF35 0CF80100 PUSH [DWORD SrvInitialRawModeWorkItem>
    0002B5A5 E8 34000000 CALL MultipleOfProcessors
    0002B5AA A3 0CF80100 MOV [SrvInitialRawModeWorkItemCount]>
    0002B5AF 33F6 XOR ESI, ESI
    0002B5B1 8975 D4 MOV [EBP-2C], ESI
    0002B5B4 834D FC FF OR [DWORD EBP-4], FFFFFFFF
    0002B5B8 B9 ACFA0100 MOV ECX, SrvConfigurationLock
    0002B5BD FF15 00D80100 CALL [_imp_] ; SRV2SY~1.0004C398
    0002B5C3 8BC6 MOV EAX, ESI
    0002B5C5 E8 A651FEFF CALL _SEH_epilog
    0002B5CA C2 0C00 RETN 0C
    
    unpachted....
    0002B4F2 A3 F8F80100 MOV [SrvScavengerUpdateQosCount], EA>
    0002B4F7 64:40 INC EAX ; Superfluous prefix
    0002B4F9 5E POP ESI
    0002B4FA 56 PUSH ESI ; /Arg1
    0002B4FB E8 93ECFFFF CALL IsSuiteVersion ; \IsSuiteVersion
    0002B500 85C0 TEST EAX, EAX
    0002B502 75 44 JNZ SHORT 0002B548
    0002B504 3805 F2F70100 CMP [SrvProductTypeServer], AL
    0002B50A 75 2A JNZ SHORT 0002B536
    0002B50C 68 00020000 PUSH 200 ; /Arg1 = 00000200
    0002B511 E8 7DECFFFF CALL IsSuiteVersion ; \IsSuiteVersion
    0002B516 85C0 TEST EAX, EAX
    0002B518 0F85 F8720000 JNZ 00032816
    0002B51E 893D 58F90100 MOV [SrvCachedOpenLimit], EDI
    0002B524 893D 2C0D0200 MOV [SrvMaxCachedDirectory], EDI
    0002B52A 893D 8CF80100 MOV [SrvMaxFreeRfcbs], EDI
    0002B530 893D 90F80100 MOV [SrvMaxFreeMfcbs], EDI
    0002B536 68 00040000 PUSH 400 ; /Arg1 = 00000400
    0002B53B E8 53ECFFFF CALL IsSuiteVersion ; \IsSuiteVersion
    0002B540 85C0 TEST EAX, EAX
    0002B542 0F85 06730000 JNZ 0003284E
    0002B548 833D B8F80100>CMP [DWORD SrvMaxUsers], -1
    0002B54F 73 0E JNB SHORT 0002B55F
    0002B551 393D B8F80100 CMP [SrvMaxUsers], EDI
    0002B557 76 06 JBE SHORT 0002B55F
    0002B559 FF05 B8F80100 INC [DWORD SrvMaxUsers]
    
    0002B55F FF35 08F80100 PUSH [DWORD SrvMaxReceiveWorkItemCoun>; /Arg1 = 00000000

    Ссылки:
    Копировать нужно в Safe Mode:
    • srvsvc.dll в %windir%\system32
    • srv.sys в %windir%\system32\drivers
    и ими же перезаписать кэш-длл SVC в %windir%\system32\dllcache

    По материалам talks.guns.ru
    файлы любезно предоставлены alexis.oasis (skype)

    вторник, 26 апреля 2011 г.

    SNMP MIB в Debian Squeeze

    Как-то не пришлось до этого времени пользоваться SNMP в Squeeze поэтому не сразу заметил, что борцами за лицензионную чистоту рядов была произведена очередная зачистка… На этот раз под раздачу попал SNMP.
    Не скрою, был несколько озадачен когда увидел такую картину:
    ~$ snmpwalk -v2c -c community device ifIndex
    ifIndex: Unknown Object Identifier (Sub-id not found: (top) -> ifIndex)
    А snmptranslate вывел нижеследующее, с позволения сказать, дерево:
    ~$ snmptranslate -Tp
    +--iso(1)

    Что же делать? Ларчик просто открывается!
    sudo aptitude install snmp-mibs-downloader
    Устанавливается пакет, закачиваются mib'ы. Затем:
    $ sudo sed -i "s/^\(mibs *:\).*/#\1/" /etc/snmp/snmp.conf
    И всё - всё на своих местах и привычно работает как и раньше.
    +--iso(1)
       |
       +--org(3)
          |
          +--dod(6)
             |
             +--internet(1)
                |
                +--directory(1)
                |
                +--mgmt(2)
                |  |
                |  +--mib-2(1)
                |     |
                |     +--system(1)
    … … … … … … … … … … … … … … … …
                      |     +--snmpCommunityMIBGroups(2)
                      |        |
                      |        +--snmpCommunityGroup(1)
                      |        +--snmpProxyTrapForwardGroup(3)
                      |
                      +--snmpv2tm(19)

    Квоты в Linux

    Чтобы задать квоты на подмонтрованном ресурсе необходимо сначала рассказать ОС о том, что на данном ресурсе квоты поддерживаются.
    $ sudo mount -o remount,usrquota
    Устанавливаем утилиты управления квотами
    $ sudo aptitude install quota quotatool
    После чего создайте файлы, если они ещё не созданы, в которых будут храниться лимиты:
    $ sudo touch /home/aquota.user
    $ sudo touch /home/aquota.group
    $ sudo chmod 600 /home/aquota.user /home/aquota.group
    Включаем quatacheck без перезагрузки:
    $ sudo quotacheck -vagum
    В случае если ядро поддерживает квоты но они не используются то скорее всего будет выдано сообщение об ошибке, тогда можно использовать:
    $ sudo quotacheck -fvagum
    Устанавливаем лимиты для пользователя:
    $ sudo quotatool -u someusername -bq 100M -l '200 Mb' /home
    Проверить квоты:
    $ sudo repquota /home

    пятница, 22 апреля 2011 г.

    Chromium OS - первый запуск, он трудный самый

    Ну вот и пришло время посмотреть, что-же это такое - Chromium OS.
    Безусловно, что лениво как-то запускать это всё "на живую" перегружая компьютер, который, я уже сбился со счёта, Бог знает когда последний раз испытывал на себе перезапуск. Поэтому вооружаемся VirtualBox'ом и проделываем магические пасы, на предмет конвертирования созданного образа под виртуалбокс, согласно гугловской инструкции, ± некоторая смекалка, так как инструкция нас немного вводит в заблуждение и обманывает (кто сказал, что Google безгрешен?):
    olden@og:~$ sudo aptitude install e2fsprogs qemu
    olden@og:~$ cd chromiumos/src/scripts/
    olden@og:~/chromiumos/src/scripts$ sudo ./image_to_vmware.sh --from=~/chromiumos/src/build/images/999.999.35309.183057-a1 --to=~/chromiumos/src/build/images/999.999.35309.183057-a1/ChromiumOS.vmdk
    olden@og:~/chromiumos/src/scripts$ cd ~/.VirtualBox/HardDisks/
    olden@og:~/.VirtualBox/HardDisks$ mv ~/chromiumos/chromiumos-0.4.22.8/src/build/images/999.999.35309.183057-a1/ChromiumOS.vmdk .
    
    

    Ограничение скорости на порту коммутатора Edge-Core

    Для примера возьмём ES3510 и порт 1/1.
    Vty-0#conf
    Vty-0(config)#int e 1/1
    Vty-0(config-if)#rate in sc 8M le 2
    Vty-0(config-if)#rate ou sc 8M le 2
    Vty-0(config-if)#end
    Тут мы установили клиенту скорость 16 мегабит.Доступные варианты scale:
    800K  Sets as 800K bits per second
    80K   Sets as 80K bits per second
    8K    Sets as 8K bits per second
    8M    Sets as 8M bits per second
    значения level варьируются от 1 до 127.
    Ну, а дальше простая арифметика. Например если мы хотим подать клиенту 2 мегабита то вычисляем 2048K/80K получаем level 25 при scale 80K. Хотим отдать 10 мегабит то 10240K/800K = 12.8 ≈ 13, т.е. получаем level 13 при scale 800K, в итоге 10400K (не столь критично, не столь велик разбег… Можно конечно посчитать и по другому: 10240K/80K = 128, снижаем на 80K и получаем level 127, т.е. 10160K, что тоже вполне приемлемо.

    вторник, 5 апреля 2011 г.

    Lenny: iptables - ipset (netfilter-extensions) и т.д.

    Отвык от Lenny, но вот пришлось поиметь с ним дело, поэтому родилась эта зметка:
    $ sudo apt-get install ipset
    $ sudo apt-get install netfilter-extensions-source
    $ uname -a
    Linux host.domain.tld 2.6.26-2-686 #1 SMP Fri Mar 13 18:08:45 UTC 2009 i686 GNU/Linux
    $ sudo apt-get install linux-headers-2.6.26-2-686
    $ sudo m-a build netfilter-extensions
    $ sudo m-a update && sudo m-a a-i netfilter-extensions

    четверг, 24 марта 2011 г.

    Создание резервных копий (backup)

    dump -0aj -f /tmp/home0.bak /home - создать полную резервную копию директории /home в файл /tmp/home0.bak
    dump -1aj -f /tmp/home0.bak /home - создать инкрементальную резервную копию директории /home в файл /tmp/home0.bak
    restore -if /tmp/home0.bak - восстановить из резервной копии /tmp/home0.bak
    rsync -rogpav --delete /home /tmp - синхронизировать /tmp с /home
    rsync -rogpav -e ssh --delete /home ip_address:/tmp - синхронизировать через SSH-туннель
    rsync -az -e ssh --delete ip_addr:/home/public /home/local - синхронизировать локальную директорию с удалённой директорией через ssh-туннель со сжатием
    rsync -az -e ssh --delete /home/local ip_addr:/home/public - синхронизировать удалённую директорию с локальной директорией через ssh-туннель со сжатием
    dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' - сделать "слепок" локального диска в файл на удалённом компьютере через ssh-туннель
    tar -Puf backup.tar /home/user - создать инкрементальную резервную копию директории '/home/user' в файл backup.tar с сохранением полномочий
    ( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' - копирование содержимого /tmp/local на удалённый компьютер через ssh-туннель в /home/share/
    ( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' - копирование содержимого /home на удалённый компьютер через ssh-туннель в /home/backup-home
    tar cf - . | (cd /tmp/backup ; tar xf - ) - копирование одной директории в другую с сохранением полномочий и линков
    find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents - поиск в /home/user1 всех файлов, имена которых оканчиваются на '.txt', и копирование их в другую директорию
    find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 - поиск в /var/log всех файлов, имена которых оканчиваются на '.log', и создание bzip-архива из них
    dd if=/dev/hda of=/dev/fd0 bs=512 count=1 - создать копию MBR (Master Boot Record) с /dev/hda на флоппи-диск
    dd if=/dev/fd0 of=/dev/hda bs=512 count=1 - восстановить MBR с флоппи-диска на /dev/hda

    Эти тезисы честно взял тут http://community.livejournal.com/irklug/995.html

    пятница, 11 февраля 2011 г.

    Debian Squeeze и установка php5-fpm

    Несколько извратный способ, но по-другому не удалось :(
    Берём последний снепшот:
    # cd /usr/src
    # wget http://snapshot.debian.org/archive/debian/20100801T150833Z/pool/main/p/php5/php5-fpm_5.3.3-1_i386.deb

    Далее распаковываем его, "патчим" зависимость и собираем обратно пропатченный пакет:
    # dpkg -x php5-fpm_5.3.3-1_i386.deb fpm
    # dpkg -e php5-fpm_5.3.3-1_i386.deb fpm/DEBIAN/
    # sed -i 's/php5-common (= 5.3.3-1)/php5-common (>= 5.3.3-1)/g' fpm/DEBIAN/control
    # dpkg -b fpm/ php5-fpm_5.3.3-1_i386_patched.deb

    Устанавливаем:
    # dpkg -i php5-fpm_5.3.3-1_i386_patched.deb

    Как бы не по фен-шую, но установилось.

    IPv6 и BIND

    Собственно, как оказалось, всё банально просто.
    Допустим имеем запись в DNS'е с данными по IPv4:
    $ORIGIN .
    $TTL 86400      ; 1 day
    dom.ks.ua         IN SOA  dom.ks.ua. hostmaster.dom.ks.ua. (
    2011021100 ; serial
    86400      ; refresh (1 day)
    7200       ; retry (2 hours)
    3600000    ; expire (5 weeks 6 days 16 hours)
    172800     ; minimum (2 days)
    )
    NS      ns.dom.ks.ua.
    NS      ns2.dom.ks.ua.
    A       1.2.3.4
    $ORIGIN dom.ks.ua.
    *                       A       1.2.3.4
    localhost               A       127.0.0.1
    ns                      A       1.2.3.4
    ns2                     A       5.6.7.8

    У туннель-брокера мы получили IPv6 2001:123:45:678::2/64, тогда перепишем наши данные следующим образом:
    $ORIGIN .
    $TTL 86400 ; 1 day
    dataforum.ks.ua  IN SOA dataforum.ks.ua. oldengremlin.gmail.com. (
    2011021101 ; serial
    86400      ; refresh (1 day)
    7200       ; retry (2 hours)
    3600000    ; expire (5 weeks 6 days 16 hours)
    172800     ; minimum (2 days)
    )
    NS ns.dataforum.ks.ua.
    NS ns2.dataforum.ks.ua.
    A 1.2.3.4
    AAAA 2001:123:45:678::2
    $ORIGIN dataforum.ks.ua.
    *   A 1.2.3.4
    AAAA 2001:123:45:678::2
    localhost  A 127.0.0.1
    AAAA ::1
    ns   A 1.2.3.4
    AAAA 2001:123:45:678::2
    ns2   A 5.6.7.8
    AAAA 2001:321:54:876::2
    Вуа-ля :) На этом чудо-шаманство можно считать оконченным.

    четверг, 10 февраля 2011 г.

    IPv6 - настало время

    Собственно поднять туннель для IPv6 проще чем ожидалось.
    Идём на http://tunnelbroker.net, регистрируемся, заказываем себе сеть /64.
    Далее редактируем /etc/network/interfaces:
    auto he-ipv6
    iface he-ipv6 inet6 v4tunnel
    address MY_IPv6
    netmask 64
    endpoint TUN_IPv4
    local MY_IPv4
    gateway GW_IPv6
    ttl 64
    post-up sysctl -p

    Редактируем /etc/sysctl.conf:
    net.ipv6.conf.default.disable_ipv6 = 0
    # простой способ сказать, что на интерфейсе мы не будем использовать IPv6 ;)
    net.ipv6.conf.eth0.disable_ipv6 = 1
    
    net.ipv6.conf.default.autoconf = 0
    net.ipv6.conf.default.accept_ra = 0
    net.ipv6.conf.default.accept_ra_defrtr = 0
    net.ipv6.conf.default.accept_ra_pinfo = 0
    net.ipv6.conf.default.accept_source_route = 0
    net.ipv6.conf.default.accept_redirects = 0
    net.ipv6.conf.default.forwarding = 0
    
    net.ipv6.conf.all.autoconf = 0
    net.ipv6.conf.all.accept_ra = 0
    net.ipv6.conf.all.accept_ra_defrtr = 0
    net.ipv6.conf.all.accept_ra_pinfo = 0
    net.ipv6.conf.all.accept_source_route = 0
    net.ipv6.conf.all.accept_redirects = 0
    net.ipv6.conf.all.forwarding = 0
    Ну и далее:
    $ sudo ifup he-ipv6

    Всё, туннель поднят, можно пробовать пустить ping6 на свой шлюз.
    Остаётся отстроить DNS, но об этом в расскажу в ближайшее время.