The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- perl -*-

@ScripActions = (

    { Name        => 'Extract Custom Field Values',          # loc
      Description => 'extract cf-values out of a message',    # loc
      ExecModule  => 'ExtractCustomFieldValues' },

    { Name        => 'Extract Custom Field Values With Code in Template', # loc
      Description => 'extract cf-values out of a message with a Text::Template template',    # loc
      ExecModule  => 'ExtractCustomFieldValuesWithCodeInTemplate' }

);

@Templates = (
    {  Queue       => '0',
       Name        => 'CustomFieldScannerExample',                     # loc
       Description => 'Example Template for ExtractCustomFieldValues', # loc
       Content     => <<'EOTEXT'
#### Syntax:
# CF Name | Header name or "Body" | MatchString(re) | Postcmd | Options

#### Allowed Options:

# q - (quiet) Don't record a transaction for adding the custom field
#     value
# * - (wildcard) The MatchString regex should contain _two_
#     capturing groups, the first of which is the CF name,
#     the second of which is the value.  If this option is
#     given, the <cf-name> field is ignored.
#     (Supercedes '+'.)
# + - (multiple) The MatchString regex will be applied with
#     the /g option and all matching values will be added to
#     the CF, which should probably be a multi-value CF for
#     best results.  (Superceded by '*'.)

#### Examples:

# 1. Put the content of the "X-MI-Test" header into the "testcf"
#    custom field:
# testcf|X-MI-Test|.*

# 2. Scan the body for Host:name and put name into the "bodycf" custom
#    field:
# bodycf|Body|Host:\s*(\w+)

# 3. Scan the "X-MI-IP" header for an IP-Adresse and get the hostname
#    by reverse-resolving it:
# Hostname|X-MI-IP|\d+\.\d+\.\d+\.\d+|use Socket; ($value) = gethostbyaddr(inet_aton($value),AF_INET);

# 4. scan the "CC" header for an many email addresses, and add them to
#    a custom field named "parsedCCs". If "parsedCCs" is a multivalue
#    CF, then this should yield separate values for all email adress
#    found.
# parsedCCs|CC|.*|$value =~ s/^\s+//; $value =~ s/\s+$//;

# 5. Looks for an "Email:" field in the body of the email, then loads
#    up that user and makes them privileged The blank first field
#    means the automatic CustomField setting is not invoked.
# |Body|Email:\s*(.+)$|my $u = RT::User->new($RT::SystemUser); $u->LoadByEmail($value); $u->SetPrivileged(1)|

# 6. Looks for any text of the form "Set CF Name: Value" in the body,
#    and sets the CF named "CF Name" to the given value, which may be
#    multi-line.  The '*' option controls the wildcard nature of this
#    example.
# Separator=!
# !Body!^Set ([^\n:]*?):\s*((?s).*?)(?:\Z|\n\Z|\n\n)!!*

# 7. Looks for the regex anywhere in the headers and stores the match
#    in the AllHeaderSearch CF
# AllHeaderSearch|Headers|Site:\s*(\w+)

# 8. If you need to dynamically build your matching, and want to trigger on headers and body
#    and invode some arbitrary code like example 5
# Separator=~~
 {
#    my $action = 'use My::Site; My::Site::SetSiteID( Ticket => $self->TicketObj, Site => $_ );';
#
#    for my $regex (My::Site::ValidRegexps) {
#        for my $from ('headers', 'body') {
#            $OUT .= join '~~',
#                '', # CF name
#                $from,
#                $regex,
#                $action;
#            $OUT .= "\n";
#        }
#    }
 }

EOTEXT
    }
);

1;