<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7655759202038285360</id><updated>2011-11-30T04:08:50.490-08:00</updated><category term='linux'/><category term='boot'/><category term='iptabels'/><category term='checkinstall'/><category term='domolink'/><category term='voip'/><category term='openssl'/><category term='ssh'/><category term='rename'/><category term='route'/><category term='bash'/><category term='deb'/><category term='batch'/><category term='gnome'/><category term='ip'/><category term='nat'/><category term='asterisk'/><category term='ppa'/><category term='dns'/><category term='adsl'/><category term='netmap'/><category term='debian'/><category term='script'/><category term='openvpn'/><category term='ubuntu'/><category term='c++'/><category term='opera'/><category term='bind'/><title type='text'>Мой Мир. Мой Unix.</title><subtitle type='html'>Living in Denial</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-7096664057607776499</id><published>2011-10-12T01:56:00.000-07:00</published><updated>2011-10-12T01:56:03.589-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><category scheme='http://www.blogger.com/atom/ns#' term='asterisk'/><title type='text'>Asterisk запись звонков / call recording</title><content type='html'>Заметка на 99% основана на&amp;nbsp;&lt;a href="http://nixadm.ru/archives/605"&gt;http://nixadm.ru/archives/605&lt;/a&gt;&amp;nbsp;, но с некоторыми корректировками.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Все изменения вносятся в extentions.ael (про AEL написано тут&amp;nbsp;&lt;a href="http://habrahabr.ru/blogs/voip/122974/"&gt;http://habrahabr.ru/blogs/voip/122974/&lt;/a&gt;&amp;nbsp;).&lt;br /&gt;Разница в том, что я оформил в виде отдельного макроса, который можно подставлять в любые контексты и довел до рабочего состояния.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;macro record( EXT , UNQ ) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ("${RECORDING}" = "1") {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Set(monopt=/bin/nice -n 19 /usr/local/bin/lame -b 16 --silent "${WAV}/${UNQ}.wav" "${MP3}/${UNQ}.mp3" &amp;amp;&amp;amp; rm -f "${WAV}/${UNQ}.wav");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MixMonitor(${WAV}/${UNQ}.wav,b,${monopt});&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return;&lt;br /&gt;};&lt;/blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;globals {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WAV=/var/log/asterisk/wav;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RECORDING=1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MP3=/var/www/valinor.fabit.ru/asterisk;&lt;br /&gt;};&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;context ael-sip {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s =&amp;gt; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Wait(1);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Answer();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Set(TIMEOUT(digit)=5);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Set(TIMEOUT(response)=10);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;record(${EXTEN},${UNIQUEID});&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dial(SIP/ael-user2);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Hangup();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; };&lt;br /&gt;};&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Обязательно проверяем права в ${MP3} на запись у пользователя, от котого запущен asterisk (обычно asterisk).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;В макросе переменная ${UNQ} планировалась для добавления ее в имя итогового файла для большей наглядности, так можете и поступить, добавив другие переменные.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Про удобную вебморду для прослушивания записей написано тут&amp;nbsp;&lt;a href="http://nixadm.ru/archives/659"&gt;http://nixadm.ru/archives/659&lt;/a&gt;&amp;nbsp;.&lt;/div&gt;&lt;div&gt;Хотя, на мой взгляд, можно было бы не изобретать такую морду с базой, а обойтись наглядными именами файлов и флешевым плеером, но для информативности самое то.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-7096664057607776499?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/7096664057607776499/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2011/10/asterisk-call-recording.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/7096664057607776499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/7096664057607776499'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2011/10/asterisk-call-recording.html' title='Asterisk запись звонков / call recording'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-6663455689956444116</id><published>2011-08-30T00:29:00.000-07:00</published><updated>2011-08-30T00:35:47.935-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openssl'/><category scheme='http://www.blogger.com/atom/ns#' term='openvpn'/><title type='text'>OpenVPN: Отзыв и восстановление отозванных сертификатов</title><content type='html'>&lt;span class="Apple-style-span" style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;h2 style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; border-bottom-color: rgb(170, 170, 170); border-bottom-style: solid; border-bottom-width: 1px; color: black; font-size: 19px; margin-bottom: 0.6em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.17em; padding-top: 0.5em;"&gt;&lt;span class="mw-headline"&gt;Отзыв сертификата&lt;/span&gt;&lt;/h2&gt;&lt;div style="line-height: 1.5em; margin-bottom: 0.5em; margin-top: 0.4em;"&gt;Находясь в директории с easy-rsa, в которой происходит генерация сертификатов, устанавливаем переменные серды и выполняем скрипт revoke-fullSD/Unix:&lt;/div&gt;&lt;pre style="background-color: #f9f9f9; border-bottom-color: rgb(47, 111, 171); border-bottom-style: dashed; border-bottom-width: 1px; border-left-color: rgb(47, 111, 171); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(47, 111, 171); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(47, 111, 171); border-top-style: dashed; border-top-width: 1px; color: black; line-height: 1.1em; padding-bottom: 1em; padding-left: 1em; padding-right: 1em; padding-top: 1em;"&gt;./vars&lt;br /&gt;./revoke-full hmmboy&lt;br /&gt;&lt;/pre&gt;&lt;div style="line-height: 1.5em; margin-bottom: 0.5em; margin-top: 0.4em;"&gt;hmmboy - имя сертификата. Имя можно посмотерть либо по названию сертификата, либо в файле keys/index.txt.&lt;/div&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=7655759202038285360&amp;amp;postID=6663455689956444116&amp;amp;from=pencil" id=".D0.92.D0.BE.D1.81.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BE.D1.82.D0.BE.D0.B7.D0.B2.D0.B0.D0.BD.D0.BD.D0.BE.D0.B3.D0.BE_.D1.81.D0.B5.D1.80.D1.82.D0.B8.D1.84.D0.B8.D0.BA.D0.B0.D1.82.D0.B0" name=".D0.92.D0.BE.D1.81.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BE.D1.82.D0.BE.D0.B7.D0.B2.D0.B0.D0.BD.D0.BD.D0.BE.D0.B3.D0.BE_.D1.81.D0.B5.D1.80.D1.82.D0.B8.D1.84.D0.B8.D0.BA.D0.B0.D1.82.D0.B0" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #002bb8; text-decoration: none;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2 style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; border-bottom-color: rgb(170, 170, 170); border-bottom-style: solid; border-bottom-width: 1px; color: black; font-size: 19px; margin-bottom: 0.6em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.17em; padding-top: 0.5em;"&gt;&lt;span class="mw-headline"&gt;Восстановление отозванного сертификата&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span class="mw-headline"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="line-height: 1.5em; margin-bottom: 0.5em; margin-top: 0.4em;"&gt;OpenSSL хранит статус каждого сертификата в ${CATOP}/index.txt, для OpenVPN это easy-rsa/keys/index.txt. На основе этого файла генерируется CRL (certificate revocation list).&lt;/div&gt;&lt;div style="line-height: 1.5em; margin-bottom: 0.5em; margin-top: 0.4em;"&gt;Так выгялядят рабочий и отозванный сертификаты:&lt;/div&gt;&lt;pre style="background-color: #f9f9f9; border-bottom-color: rgb(47, 111, 171); border-bottom-style: dashed; border-bottom-width: 1px; border-left-color: rgb(47, 111, 171); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(47, 111, 171); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(47, 111, 171); border-top-style: dashed; border-top-width: 1px; color: black; line-height: 1.1em; padding-bottom: 1em; padding-left: 1em; padding-right: 1em; padding-top: 1em;"&gt;V       201120070444Z           22      unknown /C=RU/ST=Ru/L=Belgorod/O=FIT/CN=goodboy/emailAddress=admin@fabit.ru&lt;br /&gt;R       201217190136Z   110830061053Z   23      unknown /C=RU/ST=Ru/L=Belgorod/O=FIT/CN=hmmboy/emailAddress=admin@fabit.ru&lt;br /&gt;&lt;/pre&gt;&lt;div style="line-height: 1.5em; margin-bottom: 0.5em; margin-top: 0.4em;"&gt;Для восстановления отозванного сертификата нужно отредактировать это файл. Заменить в строке соответствующей отозванному сетификату R на V и удалить третий столбец (это дата отзыва). Колонки разеделены табуляций, если нарушить это разделение, то можно похерить CA. Поэтому никаких пробелов и MS Word'ов.&lt;/div&gt;&lt;div style="line-height: 1.5em; margin-bottom: 0.5em; margin-top: 0.4em;"&gt;После сохранения изменений нужно перегенерировать CRL. Возможно есть более гуманные способы, но приведенный ниже занял меньше всего времени по его поиску и возможности повторого использования. Скрипт revoke-full перегененрирует CRL, скопируем его в crl-regen и закомментируем строки ответственные за отзыв сертификата.&lt;/div&gt;&lt;pre style="background-color: #f9f9f9; border-bottom-color: rgb(47, 111, 171); border-bottom-style: dashed; border-bottom-width: 1px; border-left-color: rgb(47, 111, 171); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(47, 111, 171); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(47, 111, 171); border-top-style: dashed; border-top-width: 1px; color: black; line-height: 1.1em; padding-bottom: 1em; padding-left: 1em; padding-right: 1em; padding-top: 1em;"&gt;#!/bin/bash&lt;br /&gt;CRL="crl.pem"&lt;br /&gt;RT="revoke-test.pem"&lt;br /&gt;&lt;br /&gt;#if [ $# -ne 1 ]; then&lt;br /&gt;#    echo "usage: revoke-full &amp;lt;cert-name-base&amp;gt;";&lt;br /&gt;#    exit 1&lt;br /&gt;#fi&lt;br /&gt;&lt;br /&gt;if [ "$KEY_DIR" ]; then&lt;br /&gt;    cd "$KEY_DIR"&lt;br /&gt;    rm -f "$RT" &lt;br /&gt;&lt;br /&gt;    # set defaults&lt;br /&gt;    export KEY_CN=""&lt;br /&gt;    export KEY_OU=""&lt;br /&gt;    export KEY_NAME=""&lt;br /&gt;  &lt;br /&gt;#    # revoke key and generate a new CRL&lt;br /&gt;#    $OPENSSL ca -revoke "$1.crt" -config "$KEY_CONFIG" &lt;br /&gt; &lt;br /&gt;    # generate a new CRL -- try to be compatible with&lt;br /&gt;    # intermediate PKIs&lt;br /&gt;    $OPENSSL ca -gencrl -out "$CRL" -config "$KEY_CONFIG"&lt;br /&gt;    if [ -e export-ca.crt ]; then&lt;br /&gt;        cat export-ca.crt "$CRL" &amp;gt;"$RT"&lt;br /&gt;    else&lt;br /&gt;        cat ca.crt "$CRL" &amp;gt;"$RT"&lt;br /&gt;    fi&lt;br /&gt;    &lt;br /&gt;#    # verify the revocation&lt;br /&gt;#    $OPENSSL verify -CAfile "$RT" -crl_check "$1.crt"&lt;br /&gt;else&lt;br /&gt;    echo 'Please source the vars script first (i.e. "source ./vars")'&lt;br /&gt;    echo 'Make sure you have edited it to reflect your configuration.'&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;&lt;div style="line-height: 1.5em; margin-bottom: 0.5em; margin-top: 0.4em;"&gt;Далее через скрипт list-crl можно поглядеть на отсутствие сертификата в списке отозванных. Так же помним о необходимости установить переменные среды через vars.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-6663455689956444116?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/6663455689956444116/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2011/08/openvpn.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/6663455689956444116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/6663455689956444116'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2011/08/openvpn.html' title='OpenVPN: Отзыв и восстановление отозванных сертификатов'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-6705824843284017829</id><published>2011-08-14T09:04:00.000-07:00</published><updated>2011-08-25T04:43:05.518-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='batch'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='rename'/><title type='text'>Bash. Batch</title><content type='html'>Search, match &amp;amp; rename:&lt;br /&gt;&lt;br /&gt;for i in *;&lt;br /&gt;do&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if echo $i | grep -q&amp;nbsp;aniDuB&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; then&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mv $i `echo $i | sed 's/aniDuB/AniDub/g'`&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fi&lt;br /&gt;done&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Find content in files &amp;amp; replace&lt;br /&gt;&lt;br /&gt;find . -name "*.conf" -print | xargs sed -i 's/listen\(.*\)91.194.207.148:80/listen\180/g'&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-6705824843284017829?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/6705824843284017829/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2011/08/bash-batch-rename.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/6705824843284017829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/6705824843284017829'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2011/08/bash-batch-rename.html' title='Bash. Batch'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-4101040325670598288</id><published>2011-04-11T03:52:00.000-07:00</published><updated>2011-04-13T00:56:46.999-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='netmap'/><category scheme='http://www.blogger.com/atom/ns#' term='nat'/><category scheme='http://www.blogger.com/atom/ns#' term='iptabels'/><category scheme='http://www.blogger.com/atom/ns#' term='ip'/><category scheme='http://www.blogger.com/atom/ns#' term='route'/><title type='text'>Linux-шлюз. Объединение двух сетей с одинаковым адресами подсетей.</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://t2.gstatic.com/images?q=tbn:ANd9GcTqUshNqlTtLjH6dH2tHASNKUpPEymiUIabZvRYbQyVndTnHFHcRA" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="143" src="http://t2.gstatic.com/images?q=tbn:ANd9GcTqUshNqlTtLjH6dH2tHASNKUpPEymiUIabZvRYbQyVndTnHFHcRA" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;Статья расчитана на людей, имеющих смутное представление о хождении трафика внутри ядра Linux. Мастера Дзен, постигшие природу netfilter,&amp;nbsp; не найдут такие учения достойными их внимания, так как текст содержит много пояснительной информации. Это не готовое решение, но задает вектор для поиска правильного пути в преодолении подобной проблемы.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Статью причесал, исправил некоторые ошибки и разместил на Хабре, окончательная версия &lt;a href="http://habrahabr.ru/blogs/sysadm/117320/"&gt;там&lt;/a&gt;&lt;i&gt;. &lt;/i&gt;Там же в комментариях обсуждение с актуальными вопросами.&lt;br /&gt;&lt;br /&gt;При создании локальной сети не каждый администратор подходит с ответственностью к выбору диапазона адресов. А может и не каждый догадывается о наличии частных диапазонов кроме 192.168.0.0/24. И со временем такая бомба замедленного действия может дать о себе знать. Локальные сети объединяются, возникает потребность в коммуникации между хостами разных сетей. И тут выясняется, что адреса подсетей совпадают. И менять их по каким либо причинам проблематично или невозможно.&lt;br /&gt;В таком случае, серверу, маршрутизирующему пакеты между сетями, остается сделать вид, что подсети различны и выдавать желаемое за действительное. В богатом арсенале Linux есть средства для таких манипуляций: iptables с NETMAP и утилита ip.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1. Цель.&lt;/b&gt;&lt;br /&gt;Из сети LAN1 мы хотим послать пакет в сеть LAN2. Но мы не можем послать его в подсеть, адрес которой одинаков с нашим. В самом частом случае 192.168.0.0/24. Если такой пакет появится в LAN1, он не будет знать, что есть LAN2, он будет искать такую машину в LAN1. Таковы правила маршрутизации по умолчанию.&lt;br /&gt;Значит, надо посылать пакеты с другими адресами, которые уйдут в роутер.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Как это должно вглядеть для внешнего наблюдателя из LAN1.&lt;/i&gt;&lt;br /&gt;Например, пользователь сети LAN1 будет видеть сеть LAN2 как 10.8.1.0/24. Тут уже никакого пересечения адресов. LAN1 доволен.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Как это выглядит с обеих сторон.&lt;/i&gt;&lt;br /&gt;Из LAN1 приходит пакет с адресом отправителя 192.168.0.100 и адресом назначения 10.8.1.200. Из роутера с интерфейса LAN2 выходит тот же пакет с адресом отправителя 10.8.1.100 и с адресом назначения 192.168.0.200. Пакет проходит до адреса назначения и тот шлет в ответ на адрес отправителя со своим адресом. Пакет уходит в роутер. В нем происходит обратное преобразование и пользователь LAN1 получает ответ с того адреса, на который отправил пакет.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-DZP6h_UAevQ/TaMfQvKSNUI/AAAAAAAAABs/B2thp7_odms/s1600/netmapping.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/-DZP6h_UAevQ/TaMfQvKSNUI/AAAAAAAAABs/B2thp7_odms/s640/netmapping.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;2. Теория. Путь пакета в ядре роутера: netfilter.&lt;/b&gt;&lt;br /&gt;Здесь я попытаюсь рассказать о путешествии транзитного трафика через наш Linux-роутер. Для полного понимания процесса путешествия пакета лучше видеть схему его прохождения по цепочкам netfilter.&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-eb7YYxl_ZEI/TZuC-pGQcXI/AAAAAAAAABE/aByzY72wKsM/s1600/Netfilter-diagram-rus.png" style="margin-left: auto; margin-right: auto;" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/ru/a/ad/Netfilter-diagram-rus.png"&gt;Pic 1: wikipedia.org&lt;/a&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Наш пакет с [источником|назначением] [192.168.0.100|10.8.1.200] попадает на сетевой интерфейс роутера и первой его цепочкой будет &lt;i&gt;PREROUTING&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;PREROUTING&lt;/i&gt;&lt;br /&gt;Проходя по цепочке он попадает в таблицу &lt;i&gt;PREROUTING&lt;/i&gt; mangle. В которой посредством iptables мы определяем интерфейс, с которого он пришел, и адрес источника. Если это наш пациент, мы его помечаем действием MARK (для каждой манипуляции с пакетом есть своя таблица и цепочка).&lt;br /&gt;После чего пакет [192.168.0.100|10.8.1.200|(marked)] попадает в таблицу nat. Эта таблица предназначена для трансляции адресов. Поскольку не существует реального адреса 10.8.1.200, то на последующем этапе маршрутизации пакет будет отброшен или уйдет в неизвестном направлении. Поэтому заменяем ему адрес назначения на тот, на который он действительно должен пойти именно тут: [192.168.0.100|192.168.0.200|(marked)]. Делается это действием NETMAP, которое заменяет подсеть по маске.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;ROUTING&lt;/i&gt;&lt;br /&gt;Наш пакет пакет попадает на этап принятия решения, куда он должен идти дальше. Он промаркирован, поэтому можем отправить его в специальную таблицу маршрутизации, которую мы создали для такого торжественного случая. Там принимается решение, что пакет не предназначен для локального компьютера и должен идти в LAN2.&lt;br /&gt;&lt;br /&gt;Пакет успешно проходит цепочку FORWARDING. Попадает опять на этап маршрутизации. Если в FORWARDING с ним ничего не случилось, а по идее не должно было. Он идет тем же путем. После чего попадает в POSTROUTING.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;POSTROUTING&lt;/i&gt;&lt;br /&gt;Без изменений доходя до таблицы nat. Мы должны изменить адрес источника. Ведь ответ на пакет [192.168.0.100|192.168.0.200] будет отправлен в локальную сеть, а не в роутер. Чтоб он попал обратно в роутер, меняем адрес источника на несуществующий [10.8.1.100|192.168.0.200]. Опять же NETMAP. После этого пакет выходит в LAN2.&lt;br /&gt;С ответным пакетом проделываем обратную процедуру, чтоб он дошел до первоначального источника. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Реализация.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;iptables -t mangle -A PREROUTING -i tun0 -d 10.8.1.0/24 -j MARK --set-mark 8&lt;/blockquote&gt;&lt;br /&gt;Метим входящие пакеты на нашу несуществующую подсеть для дальнейшего их опознавания в netfilter. Можно обойтись и без меток, использовать в качестве критериев адрес источник, входной интерфейс и адрес назначения, но в случае сложной маршрутизации с отдельными таблицами маршрутизации решить куда отправить пакет будет проще всего по метке.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;iptables -t nat -A PREROUTING -m mark --mark 8 -j NETMAP --to 192.168.0.0/24&lt;/blockquote&gt;Узнаем пакет по метке и действием NETMAP в таблице PREROUTING подменяет адрес назначения.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;iptables -t nat -A POSTROUTING -m mark --mark 8&amp;nbsp; -j NETMAP --to 10.8.2.0/24&lt;/blockquote&gt;В POSTROUTING NETMAP подменяет адрес источника.&lt;br /&gt;После этого все обращения на подсеть 10.8.1.0/24 будут выглядеть внутри LAN2, как обращения из подсети 10.8.2.0/24.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;ROUTING &lt;/i&gt;&lt;br /&gt;Чтобы маршрутизировать пакеты по метке необходимо создать свою таблицу маршрутизации.Редактируем /etc/iproute2/rt_tables, добавляя уникальное число и название новой таблицы.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;256 netmap&lt;/blockquote&gt;&lt;br /&gt;Далее надо добавить правило, по которому в эту таблицу будут направляться пакеты на маршрутизацию.&lt;br /&gt;&lt;blockquote&gt;ip ru add fwmark 0x8 lookup netmap&lt;/blockquote&gt;Теперь помеченные пакеты будут уходить на маршрутизацию в таблицу netmap.&lt;br /&gt;&lt;br /&gt;И последним шагом нужно определить маршруты в таблице netmap.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;ip route add default dev eth1 table netmap&lt;/blockquote&gt;Или можно указать в отдельном случае отдельный шлюз, если в эту сеть трафик от роутера идет через него. Что-то в духе:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;ip route via 192.168.1.254 dev eth1 table netmap&lt;/blockquote&gt;Пока рано радоваться, к нам придет ответ из LAN2 [192.168.0.100|10.8.2.200].&lt;b&gt; &lt;/b&gt;&lt;br /&gt;Надо сделать все тоже самое, но только преобразовать обратно, увы, netfilter сам этого не делает. Все действия уже описаны, приведу только последовательность команд для преобразования адресов в одну и в обратную сторону. (В первой таблице маршрутизации необходимости в данном случае нет, но при иных обстоятельствах может понадобиться.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;ip rule add fwmark 8 lookup netmap&lt;br /&gt;ip route add 192.168.0.0/24 dev eth1 table netmap&lt;br /&gt;&lt;br /&gt;iptables -t mangle -A PREROUTING -i tun0 -d 10.8.1.0/24 -j MARK --set-mark 8&lt;br /&gt;iptables -t nat -A PREROUTING -m mark --mark 8 -j NETMAP --to 192.168.0.0/24&lt;br /&gt;iptables -t nat -A POSTROUTING -m mark --mark 8 -j NETMAP --to 10.8.2.0/24&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;ip rule add fwmark 9 lookup netmap2&lt;br /&gt;ip route add 192.168.0.0/24 dev tun0 table netmap2&lt;br /&gt;&lt;br /&gt;iptables -t mangle -A PREROUTING -i eth1 -d 10.8.2.0/24 -j MARK --set-mark 9&lt;br /&gt;iptables -t nat -A PREROUTING -m mark --mark 9 -j NETMAP --to 192.168.0.0/24&lt;br /&gt;iptables -t nat -A POSTROUTING -m mark --mark 9 -j NETMAP --to 10.8.1.0/24&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Результаты.&lt;/b&gt;&lt;br /&gt;Вот что пишет tcpdump (первый пример с vnc, второй с пингом):&lt;br /&gt;&lt;blockquote&gt;# tcpdump -i any port 5900 &lt;/blockquote&gt;&lt;blockquote&gt;12:46:46.358969 IP 192.168.0.100.41930 &amp;gt; 10.8.1.200.5900: Flags [P.], seq 647:657, ack 261127, win 1213, options [nop,nop,TS val 460624 ecr 171318], length 10&lt;/blockquote&gt;&lt;blockquote&gt;12:46:46.358978 IP 10.8.2.100.41930 &amp;gt; 192.168.0.200.5900: Flags [P.], seq 647:657, ack 261127, win 1213, options [nop,nop,TS val 460624 ecr 171318], length 10&lt;/blockquote&gt;&lt;blockquote&gt;12:46:46.505847 IP 192.168.0.200.5900 &amp;gt; 10.8.2.100.41930: Flags [.], ack 657, win 64879, options [nop,nop,TS val 171320 ecr 460624], length 0&lt;/blockquote&gt;&lt;blockquote&gt;12:46:46.505861 IP 10.8.1.200.5900 &amp;gt; 192.168.0.100.41930: Flags [.], ack 657, win 64879, options [nop,nop,TS val 171320 ecr 460624], length 0&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;# tcpdump -i any icmp &lt;/blockquote&gt;&lt;blockquote&gt;12:47:46.363905 IP 192.168.0.100 &amp;gt; 10.8.1.200: ICMP echo request, id 2111, seq 1, length 64&lt;/blockquote&gt;&lt;blockquote&gt;12:47:46.363922 IP 10.8.2.100 &amp;gt; 192.168.0.200: ICMP echo request, id 2111, seq 1, length 64&lt;/blockquote&gt;&lt;blockquote&gt;12:47:46.364049 IP 192.168.0.200 &amp;gt; 10.8.2.100: ICMP echo reply, id 2111, seq 1, length 64&lt;/blockquote&gt;&lt;blockquote&gt;12:47:46.364054 IP 10.8.1.200 &amp;gt; 192.168.0.100: ICMP echo reply, id 2111, seq 1, length 64&lt;/blockquote&gt;&lt;br /&gt;Tcpdump отлично демонстрирует, как происходит преобразование адресов на входе в один интерфейс и на выходе в другой и в обратную сторону. &lt;br /&gt;&lt;br /&gt;Так же отлично работают остальные сервисы, типа Samba и ее аналог на Windows.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note.&lt;/b&gt;&lt;br /&gt;Если соединение между сетями организовано посредством туннеля OpenVPN, то для правильной маршрутизации со стороны клиента в конфиг сервера необходимо добавить дополнительный маршрут через туннель.&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;push "route 10.8.1.0 255.255.255.0"&lt;/blockquote&gt;&lt;b&gt;Warning!&lt;/b&gt;&lt;br /&gt;При отладке конфигурации не пытайтесь законнектиться к серверу,&lt;b&gt;&amp;nbsp;&lt;/b&gt; на котором шлюз. Соединяйтесь с машинами за ним в LAN2.&lt;br /&gt;И вот почему. Правила расчитаны, что пакет будет проходить через шлюз, i. e.&lt;br /&gt;PREROUTING -&amp;gt; Маршрутизация -&amp;gt; FORWARD -&amp;gt; Маршрутизация -&amp;gt; POSTROUTING&lt;br /&gt;Если пакеты будут адресованы 10.8.1.1 (серверу), то они в результате маршрутизации пойдут в цепочку INPUT и преобразование адреса назначения в POSTROUTING не будет выполнено.&lt;br /&gt;PREROUTING -&amp;gt; Маршрутизация -&amp;gt; INPUT -&amp;gt; Приложение &lt;br /&gt;Соответственно, адрес источника не будет измненен и ответ будет послан не на 10.8.2.xy, а на 192.168.0.xy на маршрут по умолчанию для этого диапазона, т. е. в LAN2, а не в LAN1.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Заключение&lt;/b&gt;.&lt;br /&gt;Рекомендую всем, занимающимся настройкой маршрутизации и фильтрации трафика в Linux, и особенно тем, кто этого еще не сделал, обратиться к документам Linux Advanced Routing &amp;amp; Traffic Control и Iptables tutorial. Любые другие статьи, советы, etc не дадут полного представления о сабже. Документы объемные и за один присест врядли получится их полностью понять, но они того стоят и в будущем могут служить хорошим справочником по командам и опциям iptables и iproute2. На просторах OpenNet'а есть их русскоязычные&amp;nbsp; переводы, хоть и немного устаревшие. У оригиналов более свежие версии и соответственно описано больше опций, который отсутствовали на момент перевода.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;P. S.&lt;/b&gt;&lt;br /&gt;В процессе написания этого мануала нашел пару подобных статей, в которых описывается похожая ситуация. &lt;br /&gt;&lt;i&gt;Первая&lt;/i&gt; &lt;a href="http://sudouser.com/nastrojka-nat-po-principu-set-v-set-pri-pomoshhi-iptables-netmap.html"&gt;http://sudouser.com/nastrojka-nat-po-principu-set-v-set-pri-pomoshhi-iptables-netmap.html&lt;/a&gt; (Долго плевался, читая это.)&lt;br /&gt;&lt;i&gt;Вторая&lt;/i&gt; (англ.) &lt;a href="http://nimlabs.org/%7Enim/dirtynat.html"&gt;http://nimlabs.org/~nim/dirtynat.html&lt;/a&gt;&lt;br /&gt;Ситуация идентичная моей, с той лишь разницей, что у меня openvpn туннелирует ip трафик L3, в статье же ethernet L2. Немного другие адреса без отдельной маршрутизации по меткам. И применяется arp-proxy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-4101040325670598288?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/4101040325670598288/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2011/04/linux.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/4101040325670598288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/4101040325670598288'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2011/04/linux.html' title='Linux-шлюз. Объединение двух сетей с одинаковым адресами подсетей.'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-DZP6h_UAevQ/TaMfQvKSNUI/AAAAAAAAABs/B2thp7_odms/s72-c/netmapping.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-3643507410208506952</id><published>2011-04-01T14:57:00.000-07:00</published><updated>2011-04-01T14:59:18.452-07:00</updated><title type='text'>DHCPD: раздача адресов на 2 подсети. (ISC-DHCPD)</title><content type='html'>Когда подсетей более чем 1, а сервер раздающий адреса - один на всех, то корректная раздача адресов одним демоном dhcpd может вызвать вопросы, которые я попытаюсь разобрать.&lt;br /&gt;&lt;br /&gt;1. Как на два интерфейса раздавать одним демоном адреса разных подсетей?&lt;br /&gt;&lt;br /&gt;2. Как на одном интерфейсе при нехватке одной подсети выдавать адреса из 2 подсетей?&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1. Некоторые господа предлагают два экземпляра демона на два интерфейса с уникальными конфигами. Такой функциональный подход вызвает снисходительную улыбку.&lt;br /&gt;&lt;br /&gt;Отвечу сразу, чтоб не томить. Достаточно одного экзмепляра с одним конфигом. Демон знает конфигурацию каждой сетевой карты и будет присваивать адреса из правильного диапазона.&lt;br /&gt;&lt;br /&gt;То есть, если подсеть 192.168.1.0, то будет задействован только интерфейс с адресом 192.168.1.x, если второй интерфейс 192.168.2.x, то и диапазон разадачи будет 192.168.2.0. Главное - указать это в конфиге.&lt;br /&gt;&lt;br /&gt;Пример конфига:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #461b7e;"&gt;&lt;br /&gt;ddns-update-style ad-hoc&lt;br /&gt;&lt;br /&gt;subnet 192.168.2.0 netmask 255.255.255.0 {&lt;br /&gt;range 192.168.2.XX 192.168.2.XX;&lt;br /&gt;default-lease-time 7200;&lt;br /&gt;max-lease-time 21600;&lt;br /&gt;option routers 192.168.2.XX;&lt;br /&gt;option ip-forwarding off;&lt;br /&gt;option broadcast-address 192.168.2.255;&lt;br /&gt;option subnet-mask 255.255.255.0;&lt;br /&gt;option domain-name-servers XX.XX.XX.XX, XX.XX.XX.XX;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;subnet 192.168.1.0 netmask 255.255.255.0 {&lt;br /&gt;range 192.168.1.XX 192.168.1.XX;&lt;br /&gt;min-secs 3;&lt;br /&gt;default-lease-time 7200;&lt;br /&gt;max-lease-time 21600;&lt;br /&gt;option routers 192.168.1.XX;&lt;br /&gt;option ip-forwarding off;&lt;br /&gt;option broadcast-address 192.168.1.255;&lt;br /&gt;option subnet-mask 255.255.255.0;&lt;br /&gt;option domain-name-servers XX.XX.XX.XX, XX.XX.XX.XX;&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;2. Цитата по мотивам &lt;a href="http://www.opennet.ru/openforum/vsluhforumID1/91269.html"&gt;OpenNet'а&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Иногда случается, что в одном физическом сегменте сосуществуют несколько IP подсетей. Например в организации существует требование использовать 8-битные маски подсетей, но сеть разрослась до размеров превышающих 254 хоста, в этом случае необходимо использовать две подсети с 8-битными масками до тех пор пока новый ethernet сегмент не будет добавлен. В этом случае секции subnet описывающие две эти подсети могут быть заключены в секцию shared-network.&lt;br /&gt;&lt;br /&gt;Для решения проблемы надо заключить обе подсети в &lt;b&gt;shared-network&lt;/b&gt;, при этом &lt;b&gt;interface eth1;&lt;/b&gt; необходимо объявить &lt;b&gt;только в одной&lt;/b&gt; подсети группы.&lt;br /&gt;Примерно так:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color: #461b7e;"&gt;shared-network subnet10-1-1 {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;subnet 10.1.1.0 netmask 255.255.255.0 {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;interface eth1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;option routers 10.1.1.1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;option subnet-mask 255.255.255.0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;range 10.1.1.2 10.1.1.254;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allow unknown-clients;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;subnet 10.1.2.0 netmask 255.255.255.0 {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;option routers 10.1.2.1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;option subnet-mask 255.255.255.0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;range 10.1.2.2 10.1.2.254;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allow unknown-clients;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;span style="color: #461b7e;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Не редки более сложные случаи, но для них требуется более сложная магия с другими хитростями и инструментами.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-3643507410208506952?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/3643507410208506952/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2011/04/dhcpd-2-isc-dhcpd.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/3643507410208506952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/3643507410208506952'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2011/04/dhcpd-2-isc-dhcpd.html' title='DHCPD: раздача адресов на 2 подсети. (ISC-DHCPD)'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-7566681042224181511</id><published>2011-03-24T16:37:00.000-07:00</published><updated>2011-04-01T08:06:15.995-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='ppa'/><title type='text'>Debian + PPA (Firefox 4 в Debian)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://ubuntusatanic.org/wallpapers/_thb_SE-3D-4.jpg" imageanchor="1" style="clear:left; float:right;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="150" width="200" src="http://ubuntusatanic.org/wallpapers/_thb_SE-3D-4.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;[Зависть] Вот ведь несправедливость, какой-то дериват Debian Unstable пользуется всеми достижениями великого дистрибутива, так еще и к этому имеет всякие "человечные" фишки, которые довольно вкусны, но доступны только пользователям дистрибутива с африканским лицом. И один из примеров - PPA (Personal Package Archive) на базе Launchpad, на котором хостят свои проекты многие разработчики и самая свежатина появляется именно там. Восстановим справедливость! Землю - рабочим, заводы - крестьянам, deb'ы - дебианщикам!&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Для начала немного информации о жертве. Launchpad - веб-проект хостящий у себя разработчиков с репозиториями исходников их программ, с кучей фич, упрощающих разработку и сопровождение софта. А так же содержит репы для Ubuntu с программами этих самых разработчиков, которые доставляются ленивым убунтоидам посредством PPA.&lt;br /&gt;Как работает PPA?&lt;br /&gt;&lt;br /&gt;1. Ленивый убунтоид хватает мышь рукой/ногой/хвостом. Запускает Ubuntu Software Center, тыкает Edit &amp;gt; Software Source, клик по Other Software. Клик по Add. Paste загадочный ppa:mozilla-team/firefox-stable. Клик!.. Клик!!. Клик!!!!1 Программа стоит, #@%$*!&lt;br /&gt;&lt;br /&gt;2. Убунтоид умелый запускает консоль:&lt;br /&gt;&lt;b&gt;$ sudo add-apt-repository ppa:mozillateam/firefox-stable&lt;/b&gt;&lt;br /&gt;&lt;b&gt;$ sudo apt-get update &amp;amp;&amp;amp; sudo apt-get upgrade&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Срываем покровы! (Пытая теркой убунтоида)&lt;br /&gt;PPA - это обычный дебиановский репозиторий, который регулярно обновляется самими разработчиками и их приспешниками.&lt;br /&gt;Че за ppa:mozillateam/firefox-stable, спросите Вы?&lt;br /&gt;На самом деле все просто. Добавляя это в свою уютненькую Ubuntu, ленивый убунтоид и не подозревает, что всего лишь добавил еще один репозиторий в sources.list.&lt;br /&gt;&lt;br /&gt;deb http://ppa.launchpad.net/mozillateam/firefox-stable/ubuntu lucid main&lt;br /&gt;&lt;br /&gt;Вот она и вся магия:&lt;br /&gt;&lt;br /&gt;deb http://ppa.launchpad.net/&amp;lt;некий ppa&amp;gt;/ubuntu &amp;lt;версия Ubuntu&amp;gt; main&lt;br /&gt;&lt;br /&gt;Так вот и очеловечил Марк sources.list, только версий для дебиана на PPA нет. Печально.&lt;br /&gt;Но ничто не мешает добавить эти репы самим. Можно ручками в sources.list все прописать. Но можно применить запрещенный прием самих же убунтоидов. Добавим в систему add-apt-repository.&lt;br /&gt;Это простой &lt;a href="http://blog.anantshri.info/wp-content/uploads/2010/09/add-apt-repository.sh.txt"&gt;скрипт&lt;/a&gt;, найденный на просторах интернета, который также просто добавляется в систему одной командой:&lt;br /&gt;&lt;br /&gt;# wget http://blog.anantshri.info/wp-content/uploads/2010/09/add-apt-repository.sh.txt -O /usr/sbin/add-apt-repository &amp;amp;&amp;amp; chown root:root /usr/sbin/add-apt-repository &amp;amp;&amp;amp; chmod u+x /usr/sbin/add-apt-repository&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Теперь все просто как в Ubuntu.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;# add-apt-repository ppa:mozillateam/firefox-stable&lt;/b&gt;&lt;br /&gt;&lt;b&gt;# apt-get install firefox&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Если после выполнения команды add-apt-repository вылазят непонятные ошибки, то советую проверить содержимое add-apt-repository. Возможно там просто лог ушибок неудачного скачивания.&lt;br /&gt;&lt;br /&gt;Содержимое add-apt-repository:&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;pre&gt;#!/bin/bash&lt;br /&gt;if [ $# -eq 1 ]&lt;br /&gt;then&lt;br /&gt; ppa_name=`echo "$1" | cut -d":" -f2 -s`&lt;br /&gt; if [ -z "$ppa_name" ]&lt;br /&gt; then&lt;br /&gt;  echo "PPA name not found"&lt;br /&gt;  echo "Utility to add PPA repositories in your debian machine"&lt;br /&gt;  echo "$0 ppa:user/ppa-name"&lt;br /&gt; else&lt;br /&gt;  echo "$ppa_name"&lt;br /&gt;  echo "deb http://ppa.launchpad.net/$ppa_name/ubuntu lucid main" &amp;gt;&amp;gt; /etc/apt/sources.list&lt;br /&gt;  apt-get update &amp;gt;&amp;gt; /dev/null 2&amp;gt; /tmp/apt_add_key.txt&lt;br /&gt;  key=`cat /tmp/apt_add_key.txt | cut -d":" -f6 | cut -d" " -f3`&lt;br /&gt;  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys $key&lt;br /&gt;  rm -rf /tmp/apt_add_key.txt&lt;br /&gt; fi&lt;br /&gt;else&lt;br /&gt; echo "Utility to add PPA repositories in your debian machine"&lt;br /&gt; echo "$0 ppa:user/ppa-name"&lt;br /&gt;fi&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;Строки в этом скрипте создают непонятную переменную и временный файл.&lt;br /&gt;&lt;pre&gt;apt-get update &amp;gt;&amp;gt; /dev/null 2&amp;gt; /tmp/apt_add_key.txt&lt;br /&gt;  key=`cat /tmp/apt_add_key.txt | cut -d":" -f6 | cut -d" " -f3`&lt;br /&gt;  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys $key&lt;br /&gt;  rm -rf /tmp/apt_add_key.txt&lt;/pre&gt;&lt;br /&gt;Видимо, автор не освоил стандартные юниксовые пайпы.&lt;br /&gt;Можем немного переписать эти непотребства в одну строку:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;apt-get update &amp;gt;&amp;gt; /dev/null | cut -d":" -f6 | cut -" " -f3 | \&lt;/pre&gt;&lt;pre&gt;apt-key adv --keyserver keyserver.ubuntu.com --recv-keys -&lt;/pre&gt;&lt;br /&gt;Небольшое замечание по скрипту. Скрипт парсит stderr от apt-get update, т. е. если будут другие ошибки от apt-get update, то они ему тоже попадут под нож.&lt;br /&gt;&lt;br /&gt;И замечание по поводу версии Ubuntu. На мой взгляд, лучше использовать текущую версию LTS (на момент написания - lucid) по двум причинам:&lt;br /&gt;1. Debian в силу своей стабильности не так свеж, как самые новые Ubuntu.&lt;br /&gt;2. LTS гарантирует 3 года жизни дистрибутива, т.е. меньше переживаний и бессоных ночей по поводу прекращения выпуска новых пакетов для старой Ubuntu.&lt;br /&gt;Это всего лишь my humble opinion.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Да, как нетрудно заментить, с версии 6.06 названия дистрибутивов Ubuntu идут в алфавитном порядке латинского алфавита. Это позволяет проще ориентироваться в порядке версий. Natty&amp;nbsp;Narwhal (Изящный Нарвал) идет перед Oneiric Ocelot (Сновещательный Оцелот). Дальше придумают что-нибудь вроде Pooper Peacock.&lt;br /&gt;&lt;br /&gt;[/Зависть] P. S. Адептов Ubuntu и сочувствующих прошу воспринимать упоминания самой Ubuntu и ее пользователей в строках, приведенных выше, как шутку. Ни один убунтоид не пострадал. Peace. Love. Linux.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-7566681042224181511?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/7566681042224181511/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2011/03/debian-ppa-firefox-4-debian.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/7566681042224181511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/7566681042224181511'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2011/03/debian-ppa-firefox-4-debian.html' title='Debian + PPA (Firefox 4 в Debian)'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-8398678042592972277</id><published>2011-03-20T18:51:00.000-07:00</published><updated>2011-03-20T19:09:37.647-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dns'/><category scheme='http://www.blogger.com/atom/ns#' term='bind'/><title type='text'>BIND. Собственная зона.</title><content type='html'>В заметке рассмотрен вопрос использования и манипуляции доменными именами на локальном DNS-сервере. В многофункциональном пакете BIND есть все необходимое для сочетания разных функций сервера доменных имен, как кэширующего, рекурсивного, так и для авторитетного, т. е. обслуживающего нашу личную зону.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;[Tips &amp;amp; Tricks] (Адекватные люди могут пропустить следующие 4 абзаца.)&lt;br /&gt;Свое доменное имя в чужой локалке. Ничего не мешает указать на внешних DNS-серверах в интеренете адрес из частного диапазона своей локальной сети, т.е. свой ip в локалке. Даже без ведома администратора этой сети. DNS-серверу без разницы на какой ip-адрес будет указывать имя. Конечно, за пределелами этой локалки смысла не будет в этом имени. Why so serious? Многочисленные любители держать локальные ресурсы, типа dc-хабов, игровых серверов, торрентов, радио и прочей мути, могут себя почувствовать полноценными хостерами. It's serious business.&lt;br /&gt;Есть множество бесплатных доменных регистраторов вполне терпимых зон. Типа co.cc. Любой школяр будет рад держать игровой сервер имени себя. Вроде maximka-pro-gamer.co.cc. Врядли кто будет разоряться на домен второго уровня для такого ответственного дела, типа .org, .ru или .com. Бессмысленный перевод имен. But some people makes great deals.&lt;br /&gt;Если же ip серый, то можно использовать всем известный dyndns.com, на имя которого через тип CNAME может ссылаться любое более приятное глазу имя. coolmegaserver.ru -&amp;gt; vasingameserver.dyndns.com -&amp;gt; Серый IP.&lt;br /&gt;Более адекватное применение таких свободных и бесплатных серверов доменных имен - дополнительная анонимность для back-connect'а или любого другого коннекта, на что фантазии хватит. Допустим на сервере, от коротого мы ну ни как не можем вспомнить пароль, а возможности открыть порт нету, можно сделать коннест каким-либо образом netcat'ом к нашему хосту, и чтоб лишний раз не светить ip в логах или истории команд шела, присваиваем ему имя, которое можно потом с такой же легкостью удалить. Хотя это полумера и серьезной скрытности не предаст.&lt;br /&gt;[END]&lt;br /&gt;&lt;br /&gt;Переопределение адреса для конкретного домена. Или создание личного домена. Или управление зоной.&lt;br /&gt;&lt;br /&gt;Для локальных зон в директории с конфигами /etc/bind/ есть специальный файл на такой случай named.conf.local. В нем-то и надо производить подобные манипуляции. (Конечно это все условности, и он посредством инклуда включен в основной конфиг, но для сохранения порядка лучше модифицировать его.)&lt;br /&gt;&lt;br /&gt;В первую очередь нужно определиться, за какую зону будем отвечать, не имеет значения, только что придуманная она или мы хотим переопределить чужой домен. Или нам ее делегировали и наш сервер имен за нее отвечает.&lt;br /&gt;&lt;br /&gt;Для примера будем перенаправлять microsoft.com. Вносим следующие строки:&lt;br /&gt;&lt;br /&gt;zone "microsoft.com"{&lt;br /&gt;&amp;nbsp; &amp;nbsp; type master;&lt;br /&gt;&amp;nbsp; &amp;nbsp; file "/etc/bind/db.microsoft.com";&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;где тип зоны "мастер" говорит бинду, что мы управляем доменом;&lt;br /&gt;file - наш файл, в котором хранятся записи о домене.&lt;br /&gt;Он может выглядеть так:&lt;br /&gt;&lt;br /&gt;$TTL 604800&lt;br /&gt;@ IN SOA microsoft.com. hostmaster.example.com. (&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; после ";" - идут комментарии, hostmaster.example.com = hostmaster@example.com&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; почтовый адрес админа зоны, первая точка вместо @&lt;br /&gt;20110317 ; Порядковый номер - при его увеличении подчиненные серверы&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; обновляют данные, если таковые есть.&lt;br /&gt;&amp;nbsp; &amp;nbsp; 7200 ; Период обновления - периодичность обновления данных подчиненным серверами.&lt;br /&gt;&amp;nbsp; &amp;nbsp; 1800 ; Интервал между попытками - если в первый раз не получилось обновить данные.&lt;br /&gt;604800 ; Интервал устаревания - время обслуживания зоны подчиненными серверами&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; в отсутствии главных серверов.&lt;br /&gt;&amp;nbsp; &amp;nbsp; 7200 ) ; Минимальное время жизни (Negative cache TTL) - время жизни отрицательных ответов.&lt;br /&gt;; Если нет подчиненных сервереров, то эти данные менять не обязательно.&lt;br /&gt;;&lt;br /&gt;@ IN A xx.xx.xx.xx ; @ - псевдоним текущей зоны, т.е. microsoft.com, xx.xx.xx.xx - ее ip-адрес&lt;br /&gt;@ IN NS localhost. ; NS - DNS зоны, необходимо указать сервер имен зоны, чтоб у него&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; клиент резолвил имена в этой зоне, в данном случае это этот же сервер&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; если имя указано в конце без ".", то он воспринимается как префикс к текущей зоне&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; т.е. localhost = localhost.microsoft.com.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; если указать ip адрес вместо имени, то он будет воспринят как имя, xx.xx.xx.xx.microsoft.com&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; поэтому лучше сделать следующую запись в таком случае&lt;br /&gt;@ IN NS ns ; указываем сервер имен вместо предыдущего или вместе,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;&amp;nbsp;если он в нашей зоне, если нет, то указываем полное имя и не забываем про точку&lt;br /&gt;ns IN A yy.yy.yy.yy ; &amp;nbsp;пишем адрес, если все же в нашей зоне,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; этот же тип записи характерен для всех поддоменов нашей зоны&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ; вместо ns - любое имя, * - будет перенаправлять все поддомены на указанный ip-адрес&lt;br /&gt;google IN CNAME google.com. ; CNAME - каноническое имя, псевдоним для другого хоста.&lt;br /&gt;&lt;br /&gt;Эра IPv6 уже не загорами и вместо A будут использоваться записи AAAA. И BIND 9 к этому &amp;nbsp;готов. Ничего не мешает получать у сервера имен адреса IPv6, даже если он имеет адрес IPv4.&lt;br /&gt;IPv6 запись в том же конфиге может выглядеть так:&lt;br /&gt;&lt;br /&gt;google IN AAAA&amp;nbsp;2a00:1450:800&lt;br /&gt;&lt;br /&gt;Как-то так. Материал ни в коей мере не претендует на адекватность и раскрытие темы. Все названия и имена вымышлены. А любые совпадения - случайны.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-8398678042592972277?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/8398678042592972277/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2011/03/bind-1.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/8398678042592972277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/8398678042592972277'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2011/03/bind-1.html' title='BIND. Собственная зона.'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-2279406835140831352</id><published>2011-01-29T08:03:00.000-08:00</published><updated>2011-02-28T13:23:07.880-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><title type='text'>[Tips &amp; Tricks] SSH множественное перенаправление портов</title><content type='html'>Бывалых пользователей этот метод не удивит. Иногда возникает необходимость подлючиться к сети и сделать forwarding удаленных портов на локальную машину. Есть вариант использовать SOCKS5 (параметр -D), возможности которого предоставляются openssh, но можно сделать проще - перенаправить несколько удаленных портов на локальные. Зачем это? Не особо большое удовольствие прописывать в браузере SOCKS5 каждый раз. Или делать несколько подключений. VPN? Для таких мелких задач он не нужен. Куда проще открыть страницу в браузере что-то вроде: http://127.0.0.1:3130, или подключиться к машине в локалке за сервером -L 5900:192.168.0.10:5900&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Как оказалось, ssh может переваривать несколько параметров -L:&lt;br /&gt;&lt;br /&gt;# ssh user@82.151.114.123 -L 3129:localhost:80 -L 3130:www.google.com:80 -L 3131:localhost:3128&lt;br /&gt;Семантика параметра -L для перенаправления на локальную машину такова: -L &amp;lt;local port&amp;gt;:&amp;lt;remote host&amp;gt;:&amp;lt;remote port&amp;gt;&lt;br /&gt;&lt;br /&gt;# lsof -i -P | grep ssh&lt;br /&gt;ssh       4105       root    5u  IPv4 177511      0t0  TCP localhost:3129 (LISTEN)&lt;br /&gt;ssh       4105       root    7u  IPv4 177515      0t0  TCP localhost:3130 (LISTEN)&lt;br /&gt;ssh       4105       root    9u  IPv4 177519      0t0  TCP localhost:3131 (LISTEN)&lt;br /&gt;&lt;br /&gt;Возможно будет выскакивать ошибка такого рода:&lt;br /&gt;channel 7: open failed: connect failed: Connection refused&lt;br /&gt;&lt;br /&gt;Решилась проблема добавление параметра в конфиг ssh-сервера /etc/ssh/sshd_config:&lt;br /&gt;AllowTcpForwarding yes&lt;br /&gt;&lt;br /&gt;Все манипуляции производились c использованием OpenSSH 5.7&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-2279406835140831352?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/2279406835140831352/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2011/01/tips-tricks-ssh.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/2279406835140831352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/2279406835140831352'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2011/01/tips-tricks-ssh.html' title='[Tips &amp; Tricks] SSH множественное перенаправление портов'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-2423689362616399302</id><published>2011-01-24T03:13:00.000-08:00</published><updated>2011-01-24T03:46:11.630-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='domolink'/><category scheme='http://www.blogger.com/atom/ns#' term='adsl'/><title type='text'>Домолинк. Статический IP. Модем Zyxel P660RU2 EE. NAT. ADSL</title><content type='html'>[Заметка на полях] Некоторое время назад пришлось настраивать сабж в организации. Сама процедура настройки совсем нехитрая. Но почему-то в интернете описания не нашлось. Она отличается от настройки домашнего пользователя с динамическим IP. Может еще кому пригодится, чтобы не перебирать все варианты. ТП Домолинка может только рассказывать заученные шаблоны для динамического IP.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&amp;nbsp;Как подключить модем, зайти по дефолтному паролю и сменить его - рассказывать не буду.&lt;br /&gt;Заходим в веб-интерфейс по адресу модема: 192.168.1.1. Во вкладке Network -&amp;gt; WAN выставляем следующие параметры (в квадратных скобках):&lt;br /&gt;&lt;br /&gt;P660RU2&lt;br /&gt;&amp;nbsp;|&lt;br /&gt;+-Network&lt;br /&gt;&amp;nbsp;| &amp;nbsp; |&lt;br /&gt;&amp;nbsp;| &amp;nbsp;+-&lt;b&gt;WAN&lt;/b&gt;&lt;br /&gt;~~~~~~~~&lt;br /&gt;&lt;br /&gt;--------------------&lt;br /&gt;&amp;nbsp; Line&lt;br /&gt;--------------------&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Modulation [Multi Mode]&lt;br /&gt;&amp;nbsp; &amp;nbsp; Annex [Annex B] (Сигнализации ради, если ее нет, то можно Annex A)&lt;br /&gt;&lt;br /&gt;--------------------&lt;br /&gt;&amp;nbsp; General&lt;br /&gt;--------------------&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Name [любое]&lt;br /&gt;&amp;nbsp; &amp;nbsp; Mode [Routing]&lt;br /&gt;&amp;nbsp; &amp;nbsp; Encapsulation [ENET ENCAP]&lt;br /&gt;&amp;nbsp; &amp;nbsp; Multiplexing [LLC]&lt;br /&gt;&amp;nbsp; &amp;nbsp; Virutal Circuit ID (2 параметра зависят от региона)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VPI [0]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VCI [35]&lt;br /&gt;&lt;br /&gt;--------------------&lt;br /&gt;&amp;nbsp; IP Address&lt;br /&gt;--------------------&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ( &amp;nbsp;) Obtain an IP Address Automatically&lt;br /&gt;&amp;nbsp; &amp;nbsp; (o) Static&amp;nbsp;IP Address &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IP Address [xx.xx.xx.xx] (Ваш статический IP)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Subnet Mask [xx.xx.xx.xx] (Выданная Вам маска подсети - MS)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Gateway IP address [xx.xx.xx.xx] (Ваш GW)&lt;br /&gt;&lt;br /&gt;После настройки перезапускаем модем, почему-то сразу принимать новые параметры без перезагрузки отказывался. Таки все.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-2423689362616399302?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/2423689362616399302/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2011/01/ip-zyxel-p660ru2-ee-nat.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/2423689362616399302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/2423689362616399302'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2011/01/ip-zyxel-p660ru2-ee-nat.html' title='Домолинк. Статический IP. Модем Zyxel P660RU2 EE. NAT. ADSL'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-6093867997409594275</id><published>2011-01-19T09:45:00.000-08:00</published><updated>2011-01-19T13:13:00.029-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Gnome 3 in Debian. Experimental. Сага.</title><content type='html'>Ставим gnome-shell от Gnome 3 в Debian Squeeze.&lt;br /&gt;Википедия говорит:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;b&gt;GNOME Shell&lt;/b&gt;&amp;nbsp;— одна из компонент&amp;nbsp;&lt;a href="http://ru.wikipedia.org/wiki/GNOME" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;" title="GNOME"&gt;GNOME 3&lt;/a&gt;, следующего поколения&amp;nbsp;&lt;a href="http://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;" title="Свободное программное обеспечение"&gt;свободной&lt;/a&gt;&amp;nbsp;&lt;a href="http://ru.wikipedia.org/wiki/%D0%A1%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%87%D0%B5%D0%B3%D0%BE_%D1%81%D1%82%D0%BE%D0%BB%D0%B0" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;" title="Среда рабочего стола"&gt;среды рабочего стола&lt;/a&gt;&amp;nbsp;&lt;a href="http://ru.wikipedia.org/wiki/GNOME" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;" title="GNOME"&gt;GNOME&lt;/a&gt;. GNOME Shell управляет&amp;nbsp;&lt;a href="http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9_%D1%81%D1%82%D0%BE%D0%BB" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;" title="Рабочий стол"&gt;рабочим столом&lt;/a&gt;&amp;nbsp;и отвечает за такие базовые функции, как запуск приложений и переключение между окнами. GNOME Shell тесно интегрирован с&amp;nbsp;&lt;a href="http://ru.wikipedia.org/wiki/Metacity#Mutter" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;" title="Metacity"&gt;Mutter&lt;/a&gt;, который является следующим поколением&amp;nbsp;&lt;a href="http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80_%D0%BE%D0%BA%D0%BE%D0%BD_X_Window_System" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;" title="Менеджер окон X Window System"&gt;оконного менеджера&lt;/a&gt;&amp;nbsp;&lt;a href="http://ru.wikipedia.org/wiki/Metacity" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;" title="Metacity"&gt;Metacity&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Хватит слов, приступим к делу!&lt;br /&gt;&lt;br /&gt;Добавляем в репозитории /etc/apt/sources.list&lt;br /&gt;&lt;br /&gt;deb http://ftp.debian.org/debian experimental main non-free contrib&lt;br /&gt;&lt;br /&gt;# apt-get update&lt;br /&gt;# apt-get install gnome-shell -t experimental&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;За этим безобразием тянутся QT.&lt;/div&gt;&lt;div&gt;Видим, как в процессе установки гном дохнет и возраждается.&lt;/div&gt;&lt;br /&gt;Далее запускаем команду:&lt;br /&gt;&lt;br /&gt;$ gnome-shell --replace&lt;br /&gt;&lt;br /&gt;Наблюдаем за чудесами исчезновения старых панелей и пояления новой с подозрительной кнопкой Activities, через которую и должна протекать вся основная деятельность.&lt;br /&gt;&lt;br /&gt;Пропала возможность переключать раскладку средствами гнома. Скорее всего причина тому то, что не все пакеты среды доступны, это всего лишь gnome-shell. Исправляем через Иксы:&lt;br /&gt;&lt;br /&gt;$ setxkbmap -layout "us,ru" -option "grp:alt_shift_toggle,grp_led:scroll"&lt;br /&gt;&lt;br /&gt;Рабочий стол остался только один.&lt;br /&gt;Workspace'ы обнаружились в меню Activities, где добавлялись плюсиком, переключение между всеми окнами осуществляется традиционнім Alt-Tab, даже если окна на разных столах. Или традиционными Ctrl+Alt+стрелки. Увы, не видно, что находится на &amp;nbsp;столах при переключении. Еще можно мышой хватать фон и таскать столы.&lt;br /&gt;Количество столов динамично, могучие + и - правят их количеством. Жаль, что только в одном измерении переключаются - вправо и влево, хотя может я просто плохо искал.&lt;br /&gt;Не смотря на эти неудобства, видны красотульки.&lt;br /&gt;&lt;br /&gt;Конки завелись, хоть и не сразу.&lt;br /&gt;&lt;br /&gt;Позрачность теперь реальна, т.е. видно не только фоновый рисунок на прозрачном окне, но окна между фоном и прозрачным окном.&lt;br /&gt;Не увидел трея с программами, только настройки.&lt;br /&gt;Уже посещают мысли, как приделать сенсорную панель к нетбуку, п.ч. новый гноме расчитан на возюканье пальцем ноги. Судя по тенденции, близится єра компьютеров с сєнсорніми экранами. Вспомнился Unity, чем-то схож. Думаю, на каком-нибудь xPad'е, когда допилят, будет удобно.&lt;br /&gt;&lt;br /&gt;Общее впечатление: слава богам, оно не такое тяжелое, как KDE 4, но требует основательного допила, ибо глючно, но шустро, если ничего не сломают.&lt;br /&gt;Приговор: не трогать до релиза! Пусть зреет.&lt;br /&gt;Нужно ли оно? Увы, всем гномерам рано или поздно придется сменить Gnome 2 на что-либо.&lt;br /&gt;Посижу на этом добре, вроде юзабельно.&lt;br /&gt;А теперь картинки! Все любят картинки!&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_8ckmP31djdk/TTcji0weBBI/AAAAAAAAAAU/O42bHiiBe4A/s1600/gnome3_menu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://3.bp.blogspot.com/_8ckmP31djdk/TTcji0weBBI/AAAAAAAAAAU/O42bHiiBe4A/s320/gnome3_menu.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_8ckmP31djdk/TTcjj22lOzI/AAAAAAAAAAY/G6IHAOs0wpQ/s1600/gnome3_transparency.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://1.bp.blogspot.com/_8ckmP31djdk/TTcjj22lOzI/AAAAAAAAAAY/G6IHAOs0wpQ/s320/gnome3_transparency.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_8ckmP31djdk/TTcjkRCd9RI/AAAAAAAAAAc/jj_ctcpa7jE/s1600/Gnome3_activities.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://1.bp.blogspot.com/_8ckmP31djdk/TTcjkRCd9RI/AAAAAAAAAAc/jj_ctcpa7jE/s320/Gnome3_activities.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Ну и в заврешение телка с моими конками.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_8ckmP31djdk/TTcmnxOFjGI/AAAAAAAAAAg/qUuReW83yy4/s1600/Gnome3_telka_conky.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://4.bp.blogspot.com/_8ckmP31djdk/TTcmnxOFjGI/AAAAAAAAAAg/qUuReW83yy4/s320/Gnome3_telka_conky.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;Девка не моя! Я просто поставил на фон картинку из инета!&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-6093867997409594275?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/6093867997409594275/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2011/01/gnome-3-in-debian-experimental.html#comment-form' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/6093867997409594275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/6093867997409594275'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2011/01/gnome-3-in-debian-experimental.html' title='Gnome 3 in Debian. Experimental. Сага.'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8ckmP31djdk/TTcji0weBBI/AAAAAAAAAAU/O42bHiiBe4A/s72-c/gnome3_menu.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-6782787146747552511</id><published>2011-01-03T03:18:00.000-08:00</published><updated>2011-01-19T10:44:31.139-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='deb'/><title type='text'>Потрошим чужие deb'ы или взмах катаной</title><content type='html'>Это продолжение &lt;a href="http://urbanrat.blogspot.com/2010/12/deb-ompd.html"&gt;заметки о сборке deb'ов&lt;/a&gt;, только уже наоборот.&lt;br /&gt;Для чего это может понадобиться?&lt;br /&gt;В первую очередь, если мы &amp;nbsp;хотим собрать истинно канонiчный и рассово верный пакет, но не собираемся записывать мэйнтейнеры Debian, то проще всего взять готовый deb-пакет (если таковой есть), разобрать его, обновить бинарники, подправить метаданные и собрать обратно. Зачем делать то, что сделали до нас? Go! Go! Go! Fire in the hole! (пер.: Пойти! Пойти! Пойти! Огонь в дыре!)&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Для операции - распаковки .deb пакета можно сделать так (этот метод извлечет только инсталируемые файлы):&lt;br /&gt;# dpkg -x somepackage.deb ~/target_directory/&lt;br /&gt;&lt;br /&gt;Или быстрый самурайский метод:&lt;br /&gt;# ar p somepackage.deb data.tar.gz | tar zx&lt;br /&gt;&lt;br /&gt;Тот же самурайский метод по шагам (наша катана вскроет внутренности пакета и вывалит их наружу). На самом деле deb-пакет всего лишь юниксовый ar-архив, который можно разобрать (а так же собрать) стандартными средствами любого *никса:&lt;br /&gt;# ar vx somepackage.deb&lt;br /&gt;&lt;br /&gt;x - debian-binary&lt;br /&gt;x - control.tar.gz&lt;br /&gt;x - data.tar.gz&lt;br /&gt;&lt;br /&gt;где debian-binary - файл, содержащий версию deb-пакета (не имеет отношения к версии программы);&lt;br /&gt;control.tar.gz - содержимое DEBIAN, директория, которую мы создавали для метаданных в заметке про создание пакетов (тут больше файлов и назначение их можно понять по названию);&lt;br /&gt;data.tar.gz - инсталлируемые в систему файлы (доки, бинарники, конфиги).&lt;br /&gt;&lt;br /&gt;Распаковка архивов стандартным методом:&lt;br /&gt;# tar -xzvf data.tar.gz&lt;br /&gt;&lt;br /&gt;Просмотр их содержимого без распаковки:&lt;br /&gt;# tar -tzvf data.tar.gz&lt;br /&gt;&lt;br /&gt;На этом все, спрячем катану в ножны и насладимся цветением сакуры весенним днем у подножья Фудзи, обдуваемой легким ветерком с востока.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-6782787146747552511?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/6782787146747552511/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2011/01/deb.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/6782787146747552511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/6782787146747552511'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2011/01/deb.html' title='Потрошим чужие deb&apos;ы или взмах катаной'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-5361900525569880248</id><published>2010-12-30T00:28:00.000-08:00</published><updated>2010-12-30T16:21:38.781-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='boot'/><title type='text'>Lenny in the Sky with Daemons. Стартовые скрипты Debian</title><content type='html'>Обращаем программы в демонов и ставим их на службу добру ]:-)&amp;gt;.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Инициализация системы в Debian подобна Unix System V или, проще говоря, Sys-V like init system.&lt;br /&gt;После того, как загрузчик передал управление ядру, а ядро запускает init, тут-то и начинается вся настройка пользовательского окружения. И в зависимости от уровня выполнения, который можно посмотреть в /etc/inittab:&lt;br /&gt;id:2:initdefault:&lt;br /&gt;или командой runlevel, запускаются скрипты различных системных демонов в &amp;nbsp;/etc/rc#.d/, где # - уровень выполнения, по умолчанию он 2.&lt;br /&gt;В директории /etc/rc2.d/ расположены символические ссылки на директорию /etc/init.d/, где сами скрипты и лежат. Симлинки только те, которые нужны для уровня выполнения, а не все подряд.&lt;br /&gt;Симлинки начинающиеся c K - неактивны (disable), с S - эти выполняются (enable). Дальше после первой буквы идет номер, это порядок запуска. Порядок важен некоторым зависимым от других демонам.&lt;br /&gt;&lt;br /&gt;Таким образом, для соответсвия канонам наш демонизирующий скрипт должен лежать в /etc/init.d/, а потом его уже специальными инструментами добавим в нужные уровни запуска.&lt;br /&gt;&lt;br /&gt;Вот пример минимального скрипта:&lt;br /&gt;&lt;blockquote&gt;#! /bin/sh&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;# /etc/init.d/blah&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;# Some things that run always&lt;br /&gt;touch /var/lock/blah&lt;br /&gt;&lt;br /&gt;# Carry out specific functions when asked to by the system&lt;br /&gt;case "$1" in&lt;br /&gt;start)&lt;br /&gt;echo "Starting script blah "&lt;br /&gt;echo "Could do more here"&lt;br /&gt;;;&lt;br /&gt;stop)&lt;br /&gt;echo "Stopping script blah"&lt;br /&gt;echo "Could do more here"&lt;br /&gt;;;&lt;br /&gt;*)&lt;br /&gt;echo "Usage: /etc/init.d/blah {start|stop}"&lt;br /&gt;exit 1&lt;br /&gt;;;&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;exit 0&lt;/blockquote&gt;Обязательно должны быть два принимаемых параметра start и stop.&lt;br /&gt;Инструмент для помещения нашего демона в уровни выполнения - update-rc.d&lt;br /&gt;Добавляем наш скрипт:&lt;br /&gt;# update-rc.d blah defaults&lt;br /&gt;Убираем из загрузки:&lt;br /&gt;# update-rc.d -f  blah remove&lt;br /&gt;Запускаем, останавливаем:&lt;br /&gt;либо&lt;br /&gt;# /etc/init.d/blah start&lt;br /&gt;либо&lt;br /&gt;# service blah start&lt;br /&gt;тоже самое &amp;nbsp;со stop и другими принимаемыми параметрами, если они есть. Иногда бывает restart, status или специфичные для каких-либо программ.&lt;br /&gt;&lt;br /&gt;На самом деле скрипты бывают очень сложные с кучей проверок, условий, параметров. Но это уже для более глубокого ковыряния.&lt;br /&gt;&lt;br /&gt;Разбор более сложного примера из арча. Казалось бы, при чем тут арч?&lt;br /&gt;Не при чем, просто наткнулся на пример, в котором есть полезные конструкции и невозбранно скопировал.&lt;br /&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;. /etc/rc.conf&lt;br /&gt;. /etc/rc.d/functions&lt;br /&gt;TFTPD_ARGS=&lt;br /&gt;[ -f /etc/conf.d/tftpd ] &amp;amp;&amp;amp; . /etc/conf.d/tftpd&lt;br /&gt;# конструкция [ -f "file name" ] &amp;nbsp;возвращает true, если файл существует&lt;br /&gt;PID=`pidof -o %PPID /usr/sbin/in.tftpd`&lt;br /&gt;# pidof -9 %PPID &amp;lt;программа&amp;gt; возвращает идентификатор желаемого процесса, пропуская %PPID, т.е. родительскои pid породившего pidof процесса&lt;br /&gt;case "$1" in&lt;br /&gt;start) # обработка аргумента start&lt;br /&gt;stat_busy "Starting TFTPD" # Вывод&lt;br /&gt;[ -z "$PID" ] &amp;amp;&amp;amp; /usr/sbin/in.tftpd {TFTPD_ARGS}&lt;br /&gt;# -z пустая строка, т.е. нулевая длина, проверка есть ли такой пид&lt;br /&gt;# если программа не запущена, pidof возвращает пустую строку&lt;br /&gt;# т.е. если программа еще не запущена, то она запускается после &amp;amp;&amp;amp;&lt;br /&gt;# если же она запущена, то [ -z $PID ] возвращает false&lt;br /&gt;# и до выполнения &amp;amp;&amp;amp; не доходит&lt;br /&gt;if [ $? -gt 0 ]; then&lt;br /&gt;# код заверешния последней команды, если 0 - успешно;&lt;br /&gt;# -gt - проверка на условие больше&lt;br /&gt;&lt;br /&gt;stat_fail&lt;br /&gt;else&lt;br /&gt;add_daemon in.tftpd&lt;br /&gt;stat_done&lt;br /&gt;fi&lt;br /&gt;;;&lt;br /&gt;stop)&lt;br /&gt;stat_busy "Stopping TFTPD"&lt;br /&gt;[ ! -z "$PID" ]  &amp;amp;&amp;amp; kill $PID &amp;amp;&amp;gt; /dev/null&lt;br /&gt;if [ $? -gt 0 ]; then&lt;br /&gt;stat_fail&lt;br /&gt;else&lt;br /&gt;rm_daemon in.tftpd&lt;br /&gt;stat_done&lt;br /&gt;fi&lt;br /&gt;;;&lt;br /&gt;restart)&lt;br /&gt;$0 stop&lt;br /&gt;$0 start&lt;br /&gt;;;&lt;br /&gt;*)&lt;br /&gt;echo "usage: $0 {start|stop|restart}"  &lt;br /&gt;esac&lt;br /&gt;exit 0&lt;br /&gt;&lt;br /&gt;Как образец в Дебиане есть /etc/init.d/skeleton&lt;br /&gt;Подробности в /etc/init.d/README&lt;br /&gt;&lt;br /&gt;На его основе с немалыми правками сделал канонiчний загрузочный скрипт.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#! /bin/sh&lt;br /&gt;### BEGIN INIT INFO&lt;br /&gt;# Provides:          ompd &lt;br /&gt;# Required-Start:    $remote_fs $syslog&lt;br /&gt;# Required-Stop:     $remote_fs $syslog&lt;br /&gt;# Default-Start:     2 3 4 5&lt;br /&gt;# Default-Stop:      0 1 6&lt;br /&gt;# Short-Description: Starts Opera Mini Proxy Daemon&lt;br /&gt;# Description:       Starts Opera Mini Proxy Daemon&lt;br /&gt;#                    &lt;br /&gt;### END INIT INFO&lt;br /&gt;&lt;br /&gt;# Author: anonymous&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;# Do NOT "set -e"&lt;br /&gt;&lt;br /&gt;# PATH should only include /usr/* if it runs after the mountnfs.sh script&lt;br /&gt;PATH=/sbin:/usr/sbin:/bin:/usr/bin&lt;br /&gt;DESC="OMPD - Opera Mini Proxy Daemon"&lt;br /&gt;NAME=ompd&lt;br /&gt;DAEMON="/usr/bin/python /opt/ompd/$NAME.pyc"&lt;br /&gt;DAEMON_ARGS="-d"&lt;br /&gt;PIDFILE=/var/run/$NAME.pid&lt;br /&gt;SCRIPTNAME=/etc/init.d/$NAME&lt;br /&gt;PID=`pidof -o %PPID /usr/bin/python /opt/ompd/mopd.pyc`&lt;br /&gt;# Exit if the package is not installed&lt;br /&gt;#[ -x "$DAEMON" ] || exit 0&lt;br /&gt;&lt;br /&gt;# Read configuration variable file if it is present&lt;br /&gt;#[ -r /opt/ompd/ompd.conf ] &amp;amp;&amp;amp; . /opt/ompd/ompd.conf&lt;br /&gt;&lt;br /&gt;# Load the VERBOSE setting and other rcS variables&lt;br /&gt;. /lib/init/vars.sh&lt;br /&gt;&lt;br /&gt;VERBOSE="yes"&lt;br /&gt;&lt;br /&gt;# Define LSB log_* functions.&lt;br /&gt;# Depend on lsb-base (&amp;gt;= 3.2-14) to ensure that this file is present&lt;br /&gt;# and status_of_proc is working.&lt;br /&gt;. /lib/lsb/init-functions&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# Function that starts the daemon/service&lt;br /&gt;#&lt;br /&gt;do_start()&lt;br /&gt;{&lt;br /&gt;# Return&lt;br /&gt;#   0 if daemon has been started&lt;br /&gt;#   1 if daemon was already running&lt;br /&gt;#   2 if daemon could not be started&lt;br /&gt;#start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test &amp;gt; /dev/null || return 1&lt;br /&gt;#start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --$DAEMON_ARGS  || return 2&lt;br /&gt;if [ -z $PID ]; then&lt;br /&gt;$DAEMON $DAEMON_ARGS &amp;gt; /dev/null 2&amp;gt;&amp;gt; /var/log/faillog &amp;amp;&lt;br /&gt;if [ $? -gt 0 ]; then&lt;br /&gt;return 2&lt;br /&gt;else&lt;br /&gt;return 0&lt;br /&gt;fi&lt;br /&gt;else&lt;br /&gt;return 1&lt;br /&gt;fi&lt;br /&gt;# Add code here, if necessary, that waits for the process to be ready&lt;br /&gt;# to handle requests from services started subsequently which depend&lt;br /&gt;# on this one.  As a last resort, sleep for some time.&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# Function that stops the daemon/service&lt;br /&gt;#&lt;br /&gt;do_stop()&lt;br /&gt;{&lt;br /&gt;# Return&lt;br /&gt;#   0 if daemon has been stopped&lt;br /&gt;#   1 if daemon was already stopped&lt;br /&gt;#   2 if daemon could not be stopped&lt;br /&gt;#   other if a failure occurred&lt;br /&gt;if [ -n "$PID" ]; then&lt;br /&gt;kill $PID&lt;br /&gt;if [ $? -eq 0 ]; then&lt;br /&gt;return 0&lt;br /&gt;else &lt;br /&gt;return 2&lt;br /&gt;fi&lt;br /&gt;else&lt;br /&gt;return 1&lt;br /&gt;fi&lt;br /&gt;#start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME&lt;br /&gt;#RETVAL="$?"&lt;br /&gt;#[ "$RETVAL" = 2 ] &amp;amp;&amp;amp; return 2&lt;br /&gt;# Wait for children to finish too if this is a daemon that forks&lt;br /&gt;# and if the daemon is only ever run from this initscript.&lt;br /&gt;# If the above conditions are not satisfied then add some other code&lt;br /&gt;# that waits for the process to drop all resources that could be&lt;br /&gt;# needed by services started subsequently.  A last resort is to&lt;br /&gt;# sleep for some time.&lt;br /&gt;#start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON&lt;br /&gt;#[ "$?" = 2 ] &amp;amp;&amp;amp; return 2&lt;br /&gt;# Many daemons don't delete their pidfiles when they exit.&lt;br /&gt;#rm -f $PIDFILE&lt;br /&gt;#return "$RETVAL"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# Function that sends a SIGHUP to the daemon/service&lt;br /&gt;#&lt;br /&gt;do_reload() {&lt;br /&gt;#&lt;br /&gt;# If the daemon can reload its configuration without&lt;br /&gt;# restarting (for example, when it is sent a SIGHUP),&lt;br /&gt;# then implement that here.&lt;br /&gt;#&lt;br /&gt;start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME&lt;br /&gt;return 0&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;case "$1" in&lt;br /&gt;start)&lt;br /&gt;[ "$VERBOSE" != no ] &amp;amp;&amp;amp; log_daemon_msg "Starting $DESC" "$NAME"&lt;br /&gt;do_start&lt;br /&gt;case "$?" in&lt;br /&gt;0|1) [ "$VERBOSE" != no ] &amp;amp;&amp;amp; log_end_msg 0 ;;&lt;br /&gt;2) [ "$VERBOSE" != no ] &amp;amp;&amp;amp; log_end_msg 1 ;;&lt;br /&gt;esac&lt;br /&gt;;;&lt;br /&gt;stop)&lt;br /&gt;[ "$VERBOSE" != no ] &amp;amp;&amp;amp; log_daemon_msg "Stopping $DESC" "$NAME"&lt;br /&gt;do_stop&lt;br /&gt;case "$?" in&lt;br /&gt;0|1) [ "$VERBOSE" != no ] &amp;amp;&amp;amp; log_end_msg 0 ;;&lt;br /&gt;2) [ "$VERBOSE" != no ] &amp;amp;&amp;amp; log_end_msg 1 ;;&lt;br /&gt;esac&lt;br /&gt;;;&lt;br /&gt;status)&lt;br /&gt;status_of_proc "$DAEMON" "$NAME" &amp;amp;&amp;amp; exit 0 || exit $?&lt;br /&gt;;;&lt;br /&gt;#reload|force-reload)&lt;br /&gt;#&lt;br /&gt;# If do_reload() is not implemented then leave this commented out&lt;br /&gt;# and leave 'force-reload' as an alias for 'restart'.&lt;br /&gt;#&lt;br /&gt;#log_daemon_msg "Reloading $DESC" "$NAME"&lt;br /&gt;#do_reload&lt;br /&gt;#log_end_msg $?&lt;br /&gt;#;;&lt;br /&gt;restart|force-reload)&lt;br /&gt;#&lt;br /&gt;# If the "reload" option is implemented then remove the&lt;br /&gt;# 'force-reload' alias&lt;br /&gt;#&lt;br /&gt;log_daemon_msg "Restarting $DESC" "$NAME"&lt;br /&gt;do_stop&lt;br /&gt;case "$?" in&lt;br /&gt;0|1)&lt;br /&gt;do_start&lt;br /&gt;case "$?" in&lt;br /&gt;0) log_end_msg 0 ;;&lt;br /&gt;1) log_end_msg 1 ;; # Old process is still running&lt;br /&gt;*) log_end_msg 1 ;; # Failed to start&lt;br /&gt;esac&lt;br /&gt;;;&lt;br /&gt;*)&lt;br /&gt;# Failed to stop&lt;br /&gt;log_end_msg 1&lt;br /&gt;;;&lt;br /&gt;esac&lt;br /&gt;;;&lt;br /&gt;*)&lt;br /&gt;#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" &amp;gt;&amp;amp;2&lt;br /&gt;echo "Usage: $SCRIPTNAME {start|stop|status|restart}" &amp;gt;&amp;amp;2&lt;br /&gt;exit 3&lt;br /&gt;;;&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;:&lt;/blockquote&gt;Выше был пример редкого случая, когда необходимо запустить программу на питоне. В обычных случаях достаточно поправить переменные в skeleton'е.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-5361900525569880248?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/5361900525569880248/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2010/12/lenny-in-sky-with-daemons-debian.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/5361900525569880248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/5361900525569880248'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2010/12/lenny-in-sky-with-daemons-debian.html' title='Lenny in the Sky with Daemons. Стартовые скрипты Debian'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-2839024551520137238</id><published>2010-12-29T03:31:00.000-08:00</published><updated>2010-12-29T03:36:26.155-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Cint. Интерпретатор C/C++ или жестокий скриптинг</title><content type='html'>Все в языке должно быть прекрасно. У С++ немало плюсов, но возможно это просто минусы, расположенные перпендикулярно.&lt;br /&gt;&amp;nbsp;- Надоели компиляторы... Неинтересно.&lt;br /&gt;&amp;nbsp;- No sir! Больше никаких компиляторов. Только интерпретаторы!&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Тезисы, модели и подсистемы описаны тут &lt;a href="http://habrahabr.ru/blogs/cpp/109898/"&gt;http://habrahabr.ru/blogs/cpp/109898/&lt;/a&gt; .&lt;br /&gt;Наша задача: пришел, увидел, запустил.&lt;br /&gt;&lt;br /&gt;Пришел: &lt;a href="http://root.cern.ch/drupal/content/cint"&gt;http://root.cern.ch/drupal/content/cint&lt;/a&gt; тут хомяк синта.&lt;br /&gt;&lt;br /&gt;Увидел: # svn co http://root.cern.ch/svn/root/trunk/cint cint&lt;br /&gt;# cd cint&lt;br /&gt;# sh ./setenv.sh&lt;br /&gt;# ./configure --with-prefix=/usr/local/cint/&lt;br /&gt;доставил зависимостей&lt;br /&gt;снова configure&lt;br /&gt;# make -j2&lt;br /&gt;&lt;br /&gt;параллельно с компиляцией запустил процесс распития пива:&lt;br /&gt;&lt;br /&gt;bool compiled = false;&lt;br /&gt;if(fork()) { compiled = compile(cint); }&lt;br /&gt;else { while(!compiled) drink(beer); }&lt;br /&gt;// ладно, знаю, что поток не прочитает измененную переменную в другом потоке. Это иллюстрация просто.&lt;br /&gt;&lt;br /&gt;# checkinstall -D --pkgname cint --pkgversion 5.18.00 --pkgrelease 1 --arch i386 --strip --stripso --gzman&lt;br /&gt;&lt;br /&gt;Запустил: $ cint test.cpp&lt;br /&gt;&lt;br /&gt;Хочу заметить, что интерпретатор на 100% не поддерживает C/C++, и скорее всего программы-монстры не запустятся (однако, безумству храбрых поем мы песню).&lt;br /&gt;Ну, а для образовательных, отладочных или извращенско-скриптовых целей - в самый раз. Теперь осталось найти безумца, готового переписать все скрипты в системе на истинно верном языке ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-2839024551520137238?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/2839024551520137238/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2010/12/cint-c.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/2839024551520137238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/2839024551520137238'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2010/12/cint-c.html' title='Cint. Интерпретатор C/C++ или жестокий скриптинг'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-422419994259810992</id><published>2010-12-28T21:57:00.000-08:00</published><updated>2011-01-03T02:58:02.616-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='checkinstall'/><category scheme='http://www.blogger.com/atom/ns#' term='opera'/><title type='text'>Создание deb-пакета из бинарников на примере OMPD</title><content type='html'>&amp;nbsp;- Мой мастер, я уже научился мастерски владеть checkinstall'ом. Когда я смогу превзойти тебя и тоже стать мастером?&lt;br /&gt;&amp;nbsp;- Мой юный падаван, когда сможешь собирать и компилировать пакеты в уме, тогда ты и станешь настоящим мастером. А для начала научись собирать пакеты, как делали это наши предки.&lt;br /&gt;&lt;div align="right"&gt;~ Сага о пакетах&lt;/div&gt;&lt;br /&gt;Есть замечательная утилита checkinstall, которой для бытовых нужд хватает с головой. Но не всегда можно сделать так:&lt;br /&gt;# checkinstall -D make install&lt;br /&gt;Хотя оговорюсь, можно обойтись checkinstall. Этот самурайский метод рассмотрим поверхностно.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;OMPD - компрессор веб-траффика, использующий сервера OperaMini для обработки страниц.&lt;/blockquote&gt;&lt;blockquote&gt;Программа реализована как локальный прокси-сервер.&lt;/blockquote&gt;&lt;blockquote&gt;Благодаря использованию протокола/формата OM v 1.2x-3.xx достигается очень высокая степень сжатия за счёт потерь в форматировании страницы. &lt;a href="http://ompd-proxy.narod.ru/"&gt;http://ompd-proxy.narod.ru/&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Полезная утилита для компрессии трафика, которая может пригодиться в случае, когда нет возможности использовать что-либо кроме мобильного телефона в качестве модема.&lt;br /&gt;&lt;br /&gt;Задача:&lt;br /&gt;&lt;br /&gt;Канонично собрать пакет для Debian стандартными средствами.&lt;br /&gt;&lt;br /&gt;Акт созидания:&lt;br /&gt;&lt;br /&gt;1.Определяемся с православным именованием нашей жертвы:&lt;br /&gt;&amp;lt;project&amp;gt;_&amp;lt;major version&amp;gt;.&amp;lt;minor version&amp;gt;-&amp;lt;package revision&amp;gt;&lt;br /&gt;&amp;lt;название&amp;gt;_&amp;lt;версия&amp;gt;-&amp;lt;версия пакета&amp;gt;&lt;br /&gt;В нашем случае:&lt;br /&gt;ompd_0.3.2-1&lt;br /&gt;&lt;br /&gt;2. &amp;nbsp;Далее создаем директорию с этим названием:&lt;br /&gt;# mkdir ompd_0.3.2-1&lt;br /&gt;&lt;br /&gt;3. Переходим в директорию и начинаем думать. А думать начинаем, п.ч. наша программа и все ее файлы расположены в одной директории. Менять саму программу лень. В директории типа /usr/bin/ ставить ее - кощунство, сколько там будет мусора. Единственный вариант на такой случай директория /opt/. Увы, конфиг в /etc/ лежать не будет и шелл не будет знать, где лежит исполняемый файл (если мы сами ему не подскажем). Придется чем-то жертвовать или можно сварганить симлинк в /usr/bin/, это уже дело вкуса и остается на домашнее задание.&lt;br /&gt;&lt;br /&gt;# cd ompd_0.3.2-1/&lt;br /&gt;# mkdir opt&lt;br /&gt;# mkdir opt/ompd&lt;br /&gt;# cd opt/ompd/&lt;br /&gt;# cp -fr ../../../ompd/* .&lt;br /&gt;&lt;br /&gt;где последний путь - директория с разархивированной программой.&lt;br /&gt;&lt;br /&gt;Основная суть - как в созданном каталоге расположим файлы, так они и установятся в системе относительно корня.&lt;br /&gt;&lt;br /&gt;Для сборки пакета из сырцов этим же методом можно их проинсталировать в эту директорию, а дальше по плану.&lt;br /&gt;&lt;br /&gt;4. Дебовский пакет - это не только ценный мех^W^W свалка файлов, инсталируемых в систему, но еще и информация о том, что оно из себя представляет, откуда и для чего нужно. На эти непростые вопросы отвечают мета-данные в директории DEBIAN.&lt;br /&gt;Возвращаемся в наш корень:&lt;br /&gt;&lt;br /&gt;# cd ../..&lt;br /&gt;# mkdir DEBIAN&lt;br /&gt;# vim DEBIAN/control #ну или nano, дело вкуса и уровня джедайства (nano - для падаванов, vim - для мастеров, а для илиты - gedit)&lt;br /&gt;&lt;br /&gt;Как должно выглядеть содержимое:&lt;br /&gt;&lt;br /&gt;Package: ompdVersion: 0.3.2-1&lt;br /&gt;Section: base&lt;br /&gt;Priority: optional&lt;br /&gt;Architecture: i386&lt;br /&gt;Depends: python (&amp;gt;= 2.6.0), здесь могла быть еще одна зависимость, а потом через запятую еще и еще, это писать не надо (&amp;gt;= 6.6.6)&lt;br /&gt;Maintainer: Your Name &amp;lt;you@email.com&amp;gt;&lt;br /&gt;Description: OMPD&lt;br /&gt;&amp;nbsp;Web traffic comressor based on free Opera Mini servers&lt;br /&gt;&amp;nbsp;It works as local proxy server.&lt;br /&gt;&amp;nbsp;Very high compression rate has achieved due to usage of OM 1.2x..3.xx &amp;nbsp;protocol/data format.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В описании перед каждой строкой должен быть пробел.&lt;br /&gt;&lt;br /&gt;5. А теперь замутим свой пакет с шахматами и куртизанками:&lt;br /&gt;# dpkg-deb --build&amp;nbsp;ompd_0.3.2-1&lt;br /&gt;&lt;br /&gt;где&amp;nbsp;ompd_0.3.2-1 - наша директория с кишками и прочими потрохами программы, естественно, из которой мы предварительно вышли.&lt;br /&gt;Пакет будет валяться в том месте, откуда вызвали dpkg-deb.&lt;br /&gt;&lt;br /&gt;Вот так мы и наполнили нашу жизнь шалостями с Debian.&lt;br /&gt;&lt;br /&gt;Как сделать тоже самое, но пойдя по пути самурая?&lt;br /&gt;Просто!&lt;br /&gt;Есть способы сборки из исходников deb-пакетов.&lt;br /&gt;Делаем свой особенный Makefile с правилами установки, которые копируют файлы программы в нужные места. И установка должна осуществляться make install'ом.&lt;br /&gt;А потом checkinstall в руки или световой меч^W^W предусмотренные для этого средства. Подробности о последнем можно прочитать тут: &lt;a href="http://takeworld.blogspot.com/2009/05/deb.html"&gt;http://takeworld.blogspot.com/2009/05/deb.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;P.S. Еще можно наколдовать init-скрипт для запуска с системой, но это колдунство для совсем другой сказки.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-422419994259810992?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/422419994259810992/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2010/12/deb-ompd.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/422419994259810992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/422419994259810992'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2010/12/deb-ompd.html' title='Создание deb-пакета из бинарников на примере OMPD'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7655759202038285360.post-3579816450963260325</id><published>2010-12-28T18:55:00.000-08:00</published><updated>2010-12-28T19:51:01.671-08:00</updated><title type='text'>Блог.</title><content type='html'>Цель создания - сохранение информации, которая не умещается в памяти. Если кто-либо найдет полезным содержание (если вообще кто-нибудь его найдет на просторах сети), буду рад.&lt;br /&gt;Ну, и возможно еще какой-нибудь бред, рожденный воспаленным разумом.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7655759202038285360-3579816450963260325?l=urbanrat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://urbanrat.blogspot.com/feeds/3579816450963260325/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://urbanrat.blogspot.com/2010/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/3579816450963260325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7655759202038285360/posts/default/3579816450963260325'/><link rel='alternate' type='text/html' href='http://urbanrat.blogspot.com/2010/12/blog-post.html' title='Блог.'/><author><name>solarfly</name><uri>http://www.blogger.com/profile/07102967924576555348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
