Страница 1 из 1

Уведомления в Jabber

Добавлено: 24 май 2012, 15:00
alex
Понадобилось сделать такую штуку, чтобы уведомления о новых заявках приходили агентам на jabber, помимо электронной почты.
Сделал, как описано по этой ссылке http://lists.otrs.org/pipermail/dev/200 ... 01400.html с небольшими поправками.
Все, что пришлось сделать для работы jabber - установить модуль Net::Jabber для perl и отредактировать файл /opt/otrs/Kernel/System/Ticket/Article.pm

В jabber приходят сообщения, содержащие номер заявки, тип уведомления и заголовок заявки, например:
[Заявка№2012052410000315] Новая заявка: test
Можно присылать весь текст заявки, указав заменив "body" => $Notification{Subject} на "body" => $Notification{Body} в добавляемом коде.

JabberID в моем случае всегда соответствует email, поэтому проблем с этим нет. В крайнем случае, сделать отдельное поле для JID не представляется особо сложным. По идее, поле просто добавляется в базу и Config.pm (как это делать в документации описано) после чего, его можно использовать в коде.

Также, можно указать тип сообщения type вместо headline, например chat.

Ниже привожу правки, вносимые в файл:

Код: Выделить всё

--- Article.pm.orig	2012-05-24 14:41:48.457272999 +0400
+++ Article.pm	2012-05-24 14:40:40.657272999 +0400
@@ -16,24 +16,32 @@
 use vars qw($VERSION);
 $VERSION = qw($Revision: 1.311 $) [1];
 
+## Jabber
+use Net::Jabber qw(Client) ;
+use Net::Jabber qw(Message) ;   
+use Net::Jabber qw(Protocol) ;
+use Net::Jabber qw(Presence) ;
+
+use vars qw ($connection @result $message);
+
 
 =head1 NAME
 
 Kernel::System::Ticket::Article - sub module of Kernel::System::Ticket
 
 =head1 SYNOPSIS
 
 All article functions.
 
 =head1 PUBLIC INTERFACE
 
 =over 4
@@ -2371,24 +2379,45 @@
     # send notify
     $Self->{SendmailObject}->Send(
         From => $Self->{ConfigObject}->Get('NotificationSenderName') . ' <'
             . $Self->{ConfigObject}->Get('NotificationSenderEmail') . '>',
         To       => $User{UserEmail},
         Subject  => $Notification{Subject},
         MimeType => $Notification{ContentType} || 'text/plain',
         Charset  => $Notification{Charset},
         Body     => $Notification{Body},
         Loop     => 1,
     );
 
+####################
+my $connection = Net::Jabber::Client->new();
+$connection->Connect( "hostname" => "jabber.ru","port" => '5222', "ssl" => "0" );
+my @result = $connection->AuthSend( "username" => "otrs","password" =>"1q2w3e","resource" => "DaemonMonitor", "ssl" => "0" );
+if ($result[0] ne "ok") {
+    $Self->{LogObject}->Log(
+        Priority => 'notice',
+        Message  => "Ident/Auth with server failed: $result[0] - $result[1]\n",
+    );
+}
+my $jid=$User{UserEmail};
+my $message = Net::Jabber::Message->new();
+$message->SetMessage( "to"           => $jid,
+                      "subject"      => "Ticket OTRS Alert",
+                      "type"         => "headline",
+                      "body"         => $Notification{Subject},
+                       "ssl"         => "0");
+$connection->Send($message);
+$connection->Disconnect();
+####################
+
     # write history
     $Self->HistoryAdd(
         TicketID     => $Param{TicketID},
         HistoryType  => 'SendAgentNotification',
         Name         => "\%\%$Param{Type}\%\%$User{UserEmail}",
         CreateUserID => $Param{UserID},
     );

Re: Уведомления в Jabber

Добавлено: 08 июн 2012, 14:18
andru
Отличное решение, спасибо
Настроил на свой корпоративный jabber сервер
Здесь DynamicFields -> Frontend::Agent::Preferences добавил дополнительное поле для агентов JabberID
и изменил кусок кода так

Код: Выделить всё

+    my $jid=$User{UserDynamicField_JabberID};
+    if ($jid) {
+        my $message = Net::Jabber::Message->new();
+       $message->SetMessage( "to"           => $jid,
+                              "subject"      => "Ticket OTRS Alert",
+                              "type"         => "headline",
+                              "body"         => $Notification{Subject},
+                              "ssl"         => "0");
+       $connection->Send($message);
+    }
+    $connection->Disconnect();
+    ####################

Re: Уведомления в Jabber

Добавлено: 01 окт 2012, 12:05
3JIou-TaTaPuH
Доброго дня суток! Уважаемый andru и alexus не могли бы вы выложть свои Article.pm пожалуйста.
С уважением go6PbIu-ТaТаРuН

Re: Уведомления в Jabber

Добавлено: 17 июл 2014, 09:37
adminfree
Подправили для того, чтоб в сообщения джаббера приходила ссылка на тикет для агента.
Мало ли кому пригодится.

Код: Выделить всё


my $connection=new Net::XMPP::Client();
$connection->Connect(hostname=>"jabber.local");
$connection->AuthSend(username=>"user", password=>"pass", resource=>"jabber");
my $message=new Net::XMPP::Message();
$message->SetMessage(to=>"$User{UserLogin}\@jabber.local",
                 from=>"user@jabber.local",
                 subject=>"$Notification{Subject}" ,
                 body=>"http://localhost/otrs/index.pl?Action=AgentTicketZoom;TicketID=$Param{TicketID}"
                 );
    $connection->Send($message);
    $connection->Disconnect();


Re: Уведомления в Jabber

Добавлено: 23 дек 2014, 07:01
firebolt
Кому удалось добиться работы уведомлений в jabber на OTRS версии 4? Отпишитесь, пожалуйста. Киньте конфиг!

Re: Уведомления в Jabber

Добавлено: 29 янв 2015, 14:48
DrainSPb
День добрый!
Удалось настроить уведомления в Jabber агентов на OTRS 4.0.5 после 2х недель ковыряния в коде и инете (выше описанные методы замечательно работали в 3.х.х версии но напрочь не работали в 4.х.х):
1. Ставим пакет: Jabber-Connection-0.04 и все, что ему потребуется.http://search.cpan.org/~qmacro/Jabber-Connection-0.04/
2. По аналогии с предыдущими решениями правим файл Article.pm
2.1 В начало :

Код: Выделить всё

## Jabber
use Jabber::Connection;
use Jabber::NodeFactory;
use Jabber::NS qw(:all);
2.2 после # send notify и перед # write history:

Код: Выделить всё

 # Connect and Jab message

my $nf = new Jabber::NodeFactory;

my $c = new Jabber::Connection(
  server => 'ServerName',
  log    => 1,
);

$c->connect or die "oops: ".$c->lastError;
$c->register_handler('message', \&message);
$c->auth('JabUser', 'Password', 'JabUser');

my $JID1 = $User{UserLogin};
my $JID = $JID1 . 'JabDomain';
my $m = $nf->newNode('message');
$m->insertTag('body')->data($Notification{Subject}, 'http://OTRS.FQDN/otrs/index.pl?Action=AgentTicketZoom;TicketID=$Param{TicketID}');
$m->attr('to', $JID);
$c->send($m);
$c->send('<presence/>');

#my $iq = $nf->newNode('iq');
#$iq->attr('type', IQ_GET);
#$iq->attr('to', 'localhost');
#$iq->insertTag('query', NS_TIME);
#$c->send($iq);

#$c->process(5);

$c->disconnect;

#sub message {
#  my $node = shift;
#  print "Received --> ", $node->toStr, "\n";
#}
### END Jab message
3. Код слегка модифицирован. В частности добавлена переменная $JID для извлечения логина агента и добавления к нему домена Джаббера.
Часть кода комментирована т.к. функционал не востребован(так понимаю он для приема сообщений, что мне не нужно).

P.S. Может кому поможет не терять много времени как мне.
P.P.S Не являюсь специалистом по Perl и Debian.

Re: Уведомления в Jabber

Добавлено: 10 авг 2017, 12:38
kostya
Добрый день,
Подскажите пожалуйста, у кого нибудь работает уведомление на Jabber в OTRS 5 ?
Пробовал вышеописанные методики, результата ноль

В 5-й версии /opt/otrs/Kernel/System/Ticket/Article.pm переработан, непонятно куда вставлять код для Jabber-а,
нет # send notify вставил перед # write history.
В логах Апача множественные ошибки "Article.pm: subroutine <> redefined at /opt/otrs//Kernel/System/Ticket/Article.pm line xxxx"
"Global symbol requires explicit package name at /opt/otrs//Kernel/System/Ticket/Article.pm line yyyy", где "yyyy" строка добваляемго кода, например "my $jid=$User{UserDynamicField_JabberID};".
При попытке созадть заявку вылетат в "Internal Server Error".
...