Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 1464 сообщений
Cообщения с меткой

proxy - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

[Из песочницы] Как собрать Ceylon в контейнере, если вашему контейнеровозу перекрыли канал

Понедельник, 18 Сентября 2017 г. 10:45 (ссылка)






Kopilov


сегодня в 10:45

Разработка





Как собрать Ceylon в контейнере, если вашему контейнеровозу перекрыли канал










Так сложилось, что в нашем коллективе добрых, милых и отзывчивых математиков (ДМОиМ) в качестве языка общего назначения используется Ceylon. Будучи отзывчивыми, мы не только используем этот язык, но и участвуем в его развитии, преимущественно багрепортами. С пулреквестами хуже, и первая причина тому: отсутствие в офисе прямого доступа в интернет, только через прокси-сервер. (Нулевая, конечно, нехватка времени.)



Ceylon-контейнер



Под катом подробности о том, какие именно проблемы возникли при сборке проекта Ceylon из исходного кода и как они были решены. В конце так же несколько слов о её конечной цели.



Что вообще за слон такой



Для начала несколько слов о Ceylon, как о проекте. (Как о языке программирования, кому интересно, читайте тут.) Двумя базовыми подпроектами (помимо такого инструментария, как плагины к IDE, собственный репозиторий) в нём являются ceylon и ceylon-sdk. Первый включает в себя непосредственно компилятор и набор консольных утилит, написан на Java. Второй — набор базовых библиотек, написанных на самом Ceylon. Сборка каждого из проектов осуществляется с помощью Apache Ant, так же, конечно, необходима установленная JDK.



Компилятор собирается командой ant clean dist, после чего его из каталога dist/dist можно скопировать в /usr/local/share/ceylon или куда-нибудь ещё по вкусу и сделать ссылку на исполняемый файл в каталоге, который виден в $PATH. Библиотеки собираются и копируются куда надо командой ant clean publish.



При наличии прямого доступа в интернет (вкупе с нужными версиями Java, Ant и исходников Ceylon) сборка проходит без каких-либо затруднений.



Проблема по курсу



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



При сборке на открытой палубе голом железе рабочей станции компилятор собрался спокойно (может, все зависимости включены в проект, может, помогли ранее сделанные настройки), а вот набор библиотек никак не хотел собираться. Казалось бы, и шлюз-прокси есть, и резервуары с библиотеками (Ceylon Herd, Maven Nexus), но чего-то не хватает. Наверно, «солёных брызг, порывов бешеного ветра…» (c) Бараш.



Ошибка была такая:
compile-jvm:

[ceylon-compile] /home/akopilov/workspace/docker/CeylonBuilding/ceylon-sources/ceylon-sdk/source/ceylon/interop/spring/module.ceylon:25: error: cannot find module artifact 'maven:org.springframework.data:spring-data-commons-1.13.6.RELEASE.car'

[ceylon-compile] shared import maven:org.springframework.data:"spring-data-commons" "1.13.6.RELEASE";

[ceylon-compile] ^

[ceylon-compile] - dependency tree: 'ceylon.interop.spring/1.3.4-SNAPSHOT' -> 'org.springframework.data:spring-data-commons/1.13.6.RELEASE'

[ceylon-compile] /home/akopilov/workspace/docker/CeylonBuilding/ceylon-sources/ceylon-sdk/source/ceylon/interop/spring/module.ceylon:26: error: cannot find module artifact 'maven:org.springframework.data:spring-data-jpa-1.11.6.RELEASE.car'

[ceylon-compile] shared import maven:org.springframework.data:"spring-data-jpa" "1.11.6.RELEASE";

[ceylon-compile] ^

[ceylon-compile] - dependency tree: 'ceylon.interop.spring/1.3.4-SNAPSHOT' -> 'org.springframework.data:spring-data-jpa/1.11.6.RELEASE'

[ceylon-compile] /home/akopilov/workspace/docker/CeylonBuilding/ceylon-sources/ceylon-sdk/source/ceylon/interop/spring/module.ceylon:27: error: cannot find module artifact 'maven:org.springframework:spring-tx-4.3.10.RELEASE.car'

[ceylon-compile] shared import maven:org.springframework:"spring-tx" "4.3.10.RELEASE";

[ceylon-compile] ^

[ceylon-compile] - dependency tree: 'ceylon.interop.spring/1.3.4-SNAPSHOT' -> 'org.springframework:spring-tx/4.3.10.RELEASE'

[ceylon-compile] ceylon compile: There were 3 errors



BUILD FAILED

/home/akopilov/workspace/docker/CeylonBuilding/ceylon-sources/ceylon-sdk/build.xml:224: While executing command

/home/akopilov/.sdkman/candidates/ceylon/current/bin/../bin/ceylon

--cwd=/home/akopilov/workspace/docker/CeylonBuilding/ceylon-sources/ceylon-sdk

--define=ant.file.type.Ceylon SDK=file

--define=ant.file.type=file

--define=ant.file=/home/akopilov/workspace/docker/CeylonBuilding/ceylon-sources/ceylon-sdk/build.xml

--define=ant.file.Ceylon SDK=/home/akopilov/workspace/docker/CeylonBuilding/ceylon-sources/ceylon-sdk/build.xml

--define=ant.project.name=Ceylon SDK

--define=ant.project.default-target=test

--define=ant.project.invoked-targets=clean,publish

--define=ceylon.terminal.usecolors=yes

compile

--out

/home/akopilov/workspace/docker/CeylonBuilding/ceylon-sources/ceylon-sdk/modules

--encoding

UTF-8

--source

/home/akopilov/workspace/docker/CeylonBuilding/ceylon-sources/ceylon-sdk/source

--resource

/home/akopilov/workspace/docker/CeylonBuilding/ceylon-sources/ceylon-sdk/resource

--pack200

ceylon.buffer

ceylon.collection

ceylon.dbc

ceylon.decimal

ceylon.file

ceylon.html

ceylon.interop.java

ceylon.interop.persistence

ceylon.interop.spring

ceylon.io

ceylon.json

ceylon.locale

ceylon.logging

ceylon.math

ceylon.http.common

ceylon.http.client

ceylon.http.server

ceylon.uri

ceylon.numeric

ceylon.process

ceylon.promise

ceylon.random

ceylon.regex

ceylon.test

ceylon.time

ceylon.toml

ceylon.transaction

ceylon.unicode

ceylon.whole

com.redhat.ceylon.war

Compile failed; see the compiler error output for details.



Самое смешное, что система сборки требует Java-зависимость из Maven в формате Ceylon (car), которой там быть не должно в принципе.



Упаковка сборки в контейнер



Что такое контейнер, местная аудитория должна быть в курсе. Для проходящих мимо — ссылка.



Итак, не добившись успеха, я решил: соберу Ceylon и Ceylon SDK в открытом море на компьютере с прямым доступом в интернет и в контейнере доставлю эту сборку в офисную сеть. По идее, контейнер будет содержать в себе все зависимости, после чего можно будет править код для собственных нужд и пулреквестов и запускать пересборку.



В качестве промежуточного уровня был подготовлен образ с JDK.



Dockerfile kopilov/java8
FROM ubuntu:latest

RUN apt-get update -y && apt-get install -y software-properties-common

RUN \
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
add-apt-repository -y ppa:webupd8team/java && \
apt-get -y update && \
apt-get install -y oracle-java8-installer && \
rm -rf /var/cache/oracle/jdk8/installer

RUN apt-get install -y maven

#RUN apt-get install -y locales && \
# locale-gen "ru_RU.UTF-8" && \
# echo "LANG=ru_RU.UTF-8" >> /etc/default/locale

#ENV LANG=ru_RU.UTF-8 \
# LANGUAGE=ru_RU.UTF-8 \
# LC_ALL=ru_RU.UTF-8

RUN apt-get clean && \
rm -rf /var/lib/apt/lists/*




Dockerfile был позаимствован из корпоративных конфигураций, для обобщения закомментировано создание русской локали. Основная его задача: установить Oracle JDK (через вспомогательную программу, в силу лицензии Oracle) и Maven, так же в начале обновляются, а в конце чистятся данные для APT. Ant тоже присутствует, видимо, как зависимость.



Следующий этап: делаем образ со сборкой Ceylon. При создании образа рядом с Dockerfile должнен быть каталог ceylon-sources, а в нём — проекты ceylon и ceylon-sdk. Сперва хотел засунуть git clone прямо в создание образа, но редактировать исходники мы будем локально, а клонировать два раза смысла нет.



Dockerfile kopilov/ceylon_build:1.3.4-SNAPSHOT




FROM kopilov/java8:latest

#Именно эту версию мы будем собирать
ENV CEYLON_VERSION 1.3.4-SNAPSHOT

#Повторно скачаем данные APT (их удаляли, чтобы образ был тоньше),
#установим git (он каким-то образом участвует в сборке)
#и netcat (он потребуется немного позже)
RUN apt-get update -y && \
apt-get install -y git && \
apt-get install netcat-traditional

#Копируем исходники с рабочей станции. Теоретически,
#тут может быть git clone, но это много трафика, который уже выкачан.
WORKDIR /usr/src/ceylon
ADD ceylon-sources /usr/src/ceylon

#Собираем компилятор, ставим в систему
WORKDIR /usr/src/ceylon/ceylon
RUN ant clean dist && \
cp -a dist/dist /usr/local/share/ceylon-${CEYLON_VERSION} && \
ln -s /usr/local/share/ceylon-${CEYLON_VERSION}/bin/ceylon /usr/local/bin

#Собираем библиотеки
WORKDIR /usr/src/ceylon/ceylon-sdk
RUN ant clean publish

#Удаляем ненужное
RUN apt-get clean && rm -rf /var/lib/apt/lists/*


Сборка данного образа пройдёт успешно только при наличии прямого доступа в интернет. Собрав, я разместил его на hub.docker.com.



Пересборка с закрытым каналом



Ожидается, что контейнер с готовой сборкой включает все зависимости, и интернет больше не потребуется. Запускаем docker run -it kopilov/ceylon_build, затем ant clean publish — как бы не так.



Ошибка на этот раз:
[ceylon-compile] /usr/src/ceylon/ceylon-sdk/source/ceylon/interop/spring/CeylonRepositoryImpl.java:12: error: Ceylon backend error: package org.springframework.transaction.annotation does not exist

[ceylon-compile] import org.springframework.transaction.annotation.Transactional;

[ceylon-compile] ^

[ceylon-compile] /usr/src/ceylon/ceylon-sdk/source/ceylon/interop/spring/CeylonRepositoryImpl.java:29: error: Ceylon backend error: cannot find symbol

[ceylon-compile] @Transactional(readOnly = true)

[ceylon-compile] ^

[ceylon-compile] symbol: class Transactional

[ceylon-compile] /usr/src/ceylon/ceylon-sdk/source/ceylon/interop/spring/CeylonRepositoryImpl.java:44: error: Ceylon backend error: cannot find symbol

[ceylon-compile] @Override @Ignore @Transactional

[ceylon-compile] ^





Такая же ошибка на компьютере, где был создан образ, если отключить доступ в интернет. Чего же не хватает ещё? Без акулы трафика не разобраться.



При выключенном доступе в интернет трафик из Docker выглядит в Wireshark так:







После нескольких неудачных попыток определить IP сервера repo1.maven.org отображается вышеуказанная ошибка. А вот что происходит, если подключение восстановить:







Парадокс: система делает GET-запрос, чтобы получить ответ с ошибкой 404, после чего спокойно продолжает сборку. А если ей этот запрос не выполнить, пользователю выдаётся, вроде бы, абсолютно ортогональная тому GET-запросу ошибка. Ниже можно заметить запросы на modules.ceylon-lang.org (aka Herd) по HTTPS, но сперва попробуем разобраться с первым.



Первое, что решено было сделать: добавить строку «127.0.0.1 repo1.maven.org» в файл /etc/hosts. Теперь надо как-то сымитировать ответ «404 NOT FOUND». Недавний хабрасерфинг показал, что в роли простейшего веб-сервера может выступить netcat (пруф). Перед запуском сборки (но после запуска контейнера) набираю в параллельном терминале



docker container ls
#скопировать название_контейнера
docker exec -it название_контейнера
nc -lp 80


После этого запускаю сборку (ant), дожидаюсь появления в терминале с netcat GET-запроса, печатаю в ответ

HTTP/1.1 404 NOT FOUND

Server: nc





Вуаля! Сборка пошла дальше! Потом система делает ещё один точно такой же запрос (при сборке под JavaScript), и процесс успешно завершён.



Автоматизация вышеописанного и доработка библиотеки



Подготовленный образ включал сборку оригинальной библиотеки Ceylon SDK, а конечной целью было собрать доработанную. Поэтому был был сделан ещё один Dockerfile, замещающий исходники:



FROM kopilov/ceylon_build:1.3.4-SNAPSHOT

ENV CEYLON_VERSION 1.3.4-SNAPSHOT

WORKDIR /usr/src/ceylon/ceylon-sdk
RUN rm -rf *
ADD ceylon-sources/ceylon-sdk .


Он должен был быть максимально простым (ведь образ пересоздаётся для каждой тестовой пересборки — почти для каждой правки исходников), именно поэтому установка netcat была выполнена заранее. Трюк с netcat был завёрнут в следующий скрипт (plug.sh):



#!/bin/bash

IMAGE_NAME="kopilov/ceylon_patch_src"
CONTAINER_ID=$(docker container ls | grep "${IMAGE_NAME}" | sed 's/ .*//')
docker exec -i $CONTAINER_ID bash << END
echo "127.0.0.1 repo1.maven.org" >> /etc/hosts

echo "HTTP/1.1 404 NOT FOUND" > /tmp/notfound
echo "Server: nc" >> /tmp/notfound
echo "" >> /tmp/notfound

nc -lp 80 < /tmp/notfound
nc -lp 80 < /tmp/notfound
END


Ещё скрипт, чтобы достать сборку из контейнера (get_built_ceylon.sh):



CONTAINER_ID=$(docker container ls -a | grep  kopilov/ceylon_patch_src | sed 's/ .*//')

rm -r ~/.sdkman/candidates/ceylon/1.3.4-SNAPSHOT/
docker cp $CONTAINER_ID:/usr/local/share/ceylon-1.3.4-SNAPSHOT .
mv ceylon-1.3.4-SNAPSHOT /home/akopilov/.sdkman/candidates/ceylon/1.3.4-SNAPSHOT

rm -r ~/.ceylon/repo/
docker cp $CONTAINER_ID:/root/.ceylon/repo ~/.ceylon


Дальше тяга к рационализации иссякла, оставалось действовать вручную. После каждой правки исходников сперва в одной вкладке терминала запускать docker build -t kopilov/ceylon_patch_src . && docker run -it kopilov/ceylon_patch_src, потом в соседней ./plug.sh, потом опять в первой ant clean publish. И, если сборка прошла без ошибок (и если уже есть, чего тестировать) — ./get_built_ceylon.sh.



Результаты и истоки



Главным результатом проделанной работы «на перспективу» стала возможность нашей (а может, и не только) команды отправлять предварительно протестированные пулреквесты в апстрим проекта. На данный момент лично мной отправлен этот, написанный по ходу дела: github.com/ceylon/ceylon-sdk/pull/688



Образы Docker kopilov/java8 и kopilov/ceylon_build доступны на hub.docker.com, если вдруг кому-нибудь нужно.



А началось всё с того, что на прошедшей неделе у меня было на редкость мало срочных, и даже не очень срочных задач, даже начальник отдела куда-то уехал. И, уезжая, сказал: «Подумай, что ещё полезное можно прикрутить к твоему проекту.» (Проект находится на стадии прототипа.) И захотелось мне прикрутить интернационализацию, и не костылями, а готовым решением.



P.S.

Источник фона КДПВ


Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/338134/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Из песочницы] Централизованное хранилище логов для Squid Proxy или как мы логи в базу заворачивали

Вторник, 08 Августа 2017 г. 19:05 (ссылка)

image


Привет %username%,



Сегодня я хотел бы рассказать про достаточно тривиальную задачу сбора логов с децентрализованных Squid proxy серверов и подводные камни с которыми мы столкнулись.



Что имеем:




  1. Squid-hq

  2. Squid-br1

  3. Squid-br2

  4. Squid-br3

  5. Squid-br4

  6. Squid-db



Как видно из списка, в наличии 5 серверов squid proxy в разных удаленых офисах, и 1 база данных для сбора логов. Все OS CentOS 7.3, squid proxy от 3.3.8 до 3.5.26, Squid-db — с установленной mariadb 5.6



Из того что удалось найти это перловые скрипты и схема, собственно их и берем за основу:




  1. Ставим зависимости на сервера squid proxy:

    yum install perl perl-Readonly* perl-URI perl-YAML perl-DBI perl-Carp perl-DBD-mysql


  2. После чего раскладываем по местам скрипты и конфиг для подключения к базе:



    cp log_mysql_daemon.pl /usr/libexec/squid/log_mysql_daemon.pl



    Даем права:



    chmod +x /usr/libexec/squid/log_mysql_daemon.pl

    chown squid:squid /usr/libexec/squid/log_mysql_daemon.pl





  3. Далее создаем конфиг файл для подключения скрипта к базе:



    vi /etc/squid/log_mysql_daemon.conf



    host: ""

    database: "squid_log"

    table: "access_log"

    user: "squid"

    pass: ""





  4. Создаем базу, импортируем схему и создаем юзера:



    mysql -p

    create database squid_log;

    CREATE USER 'squid'@'%' IDENTIFIED BY '';

    GRANT ALL PRIVILEGES ON squid_log.* TO 'squid'@'';

    GRANT ALL PRIVILEGES ON squid_log.* TO 'squid'@'';

    GRANT ALL PRIVILEGES ON squid_log.* TO 'squid'@'';

    GRANT ALL PRIVILEGES ON squid_log.* TO 'squid'@'';

    GRANT ALL PRIVILEGES ON squid_log.* TO 'squid'@'';

    exit



    cat log_mysql_daemon-table.sql log_mysql_daemon-views.sql | mysql -p squid_log







  5. Переходим на сторону зла squid proxy конфига



    Добавляем конфигурацию для демона



    vi /etc/squid/squid.conf

    acl dontLog http_status 403 407

    logformat squid_mysql %ts.%03tu %6tr %>a %Ss %03Hs %
    access_log /var/log/squid/access.log squid

    access_log daemon:/etc/squid/log_mysql_daemon.conf squid_mysql !dontLog

    logfile_daemon /usr/libexec/squid/log_mysql_daemon.pl




    Разбираем:

    acl dontLog http_status 403 407 — опциональная строка, убирает ошибки из лога идущих в базу данных связаные с эрор кодами 403, 407. База будет расти в геометрической последовательности, а для репортинга не будет нести никакой ценности



    logformat squid_mysql %ts.%03tu %6tr %>a %Ss %03Hs %b> — задаем формат логу, одно из важных условий для множественных squid серверов последнее значение с названием сервера с которого приходят логи. В оригинальных скриптах функционал отсутствует поэтому подкручиваем эту строку и сам скрипт следующим образом:



    в /usr/libexec/squid/log_mysql_daemon.pl в настройку колонок добавляем squid-server



    # fields that we should have in the database table

    # this list depends on the log format configuration

    my @required_fields = qw(

    id

    time_since_epoch

    response_time

    client_src_ip_addr

    squid_request_status

    http_status_code

    reply_size

    request_method

    request_url

    username

    squid_hier_status

    server_ip_addr

    mime_type

    squid_server

    );




    access_log /var/log/squid/access.log squid — Оставляем локальные логи для отладок и случаев проблем с базой, у них включен ротейшен поэтому лишним не будет



    access_log daemon:/etc/squid/log_mysql_daemon.conf squid_mysql !dontLog — собственно сама строка к конфигурации демона. Обратите внимание что !dontLog отменяет логирование 403,407 только для базы данных, так что в случае отладки можно легко использовать локальные логи



    logfile_daemon /usr/libexec/squid/log_mysql_daemon.pl — путь к перловому демону




  6. Перечитываем конфиги squid proxy



    squid reconfigure

    squid -k reconfigure




    и получаем желаемый результат:

    image



    Доступные таблицы и вьюшки:

    image




Заключение:



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



Было ли бы вам интересно почитать продолжения цикла статей про Squid Proxy?
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335204/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
reer323232

Два ребенка за сутки погибли в раскаленных машинах в Аризоне

Воскресенье, 30 Июля 2017 г. 18:27 (ссылка)

­­­­­­­­­­­­­­­­­­
Два рeбенка, оставленные pодственниками в автомобилях на солнце, погибли в американском Финиксе (штат Аризона). Об этом сообщает AzCentral.

Первым был обнаружен семимесячный мальчик Зейн Эндрeсс (Zane Endress), котоpого вoспитывали его бабушка и дeдушка. Ребенка нашли в машинe в пятницу, 28 июля, без признаков жизни, он был признан погибшим на месте пpоисшествия.

В субботу в полицию Финикcа позвoнил мужчина и заявил о маленьком рeбенке, оставленном в автомобиле на солнце. Прибывшие на место спаcатели и стpажи порядка констатиpовали смерть годовалого мальчика.

Соглaсно заявлению полиции, прeдположительно, рeбенка забыл в машинe его отец, вследствие чего он пpовел в pаскаленной машинe несколько часов.

В последние дни темпеpатуpа вoздуxа в Финиксе днeм достигает 32-33 гpадусов теплa.

Комментарии (0)КомментироватьВ цитатник или сообщество
Аноним

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

Комментарии ()КомментироватьВ цитатник или сообщество
Аноним

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

Комментарии ()КомментироватьВ цитатник или сообщество
Аноним

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

Комментарии ()КомментироватьВ цитатник или сообщество
Аноним

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

Комментарии ()КомментироватьВ цитатник или сообщество
Аноним

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

Комментарии ()КомментироватьВ цитатник или сообщество
Аноним

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

Комментарии ()КомментироватьВ цитатник или сообщество
Аноним

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

Комментарии ()КомментироватьВ цитатник или сообщество
Аноним

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

Комментарии ()КомментироватьВ цитатник или сообщество
Rost

Как задать отдельные прокси для Google Chrome (Opera, Yandex, Vivaldi и т.д.)

Вторник, 10 Января 2017 г. 10:09 (ссылка)

Иногда нужно, чтобы ваш бразуер Google Chrome (или какой-то другой из его семейства) использовал отдельные от системы прокси-серверы (например, ходил в Интернет через TOR). В своё время рассказал в сообщении "Как использовать отдельные прокси для браузеров семейства Google Chrome" как это сделать с помощью расширения "Proxy SwitchyOmega". Но, как недавно оказалось, есть способ гораздо проще, который не требует установки специальных расширений, их настройки и т.д. Достаточно только добавить специфические параметры для запуска браузера.

Как это сделать

Вот, собственно, и всё! Видите, как просто?

P.S. Кстати, примерно так же (через параметры запуска) можно это сделать и для Linux-систем.
Метки:   Комментарии (26)КомментироватьВ цитатник или сообщество
Аноним

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

Комментарии ()КомментироватьВ цитатник или сообщество

Следующие 30  »

<proxy - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda