Сетевое радио - mod_mp3 к apache1.3
07.01.2010 21:28
Администратор
Сетевое радио - mod_mp3 к apache1.3
Автор: lissyara. Оригинал: http://www.lissyara.su/articles/freebsd/www/mod_mp3/
Нашёл в портах интересный модуль mod_mp3 - позволяет сделать из апача сетевую радиостанцию. Причём не тупо вещщающую по списку, а несколько, индивидуально, чтоль... Короче если песня не нравится - жмёшь в ВинАмпе кнопку "следующий" - и он играет следующую :) Удобно. Я себе дома привернул - лень перестраивать список воспроизведения, если что-то добавиться-убавиться, при перезапуска апача сам заново построится :) Ставим из портов. В портах, на данный момент, представлена версия 0.4 - хотя на сайте разработчика можно взять нестабильную 1.2. Я ставил из портов./usr/home/lissyara/>cd /usr/ports/ /usr/ports/>make search name='mod_mp3' Port: mod_mp3-0.40 Path: /usr/ports/www/mod_mp3 Info: Apache module to allow MP3 streaming Maint:
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
B-deps: apache-1.3.34_3 expat-1.95.8_3 perl-5.8.7_2 R-deps: apache-1.3.34_3 expat-1.95.8_3 perl-5.8.7_2 WWW: http://tangent.org/index.pl?lastnode_id=478&node_id=380
/usr/ports/>cd /usr/ports/www/mod_mp3 /usr/ports/www/mod_mp3/>make && make install && make clean ............................. ************************************************************ You've installed mod_mp3, a MP3 streaming module for Apache.
Edit your apache.conf or httpd.conf to enable and setup this module. Have a look at the files in ${PREFIX}/share/doc/mod_mp3 for information on how to configure it etc.
Then do this to make it work effective:
# apachectl configtest (see if there are any config errors) # apachectl restart
************************************************************ /usr/ports/www/mod_mp3/>
Очень советую почитать документацию по программе, идущую в комплекте, особенно FAQ - там несколько толковых примеров. После осмыслении доков раскомментируем в /usr/local/etc/apache/httpd.conf следующие строки: LoadModule mp3_module libexec/apache/mod_mp3.so AddModule mod_mp3.c
и туда же добавляем ещё один виртуальный хост (наскока я понял - не обязательно прям уникальное имя, можно обойтись виртуальным хостом на нестандартном порту - но я изгаляться не стал): ####### модуль mod_mp3 ####### <VirtualHost *:80> # Имя сервера (если обратиться не по имени - не подконнектится...) # звёздочка - значит любое. ServerName muzik.lissyara.su # Админ сервера - если будет ошибка то выводится этот адрес ServerAdmin
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
# Куда, собственно пишем ошибки сервера ErrorLog /var/log/httpd-error.log <IfModule mod_mp3.c> # Исчо не знаю чё такое #SetEnvIfNoCase User-Agent mozilla is_a_browser # Собственно, включен или выключен (On/Off) модуль mp3 MP3Engine On # Количество одновременных коннектов при воспроизведении # музона. В оригинальной доке даже правило приводится, как # его правильно рассчитать, в зависимости от ширины канала. MP3LimitPlayConnections 4 # Имя Радиостанции (если слушать из-под форточек - # надо чтобы было в кодировке cp1251, я извратился так: # echo 'Вы слушаете радиостанцию \"Эхо унитазного бачка...\"' \ # | iconv -f koi8-r -t cp1251 >> httpd.conf # ну а внутри httpd.conf переместил куда надо в Midnight Commander) MP3CastName "Вы слушаете радиостанцию \"Эхо унитазного бачка...\"" # Тип радио (классика, рок, попса...) MP3Genre "Тока RAMMS+EIN" # Апач шерстит нижеуказанную директорию, составляет список # всех композиций (рекурсивно) и воспроизводит их MP3 "/usr/local/smb/movie/muzik/" # Плэйлист - у меня так и не получилось чтоб с ним заработал #MP3Playlist /usr/home/lissyara/playlist.txt # Какой-то режим, наскока я понял - позволяет прилеплять # комменты к композициям - тоже не пошло... # MP3Stream On # Случайное воспроизведение MP3Random On # Если эту опцию раскомментировать то показывается список # всех треков на сервере, и у посетителя есть выбор - какую # песню слушать, или слушать весь список... # MP3DefaultOperation select </IfModule> </VirtualHost>
Насчёт виртуальных хостов, если будете делать как-то иначе - советую посмотреть документацию по apache. Там всё толково разжёвано. Перезапускаем апач:/usr/local/etc/apache/>/usr/local/etc/rc.d/apache.sh restart Stopping apache. Waiting for PIDS: 22982. Starting apache. /usr/local/etc/apache/>ps -ax | grep httpd 27508 ?? Ds 0:02,85 /usr/local/sbin/httpd 27685 p0 S+ 0:00,02 grep httpd /usr/local/etc/apache/>
И по адресу и порту указанному в настройках слушаем музыку :) Надо сразу отметить - если музыки в указанной директории много (у меня 13Gb, 2500 файлов) то запуск апача займёт некоторое время - ему же надо пройтись по всем директориям и составить список. Опять-таки у меня, с тем количеством файлов, что указано, на AMD K6-II 550MHz на запуск уходит секунд 30. Ещё столько же после этого он чё-то делает и только после этого начинает играть музыка. Загрузка проца сервера не очень большая - на моей машине это было 1-2% на каждого клиента. Копейки. Также учтите - пользователь www должен иметь право доступа к музыке - хотя б чтение. Впрочем, если Вы специально не ограничивали права на диркторию и музыкальные файлы - всё должно быть пучком.
Косяки: Если файл с "интересным" бирейтом, типа 135 и подобное, не кратное двум, то воспроизводится он вдвое быстрей чем положено :)
Обновлено 28.05.2010 13:24
скрипт блокировки спамеров на www средствами ipfw table и nginx
07.01.2010 21:26
Администратор
скрипт блокировки спамеров на www средствами ipfw table и nginx
Автор: ProFTP. Оригинал: http://www.lissyara.su/articles/freebsd/www/spam_blosking_with_using_ipfw_table/
задача: закрыть спам на сайтах.
есть черный список (black list) ip на сайте http://www.stopforumspam.com/ (есть и другие списки), список часто обновляется. В blacklist входя прокси-сервера, взломанные машины через которые боты пытаються спамить на все www сразу...
проще всего добаавить в ipfw таблицу, после блокировки максимум 1 спам сообщение за несколько суток или за неделю.
ipfw table:add deny ip from table(1) to any
ee /root/spamstop.pl#!/usr/bin/perl
# use File::Pid; # my $pidfile = File::Pid->new( { file => '/var/run/x0.pid', } ); # my $pid = $pidfile->running; # die "Service already running: $pid\n" if $pid; # $pidfile->write; ## можно раскомментировать, это для того чтобы скрипт ## одновременно повторно не запустился
use LWP::Simple;
my $spam = get("http://www.stopforumspam.com/downloads/bannedips.csv");
# system("ipfw table 1 flush > /dev/null &") if (defined $spam);
open( IP, "ipfw table 1 list |" ); $/ = ''; # Включить режим чтения абзацев my $use_ip = <IP>; close IP;
# IP которые уже присутствуют в таблице не удаляются # а добавляются новые тех которых нету my %seen; @seen{ return_ip($spam) } = (); delete @seen{ return_ip($use_ip) };
#print keys %seen;
foreach (keys %seen) { print $_; system("exec ipfw table 1 add ".$_ ); # system("exec ipfw table 1 add $_ > /dev/null &");
}
sub return_ip { # print $_[0]; my $hash; $hash->{$1}++ while $_[0] =~ /(\d+\.\d+\.\d+\.\d+)/smg xor grep { $_ > 255 } split /\./, $1; return keys %$hash;
}
# $pidfile->remove; ## можно раскомментировать, это для того чтобы скрипт ## одновременно повторно не запустился
exit;
crontab:8 0 * * * root /root/spamstop.pl
или запускать скрипт, через каждых 3 часа:0 */3 * * * root /root/spamstop.pl
можно при старте системы добавить этот скрипт в /usr/local/etc/rc.d/
скрипт выполняется не быстро, 4-10 минут, грузит процессор, можно попробовать вариант быстрого добавления в ipfw таблицу ЧСВ python биндинг для ipfw бацаю
ipfw -a list | grep table 00150 1317 65171 deny ip from table(1) to any
======== ======== ========
вариант помягче: http://forum.lissyara.su/viewtopic.php?f=14&t=16531#p159781
теперь в фаерволле у меня правило: 00530 fwd 127.0.0.1,8013 tcp from table(1) to me dst-port 80
а 127.0.0.1:8013 слушает nginx (основной вебсервер апач на 80 порту, а nginx только для быстрого отлупа "форум-спамера")
вот конфиг nginx #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 10; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] $request ' # '"$status" $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 1; #gzip on; server { listen 127.0.0.1:8013; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; error_page 400 401 403 404 500 502 503 504 =200 /index.html; location / { root /usr/local/www/nginx; index index.html index.htm; } } }
а в index.html что-то типа этого <html> <head> <title>Welcome to zztop!</title> </head> <body bgcolor="white" text="black"> <center><h1>You are seing this page, because you are in blacklist. </h1></center> <center><h2>Visit http://www.stopforumspam.com/ to check you IP, or contact me:
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
</h2></center> <center><h3>Best regards, St. Me.</h3></center> </body> </html>
Результат: - nginx как "легкий" веб-сервер отлично и быстро отдает статику типа маленького html файлика, в котором написано что пользователь в стоп-листе - если пользователь оказывается в стоп-листе, то он не тупо отфаерволивается, а редиректится на nginx, где его посылают, но красиво :) - в апач запросы спамера не попадут вообще, т.е. он их не будет обрабатывать, и 1) нагружаться; 2) позволять роботам постить спам
Обновлено 28.05.2010 13:38
|
Настройка хостинга под apache + PHP + MySQL
07.01.2010 21:23
Администратор
Настройка хостинга под apache + PHP + MySQL
Автор: lissyara. Оригинал: http://www.lissyara.su/articles/freebsd/www/apache1.3_+_php_+_mysql/
Был у конторы хостинг, для клиентов, бесплатный - как дополнение к тарифным планам с большим траффиком. Десятка полтора сайтов на FreeBSD4.11, apache1.3, php4, mysql4.0 - ничё особенного. Достался он мне по наследству, от старых админов, всё настроено, работает, что называется - не трожь. Но однажды переполнился раздел /var - почтовый спул занял всё свободное место. Недолгое разбирательство выяснило - все письма отправлены с какого-то из сайтов, и в них спам. С какого - выяснить не представлялось возможным - письма шли от пользователля www. Спул почистил, залочил в php.ini функцию mail(), сел думать - что можно сделать подручными средствами. У всех знакомых, работавших у хостеров, были самописные фичи на эту тему - они меняли идентификатор пользователя процесса apache. Апач меня не интересовал - у него своих средств для защиты хватало, а вот php, крутившийся модулем, - работал от того же пользователя, что и апач, - а это не есть гуд. Из других решений - php как CGI. Почитав, понял - подойдёт. Работать будет медленней, чем модулем, т.к. будут дополнительные затраты на порождение дополнительного процесса, но во FreeBSD это досточно шустрый процесс (хотя и накладный, не отрицаю), поэтому особого замедления быть не должно. Итак, начинаем с апача - нам нужен suexec - он позволяет выполнять пользовательские программы от его имени, незавимо от того, под каким пользователем работает сам http-сервер. Таким образом, для апача нам надо будет лишь предоставить доступ на чтение, включив его в группу пользователя, а всем - запретить вообще доступ. Ставим апач (если стоял - сносим и ставим заново), для начала добавив в файл /etc/make.conf такие строки:# Директория где лежат порты PORTSDIR?= /usr/ports
# APACHE .if ${.CURDIR} == ${PORTSDIR}/www/apache13 # Для запуска CGI-скриптов от gid и uid пользователя, а не WEB-сервера WITH_APACHE_SUEXEC=yes # Где будет работать suexec (ещё будет в userdir) APACHE_SUEXEC_DOCROOT=/usr/local/hosting # Пользовательские директории, в которых будет работать suexec APACHE_SUEXEC_USERDIR="/usr/local/hosting/*/cgi-bin" # Настройки производительности (без комментов - объяснений толковых не нашёл, # а может торопился и плохо искал...) APACHE_SUEXEC_LOG=/usr/local/var/log/httpd-suexec.log APACHE_HARD_SERVER_LIMIT=yes WITH_APACHE_PERF_TUNING=yes APACHE_HARD_SERVER_LIMIT=1024 .endif
После чего, собственно, пересобираем:/usr/home/lissyara/>cd /usr/ports/www/apache13 /usr/ports/www/apache13/>make deinstall && make clean && make \ ? && make install && make clean
После этого, создаём новый класс пользователей, которых будем ограничивать, у меня он называется ``webuser''. Для этого, в файл /etc/login.conf добавляем такую секцию:# конфиг для клиентов. Сразуже - пояснения: # copyright - файл содержащий информацию о копирайтах # welcome - приветсвенное сообщение, выводится при входе по ssh. Я пока не # планирую давать доступ по ssh - но на будущее возможно пригодится. # setenv - устанавливаем переменные пользователя # path - пути к исполняемым программам # manpath - пути к манам # nologin - местоположение программы, вывоящей сообщение о блокировке аккаунта # cputime - предел использования CPU # datasize - максимальный размер данных пользователя (в памяти) # stacksize - максимальный размер стека # memorylocked - максимальный размер залоченой памяти ядра # memoryuse - ограничение размера используемой памяти ядра # filesize - максимальный размер файла # coredumpsize - максимальный размер создаваемого дампа (при ошибках) # openfiles - максимальное число открытых файлов, на процесс # maxproc - максимальное число процессов # sbsize - максимальный разрешённый размер буфера сокета # priority - приоритет исполняемых процессов # requirehome - для логина пользователя требуется реально существующая # домашняя директория # umask - начальная umask для создаваемых файлов # tc - остальные переменные берём из указанного класса
webuser:\ :copyright=/etc/COPYRIGHT:\ :welcome=/etc/motd:\ :setenv=MAIL=/var/mail/$,BLOCKSIZE=K,EDITOR=ee:\ :path=/bin /usr/bin /usr/local/bin:\ :manpath=/usr/share/man /usr/local/man:\ :nologin=/sbin/nologin:\ :cputime=5m:\ :datasize=512M:\ :stacksize=4M:\ :memorylocked=64M:\ :memoryuse=256M:\ :filesize=512M:\ :coredumpsize=0:\ :openfiles=1024:\ :maxproc=64:\ :sbsize=unlimited:\ :priority=20:\ :requirehome:\ :umask=026:\ :tc=default:
Пересобираем БД классов пользователей:/usr/home/lissyara/>cap_mkdb -v /etc/login.conf cap_mkdb: 10 capability records /usr/home/lissyara/>
Теперь надо поставить квоты на файловую систему, где у нас хостинг (надеюсь, вы не пускаете юзеров пастись в /usr и прочих системных разделах?). Вначале, я попробовал воткнуть её слёту:/usr/home/lissyara/>echo 'enable_quotas="YES"' >> /etc/rc.conf
Перезагрузился, и попробовал поставить квоту:/usr/home/lissyara/for_hosting/> /usr/home/lissyara/for_hosting/>edquota -u user_name2 edquota: warning: quotas are not compiled into this kernel edquota: creating quota file /usr/local/quota.user
Непрокатило :). Для этого в ядре должна быть её поддержка, для чего вносим в конфиг такую опцию:options QUOTA
Надо заметить ещё такой момент, во FreeBSD есть ограничение, пользователь не может входить более чем в 16 групп, это очень старое ограничение, связянное каким-то боком с NFS. В данном случае, в процессе экспериментов, я в него очень быстро упёрся - согласно создаваемой системе, у каждого пользователя будет своя персональная группа, в которую кроме пользователя входит пользователь www - от него работает apache. Если его не включить в неё, то он не сможет читать файлы в дирекориях пользователя. При других раскладках - типа, все пользователи в одной группе - косяк с безопасностью - есть возможность, что прочтут чужие файлы. Поэтому пришлось найти где это ограничение забито и подправить. Это файл /usr/src/sys/sys/syslimits.h, в нем редактируем такую строку:#define NGROUPS_MAX 64 /* max supplemental group id's */
Из минусов - надо помнить про эту опцию, при обновлениях, ну и при передаче дел неплохо бы упомянуть. Вроде как с 7.0 должны сделать это ограничение "мягким" - можно будет его менять через sysctl. На данный момент, во всех версиях, его менять нельзя - переменная есть, но не меняется:/usr/home/lissyara/>sysctl -a | grep ngroup kern.ngroups: 16 /usr/home/lissyara/>sysctl kern.ngroups=64 sysctl: oid 'kern.ngroups' is read only /usr/home/lissyara/>
Короче - ставим сколько надо (всё не тестил, но вроде как всё рабтает нормально, правда, для верности, пересобирал вообще всё - мир, ядро, и все установленные приложения. Каюсь - метод, всёже косячный, но умней ничё в башке не родилось, да и время поджимало). Пересобираем ядро. Это описано у меня, и в хандбуке. Пока ядро пересобирается, готовимся, надо подправить /etc/fstab. Правим строку, относящуюся к монтированию раздела где живут сайты пользователей. У меня, в итоге, оно выглядит так:# устройство Куда моунтим ФС опции дамп /dev/ad2s1e /usr/local/hosting ufs rw,userquota,nosuid 2 2
Также, добавляем такую строку в /etc/pw.conf, чтобы при создании пользователя, генерились рандомные пароли:defaultpasswd=random
По окончании сборки ядра перезагружаемся, и снова пробуем запустить edquota - если пройдёт без ошибок - значит всё нормально. (не забываем добавить вышеописанную строчку про 'enable_quotas="YES"' в /etc/rc.conf!). Далее, я настругал небольшой скриптик, для администрирования всего этого добра:#!/bin/sh -
# Скрипт для создания клиентской шары, и заведения нужного пользователя # в системе. Написан lissyara 2006-10-02 - 2006-10-09 www.lisssyara.su
# Ограничения заводимого пользователя - сколько может занимать места, # и сколько инод ему выделять (фактически, это - максимальное число файлов # и директоий которые он сможет завести. Но не точно. # Реально - может быть меньше). 0 - анлим. user_datasize="500000" # В килобайтах в 4.11 и в Mb в 6.1, почему так - # я не понял. будте внимательны. user_inode="100000" # Иноды не резиновые. Оцените число командой # `df -i` и решайте какие у вас должны быть лимиты # Файловая система, на которую вносим ограничения fs="/usr/local/hosting" # Данные для MySQL mysql_user="root" mysql_passwd=""
# Переменные: domain_name="$1" user_name="$2"
# программы cat="/bin/cat" # Перенаправление потоков ввода-вывода awk="/usr/bin/awk" # Язык обработки шаблонов echo="/bin/echo" # Вывод строк на экран grep="/usr/bin/grep" # Выбор строк по шаблону pw="/usr/sbin/pw" # Управление учётками, группами пользователей rm="/bin/rm" # Удаление файлов и директорий mkdir="/bin/mkdir" # Создание директорий chown="/usr/sbin/chown" # Выставление владельца файлов и директорий php="/usr/local/bin/php-cgi" # Бинарник PHP для использования в виде CGI cp="/bin/cp" # Копирование файлов и директорий mysql="/usr/local/bin/mysql" # MySQL - клиент wc="/usr/bin/wc" # подсчёт числа строк cut="/usr/bin/cut" # Обрезка строк md5="/sbin/md5" # подсчёт md5 файлов, строк jot="/usr/bin/jot" # генерация случйного числа tail="/usr/bin/tail" # Показывает последнюю часть файла edquota="/usr/sbin/edquota" # редактор квот ls="/bin/ls" # Kbcnbyu диреткорий, файлов chflags="/usr/bin/chflags" # Утановка флагов на файл tr="/usr/bin/tr" # Замена, удаление символов в строке mysqldump="/usr/local/bin/mysqldump" # Содание дампов MySQL gzip="/usr/bin/gzip" # Архиватор rm="/bin/rm" # Удаление файлов и директорий mv="/bin/mv" # Перемещение файлов и директорий basename="/usr/bin/basename" # Вывод базового имени файла (из полного пути) uname="/usr/bin/uname" # Информация о локальной машине
# Файл с настройками php php_ini="/usr/local/etc/php.ini-for-hosting" # Временный файл - для технических нужд tmp_file="/tmp/$$.file.tmp" # Файл с системными альясами (для почты - отлупы на письма с сайтов будут # возвращаться на этот сервер, надо их пересылать на пользователя, у меня # забито как info@домен_пользователя) aliases_file="/etc/aliases" # На самом деле, во фре, это симлинк на # файл /etc/mail/aliases. # Директория хостинга hosting_preffix="/usr/local/hosting/sites" # Директория для бэкапов удалённых сайтов backup_dir="/usr/local/hosting/backup"
# Строим префикс для работы с БД query_preffix="${mysql} --user=${mysql_user} --password=${mysql_passwd} \ --database=mysql"
# Проверяем наличие приложений - в разных версиях FreeBSD разные пути for application in ${cat} ${awk} ${echo} ${grep} ${pw} ${rm} ${mkdir} \ ${chown} ${php} ${cp} ${mysql} ${wc} ${cut} ${md5} ${jot} ${tail} \ ${edquota} ${ls} ${chflags} ${tr} ${mysqldump} ${gzip} ${rm} ${mv} \ ${basename} ${uname} ${php_ini} do if [ ! -s ${application} ]; then echo "Приложение \`\`${application}'' не найдено! Проверьте путь!" exit fi done
# Поехали :))) case "$3" in create)
# Проверяем, не начинается ли имя пользователя с цифры (у `pw`, в этом случае # будут проблемы с созданием группы пользователя. Либо руками, либо эта # проверка. Я решил что лучше с цифры не начинать.) ${echo} "11111111111" >> ${tmp_file} ${echo} ${user_name} | ${grep} -v "^[0-9]" > ${tmp_file} # проверяем размер файла - не равен ли нулю if [ -s ${tmp_file} ] then # Ничё не делаем ${rm} ${tmp_file} else # Пытаются пользователя с первой цифрой всандалить. ${echo} "Имя пользователя не может начинаться с цифры!!" ${rm} ${tmp_file} exit fi
# Проверяем, не содержит ли имя пользователя точки: ${echo} ${user_name} | ${tr} -d "[:alnum:]" | ${grep} "\." > ${tmp_file} if [ -s ${tmp_file} ] then # Пытаются пользователя с точками в имени всандалить. ${echo} "Имя пользователя не может содержать точки!!" ${rm} ${tmp_file} exit else # Ничё не делаем ${rm} ${tmp_file} fi
# Проверяем уникальность имени пользователя ${cat} /etc/passwd | ${awk} -F ":" '{print $1}' | ${grep} "^[:alnum:]" | { while read existing_user_name do if [ ${existing_user_name} = ${user_name} ] then # Есть такой юзер. Ругаемся, выходим ${echo} "Пользователь с именем \"${user_name}\" существует!" # пишем временный файл, чтоб передать инфу из цикла ${echo} 1 > ${tmp_file} exit fi done } # Проверяем наличие и содержимое временного файла. if [ -s ${tmp_file} ] then if [ `cat ${tmp_file}` -eq 1 ] then ${rm} ${tmp_file} # удаляем временный файл exit # выходим fi fi
# проверяем, нету ли такого виртуалхоста в apache if [ -s ${hosting_preffix}/../httpd_configs/${domain_name}.conf ] then # Уже есть такой виртуалхост ${echo} "Хост с именем \"${domain_name}\" уже есть в конфиге!" exit fi
# такого пользователя нет - заводим в системе user_passwd="`${pw} useradd ${user_name} -c \"UserDomain = \ ${domain_name}\" -L webuser -s /bin/csh -d ${hosting_preffix}/${user_name}`" # Добавляем апаче в группу пользователя ${pw} groupmod ${user_name} -m www
# Создаём структуру директорий для пользователя ${mkdir} -p ${hosting_preffix}/${user_name}/log ${mkdir} -p ${hosting_preffix}/${user_name}/www ${mkdir} -p ${hosting_preffix}/${user_name}/cgi-bin ${mkdir} -p ${hosting_preffix}/${user_name}/tmp
# копируем файлы в CGI ${cp} ${php} ${hosting_preffix}/${user_name}/cgi-bin/ ${cp} ${php_ini} ${hosting_preffix}/${user_name}/cgi-bin/
# Даём права на эти директории ${chown} -R ${user_name}:${user_name} ${hosting_preffix}/${user_name}
# Ставим флаги на php.ini ${chflags} sunlnk ${hosting_preffix}/${user_name}/cgi-bin/php.ini ${chflags} schg ${hosting_preffix}/${user_name}/cgi-bin/php.ini
# Добавляем пользователя в список тех, кто chroot`ится при # заходе по FTP ${echo} ${user_name} >> /etc/ftpchroot
# Стругаем квоты для пользователя ${edquota} -e \ ${fs}:${user_datasize}:${user_datasize}:${user_inode}:${user_inode} \ ${user_name}
# Стругаем пароль для MySQL mysql_user_passwd="`${jot} -r 1 0 9000000 | ${md5} -p | ${tail} -1 \ | ${cut} -c 1-8`"
# Заводим пользователя в MySQL ${query_preffix} --execute="CREATE DATABASE IF NOT EXISTS \`${user_name}_db\`" ${query_preffix} --execute="GRANT ALL PRIVILEGES on \`${user_name}_db\`.* to \ '${user_name}'@'localhost' IDENTIFIED BY '${mysql_user_passwd}'"
# Создаём виртуалхост в апаче ${echo} "# Этот файл создан автоматически, скриптом `basename $0`
# Virtual host added by \`$USER\`, `date +%Y-%m-%d` in `date +%H:%M:%S` # from host = \`$REMOTEHOST\`, host IP = \``echo $SSH_CLIENT | awk '{print $1}'`\`
<VirtualHost *:80> ScriptAlias /cgi-bin/ ${hosting_preffix}/${user_name}/cgi-bin/ ServerAdmin support@${domain_name} User ${user_name} Group ${user_name} DocumentRoot ${hosting_preffix}/${user_name}/www ServerName ${domain_name} ServerAlias www.${domain_name} # Директория пользователя <Directory "${hosting_preffix}/${user_name}/www"> Options Indexes FollowSymLinks MultiViews AllowOverride All Order deny,allow Allow from all </Directory> DirectoryIndex index.php index.html index.htm index.shtml index.php3 AddType application/x-httpd-php .php .php3 Action application/x-httpd-php /cgi-bin/php-cgi ErrorLog ${hosting_preffix}/${user_name}/log/error.log CustomLog ${hosting_preffix}/${user_name}/log/access.log common </VirtualHost>
" >> ${hosting_preffix}/../httpd_configs/${domain_name}.conf
# Создаём почтовый альяс для юзера (иначе его почта будет захламлять # раздел /var). У меня стоит exim в простейшей (дефолтовой) конфигурации, # т.к. мыльница для клиентов не на хостинге, а на отдельном сервере, # и он работает с системными пользователями. Если будете делать по другому, # перепишите этот кусок под себя. $echo " # Alias for user = ${user_name}, domain = ${domain_name}, # added by \`$USER\`, `date +%Y-%m-%d` in `date +%H:%M:%S` # from host = \`$REMOTEHOST\`, host IP = \``echo $SSH_CLIENT | awk '{print $1}'`\` ${user_name}: info@${domain_name} " >> ${aliases_file}
${echo} "Имя домена: ${domain_name}" ${echo} "Имя пользователя: ${user_name}" ${echo} "Пароль пользователя(FTP, SSH): ${user_passwd}" ${echo} "Имя базы данных: ${user_name}_db" ${echo} "Пароль пользователя (MySQL): ${mysql_user_passwd}" ${echo} "Квота пользователя: ${user_datasize}" ${echo} -n "Альяс почты (${aliases_file}) ${user_name}@`${uname} -n`" ${echo} " --> info@${domain_name}" ;; delete) ${echo} "Вы действительно хотите удалить пользователя и домен?!" ${echo} "Наберите YES для подтверждения, или Ctrl+C для выхода..." read confirmation if [ $confirmation = YES ] > /dev/null 2>&1 then # Подтверждено. # Стругаем директорию ${mkdir} -p ${backup_dir}/${domain_name} # снимаем флаги с директории юзера ${chflags} -R nosunlnk ${hosting_preffix}/${user_name}/* ${chflags} -R noschg ${hosting_preffix}/${user_name}/* # Копируем содержимое ${echo} "Копируются пользовательские данные..." ${cp} -R ${hosting_preffix}/${user_name} \ ${backup_dir}/${domain_name} # Дампим БД пользователя ${echo} "Делается дамп БД пользователя...." ${mysqldump} --user=${mysql_user} --password=${mysql_passwd} \ --database ${user_name}_db | ${gzip} > \ ${backup_dir}/${domain_name}/${user_name}_db.sql.gz # Сносим всё нахрен: # Перемещаем конфиг апача для этого домена ${mv} ${hosting_preffix}/../httpd_configs/${domain_name}.conf \ ${backup_dir}/${domain_name}/ # Удаляем доки: ${echo} "Удаляются пользовательские данные..." ${rm} -Rf ${hosting_preffix}/${user_name} # Удаляем БД ${echo} "Удаляется БД пользователя...." ${query_preffix} --execute="DROP DATABASE IF EXISTS \ \`${user_name}_db\`" # Удаляется пользователь из MySQL ${echo} "Удаляется пользователь из MySQL..." ${query_preffix} --execute="REVOKE ALL PRIVILEGES \ ON *.* FROM '${user_name}'@'localhost'" ${query_preffix} --execute="REVOKE GRANT OPTION \ ON *.* FROM '${user_name}'@'localhost'" ${query_preffix} --execute="DELETE FROM mysql.user WHERE \ User='${user_name}' and Host='localhost'" # Удаляется пользователь из системы ${echo} "Удаляется пользователь из системы..." ${pw} userdel ${user_name} ${echo} "Удаляется группа пользователя из системы..." ${pw} groupdel ${user_name} else # не захотел удалять :) ${echo} "Пользователь и его сайт были оставлены" fi ;; update) # Обновление версии php у всех пользователей. ${ls} ${hosting_preffix}/| { # идёт листинг сайтов, но т.к. имя пользователя и директории # одинаковые - значит это ещё и именя пользователей :) while read site_user_name do ${echo} "Идёт обновление версии php для пользователя ${site_user_name}" # Копируем новый ${cp} ${php} ${hosting_preffix}/${site_user_name}/cgi-bin/ # Даём права на него ${chown} ${site_user_name}:${site_user_name} \ ${hosting_preffix}/${site_user_name}/cgi-bin/`${basename} ${php}` done } ${echo} "Обновление завершено!" ;; *)
${echo} "" ${echo} "Этот скрипт создаёт пользователя в системе, генерит ему пароль, создаёт базу данных MySQL, генерит для неё пароль, выставляет квоты на использование ресурсов системы - на данный момент все новые пользователи равноправны - смотрите в login.conf класс 'webuser'. Текущие ограничения: Места: 500mb (правиться в этом файле) Инод: 10000 (правиться в этом файле) Процессов: 64 (правиться в login.conf) Время работы процесса: 5 минут (правиться в login.conf) Размер стека: 4mb (правиться в login.conf) Размер блокируемой оперативки: 64mb (правиться в login.conf) Макимальный объём оперативки: 256mb (правиться в login.conf) Максимальный размер файла: 100mb (правиться в login.conf) Открытых файлов на процесс: 1024 (правиться в login.conf) Приоритет приложений: 20 (правиться в login.conf)
Внимание! На файл php.ini ставяться флаги \`schg\` и \`sunlnk\`, не сняв их - файл не уалить и не изменить! Цель - не позволить юзеру менять свои настройки php. Удаление флагов: chflags noschg php.ini chflags nosunlnk php.ini Установка: chflags schg php.ini chflags sunlnk php.ini (Может понадобиться на случай если надо всё-таи чё-то поменять в дефолтовом файле. Но не забывайте вернуть флаги!)
Также есть предложение придерживаться определённого именования юзеров для их сайтов - типа если домен называется \`some.com\` то юзер должен быть \`somecom\` - так понятней. Либо, как вариант, завести таблицу, типа: 1- su, 2 - ru, 3 -com и т.п. и добавлять эти цифры в конце. Кому как удобней будет. На данном сервере, под FreeBSD 4.11, ограничение на длинну имени пользователя - 16 символов. Если длинней - придётся обрубать с конца, или ещё как - чтобы не совпадало с существующими.
Про удаление - перед удалением всё бэкаптся, кроме учётки пользователя.
Про обновления - имя пользователя и домен - любые. Нужно при обновлении версии php на сервере. Обновляются все бинарники и перевыставляются права.
P.S. Не забывайте перезапускать апач после создания-удаления!" ${echo} "" ${echo} "Использование: `${basename} $0` \ {domainname username create|delete|update}" >&2 ${echo} "" exit 64 ;; esac
Можете воспользоваться моим, а можете делать всё руками - решать вам. Тока к скипту надо одно пояснение - он удалит любого системного пользователя, если по ошибке вы воткнёте его имя в качастве параметра с командой на удаление. Поэтому, если не понимаете, как оно работает - не надо пользоваться. Там есть защита от дурака, но от дурака умного. У меня он пашет, а как будет у вас - не знаю. Небольшое замечание по поводу пути к файлу php.ini. В том файле, что копируется, я подправил лишь несколько пунктов, вот их настройки:safe_mode = On safe_mode_gid = On disable_functions = system # поправка - этот пункт лучше так не ставить - php некорректно # это обрабатывает... может даже не php но у пары клиентов # были проблемы с аплоадом файлов на сервер, пока # не поставил абсолютный путь... #upload_tmp_dir = ../tmp session.save_path = ../tmp session.auto_start = 1 upload_max_filesize = 4M memory_limit = 64M
А вообще, возьмите файл /usr/local/etc/php.ini-recommended, и правьте его под свои нужды. После проделанного, не забываем поставить парва на скрипт - в нём хранится рутовый пароль от MySQL (в принципе, можно заюзать флаг "-p", чтобы запрашивал его каждый раз, или отдельную переменную, а потом подставлять её значение - смотрите сами.)/usr/local/hosting/scripts/>chmod 700 create_client.sh /usr/local/hosting/scripts/>chown root:wheel create_client.sh /usr/local/hosting/scripts/>ls -alh create_client.sh -rwx------ 1 root wheel 12K 24 окт 10:47 create_client.sh
Ну и пробуем скриптик:/usr/local/hosting/scripts/>./create_client.sh testing.su testing create Имя домена: testing.su Имя пользователя: testing Пароль пользователя(FTP, SSH): QBnOXa2k8DCnGY3 Имя базы данных: testing_db Пароль пользователя (MySQL): 64cb2586 Квота пользователя: 500000 Альяс почты (/etc/aliases)
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
-->
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
/usr/local/hosting/scripts/> /usr/local/hosting/scripts/> /usr/local/hosting/scripts/> /usr/local/hosting/scripts/> /usr/local/hosting/scripts/>./create_client.sh testing.su testing delete Вы действительно хотите удалить пользователя и домен?! Наберите YES для подтверждения, или Ctrl+C для выхода... YES Копируются пользовательские данные... Делается дамп БД пользователя.... Удаляются пользовательские данные... Удаляется БД пользователя.... Удаляется пользователь из MySQL... Удаляется пользователь из системы... Удаляется группа пользователя из системы... /usr/local/hosting/scripts/>
Вот и всё. Соответствено, где надо подрихтуйте напильником под свои нужды (в 4.11 и 6.0 пару путей различаются), добавьте такие строки в конец конфига апача:NameVirtualHost *:80
# Это первый виртуалхост - он должен быть этого сервера, т.к. # иначе при обращении на несуществующие сайты будет выводиться # самый первый виртуалхост - это может оказаться чей-то из клиентов, # поэтому создаём скриптом, и копируем конфиг сюда. <VirtualHost *:80> ScriptAlias /cgi-bin/ /usr/local/hosting/sites/hosting/cgi-bin/ ServerAdmin
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
User hosting Group hosting DocumentRoot /usr/local/hosting/sites/hosting/www ServerName hosting.kontora.su ServerAlias www.hosting.kontora.su # Директория пользователя <Directory /usr/local/hosting/sites/hosting/www> Options Indexes FollowSymLinks MultiViews AllowOverride All Order deny,allow Allow from all </Directory> DirectoryIndex index.php index.html index.htm index.php3 AddType application/x-httpd-php .php .php3 Action application/x-httpd-php /cgi-bin/php-cgi ErrorLog /usr/local/hosting/sites/hosting/log/error.log CustomLog /usr/local/hosting/sites/hosting/log/access.log common </VirtualHost>
Include /usr/local/hosting/httpd_configs/*.conf
P.S.1 Настройки системы и php брались из головы, так, как я считал нужным. Может что-то и неправильно, или можно сделать лучше. Смотрите и думайте сами. P.S.2 Насчёт ограничения в 16 групп и правки исходников - это правда плохая идея. Хотя проблем вроде нету. И если знаете, как можно сделать грамотней - поделитесь... P.S.3 Настройки MySQL не рассмотрены сознательно,
Обновлено 28.05.2010 13:38
Устанавливаем форум phpBB-2 и phpBB-3
07.01.2010 21:20
Администратор
Устанавливаем форум phpBB-2 и phpBB-3
Автор: Raven2000. Оригинал: http://www.lissyara.su/articles/freebsd/www/install_phpbb-2+phpbb-3/
Сразу скажу это не статья, а заметка (само собой ясно, если ты поставил MySQL, Apache, и т.д., то уж тем более, поставшь форум). Однако, по результам голосования в ветке форума, отдельная статья победила большинством голосов. :) Сначала установим phpBB 2.0.22, затем phpBB 3.0.RC5.
Итак phpBB 2.0.22phpbb-2.0.22_1 A PHP-based bulletin board / discussion forum system Long description : Sources : Package : Changes : Download Maintained by:
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
Requires: libiconv-1.9.2_2, libxml2-2.6.29, pear-1.6.1, php5-5.2.3, php5-pcre-5.2.3, php5-xml-5.2.3, pkg-config-0.22
Для запуска форума необходимо:1) A webserver or web hosting account running on any major Operating System 2) A SQL database system, one of: MySQL (3.22 or higher) PostgreSQL 7.0.3 or higher (preferably 7.1.x or 7.2.x) MS SQL Server (7 or 2000) directly or via ODBC MS Access (2000 or XP) via ODBC 3) PHP (4.0.3 and above) with support for the database you intend to use above
Apache & MySQL I) Apache и PHP5 ставим по моей статье, читаем пункты Установка площадки и MySQL. II) Об установке MySQL хорошо описано в статье Лиссяры
1) Инсталируем# cd /usr/ports/www/phpbb && make install clean
2) VirtualHost Далее, в конфиге виртуального хоста, указываем директорию phpBB2<VirtualHost *:80> # Мыло админа ServerAdmin
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
# Рутовая папка DocumentRoot /usr/local/www/phpBB2 # Домен алиасы по которым виден хост ServerName forum.mynet.ru ServerAlias www.forum.mynet.ru ServerAlias main.forum.mynet.ru AddType application/x-httpd-php .php .php3 Action application/x-httpd-php /cgi-bin/php-cgi DirectoryIndex index.php index.php3 index.html # Логи ErrorLog /var/log/www/mynet.ru-error.log CustomLog /var/log/www/mynet.ru-custom.log combined # Настройка .htaccess и запрет просматривать его из браузера AccessFileName .htaccess <Files ~ ^.ht> Order allow,deny Deny from all </Files> </VirtualHost>
3) Создаем базу данных для форума на MySQLmysql> create database forum;
mysql> show databases; +--------------------+ | information_schema | | forum | | mysql | | typo3 | +--------------------+ 4 rows in set (0.00 sec)
4) Веб визард В браузере набираем http://IP_сайт/install/install.php Тут будет что-то вроде визарда#Ставим тип базы
Basic Configuration Database Type: MySQL 4.x/5.x Choose your installation method: Install
Database Configuration Database Server Hostname / DSN: localhost Your Database Name: forum Database Username: admin Database Password: 123456 Prefix for tables in database: phpbb_
Admin Configuration Admin Email Address:
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
Domain Name: forum.myhost.ru Server Port: 80 Script path: / Administrator Username: Vasia Administrator Password: 123456 Administrator Password [ Confirm ]: 123456
Далее нажимаем инсталяция и нам сообщают Все ок и кликаем Finish Instalation
Далее видим, что визард просит удалить директории install и contrib. Please ensure both the install/ and contrib/ directories are deleted что мы и делаем# rm -R /usr/local/www/phpBB2/install/
Теперь заходим на форум http://127.0.0.1/login.php (или http://IP_форум/index.php) логинимся админом и все - форум готов :) Для входа в административный раздел - ищем в самом низу слово Go to Administration Panel и кликнем на него.
5) Русификация форума Идем на http://www.phpbb.com/languages/?type=20x ищем строку Russian и качаем файлы lang_russian.tar.gz и subsilver_russian.tar.gz
распаковываем содержимое lang_russian.tar.gz с заменой файлов# tar -zxf lang_russian.tar.gz # cd lang_russian # cp -R * /usr/local/www/phpBB2/language/lang_english
распаковываем содержимое subsilver_russian.tar.gz, так же, заменив файлы# tar -zxf subsilver_russian.tar.gz # cd subSilver/images/lang_russian/ # cp * /usr/local/www/phpBB2/templates/subSilver/images/lang_english
Теперь установим phpbb-devel-3.0r3
1) Инсталляция# cd /usr/ports/www/phpbb-devel/ && make install clean
2) VirtualHost Далее, в конфиге виртуального хоста, указываем директорию phpBB3<VirtualHost *:80> # Мыло админа ServerAdmin
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
# Рутовая папка DocumentRoot /usr/local/www/phpBB3 # Домен алиасы по которым виден хост ServerName forum.mynet.ru ServerAlias www.forum.mynet.ru ServerAlias main.forum.mynet.ru AddType application/x-httpd-php .php .php3 Action application/x-httpd-php /cgi-bin/php-cgi DirectoryIndex index.php index.php3 index.html # Логи ErrorLog /var/log/www/mynet.ru-error.log CustomLog /var/log/www/mynet.ru-custom.log combined # Настройка .htaccess и запрет просматривать его из браузера AccessFileName .htaccess <Files ~ ^.ht> Order allow,deny Deny from all </Files> </VirtualHost>
3) Создание базы в MySQLmysql> create database forum2;
mysql> show databases; +--------------------+ | information_schema | | forum2 | | mysql | | typo3 | +--------------------+ 4 rows in set (0.00 sec)
4) Веб визард Стартуем Apache и набираем в браузере http://IP_Site/install/install.php В phpbb3 так же, имеется визард.
(Я бы посоветовал сразу руссифицировать инсталляцию. Для этого качаем lang_ru.tar.gz по адресу http://www.phpbb.com/languages/ и распаковываем содержимое архива в /usr/local/www/phpBB3/language/ru)
Далее, во вкладке Установка смотрим Tребования все ли установленно на сервере. При наличии всех необходимых компонентов, нажимаем внизу кнопку Начать Установку
Конфигурация базы данных (БД)Тип базы данных: MySQL Имя сервера БД или DSN: Порт сервера БД: Название базы данных: forum2 Имя пользователя БД: admin Пароль к БД: 123456 Префикс для таблиц в базе данных: phpbb_
C Настройкой администратора все понятно, нажимаем Next, пока не дойдем до раздела Расширенные настройки. В этом разделе внимательно заполняем поля, исходя из собственных настроек и предпочтений. Далее Next, Next (где-то я уже такое видел ;)) и все. Поздравляем! Вы успешно установили phpBB 3.0.RC3. Сейчас у вас есть два варианта, как поступить с только что установленным phpBB3:
Сконвертировать имеющуюся конференцию в phpBB3 Единая система конвертирования phpBB поддерживает конвертирование из phpBB 2.0.x и других типов конференций в phpBB3. Если у вас есть конференция, которую вы желаете сконвертировать, прейдите в систему конвертирования.
Начать пользоваться phpBB3! Нажмите на кнопку ниже, чтобы перейти в администраторский раздел. Уделите некоторое время изучению доступных пунктов меню и настроек. Помните о доступной в интернете документации и форуме техподдержки (на английском) а также Русскоязычном форуме перевода Olympus, за дополнительной информацией обратитесь к README.
Удалите, переместите или переименуйте папку install прежде чем начнёте пользоваться конференцией. В противном случае будет доступен только администраторский раздел.
Удаляем директорию install# rm -r /usr/local/www/phpBB3/install/
5) Русификация и настройка Руссифицирование phpbb3 мало чем отличается от второй версии, для этого необходимо:
скачать с сайта http://www.phpbb.com/languages/ в разделе Russia, файл lang_ru.tar.gz, prosilver_ru.tar.gz, subsilver2_ru.tar.gz.
Распаковываем содержимое архивов в phpBB3 # tar zxvf lang_ru.tar.gz # mv ru/ /usr/local/www/phpBB3/language/ru
# tar zxvf prosilver_ru.tar.gz # mv prosilver/imageset/ru/ /usr/local/www/phpBB3/styles/prosilver/imageset/ru/
# tar subsilver2_ru.tar.gz # mv subsilver2/imageset/ru/ /usr/local/www/phpBB3/styles/subsilver2/imageset/ru/
Затем в админке переключим на русский.
6) Обновление с RC4 до RCх На сайте www.phpbb.com заходим в раздел Downloads ищем там раздел [ Changed Files Only ] и качаем от туда файл phpBB-3.0.RCх-files.tar.bz2 Распаковываем содержимое архива в phpBB3# mv phpBB-3.0.RC5-files.tar.bz2 /usr/local/www/phpBB3/ # cd /usr/local/www/phpBB3/ # tar phpBB-3.0.RC5-files.tar.bz2
Распакованные файлы:x docs/ x docs/FAQ.html x docs/AUTHORS x docs/COPYING x docs/auth_api.html x docs/header_bg.jpg x docs/coding-guidelines.html x docs/header_left.jpg x docs/CHANGELOG.html x docs/INSTALL.html x docs/README.html x install/ x install/data/ x install/data/new_normalizer.php x install/data/confusables.php x install/install_main.php x install/index.php x install/phpinfo.php x install/database_update.php x phpBB-3.0.RC1_to_3.0.RC5.tar x phpBB-3.0.RC2_to_3.0.RC5.tar x phpBB-3.0.RC3_to_3.0.RC5.tar x phpBB-3.0.RC4_to_3.0.RC5.tar
Далее запускаем Apache и в браузере набираем http://IP_сайт//install/database_update.php Он обновит базу данных до последней стабильной версии и выдастОбновление базы данных до последней стабильной версии
Тип базы данных :: mysql4 Предыдущая версия :: 3.0.RC4 Обновленная версия :: 3.0.RC5
Очистка имён пользователей Выполнение может занять некоторое время... Пожалуйста, не останавливайте процесс. Выполнение :: . Готово Результат :: Без ошибок
Обновление структуры базы данных Выполнение :: . . . . . . . . . . . . . Готово Результат :: Без ошибок
Обновление данных Выполнение :: . . . . . . . . . . . . Готово Результат :: Без ошибок
Обновление версии и оптимизация таблиц Выполнение :: . . Готово Результат :: Без ошибок Обновление завершено
Убедитесь, что также обновили файлы конференции, этот файл лишь обновляет вашу базу данных. Войдите на конференцию и проверьте, что всё работает нормально. Не забудьте удалить, переименовать или переместить папку install!
Далее заменим файлы конференции (файлы обновления создаются при распаковке phpBB-3.0.RC5-files.tar.bz2 см выше распакованные файлы) Заменим файлы# tar zxvf phpBB-3.0.RC4_to_3.0.RC5.tar
Удалим ненужные файлы и директории# rm -r docs/ # rm -r install/ # rm phpBB-3.0.RC*
После этого обязательно обновите языковые модули см Русификация форума тк при обновлении до RCx языковые модули также обновляются под текущую RCx.
Обновлено 28.05.2010 13:39
|