Архивы: Debian

Asterisk логирование не обслужанных звонков

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

Замутим логирование кодов закрытия канала связи..

Что есть : Asterisk 1.4 , Python 2.5 , MySQL 5.1

Создадим табличку для MySQL в которую и будем складывать высеры Астериска.

Будем сохранять:
callerid – собственно номер звонившего
date_stamp – timestamp обрыва канала (HANGUP,CANCEL, etc..)
cause – код причины
status и comment – зело не обязательно, статус записи (типа обслужено или нет) и комментарий

CREATE TABLE `asterisk`.`call_fail_log` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`callerid` VARCHAR(11) DEFAULT NULL,
`date_stamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`cause` VARCHAR(15) DEFAULT NULL,
`status` tinyint(1) DEFAULT '0',
`comment` text,
PRIMARY KEY (`id`),
KEY `call_index` (`callerid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

Теперь сварганим махонький python agi скрипт который непосредственно сохранять данный в базу..

#!/usr/bin/env python

'''
Created on 05.08.2011

@author: valor
'''

import MySQLdb
import sys

class CallFailLog:

    DBHOST = "192.168.158.160"
    DBUSER = "agi"
    DBPASS = "asterisk"
    DBNAME = "asterisk"

    def __init__(self):
        pass

    def db_init(self):
        connect = MySQLdb.connect(db=self.DBNAME, host=self.DBHOST, user=self.DBUSER, passwd=self.DBPASS)
        return connect

    def main(self,callerid, datestamp, cause):
        sql = '''INSERT INTO call_fail_log (`callerid`,`date_stamp`,`cause`) VALUES(%s,FROM_UNIXTIME(%s),%s)'''
        cursor = self.db_init().cursor()
        cursor.executemany(sql,[(callerid,datestamp,cause)])
        self.db_init().close()

if __name__ == '__main__':
    app = CallFailLog()
    app.main(sys.argv[1], sys.argv[2], sys.argv[3])

Как видим все просто и легко..
Теперь лезем в extensions.conf и сделаем макрос обработки кодов + посмотрим откель его можно вызвать..

Собственно макрос:

[macro-logfailcall]
exten => s,1,GotoIF($["${ARG1}" = "16"]?goin:end)
exten => s,n(goin),DeadAGI(callfaillog.py,${CALLERID(num)},${EPOCH},${ARG1})
exten => s,n(end),NoOp(>>> Unknown cause ${ARG1})
exten => s,n,Hangup()

Код завершения 16 NORMAL_CLEARING  – есть не что иное как положенная абонентом трубка.

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

...
exten => h,1,Macro(logfailcall,${HANGUPCAUSE})
...

a: Вызывается, когда пользователь нажимает ‘*’ во время проигрывания приветствия системы голосовой почты.
h: Вызывается, по завершению вызова. 
i: Вызывается, при попытке вызова неизвестного екстеншена.
o: Расширение оператора, используется для обработки нажатия нуля в системе голосовой почты.
s: Стартовое расширение в контексте.
t: Вызывается, при наступлении состояния таймаута.
T: Вызывается, при наступлении состояния абсолютного таймаута, заданного функцией AbsolutTimeout?.
e: Перехват расширений i,t и T для обработки ошибки в едином месте. Для выяснения типа ошибки может быть использована функция EXCEPTION(?)
failed: Используется, если auto-dial out вызов завершился неудачно (который имеет определённый контекст, приоритет и расширение).
fax: Используется для определения факса на Zap каналах.
talk: Используется в конъюнкции с BackgroundDetect?.

Полезные ссылки : Коды причин закрытия канала

Удачи..

VsFTPD and Virtual users on Debian

На заметку..

Пакеты:

apt-get install libpam-pwdfile vsftpd

Предположим, что сайтики лежат в /srv/www/{sitename – вида www.mysite.ru}/htdocs , соответственно ограничиваем пользователя доступом в корень, т.е. не выше директории www.mysite.ru.

И так чистим дефолтный конфиг vsftpd

echo "" > /etc/vsftpad.conf

И записываем туды следующие..

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
# пользователя vsftpd нужно создать системным без шела, например useradd -M -r vsftpd
nopriv_user=vsftpd
virtual_use_local_privs=YES
guest_enable=YES
user_sub_token=$USER
# Токен $USER предполагает что к пути /srv/www/ будет добавлено имя пользователя, он и будет являться корнем для него.
local_root=/srv/www/$USER
chroot_local_user=YES
hide_ids=YES
guest_username=vsftpd
chown_uploads=YES
# От имени и группы www-data пашет Apache.
chown_username=www-data
guest_enable=YES
guest_username=www-data
chown_upload_mode=0775

use_localtime=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES

dirmessage_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Welcome developer to WWW server!
ls_recurse_enable=YES
secure_chroot_dir=/var/run/vsftpd/empty

pasv_enable=YES
pasv_min_port=62000
pasv_max_port=64000

Далее надо настроит pam аутентификацию, для сего лезим в /etc/pam.d/vsftpd и комментим все попутно добавив туда две строчки

auth required pam_pwdfile.so pwdfile /etc/ftpd.passwd
account required pam_permit.so

Собственно создаем файлик /etc/ftpd.passwd командой

htpasswd -c /etc/ftpd.passwd

Добавление пользователя осуществляется аналогично, только без опции -с и с названием корневой директории сайта в качестве пользователя

htpasswd /etc/ftpd.passwd www.mysite.ru

Ребутим vsftpd и радуемся..

Grub2 и framebuffer в Debian

Ахтунг!!! Не надо ничего менять в /boot/grub/grub.conf , это не наш метод.

Разрешение ЖК моего ноутбука 1280×800, не забываем его сменить на свое!

Для начала открываем  /etc/default/grub и ищем строку:

GRUB_GFXMODE=800x600

Правим ее немного, что бы получилось:

GRUB_GFXMODE=1280x800@32
# ниже добавляем строку
GRUB_GFXPAYLOAD=1280x800x32

Теперь лезем в /etc/grub.d/00_header ищем там строку:

if [ "x${GRUB_GFXMODE}" = "x" ] ; then GRUB_GFXMODE=800x600x32 ; fi
#меняем разрешение на свое и ниже добавляем еще одну
if [ "x${GRUB_GFXPAYLOAD}" = "x" ] ; then GRUB_GFXPAYLOAD=1280X800x32 ; fi

В самом конце файла ищем строку

set gfxmode=${GRUB_GFXMODE}

и ниже добавляем

set gfxpayload=${GRUB_GFXPAYLOAD}

Сохраняем и запускаем update-grub2.

Удачи.



Debian NumLock trouble

Угораздило меня нарваться на иксовый баг чёрт его знает какой давности.. причем баг сей не очевиден и вроде даже не совсем баг (да.. вот такой вот каламбур).. Короче, суть в том, что если нечаянно нажать Shift+NumLock , то цифровая консоль переходит в режим управления курсором, а так как при каждом нажатии клавиш 8,6,2,4 курсор сдвигается на один пиксел, заметить сей трабл не просто, по симу первая мысль приходящая в голову это БАГ..

Для поличения сей пичали нужно жмакнуть  Shift+NumLock еще раз..

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

Gnome-terminal как фон рабочего стола..

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

На просторах интернетов набрел на занятный тузлец Alltray (AllTray – Dock any program into the system tray.) , полистав man – понял, что для решения нашей задачи оно может сгодиться.

И так решение.

В качестве эмулятора терминала берем стандартный для Gnome – Gnome-terminal, дистрибутив Debian..

Для начала малость подрехтуем сам gnome-terminal:

  1. Создаем новый профиль.
  2. Отключаем отображения верхнего меню.
  3. Отключаем полосы прокрутки.
  4. Увеличиваем буфер строк (для удобства).
  5. Выкручиваем до упора прозрачность фона терминала.
  6. Подгоняем цвет консольных шрифтов под цвет фона рабочего стола.
  7. Остальное по вкусу..

Устанавливаем alltray

viktor@viktor-laptop:~$ apt-get install alltray

Ну и финальный штрих в авто-запуск (тут неважно как именно, важна суть..) добавляем следующую строку:

alltray --show --sticky --skip-taskbar --no-alltray --notray -x -g +800+0 --geometry 1024x600 gnome-terminal --window-with-profile=s

Лично я добавлял ее в Система->Параметры->Запускаемые приложения.

Да и пару слов об опциях alltray..

  • show – не сворачивать при запуске
  • sticky – отображать на всех рабочих столах
  • skip-taskbar – убрать приложение из панели задач
  • no-alltray – убрать заголовок alltray
  • notray – не показывать значёк в трее
  • x – убрать декорацию окон
  • +800+0 – позиция окна на рабочем столе (первое – горизонталь, второе – вертикаль)
  • geometry 1024×600 – разрешение рабочего стола (это если нужно растянуть терминал на весь рабочий стол, иначе просто указываем нужную геометрию окна терминал)
  • window-with-profile=s – это уже параметр gnome-terminal говорящий о том, что при запуске нужно заюзать профиль «s», который мы создали выше.

Ну вот и все.. Перезагружаем иксы и ликуем..

Все эти выше описанные манипуляции выполнялись на Asus EeePC 1005 с Debian Sqeeze и Gnome 2.28.1..

Пользователей KDE, Xfce, etc..  очень прошу оставить свои комментарии по поводу различий и нюансов в реализации данной фичи.

Скрины на память…

Терминал как фон рабочего стола

Терминал как фон рабочего стола

Xen 3.2-1 and HVM Windows config

Очередной пост для себя любимого.. Но и Вы гости дорогие жуйте если что не стесняйтесь..

Сие есть просто файл конфигурации HVM домена с Win2k3..

Пост не претендует на новизну и оригинальность.

 

kernel="hvmloader"
device_model = 'qemu-dm'
builder='hvm'
memory = 5120
name = "win2k3
vcpus= 4
pae=1
acpi= 1
apic= 1
#usb= 1 разкомментировать если нужна поддержка USB в гостевой ОС. #usbdevice= [ 'host:0529:0514' ]  DID, USB устройства которое нужно пробросить.
cpus = "
2-5"
vif=[ 'mac=00:16:3e:01:01:01,bridge=eth0,type=ioemu' ]
disk = [
'file:/C.img,hda,w',
'file:/D.img,hdb,w'
]
'file:/win2003/win2003.iso,hdc:cdrom,r',
'file:/win2003-2.iso,hdd:cdrom,r'
#]
on_poweroff = 'destroy'
on_shutdown = 'shutdown'
on_reboot   = 'restart'
on_crash    = 'restart'
boot='c'
sdl=0
vnc=1
vnclisten="
0.0.0.0"
vncconsole=0
stdvga=0
serial='pty'

Note:

Для тех кто не в курсе.. Для работы HVM домена необходима поддержка Intel®Virtualization Technology (VT) или Pacifica (AMD)  процессором (ами) сервера. Проверить можно следующими способами:

# xm info | grep caps
hw_caps                : 178bfbff:ebd3fbff:00000000:00000010:00002001:00000000:0000001f
xen_caps               : xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p

# xm dmesg | grep VMX
(XEN) VMXON is done
(XEN) VMXON is done

# xm dmesg | grep -i svm
(XEN) AMD SVM Extension is enabled for cpu 0.
(XEN) AMD SVM Extension is enabled for cpu 1.

Траблы:

  • Через опу работает AMD VT-d в силу зачаточности реализации..
  • Через туда же работает USB .
  • При установки паравиртуальных драйверов для Windows (В частности Win2k3) отваливаются CDROM`ы.. (на версии драйвера gplpv_2003x64_0.11.0.188 от 3 января  2010 г.)

Ну на этом с траблами вроде все, по крайней мере я более не обнаружил..

Кстати вопреки слухам о запущенности и унынии свободной реализации паравиртуальных драйверов для виндовсов.. Отнюдь.. Драйвера активно разрабатываются и они довольно таки стабильны. Кому надо, ссылка в конце поста.

Хозяйке на заметку:

  1. В качестве виртуального HDD для гостевой ОС предпочтительнее использовать блочное устройство, нежели файловое.  Синтаксис опции : phy:UNAME,DEV,MODE
  2. Для ОС семейства MSWindows (особенно серверных) установки паравиртуальных драйверов крайне предпочтительна, ибо в качестве профита появится многоканальный SATA контроллер, 1G сетевой адаптер и.т.д в зависимости от типа ОС (сие особенно полезно если в гостевом сервере крутится БД ).

Полезные ссылки:

Отслеживание изменений в /etc с помощью etckeeper и Git

Собственно вот.. Объяснять для чего это не буду, кому надо тот поймет.

И так ставим etckeeper из репов..

wall:~# apt-get install etckeeper

Далее все просто..

wall:~# cd /etc/
wall:/etc# etckeeper init
Initialized empty Git repository in /etc/.git/
wall:/etc#etckeeper commit 'Init Сommit'
wall:/etc# git gc
Counting objects: 1476, done.
Compressing objects: 100% (1068/1068), done.
Writing objects: 100% (1476/1476), done.
Total 1476 (delta 91), reused 0 (delta 0)

Далее нам надо сделать так чтобы файлы конфигураций вновь установленных программ автоматом попадали в репозиторий.
Для этого надо разкомментировать строку AVOID_COMMIT_BEFORE_INSTALL=1 в файле /etc/etckeeper/etckeeper.conf .

Ну и запишем изменения :

wall:/etc# git commit -a -m 'Uncomment option in etckeeper.conf'
Created commit b26ec5d: Uncomment option in etckeeper.conf
 1 files changed, 1 insertions(+), 1 deletions(-)

За дополнительной информацией по работе с Gig лезем в Man.

Все! :)

Установка и настройка Zimbra CS OSE в Debian

zimbra_logo

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

  • Бесплатность (свабода).
  • Приемлемый уровень локализации.
  • Функциональный вэб интерфейс.
  • Хотя бы зачатки CRM.
  • Безопасность.
  • Производительность.
  • Высокая скорость работы с почтовыми ящиками очень большого размера.

Учитывая все эти требования я принялся бороздить просторы интернета в поисках чего-то похожего. Перебрав несколько более или менее подходящих экземпляров я честно говоря впал в отчаянье. Не один из них не подпадал даже под половину требований.. Среди них были и OpenExchange, Phpgroupware и некоторые другие, в каждом из них как на зло находились весьма досадные недостатки которые напрочь исключали возможность их использования. Но тем не менее задача требовала решения и поиск продолжался пока я случайно не наткнулся на сайт zimbra.com. Представленный там продукт при детальном рассмотрении соответствовал 90% требований (в OSE варианте по сей день нету вменяемых инструментов для резервного копирования). Не смотря на некоторые недостатки, список достоинств был весьма внушителен, что не могло не радовать. И так вооружившись wget`ом и xen я приступил к первичному осмотру. Результатом которого является успешная эксплуатация сей системы в течении 2 лет.
В данной статье я постараюсь провести краткий ликбез по Zimbra CS OSE о процессе ее установки и настройки. Читать далее »

Сборка ядра в Debian (Мануал № 1001)

debian-logo

Сборка ядра в Debian.

Перед тем как начать задумайтесь зачем Вам это надо и действительно ли Вам не хватает тех возможностей, что вложены в репозиторные ядра..

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

1. Померятся пиписьками с друзьями (мол у кого ядро свежее у того длиннее)
2. В вашем супер компьютере есть особо уникальное железо, поддержка которого появилась только в самом свежим ядре, а ждать пока оно появится в репозитории нету мочи.
3. У Вас особо пытливый ум и руки вечно чешутся в предвкушении чего нить поковырять. В общем есть неукротимое желание получше/ поближе познакомится с внутренним миром Linux.
4. Бесконечная тяга ко всякого рода оптимизациям. Хочется форсировать свое ядро до состояния мгновенной загрузки путем выкидывания из его состава всего на хрен ненужного.
5. Больная голова рукам покоя не дает.
6. Додумайте сами…..

Случаи когда ручная сборка блажь и потеря времени.
1. Система относительно статична, железо меняется редко и оно достаточно распространено дабы иметь поддержку в репозиторных ядрах.
2. Целевая система «боевой» сервер. В данном случае мнения могут расходится, я же считаю, что официальных фиксов вполне хватает, благо в Debian они выходят достаточно оперативно (В зависимости от степени критичности найденной уязвимости или бага). Но есть и исключения.
3. Случаи противоречащие мотивирующим фактором (см. Первые 6 пунктов).

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

И так приступим.

1. Для начала качаем последний стабильный релиз ядра с kernel.org (Внимание для тех у кого лимитированный интернет! Размер архива с исходным кодом ядра, примерно 55-60 Mb ) и установим необходимые для сборки пакеты.

apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential

2. Создаем директорию где будем собирать наше «ванильное ядро». Рекомендуют делать это в /usr/local/src, я же советую сделать директорию home/${USER}/srс. В созданную директорию копируем скаченный архив с исходными кодами ядра.

3. Далее распаковываем его.

tar -xvf ./linux-2.6.31.tar.bz2

4. Переходим в полученную директорию.

сd ./linux-2.6.31

5. Если есть необходимость накатить патчи.

bzip2 -dc ./patch.bz2 | patch -p1 --dry-run
bzip2 -dc ./patch.bz2 | patch -p1

6. Далее копируем текущий конфигурационный файл ядра.

make clean && make mrpropercp /boot/config-2.6.30-2-686 ./config

7. Конфигурируем ядро (если надо конечно).
Собственно самый ответственный момент во всем процессе. Сем занятием можно предаваться очень долго и в несколько подходов в зависимости от степени осознанности того, что Вы желаете получить на выходе. Настоятельно рекомендую подходить к этому процессу максимально серьезно, хотя бы ради экономии времени на повторную сборку в случае неудачи. Прежде чем что-то выключить или наоборот включить надо бы вопросить совета у всезнающего google.com или вызвать контекстную справку нажатием клавиши «?».

make menuconfig

По завершению конфигурации незабываем сохранить изменения.

Для пущего ускорения процесса рекомендую сделать следующее:

export CONCURRENCY_LEVEL=X – где «Х», это число ядер вашего процессора +1.

8. Далее надо собрать ядро.

make-kpkg clean && fakeroot make-kpkg --initrd --append-to-version=-${user} kernel_image kernel_headers

Процесс сборки займет Ваш компьютер на время от 1 часа до бесконечности :) .
Если процесс не завершится ошибкой то в итоге мы получим два .deb фала

linux-image-2.6.31-${username}_2.6.31-${username}-10.00.Custom_i386.deb – собственно само ядро.
linux-headers-2.6.31-${username}_2.6.31-${username}-10.00.Custom_i386.deb – заголовочные фалы ядра.

Разумеется их нужно проинсталлировать.

dpkg -i [ядро].deb
dpkg -i [заголовки].deb

В процессе инсталляции в Grub будет добавлен новый пункт меню с версией Вашего ядра.
Делаем reboot и грузимся под новым ядром. Скорее всего у Вас отвалится модуль ядра драйвера видео карты его нужно будет пересобрать. И я кратко опишу это действо.

Ставить мы будем бинарные драйвера от NVidia. Владельцам карт от ATI большой сори. :(

Качаем свежие драйвера для вашей видео-карты с сайта nvidia.com, будет что-то вроде этого.

NVIDIA-Linux-x86-185.18.36-pkg1.run – сей драйвер для 7 серии видео-карт.

Ну а дальше все просто.

Жмем Ctrl+Alt+F1

/etc/init.d/gdm stop -Нужно это в случае если на системе стоял X сервер (графическая оболочка) который после перезагрузки заявит вам об ошибке в работе драйвера, предварительно несколько раз мигнув дисплеем в тщетной попытке запуститься.

Переходим в директорию с фалом драйвера и запускаем его..

sh ./NVIDIA-Linux-x86-185.18.36-pkg1.run

Дополнительные параметры запуска можно посмотреть запустив драйвер с ключом -h

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

После того как все будет завершено запускаем gdm командой /etc/init.d/gdm start

Ну вот вроде и все.

С радостью отвечу на вопросы.