Установка веб-инструмента gitlab на centos

Пять, удалите GitLab

После установки жалею, а карту нельзя переместить, потому что после завершения установки она автоматически запустится после загрузки. Что случилось с хорошей виртуальной машиной?

Итак, я чувствую, что у меня есть молодой и красивый образ моего Ubuntu, и я удалил ненавистный gitlab:

Перед удалением давайте посмотрим, где он установлен, потому что мы прошли Команда для установки, поэтому она будет установлена ​​в Под каталогом посмотрим, выглядит ли он так:

Мы обнаружили, что этот ребенок был здесь, но он был мертв.

Следующее исполнение нашего плана вымирания:

2. Выполните команду удаления.

Выполните следующие три команды, а затем перезапустите систему.

илиВыполните эту команду:

После казни я взглянул и обнаружил, что в исходном файле было только 2M:

Убейте первый процесс:

Потом пропало после просмотра.

Установка Elasticsearch

Устанавливаем ядро системы по сбору логов — Elasticsearch. Его установка очень проста за счет готовых пакетов под все популярные платформы.

Centos 7 / 8

Копируем публичный ключ репозитория:

# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

Подключаем репозиторий Elasticsearch:

# mcedit /etc/yum.repos.d/elasticsearch.repo
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

Приступаем к установке еластика:

# yum install --enablerepo=elasticsearch elasticsearch

В в завершении установки добавим elasticsearch в автозагрузку и запустим его с дефолтными настройками:

# systemctl daemon-reload
# systemctl enable elasticsearch.service
# systemctl start elasticsearch.service

Проверяем, запустилась ли служба:

# systemctl status elasticsearch.service

Проверим теперь, что elasticsearch действительно нормально работает. Выполним к нему простой запрос о его статусе. 

# curl 127.0.0.1:9200
{
  "name" : "centos8",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "zsYgZQSeT6uvhTCkFJPiAA",
  "version" : {
    "number" : "7.11.0",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "8ced7813d6f16d2ef30792e2fcde3e755795ee04",
    "build_date" : "2021-02-08T22:44:01.320463Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

Все в порядке, сервис реально запущен и отвечает на запросы.

Ubuntu / Debian

Копируем себе публичный ключ репозитория:

# wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Если у вас нет пакета apt-transport-https, то надо установить:

# apt install apt-transport-https

Добавляем репозиторий Elasticsearch в систему:

# echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

Устанавливаем Elasticsearch на Debian или Ubuntu:

# apt update && apt install elasticsearch

После установки добавляем elasticsearch в автозагрузку и запускаем.

# systemctl daemon-reload 
# systemctl enable elasticsearch.service 
# systemctl start elasticsearch.service

Проверяем, запустился ли он:

# systemctl status elasticsearch.service

Проверим теперь, что elasticsearch действительно нормально работает. Выполним к нему простой запрос о его статусе. 

# curl 127.0.0.1:9200
{
  "name" : "debioan10",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "zsYgZQSeY6uvhWCkFJPiAA",
  "version" : {
    "number" : "7.11.0",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "8ced7813d6f16d2ef30792e2fcde3e755795ee04",
    "build_date" : "2021-02-09T21:44:01.320413Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

Если все в порядке, то переходим к настройке Elasticsearch.

Что такое ELK Stack

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

  • Elasticsearch используется для хранения, анализа, поиска по логам.
  • Kibana представляет удобную и красивую web панель для работы с логами.
  • Logstash сервис для сбора логов и отправки их в Elasticsearch. В самой простой конфигурации можно обойтись без него и отправлять логи напрямую в еластик. Но с logstash это делать удобнее.
  • Beats — агенты для отправки логов в Logstash. Они бывают разные. Я буду использовать Filebeat для отправки данных из текстовых логов linux и Winlogbeat для отправки логов из журналов Windows систем.

К этой связке еще добавляется Nginx, который проксирует соединения на Kibana. В самом простом случае он не нужен, но с ним удобнее. Можно, к примеру, добавить авторизацию или ssl сертификат, в nginx удобно управлять именем домена. В случае большой нагрузки, разные службы разносятся по разным серверам или кластерам. В своем примере я все установлю на один сервер. Схематично работу данной системы можно изобразить вот так:

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

Если у вас еще нет своего сервера с CentOS 8, то рекомендую мои материалы на эту тему:

  • Установка CentOS 8.
  • Настройка CentOS.

Если у вас еще не настроен сервер с Debian, рекомендую мои материалы на эту тему:

  • Установка Debian на сервер
  • Базовая настройка Debian после установки

Установка GitLab в Ubuntu 18.04

У GitLab есть несколько версий. Кроме онлайн версии, в которую вы можете выгружать свои проекты, доступной на веб-сайте GitLab.com, есть версия Community Edition и платная версия Enterprice Edition, которые можно установить на свой компьютер и создать собственный Git-сервер. В этой инструкции мы рассмотрим, как установить GitLab Ubuntu 18.04 версии Community Edition. Для этого будем использовать официальный репозиторий.

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

1. Установка репозитория

Затем нужно загрузить установщик репозитори из официального сайта. Этот скрипт загрузит и установит все ключи и инструменты необходимые, чтобы подключить репозиторий Gitlab в систему. Для его загрузки и запуска выполните команду:

2. Установка пакета программы

После завершения вы можете установить gitlab-ce командой:

Когда установка GitLab Ubuntu 18.04 будет завершена, вы увидите такое сообщение:

3. Развёртывание GitLab

Теперь нам необходимо подготовить программу к работе. Сначала нужно настроить URL, по которой будет открываться интерфейс GitLab. Для этого откройте файл /etc/gitlab/gitlab.rb и найдите там строчку external_url. Здесь нужно указать ваш домен. На своём локальном компьютере я буду использовать домен gitlab.local:

Сохраните и закройте файл. После этого надо пересобрать программу, учитывая изменённую конфигурацию:

Если на вашем сервере включён брандмауэр, необходимо добавить в исключения порты для протоколов http и ssh:

Чтобы наш локальный домен работал, необходимо добавить запись о нём в файл /etc/hosts:

4. Развёртывание программы с установленным Apache

Если на вашем компьютере уже установлен веб-сервер Apache, вы можете настроить программу таким образом, чтобы она работала через существующий веб-сервер. Для этого измените такие строки в /etc/gitlab/gitlab.rb:

Затем пересоберите программу:

В Apache надо добавить новый виртуальный хост с такой конфигурацией:

<VirtualHost *:80>
ServerName gitlab.local
ServerSignature Off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode
<Location />
  Require all granted
  ProxyPassReverse http://127.0.0.1:8080
  ProxyPassReverse http://gitlab.local
</Location>
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule .* http://127.0.0.1:8080%{REQUEST_URI} 
DocumentRoot /opt/gitlab/embedded/service/gitlab-rails/public
ErrorDocument 404 /404.html
ErrorDocument 422 /422.html
ErrorDocument 500 /500.html
ErrorDocument 503 /deploy.html
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common_forwarded
ErrorLog /var/log/apache2/gitlab_error.log
CustomLog /var/log/apache2/gitlab_forwarded.log common_forwarded
CustomLog /var/log/apache2/gitlab_access.log combined env=!dontlog
CustomLog /var/log/apache2/gitlab.log combined
</VirtualHost>

Здесь gitlab.local — это домен, который будет использоваться для доступа к gitlab, а порт 8080 — тот порт, на котором сервис gitlab ожидает соединений. Его можно посмотреть командой:

После этого активируйте модули Apache — rewrite, proxy и proxy_http:

А потом активируйте наш виртуальный хост и перезапустите Apache:

Установка GitLab

1. Установка и настройка сервиса

Установим репозиторий.

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash

б) для платной версии:

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash

После установки репозитория, устанавливаем сам GitLab.

а) бесплатную:

dnf install gitlab-ce

б) платную версию:

dnf install gitlab-ee

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

It looks like GitLab has not been configured yet; skipping the upgrade script.

       *.                  *.
      ***                 ***
     *****               *****
    .******             *******
    ********            ********
   ,,,,,,,,,***********,,,,,,,,,
  ,,,,,,,,,,,*********,,,,,,,,,,,
  .,,,,,,,,,,,*******,,,,,,,,,,,,
      ,,,,,,,,,*****,,,,,,,,,.
         ,,,,,,,****,,,,,,
            .,,,***,,,,
                ,*,.
  
     _______ __  __          __
    / ____(_) /_/ /   ____ _/ /_
   / / __/ / __/ /   / __ `/ __ \
  / /_/ / / /_/ /___/ /_/ / /_/ /
  \____/_/\__/_____/\__,_/_.___/
  

Thank you for installing GitLab!

2. Конфигурируем веб-адрес

Для запуска и корректной работы портала мы должны задать external_url. Для этого открываем файл:

vi /etc/gitlab/gitlab.rb

Нам нужно только изменить параметр external_url:

external_url ‘http://gitlab.dmosk.ru’

* данная настройка говорит, что наш веб-инструмент будет отвечать на запросы, которые пришли на узел gitlab.dmosk.ru — это значит, что данное имя должно быть зарегистрирована в DNS или прописано в локальный файл hosts.

Выполняем конфигурирование:

gitlab-ctl reconfigure

Данная операция займет какое-то время.

Шаг 6 — Ограничение или отключение открытого входа в систему (опционально)

Возможно на начальной странице GitLab вы заметили, что зарегистрировать учетную запись может кто угодно. Если вы собираетесь разместить публичный проект, эта возможность будет полезна. Однако в большинстве случаев желательны более строгие ограничения.

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

На следующей странице вы увидите обзор своего экземпляра GitLab. Для изменения настройки нажмите Settings (Настройки) в нижней части левого меню:

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

Отключение регистрации

Если вы хотите полностью отключить регистрацию (вы все равно сможете сами создавать учетные записи для новых пользователей), прокрутите страницу до раздела Sign-up Restrictions (Ограничения регистрации).

Уберите отметку из поля Sign-up enabled (Регистрация разрешена):

Прокрутите страницу до конца и нажмите кнопку Save changes (Сохранить изменения):

Теперь на начальной странице GitLab не должен отображаться раздел регистрации.

Ограничение регистрации по домену

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

Затем добавьте свой домен или домены в поле Whitelisted domains for sign-ups (Белый список доменов для регистрации). В каждой строке можно указать только один домен. Вы можете использовать звездочку (*) как подстановочный символ в именах доменов:

Прокрутите страницу до конца и нажмите кнопку Save changes (Сохранить изменения):

Теперь на начальной странице GitLab не должен отображаться раздел регистрации.

Ограничение создания проектов

По умолчанию новые пользователи могут создавать до 10 проектов. Если вы хотите разрешить новым пользователям видеть данные и участвовать в проектах, но при этом ограничить им возможность создания новых проектов, вы можете использовать для этой цели раздел Account and Limit Settings (Настройки учетных записей и ограничений).

Вы можете установить для параметра Default projects limit (Лимит проектов по умолчанию) значение 0, чтобы полностью запретить новым пользователям создавать проекты:

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

Прокрутите страницу до конца и нажмите кнопку Save changes (Сохранить изменения):

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

Обновление сертификатов Let’s Encrypt

По умолчанию в GitLab имеется запланированная задача обновления сертификатов Let’s Encrypt каждые четыре дня после полуночи, точное время зависит от параметра . Вы можете изменить эти настройки в файле . Например, если вы хотите выполнять обновление каждый 7-й день в 12:30, вы можете задать это следующим образом:

/etc/gitlab/gitlab.rb

Автоматическое обновление можно отключить, добавив соответствующий параметр в :

/etc/gitlab/gitlab.rb

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

Установка Gitea

Gitea можно установить из исходного кода, двоичного кода или в виде пакета. Его также можно развернуть как образ Docker. Мы установим Gitea с использованием двоичного файла.

Первый шаг — установить Git на CentOS:

Проверьте установку, отобразив версию Git:

Создайте пользователя Git

Создайте нового системного пользователя для запуска приложения Gitea:

Команда создаст нового пользователя и группу с именем и установит домашний каталог в .

Скачать бинарный файл Gitea

На момент написания последняя версия — 1.12.3. Если доступна новая версия, измените переменную в приведенной ниже команде.

Используйте чтобы загрузить двоичный файл Gitea в каталог :

Вы можете запустить двоичный файл из любого места. Мы будем следовать соглашению и переместим двоичный файл в каталог :

Сделайте двоичный исполняемый файл:

Следующие команды создадут необходимые каталоги и установят необходимые разрешения и владельца :

Указанная выше структура каталогов рекомендована официальной документацией Gitea.

Для каталога заданы разрешения чтобы мастер установки мог создавать файлы конфигурации. После завершения установки мы установим более строгие разрешения.

Создайте файл модуля Systemd

Gitea предоставляет файл модуля Systemd, который настроен в соответствии с нашей настройкой.

Загрузите файл в каталог , набрав:

После этого включите и запустите службу Gitea:

Убедитесь, что служба запущена успешно:

Настроить Gitea

Теперь, когда Gitea запущена и работает, пора завершить установку через веб-интерфейс.

По умолчанию Gitea прослушивает подключения через порт на всех сетевых интерфейсах. Вам необходимо настроить брандмауэр, чтобы разрешить доступ к веб-интерфейсу Gitea:

Откройте браузер, введите , и появится страница начальной конфигурации:

Заполните обязательные поля следующим образом:

Настройки базы данных:

  • Тип базы данных: SQLite3
  • Путь: используйте абсолютный путь,

Общие настройки приложения:

  • Заголовок сайта — введите название вашей организации.
  • Путь к — оставьте значение по умолчанию .
  • Корневой путь Git LFS — оставьте значение по умолчанию .
  • Запуск от имени пользователя — git
  • Домен SSH-сервера — введите IP-адрес вашего домена или сервера.
  • SSH Port — 22, измените его, если SSH прослушивает другой порт.
  • Порт прослушивания HTTP Gitea — 3000
  • Базовый URL Gitea — используйте http и IP-адрес вашего домена или сервера.
  • Путь к — оставьте значение по умолчанию

Позже вы можете изменить настройки, отредактировав файл конфигурации Gitea.

После этого нажмите кнопку «Установить Gitea». Установка происходит мгновенно. По завершении вы будете перенаправлены на страницу входа.

Щелкните ссылку «Зарегистрироваться сейчас». Первый зарегистрированный пользователь автоматически добавляется в группу администратора.

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

Вот и все. Gitea установлена на вашем компьютере с CentOS.

Установка GitLab

Установку выполним в два шага — установка необходимых компонентов и, собственно, установка GitLab.

1. Необходимые компоненты

apt-get install curl openssh-server ca-certificates

Для отправки уведомлений, установим также postfix:

apt-get install postfix

При запросе типа конфигурации, выбираем Internet Site (если уведомления должны отправляться наружу) или Local only (уведомления в пределах сервера):

* при получении других запросов во время установки postfix можно ответить по умолчанию, нажимая Enter.

2. Установка GitLab

Установим репозиторий.

а) для платной версии:

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

После установки репозитория, устанавливаем сам GitLab.

а) платную версию:

apt-get install gitlab-ee

б) бесплатную:

apt-get install gitlab-ce

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

It looks like GitLab has not been configured yet; skipping the upgrade script.

       *.                  *.
      ***                 ***
     *****               *****
    .******             *******
    ********            ********
   ,,,,,,,,,***********,,,,,,,,,
  ,,,,,,,,,,,*********,,,,,,,,,,,
  .,,,,,,,,,,,*******,,,,,,,,,,,,
      ,,,,,,,,,*****,,,,,,,,,.
         ,,,,,,,****,,,,,,
            .,,,***,,,,
                ,*,.
  
     _______ __  __          __
    / ____(_) /_/ /   ____ _/ /_
   / / __/ / __/ /   / __ `/ __ \
  / /_/ / / /_/ /___/ /_/ / /_/ /
  \____/_/\__/_____/\__,_/_.___/
  

Thank you for installing GitLab!

3. Конфигурируем веб-адрес

Для запуска и корректной работы портала мы должны задать external_url. Для этого открываем файл:

vi /etc/gitlab/gitlab.rb

Нам нужно только изменить параметр external_url:

external_url ‘http://gitlab.dmosk.ru’

* данная настройка говорит, что наш веб-инструмент будет отвечать на запросы, которые пришли на узел gitlab.dmosk.ru — это значит, что данное имя должно быть зарегистрирована в DNS или прописано в локальный файл hosts.

Выполняем конфигурирование:

gitlab-ctl reconfigure

Данная операция займет какое-то время.

Установка Filebeat для отправки логов в Logstash

Установим первого агента Filebeat на сервер с nginx для отправки логов веб сервера на сервер с ELK. Ставить можно как из общего репозитория, который мы подключали ранее, так и по отдельности пакеты. Как ставить — решать вам. В первом случае придется на все хосты добавлять репозиторий, но зато потом удобно обновлять пакеты. Если подключать репозиторий не хочется, можно просто скачать пакет и установить его.

Ставим на Centos.

# curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.11.0-x86_64.rpm
# rpm -vi filebeat-7.11.0-x86_64.rpm

В Debian/Ubuntu ставим так:

# curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.11.0-amd64.deb# dpkg -i filebeat-7.11.0-amd64.deb

Или просто:

# yum install filebeat
# apt install filebeat

После установки рисуем примерно такой конфиг /etc/filebeat/filebeat.yml для отправки логов в logstash.

filebeat.inputs:
- type: log
  enabled: true
  paths:
      - /var/log/nginx/*-access.log
  fields:
    type: nginx_access
  fields_under_root: true
  scan_frequency: 5s

- type: log
  enabled: true
  paths:
      - /var/log/nginx/*-error.log
  fields:
    type: nginx_error
  fields_under_root: true
  scan_frequency: 5s

output.logstash:
  hosts: 

xpack.monitoring:
  enabled: true
  elasticsearch:
    hosts: ["http://10.1.4.114:9200"]

Некоторые пояснения к конфигу, так как он не совсем дефолтный и минималистичный. Я его немного модифицировал для удобства. Во-первых, я разделил логи access и error с помощью отдельного поля type, куда записываю соответствующий тип лога: nginx_access или nginx_error. В зависимости от типа меняются правила обработки в logstash. Плюс, я включил мониторинг и для этого указал адрес elastichsearch, куда filebeat передает данные мониторинга напрямую. Показываю это для вас просто с целью продемонстрировать возможность. У меня везде отдельно работает мониторинг на zabbix, так что большого смысла в отдельном мониторинге нет. Но вы посмотрите на него, возможно вам он пригодится. Чтобы мониторинг работал, его надо активировать в соответствующем разделе в Management — Stack Monitoring. И не забудьте запустить elasticsearch на внешнем интерфейсе. В первоначальной настройке я указал слушать только локальный интерфейс.

Запускаем filebeat и добавляем в автозагрузку.

# systemctl start filebeat
# systemctl enable filebeat

Проверяйте логи filebeat в дефолтном системном логе. По умолчанию, он все пишет туда. Лог весьма информативен. Если все в порядке, увидите список всех логов в директории /var/log/nginx, которые нашел filebeat и начал готовить к отправке. Если все сделали правильно, то данные уже потекли в elasticsearch. Мы их можем посмотреть в Kibana. Для этого открываем web интерфейс и переходим в раздел Discover. Так как там еще нет индекса, нас перенаправит в раздел Managemet, где мы сможем его добавить.

Вы должны увидеть индекс, который начал заливать logstash в elasticsearch. В поле Index pattern введите nginx-* и нажмите Next Step.

На следующем этапе выберите имя поля для временного фильтра. У вас будет только один вариант — @timestamp, выбирайте его и жмите Create Index Pattern.

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

Получение логов с веб сервера nginx на linux настроили. Подобным образом настраивается сбор и анализ любых логов. Можно либо самим писать фильтры для парсинга с помощью grok, либо брать готовые. Вот несколько моих примеров по этой теме:

  • Мониторинг производительности бэкенда с помощью ELK Stack
  • Сбор и анализ логов samba в ELK Stack
  • Дашборд для логов nginx

Теперь сделаем то же самое для журналов windows.

Шаг 4 — Редактирование файла конфигурации GitLab

Прежде чем вы можете использовать приложение, вам нужно обновить файл конфигурации и запустить команду изменения конфигурации. Прежде всего, откройте файл конфигурации Gitlab:

Наверху вы увидите строку конфигурации . Измените эту строку для соответствия с вашим доменом. Замените  на , чтобы GitLab автоматически перенаправлял пользователей на сайт, защищенный сертификатом Let’s Encrypt:

/etc/gitlab/gitlab.rb

/etc/gitlab/gitlab.rb

Сохраните и закройте файл. Запустите следующую команду, чтобы изменить конфигурацию Gitlab:

Команда выполняет инициализацию GitLab, используя информацию о вашем сервере, которую она сможет найти. Этот процесс полностью автоматизирован, и вам не нужно вводить никакие данные в диалоги. Данный процесс также настроит сертификат Let’s Encrypt для вашего домена.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: