Technical Insights Archive | OTRS Thu, 24 Apr 2025 14:14:39 +0000 en-GB hourly 1 https://otrs.com/wp-content/uploads/2018/03/cropped-OTRS-LOGO-without-tagline-32x32.png Technical Insights Archive | OTRS 32 32 OTRS Translations Are Moving https://otrs.com/blog/technical-insights/otrs-translations-are-moving/ https://otrs.com/blog/technical-insights/otrs-translations-are-moving/#respond Wed, 12 Feb 2020 08:23:08 +0000 https://blog.otrs.com/?p=3641 After working with Transifex for several years, OTRS translations have moved to a new application: weblate. It is a free, self-hosted open source application that gives us more possibilities and makes the life of translators even easier.

Please find the new translation application at translate.otrs.com. If you want, you can register for an account for free and help translate OTRS into your language.

OTRS 8 Language Selection

]]>
https://otrs.com/blog/technical-insights/otrs-translations-are-moving/feed/ 0
10 Steps to Process Design Preparation for OTRS Process Management. https://otrs.com/blog/technical-insights/10-steps-to-process-design-preparation-for-otrs-process-management-2/ https://otrs.com/blog/technical-insights/10-steps-to-process-design-preparation-for-otrs-process-management-2/#respond Thu, 16 Jan 2020 09:04:37 +0000 https://blog.otrs.com/?p=3609 In life, preparation is everything. When preparing to automate (orchestrate) tasks in OTRS, the main work is not in programming the process module to do what you desire, but it is in the preparation. With good preparation, designing processes to use with OTRS is a breeze. Here are the 10 Steps to Process Design Preparation for OTRS Process Management.

Let’s take a Service Desk Incident Process as an example.

  1. Identify activities of the process.
    These should not be TASKS like “Set queue to 2nd Level,” but should be Create Record, Categorize Incident, Prioritize Incident, Analyze Symptom, …
  2. Identify data collected by the process.
    Request Type (Tickets)
    Service Level Agreement (Time to work on ticket)
    Service Level (Criticality)
  3. Identify the workflow of activities.
    What is done first, second, third?
  4. Identify useful dialogs for each activity to help collect or record the data.
  5. Identify triggers for optional and immediate advancement to the next activity (i.e Escalate to 2nd Level).
  6. Determine which data should be saved as process data for use in templates (i.e. Handover texts).
    Description
    Initial analysis
    Suggested workaround
    Workaround results
    Confirmation that the knowledge base was consulted
    Verification of the system version
    Attached log files
  7. Identify escalation paths (i.e. Escalate to 2nd tier after workaround failure).
    Do we have multiple escalation paths?
  8. Set workflow requirements.
    Consult Level 2 or other departments where escalation is possible to gather their requirements.
  9. Identify loop-back possibilities.
    Under which circumstances can requests boomerang and why?
  10. Draw the process ( i.e. with a tool like https://bpmn.io).
]]>
https://otrs.com/blog/technical-insights/10-steps-to-process-design-preparation-for-otrs-process-management-2/feed/ 0
Customer User Self-Administration https://otrs.com/blog/technical-insights/customer-user-self-administration/ https://otrs.com/blog/technical-insights/customer-user-self-administration/#respond Tue, 26 Nov 2019 10:24:59 +0000 https://blog.otrs.com/?p=3554 In past articles we’ve talked about process management and web services. Combining these two can make for interesting new features, without the need for new development. For example, OTRS doesn’t offer a solution to let customers administer their own customer users by default. Combining process management with web services, however, can allow you to add such a feature to your installation.

Just gimme the core message.

Using OTRS and the OTRS feature add-on ticket invoker, you can create a user-driven RPC-backed process to allow customer users to create and register their own customer users.

 

Process Map

 

 

Above you see a process which allows the customer user to enter customer user details (dynamic fields). The process will then trigger the Generic::RPC (see Remote Administration per REST.) To call the Kernel::System::CustomerUser::CustomerUserAdd and create the customer.

If any error occurs, the ticket will be closed and the process will end. If not, the process ticket is closed successfully.

When a customer user leaves the company, the customer user administrator can easily find the closed tickets and remove the user by using the customer user maintenance activity. The customer user is then marked for removal and Kernel::System::CustomerUser::CustomerUserUpdate will set the user to invalid.

The web service setup is trivial and requires some mapping.

Web Service Details

Elements to be mapped for use with the Generic::RPC as follows:
        Source         => Hard Coded
        ID             => Mapped from DynamicField_UserLogin
        UserFirstname  => Mapped from DynamicField_UserFirstname
        UserLastname   => Mapped from DynamicField_UserLastname
        UserCustomerID => Mapped from current customer
        UserLogin      => Mapped from DynamicField_UserLogin
        UserEmail      => Mapped from DynamicField_UserEmail
        ValidID        => Mapped from DynamicField_ValidState
        UserID         => Mapped from current user
Mapping
Outgoing data from the Ticket to the Generic::RPC operation will be mapped and return data for error handling.
Outbound Mapping AddUser
<?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="utf-8" indent="yes" /> <!-- Don't return unmatched tags --> <xsl:template match="text()"/> <!-- Root template -->
    <xsl:template match="/">
        <RootElement>
            <UserLogin>wsusr</UserLogin>
            <Password>wsusr</Password>
            <Object>Kernel::System::CustomerUser</Object>
            <Method>CustomerUserAdd</Method>
            <Parameter>
                <Source>CustomerUser</Source>
                <UserLogin><xsl:value-of select="//Ticket/DynamicField[Name = 'UserLogin']/Value"/></UserLogin>
                <UserFirstname><xsl:value-of select="//Ticket/DynamicField[Name = 'UserFirstname']/Value"/></UserFirstname>
                <UserLastname><xsl:value-of select="//Ticket/DynamicField[Name = 'UserLastname']/Value"/></UserLastname>
                <UserEmail><xsl:value-of select="//Ticket/DynamicField[Name = 'UserEmail']/Value"/></UserEmail>
                <UserCustomerID><xsl:value-of select="//Ticket/CustomerID"/></UserCustomerID>
                <ValidID><xsl:value-of select="//Ticket/DynamicField[Name = 'ValidState']/Value"/></ValidID>
                <UserID>1</UserID>
            </Parameter>
        </RootElement>
    </xsl:template>
</xsl:transform>
Inbound Mapping AddUser (error handling)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="yes" />
    <xsl:template match="/RootElement">
        <xsl:choose>
            <xsl:when test="not(Result)">
                <RootElement>
                    <Ticket>
                        <DynamicField>
                            <Name>ReqestResponse</Name>
                            <Value>UnknwonError</Value>
                        </DynamicField>
                        <State>closed unsuccessful</State>
                    </Ticket>
                </RootElement>
            </xsl:when>
            <xsl:otherwise>
                <RootElement>
                    <Ticket>
                        <DynamicField>
                            <Name>ReqestResponse</Name>
                            <Value>UserAdded</Value>
                        </DynamicField>
                    </Ticket>
                </RootElement>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:transform>
Problems and Considerations
  1. A customer user will never know why a user couldn’t be created. Any error should be reported to the OTRS admin. Generally, it’s related to a duplicate UserLogin. It could also be a bad or duplicate UserEmail.
  2. Any customer can create a user for his company.
Workarounds
  1. To help customer users understand what’s happening, a status can be added, the ticket closed, and a note to “contact the admin of the system for more details” can be created.
  2. Use the ACL to limit the process to a specific user or users.
  3. Company tickets can be limited to only specific users.
Dynamic Fields Needed for Mapping

Name:  UserLastname
Label:  User Last Name
Type:   Text
Object: Ticket

Name:   UserFirstname
Label:    User First Name
Type:    Text
Object: Ticket

Name:   UserLogin
Label:   User Login
Type:    Text
Object: Ticket

Name:   UserEmail
Label:    User Email
Type:     Text
Object:  Ticket

Name:   ValidState
Label:    User Valid
Type:     Dropdown
Object:  Ticket

Name:   ReqestResponse
Label:    Request Response
Type:     Text
Object:  Ticket

 

Need assistance? Contact sales@otrs.com.

Summary (TL/DR)

Some missing features can be built using a loopback request to OTRS’ internal Perl API. Using processes to control these gives you even more power.

]]>
https://otrs.com/blog/technical-insights/customer-user-self-administration/feed/ 0
Security by Design in OTRS 8 https://otrs.com/blog/technical-insights/security-by-design-in-otrs-8/ https://otrs.com/blog/technical-insights/security-by-design-in-otrs-8/#respond Wed, 25 Sep 2019 11:48:30 +0000 https://blog.otrs.com/?p=3448 This blog article explores six significant improvements in the software security of OTRS 8 over previous versions. We’ll look at how they affect developers, administrators and users.

The principle Security by Design affects different aspects of the OTRS software. It:

  • Secures software architecture,
  • Aids developers in writing secure code,
  • Encourages users to work with their system in a responsible way, and
  • Support administrators in configuring their system securely.

In the following, we’ll look at six examples of Security by Design in OTRS 8. After looking at some technical details, we’ll analyze who can benefit from each in which way.

Content Security Policy

Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross Site Scripting (XSS) and data injection attacks. These attacks are used for everything from data theft to site defacement to distribution of malware.

You can think of this as putting the browser in a sandbox mode by instructing it what should be allowed for the current application and what should be prohibited, for example executing code or loading external resources.

With OTRS 8, Content Security Policy headers are set for the OTRS frontend application, restricting access to the current server only. All resources are restricted as much as possible. Examples:

  1. JavaScript can only be loaded from the server folder where the app is statically deployed. Other scripts are discarded. This is a major improvement over ((OTRS)) Community Edition 6 in which inline scripts had to be allowed for technical reasons.
  2. External images cannot be loaded within the application. If a user or attacker tries to inject external resources, the browser will refuse that request and log such an error:

How does this affect:

  • Users: they can trust in the cooperation of OTRS and the browser to achieve a high level of built-in application security and protection against common attacks.
  • Administrators: the restrictive default setting requires additional configuration if external content does need to be integrated into the application.
  • Developers: they don’t have to care – this is implicitly used in all API endpoints.

JSON Web Tokens

JSON Web Tokens are an open, industry-standard RFC 7519 method for representing claims securely between two parties. In OTRS 8, JSON Web Tokens are used for cryptographically secured, client-side storage of authentication information. Key benefits over the previously used cookies are:

  • The tokens are not visible to the user (for example, via the URL).
  • They are not automatically sent by the browser.
  • Their built-in cryptographic signature prevents user manipulation of the token.
  • The tokens can be analyzed and revoked on the server.
  • As before, tokens are limited to remote IP address by default (configurable).

How does this affect:

  • Users & Administrators: the system continues to work in a most convenient but more secure way.
  • Developers: requiring a valid token is as easy as:
with qw(
    Kernel::WebApp::Controller::API::Role::RequiresAgentAuthentication
);

Restricted Cookie Usage

The bad news about authentication information storage and transfer is that some endpoints still require cookies. ? For example, loading inline images and loading an iFrame still rely on browser built-in mechanisms of transferring the authentication data.

To mitigate the possible negative consequences of cookie usage, the following changes were made:

  • Cookies contain the same JSON web token content and are therefore also cryptographically protected.
  • Cookies are now restricted as much as possible to guard against CSRF:
    • Their httpOnly attribute is set, so they cannot be (easily) accessed by JavaScript.
    • Cookies are only accepted by a few endpoints that really need it: Most endpoints don’t accept them.

Deep Input Validation

Input validation is an important topic for application security. You want to make sure that data coming from the outside world to the application conforms to what is expected. In a security context, a part of this is to make sure that the data does not contain any hidden attacks like SQL Injection, Cross Site Scripting and so on.

OTRS 8 contains a new API for deep input data validation which is very easy to use:

  • There is currently a growing list of 38 built-in data validation modules.
  • They range from simple (e. g. “positive integer”) to complex like “valid ticket number that exists in the database” or “valid JSON document.”
  • API Endpoints just need to specify what data they expect, validation happens automatically. As an example, the following snippet shows how an endpoint declares that it receives one mandatory parameter via URL, which is expected and validated to be a TicketID that exists in the database. No further code is needed, the validation happens automatically in the background:
sub ValidationUriParameters {
    return {
        Fields => {
            TicketID => [ 'Required', 'Ticket::TicketID' ],
        },
   };
}

How does this affect:

  • Developers: validating input data is fun, after all!

Extended Password Policies

OTRS 8 has much more effective password policies than before:

  1. Password complexity rules can be established, like in previous versions. We leave the more philosophical question »What makes a good password« to the admin to decide and configure in their system.
  2. Passwords now expire automatically after 30 days by default.
  3. Users are prevented from re-using their previous passwords.
  4. After the first login, users have to choose a new password.

Of course, all of these are configurable – including exceptions for certain users or groups.

How does this affect:

  • Users: This might make life of OTRS agent users a bit harder, but hopefully it helps them handle their credentials in a responsible way.
  • Admins: The restrictive default configuration helps admins to operate their system in a secure way, while offering full flexibility to adapt.

2 Factor Authentication

OTRS 8 now has modern real-life 2 Factor Authentication support made possible with three different Authentication Methods:

  • Apps – use your favorite app like Google Authenticator. Configuration is easy via QR code.
  • SMS – provided via SMS cloud service from OTRS Group.
  • Email – can be used as a fallback transport, since usually all agents have valid email addresses. Supports encryption.

In a new OTRS 8 system, 2 Factor Authentication is required by default. Of course, it can be made optional for all or selected users, or it can be turned off altogether. It can be used even in Single-Sign-On scenarios where agents use a central login service – then they still have to provide a token for the login to OTRS.

How does this affect:

  • Users: logging into the system becomes a little more effort.
  • Admins: The restrictive default configuration helps admins to operate their system in a secure way, while offering full flexibility to adapt.

Conclusion

Security by Design in OTRS 8 means:

  • Making the system more secure by way of design and architecture.
  • Aiding developers in writing secure code with little effort.
  • Encouraging users to work in a responsible way.
  • Supporting inexperienced admins in the secure operation of OTRS by way of restrictive default configuration while offering much flexibility to adapt.
]]>
https://otrs.com/blog/technical-insights/security-by-design-in-otrs-8/feed/ 0
Modular Process Building in OTRS. https://otrs.com/blog/technical-insights/modular-process-building-in-otrs/ https://otrs.com/blog/technical-insights/modular-process-building-in-otrs/#respond Wed, 18 Sep 2019 12:32:01 +0000 https://blog.otrs.com/?p=3436

BPMN 2.0 differentiates between an embedded subprocess and a call activity. From a conceptual point of view, both will initiate a subprocess when process execution arrives at the activity.

The difference is that the call activity references a process that is external to the process definition, whereas the subprocess is embedded within the original process definition. The main use case for a call activity is to have a reusable process definition that can be called from multiple other process definitions.

Although OTRS does not have a subprocess modeling capability as of OTRS 7 (or with upcoming OTRS 8), I will show you how to make a process modular.

Just gimme the core message.

In the above process, the “Approval” subprocess could be very detailed, and it could make designing an already detailed process more time consuming.

Approval process.

Subprocesses, like approvals, are often standardized processes that are needed in many areas of business from vacation requests, to hardware orders, to on-boarding tasks. Below we can see how the using a modular process called by a script task activity above can greatly increase readability in an already detailed process.

Hardware Order

To standardize this and make the subprocess of approval reusable, BPMN 2.0 defines a call activity. Because OTRS itself doesn’t have subprocesses or call activities, we will make use of the “magic” which makes a process ticket a process ticket — dynamic fields.

A process is identified by the ProcessID and the ActivityID. Without these, it’s YAT (yet another ticket). In order to spring from one process to another, just quickly rewrite the information via a script task activity and then you’re off to the call activity (or YAP – yet another process).

Script task activity: leaving a process for a call activity.

You will have to remember the old ProcessID and ActivityID by saving them to dynamic fields. Additionally, you should jump back into a dummy activity to prevent a loopback situation. Therefore you will need to know the next ActivityID before you leave your process for the modular process.

You may have as many activities in your modular process as needed, and then return by simply using the saved ProcessID and next ActivityID to return.

Script Task Activity: return from modular process

Note: Don’t forget to remember your decision. This will be automatically processed by the sequence action flow upon returning to your calling process.

All data saved during the process Hardware Order can be used in the Approval process, and all data saved in the Approval process can be used when returning to the Hardware Order process. This is the joy of saving the data to the ticket (also known as a business object record).

This works in a serialized fashion, meaning it’s not a parallel process. The approval process must be finished before continuing, which I guess is kinda the real-world situation anyhow.

ProTip: Set the Approval process to fadeaway so that it’s not callable and you don’t have to filter it per ACL. A fadeaway process will continue to work, but is not callable in the front end.

Summary (TL/DR)
Organizing your processes and making them more readable is easy when you use a script activity and dynamic field to move between processes. This especially makes sense when you have a reusable part of a process (a.k.a. a call activity).

((enjoy))

Best Wishes,

///shawn

“Instant gratification takes too long.”,

 

]]>
https://otrs.com/blog/technical-insights/modular-process-building-in-otrs/feed/ 0
Remote Administration per REST. https://otrs.com/blog/technical-insights/remote-administration-per-rest/ https://otrs.com/blog/technical-insights/remote-administration-per-rest/#respond Fri, 06 Sep 2019 10:18:10 +0000 https://blog.otrs.com/?p=3405

OTRS has offered an external API since OTRS 7. This API, however, does not cover administrator actions. Many users may remember, in older versions, there was an RPC interface via the rpc.pl script. This has gone away. Fortunately, one little known fact is that the RPC feature is still available via the Generic Interface.

This allows admins to remotely administer their OTRS via a REST or SOAP call, among other methods.

Just gimme the core message.

In order to have access to the power of the perl API, you need to configure OTRS to allow access to this controller — Generic::RPC

WARNING: This is a security threat if you don’t know what you are doing.

Activate Controller

Search for Generic::RPC in the system configuration.

Set this to active and deploy.

Activate Object

Determine which object is to be used and activate it in the system configuration.

Search for GenericInterface::Operation::Generic::RPC::Modules###001-Default


Modify, if needed, by adding the system module to be used, save and deploy.

Note: In this case, we want to add or invalidate a group, so we do not need to add a new object.

Adding a Group via the Generic Interface Using the Generic::RPC Controller

In order to accomplish this, you need the documentation for the controller (Kernel::GenericInterface::Operation::Generic::RPC) and the operation (Kernel::System::Group) you want to control.

You need to configure a new web service. (Read how on-line: Web Services) For our example, we will use REST for our transport.

 

As you can see, we need:

  • a provider operation using the controller Generic::RPC
  • a defined route in the transport settings
  • a tool to make the request (see Postman).

In our documentation of the controller,  we read that you need the following (as of OTRS 7).

my $Result = $OperationObject->Run(
    Data => {
        UserLogin         => 'some agent login',     # (required) 
        CustomerUserLogin => 'some customer login',  #
        SessionID         => 123,                    #
        Password          => 'some password',        # required with UserLogin or CustomerUserLogin.
        Object            => 'Ticket',               # (required)
        Method            => 'TicketGet',            # (required)
        Parameter         => { TicketID => 123, },   # (optional)
    },
);

The “Object” is always the system module to be used. The “Method” is the function to be called. We will use GroupAdd() from Kernel::System::Group

This is our example request.

The result is that a group named web-service is added (see title picture above) with the comment “added via webservice.” This group is immediately ready for use by OTRS.

Summary (TL/DR)

It is possible to access core functions of OTRS using the Generic::RPC. This will require a deeper understanding of how OTRS works and its data model, but it’s possible. Using this as a loopback web service can help administrators implement features which are not currently available.

Have more interest? Contact sales@otrs.com for a web service design workshop or administrator training.

]]>
https://otrs.com/blog/technical-insights/remote-administration-per-rest/feed/ 0
Mail (Request) Forwarding à la Post Office https://otrs.com/blog/technical-insights/mail-requset-forwarding-a-la-post-office/ https://otrs.com/blog/technical-insights/mail-requset-forwarding-a-la-post-office/#respond Fri, 28 Jun 2019 14:41:01 +0000 https://blog.otrs.com/?p=3339 Sometimes spring cleaning just isn’t enough. You’ve changed the wallpaper and painted the fence, but it’s just not doing it. It’s time to move, which is a happy-sad event and not always easy.

Like moving homes, moving from one version of software to another may lead to questions like:

  • Should we make a clean cut from the old OTRS installation and start a new?
  • Is it time to create new queue and services?
  • Do we need new users, groups, roles, etc.?

What about the old tickets? How will we deal with them?

Before you let the task of leaving the old behind and moving to new horizons overwhelm you, read further…….

The biggest issue you face after deciding to start a fresh with OTRS is: How do we handle requests which are still open? How do we redirect our mail without loosing contact with the requests which were part of the old system and still need answering?

You surely do not want to work out of two different systems. Also, changing email addresses after all those years of having your customers write to you at the current address may not be desirable.

So, how do you have your cake and eat it too?

The postal service of most countries offers mail forwarding. This means that after a move, your current address will forward mail to your new address. Similarly, with OTRS, we will arrange for something similar. Your new instance of OTRS should allow the customer to use old ticket numbers while continuing to provide agents access to the previous conversation thread.

OTRS makes this happen by this using the feature External Ticket Number Recognition.

To use this, one thing we need to understand is the ticket number structure. Each OTRS is individual. You can:

  • define the type of ticket number to be used (NumberGenerator),
  • make it unique (SystemID),
  • define the identifier for the ticket number (Hook),
  • and make it a bit more readable (HookDivider – not depicted below).

These properties allow OTRS to identify if this is a ticket number or just some random collection of identifiers in the subject (or body) of a message.

A ticket number.
Ticket Number Disection

 

If the Hook, HookDivider, or Number do not match, then it’s not a valid ticket number. If all of these things match, then the SystemID comes into play. This is the number we will latch on to in a moment. A post office forwards its mail to the new address based on the registered last address: Our registered last address is the old SystemID.

This is where the example of the post office starts to crumble in relation to what we are trying to achieve, so let’s leave this analogy for now.

When your new system is up and running, it’s crucial that a new SystemID be chosen. Now, all of your new emails are being polled by the new system. Since the new SystemID is not found in the ticket number (as the number itself is not registered) new tickets end up being created for old requests, and you also end up having no idea what the old tickets have for content. In comes External Ticket Number Recognition and Dynamic Fields.

By configuring External Ticket Number Recognition, you can process all new emails to look for the old pattern. The key here is the SystemID, as this is the same in all tickets. When this pattern is found, OTRS saves the ticket number in a dynamic field (done automatically by OTRS for tickets not already containing an external ticket number). The dynamic field is configured to link to your old (archive) system, so that the conversation is not lost. Agents can read things from the past in the old system, but they will answer from your new system.

At this point, the new ticket number is connected via the dynamic field to the old ticket number. Your customer users can then respond to the new request using the old ticket number or the new ticket number. Eventually, all the old requests will be closed in the new system.

The only requirement you have is to keep the old system alive so that your agents can quickly reference any past conversations via the hyperlinked dynamic field.  In the example below you will see that the number is parsed from the incoming subject matched to the field OTRS4ID, and the conversation is placed in the new ticket with this matching number keeping old tickets and new tickets together.

This use case is also applicable when moving part of your teams to a separate OTRS instance to keep systems more manageable.

Need more information or want help leaving your older ((OTRS)) Community Edition for a bright new shiny OTRS, shoot us a message at sales@otrs.com.

Thanks for reading!

((enjoy))

Your Truly,

///shawn

“The great pleasure in life is doing what people say you cannot do.”,

]]>
https://otrs.com/blog/technical-insights/mail-requset-forwarding-a-la-post-office/feed/ 0
Running OTRS on FreeBSD https://otrs.com/blog/technical-insights/running-otrs-on-freebsd/ https://otrs.com/blog/technical-insights/running-otrs-on-freebsd/#respond Tue, 21 May 2019 13:29:46 +0000 https://blog.otrs.com/?p=3297 FreeBSD is an open source UNIX®-like operating system that runs on several platforms. It is available free-of-charge to companies around the world under the standard BSD license. This means that companies have the option of distributing work that they’ve created based on FreeBSD without including the source code, if they chose to.

While “free” is certainly a compelling reason for technology professionals to leverage FreeBSD, there are even greater technological advantages to its use. The OS includes mature base code that has been consistently enhanced for more than 20 years by its extensive community. FreeBSD focusses on features, speed, and stability: It performs smoothly under heavy loads and efficiently manages memory; employs modern security features, like firewalls and jails; incorporates all modern networking protocols; and is relatively easy to administer.

Given its cost (or lack of) as well as its focus on stability and security, FreeBSD has become widely used by technology professionals in a wide variety of disciplines. It can handle nearly any task, from servers and desktops to embedded and appliance applications, without any perceivable degradation of speed. Because of its wide-spread use, it is important for OTRS 7 to run smoothly on FreeBSD.

The following outlines how to install OTRS 7 on FreeBSD. Additional details can be found in the official OTRS installation manual on doc.otrs.org.

OTRS 7 Installation on FreeBSD

For this installation, we use Apache2 and MySQL. At a minimum, you will need a FreeBSD installation with a working network connection. We use ports and do not compile on our own; we use pkg to keep things simple.

Step 1: Start with the Ports

Logon with your root account, fetch the portsnap,
root@freebsd:/ # portsnap fetch && portsnap extract

and compile pkg.
root@freebsd:/ # cd /usr/ports/ports-mgmt/pkg/ && make install clean

If needed, convert it into:
root@freebsd:/ # pkg2ng

Now you can create a user in the group wheel.
root@freebsd:/ # adduser
root@freebsd:/ # pw groupmod wheel -m

Then create the /opt/ directory,
root@freebsd:/ # mkdir /opt

and fetch the latest ports.
root@freebsd:/ # portsnap fetch update

Step 2: Install Apache2

Now you have to install Apache2.
root@freebsd:/ # pkg install apache24

To run Apache HTTP Server from startup, add apache24_enable=”yes” in your /etc/rc.conf. This can be done manually or with sysrc apache2_enable=yes.

Start the webserver to begin the test.
root@freebsd:/ # service apache24 start

Step 3: Install the MySQL Database

If steps one and two are working, you can install the database next. In this case, we are using MySQL.
root@freebsd:/ # pkg install mysql57-server

To run MySQL from startup, add mysql_enable=”yes” in your /etc/rc.conf. This can be done manually or with sysrc mysql_enable=yes

Step 4: Install the Packages

The Perl packages are tricky, but they can easily found with
pkg search | grep p5

Via command, you can install the packages you need.
root@freebsd:/ # pkg install ap24-mod_perl2 p5-CryptX p5-Archive-Zip p5-Digest-Bcrypt p5-Crypt-SSLeay p5-DateTime p5-DBD-mysql p5-EV p5-JSON p5-JSON-XS p5-Moose p5-DBD-LDAP p5-Net-DNS p5-Template p5-Search-Elasticsearch p5-YAML p5-YAML-LibYAML p5-libxml p5-XML-LibXML p5-XML-XSLT p5-XML-LibXSLT p5-Text-CSV_XS p5-Template-Toolkit

If you miss modules, you can install them via cpan.
root@freebsd:/ # cpan Date::Format

Depending on the installation, if the Perl path is not recognized, then a symbolic link may be helpful.
root@freebsd:/usr/bin # ln -s /usr/local/bin/perl perl

Step 5: Adding OTRS Configurations

Now create an OTRS user.
root@freebsd:/ # adduser otrs

And activate Apache modules in
/usr/local/etc/apache24/modules.d/260_mod_perl.conf

Then enable the mod_perl
LoadModule perl_module       libexec/apache24/mod_perl.so

in
/usr/local/etc/apache24/httpd.conf

And enable the proxy modules
LoadModule proxy_module libexec/apache24/mod_proxy.so
LoadModule proxy_http_module libexec/apache24/mod_proxy_http.so
LoadModule proxy_wstunnel_module libexec/apache24/mod_proxy_wstunnel.so

Now configure the Apache conf file
root@freebsd1:/usr/local/etc/apache24/extra:/# ln -s /opt/otrs/scripts/apache2-httpd.include.conf ./zzz_otrs.conf

and include the file in /usr/local/etc/apache24/httpd.conf

Include etc/apache24/extra/zzz_otrs.conf

Then, try to start Apache with the new configuration
root@freebsd:# apachectl restart

Note: be sure to test your current setup. If you browse to your /otrs/index.pl, then an error will occur, but the error is fine at this point.
The error message:
“Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.”

At this point, it is OK to continue with your installation steps and set file permissions
root@freebsd:# perl /opt/otrs/bin/otrs.SetPermissions.pl –admin-group=wheel

Now install Elasticsearch
root@freebsd: # pkg install elasticsearch6 p5-Search-Elasticsearch
root@freebsd: # /usr/local/lib/elasticsearch/bin/elasticsearch-plugin install –batch ingest-attachment
root@freebsd: # /usr/local/lib/elasticsearch/bin/elasticsearch-plugin install –batch analysis-icu

And enable Elasticsearch in /etc/rc.conf.
elasticsearch_enable=”YES”

Then start the service.
root@freebsd: # service elasticsearch start

Wait several seconds and then test the connection.
[otrs@freebsd ~]$ /opt/otrs/bin/otrs.Console.pl Maint::DocumentSearch::Check

The connection should be successful and the following message should appear:

Getting cluster information…
+———+————————+
| Cluster | elasticsearch |
| UUID | Px2wtqcyRlumLrXKpchvzA |
| Status | Green |
+———+————————+

Getting nodes information…

+———————–+————————+
| Node | eZRpjTv |
| UUID | eZRpjTvDSxGbx3LvFnSzrg |
| Master | Yes |
| Elasticsearch version | 6.4.2 |
| JVM version | 1.8.0_192 |
| Required Plug-ins: | |
| analysis-icu | Installed |
| ingest-attachment | Installed |
| Status | On-line |
+———————–+————————+

The database is set up identically to all other Linux distributions. If you need additional help with the database setup, visit:
https://doc.otrs.com/doc/manual/installation/stable/en/content/installation.html#mysql-or-mariadb

Step 6: Finishing Up

Finally, install Python and NPM. Update the NPM.
root@freebsd: # pkg install openjdk
root@freebsd: #npm install -g npm@latest

When you have finished, restart the webserver. As a final step, check the Support Data Collector:
Running FreeBSD is appealing, affordable and accessible for all, and it certainly won’t get in your way of using OTRS. The six steps above offer a high-level overview of how to run OTRS on FreeBSD, but if you have any difficult or are interested in more detailed instructions, review the official OTRS installation documentation at:

https://doc.otrs.com/doc/manual/installation/stable/en/content/installation.html#step-9-start-the-otrs-daemon-and-web-server.

otrs 7 freeBSD all green

]]>
https://otrs.com/blog/technical-insights/running-otrs-on-freebsd/feed/ 0
Web Service vs. API https://otrs.com/blog/technical-insights/webservice-vs-api/ https://otrs.com/blog/technical-insights/webservice-vs-api/#respond Tue, 07 May 2019 12:27:19 +0000 https://blog.otrs.com/?p=3275

OTRS, as a glue-ware, offers you the flexibility to maintain service-relevant information anywhere. Retrieval of the information, and providing service request-related data to third parties, is simple. A web service, known as the Generic Interface, has been the answer to this since its introduction in OTRS 3.1. The web service provides access via HTTP by means of SOAP or REST to the internal OTRS API. The OTRS API is written in Perl, and by using the web service operations, standardized communication is possible. It’s not necessary to understand how the Perl API works in order to use internal functions of OTRS: Instead, operations are provided which can be made available to external systems or used to request information from these systems.

Learn how our new REST API can make simple integrations faster than ever.

(more…)]]>
https://otrs.com/blog/technical-insights/webservice-vs-api/feed/ 0
You can delegate authority but not accountability. https://otrs.com/blog/technical-insights/you-can-delegate-authority-but-not-accountability/ https://otrs.com/blog/technical-insights/you-can-delegate-authority-but-not-accountability/#respond Mon, 08 Apr 2019 08:40:11 +0000 https://blog.otrs.com/?p=3246

Rowing is a good sport which shows the relationship between accountability and responsibility. The coxswain (or simply the cox) is the team member who sits in the boat facing the bow, steering the boat, and coordinating the power and rhythm of the rowers. This member is accountable for the speed and direction of the boat, and making sure that it reaches its goal safly and quickly.

Like the coxswain, leaders take on more responsibility for customers today than ever before due to the growing complexity of services and the technical demands of customers. As companies are streamlined, responsibilities grow; this requires delegating of tasks to make sure the services sold are actually delivered. OTRS challenges your service desk leaders to be accountable and provides them the tools to do so.

Your team is, in many cases, globally active. You may have a smaller team led by a single indivdual or a larger team led by multiple individuals: in both cases, the leader is responsible for said team. The act of delegating gives authority to the team to provide service to the customer. This can range from sharing knowledge and resources to specialized authority, like discounting or performing out-of-the-ordinary service to make the customer happy and solve an issue. These leaders are, however, still accountable for the success or failure of the team with respect to providing the service promised to the customer.

This is where the OTRS Feature Add-on known as Queue Responsible can help. In its uncustomized state, OTRS can assign ownership of tickets to agents. This is the delegation of authority from a leader to a team member, but by transferring the ticket in this way, it does not address the need for leaders to remain ultimately responsible. Similary, OTRS uses Queues to help direct the work to the best, or most appropriate, team to deal with the customer request. While the routing helps facilitate the delegation of authority, this also doesn’t tell us who is accountable for the work.

Using the OTRS Feature Add-on Queue Responsible, it is now possible to make leaders accountable for their team by automatically assigning them as the person responsible for tickets within queues for which they are responsible.

Requirements:
OTRS or OTRS On-Premise

As a user of OTRS, you may install the Feature Add-on Queue Responsible, whereby all tickets created or moved into a queue will automatically designate a defined agent, presumably the team leader, as responsible.

An added benefit is that reports can then be used to better aid decision making based on ticket states, types, services, escalations and now the responsible party.

The responsible manager can always have his or her eye on things by using the responsible view, and can react appropriately without having to do the task themselves or asking for status updates on tickets.

This is a truly useful tool for management to keep on top of the status of service delivery. So, if you’re currently running OTRS or OTRS On-Premise, take a look at this Feature Add-On and talk to your service team if you need help with configuration.

NOTE: Currently using ((OTRS)) Community Edition – our open source and free software? Contact sales@otrs.com to discuss upgrading: you’ll get access to support and many additional Feature Add-Ons like Queue Responsible.

]]>
https://otrs.com/blog/technical-insights/you-can-delegate-authority-but-not-accountability/feed/ 0
Conform to international standards; use OTRS for Process Management https://otrs.com/blog/technical-insights/conform-to-international-standards-use-otrs-for-process-management/ https://otrs.com/blog/technical-insights/conform-to-international-standards-use-otrs-for-process-management/#respond Mon, 04 Feb 2019 07:30:12 +0000 https://blog.otrs.com/?p=3178 The Back Story

Business Process Model and Notation, BPMN for short, allows you to visualize the process model. A process model, written in BPMN, is an XML file at its heart. This XML format is well defined and maintained by the Object Management Group. This XML is deigned for portability, to be executable, and is currently the leading industry standard format (ISO/IEC 19510:2013). Business Process Management Suites (BPMS) and other tools use this to exchange processes. This means that most of these tools can read and or generate BPMN. Read how OTRS is leveraging this standard.

When designing a process, it should be clear to business users what is happening. This means the tasks involved and the performers are graphically represented. BPMN 2.0 has an entire library of standardized visual elements and terminology which OTRS leverages now to better conform to this standard.

BPMN describes the following two objects (narrowing it down a bit ;)) which OTRS is has adopted.

Task Objects: User, Script, Service (others not currently addressed)
Sequence Flow

In ((OTRS)) Community Edition, you have the possibility to configure:

Activities
Activity Dialogs
Transitions
Transition Actions

Automation of the workflow takes place in the transition and transition actions.

In OTRS, we now talk about

Task Activities
User Task Activity Dialogs
Sequence Flows
Sequence Flow Actions

So far no big change. We see now that OTRS uses the standard names for two elements vs. re-inventing the wheel. This makes it easier for your business team to talk with the OTRS administrators and makes integration tasks much easier. The real magic comes when we create a Task.

A Task in ((OTRS)) Community Edition is always a User Task.

A Task in OTRS can be a User, Script, or Service Task.

This means, that you can now visualize all of the elements of automation within the process manager canvas. Based on the user input of any Task, the Sequence Flow will determine the next Task. Changes in ticket data done via a Script Task (or specially programmed functions like Sending an Email), or calls to foreign systems via a Service Task, are not only presented to the process designer for ease and speed of design and troubleshooting, but notification of such tasks are now seen by agents when the system is performing them, or during errors.

Task Wokring


Taks Failed

A fully visual process, only with OTRS.

We still have some tool specifics which we will be adapting to support the standard better in the future, but for now: Service Desk Management Automation has never been easier and more compliant that with OTRS.

 

 

]]>
https://otrs.com/blog/technical-insights/conform-to-international-standards-use-otrs-for-process-management/feed/ 0
Bugzilla Connector: Empower Your Service Center. https://otrs.com/blog/technical-insights/bugzilla-software-category-management/ https://otrs.com/blog/technical-insights/bugzilla-software-category-management/#respond Tue, 29 Jan 2019 12:44:43 +0000 https://blog.otrs.com/?p=3044

Software Support and Bugzilla

Software has bugs!

This is nothing new. Your service department has to deal with this on a daily basis. When your software development team uses a bug tracking tool, it’s could very likely be Bugzilla. When tracking and reporting to product management about reliability and usability, it’s good to be on the same page.

Your service desk uses OTRS, because timely and transparent communication is a vital part of customer satisfaction, when bugs occur. Some questions come to mind:

  • How does your support team categorize the incident when creating the record?
  • How can we use the captured data to make the software better?
  • How to ensure that the data we provide is translatable, by our product manager, into something of value for development?

OTRS has a solution: Dynamic Field Web Service

(more…)]]>
https://otrs.com/blog/technical-insights/bugzilla-software-category-management/feed/ 0
Post Ticket Events to Slack Channels https://otrs.com/blog/technical-insights/slackconnector/ https://otrs.com/blog/technical-insights/slackconnector/#respond Wed, 19 Sep 2018 07:25:17 +0000 https://blog.otrs.com/?p=2955 During my vacation, I thought about new integration use cases I can show you. Because I’m also evaluating Phantom at the moment and was invited to join their Slack community, I thought this would be a nice use case. So let’s start with our “SlackConnector”.

Like in former blog posts, there are several requirements for this HowTo:

  • running OTRS 6.0.x system
  • a valid Slack workspace

Prepare Slack for the integration

Follow the instructions and create a new incoming webhook.

Configure the SlackConnector on OTRS side

At first, we’ve to create the new web service.

SlackConnector General config

Afterward, we need a new invoker. Attached you’ll find the first part of my config:

SlackConnector Invoker Config 1

The most important part is (as always) the XSLT mapping. The following example is tested and working:

SlackConnector XSLT mapping

Here’s the XSL stylesheet:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

<xsl:template match="RootElement">
<xsl:copy>
<text>New Ticket [Ticket#<xsl:value-of select="//TicketNumber"/>] created!
Title: <xsl:value-of select="//Ticket/Title"/>
Priority: <xsl:value-of select="//Ticket/Priority"/>
</text>
<attachments>
<title>https://storm-demo.managed-otrs.com/otrs/index.pl?Action=AgentTicketZoom;TicketID=<xsl:value-of select="//TicketID"/></title>
<title_link>https://storm-demo.managed-otrs.com/otrs/index.pl?Action=AgentTicketZoom;TicketID=<xsl:value-of select="//TicketID"/></title_link>
<text>Go to ticket to see more information!</text>
</attachments>
<attachments/>
</xsl:copy>
</xsl:template>
</xsl:transform>

The last part for the invoker is the used event trigger. Because I want to inform my Slack users every time when a new ticket is created, I’m using the “TicketCreate” event without any event filters:

SlackConnector Invoker Config 2

That’s all for the invoker configuration. The next part is the configuration of the transport. I’m using a small workaround to make the integration possible. My Slack token is “T0X829D7E/BBYH0BEE4/nAFuXxXxXxXxXxXxXxXxXxX2”.  I’ve added the first part until the “/” to my endpoint address and the second part including the “/” I added to the controller mapping. Don’t forget to set “POST” as request command.

SlackConnector Transport Config

Apply all changes. Congratulations! You’re done with the invoker.

Test the SlackConnector

Let’s test our new web service. Create a new ticket and see if the invoker is triggered:

SlackConnector Ticket

 

The output in the OTRS debugger should look like the following:

SlackConnector Debugger

Because of the received JSON data from Slack, we should also see the message now in our Slack channel

SlackConnector Slack

More information about the Slack REST API

You can also use other resources which are provided by the Slack REST API.

Please go to the following website, if you need more information: https://api.slack.com/web

]]>
https://otrs.com/blog/technical-insights/slackconnector/feed/ 0
Send E-Mails via Web Service https://otrs.com/blog/technical-insights/articlesend/ https://otrs.com/blog/technical-insights/articlesend/#comments Mon, 03 Sep 2018 06:20:06 +0000 https://blog.otrs.com/?p=2950 One of the key features of “STORM powered by OTRS” is automizing daily manual tasks. Some months ago I was with a CERT team and they want to create & update tickets in STORM and afterwards send emails to the recipients. To solve this requirement we used the STORM exclusive functionality “ArticleSend”.

The best thing is, that it’s also working with your web service operations which already exists in your STORM system.

If you have a STORM system, take a REST Client (e.g.: Boomerang) and send one the following JSON strings to your TicketCreate / TicketUpdate endpoint:

Example for TicketCreate with ArticleSend:

{
"Ticket": {
"Title": "Some ticket title",
"Queue": "<a valid queue name>",
"Lock": "unlock",
"Type": "<a valid ticket type>",
"State": "<a valid state e.g.: Incident>",
"Priority": "<a valid ticket priority e.g.: 3 normal>",
"Owner": "<a valid STORM user e.g.: root@localhost>",
"CustomerUser": "your@recipient.com"
},
"Article": {
"To": "your@recipient.com",
"ContentType": "text/html; charset=UTF8",
"CommunicationChannel": "Email",
"SenderType": "agent",
"Subject": "ArticleSend via REST",
"Body": "Some text send via REST",
"IsVisibleForCustomer": "1"
},
"UserLogin": "<Your_web_service_user>",
"Password": "<Password>"
}

Example for TicketUpdate with ArticleSend:

{
"Article": {
"To": "your@recipient.com",
"ContentType": "text/html; charset=UTF8",
"CommunicationChannel": "Email",
"SenderType": "agent",
"Subject": "ArticleSend via REST",
"Body": "Some text send via REST",
"IsVisibleForCustomer": "1"
},
"UserLogin": "<Your_web_service_user>",
"Password": "<Password>",
"TicketID": "<TicketID>",
}

I would really like to see your usecases, so please leave a comment.

]]>
https://otrs.com/blog/technical-insights/articlesend/feed/ 6
Fetch CVE Data and Use Them in Your Processes https://otrs.com/blog/technical-insights/circlcveconnector/ https://otrs.com/blog/technical-insights/circlcveconnector/#respond Wed, 22 Aug 2018 06:50:15 +0000 https://blog.otrs.com/?p=2927 As you may have noticed, OTRS Group has launched “STORM powered by OTRS” in the last year, which is used in IT security departments and companies for a long time due to the well-documented code of OTRS and a huge background in the CERT area. One of the key facts of STORM is the special consultants with a military / IT Security background for several years.

One of the features of “STORM powered by OTRS” is the information floater which was described here. To display information, this information floater is sufficient, but what will happen if you have to work with these data in a (process) ticket?

In part 1 of this small blog article series, I will show you how to request additional information for a CVE from CIRCL. I’m calling this web service CIRCLCVEConnector.

I’m using “STORM powered by OTRS” with the OTRS Feature Add-On “OTRSTicketInvoker”.

In addition, we need some dynamic fields in OTRS:

  • CVENumber – Text – used to specify the CVE number
  • WSCVEID – Text – the received CVE ID from CIRCL
  • WSCVESummary – TextArea – a short summary which is part of every CVE
  • WSCVEReferences – TextArea – references for the CVE
  • WSCVEVulnerableConfigurations – TextArea – vulnerable configurations for the CVE
  • WSCVSS – Text – the CVSS score of the CVE
  • WSCWE – Text – Common Weakness Enumeration of the CVE
  • WSCapec – Text – Common Attach Pattern Enumeration and Classification for the CVE
  • WSPacketStorm – TextArea – packetstormsecurity.com reference
  • WSRefmap – TextArea – some more references
  • WSPublished – Text – the date when the CVE was published
  • WSModified – Text – the last modification date of the CVE
  • WSAllCVEInformationReceived – Text – A trigger for a later use case ;-)

Configuring the CIRCLCVEConnector in STORM

As always we need a new web service in STORM. Call it “CIRCLCVEConnector”:

CIRCLCVEConnector General config

A new invoker is needed:

CIRCLCVEConnector Invoker config 1

As you can see I removed everything, except the dynamic field “CVENumber” from my outgoing request data, because I want to keep my payload small.

The next point is the XSLT mapping for our outgoing request and incoming response data:

Outgoing XSLT mapping:

CIRCLCVEConnector Outgoing XSLT

Incoming XSLT mapping:

 

CIRCLCVEConnector Incoming XSLTHere’s the complete XSL stylesheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
extension-element-prefixes="date">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:variable name="id" select="//RootElement/id "/>
<xsl:variable name="summary" select="//RootElement/summary"/>
<xsl:variable name="references" select="//references"/>
<xsl:variable name="vulnerable_configurations" select="//vulnerable_configuration"/>
<xsl:variable name="cvss" select="//cvss"/>
<xsl:variable name="cwe" select="//cwe"/>
<xsl:variable name="capec" select="//capec"/>
<xsl:variable name="packetstorm" select="//packetstorm"/>
<xsl:variable name="refmap" select="//refmap"/>
<xsl:variable name="published" select="//RootElement/Published"/>
<xsl:variable name="modified" select="//RootElement/Modified"/>

<xsl:template match="RootElement">
<xsl:copy>
<Ticket>
<DynamicField>
<Name>WSCVEID</Name>
<Value><xsl:value-of select="$id"/></Value>
</DynamicField>
<xsl:choose>
<xsl:when test="$summary = ''"></xsl:when>
<xsl:otherwise>
<DynamicField>
<Name>WSCVESummary</Name>
<Value><xsl:value-of select="$summary"/></Value>
</DynamicField>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="$references = ''"></xsl:when>
<xsl:otherwise>
<DynamicField>
<Name>WSCVEReferences</Name>
<Value>
<xsl:for-each select="$references">
<xsl:value-of select="."/><xsl:text>&#xA;</xsl:text></xsl:for-each></Value>
</DynamicField>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="$vulnerable_configurations = ''"></xsl:when>
<xsl:otherwise>
<DynamicField>
<Name>WSCVEVulnerableConfigurations</Name>
<Value>
<xsl:for-each select="$vulnerable_configurations">
<xsl:value-of select="id"/><xsl:text>&#xA;</xsl:text>
</xsl:for-each>
</Value>
</DynamicField>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="$cvss = ''"></xsl:when>
<xsl:otherwise>
<DynamicField>
<Name>WSCVSS</Name>
<Value>
<xsl:value-of select="$cvss"/>
</Value>
</DynamicField>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="$cwe = ''"></xsl:when>
<xsl:otherwise>
<DynamicField>
<Name>WSCWE</Name>
<Value>
<xsl:value-of select="$cwe"/>
</Value>
</DynamicField>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="$capec = ''"></xsl:when>
<xsl:otherwise>
<DynamicField>
<Name>WSCapec</Name>
<Value>
<xsl:for-each select="$capec">
<xsl:value-of select="name"/><xsl:text>&#xA;</xsl:text>
</xsl:for-each>
</Value>
</DynamicField>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="$capec = ''"></xsl:when>
<xsl:otherwise>
<DynamicField>
<Name>WSPacketStorm</Name>
<Value>
<xsl:for-each select="$packetstorm">
Title: <xsl:value-of select="title"/>
Source: <xsl:value-of select="data_source"/>
ID: <xsl:value-of select="id"/>
Last seen: <xsl:value-of select="last_seen"/>>
Published: <xsl:value-of select="published"/>
Reporter: <xsl:value-of select="reporter"/>
Source: <xsl:value-of select="source"/>
</xsl:for-each>
</Value>
</DynamicField>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="$refmap = ''"></xsl:when>
<xsl:otherwise>
<DynamicField>
<Name>WSRefmap</Name>
<Value>
<xsl:for-each select="refmap">
Title: <xsl:value-of select="title"/>
Source: <xsl:value-of select="data_source"/>
ID: <xsl:value-of select="id"/>
Last seen: <xsl:value-of select="last_seen"/>>
Published: <xsl:value-of select="published"/>
Reporter: <xsl:value-of select="reporter"/>
Source: <xsl:value-of select="source"/>
</xsl:for-each>
</Value>
</DynamicField>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="$published = ''"></xsl:when>
<xsl:otherwise>
<DynamicField>
<Name>WSPublished</Name>
<Value>
<xsl:value-of select="$published"/>
</Value>
</DynamicField>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="$modified = ''"></xsl:when>
<xsl:otherwise>
<DynamicField>
<Name>WSModified</Name>
<Value>
<xsl:value-of select="$modified"/>
</Value>
</DynamicField>
</xsl:otherwise>
</xsl:choose>
<DynamicField>
<Name>WSAllCVEInformationReceived</Name>
<Value>Yes</Value>
</DynamicField>
</Ticket>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

 

We should define the dynamic fields “WSCVEID, WSCVESummary, WSCVEReferences, WSCVEVulnerableConfigurations, WSCVSS, WSCWE, WSCapec, WSPacketStorm, WSRefmap, WSPublished, WSModified, WSAllCVEInformationReceived” as ticket dynamic fields in the web service, to store the CIRCLE CVE response. The last point for the invoker is the used event trigger. I’m using the event “TicketDynamicFieldUpdate_CVENumber”, because it makes most sense in my scenario:

CIRCLCVEConnector Invoker config 2

Next point is to configure the network transport. It’s an easy job:

CIRCLCVEConnector Transport

The used endpoint is “https://cve.circl.lu“, the controller mapping “/api/cve/:CVE” and the request method is “GET”. You’ll also find this information in the https://cve.circl.lu/api/.

Testing the CIRCLCVEConnector

Depending on your configured event trigger for the invoker, use a valid CVE number in the dynamic field “CVENumber”. You should now see something similar in the web service debug log:

CIRCLCVEConnector Debug

In the ticket history, we can now see that the response values are stored in the dynamic fields:

CIRCLCVEConnector History

More information about the CIRCL API

Please go to the following website, if you need more information: https://cve.circl.lu/api/.


]]>
https://otrs.com/blog/technical-insights/circlcveconnector/feed/ 0
Use Travel Security Information in Your Travel Processes https://otrs.com/blog/technical-insights/travelsecurityconnector/ https://otrs.com/blog/technical-insights/travelsecurityconnector/#respond Tue, 14 Aug 2018 08:35:02 +0000 https://blog.otrs.com/?p=2906 STORM powered by OTRS” is used in security departments and companies for a long time due to the well-documented code of OTRS and a huge background in the CERT area.

In one of my recent projects, the team wanted to simplify their travel security process. An employee should start a process, where he has to specify to travel country and some other important values. Based on the travel country, OTRS should display possible travel security warnings, if there are some. We decided to use an external API to request information for the country the employee wants to travel. Until now they’re copying this information manually into STORM.

After some research, we decided that we want to use the API of https://www.reisewarnung.net for this use case.

There are no special pre-requirements regarding the API. So we don’t need an account or have to pay money to use this API.

My customer is using “STORM powered by OTRS” with the OTRS Feature Add-on “OTRSTicketInvoker”.

In addition, we need to add some dynamic fields in STORM to store the response data:

  • Country – Dropdown – with ISO3166-1 compliant Alpha-2 country codes (see https://en.wikipedia.org/wiki/ISO_3166-1 for possible values)
  • TravelRating – Text – to store the travel rating
  • TravelLastUpdate – Text – to store the last update time (will be used in another use case)
  • TravelCountryGerman – Text – to store the travel country in german
  • TravelContinentGerman – Text – to store the continent in german
  • TravelURLDetailsGerman – Text – to store an URL for additional information
  • TravelAdviceGerman – Text – to store the travel advice in german
  • TravelCountryEnglish – Text – to store the travel country in english
  • TravelContinentEnglish – Text – to store the continent in english
  • TravelURLDetailsEnglish – Text – to store an URL for additional information
  • TravelAdviceEnglish – Text – to store the travel advice in english

Configuration of the new “STORM powered by OTRS” web service

As always we need a new web service in STORM. I call it “TravelSecurityConnector”:

travelsecurityconnector general config

Now we need a new invoker, to send requests to Reisewarnungen.net:

travelsecurityconnector invoker config

As you can see I removed everything, except the dynamic field “Country” from my outgoing request data because I want to keep my payload small.

The next point is the XSLT mapping for our outgoing request and incoming response data:

Outgoing XSLT mapping:

travelsecurityconnector outgoing xslt

Incoming XSLT mapping:

travelsecurityconnector incoming xslt

Now you see, why we need so many dynamic fields. Every single value is stored in another dynamic field. It’s also possible to store this values into one dynamic field of type “TextArea”. The last point for the invoker is the used event trigger. I’m using the event “TicketDynamicFieldUpdate_Country” because it makes most sense in my scenario. In addition, we need to select the other dynamic fields (TravelRating, TravelLastUpdate, TravelCountryGerman, TravelContinentGerman, TravelURLDetailsGerman, TravelAdviceGerman, TravelCountryEnglish, TravelContinentEnglish, TravelURLDetailsEnglish, TravelAdviceEnglish) in the “ticket dynamic fields” dropdown to store the response data:

travelsecurityconnector invoker config part2

Next point is to configure the network transport. It’s an easy job:

travelsecurityconnector transport config

The used endpoint is “https://www.reisewarnung.net”, the controller mapping “/api?country=:Country” and the request method is “GET”. You’ll also find this information in the Reisewarnungen.net API documentation.

Testing the TravelSecurityConnector

Depending on your configured event trigger for the invoker, use a valid IP address in the dynamic field “IPAddress”. You should now see something similar in the web service debug log:

travelsecurityconnector debugger 1travelsecurityconnector debugger 2

I combined this connector with the “OTRSConnector“, which adds the travel security information to the ticket, I’m working with:

travelsecurityconnector ticketzoom

More information about the Reisewarnungen.net API

Please go to the following website, if you need more information: https://www.reisewarnung.net/en/about-the-api

]]>
https://otrs.com/blog/technical-insights/travelsecurityconnector/feed/ 0
Displaying Geo Coordinates via Information Floater https://otrs.com/blog/technical-insights/displaying-geo-coordinates-information-floater/ https://otrs.com/blog/technical-insights/displaying-geo-coordinates-information-floater/#respond Wed, 08 Aug 2018 08:00:59 +0000 https://blog.otrs.com/?p=2862 One of the features of “STORM powered by OTRS” is the information floater which allows to search for patterns in an article of a ticket. The feature was designed to enrich the content of a ticket without having to add static content to it. The main use case is to give security teams valuable information at a glance without the need to look up the information in a separate browser tab.

Out of the box, the possibility to search for CVE numbers is available via the Sysconfig settings in Ticket->Ticket::Frontend::ZoomCollectMetaFilters###CVE-Google and Ticket->Ticket::Frontend::ZoomCollectMetaFilters###CVE-Mitre. Last time I wrote a blog article, where I described how to request information for an IP address from NeutrinoAPI. An additional use case, which I had to solve lately was to check the GEO coordinates of an IP address.

Highlighting GEO coordinates in the TicketZoom

The first action was to add an additional ZoomCollectMetaFilter which would match on GEO coordinates. Because the SysConfig structure has changed in  OTRS 6, the example Jens showed you in 2010 will not work, I had to create a new XML file in “Kernel/Config/Files/XML” called “Floater.xml” using the new SysConfig structure with the following content:

<?xml version="1.0" encoding="utf-8" ?>
<otrs_config version="2.0" init="Framework">
<Setting Name="Ticket::Frontend::ZoomCollectMetaFilters###IP-GeoLocation" Required="0" Valid="0">
<Navigation>Frontend::Agent::View::TicketZoom</Navigation>
<Value>
<Hash>
<Item Key="RegExp">
<Array>
<Item>Long: s* ( [-]* d{1,3} . d{1,4} ) s* Lat: s* ([-]* d{1,3} . d{1,4} )</Item>
</Array>
</Item>
<Item Key="Meta">
<Hash>
<Item Key="Name">IP-GeoLocation</Item>
<Item Key="URL">https://maps.google.com/maps?q</Item>
<Item Key="URLPreview">geolocation.pl?coordinates</Item>
<Item Key="Target">_blank</Item>
</Hash>
</Item>
</Hash>
</Value>
</Setting>
</otrs_config>

After I added this XML  file to STORM, I had to run the following script as OTRS user:

bin/otrs.Console.pl Maint::Config::Rebuild

STORM will now show the found GPS coordinates in TicketZoom if the regular expression matches.

InformationFloater TicketZoom

My PERL script

Now I can create my PERL script in “bin/cgi-bin” called geolocation.pl. I also attached the file at the end of this article:

InformationFloater PERLKeep in mind, that this script has to be executable:
chmod +x bin/cgi-bin/geolocation.pl

Output

The Floater will now display the GPS coordinates in Google Maps. I also tried with OpenStreetMaps, but I faced some issues with the zoom within the floater.

InformationFloater TicketZoom with script

I would really like to see your use cases and ideas to use the Information Floater of “STORM powered by OTRS“, so please leave a comment.

Geolocation.pl script

You can download my script here.

]]>
https://otrs.com/blog/technical-insights/displaying-geo-coordinates-information-floater/feed/ 0
Adding IP Information to Ticket as New Article https://otrs.com/blog/technical-insights/adding-ip-information-to-ticket-as-new-article/ https://otrs.com/blog/technical-insights/adding-ip-information-to-ticket-as-new-article/#respond Thu, 02 Aug 2018 08:00:35 +0000 https://blog.otrs.com/?p=2877 In one of my last blog articles I told you how to request IP information from NeutrinoAPI. At the moment this information is only stored in the dynamic field “IPAddressInformation” and is overwritten every time when you change the dynamic field “IPAddress” for a ticket. Because it can happen that the IP address changed more than one time, we should store the content of “IPAddressInformation” in an article of the ticket.

In this blog article, I’m extending the “OTRSConnector” and add a new invoker to this already existing web service.

Let’s start!

At first, we need a new invoker for the “OTRSConnector” like the one I’m using: “AddIPInformationToTicket”.

For our outgoing request data, it’s mandatory to use at least the TicketNumber and the dynamic field “IPAddressInformation”. All other fields are optional.

Invoker config

The next step is our XSLT mapping. As you can see, we add a new article to the ticket and use the content of the dynamic field “IPAddressInformation”:

Invoker XSLT

The last point for the configuration of the invoker is the event trigger. From my point of view selecting the event “TicketDynamicFieldUpdate_IPAddressInformation” is the only one which makes sense.

Invoker Trigger

The last part for this small change is to edit the transport configuration. We’re using the “TicketUpdate” operation for this use case.

From now on, the received IP address information from NeutrinoAPI, will be added as a new article to the related ticket.

Test

]]>
https://otrs.com/blog/technical-insights/adding-ip-information-to-ticket-as-new-article/feed/ 0
Check IP Information via Web Service https://otrs.com/blog/technical-insights/neutrinoapiconnector/ https://otrs.com/blog/technical-insights/neutrinoapiconnector/#respond Tue, 31 Jul 2018 09:29:00 +0000 https://blog.otrs.com/?p=2842 STORM powered by OTRS” is used in IT security departments and companies for a long time due to the well-documented code of OTRS and a huge background in the CERT area.

In one of my recent projects, the team wanted to simplify their investigation activities. We decided to use an external API to request information for specific data we send. Until now they’re copying this information manually into STORM.

In part 1 of this small blog article series, I want to show you how to request additional information for an IP which triggered a security incident in an external system. Because I’m using the NeutrinoAPI, I’m calling this web service NeutrinoAPIConnector.

We have some pre-requirements:

  1. Go to https://www.neutrinoapi.com/ and register a new account
  2. Choose a plan. I’m using the “Free” plan for this example
  3. Note your API key. You can also change it later if you’ve forgotten to note it.

My customer is using “STORM powered by OTRS” with the OTRS Feature Add-On “OTRSTicketInvoker”.

In addition, we need two dynamic fields in OTRS:

  • IPAddress – Text – used to specify which IP should be checked
  • IPAddressInformation – TextArea – to store the response of NeutrinoAPI

Configuring the NeutrinoAPIConnector in STORM

As always we need a new web service in STORM. Call it “NeutrinoAPIConnector”:

NeutrinoAPIConnector general config

Now we need a new invoker, to send requests to NeutrinoAPI:

NeutrinoAPIConnector GetIPInformation general config

As you can see I removed everything, except the dynamic field “IPAddress” from my outgoing request data, because I want to keep my payload small.

The next point is the XSLT mapping for our outgoing request and incoming response data:

Outgoing XSLT mapping:

NeutrinoAPIConnector GetIPInformation Outgoing Mapping

Incoming XSLT mapping:

NeutrinoAPIConnector GetIPInformation Incoming Mapping

 

We should define the dynamic field “IPAddressInformation” to store the NeutrinoAPI response. The last point for the invoker is the used event trigger. I’m using the event “TicketDynamicFieldUpdate_IPAddress” because it makes the most sense in my scenario:

NeutrinoAPIConnector GetIPInformation Response and Trigger

Next point is to configure the network transport. It’s an easy job:

NeutrinoAPIConnector GetIPInformation Transport

The used endpoint is “https://neutrinoapi.com”, the controller mapping “/ip-info” and the request method is “POST”. You’ll also find this information in the NeutrinoAPI API documentation.

Testing the NeutrinoAPIConnector

Depending on your configured event trigger for the invoker, use a valid IP address in the dynamic field “IPAddress”. You should now see something similar in the web service debug log:

NeutrinoAPIConnector GetIPInformation Debugger

In the ticket history, we can now see that the value was stored in the dynamic field “IPAddressInformation”:

NeutrinoAPIConnector GetIPInformation History

More information about the Language Detection API

Please go to the following website, if you need more information: NeutrinoAPI API documentation.

 

]]>
https://otrs.com/blog/technical-insights/neutrinoapiconnector/feed/ 0
Automatically detect the gender of your customer user https://otrs.com/blog/technical-insights/genderapiconnector/ https://otrs.com/blog/technical-insights/genderapiconnector/#respond Thu, 21 Jun 2018 07:15:23 +0000 https://blog.otrs.com/?p=2749 I think everyone of you have asked yourself the question (especially the german OTRS administrators), if it’s possible to automatically detect the gender of your customer users. This might be useful if the gender is missing in your customer user backend or someone is writing you an email, who is not stored in your backend. So keep on reading, because I want to show you how to build such a “GenderAPIConnector”. In part 1 of this small blog article series I want to show you how to set up the web service to automatically check the gender of the sender.

Important note:

Keep in mind, the OTRS Blog should only show you the technical possibilities you have with OTRS, the OTRS API and other tools/services. Based on the new General Data Protection Regulation, which is enforced since may 2018, you should think about if you really need the gender of a person for your service management.

Last week I discovered another useful third-party provider, which makes it possible! The name of this provider is “Gender API“.

We have some pre-requirements before we can start:

  1. Go to https://gender-api.com and register a new account
  2. After registration you’ll receive 500 credits, but you can buy more
  3. Note your API key. You can also find it in your Overview (at the end of the site)

GenderAPIConnector Overview

OTRS Requirements for this HowTo

OTRS Framework

  • at least OTRS 6.0.x

OTRS Packages

You need the following OTRS Feature Add-On:

  • OTRSTicketInvoker
(Adds new invoker for TicketCreate and TicketUpdate in the GenericInterface.)

Third Party Software

You need this third-party software:

  • XML::Simple
  • XML::LibXML
  • XML::LibXSLT

Dynamic fields in OTRS

  • Firstname – of type text – to store the firstname of the customer user
  • Gender – of type text – to store the gender (response) from GenderAPI

Configuring the GenderAPIConnector in OTRS

As always we need a new web service in OTRS. Call it “GenderAPIConnector”:

GenderAPIConnector General Config

Let’s continue with our invoker. The name for my invoker is “detectgender”. Because I want to reduce my payload, I’m only using the dynamic field “Firstname” in my outgoing request data. I also use “XSLT” for my outgoing an incoming mapping:

GenderAPIConnector Invoker Config

My outgoing XSLT mapping is the following:

GenderAPIConnector Invoker XSLT outgoing

Because the invoker will receive an answer immediately, we need a XSLT mapping for the incoming response data. You can use the following example:

GenderAPIConnector Invoker XSLT incoming

The response should be stored in the dynamic field “Gender”. We also have to tell the invoker, when he should be triggered towards GenderAPI. Because of this I’m using the event “TicketDynamicFieldUpdate_Firstname”:

GenderAPIConnector General Config 1

The last point for my first GenderAPI example is the configuration of the transport. Pay attention to the controller mapping, because GenderAPI is expecting everything as query params (also the API key). The valid request method for this controller is GET. If you do the same than I did, it should work as expected.

GenderAPIConnector Transport ConfigThat’s all for this invoker. Let’s start our tests.

Testing the GenderAPIConnector

Depending on your configured event trigger for the invoker, please create a new ticket or (as I’m doing) lock the ticket to yourself. You should now see something similiar in the web service debug log:

GenderAPIConnector Debug log

In the ticket history of the specific ticket we now see the value for the gender:

GenderAPIConnector ticket history

 

What can we now do with this information? I’ll show you next time.

More information about the Gender API

Please go to the following website, if you need more information: https://gender-api.com/en/api-docs

]]>
https://otrs.com/blog/technical-insights/genderapiconnector/feed/ 0
Use the Right Language in Notifications https://otrs.com/blog/technical-insights/use-right-language-notifications/ https://otrs.com/blog/technical-insights/use-right-language-notifications/#respond Wed, 13 Jun 2018 06:45:29 +0000 https://blog.otrs.com/?p=2733 In may 2018 I showed you how to detect the language of an email which was sent to OTRS. Now I want to use this information to send an auto-response after ticket creation to the customer user in his language. Conveniently this is possible with built-in OTRS. We only need some new ticket notifications.

So let’s create them!

Go to Admin -> Ticket Notifications and a add a new notification with the following configuration:

general notification configuration

We have to listen to the event “TicketDynamicFieldUpdate_Language,” because we want to inform the customer in his language.

ticket filter for notificationsThis notification should only be sent if the language is German.

recipients for notificationsWe only want to inform the customer user.

notification textLast but not least, the notification text.

Finally, we can do some tests. Write an email in German to your OTRS. You should receive the German notification.

testing notifications

]]>
https://otrs.com/blog/technical-insights/use-right-language-notifications/feed/ 0
Making the Package Manager More Secure https://otrs.com/blog/technical-insights/making-the-package-manager-more-secure/ https://otrs.com/blog/technical-insights/making-the-package-manager-more-secure/#respond Mon, 11 Jun 2018 13:17:41 +0000 https://blog.otrs.com/?p=2785 A user recently complained about the OTRS package manager ability to execute code from packages (CVE-2018-7567). There are good reasons for this (packages install code anyway, required for complex setup routines), but of course, it means that admins better double check the packages they install.

After looking for ways to improve the situation, we decided to slightly change the default behavior of the package manager. By default, only packages verified by OTRS can be installed now; there is a new configuration option to allow installation of packages from other/untrusted sources.

]]>
https://otrs.com/blog/technical-insights/making-the-package-manager-more-secure/feed/ 0
Event based ticket movement via web service https://otrs.com/blog/technical-insights/otrsconnector/ https://otrs.com/blog/technical-insights/otrsconnector/#respond Thu, 07 Jun 2018 07:00:45 +0000 https://blog.otrs.com/?p=2710

Let’s continue with our use case from last week. In part 1 we build the pre-requirement for this web service. For sure this can also be realised with another OTRS built-in functionality called GenericAgent, but do you really want to build one GenericAgent per language? Because I really want to avoid this I’m using the OTRSConnector. This has several benefits:

  1. The administration is much easier
  2. A possible performance impact is much lower

So let’s start!

OTRS Requirements for this HowTo

OTRS Framework

  • at least OTRS 6.0.x

OTRS Packages

You need the following OTRS Feature Add-On:

  • OTRSTicketInvoker
(Adds new invoker for TicketCreate and TicketUpdate in the GenericInterface.)

Third Party Software

You need this third-party software:

  • XML::Simple
  • XML::LibXML
  • XML::LibXSLT

Configuring the provider for the OTRSConnector

As usual the general configuration should look like the following:

OTRSConnector General config

In our new web service we need a provider and a requester (invoker). Let’s start with the provider, because it’s the easier one. Add a new operation “Ticket::TicketUpdate” and simply call it “TicketUpdate”. We don’t need an incoming mapping.

OTRSConnector provider config

The last point for the provider part is the configuration of the network transport. Define a valid route mapping and a request method for the provider.

OTRSConnector provider transport config

That’s all for the provider side. Let’s continue with our invoker!

 

Configuring the invoker for the OTRSConnector

Now we’ll configure the “magic”. Create a new invoker of type “Ticket::TicketUpdate” and include at least the TicketNumber and the dynamic field “Language” in your outgoing request data:

OTRSConnector invoker config

For our outgoing XSLT mapping, you can use my example:

OTRSConnector invoker outgoing mapping

The last part is the used event trigger. I want to trigger my invoker, if the dynamic field “Language” is udpated:

OTRSConnector invoker config1

The last part is the configuration of the network transport. The most important here is the controller mapping, because this needs to be the same as in the configuration of our provider. Otherwise you’ll receive errors.

OTRSConnector invoker transport config

Testing the OTRSConnector

Depending on your configured event trigger for the invoker, please trigger at first the LanguageConnector and wait until the dynamic field “Language” is populated. You should now see something similiar in the web service debug log:

OTRSConnector debug log

You’ll now see in the ticket history, that the queue was changed by our webservice user:

OTRSConnector ticket history

More information about the OTRS  API

Please go to the following website, if you need more information: http://doc.otrs.com/doc/api/otrs/stable/Perl/Kernel/GenericInterface/Operation/Ticket/TicketUpdate.pm.html

 

]]>
https://otrs.com/blog/technical-insights/otrsconnector/feed/ 0
Automatically Detect the Language of Emails https://otrs.com/blog/technical-insights/languageconnector/ https://otrs.com/blog/technical-insights/languageconnector/#respond Wed, 30 May 2018 09:18:05 +0000 https://blog.otrs.com/?p=2694 I think everyone of you have asked yourself the question if it’s possible to automatically dispatch tickets into language-specific queues. This might be useful if you have location-based sales departments/support departments a.s.o. So keep on reading, because I want to show you how to build such a “LanguageConnector”. In part 1 of this small blog article series, I want to show you how to set up the web service. If you’re looking for part 2, you can find it here.

Last week I discovered a useful third-party provider, which makes it possible! The name of this provider is “Language Detection API“.

We have some pre-requirements:

  1. Go to https://www.detectlanguage.com and register a new account
  2. Choose a plan. I’m using the “Free” plan for this example
  3. Note your API key. You can also find it in your Dashboard

LanguageConnector Dashboard

OTRS Requirements for this HowTo

OTRS Framework

  • at least OTRS 6.0.x

OTRS Packages

You need the following OTRS Feature Add-On:

  • OTRSTicketInvoker
(Adds new invoker for TicketCreate and TicketUpdate in the GenericInterface.)

Third Party Software

You need this third-party software:

  • XML::Simple
  • XML::LibXML
  • XML::LibXSLT

Configuring the LanguageConnector in OTRS

As always we need a new web service in OTRS. Call it “LanguageConnector”:

LanguageConnector General config

Now we need a new invoker, to send requests to Language Detection:

LanguageConnector Invoker config

As you can see I removed everything, except the article body from my outgoing request data, because I want to keep my payload small.

The next point is the XSLT mapping for our outgoing request and incoming response data:

Outgoing XSLT mapping:

LanguageConnector Invoker XSLT outgoingIncoming XSLT mapping:

LanguageConnector Invoker XSLT incoming

The last point for the invoker is the used event trigger. For testing purposes I’m using “TicketLockUpdate”, but using “TicketCreate” event makes more sense in productive environments:

LanguageConnector Invoker config 1

Next point is to configure the network transport. It’s an easy job:

LanguageConnector transport config

As written in Language Detection API, you can use your API key as username and a password which can be empty or any value.

Let’s continue with our tests.

Testing the LanguageConnector

Depending on your configured event trigger for the invoker, please create a new ticket or (as I’m doing) lock the ticket to yourself. You should now see something similar in the web service debug log:

LanguageConnector debug log

In the ticket history, we can now see that the value was stored in the dynamic field “Language”:

LanguageConnector changed dyn field

More information about the Language Detection API

Please go to the following website, if you need more information: https://detectlanguage.com/documentation

]]>
https://otrs.com/blog/technical-insights/languageconnector/feed/ 0
Inform Threema contacts about ticket events https://otrs.com/blog/technical-insights/threemaconnector/ https://otrs.com/blog/technical-insights/threemaconnector/#respond Thu, 17 May 2018 08:00:06 +0000 https://blog.otrs.com/?p=2621 From time to time I missed the possibility to inform agents via Threema about ticket events. Last week I had a customer from the cybersecurity sector, who needs the possibility to inform agents via Threema. Because I really like this use case, I want to show you how you can build such a “ThreemaConnector”.

The first step is to create an account for the Threema Gateway (https://gateway.threema.ch/en).

ThreemaConnector Register Account

Afterward you must request a new Threema ID. Pay attention because there are two types of Threema IDs:

ThreemaConnector Request ThreemaID

  • Basic
    • The private key will be generated and stored by Threema
    • Messages can be sent
    • Messages cannot be received
  • End-to-End
    • The private key will be generated and stored by the customer
    • Messages can be sent and received, including delivery reports (delivered, read, acknowledged).

 

In this blog article, I’m using the Basic Threema ID.  Later I’ll also show you how to receive Threema messages in OTRS. :-)

After you registered your Threema ID and received your confirmation email, we can start with our ThreemaConnector in OTRS. As usual, there are some requirements:

OTRS Requirements for this HowTo

OTRS Framework

  • at least OTRS 6.0.x

OTRS Packages

You need the following OTRS Feature Add-On:

  • OTRSTicketInvoker
(Adds new invoker for TicketCreate and TicketUpdate in the GenericInterface.)

Third Party Software

You need this third-party software:

  • XML::Simple
  • XML::LibXML
  • XML::LibXSLT

Configure the ThreemaConnector in OTRS

Now we can start to configure our ThreemaConnector. The first task is to create a new web service in OTRS.

ThreemaConnector Webservice config

Now we can continue with our invoker(s). I’m saying invokers because we need one invoker per recipient.

Let’s start with the configuration for the invoker “NotifyViaThreema”:

ThreemaConnector Invoker config 1

The most important part is the XSLT mapping and the event trigger for this invoker. You can use my XSLT mapping:

ThreemaConnector Invoker XSLT

Because I don’t want to send a message every time when a ticket is created, I define a condition for this invoker:

ThreemaConnector Invoker Trigger_config

The last step is the configuration of the network transport. The Threema API is expecting everything as parameters. Because of this, we have to work with variables:

ThreemaConnector Transport config

That’s all! Now we’re ready to start with our tests. At first we need a new ticket with a priority = 5 very high (my condition for the invoker).

ThreemaConnector Testticket

After ticket creation, we should receive a Threema message. As an alternative we can also check the debug logs of our web service:

ThreemaConnector Debug log

And on the recipient’s cell phone:

ThreemaConnector Message

]]>
https://otrs.com/blog/technical-insights/threemaconnector/feed/ 0
OTRS 7 Sneak Peek I – A new design strategy https://otrs.com/blog/technical-insights/otrs-7-sneak-peek-i-a-new-design-strategy/ https://otrs.com/blog/technical-insights/otrs-7-sneak-peek-i-a-new-design-strategy/#respond Wed, 16 May 2018 14:53:40 +0000 https://blog.otrs.com/?p=2586 When we started doing research on how to rebuild the entire user experience of the OTRS customer interface, we very soon recognized that it wouldn’t be enough to just put a new design on the existing structures. More than that, it wouldn’t even be enough to just create a one-time big bang to make everything new. Instead, we learned that we need to create a whole new user experience design strategy. In the history of OTRS, there was only one major GUI redesign which came with OTRS 3. When we did this, we didn’t think too much about how to evolve the design from then on or how developers would work with it when creating new features within OTRS.

It wouldn’t be enough to just put a new design on the existing structures.

With the new design of the OTRS 7 customer interface (which will then be the “external interface”, combining both public and non-public interface into one), we’re going to implement a design process. This process is meant to make sure that we’re not only creating a one-time redesign, but know how we can proceed from there. Whenever we’re in the need of creating new features/screens/components within OTRS, this process will come into play. It consists of 5 basic elements:

  1. Understand: Understand the context in which the feature/product is used.
  2. Specify: Specify the requirements.
  3. Solve: Develop solutions which fulfill those requirements.
  4. Listen: Collect user feedback for the solutions.
  5. Iterate: begin with the first step again to improve the solution.
The OTRS Design System.

All future design decisions will be driven and backed up by this process. It will be supported by a library of design elements (which we call “design system”), so the process will not only be applied to the redesign of the GUI as a whole, but also to the creation and evolution of each single GUI component. This OTRS Design System will be the leading resource for OTRS designers and developers.

In this series of articles called Sneak Peek we would like to give you some insights of the development of OTRS 7. We will shed some light on technical aspects as well as how we’re planning to change the user experience. Got more questions? Please contact us!

]]>
https://otrs.com/blog/technical-insights/otrs-7-sneak-peek-i-a-new-design-strategy/feed/ 0
Inform Rocket.Chat users about ticket events https://otrs.com/blog/technical-insights/rocketchatconnector-part1/ https://otrs.com/blog/technical-insights/rocketchatconnector-part1/#respond Wed, 09 May 2018 11:00:54 +0000 https://blog.otrs.com/?p=2577 Many of my customers are using Rocket.Chat for their internal team chats. Last week I had a customer, who asked me if it’s possible to get a notification in their Rocket.Chat if there’s a new ticket in OTRS. I call this integration “Rocket.ChatConnector”.

The answer is… YES!

In the first part of a smaller blog article series, I’ll show you how to post messages in Rocket.Chat channels.

Like in former blog posts, there are several requirements for this HowTo:

  • running OTRS 6.0.x system
  • running RocketChat system

OTRS Requirements for this HowTo:

OTRS Framework

  • at least OTRS 6.0.x

OTRS Packages

You need the following OTRS Feature Add-on:

  • OTRSTicketInvoker
(Adds new invoker for TicketCreate and TicketUpdate in the GenericInterface.)

Third Party Software

You need this third-party software:

  • XML::Simple
  • XML::LibXML
  • XML::LibXSLT

Rocket.Chat Requirements for this HowTo:

  • a working Rocket.Chat (I’m using RocketChat 0.64.1)

Prepare Rocket.Chat for the integration

Go to Administration -> Integration and click on “New integration” in the right upper corner and click on “Incoming WebHook”

I’ve attached the configuration of my webhook:

rocketchatconnector preparing incoming webhook 1rocketchatconnector preparing incoming webhook 1

If you want, you can send the example JSON string to your incoming webhook with a local REST client. I’m using “Boomerang” which is an addon for Google Chrome.

rocketchatconnector webhook request

 

The answer is a simple “success”: truerocketchatconnector webhook answer

That’s all regarding the Rocket.Chat preparation. Let’s continue with OTRS.

Configuring the Rocket.ChatConnector on OTRS side

At first, we’ve to create a new web service. I’ll call it “Rocket.ChatConnector”.

rocketchatconnector OTRS general config

Afterwards, we need a new invoker. Attached you’ll find my config:

rocketchatconnector OTRS invoker config

The most important part is the XSLT mapping. The following example is tested and working:

rocketchatconnector OTRS invoker xsltXmapping

The last part for the invoker is the used event trigger. Because I only want to inform my users if there’s a new ticket with a very high priority, I’m using the “TicketCreate” event with a condition (Priority = 5 very high):

rocketchatconnector OTRS invoker event trigger

That’s all for the invoker configuration. The next part is the configuration of the transport. I’m using a small workaround to make the integration possible. My token in Rocket.Chat is “9HHhoQYYEo2unZQrm/e4tWQgxcKkZdryfcMA325unkNrC2R6JPSmJXtuknhbQ4TYZh”.  I’ve added the first part until the “/” to my endpoint address and the second part including the “/” I’ve added to the controller mapping. Don’t forget to set “POST” as request command.

rocketchatconnector OTRS transport config

Apply all changes. Congratulations! You’re done with the first part.

Testing the Rocket.ChatConnector

Let’s test our new web service. Create a new ticket with a priority = 5 very high and see if the invoker is triggered:

rocketchatconnector OTRS create ticket

 

The output in the OTRS debugger should look like the following:

rocketchatconnector OTRS debug outputBecause of the received JSON data from Rocket.Chat, we should also see the message now in our RocketChat channel

rocketchatconnector OTRS rocketchat message

More information about the Rocket.Chat REST API

You can also use other resources which are provided by the RocketChat REST API.

Please go to the following website, if you need more information: https://rocket.chat/docs/developer-guides/rest-api/

]]>
https://otrs.com/blog/technical-insights/rocketchatconnector-part1/feed/ 0
HowTo: Connect OTRS with Icinga2 – Part 3 https://otrs.com/blog/technical-insights/icinga2connector-part-3/ https://otrs.com/blog/technical-insights/icinga2connector-part-3/#respond Fri, 27 Apr 2018 08:35:48 +0000 https://blog.otrs.com/?p=2483 Let’s continue with our Icinga2Connector. Last time I showed you how to create a new host in Icinga2 via API. Today I will show you how to delete hosts, if they’re retired. To complete this how-to, you need at first a running OTRS and an Icinga2 system.

Use case for this connector

If you have a Release & Deployment management process in your OTRS system and you want to transmit information automatical to Icinga2. In this small blog article, I’ll show you, how to create a web service between OTRS and Icinga2. I’ll call this integration “Icinga2Connector”.

OTRS Requirements for this HowTo

OTRS Framework

  • at least OTRS 6.0.x

OTRS Packages

You need the following Feature Add-Ons :

  • OTRSTicketInvoker
(Adds new invoker for TicketCreate and TicketUpdate in the GenericInterface.)

Third Party Software

You need this third-party software:

  • XML::Simple
  • XML::LibXML
  • XML::LibXSLT

DynamicField

  • “Icinga2Hostname” of type “TEXT” to specify the name of the new Icinga2 host
  • “Icinga2DeleteHost” of type “Dropdown” to make a decision

 

Web service

In addition, part 1 & part  2 of the Icinga2Connector might be useful. You’ll find the first blog article here and the second blog article here.

Configuring the Invoker “DeleteHost”

Now we’re ready to start the configuration of our next Invoker. Create a new Invoker called “DeleteHost”.  Select all the needed data for your outgoing requests and use “XSLT” as mapping for your outgoing data.

Icinga2Connector DeleteHost Configuration1
Icinga2Connector DeleteHost Configuration1

Icinga2Connector_DeleteHost_Configuration2

For our XSLT mapping we need the following elements:

  • the hostname, which should be deleted in Icinga2 (dynamic field “Icinga2Hostname”)

Now you can configure your outgoing XSLT-mapping. If you need a working XSLT-mapping, you can use the following example:

Icinga2Connector DeleteHost Mapping

The used “Event trigger” is the last point for this invoker. Just select one and you’re done with the Invoker configuration.

 

Configuring the Icinga2Connector “Network Transport”

Requester configuration

It’s necessary to configure the network transport for the invoker because we’ve to use the right requests commands towards Icinga2. Otherwise, we’ll receive errors. It’s quite easy as you can see:

Icinga2Connector DeleteHost Transport configuration

As authentication module please use HTTP basic auth and fill in the user credentials of the Icinga2 API user. Afterward just click on “Save and finish”.

Testing the Icinga2Connector

Testing the Requester

Create or take an already existing ticket and trigger the “DeleteHost” invoker. In the Icinga2 WebGUI, the host disappears. ;-)

 

More information about the Icinga2 API

You can also use other resources which are provided by the Icinga2 API.

Please go to the following website, if you need more information: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/

]]>
https://otrs.com/blog/technical-insights/icinga2connector-part-3/feed/ 0
A look into the future – and a bit of OTRS history https://otrs.com/blog/technical-insights/opensource-strategy-changes/ https://otrs.com/blog/technical-insights/opensource-strategy-changes/#respond Wed, 18 Apr 2018 12:45:19 +0000 https://blog.otrs.com/?p=2543

Dear OTRS Users,

With this article, we want to share important changes about the OTRS Open Source Strategy with the community and answer any questions you may have.

The year 2018 continues to be an exciting one for OTRS. Launched in 2001 as the “Open Ticket Request System,” OTRS GmbH was founded only two years later. The software, released under an open source licensing model, has been extremely successful and has undergone multiple releases during the past 17 years. The company, OTRS, has grown alongside the software and has since transitioned to an  AG with offices worldwide.

A milestone in the company’s history was the introduction of OTRS Business Solution™, designed for professional use, in 2015. Prior to that, support, consulting, and custom software development were the foundation of the company’s business model. This meant that further development of the software had to be financed from the resulting revenue – a costly affair. The OTRS Framework alone contains approximately 500,000 lines of source code, created with approximately 50 person-years of development work.

The majority of the development expenses – over 95% of more than 15 million euros – was provided by the OTRS Group itself. Since its foundation, the OTRS Group has grown strongly and now employs almost 100 people.

Due to the significant growth of the company and the need to satisfy the high demand for the professionally-offered solution, OTRS Group’s management team has decided to focus on further developing the business model that surrounded OTRS Business Solution™, while at the same time securing further development of the freely-available variant of OTRS.

The new approach will move forward in two ways:

  • A large part of the currently non-public functionality that has been part of OTRS Business Solution will be integrated into the main OTRS Product, making it accessible to the public.
  • Similarly, as future development continues, we will make new versions of OTRS available first to our paying customers, and then several years later to the public.

This strategy is currently being implemented, and we’re excited about some of the new projects that are resulting from it. Our OTRS Developers are making significant changes to the software’s user interface, which is expected to launch with the release of OTRS 7. The strategy change has played out in the recent rebranding of the product too. As you may have noticed, we now refer to the fully-managed, professional solution as OTRS. The freely available variant of OTRS is now called ((OTRS)) Community Edition. And, OTRS Business Solution is no longer used as a product name.

Along with the new strategic company initiatives, a website relaunch has taken place. OTRS Group now offers three newly-designed, independent OTRS Websites – a pure product page, a corporate page and a brand-new, dedicated community platform.

These changes are likely to raise questions for non-paying users of OTRS, some of which we would like to address:

Will there be restrictions on the use of my existing OTRS Free / Community Edition?
No, existing installations can still be used to their full potential.

Will bug fixes be available to ((OTRS)) Community Edition users?
Yes. We will provide bug fixes for the most recent version of the ((OTRS)) Community Edition until there is a new publicly-available major release.

Can I still report errors in the software?
Yes, please do! Errors can still be reported through bugs.otrs.org. However, we will continue to prioritize those errors reported by our paying customers.

Can I still suggest features?
Absolutely! Feature requests can be reported via otrsteam.ideascale.com just as before. 

Can I contribute to the development of OTRS in the future?
Yes, but with limitations: We will no longer be able to publish the OTRS main development branch (»master«) in the future:

  • Bug fixes to previously-released versions of OTRS can still be submitted as a pull request via GitHub.
  • To contribute new features to future versions of OTRS, it will be necessary to become a customer of OTRS. Details will be announced later.

Best regards,
Martin Gruner
Team Leader R & D at OTRS

]]>
https://otrs.com/blog/technical-insights/opensource-strategy-changes/feed/ 0
HowTo: Connect OTRS with Icinga2 – Part 2 https://otrs.com/blog/technical-insights/icinga2connector-part2/ https://otrs.com/blog/technical-insights/icinga2connector-part2/#respond Thu, 15 Mar 2018 07:45:05 +0000 https://blog.otrs.com/?p=2461 Let’s continue with our Icinga2Connector. Last time I showed you how to create a new host in Icinga2 via API. Today I will show you how to modify hosts. To complete this how-to, you need at first a running OTRS and an Icinga2 system.

Use case for this connector

If you have a Release & Deployment management process in your OTRS system and you want to transmit information automatical to Icinga2. In this small blog article, I’ll show you, how to create a web service between OTRS and Icinga2. I’ll call this integration “Icinga2Connector”.

OTRS Requirements for this HowTo

OTRS Framework

  • at least OTRS 6.0.x

OTRS Packages

You need the following Freely selectable Features of the OTRS Business Solution6 :

  • OTRSTicketInvoker
(Adds new invoker for TicketCreate and TicketUpdate in the GenericInterface.)

Third Party Software

You need this third-party software:

  • XML::Simple
  • XML::LibXML
  • XML::LibXSLT

DynamicFields

  • “Icinga2Hostname” of type “TEXT” to specify the name of the new Icinga2 host
  • “Icinga2Address” of type “TEXT” to specify the login of the new user
  • “Icinga2Command” of type “Dropdown” to specify the check command in Icinga2. Please use the following values:
    • hostalive: hostalive
    • http: http
    • ping4: ping4
  • “Icinga2OS” of type “Dropdown” to specify the Host OS. Use the following values:
    • Linux: Linux
    • Windows: Windows

Web service

In addition, part 1 of the Icinga2Connector might be useful. You’ll find the first blog article here.

Configuring the Invoker “UpdateHost”

Now we’re ready to start the configuration of our next Invoker. Create a new Invoker called “UpdateHost”.  Select all the needed data for your outgoing requests and use “XSLT” as mapping for your outgoing data.

Icinga2Connector_UpdateHost_InvokerConfig1Icinga2Connector_UpdateHost_InvokerConfig2

For our XSLT mapping we need the following elements:

  • the hostname, which should be displayed in Icinga2 (dynamic field “Icinga2Hostname”)
  • the IP address of the new host (dynamic field “Icinga2Address”)
  • the used Icinga check (dynamic field “Icinga2Command”)
  • the OS of the Host (dynamic field “Icinga2OS”)

Now you can configure your outgoing XSLT-mapping. If you need a working XSLT-mapping, you can use the following example:

Icinga2Connector UpdateHost XSLT mapping

The used “Event trigger” is the last point for this invoker. Just select one and you’re done with the Invoker.

 

Configuring the Icinga2Connector “Network Transport”

Requester configuration

It’s necessary to configure the network transport for the invoker because we’ve to use the right requests commands towards Icinga2. Otherwise, we’ll receive errors. It’s quite easy as you can see:

Icinga2Connector_UpdateHost Transport Config

As authentication module please use HTTP basic auth and fill in the user credentials of the Icinga2 API user. Afterward just click on “Save and finish”.

Testing the Icinga2Connector

Testing the Requester

Create or take an already existing ticket and trigger the “UpdateHost” invoker.

As result you should see something similar in the OTRS Debugger:

Icinga2Connector UpdateHost Debugger

In Icinga2 a the host is updated:

Icinga2Connector UpdateHost Icinga2GUI

Stay tuned…

Next time I’ll show you other useful examples how you could integrate OTRS with Icinga2.

More information about the Icinga2 API

You can also use other resources which are provided by the Icinga2 API.

Please go to the following website, if you need more information: https://www.icinga.com/docs/icinga2/latest/doc/12-icinga2-api/

]]>
https://otrs.com/blog/technical-insights/icinga2connector-part2/feed/ 0