A Connector is in essence set of actions called Operations if OTRS acts as a web service provider or Invokers if OTRS acts as a web service requester. But it can also include special Mappings or Transports
One Connector can have only Operations, Only Invokers or both. A connector can even use parts of other connectors like the Mappings or Transports if they are not so specific for the Connector that implements them.
In another words a Connector is not limited to just the Controller layer but it can be extended to Data Mapping or Network Transport layers if needed.
Due to the modular design of the Generic Interface a Connector can be seen as a plug-in; this means that by adding Connectors the capabilities of the generic interface can be extended using: OTRS Feature add ons, OTRS Custom modules, 3rd Party modules, and so on.
Included with this version of OTRS the following connectors are ready to be used.
Session
Ticket
This connector is capable to create a valid SessionID that can be used in any other operation.
Provides:
Operations:
SessionCreate
Creates a new new valid SessionID to be used in other operations from other connectors like TicketCreate.
To use the SessionID in other operations from other connectors is necessary that the operation implements authentication by SessionID. all the rest of the bundled operations are capable to accept a valid SessionID as an authentication method.
Possible Attributes:
<SessionCreate> <!--You have a MANDATORY CHOICE of the next 2 items at this level--> <!--Optional:--> <UserLogin>?</UserLogin> <!--Optional:--> <CustomerUserLogin>?</CustomerUserLogin> <!--Optional:--> <Password>?</Password> </SessionCreate>
This connector supplies the basic functionality to interact with tickets
Provides:
Operations:
TicketCreate
TicketUpdate
TicketGet
TicketSearch
Provides an interface to create ticket in OTRS, a ticket must contain an Article and can contain several attachments, all defined Dynamic Fields can be also set on TicketCreate operation.
Possible Attributes:
<TicketCreate> <!--You have a MANDATORY CHOICE of the next 3 items at this level--> <!--Optional:--> <UserLogin>?</UserLogin> <!--Optional:--> <CustomerUserLogin>?</CustomerUserLogin> <!--Optional:--> <SessionID>?</SessionID> <!--Optional:--> <Password>?</Password> <Ticket> <Title>?</Title> <!--You have a MANDATORY CHOICE of the next 2 items at this level--> <!--Optional:--> <QueueID>?</QueueID> <!--Optional:--> <Queue>?</Queue> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <TypeID>?</TypeID> <!--Optional:--> <Type>?</Type> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <ServiceID>?</ServiceID> <!--Optional:--> <Service>?</Service> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <SLAID>?</SLAID> <!--Optional:--> <SLA>?</SLA> <!--You have a MANDATORY CHOICE of the next 2 items at this level--> <!--Optional:--> <StateID>?</StateID> <!--Optional:--> <State>?</State> <!--You have a MANDATORY CHOICE of the next 2 items at this level--> <!--Optional:--> <PriorityID>?</PriorityID> <!--Optional:--> <Priority>?</Priority> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <OwnerID>?</OwnerID> <!--Optional:--> <Owner>?</Owner> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <ResponsibleID>?</ResponsibleID> <!--Optional:--> <Responsible>?</Responsible> <CustomerUser>?</CustomerUser> <!--Optional:--> <PendingTime> <Year>?</Year> <Month>?</Month> <Day>?</Day> <Hour>?</Hour> <Minute>?</Minute> </PendingTime> </Ticket> <Article> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <ArticleTypeID>?</ArticleTypeID> <!--Optional:--> <ArticleType>?</ArticleType> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <SenderTypeID>?</SenderTypeID> <!--Optional:--> <SenderType>?</SenderType> <!--Optional:--> <From>?</From> <Subject>?</Subject> <Body>?</Body> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <ContentType>?</ContentType> <Charset>?</Charset> <MimeType>?</MimeType> <!--Optional:--> <HistoryType>?</HistoryType> <!--Optional:--> <HistoryComment>?</HistoryComment> <!--Optional:--> <AutoResponseType>?</AutoResponseType> <!--Optional:--> <TimeUnit>?</TimeUnit> <!--Optional:--> <NoAgentNotify>?</NoAgentNotify> <!--Zero or more repetitions:--> <ForceNotificationToUserID>?</ForceNotificationToUserID> <!--Zero or more repetitions:--> <ExcludeNotificationToUserID>?</ExcludeNotificationToUserID> <!--Zero or more repetitions:--> <ExcludeMuteNotificationToUserID>?</ExcludeMuteNotificationToUserID> </Article> <!--Zero or more repetitions:--> <DynamicField> <Name>?</Name> <!--1 or more repetitions:--> <Value>?</Value> </DynamicField> <!--Zero or more repetitions:--> <Attachment> <Content>cid:61886944659</Content> <ContentType>?</ContentType> <Filename>?</Filename> </Attachment> </TicketCreate>
TicketUpdate operation add the capability to modify attributes from a ticket or add a new article, including attachments and all defined dynamic fields for the ticket and the new article.
It is not necessary to create a new article to modify a ticket attribute.
Possible Attributes:
<TicketUpdate> <!--You have a MANDATORY CHOICE of the next 3 items at this level--> <!--Optional:--> <UserLogin>?</UserLogin> <!--Optional:--> <CustomerUserLogin>?</CustomerUserLogin> <!--Optional:--> <SessionID>?</SessionID> <!--Optional:--> <Password>?</Password> <!--You have a CHOICE of the next 2 items at this level--> <TicketID>?</TicketID> <TicketNumber>?</TicketNumber> <!--Optional:--> <Ticket> <!--Optional:--> <Title>?</Title> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <QueueID>?</QueueID> <!--Optional:--> <Queue>?</Queue> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <TypeID>?</TypeID> <!--Optional:--> <Type>?</Type> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <ServiceID>?</ServiceID> <!--Optional:--> <Service>?</Service> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <SLAID>?</SLAID> <!--Optional:--> <SLA>?</SLA> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <StateID>?</StateID> <!--Optional:--> <State>?</State> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <PriorityID>?</PriorityID> <!--Optional:--> <Priority>?</Priority> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <OwnerID>?</OwnerID> <!--Optional:--> <Owner>?</Owner> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <ResponsibleID>?</ResponsibleID> <!--Optional:--> <Responsible>?</Responsible> <!--Optional:--> <CustomerUser>?</CustomerUser> <!--Optional:--> <PendingTime> <Year>?</Year> <Month>?</Month> <Day>?</Day> <Hour>?</Hour> <Minute>?</Minute> </PendingTime> </Ticket> <!--Optional:--> <Article> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <ArticleTypeID>?</ArticleTypeID> <!--Optional:--> <ArticleType>?</ArticleType> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <SenderTypeID>?</SenderTypeID> <!--Optional:--> <SenderType>?</SenderType> <!--Optional:--> <From>?</From> <Subject>?</Subject> <Body>?</Body> <!--You have a CHOICE of the next 2 items at this level--> <!--Optional:--> <ContentType>?</ContentType> <Charset>?</Charset> <MimeType>?</MimeType> <!--Optional:--> <HistoryType>?</HistoryType> <!--Optional:--> <HistoryComment>?</HistoryComment> <!--Optional:--> <AutoResponseType>?</AutoResponseType> <!--Optional:--> <TimeUnit>?</TimeUnit> <!--Optional:--> <NoAgentNotify>?</NoAgentNotify> <!--Zero or more repetitions:--> <ForceNotificationToUserID>?</ForceNotificationToUserID> <!--Zero or more repetitions:--> <ExcludeNotificationToUserID>?</ExcludeNotificationToUserID> <!--Zero or more repetitions:--> <ExcludeMuteNotificationToUserID>?</ExcludeMuteNotificationToUserID> </Article> <!--Zero or more repetitions:--> <DynamicField> <Name>?</Name> <!--1 or more repetitions:--> <Value>?</Value> </DynamicField> <!--Zero or more repetitions:--> <Attachment> <Content>cid:166861569966</Content> <ContentType>?</ContentType> <Filename>?</Filename> </Attachment> </TicketUpdate>
This operation is used to get all the attributes of a ticket including the dynamic fields, all the articles and all the attachments that belongs to the ticket.
Possible Attributes:
<TicketGet> <!--You have a MANDATORY CHOICE of the next 3 items at this level--> <!--Optional:--> <UserLogin>?</UserLogin> <!--Optional:--> <CustomerUserLogin>?</CustomerUserLogin> <!--Optional:--> <SessionID>?</SessionID> <!--Optional:--> <Password>?</Password> <!--Optional:--> <TicketID>?</TicketID> <!--Optional:--> <DynamicFields>?</DynamicFields> <!--Optional:--> <Extended>?</Extended> <!--Optional:--> <AllArticles>?</AllArticles> <!--Optional:--> <DynamicFields>?</DynamicFields> <!--Optional:--> <ArticleSenderType>?</ArticleSenderType> <!--Optional:--> <ArticleOrder>?</ArticleOrder> <!--Optional:--> <ArticleLimit>?</ArticleLimit> <!--Optional:--> <Attachments>?</Attachments> </TicketGet>
TicketSearch operation returns a list of Ticket IDs that matches a predefined criteria.
Possible Attributes:
<TicketSearch> <!--You have a MANDATORY CHOICE of the next 3 items at this level--> <!--Optional:--> <UserLogin>?</UserLogin> <!--Optional:--> <CustomerUserLogin>?</CustomerUserLogin> <!--Optional:--> <SessionID>?</SessionID> <!--Optional:--> <Password>?</Password> <!--Optional:--> <Limit>?</Limit> <!--Zero or more repetitions:--> <TicketNumber>?</TicketNumber> <!--Zero or more repetitions:--> <Title>?</Title> <!--Zero or more repetitions:--> <Queues>?</Queues> <!--Zero or more repetitions:--> <QueueIDs>?</QueueIDs> <!--Optional:--> <UseSubQueues>?</UseSubQueues> <!--Zero or more repetitions:--> <Types>?</Types> <!--Zero or more repetitions:--> <TypeIDs>?</TypeIDs> <!--Zero or more repetitions:--> <States>?</States> <!--Zero or more repetitions:--> <StateIDs>?</StateIDs> <!--Zero or more repetitions:--> <StateType>?</StateType> <!--Zero or more repetitions:--> <StateTpeyIDs>?</StateTpeyIDs> <!--Zero or more repetitions:--> <Priorities>?</Priorities> <!--Zero or more repetitions:--> <PriorityIDs>?</PriorityIDs> <!--Zero or more repetitions:--> <Services>?</Services> <!--Zero or more repetitions:--> <ServiceIDs>?</ServiceIDs> <!--Zero or more repetitions:--> <SLA>?</SLA> <!--Zero or more repetitions:--> <SLAIDs>?</SLAIDs> <!--Zero or more repetitions:--> <Locks>?</Locks> <!--Zero or more repetitions:--> <LockIDs>?</LockIDs> <!--Zero or more repetitions:--> <OwnerIDs>?</OwnerIDs> <!--Zero or more repetitions:--> <ResponsibleIDs>?</ResponsibleIDs> <!--Zero or more repetitions:--> <WatchUserIDs>?</WatchUserIDs> <!--Zero or more repetitions:--> <CustomerID>?</CustomerID> <!--Zero or more repetitions:--> <CustomerUserLogin>?</CustomerUserLogin> <!--Zero or more repetitions:--> <CreatedUserIDs>?</CreatedUserIDs> <!--Zero or more repetitions:--> <CreatedTypes>?</CreatedTypes> <!--Zero or more repetitions:--> <CreatedTypeIDs>?</CreatedTypeIDs> <!--Zero or more repetitions:--> <CreatedPriorities>?</CreatedPriorities> <!--Zero or more repetitions:--> <CreatedPriorityIDs>?</CreatedPriorityIDs> <!--Zero or more repetitions:--> <CreatedStates>?</CreatedStates> <!--Zero or more repetitions:--> <CreatedStateIDs>?</CreatedStateIDs> <!--Zero or more repetitions:--> <CreatedQueues>?</CreatedQueues> <!--Zero or more repetitions:--> <CreatedStateIDs>?</CreatedStateIDs> <!--Zero or more repetitions:--> <DynamicFields> <!--You have a MANDATORY CHOICE of the next 6 items at this level--> <!--Optional:--> <Equals>?</Equals> <!--Optional:--> <Like>?</Like> <!--Optional:--> <GreaterThan>?</GreaterThan> <!--Optional:--> <GreaterThanEquals>?</GreaterThanEquals> <!--Optional:--> <LowerThan>?</LowerThan> <!--Optional:--> <LowerThanEquals>?</LowerThanEquals> </DynamicFields> <!--Optional:--> <Ticketflag> <!--Optional:--> <Seen>?</Seen> </Ticketflag> <!--Optional:--> <From>?</From> <!--Optional:--> <To>?</To> <!--Optional:--> <Cc>?</Cc> <!--Optional:--> <Subject>?</Subject> <!--Optional:--> <Body>?</Body> <!--Optional:--> <FullTextIndex>?</FullTextIndex> <!--Optional:--> <ContentSearch>?</ContentSearch> <!--Optional:--> <ContentSearchPrefix>?</ContentSearchPrefix> <!--Optional:--> <ContentSearchSuffix>?</ContentSearchSuffix> <!--Optional:--> <ConditionInline>?</ConditionInline> <!--Optional:--> <ArticleCreateTimeOlderMinutes>?</ArticleCreateTimeOlderMinutes> <!--Optional:--> <ArticleCreateTimeNewerMinutes>?</ArticleCreateTimeNewerMinutes> <!--Optional:--> <ArticleCreateTimeNewerDate>?</ArticleCreateTimeNewerDate> <!--Optional:--> <ArticleCreateTimeOlderDate>?</ArticleCreateTimeOlderDate> <!--Optional:--> <TicketCreateTimeOlderMinutes>?</TicketCreateTimeOlderMinutes> <!--Optional:--> <ATicketCreateTimeNewerMinutes>?</ATicketCreateTimeNewerMinutes> <!--Optional:--> <TicketCreateTimeNewerDate>?</TicketCreateTimeNewerDate> <!--Optional:--> <TicketCreateTimeOlderDate>?</TicketCreateTimeOlderDate> <!--Optional:--> <TicketChangeTimeOlderMinutes>?</TicketChangeTimeOlderMinutes> <!--Optional:--> <TicketChangeTimeNewerMinutes>?</TicketChangeTimeNewerMinutes> <!--Optional:--> <TicketChangeTimeNewerDate>?</TicketChangeTimeNewerDate> <!--Optional:--> <TicketChangeTimeOlderDate>?</TicketChangeTimeOlderDate> <!--Optional:--> <TicketCloseTimeOlderMinutes>?</TicketCloseTimeOlderMinutes> <!--Optional:--> <TicketCloseTimeNewerMinutes>?</TicketCloseTimeNewerMinutes> <!--Optional:--> <TicketCloseTimeNewerDate>?</TicketCloseTimeNewerDate> <!--Optional:--> <TicketCloseTimeOlderDate>?</TicketCloseTimeOlderDate> <!--Optional:--> <TicketPendingTimeOlderMinutes>?</TicketPendingTimeOlderMinutes> <!--Optional:--> <TicketPendingTimeNewerMinutes>?</TicketPendingTimeNewerMinutes> <!--Optional:--> <TicketPendingTimeNewerDate>?</TicketPendingTimeNewerDate> <!--Optional:--> <TicketPendingTimeOlderDate>?</TicketPendingTimeOlderDate> <!--Optional:--> <TicketEscalationTimeOlderMinutes>?</TicketEscalationTimeOlderMinutes> <!--Optional:--> <TTicketEscalationTimeNewerMinutes>?</TTicketEscalationTimeNewerMinutes> <!--Optional:--> <TicketEscalationTimeNewerDate>?</TicketEscalationTimeNewerDate> <!--Optional:--> <TicketEscalationTimeOlderDate>?</TicketEscalationTimeOlderDate> <!--Optional:--> <ArchiveFlags>?</ArchiveFlags> <!--Zero or more repetitions:--> <OrderBy>?</OrderBy> <!--Zero or more repetitions:--> <SortBy>?</SortBy> <!--Optional:--> <Permission>?</Permission> <!--Zero or more repetitions:--> <CustomerUserID>?</CustomerUserID> </TicketSearch>
The following is a basic but complete web service configuration file in YAML format to use all the Ticket Connector operations, in order to use it in OTRS you need to copy the content, save it into a file called GenericTicketConnector.yml, and import it into OTRS in the Web Services screen in the Admin panel by clicking in the "Add web service" action from the overview screen and then clicking in the "Import web service" action in the add screen.
--- Debugger: DebugThreshold: debug TestMode: 0 Description: Ticket Connector Sample FrameworkVersion: 3.1.x CVS Provider: Operation: SessionCreate: Description: Creates a Session MappingInbound: {} MappingOutbound: {} Type: Session::SessionCreate TicketCreate: Description: Creates a Ticket MappingInbound: {} MappingOutbound: {} Type: Ticket::TicketCreate TicketUpdate: Description: Updates a Ticket MappingInbound: {} MappingOutbound: {} Type: Ticket::TicketUpdate TicketGet: Description: Retrieve Ticket data MappingInbound: {} MappingOutbound: {} Type: Ticket::TicketGet TicketSearch: Description: Search for Tickets MappingInbound: {} MappingOutbound: {} Type: Ticket::TicketSearch Transport: Config: MaxLength: 100000000 NameSpace: http://www.otrs.org/TicketConnector/ Type: HTTP::SOAP RemoteSystem: '' Requester: Transport: Type: ''
The following code is a Perl script that can connect to OTRS via the generic interface, to perform the operations provided by the Ticket Connector, it uses two Perl CPAN modules SOAP::Lite and Data::Dumper, be sure that your environment is capable to use that modules before you try to run the scipt.
#!/usr/bin/perl -w # -- # otrs.SOAPRequest.pl - sample to send a SOAP request to OTRS Generic Interface Ticket Connector # Copyright (C) 2001-2012 OTRS AG, http://otrs.org/ # -- # $Id: genericinterface-connectors.xml,v 1.6 2012/02/10 16:29:43 cr Exp $ # -- # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU AFFERO General Public License as published by # the Free Software Foundation; either version 3 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # or see http://www.gnu.org/licenses/agpl.txt. # -- use strict; use warnings; # use ../ as lib location use File::Basename; use FindBin qw($RealBin); use lib dirname($RealBin); use SOAP::Lite; use Data::Dumper; # --- # Variables to be defined. # this is the URL for the web service # the format is # <HTTP_TYPE>:://<OTRS_FQDN>/nph-genericinterface.pl/Webservice/<WEB_SERVICE_NAME> # or # <HTTP_TYPE>:://<OTRS_FQDN>/nph-genericinterface.pl/WebserviceID/<WEB_SERVICE_ID> my $URL = 'http://localhost/otrs/nph-genericinterface.pl/Webservice/GenericTicketConnector'; # this name space should match the specified name space in the SOAP transport for the web service. my $NameSpace = 'http://www.otrs.org/TicketConnector/'; # this is operation to execute, it could be TicketCreate, TicketUpdate, TicketGet, TicketSearch # or SessionCreate. and they must to be defined in the web service. my $Operation = 'TicketCreate'; # this variable is used to store all the parameters to be included on a request in XML format, each # operation has a determined set of mandatory and non mandatory parameters to work correctly, please # check OTRS Admin Manual in order to get the complete list. my $XMLData = ' <UserLogin>some user login</UserLogin> <Password>some password</Password> <Ticket> <Title>some title</Title> <CustomerUser>some customer user login</CustomerUser> <Queue>some queue</Queue> <State>some state</State> <Priority>some priority</Priority> </Ticket> <Article> <Subject>some subject</Subject> <Body>some body</Body> <ContentType>text/plain; charset=utf8</ContentType> </Article> '; # --- # create a SOAP::Lite data structure from the provided XML data structure. my $SOAPData = SOAP::Data ->type( 'xml' => $XMLData ); my $SOAPObject = SOAP::Lite ->uri($NameSpace) ->proxy($URL) ->$Operation($SOAPData); # check for a fault in the soap code. if ( $SOAPObject->fault ) { print $SOAPObject->faultcode, " ", $SOAPObject->faultstring, "\n"; } # otherwise print the results. else { # get the XML response part from the SOAP message. my $XMLResponse = $SOAPObject->context()->transport()->proxy()->http_response()->content(); # deserialize response (convert it into a perl structure). my $Deserialized = eval { SOAP::Deserializer->deserialize($XMLResponse); }; # remove all the headers and other not needed parts of the SOAP message. my $Body = $Deserialized->body(); # just output relevant data and no the operation name key (like TicketCreateResponse). for my $ResponseKey ( keys %{$Body} ) { print Dumper( $Body->{$ResponseKey} ); } }