пятница, 19 декабря 2008 г.

Обновление OpenVPN до версии 2.1

Зачем это понадобилось? Раньше на маршрутизаторе работал в режиме сервера старенький openvpn-2.0.7 используя протокол udp. Работал он хорошо, но была у него проблемка. Маршрутизатор подключен к нескольким провайдерам и соответственно у него имеется несколько сетевых интерфейсов. Так вот, пока у openvpn-сервера отсутствовали подключения openvpn-клиентов, то первый клиент мог подключится через любой сетевой интерфейс. Но чуть появлялось первое клиентское подключение, то все последующие соединения могли быть установлены только через тот же самый интерфейс, т.е. через того же самого провайдера.

Формулируя другими словами, openvpn сервер версии 2.0 не может принимать клиентские udp подключения через разные сетевые интерфейсы.

Предполагаемые варианты решения:

  1. Вместо udp использовать протокол tcp. Но во-первых, существует точка зрения что пропускать протокол tcp поверх протокола tcp это плохо. Во-вторых, хотелось бы избежать изменений в конфигурационных файлах клиентов, потому что их много и некоторые находятся в других городах.
  2. Использовать bridging. По непроверенным данным, если несколько сетевых интерфейсов объединить в один мост, данной проблемы не наблюдается. Зато появляются другие, навроде свободного прохождения широковещательных пакетов между клиентами.
  3. Обновить openvpn на маршрутизаторе до версии 2.1. В описании новых возможностей прямо говорится о решении данной проблемы: "multihome feature to enable UDP-based multihoming of the server on multiple interfaces". Единственный недостаток, на текущий момент OpenVPN 2.1 имеет статус бета-версии 2.1rc15.

Еще раз подчеркну, что выше перечислены только предполагаемые варианты решения. Фактически был опробован и оставлен в работе только вариант №3.

Подробно не буду останавливаться на процессе компиляции openvpn, т.к. пакетная система для каждого дистрибутива linux своя. Универсальный же способ из configure, make и make install, которым грешат многие статьи, гарантированно превращает вашу файловую систему в помойку. Для используемой у меня Slackware я уже описывал процесс пересборки tgz пакетов, как раз на примере openvpn. Всё что необходимо сделать — это выкачать свежий архив исходников и поменять версию openvpn в slackbuild-скрипте.

Обновление openvpn-сервера в целом прошло гладко. Единственное дополнение пришлось внести в конфигурационный файл openvpn-сервера, для совместимости режима вызова внешних скриптов:

# compatibility with OpenVPN 2.0
script-security 3 system

Клиенты заработали с полностью неизмененными, старыми конфигурационными файлами. Только в логах установки соединения для старых OpenVPN 2.0 клиентов стало появлятся сообщение:

Options error: Unrecognized option or missing parameter(s) in [PUSH-OPTIONS]:2: topology (2.0.9)

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

Несмотря на статус бета-версии никаких проблем в работе нового openvpn не наблюдается. Наоборот, новая для OpenVPN 2.1, возможность udp multihome заработала просто прекрасно. Теперь клиенты могут использовать для соединения того провайдера, который им удобнее, дешевле и т.д.

P.S. При сборке пакета для Slackware 9.1 штатный gcc-3.2.3 ниасилил сборку нового openvpn со следующим сообщением об ошибке:

ssl.c:3402:1: directives may not be used inside a macro argument
ssl.c:3401:92: unterminated argument list invoking macro "msg"
ssl.c: In function `key_method_2_read':
ssl.c:3403: invalid type argument of `->'
ssl.c:3408: syntax error before ')' token
make[2]: *** [ssl.o] Error 1

Тут ситуация не совсем понятна. Толи это убогая старая версия препроцессора С, толи разработчики OpenVPN используют приёмы программирования на грани разрешенного. Во всяком случае версия gcc-4.2.4 от новой Slackware 12.2 собрал этот пакет без проблем. Т.к. компилятор языка C написан на языке C, то сначала пришлось скомпилировать пакет с компилятором, обновить пакет gcc, а потом уж компилировать openvpn :)

вторник, 25 ноября 2008 г.

Проблема при доустановке X-ов и KDE в Slackware

Симптомы. Дистрибутив Slackware 12.1. Сначала устанавливается только консольная часть системы. Позже, при доустановке X-ов и KDE, иксы отказываются запускаться с сообщением в /var/log/Xorg.0.log:

Fatal server error:
could not open default font 'fixed'

После долгих исканий помог следующий рецепт:

cd /
/var/log/setup/setup.04.mkfontdir
/var/log/setup/setup.05.fontconfig

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

При установке системы сразу с X-ами такого не наблюдается, т.к. запуск этих скиптов являются частью установки системы. Жаль, но это явная недорабтка в моём любимом дистрибутиве Linux. Зафиксировал описание отдельным постом, т.к. поиски решения в интернет затруднены. Результаты гугления уводят по ложному направлению проблем с неким X Font Server. Справедливости ради при должном упорстве описание решения можно найти.

четверг, 6 ноября 2008 г.

Программно-аппаратные особенности терминалов Motorola MC9090

Я уже писал про программы для терминалов Motorola MC9090. Продолжаю свои заметки про этот промышленный терминал. Основная особенность — всего много.

4 вида памяти

Директория /Cache Disk — энергозависимая память, её содержимое не сохраняется при перезагрузках терминала. Но она во много раз быстрее остальных типов памяти. Как видно из названия директории монтирования, основное предназначение — для разного рода кэшей.

Директория /Application — сверхпостоянная память, которая переживает даже сброс терминала к заводским настройкам. Примерный объем 20 Мб. Здесь можно хранить, например, дистрибутивы программ или какие-либо настройки реестра, которые могут понадобится после процедуры Clean Boot (см. ниже).

Директория /SD Card — дополнительная внешняя заменяемая флеш-карта.

Прочие директории — постоянная память, как в обычных КПК.

4 вида перезагрузки

Warm Boot — простая перезагрузка терминала.

Cold Boot — по документации это перезагрузка терминала с очисткой каких-то внутренних таймеров, т.е. вроде бы почти не отличается от Warm Boot. На практике же иногда терминал приходит в такое состояние, что перестает адекватно себя вести и Warm Boot просто не выполняется. Cold Boot же не подводил ещё не разу, однако его необходимо проводить только в безопасной зоне, т.к. необходимо извлекать основной аккумулятор.

Clean Boot — сброс операционной системы терминала к заводским настройкам. Выполняется с помощью специального программного обеспечения. Директория /Application сохраняет своё содержимое. Аналогично переустановке операционной системы.

Clean Boot с очисткой директории /Application — полный сброс состояния терминала к заводским настройкам. Никакие изменения сделанные пользователем не сохраняются. Аналогично форматированию всех винтов и переустановке операционной системы.

2 аккамулятора

В дополнение к основному аккумумятору терминал комплектуется дополнительной резерной батареей. Этим объясняется тот забавный факт, что иногда терминал показывает сообщения при извлеченном основном аккумяторе. В документации утверждается что резевная батарея может поддерживать терминал ещё как минимум 72 часа после разрядки основного аккамулятора.

четверг, 16 октября 2008 г.

Windows scripting: ведение журнала работы

Продолжим изучение скриптов для автоматизации системного администрирования windows. В прошлый раз мы рассмотрели отправку электронной почты из vbscript. Сейчас же займемся ведением журнала работы скрипта.

Известно, что в unix-системах для журналирования используется протокол syslog (описан в rfc 3164). Однако, как обычно это делается в компании microsoft, в windows сделали похожее, но своё решение — службу «Event Log». Ну да и бог с ними, хорошо что вообще что-то сделали.

Рассмотрим, как отправить сообщение в журнал событий из vbscript. Для этого необходимо использовать метод LogEvent объекта WScript.Shell. Полный синтаксис можете посмотреть по приведенной ссылке сами, а мы рассмотрим пример вызова:

SET shell = CreateObject("WScript.Shell")
shell.LogEvent 4, "Hello world"

Все очень просто. Теперь давайте сохраним эти строчки в файле C:\scripts\event_log.vbs и запустим скрипт, например с помощью двойного клика по нему в проводнике. Далее, для посмотра сообщений используется неудобная программа «Event Viewer»:

  1. Для запуска выполним «Start > Run...» и введем команду «eventvwr.msc»:

  2. В левой части открывшегося окна выберем ветку «Event Viewer (Local) > Application»:

  3. В правой части окна появится список событий. Созданное нами событие будет иметь тип «Information» и источник «WSH» и скорее всего будет первым в списке. Выполним на нём двойной клик и увидим диалоговое окно «Event Properties» с полной информацией о событии:

Теперь о грустном. В жертву простоты вызова из vbscript были принесены почти все возможности службы журналирования, даже те, жертвовать которыми не надо было. Самый главный недостаток — невозможно указать источник сообщения, у всех скриптов он всегда будет одинаковым и абстракным значением «WSH». Такое ощущение, что разработчики Windows Script Host даже представить себе не могли, что может потребоваться запускать более одного скрипта на компьютере.

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

SET shell = CreateObject("WScript.Shell")
shell.LogEvent 4,  WScript.ScriptFullName & " script start"

Вот событие полученное в результате отработки скрипта:

Замечание. Судя по содержимому документа «How To Use the Event Logging Utility (Logevent.exe) to Create and Log Custom Events in Event Viewer in Windows 2000» якобы, в наборе утилит «Windows 2000 Resource Kit» должна быть утилита logevent.exe позволяющая более гибко создавать записи в журнале событий из командной строки (аналог linux-утилиты logger). Но во-первых, никакого «Windows 2000 Resource Kit» на сайте http://www.microsoft.com/downloads/ обнаружить не удалось. Во-вторых, в присутствующем там «Windows Server 2003 Resource Kit» есть куча всякого говна, но этой утилиты уже нет. Можете конечно поискать (и даже найти) эти утилиты в интернете, но у меня что-то нет доверия полученным не из официальных источников программам.

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

 

Update

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

Set shell = CreateObject("WScript.Shell")
eventCreate "information", "Hello world"

' eventType - одно из success, error, warning или information
Sub eventCreate(eventType, message)
  logName = "application"
  source  = WScript.ScriptName
  eventID = 999

  Set re = New RegExp
  re.Pattern = """"
  re.Global = true
  message = re.Replace(message, "\""")

  command = "eventcreate "       & _
            "/l  "   & logName   & " " & _
            "/so "   & source    & " " & _
            "/id "   & eventID   & " " & _
            "/t  "   & eventType & " " & _
            "/d  """ & message   & """"

  resultBad = shell.Run(command, 0, true)

  if resultBad Then
    error = source & " :" & VbCrLf & _
            "error execute command" & VbCrLf & _
            command & VbCrLf & _
            "return code " & resultBad
    shell.LogEvent 1, error
  End If
End Sub

пятница, 10 октября 2008 г.

Программы от Motorola для терминалов MC9090

Так уж получилось, что мне пришлось заниматься разработкой для взрывозащищенного терминала «Bartec MC9090ex». Он создан на базе промышленного терминала «Motorola MC9090» с операционной системой «Windows Mobile 5».

При разработке и внедрении использовалось дополнительное программное обеспечение, свободно предоставляемое компанией Motorola. Особенность данного программного обеспечения в том, что оно запускается только на устройствах компании Motorola. Соответсвенно запустить его на других windows mobile КПК или даже на эмуляторе КПК не удастся. Зато бесплатно. Несмотря на то, что я делал подборку для MC9090, многие программы будут работать на других устройствах Motorola.

Используемое программное обеспечение

909XCLEANERS
Выполнение процедуры Clean Boot (сброс к заводским настройкам), как с возможностью очистки директории \Application так и без оной.

AppCenter
Ограничение пользователя только набором разрешенных для запуска приложений. Можно запретить доступ к стартовому меню windows, bluetooth и пр. Для снятия ограничений требуется пароль администратора. Программу надо ставить в автозагрузку.

AppLauncher
Удобное меню для запуска приложений. Можно делать подменю. Можно сменить картинку-логотип сверху. Настройка полностью через реестр windows.

Remote Capture
Создание разностных архивов (реестр и файловая система) после установки и настройки каких-либо программ на терминале. Может использоваться для резервного копирования или для тиражирования изменений на несколько устройств.

StartUp Control
Гибкое управление процессом автозагрузки после Cold Boot (перезагрузка) и Clean Boot (переустановка без очистки директории \Application). Скрипты автозагрузки имеют возможность устанавливать дистрибутивы программ, манипулировать файловой системой, реестром, задавать строгую последовательность запуска программ и паузы между запусками.

Symbol Mobility Developer Kit
Набор библиотек для языков и платформ: C, JAVA, .NET. Позволяют в программах использовать аппаратные особенности терминалов Motorola, например работать со встроенным сканером штрих-кодов.

Неиспользуемое программное обеспечение

Программное обеспечение, которое я не использовал, но может быть интересным.

iDockIt
Запуск каких-либо программ на терминале после его соединения с настольным компьютером через usb, serial и пр. Может сам устанавливать соединение по сети и запускать программы.

Symbol Configuration Manager
Настройка терминала с настольного компьютера. Возможность сохранять резервные копии настроек.

CtlpanelWM
Добавляет в панель управления windows апплеты для настройки аппаратных особенностей терминалов Motorola.

DataWedge
Позволяет работать со сканером штрих-кодов (RFID ридером и пр.) приложениям в которые изначально такая возможность не закладывалась и они ожидают клавиатурного ввода данных.

PocketBrowser
Непонятная серая хрень.

Keypad Mapping Table Kit
Переназначение кодов клавиш

понедельник, 29 сентября 2008 г.

Nullmailer — пересылка локальной почты на почтовый шлюз

Часто в организации имеется почтовый шлюз на базе одного этих почтовых серверов (MTA):
courier
exim
postfix
qmail
sendmail

Предположим что у нас имеется ещё один linux-сервер, с которого мы хотим отправлять почту. Конечно, можно использовать любую из вышеперечисленных программ, соответствующим образом настроенную для пересылки почты основному шлюзу. Но так лучше не делать, т.к. это большие, тяжелые и универсальные почтовые сервера, занимают много места в оперативной памяти, работают медлено и их труднее настроить. Для решения этой задачи существует класс программ, называемых relay-only MTA. Отличительные особенности этих MTA:

  1. Не умеют получать почту по SMTP. Исходящая почта формируется только локально через интерфейс командной строки утилиты sendmail.
  2. Доставка почты осуществляется заранее заданному удаленному SMTP серверу.
  3. Как правило, не умеют больше ничего. Вообще ничего из того, что вы можете вспомнить из функций больших MTA. За счет этого работают максимально быстро.

Представители этого класса программ:
esmtp
masqmail
nullmailer
nbsmtp
ssmtp

Я использую nullmailer, т.к.:

  1. Nullmailer очень прост в настройке. Фактически вся конфигурация, это несколько текстовых файлов в каждый из которых нужно поместить одну строчку.
  2. Nullmailer не настолько примитивен, чтобы после получения почты, сразу в этом же процессе программы пытаться доставить почту удаленному SMTP серверу. Вместо этого он помещает письмо в локальную очередь доставки, что даёт нам сразу два преимущества. Первое, доставка почты идет быстрее, т.к. управление возвращается вызвавшей отправку почты программе. Дальнейшая обработка почты идет из отдельного процесса-демона nullmailer. Второе, при проблемах в сети или на почтовом шлюзе почта никогда не будет потеряна и будет доставлена сразу после устанения неполадок.

Покажем, как работать с nullmailer, на примере операционной системы Ubuntu. Допустим, мы хотим отправлять почту с машины webserv.localnet через почтовый шлюз mail.localnet. Соответсвенно все действия выполняются на машине webserv.

Установка:

xeim@webserv:~$ sudo aptitude install nullmailer

 

Минимальная настройка:

В файл /etc/nullmailer/remotes помещаем адрес почтового шлюза — «mail.localnet smtp».

В файл /etc/nullmailer/adminaddr помещаем адрес системного администратора — «admin@mycompany.ru» для получения локальной почты, например для root@localhost или user@webserv.localnet.

 

Запуск:

xeim@webserv:~$ sudo /etc/init.d/nullmailer start

 

Пример отправки почты:

xeim@webserv:~$ sendmail -f somebody@mycompany.ru
To: anybody@mail.ru
Subject: test

test

 

Журнал работы в /var/log/mail.log:

Sep 29 15:36:58 webserv nullmailer[14760]: Trigger pulled.
Sep 29 15:36:58 webserv nullmailer[14760]: Rescanning queue.
Sep 29 15:36:58 webserv nullmailer[14760]: Starting delivery, 1 message(s) in queue.
Sep 29 15:36:58 webserv nullmailer[14760]: Starting delivery: protocol: smtp host: mail.localnet file: 1222663016.14762
Sep 29 15:37:04 webserv nullmailer[14760]: smtp: Succeeded: 250 ok 1222663024 qp 2803
Sep 29 15:37:04 webserv nullmailer[14760]: Sent file.
Sep 29 15:37:04 webserv nullmailer[14760]: Delivery complete, 0 message(s) remain.

Если мы видим такие строки, значит сообщение передано почтовому шлюзу. Дальше это уже его забота — доставить сообщение получателю.

Таким образом, с использованием nullmailer возможно просто организовать отправку электронной почты через почтовый сервер организации.

вторник, 19 августа 2008 г.

Windows scripting: отправка электронной почты

К сожалению, в реальной жизни системному администратору приходится работать не только с unix-подобными системами. Иногда нужно решать задачи системного администрирования на плохо приспособленных и слабодокументированных операционных системах семейства windows. О таких хорошо зарекомендовавших себя инструментах как bash, perl или даже простой grep говорить не приходится. Что же мы имеем в наличии? Фактически имеется технология Windows Script Host с возможностью писать скрипты на языках JScript и VBScript. Мда, ну и выбор... и чтобы усугубить глубину собственного падения далее будем использовать язык VBScript.

Задача. Довольно часто встречается ситуация, когда скрипт должен уведомить администратора по электронной почте о наступлении какого-либо события или ситуации. Для примера напишем скрипт, посылающий уведомление о загрузке windows сервера.

Теория. Составной частью оперционных систем windows 2000/xp/2003 является динамическая библиотека сdosys.dll. Эта библиотека выдрана из почтового сервера MS Exchange и её функциональность сильно урезана. Тем не менее, с ее помощью можно сформировать сообщение электронной почты и отправить его внешнему почтовому серверу (MTA). Называется это счастье «CDO for Windows 2000», по ссылке доступна подробная документация из MSDN.

Решение. Исходный код скрипта email_notify.vbs:

Set email = CreateObject("CDO.Message")

With email.Configuration.Fields
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") _
        = "mail.localnet"
    .Update
End With

email.From = "robot@mycompany.ru"
email.To = "admins@mycompany.ru"

Set wshNetwork = WScript.CreateObject("WScript.Network")
email.Subject = wshNetwork.ComputerName & " включен"
email.Textbody = ""
email.TextBodyPart.charset = "koi8-r"

email.Send

Надеюсь, вам не составит труда пробится через синтаксис VBScript. Сам скрипт короткий и достаточно прозрачный для понимания. В основном используются методы объекта CDO.Message, они документированы по приведенной выше ссылке. Конечно, по сравнению с linux реализацией той же функциональности:

echo "" | mailx -s "`hostname` is up" admins@mycompany.ru

мы получили монстроподобного уродца, но тут уж ничего не поделаешь, такова участь несчастных администраторов windows.

На этом собственно задача отправки электронных писем из windows скриптов решена. По двойному клику на файле email_notify.vbs скрипт выполнится. Однако, нам еще осталось рассмотреть тонкий момент запуска скрипта при загрузке операционной системы. Ярлык на такой скрипт нельзя помещать в меню «Startup» («Автозагрузка»). Ведь такие ярлыки обрабатываются не при загрузке операционной системы, а при начале сеанса конкретного пользователя. По той же причине не подходят и прочие места автозапуска, которые в большом количестве могут быть обнаружены на просторах реестра windows. Некорректно такой скрипт запускать и как системную службу. Вот правильное решение:

  1. Выполняем команду «Start > Run...» и вводим магическую команду «gpedit.msc»:

  2. В открывшемся окне с заголовком «Group Policy Object Editor» выбираем ветку «Local Computer Policy > Computer Configuration > Windows Settings > Scripts (Startup/Shutdown)»:

  3. Дважды кликаем на элемент «Startup» в правой части окна и появляется диалоговое окно «Startup Properties»:

  4. Нажимаем кнопку «Add...». Во вновь отрывшемся диалоговом окне «Add a Script» задаем полный путь к нашему скрипту email_notify.vbs. Официально рекомендованный путь для размещения загрузочных скриптов — «C:\WINDOWS\system32\GroupPolicy\Machine\Scripts\Startup».

  5. Нажимаем кнопку «OK», чтобы закрыть диалоговое окно «Add a Script». В списке скриптов диалогового окна «Startup Properties» появляется новый скрипт автозапуска.

  6. Нажимаем кнопку «OK», чтобы закрыть диалоговое окно «Startup Properties». Закрываем программу «Group Policy Object Editor». Все, можно проверять запуск скрипта при загрузке.

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

вторник, 22 июля 2008 г.

IP прокси средствами фаервола Linux

Здесь я покажу пример проксирования IP пакетов средствами межсетевого экрана операционной системы Linux.

Как известно, фаервол в Linux один — netfilter. И так как он давно встроен в ядро linux, то не понадобится устанавливать никаких дополнительных программ. Используемый дистрибутив Linux также не имеет значения.

Сначала несколько слов о том, зачем все это нужно. Например у нас есть две сети: «Сеть A» и «Сеть B» соединенные linux-маршрутизатором. Компьютеру клиента из «Сети A» необходимо получить доступ к серверу в «Сети B». Причем обе сети имеют сложную организацию, не являются простыми ethernet сегментами. У нас имеется контроль над компьютерами клиента, сервером и маршрутизатором. Над остальными частями сетей контроль отсутствует.

Проксирование ip трафика осуществляется с помощью следующих команд, выполняемых на linux-маршрутизаторе:

iptables -t nat -I PREROUTING         \
    -s 172.18.247.24 -d 172.18.55.17  \
    -j DNAT --to-destination 192.168.19.3

iptables -t nat -I POSTROUTING        \
    -s 172.18.247.24 -d 192.168.19.3  \
    -j SNAT --to-source 192.168.19.218

Первая команда создает правило фаервола, заставлюящее менять адрес назначения (destination) пакетов на адрес сервера в «Сети B». Второй вызов iptables меняет адрес источника пакетов (source) на адрес маршрутизатора в «Сети B».

С компьютера клиента нужно будет обращаться на ip адрес маршрутизатора. Например использовать URL http://172.18.55.17 или выполнить команду:

ping 172.18.55.17

Фактически же на запросы будет отвечать не маршрутизатор, а сервер. Причем со стороны сервера будет казаться что запросы поступают от ip адреса маршрутизатора в «Сети B», т.е. от 192.168.19.218. Таким образом в каждой из сетей будут бегать пакеты только между разрешенными хостами в данной сети и все будут жить долго и счастливо.

пятница, 4 июля 2008 г.

Развертывание типового (эталонного) образа Ubuntu Linux

В конторе периодически закупаются новые компьютеры и сотрудникам IT-отдела приходится отрываться от более интересных дел и заниматься рутиной в виде установки и настройки операционной системы. Установка Ubuntu традиционным способом с помощью компакт-диска, установка драйверов, обновлений и дополнительных программ из интернета, настройка всего занимают слишком много времени. Одним из способов оптимизации процесса является создание типового образа операционной системы и затем быстрое его развертывание на новых компьютерах.

Создание эталонного образа.

Прежде всего необходимо создать эталонный образ Ubuntu. Для этого нам потребуется эмулятор виртуальных машин, например VirtualBox или VMWare. Далее:

  1. Устанавливаем Ubuntu в виртуальной машине.
  2. Настраиваем установленную операционную систему. Например так:

    • включить основные и дополнительные репозитарии и произвести обновление пакетов;
    • установить полную локализацию системы;
    • установить мультимедийные кодеки;
    • установить пакеты с драйверами для видео карт nvidia и ati;
    • установить flash плугин для браузера;
    • установить плугин для открытия документов MSOffice 2007 (*.docx и др.) в OpenOffice;
    • установить необходимые программы и утилиты: ssh сервер, vnc сервер, unrar, wine, virtualbox и много чего ещё...;
    • указать сетевые настройки, например адреса dns и ntp серверов, маршруты;
    • отключить загрузку не нужных демонов;
    • отключить запуск не нужных заданий по расписанию cron;
    • любые другие программы и/или настройки.
  3. Настройка профиля пользователя по умолчанию. Для этого создаем пользователя, например testuser, логинимся под ним и производим настройку. Например:

    • отключить эффекты рабочего стола;
    • разрешить удаленный доступ к рабочему столу (vnc) и задать пароль для него;
    • прописать настройки соединения в браузере: проски-сервер и прочее;
    • в редакторе меню отключить запуск некоторых программ, например подменю "Игры";
    • в настройках сеанса, отключить запуск не нужных программ;
    • любые другие настройки.

    После завершения настройки профиля, копируем содержимое /home/testuser в /etc/skel. Делаем владельцом пользователя root:

    sudo chown -R root:root /etc/skel

    Просматриваем директорию /etc/skel, удаляем все лишнее, заменяем в файлах абсолюный путь /home/testuser на относительный ~/.

    Теперь при создании нового пользователя в его домашнюю директорию будет копироваться содержимое /etc/skel.

  4. Для создания образа будем использовать livecd дистрибутив System Rescue CD.

    После загрузки, поднимаем сеть:

    sysresccd ~ # net-setup

    Монтируем директорию по сети, куда мы будем копировать образ:

    sysresccd ~ # mkdir /mnt/etalon

    пример для sftp:

    sysresccd ~ # mount -t fuse sshfs#login@192.168.0.1:/etalon /mnt/etalon

    пример для smb:

    sysresccd ~ # mount -t cifs -o user=login //192.168.0.2/etalon /mnt/etalon

    Далее, монтируем жесткий диск виртуальной машины:

    sysresccd ~ # mkdir /mnt/sda1
    sysresccd ~ # mount /dev/sda1 /mnt/sda1

    Создаем образ обычной утилитой tar:

    sysresccd ~ # cd /mnt/sda1
    sysresccd sda1 # tar cvzf /mnt/etalon/etalon-ubuntu8.04-20080704.tar.gz *

Образ операционной системы создан. У меня файл образа занимает около 1,5 Гб. Остается только записать его на dvd болванку.

Развертывание эталонного образа на новом компьютере

Развертывание образа эта операция ради которой и затевалось создание самого образа. Здесь нас снова поможет незаменимый инструмент системного администратора System Rescue CD. Загружаем новый компьютер с его помощью, при загрузке вводим опции, чтобы после можно было освободить dvd привод:

rescuecd docache doeject

Вытаскиваем livecd, устанавливаем в привод болванку с образом. Далее:

  1. Разметка диска. Например: все место под корневой раздел, файловая система reiserfs, под swap 2ГБ:

    sysresccd ~ # сfdisk /dev/sda
    sysresccd ~ # mkfs.reiserfs /dev/sda1
    sysresccd ~ # mkswap /dev/sda2
  2. Монтируем диски и разворачиваем эталон:

    sysresccd ~ # mkdir /mnt/sda1
    sysresccd ~ # mount /dev/sda1 /mnt/sda1
    ...
    sysresccd ~ # mkdir /mnt/etalon
    sysresccd ~ # mount /dev/cdrom /mnt/etalon
    ...
    sysresccd ~ # tar -С /mnt/sda1 xvzf /mnt/etalon/etalon-ubuntu8.04-20080704.tar.gz
  3. Правим файлы /mnt/sda1/etc/fstab и /mnt/sda1/boot/grub/menu.lst чтобы UUID метки дисков соответствовали новым томам. UUID метки можно узнать с помощью команды:

    sysresccd ~ # blkid
  4. Устанавливаем загрузчик grub в mbr область нового диска:

    sysresccd ~ # grub-install --root-directory=/mnt/sda1 /dev/sda

Если все прошло успешно, то мы уже можем загрузить с операционную систему с жесткого диска. Дальше:

  1. Сконфигурируем видео драйвер (в эталоне должен быть установлен универсальный драйвер vesa):

    administrator@etalon:~# sudo dpkg-reconfigure -phigh xserver-xorg

    После перезапуска иксов (Ctrl-Alt-Backspace) должен подняться нормальный видео драйвер.

  2. Сменим имя хоста и сетевые настройки:

    administrator@etalon:~# sudo gedit /etc/hostname
    administrator@etalon:~# sudo gedit /etc/network/interfaces

Компьютер готов к работе. После установки на рабочее место пользователя ещё потребуется настроить принтера, но это уже отдельная история.

После приобретения некоторого опыта установка операционной системы на новый компьютер занимает около 20 минут. Конечно предварительно должно быть потрачено время на создание эталонного образа и периодическое его обновление, но при больших количествах новых компьютеров оно окупается. Данный способ успешно применяется уже 1,5 года.

вторник, 3 июня 2008 г.

Установка 1С Предприятие 7.7 на WINE@Etersoft

Установка 1С Предприятие 7.7 (сетевая версия) на Ubuntu Linux Desktop 8.04 LTS с использованием коммерческой версии WINE@Etersoft SQL 1.0.8.
По большому счету, используемый дистрибутив Linux не имеет значения, но желательно чтобы он был в списке поддерживаемых. Предполагается что установка не эмулятора wine и драйвера ключей защиты Aladdin HASP 4 уже произведена:

admin@zam:~$ wine --version
WINE@Etersoft 1.0 SQL (1.0.8), registration number is XXXX-XXXX.
Legality check is available on the page http://sales.etersoft.ru/product/.


admin@zam:~$ sudo /etc/init.d/haspd status
[sudo] password for admin: 
Hardware protection keys support bundle. Etersoft (c) 2007
: haspd.init,v 1.102 2007/11/15 17:39:03 lav Exp $
Aladdin HASP 4/HL driver status:
-e  kernel module aksparlnx is loaded
-e  aksusbd is running
-e  winehasp is running
-e  hasplm is running
Daemon version: 1.8.1 - key API (USB) version: 3.85, key API (parallel driver) version: 3.86
Smartkey 3 USB/LPT driver status:
-e  skeyd is running
skeymon v11.5 - Smartkey server monitor
Copyright (C) 2004 Eutron 

====================================================
             Smartkey server statistics
====================================================
Opens       keys: 0       servers: 1    
====================================================
Messages    received: 0     sent: 0     error: 0    
====================================================
Clients     logged: 0     removed: 0    
====================================================
SafeNet Sentinel status:
-e  usbdaemon is running
-e  SntlKeysSrvrlnx is running

Обязательно копируем дистибутив 1С в директорию диска C: — ~/wine_c. В противном случае можем нарваться на сообщение об ошибке:

Устанавливаем 1C Предприятие:

admin@zam:~$ wine ~/wine_c/1s/P770025/entrm/DISK1/setup.exe

Дальше установка идет обычным способом, как в Windows, просто серия скриншотов:

Устанавливаем конфигурацию, например такую:

admin@zam:~$ wine ~/wine_c/1s/conf/482/R770482/DISK1/setup.exe

Ещё скриншоты:

Далее запускаем из стартового меню «Приложения >> Wine >> Программы >> 1С Предприятие 7.7 >> 1С Предприятие» Первый запуск делаем в монопольном режиме и отвечаем на все задаваемые вопросы. После этого можно запускать 1С в обычном пользовательском режиме.

admin@zam:~$ wine "C:\\Program Files\\1Cv77\\BIN\\1cv7"

пятница, 23 мая 2008 г.

Установка PostgreSQL-1С для Slackware 12

Замечательная компания «Этерсофт» выпускает некий программный продукт SELTA@Etersoft. Для работы этого продукта требуется патченная версия СУБД PostgreSQL. Для скачивания доступны исходные коды и бинарные сборки для большого количества операционных систем.

Теперь хватит рекламы, приступаю к описанию проблемы. Среди поддерживаемых операционных систем заявлена Slackware 12. Однако, предоставленные пакеты не работают «искаробки» без доработки напильником. Справедливости ради надо заметить, что компания честно предупреждает о создании пакетов в неком производном от Slackware дистрибутиве MOPSLinux. Все это написано главным образом для себя, т.к. установку пришлось делать уже во второй раз, и не факт, что последний.

Шаг 1. Убеждаемся что установлен пакет sysvinit-functions:

root@darkstar:~# ls /var/log/packages/sysvinit-functions*
/var/log/packages/sysvinit-functions-8.53-i486-2

Если нет, то устанавливаем его.

Шаг 2. Устанавливаем выкачанные пакеты PostreSQL 1C:
postgresql8.2.1C-8.2.4
postgresql8.2.1C-server-8.2.4
postgresql8.2.1C-libs-8.2.4
postgresql8.2.1C-contrib-8.2.4

Шаг 3. Почему-то при установке не создается необходимый пользователь и группа. Делаем это вручную:

root@darkstar:~# groupadd postgres
root@darkstar:~# useradd -g postgres postgres
root@darkstar:~# chown -R postgres:postgres /var/lib/pgsql

Шаг 4. Стартовый скрипт /etc/rc.d/init.d/postresql категорически не способен работать в Slackware. Накладываем патч:

84c84
< . /etc/sysconfig/network
---
> #. /etc/sysconfig/network
189c189
<       $SU -s /bin/sh -l postgres -c "$PGENGINE/postmaster -p '$PGPORT' -D '$PGDATA' ${PGOPTS} &" >> "$PGLOG" 2>&1 < /dev/null
---
>       $SU postgres -c "$PGENGINE/postmaster -p \"$PGPORT\" -D \"$PGDATA\" ${PGOPTS} &" >> "$PGLOG" 2>&1 < /dev/null
207c207
<       $SU -s /bin/sh -l postgres -s /bin/sh -c "$PGENGINE/pg_ctl stop -D '$PGDATA' -s -m fast" > /dev/null 2>&1 < /dev/null
---
>       $SU postgres -c "$PGENGINE/pg_ctl stop -D \"$PGDATA\" -s -m fast" > /dev/null 2>&1 < /dev/null
243c243
<                       $SU -l postgres -s /bin/sh -c "LANG=ru_RU.UTF-8 $PGENGINE/initdb --pgdata='$PGDATA' --auth='ident sameuser'" >> "$PGLOG" 2>&1 < /dev/null
---
>                       LANG=ru_RU.UTF-8 $SU postgres -c "$PGENGINE/initdb --pgdata=\"$PGDATA\" --auth=\"ident sameuser\"" >> "$PGLOG" 2>&1 < /dev/null
263c263
<     $SU -l postgres -s /bin/sh -c "$PGENGINE/pg_ctl reload -D '$PGDATA' -s" > /dev/null 2>&1 < /dev/null
---
>     $SU postgres -c "$PGENGINE/pg_ctl reload -D \"$PGDATA\" -s" > /dev/null 2>&1 < /dev/null

Шаг 5. Шаманства кончились. Далее инициализируем базу данных:

root@darkstar:~# /etc/rc.d/init.d/postgresql initdb
Initializing database:                                     [  OK  ]

Шаг 6. Запуск сервера PostreSQL:

root@darkstar:~# /etc/rc.d/init.d/postgresql start 
Starting postgresql service:                               [  OK  ]

Шаг 7. Прописываем запуск PostreSQL при загрузке компьютера:

root@darkstar:~# cd /etc/rc.d/rc3.d
root@darkstar:/etc/rc.d/rc3.d# ln -s ../init.d/postgresql S40postgresql
root@darkstar:/etc/rc.d/rc3.d# ln -s ../init.d/postgresql K60postgresql

Все, установка PostreSQL завершена. В завершение необходимо выполнить действия по его настройке.

понедельник, 28 апреля 2008 г.

Google AJAX Language API

Великий Google порадовал разработчиков новым online сервисом «Google AJAX Language API». Функционал нового API — опреление языка текста и получение его перевода. На текущий момент поддерживается 13 языков, среди которых есть и русский. Переводы выполняются только на английский или только с английского языка, т.е. нельзя например напрямую перевести с русского на итальянский.

Чем это может быть полезно web-разработчику? Один из вариантов применения — генерация url-ов для динамического контента, по заголовку новости, теме в форуме или поста в блоге. А с кирилицей в урлах пока дела обстоят неважно. Например, урл новостей на ЛОРе никуда не годится в эпоху Web 2.0 :-)
http://www.linux.org.ru/view-message.jsp?msgid=2686861
Куда симпатичнее смотрелось бы:
http://www.linux.org.ru/news/ubuntu_8.04_released
или
http://www.linux.org.ru/news/2008/04/23/ubuntu_8.04_released

Сам Google позиционирует свой сервис для использования совместно с javascript. Однако, на практике, ничто не мешает применять любой другой язык программирования. Вот небольшой пример на perl, который позволяет получать онлайн перевод с русского на английский в консоли:

#!/usr/bin/perl -w
use strict;

use URI::Escape;
use LWP::UserAgent;
use JSON;

my $text       = $ARGV[0];
my $escaped    = uri_escape( $text );
my $user_agent = LWP::UserAgent->new;
$user_agent->env_proxy;
my $response   = $user_agent->get(
    "http://ajax.googleapis.com/ajax/services/language/translate" .
    "?v=1.0&q=$escaped&langpair=ru%7Cen"
)->content;
my $translated = jsonToObj($response)->{responseData}->{translatedText};

print $translated, "\n";


Пример использования:

$ ./ggl_trnslt.pl "Возьми моё сердце"
Take my heart

Если слово не найдено в словаре, то производится его транслитерация, что обычно лучше чем ничего:

./ggl_trnslt.pl паровоз
parovoz

Хотя и непонятно, почему Гугль не знает про паровозы... Остается надеяться что со временем качество перевода возрастет.

Русский текст должен быть в кодировке utf8. Пример упрощен, в частности не делает никаких проверок на ошибки, но зато хорошо демонстрирует принцип использования.

пятница, 18 апреля 2008 г.

Стандартные ядра в Slackware 12

Какие версии ядра есть в Slackware 12 и как ими пользоваться.
Данная статья предворяет будущий рассказ о сборке ядра в slackware пакет. Эта информация специфична для Slackware 12, в предыдущих версиях системы все было не так.

В дистрибутив Slackware 12 включены 4 сборки ядра 2.6.21.5. Вот они:

kernel-huge-smp-2.6.21.5_smp-i686-2.tgz
kernel-huge-2.6.21.5-i486-2.tgz
kernel-generic-smp-2.6.21.5_smp-i686-2.tgz
kernel-generic-2.6.21.5-i486-2.tgz

Как видно из названий пакетов, 4 сборки ядра получены путем комбинации признаков:
huge или generic
smp или no_smp

SMP версия ядра

Разберемся сначала с тем, что попроще. SMP (Symmetric Multiprocessing) — это поддержка многопроцессорных систем и многоядерных процессоров. Если у вас в компьютере есть несколько процессоров или один процессор с двумя (или более) ядрами, например Intel Core2Duo, то чтобы получить максимальную производительность вы должны выбрать smp ядро. Если у вас один одноядерный процессор, например Intel Celeron, то чтобы ядро занимало меньше памяти и не обрабатывало неподдерживаемые конфигурации оборудования следует выбрать не smp ядро. Кроме того, для очень старых процессоров — Pentium Pro и ниже, также необходимо выбирать не smp ядро, т.к. smp версия собрана с использованием архитектуры i686. Убедится что smp ядро работает с вашим процессором можно с помощью команды:

cat /proc/cpuinfo

Вы должны увидеть информацию о нескольких процессорах, а не об одном.

Huge/generic версия ядра

Теперь рассмотрим признаки huge и generic.

Huge (огромное) — ядро, содержащее вкомпиленные модули для большинства дисковых (SCSI, RAID) контроллеров и файловых систем. При использовании этого ядра у вас в принципе не возникает проблем с загрузкой системы, даже с экзотического оборудования или файловых систем, типа xfs или jfs. Однако, это ядро занимает больше оперативной памяти и работает медленнее. После установки системы всегда по-умолчанию запускается huge ядро.

Generic (общее) — ядро, в котором драйвера дисковых контроллеров и файловых систем собраны в виде внешних загружаемых модулей. Для загрузки такого ядра нужен initrd образ, содержащий необходимые драйвера. Эта версия ядра требует дополнительных телодвижений при настройке, но занимает меньше памяти и работает быстрее.

Переключение на другое ядро

Итак, исходя из изложенной информации вы уже должны знать какое из стандартных ядер вам подходит больше всего. Вопрос в том, как переключится на другое ядро. Ответ — настроить загрузчик lilo, естественно. Для huge ядер это делается очень просто, в файле /etc/lilo.conf должны быть такие строки:

#huge-smp:
image = /boot/vmlinuz-huge-smp-2.6.21.5-smp
  root  = /dev/xxxN
  label = lnx-huge-smp
  read-only

#huge-nosmp
image = /boot/vmlinuz-huge-2.6.21.5
  root  = /dev/xxxN
  label = lnx-huge
  read-only

Напомню пару правил при работе с загрузчиком lilo.

  1. После изменения файла /etc/lilo.conf всегда запускайте утилиту lilo, чтобы изменения вступили в силу.
  2. Всегда оставляйте один из пуктов меню с гарантированно рабочей конфигурацией на случай, если что-то пойдет не так.

Для generic ядер надо создавать initrd образ. Для этого используется утилита mkinitrd. Например, мне надо создать initrd образ для ядра generic-smp, корневая файловая система на ext3. Тогда мне необходимо ввести команду:

mkinitrd -с -k 2.6.21.5-smp -m ext3 -o /boot/initrd-generic-smp-2.6.21.5.gz

Ещё пример — initrd образ для ядра generic-nosmp и корневая файловая система reiserfs:

mkinitrd -с -k 2.6.21.5 -m reiserfs -o /boot/initrd-generic-2.6.21.5.gz

Теперь как это прописать в /etc/lilo.conf:

#generic-smp:
image = /boot/vmlinuz-generic-smp-2.6.21.5-smp
  initrd = /boot/initrd-generic-smp-2.6.21.5.gz
  root   = /dev/xxxN
  label  = lnx-gen-smp
  read-only

#generic-nosmp
image = /boot/vmlinuz-generic-2.6.21.5
  initrd = /boot/initrd-generic-2.6.21.5.gz
  root   = /dev/xxxN
  label  = lnx-gen
  read-only

В заключении скажу, что переход на generic ядро всегда оправдан. В моём тестовом случае:

  1. Освободилось 5Мб оперативной памяти. Вычислялось как разница между показаниями
    grep MemTotal /proc/meminfo
    для huge и generic ядра.

  2. Количество системных процессов ядра, те, чьи имена пишутся в квадратных скобочках, уменьшилось на 11 штук:
    ps axo cmd | grep \\[

вторник, 26 февраля 2008 г.

Кешируюший прокси deb пакетов apt-cacher на slackware

Моими стараниями количество desktop-ов в организации, работающих под Ubuntu приближается к 10 шт. В дальнейшем их станет больше. Возникает проблема установки дополнительных программ и обновления существующих. Качать пакеты индивидуально для каждого компьютера — долго и не экономит интернет-трафик. Решение заключается в установке одного из кеширующих прокси серверов для deb пакетов. Например apt-cacher, преимущество которого в том что не надо изменять урлы репозитариев, а только настройки прокси-сервера для пакетной системы apt. Описывать установку и настройку apt-cacher на debian или любой debian-based операционной системе, в том числе на ubuntu, я не буду. Во-первых это элементарно, во-вторых уже не раз описано, например здесь. К тому же у меня нет серверов на ubuntu, зато есть сервера на slackware. Вот и займемся установкой apt-cacher на slackware 12.

Сначала посмотрим на зависимости пакета:

maxim@ubuntu:~$ apt-cache depends apt-cacher
apt-cacher
  Зависит: perl
  Зависит: bzip2
  Зависит: libwww-perl
  Предлагает: libdbd-sqlite3-perl

Радует что apt-cacher написан на perl. Нам понадобится perl библиотека libwww-perl. Установим её на slackware с помошью утилиты cpan2tgz. Можно почитать подробнее про использование cpan2tgz.

root@darkstar:~# cpan2tgz LWP

С зависимостями разобрались, теперь на ubuntu скачиваем deb пакет apt-cacher:

maxim@ubuntu:~$ aptitude download apt-cacher

Получили файл apt-cacher_1.5.3_all.deb. Далее устанавливаем программу, если у вас её ещё нет, для преобразования пакетов в разные форматы — alien:

maxim@ubuntu:~$ sudo aptitude install alien

Преобразуем deb пакет в tgz пакет:

maxim@ubuntu:~$ sudo alien --to-tgz -k apt-cacher_1.5.3_all.deb

Получили файл apt-cacher-1.5.3.tgz. Изучим его содержимое:

maxim@ubuntu:~$ tar -tzf apt-cacher-1.5.3.tgz 
./
./usr/
./usr/sbin/
./usr/sbin/apt-cacher
./usr/share/
./usr/share/man/
./usr/share/man/man1/
./usr/share/man/man1/apt-cacher.1.gz
./usr/share/apt-cacher/
./usr/share/apt-cacher/apt-cacher-precache.pl
./usr/share/apt-cacher/apt-cacher.pl
./usr/share/apt-cacher/apt-proxy-to-apt-cacher
./usr/share/apt-cacher/apt-cacher
./usr/share/apt-cacher/apt-cacher-report.pl
./usr/share/apt-cacher/apt-cacher-lib.pl
./usr/share/apt-cacher/remove.pl
./usr/share/apt-cacher/apt-cacher-format-transition.pl
./usr/share/apt-cacher/apt-cacher-import.pl
./usr/share/apt-cacher/upgrade.pl
./usr/share/apt-cacher/apt-cacher-lib-cs.pl
./usr/share/apt-cacher/install.pl
./usr/share/apt-cacher/apt-cacher-cleanup.pl
./usr/share/doc/
./usr/share/doc/apt-cacher/
./usr/share/doc/apt-cacher/copyright
./usr/share/doc/apt-cacher/NEWS.Debian.gz
./usr/share/doc/apt-cacher/changelog.gz
./usr/share/doc/apt-cacher/README.Debian.gz
./etc/
./etc/init.d/
./etc/init.d/apt-cacher
./etc/default/
./etc/default/apt-cacher
./etc/apt-cacher/
./etc/apt-cacher/checksumming.conf
./etc/apt-cacher/apt-cacher.conf
./etc/apt-cacher/apache.conf
./etc/logrotate.d/
./etc/logrotate.d/apt-cacher
./etc/cron.daily/
./etc/cron.daily/apt-cacher

Что же тут не соотвествует стандартам slackware? Многое:

  1. Страницы руководств man должны храниться в /usr/man, а не в /usr/share/man. К счастью в slackware уже есть символическая ссылка /usr/share/man на /usr/man.
  2. Документация програм должна хранится в /usr/doc, а не в /usr/share/doc. Опять же аналогичная спасительная символическая ссылка уже есть.
  3. Стартовые скрипты sysvinit должны храниться в /etc/rc.d/init.d, а не в /etc/init.d. А вот такого симлинка нет, не беда, создаем его сами:

    root@darkstar:~# ln -s /etc/rc.d/init.d /etc/init.d

Остальное вроде в порядке. Копируем tgz пакет на slackware сервер и устанавливаем его:

root@darkstar:~# installpkg apt-cacher-1.5.3.tgz

Просматриваем файл /etc/apt-cacher/apt-cacher.conf и видим, что сервер будет запускаться под пользователем и группой www-data. На данный момент в slackware их не существует, исправляем ситуацию:

root@darkstar:~# groupadd www-data
root@darkstar:~# useradd -g www-data www-data

Прописываем в файле /etc/default/apt-cacher значение параметра AUTOSTART=1 и пробуем запустить прокси-сервер apt-cacher:

root@darkstar:~# /etc/rc.d/init.d/apt-cacher start
Starting Apt-Cacher: apt-cacher/etc/rc.d/init.d/apt-cacher: line 26: start-stop-daemon: command not found

Твою мать! В стартовом скрипте используется дебиановская утилита start-stop-daemon, которой нет в slackware. Далее у нас два пути: переписать стартовый скрипт с использованием slackware-way утилит или установить утилиту start-stop-daemon. Системный администратор не программист :-), поэтому ничего переписывать не будем, а будем устанавливать утилиту. Возвращаемся в ubuntu и обнаруживаем, что start-stop-daemon почему-то находится в deb пакете dpkg. Ну да нам все равно, идем по проторенному пути:

maxim@ubuntu:~$ aptitude download dpkg
maxim@ubuntu:~$ sudo alien --to-tgz -k dpkg_1.13.22ubuntu7_i386.deb

Опять копируем полученный пакет на slackware, устанавливаем его и пытаемся снова запустить прокси-сервер apt-cacher:

root@darkstar:~# installpkg dpkg-1.13.22ubuntu7.tgz
root@darkstar:~# /etc/rc.d/init.d/apt-cacher start
Starting Apt-Cacher: apt-cacher/usr/sbin/apt-cacher: No cache_dir directory!

Уже лучше, предыдущей ошибки уже нет, но прокси-сервер все равно не стартует. На этот раз он жалуется на нехватку каких-то директорий. Похоже, что на ubuntu эти директории создаются из инсталяционного скрипта в в deb пакете. Но alien при конвертировании пакета нас честно предупреждает что инсталяционные скрипты не конвертируются. Хорошо. Начинаем внимательнее изучать содержимое deb пакета, для этого него извлекаем управляющие скрипты:

maxim@ubuntu:~$ dpkg -e apt-cacher_1.5.3_all.deb

И обнаруживаем в извлеченном файле DEBIAN/postinst следующие строчки:

echo "Running apt-cacher's install script..."
/usr/share/apt-cacher/install.pl

Понятно, вот чего нам не хватало, запускаем этот скрипт на slackware вручную:

root@darkstar:~# /usr/share/apt-cacher/install.pl
Assuming www-data is the user ID used to run apt-cacher
Doing mkdir(/var/cache/apt-cacher, 0755)
Doing mkdir(/var/log/apt-cacher, 0755)
Doing mkdir(/var/cache/apt-cacher/private, 0755)
Doing mkdir(/var/cache/apt-cacher/import, 0755)
Doing mkdir(/var/cache/apt-cacher/packages, 0755)
Doing mkdir(/var/cache/apt-cacher/headers, 0755)
Doing mkdir(/var/cache/apt-cacher/temp, 0755)

Скрипт отработал успешно и создал необходимые системные директории. В очередной раз пробуем запустить прокси-сервер apt-cacher:

root@darkstar:~# /etc/rc.d/init.d/apt-cacher start
Starting Apt-Cacher: apt-cacher.

Кешируюший прокси-сервер для deb пакетов apt-cacher, после доработки напильником :-), успешно запустился на slackware. Теперь любой deb пакет будет скачиваться только один раз. При повторной установке на другом компьютере пакет будет браться из кеша, что увелит скорость скачивания и съэкономит трафик.

четверг, 14 февраля 2008 г.

Имена пакетов slackware

Как прочитать имя slackware пакета? Как правильно назвать slackware пакет?

Синтаксис имени slackware пакета:

    {program}-{version}-{arch}-{build}{tag}.tgz

Где:

  • {program} — имя программы, как назвал ее автор, строчными буквами.
  • {version} — версия программы.
  • {arch} — архитектура процессора, возможные значения:
    i386
    i486
    i586
    i686
    x86_64
    noarch — для пакетов без бинарных исполняемых файлов
    ppc
    s390
    Все пакеты дистрибутива slackware используют архитектуру i486 или noarch.

  • {build} — номер сборки пакета. Сборщик пакетов тоже человек, а значит может ошибаться. Исправленный пакет выпускается под тем же именем, но с измененным номером сборки.
  • {tag} — уникальный идентификатор создателя пакета, обычно 3-х буквенный. Поле необязательное для автора дистрибутива и обязательное для всех остальных сборщиков. Иногда в конце поля {tag} добавляют номер версии дистрибутива для которого предназначен данный пакет, отделяя его символом подчеркивания.


Пример: ipcad-3.7.3-i486-2nmu_slack11.0.tgz

Это пакет с программой IPCAD (сбор статистики по трафику) версии 3.7.3, собранный и оптимизированный под архитектуру процессора intel 486. Сборщик пакета — некто nmu. Пакет собран для Slackware 11. Версия сборки пакета — 2.



В завершение несколько советов по работе с slackware пакетами.

  • Как узнать, какая версия slackware установлена?

        cat /etc/slackware-version
  • Как получить список установленных пакетов в slackware?

        ls -1 /var/log/packages
  • Как получить список 10-и последних установленных пакетов в slackware?

        ls -t1 /var/log/packages | head
  • Как получить список файлов в файле пакета slackware?

        tar -tzf имя_пакета.tgz
  • Как получить список файлов в установленном пакете slackware?

        cat /var/log/packages/имя_пакета
  • Как определить к какому из пакетов slackware принадлежит данный файл?

        cd /var/log/packages; grep path/to/file *

    Надо указать абсолютный путь к файлу, но без начального слеша, пример:

        cd /var/log/packages; grep bin/chmod *
        coreutils-6.9-i486-1:bin/chmod
  • Как узнать какой пакет нужно установить чтобы появился нужный файл?

    Перестать выпендриваться с командной строкой и воспользоваться поиском на сайте http://packages.slackware.it

понедельник, 11 февраля 2008 г.

Разбитый PocketPC

На прошлой неделе разбил свой КПК Toshiba e330. Подаренный в своё время ssh-ом, он мне прослужил больше года. Однако оказалось, что удара кулака в морду он не выдерживает. :-(

КПК использовался только для чтения. Видимо, из-за моральной и физической старости, на нем сильно глючил сенсорный экран и кнопки на крестовине. Собственно за что он и получил удар в порыве злости. На экране ещё с пол часа светилось последнее в его жизни изображение — страница из книги Виктора Астафьева «Прокляты и убиты. Часть вторая». Теперь мне нужен новый КПК, ведь очень хочется узнать чем все там закончилось...

среда, 30 января 2008 г.

Веб-программирование на perl и шаблоны html страниц

Как я уже не раз замечал, обычно всякий веб-программист на perl проходит в своём развитии следующие стадии:

  1. Шаблоны станиц не используются. Характерно для начинающих, совсем зеленых ещё программистов. Вывод страниц формируется непосредственно внутри скрипта, примерно следующим образом:

    my $title = 'Hello world';
    print "Content-type: text/html\n\n";
    print "<html><head><title>$title</title></head>";

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

  2. Самописная шаблонная система. Теперь вывод страниц формируется при помощи отдельной функции. Шаблон загружается из внешнего файла. С помощью регулярных выражений в нем организуется поиск и замена фрагментов кода, например специально помеченных комментариев:

    <table>
        <tr>
            <td><img src="logo.gif"></td>
            <td><!-- $TopMenu --></td>
        </tr>
        <tr>
            <td><!-- $LeftMenu --></td>
            <td><!-- $Content --></td>
        </tr>
    </table>

    Иногда реализуется функциональность вставки других файлов в шаблон (Include). По сравнению с начальным вариантом — это большой шаг вперед, программист освобождается от большинства описанных недостатков. Это уже не «ходьба пешком», но ещё и не «езда на лимузине». Обычно собственная шаблонная система работает неоптимально и не предоставляет многих возможностей разработчику. Многие программисты надолго, если не на всегда, застревают на данной стадии и необоснованно гордятся своими поделиями. Другие же обрашаются к:

  3. Одна из общепризнанных шаблонных систем. От самописной системы они отличаются возможностями:

    • Полное разделение логики программы и внешнего вида страницы. Весь html код находится в шаблоне, скрипт сам не выдает ни одного тега.
    • Условные вставки. Фрагмент шаблона появлется на странице при выполнении какого-либо условия.
    • Обработка циклов или массивов переменных. Например, к элементам массива может быть применена одинаковая разметка и сформирована html таблица.
    • Дополнительные возможности — кеширование шаблонов и/или сгенерированных страниц, подключение пользовательских плугинов/фильтров.
    • Годы поддержки и развития, хорошее быстродействие.

    В мире perl наиболее известными шаблонными системами являются:

Выбор конкретной системы — вопрос личных вкусов и предпочтений, я использую HTML::Template. Она мне нравится за простой язык шаблонов, напоминающий html теги, без попыток создать новый язык программирования. Но подробный рассказ о этой шаблонной системе — тема для отдельной статьи. В завершение хочу заметить что применять шаблоны можно не только для создания html страниц. На CPAN присутствуют модули для создания excel и pdf документов из xml шаблонов. Пример создания excel таблицы на perl из xml шаблона мною был уже описан.