Rating@Mail.ru
IPB
Etersoft - from Windows to Linux
Etersoft
решения для перехода
с Windows на Linux
Дружественные сайты: alv.me и Rus-Linux.net

Здравствуйте, гость ( Вход | Регистрация ) Поиск · 

> 

Приглашаем вас в jabber-конференцию о питоне на pythonua@conference.jabber.ru :)
Темы от студентов с запросами готовых решений по заданиям зарываются не глядя.

 
Reply to this topic Start new topic
> Расковырял тут smbnetfs, или смычка города и деревни (пингвина с флагом)
dimbor
bookmark
gyfbbdvkffmrljmmmwd
Feb 29 2016, в 02:45
Сообщение #1


Подвинутый участник
Иконка группы

Сообщений: 1348

Вставить имя   :   Цитата
Город: москва

Группа: ведущий рубрики

Автор темы
Данный поток сознания публикуется здесь, т.к. не соответствует тематике раздела "Терминальные решения", где из меня обычно прет. Решение-то терминальное, как обычно. Да только не в том смысле. В общем, другого места на форуме не нашел, приткну тут.

Началось все с констатации факта, что детская мечта идиота таки сбылась, и в квартире незаметно образовался компьютерный класс из железок жены, детей, кошки, и моих виртуалок. И все это временами приходится админить (приходишь с работы, а тут опять станки, станки... ©) Сидят они под MS, в отличие от. Домен на самбе поднят давненько, чтоб не разбегались. Захотелось беспроблемного доступа к ресурсам а ля "Сетевое окружение" в винде. Казалось бы, есть gvfs, который под xfce бодро все открывает. Но я то в основном в консольке под mc. Консольку конечно же люблю, но не настолько, чтобы по памяти постоянно шарашить "mount -t cifs <много разных букв>", когда там надо только один файл изменить. mc под дебианом собран без smb (потому что с ним нормально не работает). Если допилить, все равно на каждую шару будет каждый раз спрашивать и юзера, и пароль, и домен - неудобен. FAR - бессмысленно, вайн netbios не умеет.

В гугле накопал оный smbnetfs - монтирование всего мелкософтовского в родное дерево с браузингом, лаптой и монашками. Автор - отечественный, но сильно занятой, т.ч. беспокоить не стал. Под дебиан пакетик есть, и даже последняя версия из sid великолепно под wheezy собралась.

Поставил это дело, запустил по обильно найденным в интернете докам. Особенность - разве только, что /etc/smbnetfs.conf непонятно зачем туда кладется. Работает оно с конфигом из ~/.smb/smbnetfs.conf сотоварищи. Завелось с томозами и глюками. Пришлось расчехлить заржавевший напильник - потратить пару ночей на обработку.

Первая типично "самбовская" беда - поголовно исполняемые файлы. Игрища с параметром umask (от fuse) ожидаемо результатов не принесли. Снимать-то он биты снимает, да только у каталогов тоже, и не зайти в них нифига (привет, chmod *).

Патч отсюда не для этого, но пусть будет - каши маслом.

Значится, родил собственный патч. На самом деле наверное очередной "ugly hack", но работает:
Spoiler:
Код
--- function.c.orig     2016-02-28 23:59:29.000000000 +0300
+++ function.c  2016-02-29 00:01:05.976367809 +0300
@@ -402,6 +402,8 @@

        case SMBITEM_SMB_SHARE_ITEM:
            if (samba_stat(path, stbuf) != 0) return -errno;
+            if (S_ISREG(stbuf->st_mode))
+                stbuf->st_mode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
            return 0;

        default:
@@ -448,6 +450,8 @@
     }

     if (samba_fstat(fd, stbuf) != 0) return -errno;
+    if (S_ISREG(stbuf->st_mode))
+        stbuf->st_mode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
     return 0;
}


Далее, как одмин, поставил конечно в конфиге show_$_shares "true". Глючит и тормозит.
Установлено седующее: Как только от сервера прилетает "Device or resource busy" на что-то хитроввернутое типа pagefile.sys, оно так удивляется, что вмерает и до конца долистать каталог не может. Ну это ерунда. Не хочет - заставим.
Spoiler:
Код
--- smb_conn_srv.orig.c 2015-01-11 12:46:57.000000000 +0300
+++ smb_conn_srv.c      2016-02-28 23:14:02.264367809 +0300
@@ -470,6 +470,7 @@
            case EPERM:
            case EROFS:
            case ETXTBSY:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, OPEN, error, NULL, 0);
                return;
            default:
@@ -573,6 +574,7 @@
            case EAGAIN:
            case EINTR:
            case EISDIR:
+           case EBUSY:
                state->offset = (off_t) (-1);
                smb_conn_srv_send_reply(ctx, READ, errno, NULL, 0);
                return;
@@ -622,6 +624,7 @@
            case EIO:
            case ENOSPC:
            case EISDIR:
+           case EBUSY:
                state->offset = (off_t) (-1);
                smb_conn_srv_send_reply(ctx, WRITE, errno, NULL, 0);
                return;
@@ -807,6 +810,7 @@
            case ENAMETOOLONG:
            case ENOENT:
            case ENOTDIR:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, RENAME, errno, NULL, 0);
                free((char*)new_url);
                return;
@@ -827,6 +831,7 @@
            case ELOOP:
            case ENAMETOOLONG:
            case ENOTDIR:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, RENAME, errno, NULL, 0);
                free((char*)new_url);
                return;
@@ -1167,6 +1172,16 @@

     if (smbc_stat(url, &reply.stat) < 0){
        switch(errno){
+           case EBUSY:
+                DSRVPRINTF(ctx, 6, "errno=%d, %s; prepare fake reply to send.\n", errno, strerror(errno));
+               memset(&reply.stat, 0, sizeof(struct stat));
+                reply.stat.st_mode = S_IFREG;
+                reply.stat.st_nlink = 0;
+                reply.stat.st_uid = 0;
+                reply.stat.st_gid = 0;
+                reply.stat.st_size = 0;
+                reply.stat.st_blksize = 4096;
+               break;
            case EACCES:
            case ELOOP:
            case ENAMETOOLONG:
@@ -1201,6 +1216,16 @@

     if (smbc_fstat(state->fd, &reply.stat) < 0){
        switch(errno){
+           case EBUSY:
+                DSRVPRINTF(ctx, 6, "errno=%d, %s; prepare fake reply to send.\n", errno, strerror(errno));
+               memset(&reply.stat, 0, sizeof(struct stat));
+                reply.stat.st_mode = S_IFREG;
+                reply.stat.st_nlink = 0;
+                reply.stat.st_uid = 0;
+                reply.stat.st_gid = 0;
+                reply.stat.st_size = 0;
+                reply.stat.st_blksize = 4096;
+               break;
            case EACCES:
            case ELOOP:
            case ENAMETOOLONG:
@@ -1247,6 +1272,7 @@
            case EPERM:
            case EROFS:
            case ETXTBSY:
+           case EBUSY:
                state->offset = (off_t) (-1);
                smb_conn_srv_send_reply(ctx, FTRUNCATE, errno, NULL, 0);
                return;
@@ -1287,6 +1313,7 @@
            case ENOTDIR:
            case EPERM:
            case EROFS:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, CHMOD, errno, NULL, 0);
                return;
            default:
@@ -1321,6 +1348,7 @@
            case ENOENT:
            case EPERM:
            case EROFS:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, UTIMES, errno, NULL, 0);
                return;
            default:
@@ -1370,6 +1398,7 @@
            case ELOOP:
            case ENAMETOOLONG:
            case ENOTDIR:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, SETXATTR, errno, NULL, 0);
                return;
            default:
@@ -1418,6 +1447,7 @@
            case ELOOP:
            case ENAMETOOLONG:
            case ENOTDIR:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, GETXATTR, errno, NULL, 0);
                return;
            default:
@@ -1459,6 +1489,7 @@
            case ENAMETOOLONG:
            case ENOENT:
            case ENOTDIR:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, LISTXATTR, errno, NULL, 0);
                return;
            default:
@@ -1505,6 +1536,7 @@
            case ELOOP:
            case ENAMETOOLONG:
            case ENOTDIR:
+           case EBUSY:
                smb_conn_srv_send_reply(ctx, REMOVEXATTR, errno, NULL, 0);
                return;
            default:


Можно уже радоваться. Разве еще рекомендую поставить stat_workaround_enable_default_entries "false", т.к. этот механизм сделан кривовато. Консольке нипочем, а вот тот же Thunar на шарах с файлами-исключениями тупит не по детски, хотя должен ускоряться.
Картина почти аналогична предыдущему случаю. Ну да гейтс с ней.

И в заключение. Кто хочет пакетики с годнотой, общайтесь с мантейнерами сами. Себе то соберу, даже поделюсь. Но это будет неофициально и в репах само не появится.
Прикрепленные файлы
Прикрепленный файл  smbnetfs_patches.tar.gz ( 1.35 килобайт ) Кол-во скачиваний: 7
 
Go to the top of the page
 
+Quote Post
Bizdelnick
bookmark
gyfbbdvkffmrljmmmwd
Feb 29 2016, в 11:45
Сообщение #2


grammatikführer
Иконка группы

Сообщений: 12802

Вставить имя   :   Цитата

ОС: Debian GNU/Linux
Город: Санкт-Петербург

Группа: Модераторы разделов

Цитата(dimbor @ 29th February 2016 - в 02:45) *
Игрища с параметром umask (от fuse) ожидаемо результатов не принесли. Снимать-то он биты снимает, да только у каталогов тоже

dmask/fmask не работают?


--------------------
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Go to the top of the page
 
+Quote Post
dimbor
bookmark
gyfbbdvkffmrljmmmwd
Feb 29 2016, в 13:57
Сообщение #3


Подвинутый участник
Иконка группы

Сообщений: 1348

Вставить имя   :   Цитата
Город: москва

Группа: ведущий рубрики

Автор темы
dmask/fmask это, как я понимаю, аргументы командной строки mount.cifs. А сабж совместно с fuse юзает голый libsmbclient.h, да еще похоже в deprecated его части. Там нетути такого высокого уровня абстракции. Да и вообще, не через стакан на него смотреть чревато для душевного здоровья.
Go to the top of the page
 
+Quote Post
test666
bookmark
gyfbbdvkffmrljmmmwd
Feb 15 2017, в 21:02
Сообщение #4


Новичок
Иконка группы

Сообщений: 11

Вставить имя   :   Цитата

Группа: Участники

Огромное спасибо!

Два года пользовался smbnetfs 0.6.0, и терпел описанный вами глюк - когда после pagefile.sys отваливалось отображение оставшейся части каталога. Достало нереально. И вот, сегодня - дай, думаю, поищу рещение проблемы, и нашёл эту страницу. Патч супер, всё хоккей.

Причём до этого я пользовался smbnetfs 0.3.11a, и в нём такой проблемы не было.


А вот насчёт execute битов на каталоги - проблемы не ощущаю. Да, execute на каталоги не стоит, но в них заходит нормально.

Go to the top of the page
 
+Quote Post
dimbor
bookmark
gyfbbdvkffmrljmmmwd
Feb 15 2017, в 22:37
Сообщение #5


Подвинутый участник
Иконка группы

Сообщений: 1348

Вставить имя   :   Цитата
Город: москва

Группа: ведущий рубрики

Автор темы
Гут! Хоть кому-то понадобилось. А то чувствовал тут себя как невинная секретарша в окружении красноглазых чудовищ.
Go to the top of the page
 
+Quote Post

 Reply to this topic Start new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 19th October 2017 - в 02:56




Rating@Mail.ru