воскресенье, 18 августа 2013 г.

Samba (smb)

UCI configuration options

The UCI configuration file is located at /etc/config/samba

Common Options

The config section type samba determines values and options relevant to the overall operation of samba. The following table lists some (not all) available options, their default value and respectively a short characterization. See http://*** for further details.
These are the default settings for the common options:
config 'samba'
        option 'name' 'openwrt'
        option 'workgroup' 'WORKGROUP'
        option 'description' 'openwrt'
        option 'homes' '1'
NameTypeRequiredDefaultOptionDescription
namestringyes?openwrtName of the Server
workgroupstringyes?WORKGROUPName of the Workgroup
descriptionstringyes?openwrtDescription of the Server
homesbooleanyes?1Share the user directory

Sambashare

The daemons are up and running and recheable via NetBIOS. Now you only need to configure the directories you intend to make accesible to users in your LAN. This example assumes you attached a USB harddisk to the USB-Port and correctly mounted a partition. You can now choose to share the partition as a whole, or just individual directories on it. Fo each entry you need to create an individual config 'sambashare' section.
config 'sambashare'
        option 'name' 'Shares'
        option 'path' '/mnt/sda3'
#       option 'users' 'sandra'
        option 'guest_ok' 'yes'
        option 'create_mask' '0700'
        option 'dir_mask' '0700'
        option 'read_only' 'yes'
NameTypeRequiredDefaultOptionDescription
namestringyes(none)Name of the entry. Will be shown in the filebrowser.
pathfile pathyes(none)The complete path of the directory
usersstringno(none)the samba-users allowed access to this entry; use smbpasswd to create a user-pwd combination! Several users can be specified, separated by a coma (ex : option 'users' 'root,nobody' ).
guest_okstringyesnoSpecifies if you need to login via samba-username and password to access this share
create_maskintegeryes0700chmod mask for files created (need write access)
dir_maskintegeryes0700chmod mask for directories created (need write access)
read_onlybooleanyesnono allows for read/write, else only read access is granted; (for rw, you also need to mount fs rw!)

Additional Configuration Options

In addition to the UCI file (/etc/config/samba), modifications can be made to the /etc/samba/smb.conf.template file.

Configuration examples

Samba can be configured at either share level access or user level access. At share level access all users on the network can access the share, and all files are shared with all users. At user level access a username and password are needed to access the share. By default Samba is configured for user level access.
These configurations have proven to work for some:

Share level access

At share level access all users on the network can access the share, and all files are shared with all users. To set share level access change security = user tosecurity = share in /etc/samba/smb.conf.template:
[global]
 netbios name = |NAME| 
 workgroup = |WORKGROUP|
 server string = |DESCRIPTION|
 syslog = 10
 encrypt passwords = true
 passdb backend = smbpasswd
 obey pam restrictions = yes
 socket options = TCP_NODELAY
 unix charset = ISO-8859-1
        local master = yes
 preferred master = yes
 os level = 20
 security = share
 guest account = nobody
 invalid users = root
 smb passwd file = /etc/samba/smbpasswd
Then add a share to /etc/config/samba. Make sure that guest ok is set to yes
config 'samba'
 option 'name' 'openwrt'
 option 'workgroup' 'WORKGROUP'
 option 'description' 'openwrt'
 option 'homes' '1'

config 'sambashare'
 option 'read_only' 'no'
 option 'create_mask' '0700'
 option 'dir_mask' '0700'
 option 'name' 'name-of-share'
 option 'path' '/path/of/share'
 option 'guest_ok' 'yes'
This share should now be accessible by \\ip-adress-openwrt\name-of-share (windows, username and password can be anything).

User level access

At user level access a username and password are needed to access the share.
Steps:

1. Add user to system

To access a samba share with user level access there must be a user added to the system. Edit /etc/passwd and add a line for the new user. Choose a user id (the first number in the line) of 1000 or higher that does not exist yet. Set the group identification number (the second number) to the same number as the user nobody. Copy the rest.
root:!:0:0:root:/root:/bin/ash
nobody:*:65534:65534:nobody:/var:/bin/false
daemon:*:65534:65534:daemon:/var:/bin/false
newuser:*:1000:65534:newuser:/var:/bin/false
Note: keep in mind that the user(s) and group(s) utilized by Samba need to have the proper permissions for their shares, i.e. they need write access in order to write via smb.

2. Add samba password to user

smbpasswd -a newuser

3. Change samba config to accept users with null passwords

Edit /etc/samba/smb.conf.template and add null passwords = yes:
[global]
 netbios name = |NAME| 
 workgroup = |WORKGROUP|
 server string = |DESCRIPTION|
 syslog = 10
 encrypt passwords = true
 passdb backend = smbpasswd
 obey pam restrictions = yes
 socket options = TCP_NODELAY
 unix charset = ISO-8859-1
        local master = yes
 preferred master = yes
 os level = 20
 security = user
 null passwords = yes
 guest account = nobody
 invalid users = root
 smb passwd file = /etc/samba/smbpasswd

4. Add a share

Then add a share to /etc/config/samba. Make shure that guest ok is set to no
config 'samba'
 option 'name' 'openwrt'
 option 'workgroup' 'WORKGROUP'
 option 'description' 'openwrt'
 option 'homes' '1'

config 'sambashare'
 option 'read_only' 'no'
 option 'create_mask' '0700'
 option 'dir_mask' '0700'
 option 'name' 'name-of-share'
 option 'path' '/path/of/share'
 option 'guest_ok' 'no'
This share should now be accessible by \\ip-adress-openwrt\name-of-share (windows, correct username and password are needed).

Notes

If you use a trunk version and experience connection aborts take a look at this file /etc/samba/samba.conf.template and search for reset on zero vc = yesRemove this line or set it to no.
More information about this issue here: https://dev.openwrt.org/ticket/9992
doc/uci/samba.txt · Last modified: 2013/08/14 10:28 by dylanweber

Включение чего угодно по HTTP без заморочек c OpenWRT

Включение чего угодно по HTTP без заморочек c OpenWRT из песочницыtutorial


В комментариях к статье об опыте изготовления «интернет розетки» мое внимание привлекли два комментария. Один, в котором утверждалось, что такая штука, по сути, бесполезна, показался мне несправедливым — хорошо помню, как мне однажды понадобилось, например, дистанционно «ресетить» одну хитрую штучку и думаю, что я не одинок. А вот идея о том, что можно решить подобный вопрос проще и дешевле, использовав, например, TP-LINK TL-MR3020 + OpenWRT показалась мне дельной. Я решил к тому же обойтись без разборки устройства, программирования и микроконтроллеров — короче, сделать решение как можно доступнее. И у меня это почти получилось!

В качестве устройства вывода используем обычную клавиатуру USB. Встречая в супермаркетах клавиатуры отвратительного качества по смешным ценам, я всегда удивлялся — для чего же она может понадобиться? Да вот же для чего! В клавиатуре три светодиода, которыми можно программно управлять с любого устройства, эту клавиатуру поддерживающего. Заменив светодиоды цепью управления — получаем управление тремя нагрузками. В качестве бонуса – возможность дальнейшей доводки устройства для использования как устройства ввода. Конечно, можно не стрелять из пушки по воробьям, собрать (или приобрести) простейшее устройство на микроконтроллере, у которого будут неосопоримые преимущества (большее количество входов/выходов, нормальные логические уровни и т.п.). Но у «клавиатурного» подхода тоже есть плюсы — он доступен людям, незнакомым с МК, не имеющим программатора. Можно просто взять и сделать работающее устройство сегодня, сейчас. Кроме этого, среди плюсов:
  • решение легко переносимо на другие платформы: я не проверял, но в теории это можно воткнуть в любой «ASUS» или «D-Link», мирно раздающий инет из своего угла (если у него есть USB) — и будет работать;
  • роутер при этом можно использовать по прямому назначению;
  • не требуется разборки роутера и вмешательства в его схему (а TL-MR3020, кстати, нелегко разобрать);
  • не тебуется программирования (если не считать программой небольшой шелл-скрипт) и компиляции;
  • все компоненты можно приобрести в компьютерном магазине (это если просто «помигать светодиодом», для реального управления придется купить пару доступных радиокомпонентов), при этом общие затраты составят менее 1500 рублей.

Ставим OpenWRT и настраиваем сетевой интерфейс

Для этого шага понадобится, собственно, роутер. Мой мне обошелся в 850р.
Страница модели на openwrt.org дает исчерпывающие инструкции по перепрошивке и разрешает нам пользоваться снэпшотом транка. Сам же робко предложу взять бету Attitude Adjustment 12.09. Тем более, что на момент публикации снэпшоты недоступны на сайте openwrt, а A.A.12.09 наконец-то выложили.
Установка состоит из нескольких элементарных операций:

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

Подключение клавиатуры и проверка управления светодиодами

Сайт H-WRT информирует нас, что для установки клавиатуры нужен лишь модуль kmod-usb-hid.
Установим его:
opkg update
opkg install kmod-usb-hid

Самое время подключить клавиатуру и посмотреть, опозналась ли она:
root@OpenWrt:~# dmesg | tail
[   66.380000] hub 1-0:1.0: connect-debounce failed, port 1 disabled
[   68.780000] hub 1-0:1.0: connect-debounce failed, port 1 disabled
[   71.180000] hub 1-0:1.0: connect-debounce failed, port 1 disabled
root@OpenWrt:~# 

Облом! это совсем не то, что я ожидал. В чем же дело?
Схожий багрепорт быстро находится — разработчики объясняют такое поведение аппаратными ограничениями примененного чипсета. Похоже, находящийся «на борту» USB-хаб не жалует low-speed устройства. Хотя на этом моменте дух Дзен бесследно испарился — не будем опускать руки и попробуем решить проблему подключением клавиатуры через внешний USB-хаб:
root@OpenWrt:~# dmesg | tail
[  143.120000] usb 1-1: new high-speed USB device number 2 using ehci-platform
[  143.270000] hub 1-1:1.0: USB hub found
[  143.270000] hub 1-1:1.0: 4 ports detected
[  143.580000] usb 1-1.2: new low-speed USB device number 3 using ehci-platform
[  143.730000] input: Generic USB Keyboard as /devices/platform/ehci-platform/usb1/1-1/1-1.2/1-1.2:1.0/input/input0
[  143.730000] generic-usb 0003:040B:2000.0001: input: USB HID v1.10 Keyboard [Generic USB Keyboard] on usb-ehci-platform-1.2/input0
[  143.770000] input: Generic USB Keyboard as /devices/platform/ehci-platform/usb1/1-1/1-1.2/1-1.2:1.1/input/input1
[  143.780000] generic-usb 0003:040B:2000.0002: input: USB HID v1.10 Mouse [Generic USB Keyboard] on usb-ehci-platform-1.2/input1
root@OpenWrt

Гораздо лучше. Пускай из-за этого пришлось написать «почти получилось» в начале статьи и «способ сервировки» на фото, но так наша «Generic USB Keyboard» опозналась. На клавиатуру всегда создается два «устройства», но даже и не спрашивайте, почему эта конкретная клавиатура назвалась еще и мышью… Так или иначе — мы готовы к «аппаратному хеллоуворлду» — включить светодиод.
cat /dev/input/event0 > /dev/null &
printf "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x01\x00\x00\x00\x01" > /dev/input/event0

Здесь должен торжественно зажечься светодиод «Caps Lock». Те, кого просто радует этот факт — могут переходить к следующему шагу. Те, кто не может двинуться дальше, не узнав, что за бредовое заклинание приведено выше — заглядывают в
сумбурные пояснения:

Скрипт

Чтобы автоматизировать управление светодиодами нам нужен скрипт. Для того, чтобы на следующем шаге мигать ими по HTTP — сразу положим его в папку /www/cgi-bin:
cd /www
mkdir cgi-bin
cd cgi-bin
wget http://etherelay.googlecode.com/files/ctlrelay
chmod +x ctlrelay

Вот его текст и описание:

Теперь управлять светодиодами легко. Чтобы включить, скажем, светодиод «Scroll Lock», пишем:
./ctlrelay scroll_on

Выключаем:
./ctlrelay scroll_off

Можно еще «мигнуть» (scroll_pulse). Как говорит уже многими здесь уважаемый Anant Agarwal: «I could do this all day. This is so much fun!». Но все же, перейдем к следующему этапу и создадим…

Веб-интерфейс

Какой же веб-интерфейс без веб-сервера? Проверим его наличие:
opkg status uhttpd

Если в выводе есть строка Status: install user installed (а это будет так, если вы используете Attitude Adjustment 12.09 beta) то сервер уже установлен. Иначе установим его и настроим его запуск:
opkg update
opkg install uhttpd
/etc/init.d/uhttpd enable
/etc/init.d/uhttpd start

Дальше нам нужна веб-страница:

Маленький нюанс — браузер, конечно, не имеет доступа к папке /var на сервере, поэтому предоставим ему возможность прочитать файл ledstate оттуда, куда он «дотягивается», с помощью симлинка:
ln -s /var/ledstate /www/ledstate

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

Схема

Уже можно разобрать клавиатуру и вытащить из нее плату:

Схему включения светодиодов клавиатуры представим следующей (весьма упрощенной) моделью (для включенного состояния):
схема включения светодиодов клавиатуры
Схема 1. Включение светодиода клавиатуры
Три проверенных «клавы» из «помоечного» сегмента имели именно такое включение светодиодов, отличаются только их токи — обычно около 18мА, но бывает и 3мА. Надо иметь ввиду, что возможны и другие схемы.
Самое простое — если необходимо коммутировать небольшое напряжение и ток (дистанционный «Reset» какого — либо устройства или эмуляция других кнопок/логических сигналов). Можно обойтись обычной оптопарой:
схема подключения оптопары к клавиатуре для управления логическими уровнями
Схема 2. Формирование логического сигнала
Для управления устройством с питанием от сети берем твердотельное реле:
схема включения твердотельного реле вместо светодиода клавиатуры
Схема 3. Управление твердотельным реле
Я использовал отечественнное реле К293КП13П из-за цены в 170 рублей. Максимальный ток в нагрузке, на которое оно рассчитано — 1А. Ток через управляющий светодиод не должен быть ниже минимального (в документации он обозначается IFmin) для используемого типа реле. Если плата клавиатуры дает меньший ток (отпаяйте один вывод светодиода и измерьте ток в разрыве) — поможет дополнительный транзисторный ключ:
включение твердотельного реле через транзисторный ключ.
Схема 4. Подключение твердотельного реле через ключ
Он же спасет, если используется твердотельное реле, управляемое напряжением или «классическое» электромеханическое реле:
схема подключения реле вместо светодиода клавиатуры
Схема 5. Управление электромеханическим реле
Твердотельное реле — штука достаточно дорогая, и чем мощнее — тем дороже. Обычное реле дает больше «ампер на рубль», но имеет свои минусы. Среди них — большой потребляемый ток во включенном состоянии. Если одновременно включить три реле такой же модели, как на схеме — потребляемый от USB ток будет составлять почти 300 мА. Если не хотите так сильно «доить» порт — подключайте эмиттер не к нему (пунктирная линия на схеме), а к независимому источнику.
Схемы 4 и 5, само собой, работают только на клавиатурах где СД включены именно по схеме с «общим анодом» (проверьте сопротивление между анодами диодов и «плюсом» платы — должно быть 0 Ом). Если неохота с этим заморачиваться — можно использовать вместо ключа маломощное оптореле. Включается вместо штатного светодиода и работает при токе на светодиод от 5 до 25 мА, то есть подойдет для всех вариантов клавиатур с вероятностью 99%. Если вам надо коммутировать напряжение до 60 в и ток до 300 мА — можно убрать реле и пользоваться оптореле напрямую.
схема подключения реле вместо светодиода клавиатуры
Схема 6. Управление электромеханическим реле при помощи оптореле
В схеме и ее реализации много упрощений:
Что всегда стоит принимать в расчет — это элементарая электробезопасность. Даже тестовое устройство — особеннотестовое устройство, которое наверняка будет болтаться где-нибудь на проводках или будет забыто включенным среди прочего хлама на столе — надо защитить от случайного касания токоведущих частей, если оно предусматривает подключение к сети. Иначе по вам может потечь абсолютно реальный электрический ток.
Я собрал варианты 3 и 6 на макетке, получилось так:

Несмотря на то, что это не более чем «proof of concept», мне захотелось хоть немного «навести красоту», пускай и в собственной извращенной трактовке. Такие уж нынче времена: внешний вид ценится не меньше, а порой и беспричинно больше функциональной нагрузки. Что и приводит нас к следующему этапу.

Косметика и демонстрация

От HTML — интерфейса за километр несет ботанщиной, байковыми рубашками с катышками и макаронами из стеклянной банки:

Попытаемся это хоть как-то скрасить.
  1. Так как художественные способности у меня на нуле, а вкус где то рядом с ними — идею я стырил отсюда я почерпнул вдохновение (и немного css) здесь: http://www.seanslinsky.com/demo/ios-toggle-switches/.
  2. С помощью генератора градиентов mudcu.be/bg сделал нескучные обои задник.
  3. Генератор «клевых тумблерков» proto.io/freebies/onoff/ создает кнопки, которые работают почти во всех браузерах — даже в Опере, если сделать их квадратными, и даже в IE, если он >=9.
  4. Так как на разных системах по разному работает увеличение — делаем кнопки масштаба внутри страницыdavidwalsh.name/change-text-size-onclick-with-javascript

CSS не имеет смысла приводить, потому что на 90% сгенерирован автоматически, а HTML — на 90% повтор вышеприведенного. Поэтому просто пишу как из скачать:
cd /www
mkdir luci
mv index.html luci
wget http://etherelay.googlecode.com/files/index.html
wget http://etherelay.googlecode.com/files/style.css

Вторая и третья строчка «перепрятывают» файл веб-интерфейса роутера (если он установлен) в отдельную папку, теперь он доступен по адресу _адрес_роутера_/luci. А «главной» страничкой, доступной по адресу сервера, становится наша.
Ну и, напоследок — говорят, что картинка стоит тысячи слов. В этом видео почти тысяча картинок. Надеюсь, оно хоть как-то уравновесит мою многословность.
Update: nm11 подсказал, как добавить авторизацию на веб-сервер (например, с логином wizard и паролем lumos ):
uci set uhttpd.main.config=/etc/httpd.conf
uci commit uhttpd
echo "/:wizard:lumos" > $(uci get uhttpd.main.config)
/etc/init.d/uhttpd restart


Установка Transmission в openwrt на примере роутера

Установка программы Transmission на роутер позволит загружать торренты при выключенном компьютере, что очень удобно, когда нужно много качать и раздавать, когда хочется тишины ночью, либо возможно у вас узкий интернет-канал и вам нужна круглосуточная загрузка, либо у вас просто чешутся руки.... Я для этих целей использую замечательный роутер wr703n и в итоге за скромные 23у.е получаю практически полноценное сетевое хранилище (NAS) стоимостью 100у.е.
Итак по пунктам:

1.Устанавливаем openwrt на флешку

2.Устанавливаем поочередно сам демон transmission, интерфейс командной строки, web интерфейс и интерфейс удаленного доступа.

Обязателен к установке демон и один из видов интерфейса, но что бы не заморачиваться, ставим все.
opkg update
opkg install transmission-daemon
opkg install transmission-cli
opkg install transmission-web
opkg install transmission-remote

3.Создаем каталог transmission (вы можете обозвать его как угодно) для загрузки файлов.

mkdir /home/transmission
mkdir /mnt/hdd/transmission
Настоятельно рекомендуется для торрентокачалки использовать внешний usb hdd, т.к. у флешки ограниченное количество записи и перезаписи. Есть мнение, что при активном использовании она проживет примерно пол года, хотя я лично не проверял, все время подключал hdd.

4.Редактируем файл настроек /etc/config/transmission

nano /etc/config/transmission
 config transmission
    option enabled 1
    option config_dir '/etc/transmission'
    #option user 'nobody'
    option alt_speed_down 50
    option alt_speed_enabled false
    option alt_speed_time_begin  540
    option alt_speed_time_day 127
    option alt_speed_time_enabled false
    option alt_speed_time_end 1020
    option alt_speed_up 50
    option bind_address_ipv4 '0.0.0.0'
    option bind_address_ipv6 '::'
    option blocklist_enabled false
    option blocklist_url ''
    option cache_size_mb 2
    option dht_enabled true
    option download_dir '/home/transmission/done'
    option download_queue_enabled true
    option download_queue_size 4
    option encryption 1
    option idle_seeding_limit 30
    option idle_seeding_limit_enabled false
    option incomplete_dir '/home/transmission/incomplete'
    option incomplete_dir_enabled false
    option lazy_bitfield_enabled true
    option lpd_enabled false
    option message_level 1
    option peer_congestion_algorithm ''
    option peer_limit_global 240
    option peer_limit_per_torrent 60
    option peer_port 51413
    option peer_port_random_high 65535
    option peer_port_random_low 49152
    option peer_port_random_on_start false
    option peer_socket_tos 'default'
    option pex_enabled true
    option port_forwarding_enabled true
    option preallocation 1
    option prefetch_enabled true
    option queue_stalled_enabled true
    option queue_stalled_minutes 30
    option ratio_limit 2.0000
    option ratio_limit_enabled false
    option rename_partial_files true
    option rpc_authentication_required false
    option rpc_bind_address '0.0.0.0'
    option rpc_enabled true
    option rpc_password ''
    option rpc_port 9091
    option rpc_url '/transmission/'
    option rpc_username ''
    option rpc_whitelist '127.0.0.1,192.168.1.*'
    option rpc_whitelist_enabled true
    option scrape_paused_torrents_enabled true
    option script_torrent_done_enabled false
    option script_torrent_done_filename ''
    option seed_queue_enabled false
    option seed_queue_size 10
    option speed_limit_down 100
    option speed_limit_down_enabled false
    option speed_limit_up 20
    option speed_limit_up_enabled false
    option start_added_torrents true
    option trash_original_torrent_files false
    option umask 18
    option upload_slots_per_torrent 14
    option utp_enabled true
    option scrape_paused_torrents true
    option watch_dir_enabled false
    option watch_dir ''
Здесь жирным я выделил пункты на которые обязательно нужно обратить внимание
option enabled 1 - включаем transmission
option config_dir  '/etc/transmission' - изменяем место хранения настроек, а то по умолчанию они хранятся во временной папке и после перезагрузки затераются
option download_dir '/home/transmission/done' - каталог полностью загруженных файлов
option incomplete_dir '/home/transmission/incomplete' - каталог хранения недозагруженных файлов
option rpc_whitelist '127.0.0.1,192.168.1.*' - задаем список ip, которые имеют доступ к интерфейсу transmission. Через запятую можно добавить внешний ip например.
Также мне были интересны пункты
option rpc_username '' и option rpc_password '' - в их можно задать логин и  пароль на доступ к интерфейсу. Например это будет полезно если вы хотите удаленно с работы загрузить на домашний роутер какой-нибудь фильм и прийдя домой сразу приступить к его просмотру. В этом случае не забываем открыть порт 9091.
Остальные опции не описываю, т.к. без них заработает и их можно будет поменять через Transmission Remote GUI в его удобном графическом интерфейсе. Как это сделать я опишу ниже.

5.Добавляем transmission в автозагрузку если нужно

/etc/init.d/transmission enable

6.Стартуем transmission

/etc/init.d/transmission start 
После первого запуска в папке /home/transmission будут созданы каталоги done и incomplete, в них будут хранится еще не загруженные и уже загруженные файлы.
Если все прошло нормально, то в браузере по адресу http://ip-роутера:9091 загрузится веб интерфейс transmission

7. Использование программы удаленного доступа Transmission Remote GUI.

Данная программа позволяет управлять загрузкой торрентов на роутере с обычного компьютера, что очень удобно. Заходим по вышеуказанной ссылке и справа на странице видим инсталяционные файлы для загрузки для разных операционных систем.
Заходим в меню инструменты/параметры соединения и вводим там ip-ройтера, а также если задавали, то логин и пароль.
После этого Transmission Remote GUI должен подключится и отобразить список ваших торрентов на роутере.
Также на вкладке инструменты/параметры/пути можно задать сопоставление локальных файлов удаленным. Для работы этого пункта нужно установить и настроить samba, о чем читайте в моей следующей статье.