Все о Linux. LinuxRSP.Ru


Cвежие новости Linux и BSD, анонсы статей и книг прямо в почтовый ящик!
Подписаться письмом


 Сегодняшние новости:

25 лет исполнилось ядру Linux

Релиз KDevelop 5.0

Oracle открывает код JDK9 для ARM

Выпущен Timewarrior 1.0.0

Релиз Android 7.0

Percona Memory Engine для MongoDB на базе WiredTiger

PowerShell открыт и доступен для Linux

Форк TrueCrypt: VeraCrypt 1.18

Релиз Snapcraft 2.14

Релиз Go 1.7

Стабильный выпуск рабочего стола Lumina

Вышла первая версия аналога OpenCV - DCV 0.1

Выпуск минималистичной программы для мониторинга jsonmon 3

В MIT разработали новый язык программирования

Первый релиз Qt5Gtk2

Godot 2.1 - новая версия открытого игрового движка

Свободная цифровая станция звукозаписи: Ardour 5.0

Обновление SkypeWeb Plugin for Pidgin

Вышла версия 3.0 Android File Transfer для Linux (и для OS X)

Программный аналог MIDI-контроллера для создания музыки: Launchpadd v1.3

Mozilla спонсирует поддержку Python 3.5 в PyPy

Ef 0.08 - программа для моделирования динамики заряженных частиц

Обновление текстового редактора TEA до версии 42.0.0

Релиз OpenOrienteering Mapper 0.6.4

Вышли Guix и GuixSD 0.11

Релиз Opera 39

Выпуск LibreOffice 5.2

В OpenSSH обнаружены и устранены некоторые уязвимости

Эмулятор FCEUX 2.2.3

Компания Билайн переходит на российскую СУБД с открытым исходным кодом Tarantool

Google

 Новые статьи :

Утилиты для восстановления потерянных данных в Linux

Лучшие файловые менеджеры для Android

20 лучших бесплатных книг о Linux

Как сгенерировать открытый/закрытый SSH-ключ в Linux

Grive - клиент Google Drive для Linux с открытым исходным кодом

Протокол IPv6: варианты подключения

Сервер из образа: DHCP + TFTP + Initrd + OpenVZ

Обзор веб-панелей управления хостингом

Приёмы работы с Vim

Nginx как Reverse Proxy для сайта, использующего SSL

Разработка модулей ядра Linux

Мониторинг нагрузки http-сервера Apache 2

Перевод комментариев к файлу конфигурации Squid

Решение проблем при использовании "1c предприятие" 8.2 в Linux

Advanced Bash-Scripting Guide Искусство программирования на языке сценариев командной оболочки







Rambler's Top100





 
 

О настройке INN 2.3 для работы с пакетом ifmail

В настоящее время InterNetNews package (INN) разрабатывается консорциумом ISC, URL : http://www.isc.org/products/INN/. Здесь я опишу процесс настройки INN v2.3.*.

Компиляция

Берем последнюю версию с ftp://ftp.isc.org/isc/inn/, например inn-2.3.1.tar.gz, раскручиваем его в /usr/src/inn-2.3.1 : tar -xzvf inn-2.3.1.tar.gz, заходим в этот каталог. В дальнейшем я буду на него ссылаться как на $SRC. Условимся, что скомпилированный пакет будем устанавливать в /usr/local/news/. Перед началом компиляции обязательно прочитайте файл INSTALL, убедитесь что у вас стоит Perl версии не ниже 5.004 (чтобы узнать номер версии, запустите perl -v). Читаем ./configure --help, запускаем ./configure с понравившимися опциями. Я использовал такие : ./configure --with-syslog-facility=LOG_NEWS --enable-tagged-hash --enable-uucp-rnews --enable-setgid-inews. Если скрипт отработает нормально, то make ; make install. Все должно поставиться в /usr/local/news.

Настройка

В /etc/manpath.config добавляем
MANDATORY_MANPATH  /usr/local/news/man
Запустив vipw, проверяем наличие пользователя news. Домашним каталогом ему я поставил /usr/local/news, шеллом - /bin/sh. Это пригодится при отладке.
Так как при тоссинге iftoss вызывает /usr/local/news/bin/rnews, то он (iftoss) должен иметь соответствующие права - rnews принадлежит news:uucp, поэтому надо будет прописать в /etc/group : uucp:*:66:fido
В /etc/syslog.conf раскоментируйте строчки с news.*, подправьте пути :
news.crit /usr/local/news/log/news.crit
news.err /usr/local/news/log/news.err
news.notice /usr/local/news/log/news.notice

и сделайте :
touch /usr/local/news/log/news.crit /usr/local/news/log/news.err /usr/local/news/log/news.notice
назначьте владельцем этих файлов news:news
Перезапустите syslogd : killall -1 syslogd


Обратите внимание : в ветке 2.2.* права на каталоги inn'а были более либеральными : они были доступны на запись группе news (и, следовательно, входившему в эту группу пользователю fido). В v2.3.* группа news потеряла право записи в каталоги inn'а. Поэтому для корректного функционирования скриптов send-ifmail/send-fidogate необходимо предоставить группе news право на запись в каталоги /usr/local/news/run/ (для создания lock-файлов), /usr/local/news/spool/outgoing/ (для обработки исходящих эх), и, опционально, в /usr/local/news/log/ (если send-ifmail/send-fidogate создают свои логи в этом каталоге)

Переходим в /usr/local/news/etc.

Редактируем inn.conf :
Разделы defaults и General Settings.
organization:  My Cool Origin
ваш Origin (так же может быть задан в настройках вашего ньюсридера) :
ovmethod: tradindexed
метод хранения overview информации.
server: news.domain.my
pathhost: news.domain.my

адрес вашего сервера. Должен быть прописан в DNS. Если у вас нет подключения к интернету, то используйте localhost.
innflags: -c0 -u
если не ставить флаг -c0 (0 - это цифра, не буква), то inn не будет принимать письма, возраст которых больше 14 дней. Флаг -u отключает буферизацию логов (это необходимо для ifmail'а).
Раздел Feed Configuration
remembertrash: false
wanttrash: true

эти два параметра необходимы для того, чтобы письма, приходящие в неизвестные для inn'а конференции не грохались, а помещались в ньюсгруппу junk, откуда потом их будут доставать всякие autocreate'ы
Раздел Article Storage
storeonxref: true
т.к. в данном примере описано использование одновременно различных методов хранения статей (traditional и CNFS), то этот параметр лучше включить.
Раздел Posting
Довольно забавный параметр checkincludedtext - при установке в true, проверяет (для локально посланных статей) соотношение написанного и отквоченного текста, и если оно менее 50%, то считает что это оверквотинг и отказывается принимать статью ;).
Раздел Logging
docnfsstat: true
Будет периодически генерироваться статистика об использовании CNFS буферов, причем есть возможность прикруть эту статистику к mrtg (если он у вас установлен). См. cnfsstat -h на предмет флагов -m, -p.
status: 600
Запись текущего состояния inn'а в файл inn_status.html каждые 600 секунд.
timer: 600
Запись текущей производительности inn'а в лог news.notice каждые 600 секунд. По этим записям innreport может строить занятную статистику.
Раздел Paths
pathhttp: /usr/local/apache/htdocs/news-stat
Каталог, куда будут помещаться отчеты innreport'ав html-формате. Он должен быть доступен пользователю news на запись.

Редактируем expire.ctl (необязательно):
/remember/:10
Это число регулирует, сколько дней Message-ID каждого письма будет храниться в файле /usr/local/news/db/history (history - это аналог дупобазы в фидошных эхопроцессорах).
# Значение по умолчанию для всех эх
*:A:1:10:never
# Моя локалка - хранить вечно ;)
f99.local:A:never:never:never
# Местные эхи
orn.*:A:14:90:180
orn.test:A:1:1:1
orn.sysop.pvt:A:never:never:never

Смысл всех букв и цифр объясняется в самом начале expire.ctl. Настраивайте в зависимости от объема свободного места на вашем диске. Имейте в виду, что оно обычно кончается гораздо быстрее чем предполагалось ;)
Прочитайте man expire.ctl

Если планируется читать почту ньюсридером по локальной сетке, то надо будет отредактировать readers.conf (Бывший nnrp.access).
В этом файле параметры сгруппированы в разделы двух типов : auth и access. В разделах auth описывается идентификация пользователей, которые могут подключиться к inn'у. Идентификация возможна разными способами - по имени хоста, IP адреса, логина/пароля, и т.д. В разделах access описываются ньюсгруппы, доступные пользователям, прошедшим идентификацию.
Имеющиеся по умолчанию секции auth "localhost" и access "localhost" не трогайте, составляйте свои, например :
Раздел auth :
auth "all network users" {
   auth: "ckpasswd -f /usr/local/news/db/users.passwd"
   hosts: "10.1.0.0/16"
   default: "<LOCAL-USERS>"
}

Раздел access :
access "all users" {
   users: "<LOCAL-USERS>"
   read: "local.*"
}

access "tech users" {
   users: "tech1,tech2,tech3"
   newsgroups: "su.hardw.*"
}

access "finance users" {
   users: "fin1,fin2,fin3"
   read: "ru.bank"
   post: "ru.1csoft"
}

В данном примере доступ к ньюссерверу имеют только те пользователи, IP адреса которых попадают под маску 10.1.*.*. Если они не предъявили логин/пароль, то попадают в секцию "all users" и могут лишь читать local.*. Но если они дополнительно предъявят корректные логин/пароль, то в зависимости от логина (tech1, fin1, fin2, etc.) получают доступ каждый к своим ньюсгруппам.
Обратите внимание : строчки типа default: "<LOCAL-USERS>" не должны содержать пробелов.
Файл с паролями (users.passwd) создайте с помощью утилиты htpasswd (она обычно входит в дистрибутив сервера apache), например : htpasswd -c /usr/local/news/db/users.passwd tech1. Добавление новых пользователей : htpasswd /usr/local/news/db/users.passwd tech2, и т.д. Вообщем, man htpasswd. Не забывайте сделать user.passwd доступным пользователю news на чтение
Прочитайте man 5 readers.conf.
Небольшое отступление : Позже, когда вы запустите INN, то для проверки корректности настройки очень удобно использовать телнет на 119 (nntp) порт сервера. Так, описанную выше конфигурацию можно проверить следующим образом (допустим вы уже создали пользователя с паролем, например tech1/pass1) :
$ telnet news.domain.my nntp
201 news.domain.my InterNetNews NNRP server INN 2.3.1 ready (no posting).

все правильно, пока мы не предъявили логин/пароль, мы в группе "all users" с r/o доступом. Проверим, какие группы нам доступны :
list active
215 Newsgroups in form "group high low flags".
local.talks 0000000000 0000000001 y
local.pvt 0000000000 0000000001 y

Проверим, можем ли мы туда писать :
group local.talks
211 0 0 0 local.talks
post
440 Posting not allowed

Хорошо, теперь идентифицируем себя как tech1 :
authinfo user tech1
381 PASS required
authinfo pass pass1
281 Ok
list active
215 Newsgroups in form "group high low flags".
su.hardw.monitor 0000000000 0000000001 y
su.hardw.video 0000000000 0000000001 y
[...]
group su.hardw.video
211 0 0 0 su.hardw.video
post
340 Ok, recommended ID <8sa7a4$i0c$1@news.domain.my>
[...]

Аналогично можно протестировать настройки всех access разделов.

Теперь редактируем файл newsfeeds. В нем расписано от кого вы получаете эхи и кому их отдаете. Сначала прочитайте комментарии в этом файле, затем можете подкорректировать секцию ME, типа :
ME:*,!junk,!control*::
В каком-то FAQ рекомендовалось прописать "фиктивный" feed. Пропишите, хуже от этого не будет :
dummy-feed:!*::
Далее описываем линков. Обратите внимание на то, что адреса необходимо писать с указанием зоны (z2).
В простейшем случае у вас будут только фидошные эхи и локалка :

Аплинк :
f500.n5058.z2:!*,\
  orn.*,\
  uplink.local,\
  su.os2, \
  su.os2.apps,\
  f99.local,\
  [...]
  :Tf,Wfb,B4096/1024:


На домашнего пойнта:
p1.f99.n5058.z2:!*,\
  f99.local, \
  f99.notify, \
  ru.unix.ftn, \
  :Tf,Wfb,B4096/1024:


А здесь другой пойнт
p2.f99.n5058.z2:!*,\
  ru.sex, \
  wwb_sysop, \
  tyt.bce.hacpem, \
  regcon.eur, \
  mo.echo, \
  zcc-public, \
  :Tf,Wfb,B4096/1024:


А этот технический пойнт автоматом подписан на всё. (убран '!' перед '*')
p100.f99.n5058.z2:\
  *,\
  :Tf,Wfb,B4096/1024:


Небольшое пояснение о флагах (Tf,Wfb,B4096/1024) :
Флаг T - это тип feed'а (f - file, p - program, и т.д.)
Флаг B - размеры буферов, в байтах
Флаг W - определяет, какая информация об уходящей на данный feed статье будет записываться в файл в каталоге /usr/local/news/spool/outgoing. Т.е. при комбинации "Wfb", будет записываться token статьи и ее размер в байтах (так, для traditional спула, token выглядит как "/usr/local/news/spool/articles/ru/unix/ftn/590367", для cnfs спула - как "@030146494C45303100000000002000000001@"). Более подробные описания флагов - см. man 5 newsfeeds


Небольшое отступление : работая с версией 2.2.*, я использовал метод хранения статей "по умолчанию" - traditional, когда каждая статья хранилась в отдельном файле. В данном примере, в 2.3.*, я буду использовать два метода - traditional и CNFS. При использовании CNFS, для хранения статей используется один большой файл (или даже целый raw-раздел жесткого диска) и когда он заполняется до конца, то начинает использоваться с начала, циклически. (Это можно условно сравнить с двумя прокси - squid и oops ;). У первого метод хранения кешированных файлов - "traditional", а у второго - "cnfs" ;). Более подробно об этих и других методах можете подробно прочитать в man storage.conf, секция "STORAGE METHODS".

Итак, редактируем файл cycbuff.conf :
В первую очередь закоментарьте все строчки с примерами cycbuff и metacycbuff, иначе inn воспримет их всеръез и будет пытаться инициализировать эти буферы.
Теперь надо определиться - какие эхи будем хранить в traditional спуле, а какие в CNFS. Ньюсгруппу junk - однозначно в traditional, так как почти все (все ?) autocreat'ы рассчитаны на это.
Замечание : Если планируется использовать в качестве гейта не ifmail, а fidogate (с -snp патчами by Serge N. Pokhodyaev, snp@ru.ru, 2:5020/1838@fidonet, URL : http://f1838.euro.ru/fidogate/), то особой необходимости держать junk в traditional спуле нет. Можете использовать любой.

Остальные эхи - на ваше усмотрение. У себя я сделал так : junk, всякие control.* и локалку - в traditional, остальные - в два CNFS спула. В первом (маленьком, 10 Mb) - местные эхи, для которых expire установлен побольше (см. пример в expire.ctl). Во втором (200 Mb) - все остальные.
cycbuff:FILE01:/usr/local/news/spool/articles/local_echoes:10240
cycbuff:FILE02:/bhome/part2/01/fido/other_part_1:51200
cycbuff:FILE03:/usr/local/news/spool/articles/other_part_2:153600

Первый файл - 10 Mb, второй и третий находятся на разных жестких дисках и занимают (точнее будут занимать, когда мы их создадим) 50 и 150 Mb соответственно.
metacycbuff:ORN:FILE01
metacycbuff:RU:FILE02,FILE03

Вот, наконец, мы задали два CNFS спула : ORN и RU.

Редактируем storage.conf :
method cnfs {
        newsgroups: orn.*
        class: 0
        options: ORN
}
method tradspool {
        newsgroups: junk,control*,f99.local
        class: 1
}
method cnfs {
        newsgroups: *
        class: 2
        options: RU
}
Для получения дополнительной информации - man storage.conf.

Переходим в /usr/local/news/db. В отличие от версии 2.2, 2.3 уже идет с установленными файлами active и newsgroups, необходимыми для запуска inn'а. Поэтому можно сразу перейти к созданию файла history :
touch history
../bin/makedbz -i

переименовываем полученные файлы :
mv history.n.dir history.dir
mv history.n.pag history.pag

Устанавливаем права на файлы в /usr/local/news/db :
chown news:news *
chmod 0664 *

Базы history готовы.
Теперь создаем CNFS спулы и overview :
dd if=/dev/zero of=/usr/local/news/spool/articles/local_echoes bs=1k count=10240
dd if=/dev/zero of=/bhome/part2/01/fido/other_part_1 bs=1k count=51200
dd if=/dev/zero of=/usr/local/news/spool/articles/other_part_2 bs=1k count=153600

Вот. Теперь у этих файлов установите владельцем news:news и права 0664.

Произведем пробный запуск inn'а (от имени пользователя news) :
su news -c "/usr/local/news/bin/rc.news start"
При этом на экране появится нечто вроде :
Starting innd.
Scheduled start of /usr/local/news/bin/innwatch.
Scheduled start of cnfsstat.

А в файле /usr/local/news/log/news.notice появятся строчки типа :
Nov 1 24:08:24 domain.my innd: buffindexed: No magic cookie found for buffindexed 0, initializing
Nov 1 24:08:24 domain.my innd: SERVER descriptors 1064
Nov 1 24:08:24 domain.my innd: SERVER outgoing 1051
Nov 1 24:08:24 domain.my innd: SERVER ccsetup control:12
Nov 1 24:08:24 domain.my innd: SERVER lcsetup localconn:14
Nov 1 24:08:24 domain.my innd: SERVER rcsetup remconn:4
Nov 1 24:08:24 domain.my innd: dummy-feed opened dummy-feed:16:file
Nov 1 24:08:24 domain.my innd: f500.n5058.z2 opened f500.n5058.z2:17:file
Nov 1 24:08:24 domain.my innd: p1.f99.n5058.z2 opened p1.f99.n5058.z2:18:file
Nov 1 24:08:24 domain.my innd: p2.f99.n5058.z2 opened p2.f99.n5058.z2:19:file
Nov 1 24:08:24 domain.my innd: p100.f99.n5058.z2 opened p100.f99.n5058.z2:20:file
Nov 1 24:08:24 domain.my innd: tradspool: /usr/local/news/spool/tradspool.map not found
Nov 1 24:08:24 domain.my innd: CNFS-sm: No magic cookie found for cycbuff FILE01, initializing
Nov 1 24:08:24 domain.my innd: CNFS-sm: No magic cookie found for cycbuff FILE02, initializing
Nov 1 24:08:24 domain.my innd: CNFS-sm: No magic cookie found for cycbuff FILE03, initializing
Nov 1 24:08:24 domain.my innd: SERVER starting

В живости innd можно убедиться, запустив ps :
$ ps -ax -Unews
  PID  TT  STAT     TIME COMMAND
  188  ??  Is     0:28.84 /usr/local/news/bin/innd -p4 -u -c0
  190 con- I      0:00.00 /bin/sh /usr/local/news/bin/rc.news start
  191 con- I      0:00.00 /bin/sh /usr/local/news/bin/rc.news start
  194 con- I      0:00.00 /usr/bin/perl /usr/local/news/bin/cnfsstat -s -l -P
  198 con- I      0:01.60 /bin/sh /usr/local/news/bin/innwatch
  320 con- I      0:00.00 sleep 600

Обычно inn запускают при загрузке системы из /usr/local/etc/innd.sh. У меня он таков :
#!/bin/sh
case "$1" in
start)
   [ -x /usr/local/news/bin/rc.news ] && su news -c "/usr/local/news/bin/rc.news start" > /dev/null && echo -n ' innd'
   ;;
stop)
   [ -r /usr/local/news/run/innd.pid ] && su news -c "/usr/local/news/bin/rc.news stop" > /dev/null && echo -n ' innd'
   ;;
*)
   echo "Usage: `basename $0` {start|stop}" >&2
   ;;
esac
exit 0


Создайте файлик news.cron с содержимым :
0   3 * * * /usr/local/news/bin/news.daily expireover lowmark delayrm
1   * * * * /usr/local/news/bin/nntpsend
*/2 * * * * /usr/local/news/bin/rnews -U

После каждого радактирования этого файла не забывайте запускать crontab -u news news.cron. Если вы выключаете компьютер на ночь, то проставьте в первой строчке подходящее время для запуска news.daily. Прочитайте man news.daily.

В идеале, все ваше взаимодействие с inn ограничится добавлением/убавлением линков и корректировкой их подписки в файле newsfeeds. Я бы не советовал делать это руками, лучше довериться areafix'у - по крайней мере, при правильной настройке вы сможете избежать грубых технических ошибок. Но несколько команд для "ручной" работы я здесь упомяну.

Практически все управление осуществляется программой /usr/local/news/bin/ctlinnd (при работающем innd). Прочитайте man ctlinnd. Перед тем, как менять какой-либо конфиг (типа newsfeeds, active) необходимо приостановить innd командой "ctlinnd pause причина". В данном случае "причина" - это слово(слова), которые попадут в news.notice, и которые понадобятся для "разморозки" innd. После изменения конфигурационных файлов необходимо их перечитать командой "ctlinnd reload имя_конфига причина". Если вы редактируете newsfeeds, то по окончании редактирования, перед запуском ctlinnd reload сначала запустите ctlinnd checkfile - он проверит синтаксис newsfeeds.
Для автосоздания новых эхоконференций, падающих обычно в junk (во всяком случае при вышеописанной настройке они должны падать именно туда ;) используйте различные программы-autocreate'ы


Hints :
  • кодировки koi8-r, windows-1251.
    Один из вариантов конфигурации, который может оказаться полезным в довольно типичном случае (юниксовый сервер и куча клиентских машин под Windows) : в ifmail'е вместо перекодировочных таблиц outaltkoi8 и outkoi8alt можно использовать таблицы alt-win.tab и win-alt.tab, взятые из Русского Апача (http://apache.lexa.ru) и подправленные на предмет русской "Н". В такой конфигурации ifmail будет "скармливать" статьи inn'у не в koi8-r а в windows-1251. Ни для кого из фидошных линков это не заметно, но для локальных пользователей очень удобно, т.к. не надо заморачиваться с приручением ньюсридера к koi8-r путем подстановки шрифтов/хаканья бинарников/подкручивании виндов и т.п., а можно взять любой ньюсридер, который даже и не знает ничего о кодировках (но который, тем не менее, не работает в 7-bit only ;). При реализации такого подхода есть несколько особенностей :
    - если вы хотите читать ньюсы с консоли сервера (а зачем ? ;), то ваша читалка должна будет понимать windows-1251. Или используйте cyrproxy (см. ниже)
    - вашим локальным пользователям придется получать/отправлять фидошный нетмейл тоже в 1251 кодировке. Впрочем, TheBat! позволяет выставлять любую русскую кодировку.
    - некоторые вспомогательные программы (в основном генераторы отчетов и т.п.) могут быть немножко заточены под koi8-r.
    Другим решением проблемы с кодировками может быть использование cyrproxy (http://www.lexa.ru/lexa/) для перекодировки между koi8-r на сервере и windows-1251 у клиентов. Опять-таки для локальных пользователей это почти не заметно, и для inn 2.3.* я использую именно этот вариант.
  • ньюсридеры
    Вообще, если посмотреть хотя бы на www.winfiles.com, то выбор ньюсридеров велик. Но более-менее известных не очень много : Outlook, Forte Agent, NewsXPress, XNews, ... О "русификации" ньюсридеров можно почитать на http://koi8.pp.ru/
  • транзитные (passthru) эхи.
    Организовать passthru-эхи можно несколькими способами. Итак :
    - можно для passthru эх установить режим хранения CNFS с небольшим размером. Но не слишком маленьким - иначе при приходе большого количества почты, iftoss может растоссить столько почты, что в CNFS буфере новая почта может затереть еще ту, что еще не успела скормиться ifpack'у;
    - можно хранить passthru эхи в traditional спуле, но установить для них в expire.ctl срок expire одни сутки (можно меньше);
    - any other ways ?
  • ньюсы от провайдера
    Если у вас есть доступ к ньюс-серверу по nnrp, то можно совместить доставку и обработку фидошных конференций и usenet-ньюсов, используя специальные программы, например suck.. Впрочем, если достаточно только читать usenet-ньюсы, то лучше использовать программку pullnews, идущую в комплекте с inn.
  • что еще почитать
    Если хотите поподробнее почитать про inn на русском, то рекомендую http://www.citforum.ru/internet/common/inn.shtml - только учтите, что там описывается процесс компиляция старой версии inn'а - 1.7.2, в 2.3.* он несколько изменился, но что касается общей информации - рекомендую почитать.


  • This is a part of "HOWTO : fidonet software for unix", http://howto.id.ru
    Copyright (c) Vitaly Kuharev, 2:5058/49@fidonet, 1999-2000
    Last updated : 14 Dec 2000

          

    Связь | О проекте LinuxRSP | Реклама | О Linux
    © 1999-2017 LinuxRSP