среда, 22 декабря 2010 г.

Samba + NFS + блокировка файлов

Есть сервер на Debian 5.05, на нем крутится Samba 3.0.24. Встала задача раздавать контент с самбы на другие Debian-машины. По умолчанию выбор был сделан в пользу NFSv3.
Сказано - сделано.
Далее нарисовалась одна проблема, а именно: совместно использование файлов, особенно офисных документов. У человека, некоторое время имевшего открытый документ, со временем выскакивала ошибка, что документ нельзя изменить, ибо он заблокирован неизвестным пользователем. Проблема оказалась не в связке ООо (3.2.1) + NFS, а в NFS + Samba, ибо в них по-разному реализована система блокировок файлов. Поправлюсь. Не в самих программах, а в принципах их работы с клиентами. Т.е. какой-нибудь MS Word просто игнорировал открытость кем-то с помощью ООо соотвествующего файла и тд.
Выбор в сторону самбы для Debian был сделан, изначально, не специально, ибо в самом начале я столкнулся с проблемой прав доступа из линуховых машин (с виндовыми была абсолютная норма). Файл можно было создать, скопировать, но отредактировать или удалить было нельзя. Тогда проблема была неясна, теперь же я выяснил. Оказалось, что дело было в create mask и directory mask в параметрах шары в smb.conf. Казалось бы, если работа с этими файлами по средством самбы идет от определенного пользователя (в моем случае security mode = user), зачем выставлять права на 0777? А вот, оказалось, что надо так делать, иначе получим достаточно интеренсные лаги, ибо, как говорит интернет, в противном случае все файлы и директории создаются от имени пользователя sambauser.
В итоге можно было отказаться от использования связки Samba + NFS и оставить только Samba, которая внутри себя замечательно работает с блокировками.

Samsung LE40C550J1W и вещание с IP-видеокамер

Встала задача: выдавать на телевизор потоки с IP-видеокамер, исходя из того, что телевизор висит в другом помещении относительно видеосервера. Samsung LE40C550J1W - достаточно продвинутый 40" LCD телевизор с возможностью подключения к Ethernet. По сети на него можно выдавать видео с помощью программ, имеющих функционал DLNA-сервера, работающих по протоколу UPnP. Это одно из современных модных течений в бытовой технике, которое позволяет объединять совершенно разные устройства в одну сеть, по которой можно гонять различные мультимедиа-потоки.
Совместно с гуглом было найдено программное серверное решение в виде HMS. Это виндовое приложение, представляющее из себя DLNA-сервер, которое, в отличие от фирменных самсунговских программ, может не только расшаривать для DLNA-клиентов медиа-контент, но так же имеет функционал транскодирования, что, собственно, и нужно было в моем случае. Итак поехали.
Скачиваем последнюю версию HMS отсюда.
Скачиваем последнюю версию VLC отсюда. Она понадобится в качестве транскодера.
В качестве видеокамер у нас используются, в данном случае, Beward N1000 и Beward BD4070D.
N1000 выдает в сеть видеопоток по адресу
rtsp://<адрес-камеры>:554/video.mp4,
а BD4070D по адресу
rtsp://<адрес-камеры>:554/h264.
Если, конечно, вы не меняли коим-то образом адреса потоков.
Запускаем HMS (к большой радости это наша отечественная программа). Я не буду тут рассказывать про базовую настройку сервера, а перейду сразу к сути. Для начала надо указать серверу, чтобы он не хранил транскодированный файл на винте, иначе очень быстро будет прерываться трансляция в виду окончания свободного места. ДЛя этого Настройки -> Транскодер. В нижних табах перейти на вкладку "Другие" и там поставить галочку, если не стоит, на "Буфер транскодирования - Транскодирование без использования диска", и прописать размер буфера "Интернет". Я прописал 200 МБ. Тут все.
Далее вернемся в основное окно программы со списком категорий. В основном уровне дерева, в панели слева, выберем пункт "Интернет телевидение". Перейдем в правую часть, и через контекстное меню добавим ссылку. Появится окно, в которой нужно прописать всего 2 вещи: "Заголовок" и "Путь" в отделении "Ссылка", по которому камера отдает видеопоток по протоколу RTSP. Далее, не закрывая окна, щелкнуть по кнопке "Специальные настройки исопльзования медиа-ресурса" (это четвертая кнопка рядом с полем ввода адреса). Появится следующее окно, в котором уже будет прописан адрес отдачи видеопотока. Нужно выбрать MIME-тип mts и поставить галочку на "Использовать указанные параметры транскодирования", и в оконо прописать следующее:
<VLC> -Idummy --language=en --sout=#transcode{vcodec=mp2v,vb=12000,fps=25,scale=1,acodec=mpga,ab=192,channels=2,samplerate=48000}:duplicate{dst=std{access=file,mux=ts,dst="<OUTPUT FILE>"}} "<INPUT FILE>"

Думаю, тут итак все понятно. Единственное, в моем случае пришлось поиграть с кодеками (mp2v и mpga), у вас они могут быть другие. Остается все сохранить. Нажать в гланом меню кнопку "Обновить" и запустить сервер.
Выбрав на телевизоре устройство, соответствующее вашему серверу, в директории "Интернет телевидение" выбрать ваш поток и пробовать смотреть.
Возможные проблемы (с которыми столкнулся я).
- Телевизо выдает "Не поддерживается формат файла". Попробуйте в настройках потока поменять на другой MIME-тип (не mts, а mp(e)g, например), либо другой кодек в параметрах транскодирования (не mp2v, а mpeg2video, например).
- Видео начинает воспроизводиться и через несколько секунд прекращается. Попробуйте уменьшить в Настройки -> Сервер "Размер буфера передачи данных сервера".
- Вместо звука шпение/треск. Попробуйте поменять аудиокодек в параметрах транскодирования (например, с mpga на mp2a и тд).
- Слишком долго стартует видео. Попробуйте уменьшить в Настройка -> Транскодер в "Параметрах транскодированного файла", во вкладке "Интернет-телевидение" "Размер для начала передачи файла".
И да, как только вы добавите канал потока, в его названии в главной панели справа вы увидите приписку (?), это означает, что поток нужно проверить на доступность, что делается выбором соответствующего пункта в контекстном меню потока.
В общих чертах все. Приятного просмотра!

понедельник, 13 декабря 2010 г.

Linux, информация о винчестере

Подандобилось узнать модеьл вничестера на удаленном компьютере, идти до которого, как обычно, было лень. Гугл пнул в сторону консольной программки hdparm. Мелкая утилитка, однако имеющая на борту не мало возможности, как инфорамационной, так и функциональной, т.е. в плане управления винчестерами. Хоть в информации о ней говорится, что она предназначена для работы с DMA оборудованием, она вполне хорошо себя чувствует и с SATA оборудованием, хотя, каюсь, функциональные возможности я не проверял - исключительно информационные.
Например, так можно получить информацию о винчестере:

debian:~# hdparm -i /dev/sda

/dev/sda:

Model=WDC WD1600AAJS-00L7A0 , FwRev=01.03E01, SerialNo= WD-WCAV30051642
Config={ HardSect NotMFM HdSw>15uSec SpinMotCtl Fixed DTR>5Mbs FmtGapReq }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=50
BuffType=unknown, BuffSize=8192kB, MaxMultSect=16, MultSect=?16?
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=312581808
IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6
AdvancedPM=no WriteCache=enabled
Drive conforms to: Unspecified: ATA/ATAPI-1,2,3,4,5,6,7

* signifies the current active mode

А так можно более полную:
debian:~# hdparm -I /dev/sda

/dev/sda:

ATA device, with non-removable media
Model Number: WDC WD1600AAJS-00L7A0
Serial Number: WD-WCAV30051642
Firmware Revision: 01.03E01
Transport: Serial, SATA 1.0a, SATA II Extensions, SATA Rev 2.5
Standards:
Supported: 8 7 6 5
Likely used: 8
..... и т.д.

Узнать геометрию винта? Пожалуйста:
debian:~# hdparm -g /dev/sda

/dev/sda:
geometry = 19457/255/63, sectors = 312581808, start = 0

ТАк же можно узнать режим питания:
debian:~# hdparm -C /dev/sda

/dev/sda:
drive state is: active/idle

И многое другое. Смотрите сами.
debian:~# apt-get install hdparm

вторник, 7 декабря 2010 г.

Web-сервисы 1С 8.1 и Apache. Первые шаги.

У 1С есть одна хорошая вещь, называется Web-сервисы. Т.е. с помощью этого инструментария можно получать доступ к функционалу и данным, хранящимся в базе 1С из внешней сети. Работает это на технологии SOAP.
Сразу буду описывать конкретный пример.
Для начала надо подружить 1С и apache (дай Бог, когда-нибудь подружат 1С и nginx). Для этого, в зависимости от версии apache, нужно подключить к нему следующую библиотеку:
- для 2.2.х wsap22.dll
- для 2.х.х wsapch2.dll
из директории 1cv81/bin следующим образом: в httpd.conf у apache нужно добавить, в зависимости от библиотеки
LoadModule _1cws_module "C:/Program Files/1cv81/bin/wsap22.dll"

Так же нужно в вашем виртуальном хосте настроить директорию, куда 1С будет экспортировать файлы описания сервисов.

 Alias /1c "path/to/directory/for/1c" # это по желанию

 <Location /1c>
        DirectorySlash Off
        SetHandler 1cws-process
        Allow from all
 </Location>

Теоретически, настройка apache должна быть окончена. Можно приниматься за 1С.

Есть база по картриджам для принтеров. Узнаем через web-сервис, например, сколько у нас картриджей находятся в работе. Для этого перейдем в режим Конфигуратора. В окне "Конфигурация" выберем вкладку "Общие" -> "Web-сервисы". Начнем добавлять новый. Я его назвал "CartridgeData". В окне нового сервиса, на вкладке "Операции" создадим новую функцию, которая и будет нам возвращать количество находящихся в работе картриджей. Назовем ее CartridgeCount. В окне свойств функции выберем тип возвращаемого значения "string", поставим галочку "Возможно пустое", "Имя метода" назовем так же "CartridgeCount". При таком действии откроется окно модуля, где уже будет создан скелет будущей функции. Пока ничего тут не будем набирать.
Вернемся во вкладку "Операции" и добавим новой функции параметр (правой кнопкой по названию, Добавить - Параметр. Назовем его "State". В его свойствах укажем тип "string", так же поставим галочку на "Возможно пустое" и выберем "Направление передачи" на "Входной".
Вернемся снова в окно сервиса. Пропустим вкладку "Подсистемы" и перейдем на вкладку "Прочее". Тут необходимо указать пространство имен. Это любое слово, я вписал "1с". В "Пакеты XDTO" я выбрал последний, ибо пока не разбирался в этих вещах. В "Имя файла публикации" я вписал "cartridge.1cws" - это просто название файла, который будет лежать в соответствующей директории на web-сервере. Теперь нажмем кнопку "Модуль", чтобы открылся модуль данного сервиса, там должна быть заготовка для функции, которая в моем случае получилась такой:

Функция CartridgeCount(State)
 Если State = Ложь Тогда //проверка, конечно, примитивная
  Возврат "Укажите состояние картриджа!";
 КонецЕсли;

 ЗапросНаКоличество = Новый Запрос;

 ЗапросНаКоличество.Текст =
      "ВЫБРАТЬ
      | КОЛИЧЕСТВО(Картридж.Код) КАК Количество
      |ИЗ
      | Справочник.Картридж КАК Картридж
      |ГДЕ
      | Картридж.СостояниеКартриджа = &State"; //оставим место для переменной

//так можно получить ссылку на объект перечисления, исходя из названия
 ЗапросНаКоличество.УстановитьПараметр(
      "State",
      Перечисления.СостояниеКартриджа[State]
 );

 Результат = ЗапросНаКоличество.Выполнить().Выбрать();
 Результат.Следующий();

 Возврат Результат.Количество;
КонецФункции

Теперь можно все сохранить (F7). Далее в главном меню Администрирование -> Публикация Web-сервисов. В поле "Путь" вы должны выбрать директорию на web-сервер, куда записывать экспортный 1cws файл. Это может быть локальная директория, либо удаленная на ftp-сервере. После выбора нужно нажать "Соединение", и ниже у Вас появится возможность выбирать из списка сервисов.
Собственно, все, с серверной частью покончено.
На PHP самый примитивный код, работающий с этим web-сервисом, будет выглядеть примерно так:

// параметр ?wsdl обязателен, только так сервис 1С отдаст WSDL описание Soap-клиенту
$soapClient = new SoapClient("http://severname/1c/cartridge.1cws?wsdl");
// обязательно все параметры передавать в массиве
$cartridgeCount = $soapClient->cartridgeCount(array("State" => "ВРаботе"));
echo $cartridgeCount->return; // результат находится в поле return
?>

среда, 1 декабря 2010 г.

Debian Lenny и HP Laserjet 1018 (1020)

Как на зло, на данный момент, CUPS не полностью поддерживается, поэтому пришлось его подключать вручную. Данное руководство применимо и для Ubuntu 9.xx и выше.

Для начала надо скачать прошивку вменяемую, которую, например, можно взять тут.
# tar xvzf sihp1018.tar.gz sihp1018.img

Далее, установим нужные пакеты:
# apt-get install foo2zjs hplip

Установим прошивку:
# arm2hpdl sihp1018.img > /usr/share/foo2zjs/firmware/sihp1018.dl

Загрузим прошивку:
cat /usr/share/foo2zjs/firmware/sihp1018.dl > /dev/usb/lp0

На это действие принтер должен отреагировать, если не реагирует, проверьт подключение к компьютеру.
Далее подключим принтер к CUPS:
- зайти через любой браузер на http://localhost:631
- вкладка "Администрирование" (Administration)
- "Добавить принтер" (Add printer)
- вписать название принтера и выбрать порт подключения. В моем случае это HP LaserJet 1018 USB #1. В вашем случае может несколько отличаться. Иногда в названии подключения отображается серийный номер принтера
- выбрать драйвер. CUPS должен сам предложить его из списка. В моем случае это HP LaserJet 1018 Foomatic/foo2zjs (recommended)
И все. Далее можно напечатать тестовую страницу. Да, тут еще может понадобиться авторизоваться по рутом.

Все готово. Если хотите подключить этот принтер к серверу печати на WinServer 200x, то самый простой вариант, это на стартовой странице http://localhost:631 выбрать вкладку "Администрирование", и в ней поставить галочки:
- Расшарить подключенные принтеры (Share published printers connected to this system)
- Разрешить печать из Интернет (Allow printing from the Internet)
- На сервере печати добавить принтер в ручную, выбрав сетевой или подключенный к другому компьютеру, далее подключиться к принтеру через Интернет и ввести адрес http://computer_name:631/printers/printer_name. Где computer_name - dns или ip-адрес компьютера, к которому подключен принтер, printer_name - название принтера, которое вы прописали при добавлении его через CUPS.
- Ну, и далее произвести стандартные операции, типа выбора нужного драйвера.

Вот теперь точно все :)