Saturday, July 10, 2010

Redirecting a Samba share to another server

In this post I'll describe how to configure Samba to redirect a share to another server. A typical example when this might be useful is as follows. You have a share, say \\server\work that you need to migrate to new hardware, so that it becomes \\newserver\work. However, you don't want all your users to remember that the files are at a new location. You'd like your users to continue using the old address \\server\work and be transparently redirected to \\newserver\work. This is possible with MS DFS (distributed filesystem) support via msdfs proxy directive. It seems like a more obscure directive not very well documented and described, so I'll try to report my experience with it.

The first thing to do is to enable MS DFS in Samba on the global level by specifying:


host msdfs = true

in the [global] section of smb.conf.

Then in the section for your share, you remove the path directive and insert two MS DFS-related directives, msdfs root and msdfs proxy:


[work]
msdfs root = true
msdfs proxy = \newserver\work

Note a few things about this configuration:
  1. You MUST NOT have the path directive in the share definition
  2. The value of msdfs proxy directive is the new location of the share to redirect to; notice though, that's a single backslash in the beginning of the value, NOT the double backslash you could have expected!

That's all, now \\server\work transparently redirects to \\newserver\work. Clients may need to be rebooted to start working properly with the redirected share. In my experience, clients can't access the share right after the reconfiguration, but it starts working after some time (not sure how much time) or after the client reboots.

Per-client-IP configuration for VSFTPD

Recently I needed to configure VSFTPD FTP server to behave differently depending on the client IP address. Specifically, the task was to limit the number of connections to no more than 3 per client IP, but lift this restriction for one specific IP address (which was our own office address). The per-IP limit itself is easy to implement with max_per_ip configuration setting (see VSFTPD FAQ). The trick was specifically in making our office address the exception to this limit.

While per-user configuration is easy to implement with user_config_dir setting (and it is described in the FAQ), per-IP configuration is less obvious, so I thought I would document my findings.

The path to per-IP configuration lies via interaction with tcp_wrappers. Just in case you don't know, tcp_wrappers is a tool for filtering incoming network requests, and VSFTPD makes use of it. So, the first thing to do, is to enable tcp_wrappers support in VSFTPD, by making this setting in vsftpd.conf:


tcp_wrappers=YES

Then proceed to enter the default configuration in the main vsftpd.conf file. In my case, I set max_per_ip to limit connections per IP address:


max_per_ip=3

The next step is to configure tcp_wrappers. Add a line similar to the following to /etc/hosts.allow file:


vsftpd:1.2.3.4/255.255.255.255:setenv VSFTPD_LOAD_CONF /etc/vsftpd/vsftpd.conf.special

This must be a single line, even though Blogger may wrap it. It consists of 3 fields, separated bu the ':' character. The first must be vsftpd. The second contains your "special" IP address for which you want to enable a special configuration. As shown above, it may include a netmask so that you can apply the special configuration to a subnet (see man page for hosts.allow for details). Finally, the third field instructs tcp_wrappers to set an environment variable VSFTPD_LOAD_CONF to the name of a configuration file that will apply to your special IP address(es). The name of the variable must be exactly this; the value may be any filename you like. Once tcp_wrappers set this variable, VSFTPD will load the configuration file specified in it for the IP address(es) from the second field.

So, in the additional configuration file (in my example, /etc/vsftpd/vsftpd.conf.special) you can override everything you want for your special addresses. In my case I just needed to turn off per-IP restiction:


max_per_ip=0

That's it. I find it rather convoluted, but it works and achieves a useful purpose.

Sunday, May 30, 2010

Новости

Уже много лет читаю новости на сайте korrespondent.net. К сожалению, последнее время новости все более однообразные. Вот как выглядят типичная сводка новостей на Корреспонденте:
  • В Брюсселе Янукович перепутал рояль с унитазом.
  • Фотогалерея: в Мариинском парке на Януковича нагадила птичка.
  • Янкович побеждает во втором сете (примечание: Янкович это не опечатка! Это теннисистка!!).
  • Тимошенко создала Комитет защиты украинских животных от иностранных растений.
  • ВО Свобода представило театрализованное действо "Приключения Бандеры в стране овощей". В спектакле берут участие Богдан Бенюк в роли Бандеры и Олег Тягнибок в роли доктора Хауса.
  • В России в результате теракта самолет упал на участников акции протеста "Синее ведерко", вследствие чего протестующие провалились в шахту, спровоцировав там взрыв метана. Участники акции задержаны милицией.
  • Чемпион мира по версии WQQ в пятом полусреднем весе Пакьяо Будвейзер оказался на 1 грамм тяжелее претендента на этот титул украинца Джамиля Пупко.
И, наконец, главная новость дня:

  • Активистки движения FEMEN провели в Севастополе топлесс-акцию протеста против пребывания на территории Украины Черноморского Флота России. Моряки в восторге.
И последняя новость:

  • В знак протеста против публикации предыдущей новости движение FEMEN проводит топлесс-акцию в редакции журнала Корреспондент. Видео через пару часиков, а пока мы заняты!


Sunday, May 09, 2010

Трудности перевода: православные раввины

Прочитал известную книжку Ричарда Фейнмана "Вы, конечно, шутите, мистер Фейнман!". Бросился в глаза такой пассаж:
Во время конференции я жил в Еврейской богословской семинарии, где учились молодые раввины – полагаю, что они относились к православной церкви. 
Ну и каша же была в голове у переводчика!

Saturday, May 01, 2010

Парадокс лжеца

Парадоксом лжеца называется следующее простое утверждение:
Это утверждение ложно
Парадоксальность в том, что невозможно решить, истинно оно или ложно. В самом деле, допустим, что оно истинно. Т.е. действительно это утверждение ложно. Т.е. оно ложно. Т.е. мы начали с предположения, что оно истинно, и пришли к выводу, что оно ложно. Противоречие! То же самое получится, если мы предположим, что это утверждение ложно. Т.е. неправда, что это утверждение ложно. Значит, оно истинно. Т.е. мы начали с предположения, что оно ложно, и пришли к выводу, что оно истинно. Опять противоречие!
 
Получается, что как ни крути, а это утверждение нельзя назвать ни истинным, ни ложным. Последние две с половиной тысячи лет философы не могут решить, как же это понимать. Я же попробую предложить свое объяснение.

Я вижу объяснение в следующем. Не всякий набор слов является осмысленным утверждением, которому можно приписать истинность или ложность. Парадокс лжеца только похож на осмысленное утверждение, - и в этом подвох! - на самом же деле является бессмысленным набором слов. Проблема в ссылке на "это" утверждение, которое еще не определено. Сейчас я постараюсь объяснить это более наглядно. 

Мой аргумент будет понятен программистам, хотя, подозреваю, непонятен всем остальным. Высказывания можно представить в виде функций, возвращающих логическое значение. Парадокс лжеца можно записать таким образом:

bool liars_paradox()
{ 
  return liars_paradox() == false;
}

Видно, что определение этой функции содержит бесконечную рекурсию. Определение ссылается само на себя. Поэтому функция liars_paradox никогда не возвратит результата true или false. Соответственно, парадокс лжеца не является "утверждением", о котором имело бы смысл говорить, истинно оно или ложно.

Кстати, столь же парадоксальной является фраза "Это утверждение истинно". Можно предположить, что оно истинно - это ничему не противоречит. Но с тем же успехом можно предположить, что оно ложно - и это тоже ничему не противоречит! Т.о. эта фраза одновременно и истинна и ложна, что, конечно, эквивалентно тому, что она не истинна и не ложна, как парадокс лжеца (истинна - значит не ложна, ложна - значит не истинна). На самом деле, конечно, эта фраза столь же бессмысленна, и по той же самой причине, что и парадокс лжеца.

Аналогия с функциями позволяет также прояснить, почему парадокс лжеца так похож на осмысленное утверждение. Можно взять произвольный набор слов, скажем "черный вчера наверно", и никто и не подумает спрашивать, истинно ли это "утверждение" или ложно. Но парадокс лжеца настолько похож на осмысленное утверждение, что такой вопрос задается. Дело же в том, что фраза "черный вчера наверно" просто синтаксически неверна, и этот "syntax error" легко определяется каким-то аналогом компилятора в нашем мозгу. Парадокс же лжеца содержит семантическую ошибку, т.е. ошибку времени выполнения, найти которую, как известно любому программисту, гораздо сложнее.

Блюстительница нравов

Мама рассказала следующую историю.

Когда она училась в школе, у нее была одна очень строгая учительница. Учительница имела славу блюстительницы нравов. Она тщательно следила, чтобы мальчики не приближались к девочкам ближе пионерского расстояния, от девочек же требовалась сугубая скромность в одежде. В частности, она требовала, чтобы девочки носили чулки даже летом. "Но ведь жарко!" - протестовали школьницы. "В школу с босыми ногами нельзя!" - отрезала учительница.

Лишь много лет спустя мама узнала, что все это время строгая учительница жила в гражданском браке с директором школы, который был старше ее более чем на 20 лет и оставил ради нее жену с тремя детьми. Они прожили вместе до самой его смерти, так и не поженившись, так как жена директора не давала ему развода.