<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Erinome Lane &#187; Сеть и интернет</title>
	<atom:link href="https://tt.erinome.net/cc/network/feed" rel="self" type="application/rss+xml" />
	<link>https://tt.erinome.net</link>
	<description>a bit of this, a bit of that...</description>
	<lastBuildDate>Mon, 23 Mar 2026 12:51:51 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>Реклама на яндексе и в яндекс.почте</title>
		<link>https://tt.erinome.net/2020/07/922</link>
		<comments>https://tt.erinome.net/2020/07/922#comments</comments>
		<pubDate>Wed, 08 Jul 2020 21:06:35 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Сеть и интернет]]></category>
		<category><![CDATA[жтс]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=922</guid>
		<description><![CDATA[На днях на одном из моих почтовых ящиков при входе вдруг был замечен огромный тултип, гласивший, что Яндекс рад мне сообщить о возможности подключения платной опции для почты: она, дескать, за символический стольник ежемесячно позволит мне отключить рекламу, получить приоритетную &#8230; <a href="https://tt.erinome.net/2020/07/922">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>На днях на одном из моих почтовых ящиков при входе вдруг был замечен огромный тултип, гласивший, что Яндекс рад мне сообщить о возможности подключения платной опции для почты: она, дескать, за символический стольник ежемесячно позволит мне отключить рекламу, получить приоритетную техподдержку, а также какие-то гигабайты в яндекс-диск, который, вообще-то, не то чтобы относился к почте. В общем, всё это, конечно, прекрасно, но до этого дня у меня реклама была вообще выключена &#8211; для этого существовала доступная для всех и бесплатно опция. Почему просто прямым текстом не написать, что в сервисе теперь будет неотключаемая забесплатно реклама? Вместо этого Яндекс пытается нагло делать вид, что сейчас [за деньги] можно получить расширенный функционал, когда на деле просто прежние бесплатные опции становятся платными &#8211; и это откровенно злит.<span id="more-922"></span></p>
<div style="background: darkgray; padding: 6px 3px;">
Я решил размещать здесь и поддерживать в более-менее актуальном состоянии свои фильтры для uBlock-а:</p>
<p><span style="color: darkred;">Обновление от <strong>22/03/2026</strong></span></p>
<pre class="console">! страницы почты
mail.yandex.ru##div[data-testid="page-layout_right-column_container_v1"], div[data-testid="content-header_container"] > div:not([data-testid="toolbar-layout_container"]), div.Modal.Modal_visible[class*="Fullscreen_root_"]

! страница погоды
yandex.ru##div[class*="AppLayoutTypeMain_centerWrapper_"] aside[class*="AppLayoutTypeMain_right_"], [class*="MainPage_topBlockWithMoney_"], [class*="AppForecastMoney_wrap_"], [class*="Money_ecomFooter_"], [class*="AppMoney_wrap_"], [class*="AppPromoInner_container_"]

! страница поиска
ya.ru##div[class*="body_"] > aside ~ div, .Distribution, #search-result-aside
</pre>
<p>А ниже текст старого поста.</p></div>
<p>Реклама на тот момент выглядела как отдельная строчка в перечне писем + три огромных графических баннера по левой стороне экрана, под категориями (в прошлом, насколько вспоминается, там были 2-3 баннера суммарного размера как один нынешний). Разумеется, опция отключения рекламы из настроек почты безвозвратно исчезла. Помимо этого, что характерно, обнаружилось, что на паре других яндекс.учеток никакого предложения покупки &#8220;про-версии&#8221; почты нет, как нет и рекламы. <em>Update: спустя некоторое время она появилась и там тоже.</em></p>
<p>К сожалению, никаких денег на оплату яндекс.закидонов мне не хватает, поэтому предпримем попытку убрать это безобразие с глаз долой при помощи uBlock Origin.</p>
<p>Яндекс.реклама отличается тем, что каждый раз генерирует себе новые случайные идентификаторы, но в почте пока что прибивается следующими правилами:</p>
<pre class="console">mail.yandex.ru##.mail-Layout-Content > .ns-view-advanced-search-box + div, .mail-Layout-Aside-Inner > .ns-view-left-box .qa-LeftColumn > div:last-Child, .mail-Layout-Aside-Inner > .ns-view-left-box .ns-view-react-left-column + div, .tooltip_theme_promo, .pushPromo</pre>
<p>Кроме того, некоторая часть назойливых предложений по установке яндекс.браузера выпиливается следующим образом:</p>
<pre class="console">yandex.ru##.distr-promo-head, .distr-popup, .dist-popup, .bottom-popup, .serp-footer_type_distro, .distr-smartbanner-loader
yandex.ru##.advert, .b-statcounter + div, #bk-stripe</pre>
<p>Не тая особенных надежд, можно с почти полной уверенностью говорить, что эти правила придется рано или поздно менять, но, возможно, к тому времени можно будет успеть поменять и почту на что-то более приемлемое.</p>
<p>PS: Яндекс.новации последнее время, кажется, падают все ниже и ниже. Когда-то давно они сделали сервис почты-для-домена, включая днс-хостинг, и у него был какой-никакой API для автоматического управления (читай &#8211; DDNS). Затем его &#8220;проапгрейдили&#8221; до яндекс.коннекта, без предупреждений снеся старое API, но так и не сделав новое на замену. Теперь вот игры в какие-то &#8220;прошечки&#8221; в попытке сделать платным то, что вот только вчера было полностью бесплатным, но при этом представить всё это так, как будто в этом есть что-то новое и новаторское. Куда еще смогут упасть?</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2020/07/922/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux: несколько IP на один NIC</title>
		<link>https://tt.erinome.net/2019/04/879</link>
		<comments>https://tt.erinome.net/2019/04/879#comments</comments>
		<pubDate>Mon, 15 Apr 2019 13:18:47 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Сеть и интернет]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=879</guid>
		<description><![CDATA[Заметка, чтобы не забыть. Варварство без специфичных скриптов того или иного дистрибутива, с циничным пользованием deprecated утилит. Заведение IP: ifconfig eth0:1 &#60;ip-address&#62; netmask &#60;netmask&#62; up Если это роутер с NAT или просто нужна возможность организовать внешние соединения с этого IP &#8230; <a href="https://tt.erinome.net/2019/04/879">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Заметка, чтобы не забыть. Варварство без специфичных скриптов того или иного дистрибутива, с циничным пользованием deprecated утилит.<span id="more-879"></span></p>
<p>Заведение IP:</p>
<pre class="console">ifconfig eth0:1 &lt;ip-address&gt; netmask &lt;netmask&gt; up</pre>
<p>Если это роутер с NAT или просто нужна возможность организовать внешние соединения <em>с</em> этого IP (а не <em>на</em> него), то требуется новая таблица в <em>/etc/iproute2/rt_tables</em>. Далее:</p>
<pre class="console">ip route add &lt;network&gt;/29 dev eth0:1 src &lt;ip-address&gt; table &lt;table&gt;
ip route add default via &lt;network gateway&gt; table &lt;table&gt;
ip route add 192.168.0.0/24 dev eth1 table &lt;table&gt;
ip rule add from &lt;network&gt; table &lt;table&gt;</pre>
<p>Посмотреть, что получилось:</p>
<pre class="console">ip rule show
ip route list table &lt;table&gt;</pre>
<p>Задать маршруты по умолчанию тем же <code>ip route</code>, но без <code>table</code>. Правила iptables для NAT типовые.</p>
<p>Если удобоваримый результат достигнут, далее можно искать специфичные скрипты того или иного дистрибутива для менее варварской настройки. Если их нет, то rc.local.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2019/04/879/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PPTP-клиент за NAT на основе Linux-сервера</title>
		<link>https://tt.erinome.net/2015/10/839</link>
		<comments>https://tt.erinome.net/2015/10/839#comments</comments>
		<pubDate>Thu, 29 Oct 2015 09:49:04 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Сеть и интернет]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=839</guid>
		<description><![CDATA[Небольшая локальная сеть на несколько компьютеров получала доступ в интернет через сервер на базе CentOS 6 &#8211; обычным NAT маскарадингом через iptables. Обнаружилось, что в такой конфигурации по умолчанию невозможно поднять VPN-туннель PPTP (протокол &#8211; GRE) с компьютеров, находящихся за &#8230; <a href="https://tt.erinome.net/2015/10/839">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Небольшая локальная сеть на несколько компьютеров получала доступ в интернет через сервер на базе CentOS 6 &#8211; обычным NAT маскарадингом через iptables. Обнаружилось, что в такой конфигурации по умолчанию невозможно поднять VPN-туннель PPTP (протокол &#8211; GRE) с компьютеров, находящихся за таким шлюзом.<span id="more-839"></span></p>
<p>Симптомы: на виндовых машинах подключение к VPN виснет на &#8220;проверке имени пользователя и пароля&#8221;, затем выдается ошибка 619. В логах PPTP-сервера видно, что он не получает отклика от клиента и сбрасывает подключение по таймауту, а в трафике видны только исходящие GRE-пакеты в сторону PPTP-клиента. На NAT-шлюзе в трафике при этом присутствуют и входящие, и исходящие GRE-запросы.</p>
<p>Спустя время было выявлено, что затык именно на стороне клиента, а именно на NAT-шлюзе: для работы PPTP на нем нужно подгрузить следующие модули (для CentOS):</p>
<pre class="console">modprobe ip_nat_pptp
modprobe ip_conntrack_pptp
modprobe ip_gre</pre>
<p>Несмотря на то, что, казалось бы, каких-либо открываний портов, или разрешений протоколов в файрволе, или других настроек на NAT-шлюзе для использования на стоящих за ним компьютерах PPTP-клиента не требуется, все-таки кое-что сделать придется. Так как с настройками по умолчанию (по крайней мере, для CentOS 6) GRE-трафик пропускаться не будет.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2015/10/839/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>icecast relay и редиректы</title>
		<link>https://tt.erinome.net/2015/09/830</link>
		<comments>https://tt.erinome.net/2015/09/830#comments</comments>
		<pubDate>Fri, 25 Sep 2015 08:24:29 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Сеть и интернет]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=830</guid>
		<description><![CDATA[Сервер icecast может использоваться не только для организации вещания новых сетевых медиапотоков, но и для ретрансляции уже существующих. Источник исходного потока при этом может являться распределенной структурой других icecast-подобных серверов, в которых для распределения нагрузки на головном сервере может использоваться &#8230; <a href="https://tt.erinome.net/2015/09/830">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Сервер icecast может использоваться не только для организации вещания новых сетевых медиапотоков, но и для ретрансляции уже существующих. Источник исходного потока при этом может являться распределенной структурой других icecast-подобных серверов, в которых для распределения нагрузки на головном сервере может использоваться простой http-редирект (код 302) на дополнительные узлы.</p>
<p>Хотя relay-функциональность icecast и позволяет разбирать этот код и реагировать на него соответствующим образом, работает это не всегда.<span id="more-830"></span></p>
<p>Можно столкнуться со следующей ситуацией: головной source-сервер перегружен и выдает редиректы на дополнительные серверы, при проверке браузером все корректно, но наш icecast-ретранслятор их будто &#8220;не замечает&#8221; и выдает клиентам ошибку 404. В логах нашего icecast&#8217;а при этом можно увидеть следующие записи:</p>
<pre class="console">[2015-09-25  10:58:40] INFO slave/start_relay_stream Starting relayed source at mountpoint "/&lt;mountname>"
[2015-09-25  10:58:40] INFO slave/open_relay_connection connecting to &lt;main.source>:80
[2015-09-25  10:58:40] INFO slave/open_relay_connection redirect received HTTP://&lt;fallback.source>
</pre>
<p>После этого клиенту выдается ошибка 404 и более ничего содержательного в лог не попадает. Так в чем же дело?</p>
<p>В исходном коде icecast можно найти следующие строки:</p>
<pre class="console">            ICECAST_LOG_INFO("redirect received %s", uri);
            if (strncmp (uri, "http://", 7) != 0)
                break;
</pre>
<p>Так выясняется, что если полученная ссылка из 302-го редиректа не начинается на &#8220;http://&#8221; (в НИЖНЕМ регистре!), то наш icecast с ней не будет делать вообще ничего и сделает вид, что никакого редиректа не было. А как видно из лога, наш источник рассылает редиректы, начинающиеся на HTTP:// в верхнем регистре.</p>
<p>Очевидно, надо научить icecast не обращать внимание на разницу регистров в протоколе. Это можно сделать разными способами, оптимальность и красота которых зависит от качества вашего владения <del>кунг-фу</del> Си. Можно, например, сделать как-то так:</p>
<pre class="console">--- icecast-2.4.2/src/slave.c   2015-04-08 11:06:13.000000000 +0300
+++ icecast-2.4.2-mod/src/slave.c       2015-09-25 10:55:29.495738535 +0300
@@ -238,13 +238,19 @@
         if (strcmp (httpp_getvar (parser, HTTPP_VAR_ERROR_CODE), "302") == 0)
         {
             /* better retry the connection again but with different details */
-            const char *uri, *mountpoint;
-            int len;
+            const char *uri, *mountpoint, *proc = "http://";
+            int i, len;

             uri = httpp_getvar (parser, "location");
+
             ICECAST_LOG_INFO("redirect received %s", uri);
-            if (strncmp (uri, "http://", 7) != 0)
-                break;
+            for (i = 0; i < 7 &#038;&#038; uri[i]; i++) {
+                if ((tolower(uri[i]) - tolower(proc[i])) != 0) {
+                    i = 10;
+                    break;
+                }
+            }
+            if (i == 10) break;
             uri += 7;
             mountpoint = strchr (uri, '/');
             free (mount);
</pre>
<p>Пересобираем, подключаемся, смотрим лог:</p>
<pre class="console">[2015-09-25  11:08:40] INFO slave/start_relay_stream Starting relayed source at mountpoint "/&lt;mountname>"
[2015-09-25  11:08:40] INFO slave/open_relay_connection connecting to &lt;main.source>:80
[2015-09-25  11:08:40] INFO slave/open_relay_connection redirect received HTTP://&lt;fallback.source>
[2015-09-25  11:08:40] INFO slave/open_relay_connection connecting to &lt;fallback.source>:80
[2015-09-25  11:08:40] WARN format/format_get_type Unsupported or legacy stream type: "audio/mpeg". Falling back to generic minimal handler for best effort.
[2015-09-25  11:08:40] INFO source/source_main listener count on /&lt;mountname> now 1</pre>
<p>И все работает.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2015/09/830/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firefox: &#8220;Blocked: May contain a virus or spyware&#8221;</title>
		<link>https://tt.erinome.net/2015/04/816</link>
		<comments>https://tt.erinome.net/2015/04/816#comments</comments>
		<pubDate>Wed, 29 Apr 2015 14:59:05 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Сеть и интернет]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[грабли]]></category>
		<category><![CDATA[тупость]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=816</guid>
		<description><![CDATA[В отдельных ситуациях Firefox может возомнить себя намного умнее своего пользователя и напрочь блокирует возможность загрузки файлов с сайтов, которые его левой пятке захотелось посчитать небезопасными. При этом в окне загрузки отображается надпись вида &#8220;Blocked: May contain a virus or &#8230; <a href="https://tt.erinome.net/2015/04/816">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>В отдельных ситуациях <strong>Firefox</strong> может возомнить себя намного умнее своего пользователя и напрочь блокирует возможность загрузки файлов с сайтов, которые его левой пятке захотелось посчитать небезопасными. При этом в окне загрузки отображается надпись вида <em>&#8220;Blocked: May contain a virus or spyware&#8221;</em>, и нет никакой наглядной возможности обойти эту блокировку.<span id="more-816"></span></p>
<p>Проблема проявляется в виду того, что FF использует гугловскую базу ненадежных сайтов, которая запросто может ошибаться. Что любопытно &#8211; в Google Chrome применяется иной реестр вредоносных сайтов, и зачастую то, что [ошибочно] заблокировано в FF, успешно открывается в Хроме.</p>
<p>Так или иначе, но с проблемой нужно бороться &#8211; достаточно того, что наше любимое правительство решает, какие сайты нам смотреть можно, а какие &#8211; нельзя. Не хватало еще, чтобы и браузер начал указывать, что какой-нибудь архив или документ к скачиванию недопустим, а, следовательно, пожелавший его скачать пользователь может идти лесом (в другой браузер). И всё &#8211; из-за того, что разработчики FF не соизволили добавить кнопку одноразового обхода блокировки. Нет, такие удобства нам не нужны.</p>
<p>По счастью, выключать одним махом все проверки вредоносных сайтов не потребуется. Для решения проблемы нужно открыть страницу настроек &#8211; <em>about:config</em>, и переключить параметр <strong>browser.safebrowsing.downloads.enabled</strong> в положение <strong>false</strong>. Теперь FF позволит скачивать любые файлы.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2015/04/816/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OpenWrt, libiconv и Full Language Support</title>
		<link>https://tt.erinome.net/2014/12/758</link>
		<comments>https://tt.erinome.net/2014/12/758#comments</comments>
		<pubDate>Tue, 23 Dec 2014 08:52:58 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Сеть и интернет]]></category>
		<category><![CDATA[openwrt]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=758</guid>
		<description><![CDATA[Бывают ситуации, когда в OpenWrt не хватает полной языковой поддержки. Особенно, когда дело касается работы с кириллицей в кодировке UTF-8. Для таких случаев в OpenWrt предусмотрена неурезанная версия библиотеки libiconv-full, а также глобальная опция Compile with full language support. Вот &#8230; <a href="https://tt.erinome.net/2014/12/758">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Бывают ситуации, когда в <strong>OpenWrt</strong> не хватает полной языковой поддержки. Особенно, когда дело касается работы с кириллицей в кодировке UTF-8. Для таких случаев в <strong>OpenWrt</strong> предусмотрена неурезанная версия библиотеки <strong>libiconv-full</strong>, а также глобальная опция <em>Compile with full language support</em>.</p>
<p>Вот только скомпилировав прошивку с данными опциями выясняется, что никакой поддержки кириллических кодировок как не было, так и нет.<span id="more-758"></span></p>
<p>Разгадка кроется в малозаметном патче к <strong>libiconv-full</strong> под названием <em>100-strip-charsets.patch</em>. Пролистав его можно с удивлением обнаружить, что пакет, вроде бы имеющий в названии слово &#8220;full&#8221;, ничего общего с этим словом не имеет: доблестные разработчики <strong>OpenWrt</strong> в &#8220;полной&#8221; версии <strong>libiconv</strong> просто выпилили 97% всех кодировок, включая все упоминания кириллических, и оставив лишь несколько западноевропейских.</p>
<p>Наиболее простое решение &#8211; просто удалить патч <em>100-strip-charsets.patch</em> из пакета <strong>libiconv-full</strong>. Но так размер данной библиотеки увеличится в несколько раз! По этой причине мы сделали исправленную версию исходного патча, в которой оставлены кириллические кодировки, но вырезано большинство прочих.</p>
<p>Скачать исходный код модифицированного <strong>libiconv-full</strong> можно из <a href="http://fs.erinome.net/openwrt/packages/libiconv-full" target="_blank">нашего архива</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2014/12/758/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>davfs2 и загрузка файлов в OpenWrt</title>
		<link>https://tt.erinome.net/2014/12/753</link>
		<comments>https://tt.erinome.net/2014/12/753#comments</comments>
		<pubDate>Tue, 23 Dec 2014 08:07:46 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Сеть и интернет]]></category>
		<category><![CDATA[openwrt]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=753</guid>
		<description><![CDATA[В опубликованной на днях статье про резервное копирование в WebDav мы касались того, что davfs2 из репозитория OpenWrt не всегда способен успешно загружать файлы в удаленное хранилище, и зачастую они заканчивают свой путь в каталоге lost+found. При этом чтение файлов &#8230; <a href="https://tt.erinome.net/2014/12/753">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>В опубликованной на днях статье про <a href="http://tt.erinome.net/2014/12/742" target="_blank">резервное копирование в WebDav</a> мы касались того, что <strong>davfs2</strong> из репозитория <strong>OpenWrt</strong> не всегда способен успешно загружать файлы в удаленное хранилище, и зачастую они заканчивают свой путь в каталоге <em>lost+found</em>. При этом чтение файлов из <strong>WebDav</strong>, получение их атрибутов, а также и удаление &#8211; всегда работает корректно.</p>
<p>Как оказалось, эта проблема имеет простое решение.<span id="more-753"></span></p>
<p>Логирование в <strong>davfs2</strong>, размещенном на роутере под управлением <strong>OpenWrt</strong>, организовано не самым удобным образом. Лог всегда пишется в системный кольцевой буфер, прочитать который можно при помощи команды <strong>logread</strong>, и объем оного весьма незначителен. А отладочные сообщения <strong>davfs2</strong> в зависимости от выбранного уровня отладки либо слишком подробны и многочисленны, либо слишком кратки и по ним ничего невозможно понять.</p>
<p>Так или иначе, при работе стандартного пакета <strong>davfs2</strong> с выставленным в <em>davfs2.conf</em> параметре <em>debug most</em> в системном логе можно наблюдать следующие строки при попытке загрузки файла в удаленное хранилище:</p>
<pre class="console" style="font-size: 75%">Mon Dec 22 19:15:36 2014 mark.debug syslog: Running pre_send hooks
Mon Dec 22 19:15:36 2014 mark.debug syslog: Sending request headers:
Mon Dec 22 19:15:36 2014 mark.debug syslog: PUT /testfile HTTP/1.1
User-Agent: davfs2/1.5.2 neon/0.30.0
Connection: TE
TE: trailers
Host: webdav.yandex.ru
Transfer-Encoding: chunked
Authorization: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Mon Dec 22 19:15:36 2014 mark.debug syslog: Sending request-line and headers:
Mon Dec 22 19:15:36 2014 mark.debug syslog: Sending request body:
Mon Dec 22 19:15:36 2014 mark.debug syslog: Request body provider failed with 
Mon Dec 22 19:15:36 2014 mark.debug syslog: -
Mon Dec 22 19:15:36 2014 mark.debug syslog: 1
Mon Dec 22 19:15:36 2014 mark.debug syslog: 
Mon Dec 22 19:15:36 2014 mark.debug syslog: sess: Closing connection.
Mon Dec 22 19:15:36 2014 mark.debug syslog: sess: Connection closed.
Mon Dec 22 19:15:36 2014 mark.debug syslog: Request ends, status 
Mon Dec 22 19:15:36 2014 mark.debug syslog: 0
Mon Dec 22 19:15:36 2014 mark.debug syslog:  class 
Mon Dec 22 19:15:36 2014 mark.debug syslog: 0
Mon Dec 22 19:15:36 2014 mark.debug syslog: xx, error line:
Mon Dec 22 19:15:36 2014 mark.debug syslog: Failed reading request body file: Bad address
Mon Dec 22 19:15:36 2014 mark.debug syslog: 
Mon Dec 22 19:15:36 2014 mark.debug syslog: Running destroy hooks.
Mon Dec 22 19:15:36 2014 mark.debug syslog: Request ends.
Mon Dec 22 19:15:36 2014 mark.debug syslog: tidy: neon error
Mon Dec 22 19:15:36 2014 mark.debug syslog:       Failed reading request body file: Bad address</pre>
<p>Как видим, выводится не самая информативная ошибка <em>Bad address</em>, происходящая из используемой в <strong>davfs2</strong> для коммуникации библиотеки <strong>neon</strong> &#8211; текста <em>Failed reading request body file</em> в исходных кодах <strong>davfs2</strong> найти не получится.</p>
<p>После некоторой изыскательной деятельности удалось обнаружить, что причина кроется в том простом факте, что библиотека <strong>neon</strong> и пакет <strong>davfs2</strong> по умолчанию компилируются с разными параметрами. Так, в <em>Makefile</em> пакета <strong>neon</strong> указаны следующие флаги:</p>
<pre class="console">TARGET_CPPFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE</pre>
<p>А в <em>Makefile</em> пакета <strong>davfs2</strong> такая строка отсутствует. И именно это отличие приводит к фатальной нестыковке, когда дело доходит до загрузки файлов в удаленное хранилище. Простым добавлением означенных флагов в <em>Makefile</em> проблема полностью решается и <strong>davfs2</strong> начинает всегда корректно загружать файлы в <strong>WebDav</strong>.</p>
<p>PS: Кстати, интересно отметить, что данная проблема не была зафиксирована в <s>устаревшей</s> версии <strong>davfs2</strong>, размещенной в <a href="http://fs.erinome.net/openwrt/packages/davfs2" target="_blank">нашем архиве</a> &#8211; в нашем случае <em>Makefile</em> содержал все необходимые флаги для корректной сборки. Вопрос, отчего требуемые флаги потерялись в <em>Makefile</em> из официального репозитория OpenWrt, оставим на совести его мейнтейнеров. Да, кстати, версия <strong>davfs2</strong> в нашем хранилище теперь обновлена до актуальной 1.5.2. А также приложен дополнительный патч, корректирующий вывод отладочного текста в системный лог.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2014/12/753/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Резервное копирование в WebDav на OpenWrt</title>
		<link>https://tt.erinome.net/2014/12/742</link>
		<comments>https://tt.erinome.net/2014/12/742#comments</comments>
		<pubDate>Mon, 22 Dec 2014 13:18:13 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Сеть и интернет]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[openwrt]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=742</guid>
		<description><![CDATA[Рассмотрим возможность создания резервного копирования в облачное хранилище WebDav на примере Яндекс.Диска при помощи виртуальной файловой системы davfs2, утилиты cadaver и небольшого PHP-скрипта. Может возникнуть закономерный вопрос: зачем изобретать велосипед и почему бы не использовать обычный rsync для копирования данных &#8230; <a href="https://tt.erinome.net/2014/12/742">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Рассмотрим возможность создания резервного копирования в облачное хранилище <strong>WebDav</strong> на примере Яндекс.Диска при помощи виртуальной файловой системы <strong>davfs2</strong>, утилиты <strong>cadaver</strong> и небольшого <strong>PHP</strong>-скрипта.<span id="more-742"></span></p>
<p>Может возникнуть закономерный вопрос: зачем изобретать велосипед и почему бы не использовать обычный <strong>rsync</strong> для копирования данных напрямую в <strong>davfs2</strong>? Ответ простой: это&#8230; не работает как надо. Во всяком случае, с Яндекс.Диском, и если запускать процедуру на роутере под управлением <strong>OpenWrt</strong>.</p>
<p>То ли из-за особой неторопливости Яндекс.Диска, то ли из-за особенностей <strong>davfs2</strong>, но при попытке копирования большого количества файлов (а иногда такое случается и с единичными файлами!), большая их часть оказывалась в каталоге <em>lost+found</em>, служащем для локальных копий файлов, загрузка которых в <strong>WebDav</strong> провалилась. И всё это несмотря на достаточный объем выделенного кэша, стандартные настройки <strong>davfs2</strong> для повторной загрузки файлов в случае ее неудачи, и довольно широкого канала связи.</p>
<p>Итак, для самописного и более надежного бэкапера в WebDav нам понадобятся:</p>
<ol>
<li><strong>davfs2</strong> &#8211; стандартный пакет из репозитория OpenWrt;</li>
<li><strong>cadaver</strong> &#8211; модифицированная версия утилиты для прямого копирования файлов в WebDav <a href="http://fs.erinome.net/openwrt/packages/cadaver" target="_blank">из нашего архива</a>;</li>
<li><strong>php-cli</strong> &#8211; стандартный интерпретатор PHP, при помощи которого мы сгенерируем набор команд для cadaver&#8217;а.</li>
</ol>
<p>Добавленные в <strong>cadaver </strong>патчи позволяют при помощи нового ключа <strong>-F</strong> пропускать проверку подлинности сертификатов (а под <strong>OpenWrt </strong>у нас все используемые в WebDav SSL-сертификаты считаются подозрительными и требуют ручного подтверждения), а также указывать с помощью ключа <strong>-n</strong> нестандартный путь к хранилищу паролей для автоматической авторизации на WebDav-сервере. Внесенные изменения позволяют создать для <strong>cadaver</strong> файл с набором команд, которые будут выполняться автоматически без участия человека.</p>
<p>Теперь обратим внимание на скрипт <a href="http://fs.erinome.net/openwrt/scripts/phpsync.php" target="_blank">phpsync.php</a>.</p>
<p>У этого скрипта две задачи:<br />
Во-первых, он отвечает за &#8220;обратную синхронизацию&#8221; &#8211; в скрипте производится проверка, все ли находящиеся в WebDav-хранилище файлы продолжают находиться на локальном диске. В случае обнаружения в удаленном хранилище файлов, которые были локально удалены, скрипт удалит их и из WebDav &#8211; обычным вызовом <em>unlink()</em> на смонтированном разделе davfs2.<br />
Во-вторых, скрипт генерирует набор команд для <strong>cadaver</strong>&#8216;а для загрузки локально измененных или отсутствующих в WebDav файлов в удаленное хранилище.<br />
В скрипте есть ряд параметров, которые нужно настроить. Так, параметром <em>$outfile</em> определяется путь к файлу, в который будет записан сгенерированный набор команд, в параметре <em>$remotebase</em> необходимо указать точку монтирования <strong>davfs2</strong>. Также в нем указывается адрес WebDav сервера, к которому должен подключаться <strong>cadaver</strong> &#8211; по умолчанию это <em>https://webdav.yandex.ru</em>. Затем следует указать каталоги, которые требуется синхронизировать, например:</p>
<pre class="console">phpsync("/srv/content","/backup/content");
phpsync("/srv/otherdir","/backup/otherdir");</pre>
<p>Так будут сгенерирован набор команд для отражения локальных каталогов <em>/srv/content</em> и <em>/srv/otherdir</em> в удаленные WebDav-каталоги <em>/backup/content</em> и <em>/backup/otherdir</em> соответственно. Обратите внимание &#8211; удаленные пути указываются относительно корня <strong>WebDav</strong>-диска, без привязки к локальной точке монтирования <strong>davfs2</strong>!</p>
<p>После этого следует создать парольный файл для <strong>cadaver</strong>. Это обычный текстовый документ, содержающий строку следующего вида:</p>
<pre class="console">machine webdav.yandex.ru login вашлогин password вашпароль</pre>
<p>Наконец, создаем <strong>ash</strong>-скрипт, который мы будем вызывать через кронтаб:</p>
<pre class="console">#!/bin/ash
/usr/bin/php-cgi -f /srv/phpsync.php

if [ -e "/var/.phpsync.list" -a $(wc -l "/var/.phpsync.list" | awk '{print $1;}') -gt 2 ]
then
        /usr/bin/cadaver -F -r "/var/.phpsync.list" -n "/srv/auth.rc"
fi
</pre>
<p>Подставляем ваши значения:</p>
<ul>
<li><strong>/srv/phpsync.php</strong> &#8212; путь к PHP-скрипту;</li>
<li><strong>/srv/auth.rc</strong> &#8212; путь к парольному файлу;</li>
<li><strong>/var/.phpsync.list</strong> &#8212; путь к файлу с набором команд для cadaver.</li>
</ul>
<p>Не забываем сделать скрипт исполняемым, выполнив команду <strong>chmod +x</strong> на данном файле. Теперь мы можем проверить работоспособность копирования, запустив этот скрипт. В терминал при этом будет выведен результат работы PHP-генератора, а также будет показан процесс выполнения задания cadaver&#8217;ом.</p>
<p>Если все завершилось успешно &#8211; теперь можем добавить автоматический вызов данного скрипта через кронтаб в ночное время и более не беспокоиться о создании резервных копий.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2014/12/742/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP, SQLite и регистронезависимость</title>
		<link>https://tt.erinome.net/2014/10/719</link>
		<comments>https://tt.erinome.net/2014/10/719#comments</comments>
		<pubDate>Sat, 18 Oct 2014 10:11:26 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Сеть и интернет]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[openwrt]]></category>
		<category><![CDATA[грабли]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=719</guid>
		<description><![CDATA[Несмотря на объявленную поддержку UTF, встраиваемая СУБД SQLite3 по умолчанию не умеет делать регистронезависимую сортировку, сравнение и операции по преобразованию строк над буквами, не входящими в английский алфавит. Для решения этой проблемы разработчики SQLite рекомендуют использовать расширение ICU, с подключением &#8230; <a href="https://tt.erinome.net/2014/10/719">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Несмотря на объявленную поддержку UTF, встраиваемая <a href="http://www.sqlite.org/" target="_blank"> СУБД SQLite3</a> по умолчанию не умеет делать регистронезависимую сортировку, сравнение и операции по преобразованию строк над буквами, не входящими в английский алфавит. Для решения этой проблемы разработчики SQLite рекомендуют использовать расширение <strong>ICU</strong>, с подключением которого станет возможным выбирать различные кодировки и иметь возможность пользоваться регистронезависимыми операциями сравнения любых символов кроме латиницы. Вот только описаний, как это сделать для php-mod-sqlite3, найти толком нельзя, да и объем ICU превышает размер самой библиотеки SQLite! Для embedded-применений &#8211; например, в <strong>OpenWrt</strong> &#8211; такое не годится.<span id="more-719"></span></p>
<p>Давным-давно, в далекой-далекой галактике&#8230; оказалось, что много лет назад некий товарищ по имени <strong>ioannis</strong> в рамках решения означенной проблемы создал небольшое расширение SQLite, по сути представляющее собой урезанную версию ICU, из которой был выброшен код, который в 95% случаев никогда не потребуется. Таким образом удалось сократить размер расширения с мегабайт до символических 70-90 кбайт (в зависимости от архитектуры и компилятора). Копия исходного сообщения осталась доступна на <a href="http://www.mail-archive.com/sqlite-users@sqlite.org/msg30403.html" target="_blank">mail-archive.com</a>, и хотя оригинальная ссылка на исходный код расширения sqlite3_unicode.c неработоспособна, его все еще можно найти <a href="https://www.google.ru/search?q=sqlite3_unicode.c" target="_blank">в интернете</a>, а также мы добавили его в <a href="http://fs.erinome.net/openwrt/packages/libsqlite3_unicode/files/sqlite3_unicode.c">наш архив</a>.</p>
<h3><strong>Возможности расширения</strong></h3>
<p><strong>#define SQLITE3_UNICODE_FOLD</strong> &#8211; поддержка нелатинских символов функцией FOLD() &#8211; +10КБ<br />
<strong>#define SQLITE3_UNICODE_LOWER</strong> &#8211; поддержка нелатинских символов функцией LOWER() &#8211; +10КБ<br />
<strong>#define SQLITE3_UNICODE_UPPER</strong> &#8211; поддержка нелатинских символов функцией UPPER() &#8211; +10КБ<br />
<strong>#define SQLITE3_UNICODE_TITLE</strong> &#8211; поддержка нелатинских символов функцией TITLE() &#8211; +10КБ<br />
<strong>#define SQLITE3_UNICODE_UNACC</strong> &#8211; преобразование accented-символов в обычные, для русского языка не очень актуально &#8211; +30КБ<br />
<strong>#define SQLITE3_UNICODE_COLLATE</strong> &#8211; заменяет COLLATION типа NOCASE на новый, в котором при сравнении не учитывается регистр в т.ч. и для нелатинских символов.<br />
<strong>#define SQLITE3_UNICODE_UNACC_AUTOMATIC</strong> &#8211; попытаться применять UNACC в функции LIKE и операциях сравнения с COLLATE NOCASE.</p>
<p>Что характерно, функциональность, которая не требуется, может быть отключена путем убирания соответствующих #define для экономии места и увеличения производительности (вряд ли, впрочем, существенного).</p>
<p>Теперь разберемся, как собрать это расширение и задействовать его в cli-версии SQLite и в модуле для PHP.</p>
<h3><strong>Сборка под Linux</strong></h3>
<p>Для начала, скачиваем и распаковываем исходный код SQLite &#8211; нам потребуются заголовочные файлы из него. Можно использовать любую версию: я брал amalgamation без autoconf &#8211; она меньше. В тот же каталог копируем sqlite3_unicode.c.</p>
<p>Далее, корректности ради, открываем sqlite3_unicode.c текстовым редактором и вписываем вверху директиву:</p>
<pre class="console">/* we want shared library. only. */
#define SQLITE_ENABLE_UNICODE 1</pre>
<p>Этим мы указываем, что собираемся компилировать shared-библиотеку. С другой стороны &#8211; соответствующий #if в коде расширения написан таким своеобразным образом, что этого можно и не делать.</p>
<p>Затем следует непосредственно процесс компиляции. Предполагается, что пакеты из набора build-essentials уже установлены в системе &#8211; во всяком случае, здесь потребуется gcc:</p>
<pre class="console">gcc -shared -o sqlite3_unicode.so sqlite3_unicode.c</pre>
<p>Закрывая глаза на ряд warning&#8217;ов, получаем готовую библиотеку.</p>
<p>При работе с cli-версией потребуется разместить полученный sqlite3_unicode.so в каталоге с остальными системными библиотеками, либо же выполнить export следующего вида:</p>
<pre class="console">export LD_LIBRARY_PATH="/path/to/library/dir:$LD_LIBRARY_PATH"</pre>
<p>Затем открываем cli и пишем команду <strong>.load sqlite3_unicode</strong>. Если ошибок не возникло &#8211; значит, расширение успешно загрузилось.</p>
<p>Для загрузки расширения в PHP потребуется в php.ini выставить корректный путь к месту расположения библиотеки в перараметре <strong>sqlite3.extension_dir</strong>. Затем в скрипте используем команду вида <strong>$db->loadExtension(&#8216;sqlite3_unicode.so&#8217;)</strong>;</p>
<p>Вот и всё &#8211; теперь сравнения с COLLATE NOCASE будут регистронезависимыми не только для латиницы, но и для русских букв.</p>
<h3><strong>Сборка под OpenWrt</strong></h3>
<p>Теперь попробуем побороть Buildroot от OpenWrt и кросс-компилировать это расширение в toolchain&#8217;е для запуска на роутере. В конечном счете, именно ради этого весь процесс и затевался &#8211; на ПК-то нет проблемы установить ICU, в отличие от встраиваемых систем. Надо признать, что борьба с Buildroot&#8217;ом для меня оказалась намного сложнее, чем все поиски решения проблемы с регистрозависимостью в целом и попытки разобраться, как его собирать в обычных условиях, в частности.</p>
<p>В конечном счете, после бессчетных неудачных попыток, я остановился на варианте формирования отдельного пакета, содержащего только это расширение с выставленным параметром DEPENDS на libsqlite3 и включенным в его состав С-файле с исходным кодом. Скачать готовый пакет можно в <a href="http://fs.erinome.net/openwrt/packages/libsqlite3_unicode" target="_blank">нашем архиве</a>.</p>
<p>Его можно распаковать в каталог &#8220;package&#8221; корневой директории Buildroot&#8217;а, а затем нужно в <strong>make menuconfig</strong> выбрать пакет <strong>libsqlite3_unicode</strong> и запустить его сборку при помощи команды <strong>make package/libsqlite3_unicode/compile</strong>.</p>
<p>После установки полученного ipk на роутер подключение данного расширения производится аналогичным ранее описанному способом. Обратите внимание, что имя расширения для OpenWrt &#8211; <strong>libsqlite3_unicode.so</strong>, его размещение по умолчанию &#8211; <strong>/usr/lib</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2014/10/719/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Автоматизация загрузки файлов на WebDav</title>
		<link>https://tt.erinome.net/2014/04/668</link>
		<comments>https://tt.erinome.net/2014/04/668#comments</comments>
		<pubDate>Wed, 23 Apr 2014 11:59:37 +0000</pubDate>
		<dc:creator><![CDATA[root]]></dc:creator>
				<category><![CDATA[Сеть и интернет]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[openwrt]]></category>
		<category><![CDATA[webdav]]></category>

		<guid isPermaLink="false">http://tt.erinome.net/?p=668</guid>
		<description><![CDATA[Ранее на страницах этого сайта рассматривалась возможность монтирования облачных WebDav-хранилищ при помощи fuse-системы davfs2. Одним из ее недостатков был тот факт, что при любых операциях над файлами они неминуемо копировались сначала во временную директорию, а лишь затем перемещались в целевой &#8230; <a href="https://tt.erinome.net/2014/04/668">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Ранее на страницах этого сайта рассматривалась возможность монтирования облачных WebDav-хранилищ при помощи fuse-системы <a href="http://tt.erinome.net/2012/11/360">davfs2</a>. Одним из ее недостатков был тот факт, что при любых операциях над файлами они неминуемо копировались сначала во временную директорию, а лишь затем перемещались в целевой каталог.</p>
<p>Альтернативой davfs2 для прямого получения или загрузки файлов в облачное хранилище является утилита <a href="http://tt.erinome.net/2012/11/375">cadaver</a>. Однако, она предполагает интерактивное взаимодействие с пользователем, и использование ее в автоматизированных скриптах не представляется возможным. Обойти эту проблему можно при помощи утилиты <a href="http://tt.erinome.net/2014/04/660">empty</a>, аналога <em>expect</em> для создания и взаимодействия с псевдотерминалами.<span id="more-668"></span></p>
<p>Для реализации полностью автоматической загрузки и скачивания файлов с облачного хранилища был создан скрипт <a href="http://fs.erinome.net/openwrt/scripts/webdav.sh" target="_blank">webdav.sh</a>.</p>
<p>Перед использованием необходимо настроить несколько параметров, определенных в начале скрипта:<br />
<small>
<ul>
<li><em>ififo=/tmp/empty.in.fifo</em><br />
&#8211; путь к fifo ввода, на роутерах желательно размещать в /tmp</li>
<li><em>ofifo=/tmp/empty.out.fifo</em><br />
&#8211; путь к fifo вывода, на роутерах желательно размещать в /tmp</li>
<li><em>cmd=&#8221;cadaver https://webdav.yandex.ru&#8221;</em><br />
&#8211; путь к утилите cadaver и адрес WebDav-сервиса</li>
<li><em>username=YourUserName</em><br />
&#8211; логин от WebDav-сервиса</li>
<li><em>password=YourPassword</em><br />
&#8211; пароль от WebDav-сервиса</li>
</ul>
<p></small></p>
<p>Доступные команды:<br />
<small>
<ul>
<li><strong>webdav.sh put <локальный файл> [удаленный путь]</strong> &#8211; загрузка файла в облако<br />
&#8211; <em>Локальный файл</em> &#8211; обязательный параметр, должен быть указан один, файл должен быть доступен для чтения;<br />
&#8211; <em>Удаленный путь</em> &#8211; опционально, если его не указать, то файл будет загружен в корневой каталог WebDav.</li>
<li><strong>webdav.sh get <удаленный файл> [локальный путь]</strong> &#8211; выгрузка файла из облака<br />
&#8211; <em>Удаленный файл</em> &#8211; обязательный параметр, должен быть указан один, файл должен существовать;<br />
&#8211; <em>Локальный путь</em> &#8211; опционально, если его не указать, то файл будет загружены в текущий каталог.</li>
<li><strong>webdav.sh mput <локальные файлы> [удаленный путь]</strong> &#8211; множественная загрузка<br />
&#8211; <em>Локальные файлы</em> &#8211; маска вида &#8220;/path/to/*.files&#8221;, указание кавычек <em>обязательно</em>;<br />
&#8211; <em>Удаленный путь</em> &#8211; опционально, если его не указать, то файлы будут загружены в корневой каталог WebDav.</li>
<li><strong>webdav.sh mget <удаленные файлы> [локальный путь]</strong> &#8211; множественная выгрузка<br />
&#8211; <em>Удаленные файлы</em> &#8211; маска вида &#8220;/remote/path/*&#8221;;<br />
&#8211; <em>Локальный путь</em> &#8211; опционально, если его не указать, то файлы будут загружены в текущий каталог.</li>
</ul>
<p></small></p>
<p>Например, для загрузки файла &#8220;/etc/config/firewall&#8221; в удаленный каталог &#8220;/openwrt&#8221; необходимо набрать команду <em>webdav.sh put /etc/config/firewall /openwrt/firewall</em>. Отметим, что удаленный каталог &#8220;openwrt&#8221; перед выполнением этой команды должен существовать.</p>
<p>PS: Стоит обратить внимание, что утилита <em>empty</em> имеет такую особенность, что если указанные в конфигурации fifo-файлы уже существуют на момент ее запуска, то она просто не запустится, тихо ругнувшись в syslog. А в случае каких-либо сбоев в ходе работы с empty эти fifo-файлы могут автоматически не удалиться.</p>
]]></content:encoded>
			<wfw:commentRss>https://tt.erinome.net/2014/04/668/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
