red_dragon 26.04.2011 01:46

How-to`sМонтирование сетевых ресурсов в зависимости от имени точки доступа WI-FI

В последнее время, как и многие наверное, я отдаю предпочтение портативному компьютеру (читай ноутбуку) перед стационарным.

Соответственно, таскаю его с собой из дома на работу и обратно. И дома и на работе имеются определённые сетевые ресурсы, в виде каталогов и принтеров, которые время от времени приходится использовать. Тут необходимо отметить, что сетевые каталоги расшарены по NFS, ибо в моём конкретном случае NFS показывает большую скорость обмена данными нежели SMB, но речь не об этом. Просто NFS ресурсы нельзя примонтировать средствами DM, просто найдя их в сетевом окружении. Соответственно, необходимо заранее озаботитися монтированием означенных ресурсов. Мало того, что бы не загромождать каталог монтирования лишними вложенными каталогами, логично монтировать схожие по назначению домашние и рабочие ресурсы в одни и те же каталоги.

Какое-то время я использовал для монтирования ресурсов соответствующие скрипты, которые запускал в ручную, по мере необходимости. Однако такое положение вещей всё меньше меня устраивало. Хотелось, что бы не приходилось задумываться о том смонтирован ли нужный ресурс или нет. Возможностей смонтировать сетевой каталог существует много. Я рассмотрел разные варианты от Automount до собственного демон-скрипта. Однако в итоге нашёл наиболее приемлемое для себя решение.

Как оказалось, NetworkManager при изменении состояния интерфейсов выполняет скрипты, расположенные в каталоге /etc/NetworkManager/dispatcher.d. Туда я и запихал собственный, под именем 11-nfsmount. Имя как выяснилось, большого значения не имеет. Т.е. выполняются абсолютно все скрипты расположенные в означенном каталоге. С этим же свойством связан и подводный камень, на который я наступил. Дело в том, что многие текстовые редакторы любят оставлять бэкапы редактированных файлов. Так вот, в данном случае, необходимо запретить такое поведение, либо удалять созданный бэкап вручную, иначе он будет выполняться наряду с отредактированным скриптом. Кроме монтирования NFS каталогов, я добавил в скрипт выбор принтера по умолчанию для дома и работы соответственно. Мелочь вроде бы, а весьма удобно. Пример скрипта приведён ниже.
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/bin/sh

###########################################################################
# Пример скрипта монтирования ресурсов в зависимости от имени Wi-Fi точки #
###########################################################################

# В качестве параметра $1 скрипту передаётся имя интерфейса,
# но поскольку меня интересует только wlan0, то этот параметр не используется.
# В качестве параметра $2, передаётся состояние интерфейса.
# Вот оно то как раз важно.

# Определение ssid точки доступа
ssid=`/sbin/iwconfig wlan0 | grep 'ESSID' | awk '{print $4}' | sed -s 's/ESSID://'`

# IP адреса серверов:
home_ip=192.168.5.8
work_ip=ххх.ххх.ххх.ххх

# MAC адреса соответствующих интерфейсов:
home_mac=00:11:22:33:44:55
work_mac=00:66:77:88:99:aa

# Действия при отключении интерфейса:
if [ "$2" = "down" ]; then
# Размонтирование сетевых ФС
# (для NFS нужно делать обязательно, иначе компьютер не уходит в спящий режим):
umount /media/shared
umount /media/media
fi

# Действия при подключении интерфейса:
if [ "$2" = "up" ]; then

case $ssid in

'"Home"')
# Именно так, в двойных кавычках. Можно конечно ещё поковыряться с sed и awk,
# что бы убрать оные. Однако работает и так нормально, решил не трогать.

# Определяем или не определяем MAC:
mac=`arp -a| grep "$home_ip" | awk '{print $4}'`

# Если MAC соответствует IP, то монтируем, выбираем и т.д.:
if ["$mac" = "$home_mac"]; then
# Монтирование сетевых ресурсов:
mount -t nfs $home_ip:/volume1/public /media/shared
mount -t nfs $home_ip:/volume1/media /media/media

# Выбор принтера по умолчанию:
echo "Default epson_c87" > /home/vasya/.cups/lpoptions
chown vasya:vasya /home/vasya/.cups/lpoptions
fi
;;

'"II-428a"' | '"II-415"')
mac=`arp -a| grep "$work_ip" | awk '{print $4}'`
if ["$mac" = "$work_mac"]; then
mount -t nfs $work_ip:/home/shared /media/shared
mount -t nfs $work_ip:/home/multimedia /media/media

echo "Default HP-LaserJet-P2015" > /home/vasya/.cups/lpoptions
chown vasya:vasya /home/vasya/.cups/lpoptions
fi
;;

esac

fi



Вместо вывода.
Безусловно, это довольно частное решение частной же проблемы. Однако решение интересное и довольно лаконичное, на мой взгляд. Надеюсь кому-нибудь окажется полезным.

З.Ы.: Возможно пост несколько избыточен, однако я старался излагать последовательно, начиная с сути проблемы. Буду рад конструктивной критике/предложениям.

UPD: Как справедливо заметил abyss, существует не нулевая вероятность случайного совпадения ssid "своей" и "чужой" точки доступа. В связи с чем было предложено выполнять проверку соответствия MAC адресов. Руководствуясь этими соображениями, слегка поправил пример скрипта.

UPD1: Для справки. На данный момент, этот скрипт работает на двух ноутбуках под Fedora 14 + KDE 4.6.2.

UPD2: К сожалению, на данный момент нотификация почему то не работает (может это исключительно моя проблема), поэтому на комментарии отвечаю не сразу.


Тэги: монтирование скрипт
+ 19 -
Похожие Поделиться

exelens 26.04.2011 11:31 #
Пост отличный, я только кат добавил
red_dragon 26.04.2011 13:08 #
Спасибо. С ходу не разобрался как кат добавить. Теперь понял.
cppmm 26.04.2011 14:21 #
Нормальное решение в плане логики.
Я поступаю похожим образом, только вместо NM использую mapping в interfaces(справедливо для debian).
dr_magnus 26.04.2011 16:28 #
а подробности можно?
cppmm 27.04.2011 00:29 #
Вот здесь я описывал, как использовать mapping для автоподключения wi-fi. Точно так же и монтирование работает(у меня оно по sshfs идёт).
abyss 27.04.2011 08:23 #
А что произойдет когда вы придете в гости к другу, у которого такой же ssid = "Home" ? Я намекаю на то что желательно еще mac проверять.

Хотя я в своё время по другому делал, домашний DHCP сервер выдает свой параметр (из неиспользуемой области) А клиент получив такой параметр монтирует ресурсы. Не получив соответственно не монтирует :) Но потом перешел на automount.
cppmm 27.04.2011 11:51 #
А что произойдет когда вы придете в гости к другу, у которого такой же ssid = "Home" ? Я намекаю на то что желательно еще mac проверять.

Вот у меня как раз по маку идёт.
Но идея с dhcpd - это круто. Спасибо за наводку.
red_dragon 27.04.2011 18:06 #
Да, риск не уникальности ssid конечно есть, однако обычно те кто осиливает сменить название своей точки доступа на отличное от заводского способен проявить фантазию в выборе. "Home" - это просто пример. Тем не менее Ваше замечание весьма резонно, и его надо учитывать.
antigluk 27.04.2011 10:58 #
Использую такой-же скрипт для файлового сервера в общаге, если в общаге то монтирую по локалке, иначе по внешнему IP. Единственное, с чем пока не разбирался - что подмонтировать можно без авторизации.
Self-Perfection 30.04.2011 09:22 #
ssid=`/sbin/iwconfig wlan0 | grep 'ESSID' | awk '{print $4}' | sed -s 's/ESSID://'`

ssid=`/sbin/iwconfig wlan0 | awk '/ESSID/{print $4}' | sed -s 's/ESSID://'`
knicefire 30.04.2011 11:07 #
пользовался подобным скриптом на своей машине, но через некоторое время отключил т.к. время перехода в спящий режим очень значительно выросло. Я так подозреваю это было из-за невозможности отмонтировать ресурс в виду того что какая-то програмулька пользовалась удаленным ресурсом, либо был открыт файл... в результате решил для себя что подмонтировать по необходимости проще чем выяснять почему комп не уходит в сон.
red_dragon 06.05.2011 06:04 #
Я так подозреваю это было из-за невозможности отмонтировать ресурс в виду того что какая-то програмулька пользовалась удаленным ресурсом, либо был открыт файл


На удивление, с такой проблемой не столкнулся, хотя и ожидал чего-нибудь подобного.

з.ы.Ж Fedora 14 + KDE 4.6.2
Shihad 05.05.2011 16:17 #
Как я понимаю, для самбы все аналогично. Спасибо за скрипт.
red_dragon 06.05.2011 06:07 #
По идее для самбы аналогично. Поэтому будет интересно, если Вы отпишетесь о результатах применения этого метода для монтирования по SMB протоколу.
fenume 08.05.2011 09:30 #
зачем вообще вручную монтировать если есть autofs которая сама монтирует доступные в данный момент нфс-шары?
red_dragon 08.05.2011 15:22 #
А Вы пост читали или только название?
fenume 08.05.2011 15:57 #
естественно читал, но из всего скрипта можно оставить только часть с переключением принтеров(к сожалению не сталкивался, возможно и она не нужна). NFS в автофс почти не уступает самбе по удобству доступа, достаточно прописать в/etc/hosts айпишки nfs-серверов и раскоментить одну строку в конфиге(/net -hosts,добавив параметр --ghost). после этого доступные шары будут автоматом создаватся в файловой системе(/net/servername/sharetree), а недоступные удалятся.
Если не ошибаюсь сделано оно за счет команды showmount -e serverip
red_dragon 11.05.2011 10:55 #
Расскажите пожалуйста, как посредством autofs смонтировать два разных сетевых ресурса Server1:/volume1/public и Server2:/home/shared в каталог /media/shared ноутбука, в зависимости от того к какой локальной сети он подключен.
fenume 13.05.2011 03:09 #
хорошо, чтобы не быть голословным я на днях дома смоделирую ситуацию и проверю как себя поведет автофс при монтировании разных серверов в одну папку.
Тотже способ который я описал выше автоматом примонтирует папки так:
/net/homeserver/exports
/net/workserver/exports
где homeserver/workserver имена серверов которые вы вписали себе в /etc/hosts, а exports путь к доступной шаре. Монтироватся будет только то что в данный момент доступно, тоесть как положено доманий сервер - дома, рабочий - на работе. ну а чтобы не лазить каждый раз в фс, вы конечно можете создать закладки или симлинки. Также можно указать таймаут по которому шары будут отмонтироватся если ими не пользуются, но они будут примонтированы сразуже как только вы попытаетесь зайти в "шару".

В итоге доступ к расшаренным данным прост, а запускать скрипт каждый раз не нужно.