Pull to refresh

Samba и запрещенные символы

Reading time 3 min
Views 27K
Samba (самба) под Linux. Этот удивительный софт подарил линуксоидам возможность связи с миром Windows.
Помню то дивное чувство, когда в локальной сети появился мой первый самба-сервер. Эх, было время!

Но пост не об этом. Не по наслышке знаю, что многих раздражает ограниченная поддержка спец.символов в Windows. Но ведь это не повод отказываться от них, не так ли?

image

Подробности моих злоключений и (почти) счастливый финал под катом. Приступим!

Я увлекаюсь коллекционированием фильмов. Вначале они помещались на один диск и это было просто. Потом дисков стало больше, помогали бумажки и Excel. Но всему хорошему приходит конец и пришлось задуматься о создании полноценной базы данных. Одним из следствий такой разработки появились виртуальные папки/списки фильмов.

Позволю себе лирическое отступление. У самбы есть одна прекрасная фишка — работа с симлинками. И если эти симлинки не ведут на доступный ресурс, то они не видны. Это позволяет иметь директорию (и не одну), в которой каждая позиция, это симлинк на конкретное хранилище. Если диск подключен, то симлинк отображается как доступная директория. Если нет — то директория не отображается вовсе. По этой причине (а также по иным, не имеющим отношения к теме) уже много лет используется самба и подобные папки (видны как в плеерах, Windows, так и на линукс клиентах).

Однако эту идиллию разрушает то, что наличие, например, двоеточия, превращает прекрасную папку вида (здесь я намеренно вставил двоеточие, позже объясню почему выбран именно этот фильм): 2008 — Вавилон Н.Э. — Babylon: A.D. в такую: 2NIQRO~7

Что же делать?


Вначале я ошибочно смотрел в сторону опции монтирования mapchars. Но она на самом деле ничего не решала, причем она дополнительно могла приводить к странным именам файлов.

Я понимал что нужно искать что-то, что сможет заменять названия файлов на лету. Значит нужна автоподстановка. Но таких модулей все никак не находилось, либо они работали не так, как хотелось бы. За время поисков третья версия самбы стала стабильной. А в ней появились т.н. Stackable VFS modules, т.е. модули виртуальной файловой системы. Это было то, что я искал!

Однако нужного мне модуля все не находилось. Версия самбы из третьей превратилась в четвертую и я был близок к тому чтобы попытаться написать модуль самому (хотя знаком с системным программированием только отдаленно). Но непрекращающиеся поиски привели меня к модулю vfs_catia, который был создан для решения проблем с Catia CAD, также создающей названия с запрещенными символами, но делал именно то, что и требовалось. Полная его функциональность раскрывается с версии самбы 3.5.0 и далее. Я тестировал на версиях 4.1.x довольно продолжительное время.

Дальнейшее было делом техники. Используемая мной система — Debian — уже имеет пакет samba-vfs-modules, содержащий данный плагин. Он был установлен и настроена замена нелегальных символов их аналогами (конфиг файл: /etc/samba/smb.conf, секция [global]):

# 002: maps illegal symbols
# vfs_catia, removed default translations: 0x20:0xb1
# vfs_catia, list of special characters:
# Unix & replacement chars:
# 0x22: "  0xa8: ¨
# 0x2a: *  0xa4: ¤
# 0x2f: /  0xf8: ø (forbidden range, should never exists in names)
# 0x3a: :  0xf7: ÷
# 0x3c: <  0xab: «
# 0x3e: >  0xbb: »
# 0x3f: ?  0xbf: ¿
# 0x5c: \  0xff: ÿ (forbidden range)
# 0x7c: |  0xa6: ¦
# 0x20:    0xb1: ±
vfs objects = catia
catia:mappings = 0x22:0xa8,0x2a:0xa4,0x2f:0xf8,0x3a:0xf7,0x3c:0xab,0x3e:0xbb,0x3f:0xbf,0x5c:0xff,0x7c:0xa6


Я добавил комментарии для себя, чтобы понимать какие символы заменяются на их визуальные аналоги. Надеюсь, это будет полезным не только мне.

Счастливый финал


После добавления кода перегружаем демона самбы и магия в действии:
2015 — Терминатор÷ Генезис — Terminator Genisys

Стоит отметить что замены работают в обоих направлениях, т.е. работа с одним и тем же файлом идет прозрачно и без порчи оригинального имени в системе. Хотя если постараться, то можно, меняя, символ на один из обычных. Но в моем примере такого нет.

Теперь напомню почему в качестве первого примера я выбрал фильм Вавилон Н.Э… Дело в том, что точка в конце названия файла или директории в файловой системе Windows недопустима. Поэтому-то 2008 — Вавилон Н.Э. — Babylon A.D. все равно показывается как 2XJW59~H
Это и есть та самая ложка дёгтя, в большой бочке мёда. Пока я не знаю как заменить точку в конце, а не все точки подряд и буду благодарен всем, кто откликнется и поможет закрыть последний элемент мозаики.

Спасибо за внимание и да пребудет с вами Сила!
Tags:
Hubs:
+19
Comments 33
Comments Comments 33

Articles