HylafaxSql

Материал из OpenWiki
Перейти к: навигация, поиск

Интеграция HylaFax с базой данный

Первоисточник

В английском HOWTO HylaFax есть небольшой абзац 6.14 Database Integration - интеграция с базой данных:


HylaFAX обычно помещает всю свою статистическую информацию в отформатированный xferfaxlog файл. Многие пользователи считают, что лучше вставить ту же самую информацию в локальную базу данных, такую как MySQL, где это может использоваться с другой бухгалтерской информацией. Эту цель несложно достигнуть особенно используя etc/FaxAccounting, который описан на странице документации xferfaxlog . Типовой сценарий FaxAccounting можно посмотреть здесь: http://hylafax.sourceforge.net/howto/misc/FaxAccounting]. Помните, что etc/FaxAccounting должен быть отмечен как выполнимый большинством процессов HylaFax.

Структура параметров

Если мы обобщим информацию из документации xferfaxlog и небольшую практику использования можно сказать следующее:

в каждую строчку xferfaxlog всегда записывается ровно по 20 полей разделенных символами табуляции и соответственно ровно это же количество 20 полей всегда передается скрипту etc/FaxAccounting. часть полей может быть пустыми - но если поле присутствует то оно передаётся на строго определенной позиции: так например если определен параметр modem - он передается только четвертым параметром.

1 date date date date date date date
2 SEND RECV CALL POLL PAGE UNSENT SUBMIT
3 commid commid commid commid commid
4 modem modem modem modem modem
5 jobid qfile jobid jobid jobid jobid
6 jobtag jobtag jobtag . .
7 sender fax fax sender sender . .
8 dest-number local-number local-number dest-number dest-number . .
9 CSI TSI TSI . .
10 param param 0 param 0 . .
11 #pages #pages 0 #pages 0 . .
12 jobtime jobtime jobtime jobtime jobtime . .
13 conntime conntime conntime conntime conntime . .
14 reason reason reason reason . .
15 CIDName CIDName . .
16 CIDNumber CIDNumber . .
17 callid callid . .
18 owner . . owner . .
19 dcs dcs . . . .
20 jobinfo . . jobinfo . .

Точками в таблице отмечены те поля которые могут все рано присутствовать, то есть в документации они отмечены не как null или 0, а многоточием :))

Нельзя сказать что структура выбрана разработчиками оптимально. Так например непонятно почему надо было 23 параметра впихивать в 20 позиций, а не зарезервировать для каждой свою. Ведь 20 полей или 23 - большой разницы нет. А вот разбирать смешанные данные в одних позициях(например jobid и qfile в пятой позиции) это менее логично.

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

Скрипты интеграции

Скрипт инициализации раздельных таблиц MySQL

Из соображений как бы чего не потерять - таблицы сделаны несколько избыточными:


SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- База данных: `hylafax`
--
-- --------------------------------------------------------
--
-- Структура таблицы `CALL`
--
DROP TABLE IF EXISTS `CALL`;
CREATE TABLE IF NOT EXISTS `CALL` (
 `date` datetime NOT NULL,
 `etype` char(6) collate utf8_unicode_ci NOT NULL,
 `commid` char(20) collate utf8_unicode_ci NOT NULL,
 `modem` char(6) collate utf8_unicode_ci NOT NULL,
 `jobid` char(100) collate utf8_unicode_ci NOT NULL,
 `jobtag` char(100) collate utf8_unicode_ci NOT NULL,
 `fax` char(100) collate utf8_unicode_ci NOT NULL,
 `localnumber` char(50) collate utf8_unicode_ci NOT NULL,
 `CSI` char(100) collate utf8_unicode_ci NOT NULL,
 `params` char(100) collate utf8_unicode_ci NOT NULL,
 `pages` int(11) unsigned NOT NULL,
 `jobtime` time NOT NULL,
 `conntime` time NOT NULL,
 `reason` char(255) collate utf8_unicode_ci NOT NULL,
 `CIDName` char(100) collate utf8_unicode_ci NOT NULL,
 `CIDNumber` char(100) collate utf8_unicode_ci NOT NULL,
 `callid` char(100) collate utf8_unicode_ci NOT NULL,
 `owner` char(100) collate utf8_unicode_ci NOT NULL,
 `dcs` char(255) collate utf8_unicode_ci NOT NULL,
 `jobinfo` char(255) collate utf8_unicode_ci NOT NULL,
 `dt` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
 `id_CALL` int(11) unsigned NOT NULL auto_increment,
 PRIMARY KEY  (`id_CALL`),
 KEY `commid` (`commid`),
 KEY `modem` (`modem`),
 KEY `jobid` (`jobid`),
 KEY `date` (`date`),
 KEY `CSI` (`CSI`),
 KEY `dt` (`dt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Структура таблицы `PAGE`
--
DROP TABLE IF EXISTS `PAGE`;
CREATE TABLE IF NOT EXISTS `PAGE` (
 `date` datetime NOT NULL,
 `etype` char(6) collate utf8_unicode_ci NOT NULL,
 `commid` char(20) collate utf8_unicode_ci NOT NULL,
 `modem` char(6) collate utf8_unicode_ci NOT NULL,
 `jobid` int(11) NOT NULL,
 `jobtag` char(100) collate utf8_unicode_ci NOT NULL,
 `sender` char(100) collate utf8_unicode_ci NOT NULL,
 `destnumber` char(50) collate utf8_unicode_ci NOT NULL,
 `TSI` char(100) collate utf8_unicode_ci NOT NULL,
 `params` char(100) collate utf8_unicode_ci NOT NULL,
 `pages` int(11) unsigned NOT NULL,
 `jobtime` time NOT NULL,
 `conntime` time NOT NULL,
 `reason` char(255) collate utf8_unicode_ci NOT NULL,
 `CIDName` char(100) collate utf8_unicode_ci NOT NULL,
 `CIDNumber` char(100) collate utf8_unicode_ci NOT NULL,
 `callid` char(100) collate utf8_unicode_ci NOT NULL,
 `owner` char(100) collate utf8_unicode_ci NOT NULL,
 `dcs` char(255) collate utf8_unicode_ci NOT NULL,
 `jobinfo` char(255) collate utf8_unicode_ci NOT NULL,
 `dt` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
 `id_PAGE` int(11) unsigned NOT NULL auto_increment,
 PRIMARY KEY  (`id_PAGE`),
 KEY `commid` (`commid`),
 KEY `modem` (`modem`),
 KEY `jobid` (`jobid`),
 KEY `date` (`date`),
 KEY `TSI` (`TSI`),
 KEY `dt` (`dt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Структура таблицы `POLL`
--
DROP TABLE IF EXISTS `POLL`;
CREATE TABLE IF NOT EXISTS `POLL` (
 `date` datetime NOT NULL,
 `etype` char(6) collate utf8_unicode_ci NOT NULL,
 `commid` char(20) collate utf8_unicode_ci NOT NULL,
 `modem` char(6) collate utf8_unicode_ci NOT NULL,
 `jobid` int(11) NOT NULL,
 `jobtag` char(100) collate utf8_unicode_ci NOT NULL,
 `sender` char(100) collate utf8_unicode_ci NOT NULL,
 `destnumber` char(50) collate utf8_unicode_ci NOT NULL,
 `TSI` char(100) collate utf8_unicode_ci NOT NULL,
 `params` char(100) collate utf8_unicode_ci NOT NULL,
 `pages` int(11) unsigned NOT NULL,
 `jobtime` time NOT NULL,
 `conntime` time NOT NULL,
 `reason` char(255) collate utf8_unicode_ci NOT NULL,
 `CIDName` char(100) collate utf8_unicode_ci NOT NULL,
 `CIDNumber` char(100) collate utf8_unicode_ci NOT NULL,
 `callid` char(100) collate utf8_unicode_ci NOT NULL,
 `owner` char(100) collate utf8_unicode_ci NOT NULL,
 `dcs` char(255) collate utf8_unicode_ci NOT NULL,
 `jobinfo` char(255) collate utf8_unicode_ci NOT NULL,
 `dt` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
 `id_POLL` int(11) unsigned NOT NULL auto_increment,
 PRIMARY KEY  (`id_POLL`),
 KEY `commid` (`commid`),
 KEY `modem` (`modem`),
 KEY `jobid` (`jobid`),
 KEY `TSI` (`TSI`),
 KEY `destnumber` (`destnumber`),
 KEY `date` (`date`),
 KEY `dt` (`dt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Структура таблицы `RECV`
--
DROP TABLE IF EXISTS `RECV`;
CREATE TABLE IF NOT EXISTS `RECV` (
 `date` datetime NOT NULL,
 `etype` char(6) collate utf8_unicode_ci NOT NULL,
 `commid` char(20) collate utf8_unicode_ci NOT NULL,
 `modem` char(6) collate utf8_unicode_ci NOT NULL,
 `qfile` char(255) collate utf8_unicode_ci NOT NULL,
 `jobtag` char(100) collate utf8_unicode_ci NOT NULL,
 `fax` char(100) collate utf8_unicode_ci NOT NULL,
 `localnumber` char(50) collate utf8_unicode_ci NOT NULL,
 `TSI` char(100) collate utf8_unicode_ci NOT NULL,
 `params` char(100) collate utf8_unicode_ci NOT NULL,
 `pages` int(11) unsigned NOT NULL,
 `jobtime` time NOT NULL,
 `conntime` time NOT NULL,
 `reason` char(255) collate utf8_unicode_ci NOT NULL,
 `CIDName` char(100) collate utf8_unicode_ci NOT NULL,
 `CIDNumber` char(100) collate utf8_unicode_ci NOT NULL,
 `callid` char(100) collate utf8_unicode_ci NOT NULL,
 `owner` char(100) collate utf8_unicode_ci NOT NULL,
 `dcs` char(255) collate utf8_unicode_ci NOT NULL,
 `jobinfo` char(255) collate utf8_unicode_ci NOT NULL,
 `dt` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
 `id_RECV` int(11) unsigned NOT NULL auto_increment,
 PRIMARY KEY  (`id_RECV`),
 KEY `commid` (`commid`),
 KEY `modem` (`modem`),
 KEY `TSI` (`TSI`),
 KEY `date` (`date`),
 KEY `qfile` (`qfile`),
 KEY `dt` (`dt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Структура таблицы `SEND`
--
DROP TABLE IF EXISTS `SEND`;
CREATE TABLE IF NOT EXISTS `SEND` (
 `date` datetime NOT NULL,
 `etype` char(6) collate utf8_unicode_ci NOT NULL,
 `commid` char(20) collate utf8_unicode_ci NOT NULL,
 `modem` char(6) collate utf8_unicode_ci NOT NULL,
 `jobid` int(11) NOT NULL,
 `jobtag` char(100) collate utf8_unicode_ci NOT NULL,
 `sender` char(100) collate utf8_unicode_ci NOT NULL,
 `destnumber` char(50) collate utf8_unicode_ci NOT NULL,
 `CSI` char(100) collate utf8_unicode_ci NOT NULL,
 `params` char(100) collate utf8_unicode_ci NOT NULL,
 `pages` int(11) unsigned NOT NULL,
 `jobtime` time NOT NULL,
 `conntime` time NOT NULL,
 `reason` char(255) collate utf8_unicode_ci NOT NULL,
 `CIDName` char(100) collate utf8_unicode_ci NOT NULL,
 `CIDNumber` char(100) collate utf8_unicode_ci NOT NULL,
 `callid` char(100) collate utf8_unicode_ci NOT NULL,
 `owner` char(100) collate utf8_unicode_ci NOT NULL,
 `dcs` char(255) collate utf8_unicode_ci NOT NULL,
 `jobinfo` char(255) collate utf8_unicode_ci NOT NULL,
 `dt` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
 `id_SEND` int(10) unsigned NOT NULL auto_increment,
 PRIMARY KEY  (`id_SEND`),
 KEY `commid` (`commid`),
 KEY `modem` (`modem`),
 KEY `jobid` (`jobid`),
 KEY `CSI` (`CSI`),
 KEY `date` (`date`),
 KEY `destnumber` (`destnumber`),
 KEY `dt` (`dt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Структура таблицы `SUBMIT`
--
DROP TABLE IF EXISTS `SUBMIT`;
CREATE TABLE IF NOT EXISTS `SUBMIT` (
 `date` datetime NOT NULL,
 `etype` char(6) collate utf8_unicode_ci NOT NULL,
 `commid` char(20) collate utf8_unicode_ci NOT NULL,
 `modem` char(6) collate utf8_unicode_ci NOT NULL,
 `jobid` int(11) NOT NULL,
 `jobtag` char(100) collate utf8_unicode_ci NOT NULL,
 `sender` char(100) collate utf8_unicode_ci NOT NULL,
 `destnumber` char(50) collate utf8_unicode_ci NOT NULL,
 `CSI` char(100) collate utf8_unicode_ci NOT NULL,
 `params` char(100) collate utf8_unicode_ci NOT NULL,
 `pages` int(11) unsigned NOT NULL,
 `jobtime` time NOT NULL,
 `conntime` time NOT NULL,
 `reason` char(255) collate utf8_unicode_ci NOT NULL,
 `CIDName` char(100) collate utf8_unicode_ci NOT NULL,
 `CIDNumber` char(100) collate utf8_unicode_ci NOT NULL,
 `callid` char(100) collate utf8_unicode_ci NOT NULL,
 `owner` char(100) collate utf8_unicode_ci NOT NULL,
 `dcs` char(255) collate utf8_unicode_ci NOT NULL,
 `jobinfo` char(255) collate utf8_unicode_ci NOT NULL,
 `dt` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
 `id_SUBMIT` int(11) unsigned NOT NULL auto_increment,
 PRIMARY KEY  (`id_SUBMIT`),
 KEY `commid` (`commid`),
 KEY `modem` (`modem`),
 KEY `jobid` (`jobid`),
 KEY `destnumber` (`destnumber`),
 KEY `CSI` (`CSI`),
 KEY `date` (`date`),
 KEY `dt` (`dt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Структура таблицы `UNSENT`
--
DROP TABLE IF EXISTS `UNSENT`;
CREATE TABLE IF NOT EXISTS `UNSENT` (
 `date` datetime NOT NULL,
 `etype` char(6) collate utf8_unicode_ci NOT NULL,
 `commid` char(20) collate utf8_unicode_ci NOT NULL,
 `modem` char(6) collate utf8_unicode_ci NOT NULL,
 `jobid` int(11) NOT NULL,
 `jobtag` char(100) collate utf8_unicode_ci NOT NULL,
 `sender` char(100) collate utf8_unicode_ci NOT NULL,
 `destnumber` char(50) collate utf8_unicode_ci NOT NULL,
 `CSI` char(100) collate utf8_unicode_ci NOT NULL,
 `params` char(100) collate utf8_unicode_ci NOT NULL,
 `pages` int(11) unsigned NOT NULL,
 `jobtime` time NOT NULL,
 `conntime` time NOT NULL,
 `reason` char(255) collate utf8_unicode_ci NOT NULL,
 `CIDName` char(100) collate utf8_unicode_ci NOT NULL,
 `CIDNumber` char(100) collate utf8_unicode_ci NOT NULL,
 `callid` char(100) collate utf8_unicode_ci NOT NULL,
 `owner` char(100) collate utf8_unicode_ci NOT NULL,
 `dcs` char(255) collate utf8_unicode_ci NOT NULL,
 `jobinfo` char(255) collate utf8_unicode_ci NOT NULL,
 `dt` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
 `id_UNSENT` int(11) unsigned NOT NULL auto_increment,
 PRIMARY KEY  (`id_UNSENT`),
 KEY `commid` (`commid`),
 KEY `modem` (`modem`),
 KEY `jobid` (`jobid`),
 KEY `CSI` (`CSI`),
 KEY `date` (`date`),
 KEY `destnumber` (`destnumber`),
 KEY `dt` (`dt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

Скрипт транслирующий текущий xferfaxlog в базу

Файлы xxfs и xxaw.awk должны находиться в одном каталоге с xferfaxlog

файл xxfs :

#!/bin/sh
#
sed '1d'  xferfaxlog |
sed 's/\"//g'|
awk -f xxaw.awk |
sed 's/,$/;/' | mysql hylafax

файл xxaw.awk:

BEGIN{
 FS="\t"
 send=""
 recv=""
 call=""
 page=""
 poll=""
 unsent=""
 submit=""
}
{
 split($1,a,"[\/ ]")
 if($2 == "SEND"){ 
   send=send "('20" a[3] "-" a[1]"-"a[2]" "a[4]"','"$2"','"$3"','"$4"','"$5"','"$6"','"$7"','"$8"','"$9"','"$10"','"$11"','"$12"','"$13"','"$14"','"$15"','"$16"','"$17"','"$18"','"$19"','"$20"',NULL,NULL),"
 }else{
  if($2== "RECV"){ 
   recv = recv "('20" a[3] "-" a[1]"-"a[2]" "a[4]"','"$2"','"$3"','"$4"','"$5"','"$6"','"$7"','"$8"','"$9"','"$10"','"$11"','"$12"','"$13"','"$14"','"$15"','"$16"','"$17"','"$18"','"$19"','"$20"',NULL,NULL),"
 }else{
  if($2 == "CALL"){
   call = call "('20" a[3] "-" a[1]"-"a[2]" "a[4]"','"$2"','"$3"','"$4"','"$5"','"$6"','"$7"','"$8"','"$9"','"$10"','"$11"','"$12"','"$13"','"$14"','"$15"','"$16"','"$17"','"$18"','"$19"','"$20"',NULL,NULL),"
}else{
  if($2 == "PAGE"){
   page = page "('20" a[3] "-" a[1]"-"a[2]" "a[4]"','"$2"','"$3"','"$4"','"$5"','"$6"','"$7"','"$8"','"$9"','"$10"','"$11"','"$12"','"$13"','"$14"','"$15"','"$16"','"$17"','"$18"','"$19"','"$20"',NULL,NULL),"
 }else{
  if($2 == "POLL"){
   poll = poll "('20" a[3] "-" a[1]"-"a[2]" "a[4]"','"$2"','"$3"','"$4"','"$5"','"$6"','"$7"','"$8"','"$9"','"$10"','"$11"','"$12"','"$13"','"$14"','"$15"','"$16"','"$17"','"$18"','"$19"','"$20"',NULL,NULL),"
 }else{
  if($2 == "UNSENT"){
   unsent = unsent "('20" a[3] "-" a[1]"-"a[2]" "a[4]"','"$2"','"$3"','"$4"','"$5"','"$6"','"$7"','"$8"','"$9"','"$10"','"$11"','"$12"','"$13"','"$14"','"$15"','"$16"','"$17"','"$18"','"$19"','"$20"',NULL,NULL),"
 }else{
  if($2 == "SUBMIT"){
   submit = submit "('20" a[3] "-" a[1]"-"a[2]" "a[4]"','"$2"','"$3"','"$4"','"$5"','"$6"','"$7"','"$8"','"$9"','"$10"','"$11"','"$12"','"$13"','"$14"','"$15"','"$16"','"$17"','"$18"','"$19"','"$20"',NULL,NULL),"
}
}}}}}}
}
END{
if( send != "" ){print "INSERT INTO `SEND` VALUES " send }
if( recv != "" ){print "INSERT INTO `RECV` VALUES " recv }
if( call != "" ){print "INSERT INTO `CALL` VALUES " call }
if( page != "" ){print "INSERT INTO `PAGE` VALUES " page }
if( poll != "" ){print "INSERT INTO `POLL` VALUES " poll }
if( unsent != "" ){print "INSERT INTO `UNSENT` VALUES " unsent }
if( submit != "" ){print "INSERT INTO `SUBMIT` VALUES " submit }
}

etc/FaxAccounting для раздельных таблиц

#!/bin/bash
#
if [ $# -eq 20 ]
then
# переделываем дату для mysql
dad=`echo "$1" | cut  -d" " -f1`
tat=`echo "$1" | cut  -d" " -f2`
ddt=`echo "$dad" | cut  -d"/" -f2`
mdt=`echo "$dad" | cut  -d"/" -f1`
gdt=`echo "$dad" | cut  -d"/" -f3`
newdat=`echo "20$gdt-$mdt-$ddt $tat"`
# пишем событие в базу
echo "INSERT INTO \`$2\` VALUES('$newdat','$2','$3','$4','$5','$6','$7','$8','$9','${10}','${11}','${12}','${13}','${14}','${15}','${16}','${17}','${18}','${19}','${20}',NULL,NULL)" | mysql hylafax
else
# получна неправильная структура
echo "$@ - $1 - $2" >> log
fi

PS

Проблему представляет недостаток данных.

Так например в таблицу неплохо бы получать данные DIAL для исходящих сеансов связи -аналогичных данным CALL для входящих вызовов.

В записях структуры SEND и SUBMIT также не лишним было бы присутсвие поля qfile.



если вам статья поможет киньте сколько не жалко на кошелек 41001101259634 яндекс.денег :)))

что б понимать насколько не зря я трудился :)) - скрипты писал сам :)